회로에서 가장 기본적인 부품에는 저항이 있다.


사진 출처 위키피디아

생김새로는 이렇고, 회로도에서는 아래와 같이 그린다.

아래의 기호는 IEC(국제 전기 표준 회의)의 저항 기호라는데, 주로 그냥 위의 지그재그 기호를 사용한다.


저항의 겉에는 색띠로 저항값을 표시하는데 그걸 읽는 규칙은 이렇다.

비교적 멀찍히 띄워진 띠(주로 금색, 은색)를 오른쪽에 두고, 오른쪽 끝 2개의 띠를 빼고 아래 표의 색깔대로 읽는다.

 검정

 갈색

 빨강

 주황

 노랑

 초록

 파랑

 보라

 회색

 흰색

 0

 1

 2

 3

 4

 5

 6

 7

 8

 9


이걸 10진수로 차례대로 배열해서 숫자를 얻는다.

위의 사진의 저항의 경우 금색을 오른쪽으로 두어서, 왼쪽부터 읽으면 주황, 주황이므로 33이 나온다.


그 다음, 마지막에서 두번째 띠는 위 표의 숫자로 10의 n배 해서, 즉

 검정

 갈색

 빨강

 주황

 노랑

 초록

 파랑

 보라

 1

 10

 100

 1,000(1k)

 10k

 100k

 1,000k(1M)

 10M

를 먼저 구했던 숫자에 곱한다. 물론 위의 표에 더해서 회색, 흰색도 있고 검정 아래로 금색(0.1), 은색(0.01)도 있다. 아무튼 주로 쓰이는 색들은 이렇다.

아까 33을 구했고, 마지막에서 두번째 띠는 갈색이므로 10을 곱하면 330이 나오고, 이게 이 저항의 값이 된다. 즉, 위의 저항은 330옴이다.


마지막 띠는 이 저항의 오차값인데, 주로 쓰이는 색은 이렇다.

 없음

 은색

 금색

 갈색

 보라색

 20%

 10%

 5%

 1%

 0.1%

오차가 작을수록 가격은 비싸지는데, 5%정도면 충분하고 10% 이상 오차가 나는 저항도 거의 없으니 무난하게 5% 짜리면 적당하다.


대략적인 가격은 5% 저항 개당 10원, 1%는 20원 정도이고 더 큰 오차를 갖는 저항은 찾기도 힘들다. 보통 파는 데에서는 같은 저항값끼리 10개 단위로 판매한다.

'하드웨어 > 전자 기초' 카테고리의 다른 글

저항, 저항 읽는 법  (0) 2017.01.07
블로그 이미지

예비컴공돌이

각종 프로젝트 진행중! 생각날때마다 블로그 업데이트합니다.

약 1년 만에(?) 블로그 포스팅을 하는데... 전의 내용에 이어서 최종 결과까지 올리자면 이렇다.

우선 제작 사진으로,

 

이 것이 실제로 시연에 사용된 로봇의 모습이다. 전반적인 뼈대는 EV3를 사용했고, 그 위에 3개의 USB 마이크가 연결된 라즈베리 파이를 얹었다. 라즈베리 파이의 전원으로 EV3의 USB 포트를 사용했고, 서로 블루투스를 이용해 통신을 한다.


라즈베리 파이는 3으로, 내장된 블루투스가 있고 Raspbian Jessie를 사용했다. 프로그램은 systemd에 데몬으로 등록해두어 시스템 시작 시에 같이 시작되도록 했고, ALSA로 마이크로부터 값을 읽어서 계산해서 연결된 EV3로 값을 전송한다.


EV3는 통신으로 방향을 받아 모터를 제어하며, 정면에 설치된 초음파 센서를 이용해 앞 대상까지의 거리를 측정해서 정지 및 장애물 회피 기능도 수행한다. 앞의 물체와의 거리가 일정 이상 가까우면, 마이크로 인식한 주인의 방향이 정면이라면 (앞의 물체가 주인으로 인식해서) 정지하고, 아니라면 장애물이라고 인식해 크게 방향을 전환한다.


아래는 작동하는 모습을 촬영한 영상이다. 약 2미터 정도의 거리까지는 위치를 인식해서 방향을 찾아온다.



'완료된 프로젝트 > Homing Robot' 카테고리의 다른 글

완성품 & 작동 영상  (0) 2017.01.07
프로그램 제작기  (2) 2016.12.10
로봇 따라가기의 기본 원리  (3) 2016.12.09
프로젝트 개요  (5) 2016.12.08
블로그 이미지

예비컴공돌이

각종 프로젝트 진행중! 생각날때마다 블로그 업데이트합니다.

이번 글에서는 앞선 글의 내용들을 이용해 어떻게 프로그램을 짰는지 설명한다.


