올해부터 KASA(한국자동차안전학회)에서 주관하는 '국제 대학생 창작자동차 경진대회'에 참여하게 되어서 ERP42플렛폼을 이용한 자율주행 자동차를 제작해야 한다. 해당 플렛폼은 ROS(Robot Operating System)라는 프레임워크를 사용하게 되는데 이는 리눅스환경에서 돌아가기 때문에 우분투를 사용해야 한다. ROS를 설치하는 과정에서 상당히 많은 에러가 발생했으며 이를 대응하는 국내 자료가 많지 않아서 기록해 보도록 하자. 에러1. 우분투와 ROS버전 확인 우분투 버전에 따라서 설치가 가능한 ROS버전도 달라진다. 필자의 경우 기존에 우분투가 설치되어 있어서 아무 생각없이 ROS를 설치하려고 했지만 설치가 되지 않으며 알수없는 오류가 뜨게 되었다. 정리하면 다음과 같다. 우분투 18.04버전을..
cron cron이란 리눅스 시스템을 다룰때 특정시간이 지나면 정기적으로 프로그램이 실행되도록 하는 명령어다. cron 프로그램 작성법은 다음과 같다. ~ crontab -e # 처음 실행하면 어떤 에디터로 편집할것인지 선택하는 화면이 나오며 편한 에디터를 선택하면 된다. 맨 아래에 프로그램을 작성하면 된다. 왼쪽부터 순서대로 (분/시간/일/월/명령프로그램)작성하면 된다. 내가 작성한 프로그램은 1분이 지날 때 마다 현재 시간을 date.log라는 파일에 작성하는 자동화 프로그램을 작성했다. 위와 같이 작성 후 ^x, 엔터를 누르면 프로그램이 저장되며 crontab -l 명령을 내리면 작성한 프로그램을 확인 할 수 있다. 이제 cron프로그램이 제대로 실행되는지 확인하기 위해 tail -f 명령어를 통해..
우리가 pc로 작업을 할때 한가지 작업만 하지 않고 인터넷 검색도 하면서 코딩도 하고 유튜브화면도 띄우듯 멀티태스킹을 한다. 리눅스에서 겉보기엔 한 화면만 나오기 때문에 한가지 작업밖에 못할 것 같지만 사실 멀티태스킹이 가능하다. 현재 작업하는 일은 '포그라운드', 이외의 작업은 '백그라운드'라고 한다. 우선 nano편집기로 프로그램을 작업한다고 가정을 하고 ^z를 누르면 home화면으로 빠져나온다. 얼핏보면 작업이 끝나서 홈화면으로 나온 것 같지만 사실 백그라운드로 프로그램이 대기하는것을 jobs명령어를 통해 할 수 있다. ~ nano ^z ~ jobs 보통 작업을 할 때 하나의 작업만 하지 않기 때문에 여러 작업을 띄워보자. 위 화면은 3개의 작업을 멀티태스킹으로 해 놓은 화면이다. 과연 이게 정말 ..
리눅스 시스템은 디렉토리가 모든 작업을 한다고 해도 과언이 아닐 정도로 중요한 개념이다. 우리가 처음 리눅스를 시작할때 home디렉토리에서 시작하며 ~로 표시하고 나름 안전한 영역(?)에서 작업을 하는 것이다. 최상위 단은 root디렉토리 라고 부르며 / 로 시작한다. root디렉토리에 있는 다른 디렉토리는 시스템을 진행할 때 매우 중요한 자료가 저장되어 있기 때문에 함부로 건들면 안된다. 간단히 bin(Essential User Binaries)이라는 디렉토리를 확인해보자. 해당 디렉토리에는 우리가 흔히 사용하는mv, rm, ls와 같은 프로그램 명령어들이 저장되어 있는것을 알 수 있다. 이렇게 root디렉토리에는 각각의 역할을 하는 중요한 디렉토리별로 시스템이 나뉜것을 알 수 있으며 각각의 역할은 다..
쉘(Shell)이란 리눅스에서 명령어를 작성하고 프로그램을 실행시킬때는 항상 '쉘'의 도움을 받는다. 쉘이란 사용자와 리눅스 커널간의 매개체, 연결다리 라고 생각하면 된다. 사용자가 직접 커널이나 하드웨어 조작을 할 수 없기 때문에 이를 편리하고 사용자친화적(?)이게 화면을 통해 소통을 하는 방식이다. 리눅스에서 여러개의 쉘이 있지만 기본적으로 사용하는 쉘은 bash이다. 현재 사용하고 있는 쉘을 확인하기 위해서 다음과 같이 작성하면 된다. echo $0 현재 내가 사용하고 있는 쉘은 zsh(제트쉘, 지쉘)이며 터미널 화면을 이쁘게 꾸미고 싶어서 변경 했다. 보기좋은 터미널이 개발하는데 즐거움(?)을 주기 때문이다.....(눈물) 이제 쉘의 개념을 알았으니 쉘 스크립트에 대해서 알아보자. 쉘 스크립트 우..
원 안에 있는 과정이 프로세스 즉 프로그램이 진행하는 과정이라고 생각하면 쉽다. 예를들어 ls, pwd, mkdir와 같은 명령어가 실행되면 프로세서라고 한다. 이 프로세서는 입력과 출력이 있다. 예를들어 ls -al이라는 명령어를 작성하면 ls는 프로세스, -al은 input이며 구체적으로는 Command-line Argument라고 한다. 위의 명령어를 작성하고 엔터를 누르면 출력 결과가 나타나는데 이것이 standard output이다. 이 프로그램 출력 결과가 곧바로 모니터에 출력되는데 이 결과를 모니터가 아니라 다른 파일로 저장하는 작업을 redireaction이라고 한다. redireaction하는 방법은 다음과 같다. Output ls -l > result.txt > (파일이름) 을 진행함으..
그동안 리눅스를 제대로 배우지 않고 라즈베리파이나 여러 작업을 할 때 아무 생각없이 sudo apt-get update와 같은 명령어를 사용한 적이 있다. 다들 그냥 그렇게 하길래 나도 의심의 여지없이 똑같이 따라했지만 리눅스 강의를 통해 apt-get명령어가 패키지 매니저라는 역할을 하는것을 알게 되었다. 패키지 매니저 처음 패키지 매니저라는 용어를 들으면 생소할 것이다. 쉽게 말하면 일종의 '프로그램'이라고 생각하면 된다. 흔히 사용하는 ls, pwd와 같은 명령어도 전부 패키지 이며 이는 리눅스에 기본적으로 깔려있지만 apt-get을 통해서 인터넷에서 정보를 가져올 수도 있다. apt를 통해 다운을 받을 수 있는데 이것을 패키지 매니저라고 하며 마치 앱스토에서 어플을 다운받는 것이라고 생각하면 편하..
리눅스에서 파일을 생성할때 편집기를 이용해서 파일을 생성한다. 그중 대표적으로 nano와 vi 편집기가 있지만 nano가 더 쉽고 중고급자는 vi편집기를 사용한다고 한다. 아직 리눅스 초보이기 때문에 nano편집기 사용방법을 알아보자. nano 기본 창에서 nano를 입력한다. 위의 명령어 입력 후 엔터를 치면 다음과같은 편집화면이 나타난다. 해당 창에서 텍스트나 코드를 입력하고 (ctrl + o) 키를 누른 다음 파일 제목을 입력하라는 창이 나온다. 파일 제목을 입력 한 후 엔터를 누르면 성공적으로 우리가 작성한 코드를 갖는 파일이 생성된다. 그런다음 ctrl + x 를 통해 에디터 화면을 빠져나온후 ls를 통해 현재 디렉토리 목록을 보면 우리가 생성한 파일이 생성됨을 확인 할 수 있다. 지금까지 기본..
이번 포스팅에서는 마이크로 컨트롤러의 외부인터럽트에 대해서 다뤄보자. 인터럽트 인터럽트란 프로그램이 진행될때 특별한 신호를 받으면 해당 신호를 먼저 처리하는 과정을 얘기한다. 위와같이 4번째 프로그램이 실행되다가 인터럽트(특별한 신호)가 발생하면 특정 과정이 진행되는데 이를 인터럽트 서비스루틴(ISR)이라고 한다. 즉, 우선순위는 진행되는 프로그램보다 인터럽트가 더 먼저 된다는 뜻이다. 인터럽트의 예는 TV리모컨과같이 우리가 어떤 채널을 보든 리모컨은 TV화면에서 나오는 영상보다 우선시 되기 때문에 이때 ISR은 리모컨 신호라고 할 수 있다. AVR입장에서 보면 인터럽트는 크게 2종류가 있다. 1. 외부 인터럽트 2. 타이머 인터럽트(타이머/카운터) 외부 인터럽트는 말 그대로 외부의 신호를 받아서 프로그..
임베디드 개발을 하기 위해서 하드웨어 보드를 간단하게 만들 수 있는 방법이 많다. 대표적으로 아두이노, 라즈베리파이 등 교육용 개발보드를 빵판이랑 연결해서 만들 수 있다. 이렇게 교육용 보드로 쉽게 원하는 작업을 만들 수는 있지만 제품을 양산하기 위해서는 프로젝트에 맞는 칩을 선정하고 보드를 직접 제작을 해야한다. pcb설계를 하면 반드시 테스트를 거치고 양산을 해야 한다. 따라서 제품을 만들기까지 개발과정은 다음과 같다. 1. pcb설계 후 테스트보드에 납땜하기 연구보안상의 이유로 보드사진은 모자이크처리를 하였다. 간략한 목표 동작은 Atmega8 칩 위에 적외선 센서를 연결하여 리모컨으로 수신을 받을 수 있도록 구현시켜야 한다. 이번 프로젝트에서는 타이머 인터럽트(카운터), 외부인터럽트(적외선 신호 ..
이번에는 아두이노에서 사용되는 칩셋 Atmega328P와 PC간 시리얼 통신하는법을 배워보자. 원칙적으로 UART통신을 하려면 별개의 단자를 이용해야 하지만 아두이노의 USB b타입 단자를 연결하면 업로드와 UART가 동시에 된다. (왜 이렇게 되는지 원리를 아시는분은 댓글로 설명좀...) UART 란? UART란 다양한 직렬(serial)통신방식중 하나이다. 대표적으로 시리얼통신방식으로 UART, SPI, I2C등이 있지만 이번에는 UART를 이용해서 putty로 통신하는것을 확인해보려고 한다. 직렬통신방식이 있으니 당연히 병렬(parallel)통신 방식도 있다. 직렬, 병렬통신은 각각의 장단점이 있다. 병렬통신 병렬통신을 이용하면 간단한 프로젝트를 할 때는 쉽고 직관적으로 코드를 작성 할 수 있으며 ..
아두이노는 원하는 작업을 쉽게 구현을 하고 편리한 IDE프로그램을 이용해 코딩도 쉽게 할 수 있다. 그러나 이는 단순히 '쉽게'구현 할 수 있을 뿐 실제 임베디드 개발을 하기 위해서는 제약이 많다. 그래서 이제부터 아두이노 언어를 사용하지 않고 AVR코딩을 하도록 습관을 갖자. 아두이노 - Microchip Studio 연동 아두이노에서 사용하는 칩셋은 Atmel사에서 제작한 'Atmega328P'이다. 자세한 데이터시트는 다음과 같으며 회로도도 보면서 설계하면 많은 도움이 된다. ATmega328P (microchip.com)(데이터시트) arduino-uno-schematic.pdf(회로도) 또, 아두이노와 마이크로칩스튜디오와 연동하기 위해서 다음 블로그를 참고하자. Microchip Studio를 ..
이번에는 AVR의 Atmel Studio를 사용하는 방법을 알아보고 레지스터 제어하는 법과 시뮬레이터 디버깅을 해보자. (이 회사는 인수되고 이름이 중구난방이 되버렸다....처음엔 AVR Studio였다가 Atmel Studio로 바뀌고 이젠 Microchip Studio란다....난는 뭔가 Atmel Studio가 더 편하고 친근하다.) 환경 설정 Atmel Studio7 설치 후 File - New - Project 을 누르면 칩을 선택하는 화면이 나온다. 여기서 사용할 칩을 선택하면 되는데 가장 많이 사용하고 교육용으로도 사용되는 흔하디 흔한 ATmega128을 사용해보자. 칩을 선택하면 비주얼스튜디오와 비슷한 화면을 맞이 할수 있다. 이제 여기서 신나게(?)코딩을 해주면 된다. AVR코딩은 C언어..
지난 여름방학때 아두이노를 했다면 이번 겨울방학때는 본격적으로 임베디드 구현을 해보려고 한다. STM32칩으로 시작을 해보자. 환경 구성 임베디드 개발에 있어서 환경구성을 하는것이 반을 차지할정도로 상당히 중요한 부분이며 시간도 상당히 오래걸린다. 준비물 stm32 개발보드 (누클레오, 제작보드 등), STlink, 점퍼선, 케이블 첫번째로 STM32 cube ide를 설치해준다. 이 프로그램은 arm컴파일러와같이 통합환경을 제공해주는 프로그램이다. 여러개로 흩어진 파일을 하나로 관리를 하면서 쉽게 다룰 수 있는 장점이 있다. 아두이노 IDE와 비슷한 프로그램이라고 생각하면 된다. STM32CubeIDE - Integrated Development Environment for STM32 - STMicro..
지난번에 Disctrete RV에서 Binomial과 Poisson 분포에 관해 다뤘다면 이번에는 Continuous RV에서 Exponential RV을 알아보자. What is Exponential Random Varialbe Exponential RV란 한글로 지수분포라고 한다. 사건이 독립적일때, 일정 시간동안 발생하는 사건의 횟수가 포아송 분포를 따르면, 다음 사건이 일어날 때까지 대기시간은 Exponential 분포를 따른다. 즉, 시간에따른 함수이기 때문에 continuous한 형태임을 알 수 있다. 이 분포의 PDF는 이름에서 알 수 있듯이 지수함수적으로 감소하게 되며 CDF는 각각의 PDF를 적분한 형태이기 때문에 증가하는 모양을 보인다. PDF는 다음과 같다. 이제 매트랩을 이용해 PD..
확률과 통계학 수업을 하면서 여러 확률모델에 관해 배웠다. 그중 이산적(discrete)인 Empirical PMF을 통해 Binomial RV와 Poisson RV를 비교해 보자. What is Binomial Random Variable? Binomial RV란 고등학교 확률과 통계 수업에서 배우는 '이항분포'와 같은 개념이다. n번의 독립시행중 성공할 확률이 p일 때 갖는 이산확률분포이다. 말로 표현하기에는 와닿지 않으니 바로 PMF를 확인해 보자 위 식을 해석하자면 총 n번 시행 중 성공할 확률 : p, 실패할 확률 : q (=1-p) 일때 성공을 k번, 실패를 n-k번 발생할 때의 확률을 표현한 식이다. 평균 : E[X] = np 분산 : VAR[X] = npq = np(1-p) Binomial..
학부연구실 활동을 하면서 진행하던 프로젝트의 회로설계와 PcB Artwork를 끝마쳤다. 이제 남은건 보드를 받고 디버깅 하면서 제품을완성 하는 것이다. 설계를 완료한 보드는 외주를 맡겨서 2~3주간 시간이 남는다. 남는시간동안 보드에 사용될 부품에 대해서 공부를 해 보았다. 우리가 회로제작을 하면서 사용되는 부품은 크게 두 분류로 구분 할 수 있다. 바로, 수동소자(Active componenet) 능동소자(Passive component) 각각의 부품종류와 특징을 알아보자. 수동소자(Passive componenet) 수동소자는 우리가 주변에서 가장 흔히 접하는 부품이며 회로이론에서 가장 기본이 되는 부품이다. 그 중에서 R(저항), L(인덕터), C(캐패시터)가 대표적인 수동소자이다. 수동소자의 특..
대학교 1학년 처음 C프로그래밍을 접해봐서 아무것도 모른 채 무작정 코딩하는법, 문법만 주구장창 외운 기억이 있다. 그렇게 공부를 하니 제대로 이해를 못한 채 한학기가 끝나버렸다. 방학때 스스로 공부를 다시 천천히 해보니까 하나 둘씩 원리가 이해되면서 퍼즐이 맞춰지는 기분이 들었다. 복습하는 차원으로 다시 정리를 하고 더 나아가서 컴퓨터 구조인 메모리 관점에서도 확인해 보자. 포인터 포인터란 각자가 표현하는 방식이 다양하게 있지만 나는 '주소를 가리키는 것'이라고 표현하고 싶다. 백문이 불여일견 빠르게 예제를 통해 확인하자 위와 같이 코드를 작성한 후 실행하면 다음과 같은 결과가 나온다. 이런 코드를 구간별로 나눠서 자세히 그림을 통해 분석해보자. 1번 구간 변수 3개를 선언하여 메모리 공간이 할당되었고..
많은사람들이 질문을 할 수 있을것이다. 비주얼스튜디오, vscode와 같이 다루기 쉬운 툴이 있는데 뭐하러 불편하게 리눅스에서 C언어를 공부하나?? 맞는말이다. 비주얼스튜디오는 C언어를 배우기 위해 잘 만들어진 소프트웨어 툴이다. 그러나 실제로 전자공학에서는 C언어로 MCU를 다루기 때문에 문제가 된다. 우리가 사용는 PC대부분은 64비트 프로세서라서 넉넉한 메모리공간을 갖고 있지만 PC이외의 임베디드 제품(냉장고, 로봇청소기, 프린터 등)은 전부 8비트, 16비트와 같이 매우 협소한 공간을 갖는다. 심지어 OS가 내장되지 않은 제품은 더욱 고려할 사항이 많아진다. 이번 포스팅에서는 리눅스에서 C언어 코드를 작성, 컴파일, 디버깅하는 과정을 다뤄보자. C 코드작성 1. C언어코드를 담을 디렉토리를 생성하..
라즈베리파이는 소형 컴퓨터 이다. 게다가 리눅스 기반 컴퓨터라 사용자가 마음껏 용도를 바꿀수도 있다. 이번 포스팅에서는 구글의 모바일 및 웹 애플리케이션 개발 플랫폼 'Firebase' 에서 클라우드와 파이의 카메라, GPIO에 모션감지센서를 연결 할 것이다. 방에 침입자가 들어오면 모션센서가 이를 인식한 후 카메라로 찍어서 클라우드에 사진을 전송하는 기능을 구현해 보자. Firebase 설정 1. Firabase홈페이지에 들어가서 구글계정으로 가입 Firebase (google.com) Firebase Firebase는 고품질 앱을 빠르게 개발하고 비즈니스를 성장시키는 데 도움이 되는 Google의 모바일 플랫폼입니다. firebase.google.com 2. 시작하기 -> 프로젝트 추가(Raspber..