프로그램의 구조는 아래와 같다.

  1. 백그라운드에서 3개의 마이크에서 음성 신호를 받는대로 고속 푸리에 변환(FFT)을 수행해 특정 주파수 대역의 크기(Magnitude)를 구해 방향을 찾는다
  2. 일정 주기로 1의 결과를 읽어와, EV3가 수신할 수 있는 데이터 포맷으로 인코딩해 전송한다.
  3. EV3 로봇은 그 데이터를 수신해 방향을 향해 회전하고 이동한다.


1, 2, 3번 프로그램은 각각 별개로 실행되고, 서로 데이터를 주고받는 방법을 가지게 한다.



1번 프로그램


우선 1번 프로그램은 시스템 의존적인 부분이 대부분이고, 또 그것들은 C 라이브러리로 제공되기에 C언어로 작성했다.


마이크에서 값을 받아오는 부분은 리눅스 환경의 ALSA를 이용해 녹음하는 예제(링크)를 이용했다. 복잡한 기능 없이 소리만 읽어오면 되므로 위의 간단한 코드로 큰 문제 없이 값을 얻어올 수 있었다.


라즈베리 파이에서 FFT를 수행하기 위해 검색한 결과, 내장된 GPU를 이용해 연산을 수행하는 라이브러리가 공개되어 있었다.(라즈베리 파이 블로그, GPU_FFT 프로젝트 페이지) 이 라이브러리를 이용해 빠르게 계산할 수 있고, 여러 개의 작업을 모아 한번에 수행(batch)하는 기능도 있어 3개의 마이크를 이용하는 데 적합하다고 생각했다.


마지막으로, 계속 연산을 수행하면서도 2번 프로그램과 통신을 하기 위해 pipe와 fork를 사용했다.

1번 프로그램은 실행되면 pipe를 열고 fork를 해서 자식 프로세스를 만든다. 부모 프로세스는 stdin에서 입력을 대기하고, 입력이 들어온 경우 자식 프로세스에 SIGUSR1을 발생시킨 뒤 pipe read를 대기한다.

자식 프로세스는 계속해서 마이크에서 값을 읽어와 연산을 수행하고, SIGUSR1을 받았을 때 pipe로 현재 각도를 전송(write)한다.

그러면 부모 프로세스는 pipe에서 각도를 읽어오게 되고, 그 각도를 stdout으로 출력한다.



2번 프로그램


2번 프로그램은 파이썬으로 되어있는데, 이 프로그램이 맡는 역할은 이렇다.


우선 블루투스 SPP 프로파일이 사용되도록 설정된 라즈베리 파이에서(참고),

이 프로그램은 우선 subprocess 모듈로 "rfcomm watch hci0" 프로세스를 실행해 EV3가 라즈베리 파이에 연결되어  "/dev/rfcomm0" 포트가 생기기를 기다린다.

포트가 생겼다면, serial 모듈로 /dev/rfcomm0 과 연결해 EV3와의 통신 연결을 만든다.


그 후, subprocess로 stdin과 stdout을 PIPE시킨 1번 프로그램을 실행한다.

다음으로 1초 간격으로 루프를 돌면서, 1번 프로그램의 stdin으로 데이터 하나를 입력해서, stdout으로 출력되는 각도를 가져온다.

그 각도(-180 ~ 180)을 EV3 모터 입력으로 들어갈 방향의 범위(-100 ~ 100)로 변환한 뒤, struct 모듈을 이용해 EV3 메시지 포맷에 맞는 형태로 감싸서 serial로 전송한다.(참고, 이 글에서는 EV3로부터의 수신이지만, EV3로의 송신도 가능함을 확인했다. EV3로의 송신 관련해서는 자료가 전무해 힘들었다.)


만약 1번 프로그램이 종료되거나 시리얼 포트로 자료가 전송되지 않았다면, 1번 프로그램에 문제가 발생했거나 EV3와의 연결이 종료된 것으로 판단, 반복문을 빠져나가 /dev/rfcomm0 포트 대기 부분으로 돌아간다.



3번 프로그램


마지막으로 3번 EV3 프로그램은 복잡한 동작은 없어 레고 EV3 블록 프로그래밍 툴로 제작했다.

라즈베리 파이와 블루투스 연결을 하고 블루투스로 각도 정보를 읽어오는 부분, 저장된 각도 정보대로 모터를 조종해 이동하는 부분으로 구성되어있다.



결론


2번 프로그램의 EV3로의 송신 관련해서는 나중에 또 글을 올릴 예정이다. 구글링을 해봐도 자료가 라즈베리 파이에서 수신하는 것 하나만 나와서, 혹시라도 같은 주제로 헤맬 사람이 있을지 몰라 정보를 공유하려고 한다.

'완료된 프로젝트 > Homing Robot' 카테고리의 다른 글

완성품 & 작동 영상  (0) 2017.01.07
프로그램 제작기  (2) 2016.12.10
로봇 따라가기의 기본 원리  (3) 2016.12.09
프로젝트 개요  (5) 2016.12.08
블로그 이미지

예비컴공돌이

각종 프로젝트 진행중! 생각날때마다 블로그 업데이트합니다.