사실 웹캠 스트림 서버라는게 지난 포스트 CCTV 만들기-1, CCTV 만들기-2를 통해 알아본 CCTV와 크게 다를 바 없다. 실제로 motion프로그램에게 웹캠 스트림 기능을 제공하므로 기능 측면에서 다른점이라고 하면 CCTV에 있는 저장하는 기능이 웹캠 스트림 서버에 없다는 정도 일 것 같다. 그럼에도 불구하고 따로 웹캠 스트림 서버 프로그램을 설명하는 이유는 이번 포스트에서 설명할 mjpg-streamer라는 프로그램이 motion 프로그램의 여러 플랫폼에서 웹캠 스트림을 확인하지 못하는 단점을 보완하기 때문이다. 이에 대한 자세한 얘기는 이번 포스트 마지막 부분에서 하겠다.

 

  우선 mjpg-streamer라는 프로그램을 설치하자. 이 프로그램은 apt-get 을 이용해서 설치 할 수 있지 않다. 소스코드를 받아서 컴파일을 해서 실행 시켜야하는데 어렵지 않으니 그냥 따라 하면 된다. 우선 svn으로 소스코드를 받자. 아래와 같이 'svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer/ mjpg-streamer'를 입력하면 mjpg-streamer라는 폴더가 생기고 그 안에 mjpg-streamer 소스코드가 다운로드 받아진다.

웹캠 스트림 서버

 

  mjpg-streamer 폴더에 들어가서 make를 입력하면 스스로 프로그램을 컴파일한다. 중간에 에러가 발생할 수도 있는데 그때는 에러 내용이 무엇인지 판단해서 고쳐야 한다. 필요한 라이브러리가 없을 경우 에러가 발생할 가능성이 있으니 에러를 확인해서 없는 라이브러리를 설치한 뒤 다시 make로 컴파일 하면 된다.

웹캠 스트림 서버

 

  기본적으로 이 프로그램을 실행시키는 명령어는 './mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"' 이다. 여기에 여러 옵션을 넣을 수 있다. 그 옵션은 다음 표와 같다. 

 

 

  WebCam 옵션

-d

video device to open (your camera)

-r

the resolution of the video device, can be one of the following strings:
QSIF QCIF CGA QVGA CIF VGA SVGA XGA SXGA or a custom value like: 640×480

-f

frames per second

-y

enable YUYV format and disable MJPEG mode

-q

JPEG compression quality in percent (activates YUYV format, disables MJPEG)

-m

drop frames smaller then this limit, useful if the webcam produces small-sized garbage frames may happen under low light conditions

-n

do not initalize dynctrls of Linux-UVC driver

-l

switch the LED on, off, let it blink or leave it up to the driver using the value auto

 

 

  HTTP 출력 옵션

-w

folder that contains webpages in flat hierarchy (no subfolders)

-p

TCP port for this HTTP server

-c

ask for username:password on connect

-n

disable execution of commands

 

출처 : Wolf Paulus Journal

 

 

  옵션 사용이 조금 독특하다. WebCam 옵션은 -i 뒤에 나오는 따옴표 안에, HTTP 옵션은 -o 뒤에 나오는 따옴표 안에 넣어야 한다. 여기서 중요한 옵션 몇개만 간략히 소개하자면 WebCam 옵션의 -r은 해상도, -f는 초당 프레임수 -q는 jpg 퀄리티를 설정하는 옵션이다. -d는 웹캠이 두개 이상 설치되어 있을 때 그 중 원하는 웹캠을 선택하는 옵션으로 기본값으로 /dev/video0를 가진다. HTTP 옵션의 -w는 웹페이지가 담겨있는 폴더의 위치, -p는 TCP 포트를 설정하는 옵션이다. 포트 설정이 없을 경우 8080 포트를 기본값으로 사용하는데 XBMC등 8080포트를 사용하고 있으면 bind 할 수 없다는 에러 메시지가 뜬다. 예를들어 아래 사진 속 명령어를 보면 640*480 해상도로 초당 15프레임을 찍어서 8083포트로 스트리밍하고 있는 것을 알 수 있다.

웹캠 스트림 서버

 

  이제 웹브라우저로 http://아이피주소:8083/에 접속하면 아래와 같은 화면을 볼 수 있다. 아래 페이지는 프로그램에서 제공하는 샘플 페이지로 여러 가지 방법으로 웹캠 화면을 보는 것을 구현 해 놓았다. 기본적인 방법으로 html의 img 태그를 이용할 수 있다. 예를들어 <img src="http://아이피주소:8083/?action=snapshot">이라고 하면 정지된 사진을, <img src="http://아이피주소:8083/?action=stream">이라고 하면 동영상을 볼 수 있다. 이런 방법으로 동영상을 스트림 하는 경우는 익스플로러에서 작동하지 않는다.

웹캠 스트림 서버

 

웹캠 스트림 서버

 

웹캠 스트림 서버

 

  익스플로러에서도 동영상 스트리밍을 보려면 자바스크립트를 이용하는 방법을 사용하면 된다. 자바스크립트를 이용하는 방법 또한 제공되는 샘플 코드를 보면 그리 복잡하지 않기 따문에 쉽게 이용할 수 있을 것으로 보인다.

웹캠 스트림 서버

 

  마지막으로 VLC 프로그램이나 웹브라우저에 스트리밍 주소를 집접 적는 방법에 있는데 이때 주소는 'http://아이피주소:8083/?action=stream' 이고 motion과 마찬가지로 익스플로러와 크롬은 지원하지 않고, 파이어폭스는 지원한다.

웹캠 스트림 서버

 

  지난 포스트에서 소개한 motion 프로그램으로도 웹캠 스트리밍을 할 수 있음에도 불구하고 mjpg-streamer를 소개한 이유는 정말 다양한 플랫폼에서 사용할 수 있기 때문이다. 우선 인터넷 익스플로러, 크롬, 파이어폭스 모두 사용이 가능하다. 스냅샷은 모든 웹브라우저에서 가능하고, 스트림은 익스플로러에서는 제대로 작동하지 않지만 자바 스크립트를 이용한 방법으로는 익스플로러에서도 라이브 스트리밍을 볼 수있다. 또한 소스코드가 공개되어 있기 때문에 프로그래밍을 할 줄 아는 사람이라면 소스코드 분석을 통해 배울 점도 많아 보인다.

 

참조 : Wolf Paulus Journal

블로그 이미지

작은 조약돌

공돌이 형과 글쟁이 동생 쌍둥이 형제의 낙서장

,

  지난 포스트 CCTV 만들기-1에서 motion 프로그램을 설치하고 daemon으로 실행하는 것 까지 알아보았다. 이번 포스트에서는 실제로 CCTV 화면을 확인하기 위해 필요한 설정들을 알아보자. (이번 포스트에 있는 그림에서 보면 8081번 포트로 접속하는데 이는 지난 포스CCTV 만들기-1 에서 설정한 것과 다른 설정에서 화면캡쳐를 했기 때문이다. 8082번으로 접속한 것으로 보기 바란다.)

  이제 프로그램도 돌아가니 웹브라우저에서 CCTV 화면을 확인해보자. 웹브라우저 주소창에 http://아이피주소:8082/를 입력하면 아래와 같이 페이지에 접속할 수 없다는 메시지가 나온다. 웹캠 서버가 localhost에서 접속만 허용하도록 설정되어 있기 때문이다. '/etc/motion/motion.conf' 파일에서 'webcam_motion' 값과 'control_localhost' 값을 모두 off로 설정해줘야 한다. 지금까지 인터넷에 돌아다니는 자료에는 'control_localhost'에 대한 언급이 없는데 프로그램이 수정되면서 추가된 것으로 추정된다.

라즈베리파이 CCTV

 

  다시 웹브라우저에서 스트리밍 주소로 접속을 하면 인터넷 익스플로러의 경우 웹캠 화면이 보이는 것이 아니라 아래와 같이 다운로드하는 창이 뜰 것이다. 크롬을 사용할 경우는 다운로드하는 창도 뜨지 않을 것이다. motion 서버에서 뿌려주는 화면을 표시하려면 mjpeg stream을 제공해야 하는데 인터넷 익스플로러와 크롬은 이를 지원하지 않기 때문이다. 크롬은 오래된 버전의 경우 지원을 했었기 때문에 제대로 표시 할 수도 있다.

라즈베리파이 CCTV

 

   다행히 파이어폭스는 mjpeg stream을 지원하기 때문에 파이어폭스를 이용하면 아래와 같이 CCTV 화면을 확인할 수 있다.

라즈베리파이 CCTV

 

  이렇게 확인을 했지만 여전히 문제는 있다. 바로 계속 motion 서버가 죽는 것이다. 이는 사진을 저장할 때 권한 문제로 에러가 나는 것으로 추정된다. 따라서 폴더를 하나 만들어서 사진을 저장하도록 하자. 예를 들어 '/home/pi/motion/'이라는 폴더를 만들면 'target_dir /home/pi/motion/'라고 값을 변경하자. 그러면 아래와 같이 motion 폴더에 사진들이 저장되는 것을 알 수 있다.

라즈베리파이 CCTV


  이제 라즈베리파이를 CCTV로 쓰는데 큰 문제는 없다. 지난 포스트에서도 언급했듯 '/etc/motion/motion.conf' 파일에는 여러가지 설정을 변경 할 수 있다. 그 중에 몇가지만 소개하자면 width와 height 값을 변경하면 아래와 같이 더 큰 화면을 얻을 수도 있고, brightness, contrast, saturation, hue 등을 통해 화면의 밝기, 대비, 채도 등을 설정할 수도 있다. output_normal 값을 off로 바꾸면 움직임이 감지되더라도 저장하지 않고, 라이브로 감시만 가능해지기도 한다. 이 외에도 많은 설정이 가능하기 때문에 꼭 하나하나 읽어보길 추천한다.

라즈베리파이 CCTV

 

 

  지금까지 파이어폭스로 CCTV 화면을 확인하는 법을 알아봤는데 안드로이드 앱을 통해서 CCTV를 확인 하는 법을 알아보는 것으로 이번 포스트를 마치도록 하자.


  구글스토에서 mjpeg으로 검색을 하면 여러 앱이 검색된다. 이 중 어느 것을 사용하나 무방하지만 가장 위에 올라와 있는 MJpeg Viewer 앱을 선택해서 설치, 실행해보자.

Mjpeg Viewer Mjpeg Viewer


  실행하면 아래와 같이 매우 단순한 화면이 나온다. URL을 클릭하면 주소를 입력할 수있는 창이 뜨고, 주소를 넣고 확인을 누르고, Show 버튼을 클릭하면 CCTV화면이 나온다. 

Mjpeg Viewer Mjpeg Viewer


Mjpeg Viewer

블로그 이미지

작은 조약돌

공돌이 형과 글쟁이 동생 쌍둥이 형제의 낙서장

,

  이번 포스트에서는 라즈베리파이를 이용하여 간단한 CCTV를 만드는 법을 알아보자. 인터넷에 이와 관련해서 여러 블로그 자료가 있는데 그대로 따라했음에도 불구하고 제대로 작동하지 않아 답답한 사람들이라면 이번 포스트를 통해를 해결 할 수 있길 바란다.

 

  우선 CCTV를 만들기 위해서는 카메라가 필요하다. 카메라는 아래 왼쪽과 같은 라즈베리파이용 카메라 모듈을 사용할 수 있지만 일반 웹캠을 사용해도 무방하다. 사용할 수 있는 웹캠의 종류는 여기서 확인 할 수 있다. 이 포스트는 아래 오른쪽 사진에서 보이는 마이크로소프트사의 HD-3000을 기준으로 설명한다. 

라즈베리파이 CCTV라즈베리파이 CCTV

 

  일반 usb웹캠을 사용하게 되면 전력이 부족해서 라즈베리파이가 작동되지 않는다. 따라서 웹캠에 전원을 공급할 수 있도록 usb 허브를 사용해야한다. 필자는 지난 포스트에서 소개했던 MBF-H04 USB 허브를 이용하였다. 

USB 허브

 

  카메라를 usb 허브를 통해 라즈베리파이에 연결한 후, 제대로 연결되었는지 lsusb 명령어로 확인해본다. 아래 그림에서 웹캠이 Device 006으로 인식된 것을 확인 할 수 있다. 

라즈베리파이 CCTV

 

  라즈베리파이를 CCTV로 만들기 위해 사용되는 프로그램은 몇가지 있지만 그 중에 가장 많이 사용되는 것으로 보이는 motion 프로그램을 설치해보자. motion은 리눅스용으로 개발된 mjpeg 스트리밍 프로그램으로 카메라에 움직임이 포착될 때 사진을 저장하는 기능이 있어 CCTV 프로그램으로 쓰기에 좋다. 아래와 같이 'sudo apt-get install motion'을 입력하면 설치가 완료되는데 설치 전에 'sudo apt-get update' 명령으로 업데이트를 먼저 할 것을 추천한다.

라즈베리파이 CCTV

 

  프로그램 설치가 끝났으면 프로그램을 실행하기 전에 'nmap localhost' 명령으로 지금 사용되고 있는 네트워크 포트를 확인해 보자. nmap이 설치되어 있지 않다면 apt-get으로 쉽게 설치가 가능하다. 아래 그림에서 22, 80, 3389, 8080, 9090번 포트가 열려있는 것을 알 수 있다. 

라즈베리파이 CCTV

 

  이제 'sudo service motion start' 라고 입력하여 프로그램을 실행시켜보자. 원래 프로그램이 daemon 으로 실행, 즉, 백그라운드에서 실행되야 하지만 아래에서 보듯 실행되지 않는다. daemon 실행이 되지 않도록 기본값이 설정되어 있기 때문이라 설정을 바꿔줘야 한다.

라즈베리파이 CCTV

 

  우선 '/etc/default/motion' 파일을 열어서 'start_motion_daemon' 값을 yes로 바꾼다.

라즈베리파이 CCTV


  둘째로 '/etc/motion/motion.conf' 파일을 변경해야 하는데 이 파일에는 프로그램의 모든 설정사항들이 포함되어 있으므로 하나씩 읽어보길 권장한다. 우선 daemon으로 실행하기 위해 'daemon' 값을 on으로 바꾼다. 또한 포트 8080번은 xbmc에서 사용하고 있으므로 다른 포트로 사용해야 두 프로그램을 모두 원활하게 사용할 수 있다. 필자는 webcam_port 8082, control_port 8081으로 설정했다.

라즈베리파이 CCTV


  이제 다시 프로그램을 실행시켜보면 실행이 된다. 'nmap localhost' 명령으로 확인해보면 8081, 8082포트가 새로 열린 것을 알 수 있다. 8082 포트는 라이브 웹캠 화면을 볼 때 사용하는 포트이고 8081 포트는 http를 통해 컨트롤하는데 사용된다.

라즈베리파이 CCTV

 

  우선 192.168.1.9:8081에 접속하면 아래와 같은 화면을 볼 수 있다. 이 간단한 페이지를 통해 motion 프로그램의 설정 값을 가져오고 설정할 수 있다.

  이번 포스트에서는 motion 프로그램을 실행시키는 것 까지 알아보았다. 다음 포스트에서는 실제로 CCTV화면을 확인하고, motion 프로그램을 설정하는 법을 알아보자.

블로그 이미지

작은 조약돌

공돌이 형과 글쟁이 동생 쌍둥이 형제의 낙서장

,

  지난 포스트 PWM으로 RGB LED 다양한 색깔 표현에서 PWM 방식으로 RGB LED의 밝기를 조절해서 다양한 색깔의 빛을 표현하는 방법을 알아보았다. 이번 포스트에서는 가변저항을 이용하여 같은 일을 아날로그 방식으로 처리하는 방법을 알아보자.


  우선 가변저항이 무엇일까? 말그대로 변화가 가능한 저항, 즉 저항의 값이 하나로 고정된 것이 아니라 변할 수 있는 저항을 말한다. 다양한 가변저항이 있는데 기본적인 성질과 원리는 거의 비슷하다. 아래와 같이 생긴 가변저항을 로터리식 가변저항이라 부르는데 스피커의 볼륨조절기를 생각하면 된다. 그 원리는 아래 사진의 우측하단에 표시된 바와 같이 1과 3에 전체 저항이 연결되어 있고, 스위퍼(sweeper)라고 불리는 2번이 옮겨다니면서 저항 값이 변하게 되는 것이다. 즉 노브를 돌리면 1번과 2번사이의 저항, 2번과 3번사이의 저항의 값이 변화하게 되는 것이다. 참고로 1번과 2번 사이의 저항값이 최저일때, 2번과 3번사이의 저항값은 최고이고, 1번과 2번 사이의 저항값이 커지면 2번과 3번 사이의 저항값이 작아진다.


  이제 아래와 같이 회로를 구성한다. 스위치는 필자의 가변저항이 스위치 기능이 되는 것이 아니라 저렇게 따로 연결 했으나 없어도 불을 끄지 못하는 점 외에는 큰 상관 없다. 가변저항의 2번을 GND와 연결하고 1번이나 3번을 LED의 R, G, B 다리에 연결한다. 1번을 연결하느냐 3번을 연결하느냐에 따라 오른쪽으로 노브를 돌렸을 때 LED의 밝기가 밝아지느냐 어두워지느냐가 달라진다. 그리고 LED의 커먼 애노드(+)에 5V 전압을 연결하면 된다.


  이제 스위치로 LED를 켜고 노브를 돌리면 아래 동영상에서 처럼 LED의 밝기가 변화하는 것을 확인 할 수 있다.


블로그 이미지

작은 조약돌

공돌이 형과 글쟁이 동생 쌍둥이 형제의 낙서장

,

  지난 포스트 RGB LED로 신호등 만들기에서 RGB LED를 사용해서 빨간색, 노란색, 초록색 불을 켜는 방법을 알아봤다. 그 중 특히 노란색 불은 빨간색과 초록색 불을 섞어서 만들었다. 이런 식으로 하면 빨간색, 노란색, 초록색 불을 각각 켜고 끄는 것으로 불끄는것 포함 총 8개의 색을 나타낼 수 있다. 하지만 이렇게 해서는 표현 할 수 있는 색이 너무 적다. 이번 포스트에서는 PWM을 이용해서 RGB LED로 여러가지 색깔을 표현하는 방법을 알아보자.


  우선 아래 사진처럼 지난 포스트에서 RGB LED를 연결하는거와 같이 저항과 LED와 GPIO핀을 연결한다. 지난 포스트에서는 파란색 불을 사용할 일이 없어서 연결하지 않아도 됐지만 이번에는 세개 모두 연결 한다.

PWM RGB LED


  LED로 여러가지 색을 나타내려면 기본적으로 LED의 밝기를 조절해야하는데 LED 밝기 조절은 전압을 변경하여 할 수 있다. 하지만 GPIO핀은 디지털인데, 즉, 끄고 켜는 두가지 외에는 방법이 없는데 어떻게 LED의 밝기를 조절 할 수 있을까? 이를 위해서는 PWM을 이해해야한다. PWM은 Pulse Width Modulation의 약자로 펄스 폭 변조라고 한다. PWM은 디지털 기기에서 아날로그 결과를 얻기 위한 테크닉으로, 전원인 on되는 시간을 펄스 폭이라고 하고, 펄스 폭을 조정함으로 on과 off사이의 전압을 흉내낼 수 있다. 이러한 on-off 패턴을 빠르게 반복하여 LED에 출력하면 LED의 밝기를 변경 할 수 있게 되는 것이다. 예를 들어 아래 그림과 같이 on이 지속 되는 시간, 즉, 펄스 폭을 조정하면, 위에서 아래로 갈 수록 밝은 LED 빛을 얻을 수 있다.

PWM


  WiringPi 라이브러리에서 PWM을 지원 한다. 다음은 WiringPi 라이브러리의 PWM 함수를 이용해서 LED의 색깔을 바꿔서 다양한 색을 표현하는 프로그램 코드이다. 

#include <stdio.h>
#include <wiringPi.h>
#include <softPwm.h>

#define PIN_R 7
#define PIN_G 0
#define PIN_B 1

void setRGB(int r, int g, int b){
  softPwmWrite(PIN_R, 255-r);
  softPwmWrite(PIN_G, 255-g);
  softPwmWrite(PIN_B, 255-b);
}

int main (void)
{
  int i = 0, j = 0, k=0;
  printf("RGB LED Various Color");

  if (wiringPiSetup () == -1)
    return 1 ;

  pinMode (PIN_R, OUTPUT) ; //R
  pinMode (PIN_G, OUTPUT) ; //G
  pinMode (PIN_B, OUTPUT) ; //B

  softPwmCreate(PIN_R,0,255);
  softPwmCreate(PIN_G,0,255);
  softPwmCreate(PIN_B,0,255);

  for (i = 0; i <= 250; i=i+50){
    for (j = 0; j <= 250; j=j+50){
      for (k = 0; k <= 250; k=k+50){
        setRGB(i,j,k);
        delay(50);
        printf("R:%d G:%d B:%d\n", i, j, k);
      }
    }
  }

  setRGB(0,0,0);//clear LED
  delay(50);

  return 0 ;
}
  위 코드를 조금 살펴보자. 우선 3번째 줄을 보면 'softPwm.h' 헤더파일을 포함시키는데, 이는 WiringPi에서 지원하는 헤더파일로 PWM을 사용하기 위해서는 이 헤더파일이 필요하기 때문이다. 두번째로 27-29번째 줄을 보면, softPwmCreate 함수를 사용하는데 이 함수는 소프트웨어로 제어되는 PWM 핀을 만든다. 이 함수는 핀번호, 기본값, PWM 값의 범위 이렇게 세가지를 파라미터로 갖는다. 따라서 27번째 줄의 softPwmCreate(PIN_R,0,255) 는 7번 핀을 0과 255사이의 범위를 갖고 기본값을 0으로 하는 PWM 핀을 만든다. 마지막으로 9-13번째 줄은 LED에 불을 켜는 함수로 softPwmWrite를 이용해서 빨간색, 초록색, 파란색 불빛의 밝기를 조절하여 원하는 색깔의 빛을 만든다.

  프로그램을 컴파일하고 실행하면 아래 동영상과 같은 결과를 얻을 수 있는데, 컴파일 할 때 pthread 라이브러리도 포함시켜야 한다. 예를 들면 'gcc -o 3led_light 3led_light.c -lwiringPi -lpthread' 명령을 사용해서 컴파일 해야한다.


참조

WiringPi.com


블로그 이미지

작은 조약돌

공돌이 형과 글쟁이 동생 쌍둥이 형제의 낙서장

,

  지난 포스트 LED로 간단한 신호등 만들기에서 빨간색, 노란색, 초록색 세개의 LED를 사용해서 신호등을 만드는 법을 알아보았다. 이번 포스트에서는 RGB LED 하나로 신호등을 만드는 법을 알아보자.


  아래 사진에 보이는 LED가 RGB LED 혹은 3색 LED이다. 일반적인 LED와 달리 RGB LED는 다리 네개가 각각 아래 사진에서 처럼 빨간색 녹색 파란색 그리고 커먼 애노드(+) 로 구성된다. 커먼 애노드 RGB LED는 아래 사진에서 처럼 가장 긴 다리에 5V 전압을 넣고 Red에 Low 접압을 넣으면 빨간색 불이 들어오고 High 전압을 넣으면 빨간불이 꺼지고 G와 B에 대해서도 같은 방식으로 작동한다. 커먼 캐소드(-) RGB LED도 있는데 커먼 애노드(+) RGB LED와 달리 캐소드 다리에 0V를 넣고, R, G, B 다리에 High 전압을 넣어주면 각각 빨간, 녹색, 파란불이 들어온다.

RGB LED


  신호등을 만들기에는 빨간, 초록, 파란 불이 충분하지 않다. 노란색 불이 필요하다. 노란색 불을 켜기위해서 빛을 혼합해야 한다. 위 사진의 왼쪽 상단에 빛의 삼원색 혼합 다이어그램이 있는데 이를 참조하면, 빨간색 빛과 초록색 빛을 섞으면 노란색이 된다. 즉, 빨간색과 초록색 불을 동시에 켜면 노란색 불을 얻을 수 있는 것이다. 


  신호등을 만들기 위해서 아래와 같이 RGB LED를 연결하면 된다. 필자는 G04, G17, G18에 차례대로 R, G, B를 연결했다. 신호등을 만들기 위해서는 파란 빛이 필요하지 않으므로 B를 연결할 필요는 없다.

RGB LED

#include <stdio.h>
#include <wiringPi.h>

int main (void)
{
  int i = 0;
  printf("Traffic Light");

  if (wiringPiSetup () == -1)
    return 1 ;

  pinMode (7, OUTPUT) ;
  pinMode (0, OUTPUT) ;

  for(;;){
    for (i = 0; i < 3; i++){
      switch(i) {
      case 0:
        digitalWrite(7, 0);
        digitalWrite(0, 1);
        delay(3000);
        break;
      case 1:
        digitalWrite(0, 0);
        delay(800);
        break;
      case 2:
        digitalWrite(7, 1);
        delay(3000);
        break;
      }
    }
  }
  
  return 0 ;
}

  위 코드는 지난 포스트의 LED 신호등 코드를 조금 수정 한 것이다. 수정된 부분을 보면 19번째 줄에서 이전 프로그램에는 7번 핀에 1을 출력해서 빨간 불을 켰었는데 여기서는 0을 출력해서 빨간 불을 켠다. 위에서 설명했듯, 필자의 RGB LED가 커먼 애노드 이기 때문이다. 20번째 줄은 반대로 0번 핀에 1을 출력해서 초록색 불을 끈다. 24번째 줄은 빨간 불이 켜진 상태에서 초록색 불을 켜서 노란색 불이 켜지게 된다. 마지막으로 28번째 줄은 빨간색 불을 꺼서 초록색 불만 켜지게 만든다. 이 코드를 실행하면 아래 동영상 같이 하나의 LED로 신호등을 볼 수 있다.



블로그 이미지

작은 조약돌

공돌이 형과 글쟁이 동생 쌍둥이 형제의 낙서장

,

  지난 포스트에서 WiringPi로 GPIO 핀을 제어하여 LED를 깜빡이는 방법을 알아보았다. 이번 포스트에서는 조금 수정해서 신호등을 만드는 법을 알아보자.


  우선 아래 사진처럼 LED와 저항을 연결한다. 빨간색, 노란색, 초록색 LED +극에 저항을 연결하고 G04, G17, G18을 차례대로 연결하고, -극에는 접지를 연결한다.

라즈베리파이 신호등


라즈베리파이 신호등

#include <stdio.h>
#include <wiringPi.h>

int main (void)
{
  int i = 0;
  printf("Traffic Light");

  if (wiringPiSetup () == -1)
    return 1 ;

  pinMode (7, OUTPUT) ;
  pinMode (0, OUTPUT) ;
  pinMode (1, OUTPUT) ;
  for(;;){
    for (i = 0; i < 3; i++){
      switch(i) {
      case 0:
        digitalWrite(7, 1);
        digitalWrite(1, 0);
        delay(3000);
        break;
      case 1:
        digitalWrite(0, 1);
        digitalWrite(7, 0);
        delay(800);
        break;
      case 2:
        digitalWrite(1, 1);
        digitalWrite(0, 0);
        delay(3000);
        break;
      }
    }
  }
  
  return 0 ;
}

  위 코드는 WiringPi를 이용하여 신호등을 만든 간단한 프로그램이다. 조금씩 살펴보자. 2번째 줄은 wiringPi 헤더파일을 불러와서 WiringPi 라이브러리를 사용하기 위해서는 꼭 필요하다. 9번째 줄은 WiringPi를 시작하기 전에 셋업 하는 함수이다. 12-14줄은 7, 0, 1 핀을 출력핀으로 만들어 주는 것이다. 참고로 WiringPi 핀넘버 7, 0, 1은 순서대로 BCM 핀넘버 4, 17, 18이다. 19번째 줄은 7번핀에 1을 출력해서 빨간색 LED에 불을 켜는 것이고, 20번째 줄은 1번 핀에 0을 출력해서 초록색 LED의 불을 끄는 것이다. 21번째 줄은 3초동안 현재 상태를 유지 즉, 빨간불을 3초동안 켜고 있는 것이다. 따라서 case0 일때는 빨간불을 켜고, case1 일때는 노란불을 켜고, case2 일때는 초록불을 켜는 것으로 아래 동영상 같은 간단한 신호등이 완성 된다.



블로그 이미지

작은 조약돌

공돌이 형과 글쟁이 동생 쌍둥이 형제의 낙서장

,

  지난 포스트 LED 불 켜기에서 스위치로 LED 불을 켜고 끄는 것을 알아봤다. 이번 포스트에서는 GPIO를 이용해서 LED를 깜빡이는 방법을 알아보자.


  GPIO를 컨트롤 하는 가장 쉽고 편한 방법은 WiringPi 라이브러리를 사용하는 것이다. Git가 설치되어 있으면 WiringPi를 설치하기가 수월하다. Git이 설치되어 있지 않다면 'sudo apt-get install git-core'를 입력해서 설치한다. Git이 설치되어 있으면 'git clone git://git.drogon.net/wiringPi'를 입력해서 WiringPi를 다운 받는다. 다운 받은 디렉터리에 들어가서 './build'를 입력하면 설치 끝.

 

  제대로 설치되었는지 확인하기 위해서는 'gpio readall'을 입력한다. 아래 사진과 같은 화면이 나온다. 제일 왼쪽행(BCM)은 Broadcom의 BCM2835 칩에서 사용하는 핀번호, wPi는 WiringPi 라이브러리의 핀번호, Name은 GPIO의 이름, Mode는 핀이 입력모드인지 출력모드인지를 알려주고, V는 핀의 값으로 1은 전압이 High상태 0은 Low상태, 그리고 Physical은 라즈베리파이 핀헤더의 번호이다. 예를들어 밑줄 친 열을 보면 11번 헤더핀이 출력모드이고 값은 0인 것을 알 수 있다. 유튜브(http://www.youtube.com/watch?v=Wr49ia3oID4)에 올라온 실험에 따르면, 핀이 입력모드일 때 전압이 0-1.19v는 0, 1.34-3.3v는 1으로 인식된다고 한다.


  라즈베리파이의 GPIO 핀을 이용해서 전압을 넣으면 LED가 켜지고 전압을 없애면 LED가 꺼지는 것으로 매우 단순하다. LED 불 켜기에서와 같이 LED를 저항과 GND에 연결하고 3.3v 에 연결되어 있던 부분을 GPIO핀으로 연결해주면 세팅이 완료 된다. (예제를 그대로 사용하려면 NS-GPIO의 G17 이나 라즈베리파이의 11번째 핀에 연결해야한다.)


  아래 wiringpi.com에 올라와 있는 예제인 'blink.c'의 코드이다. 이것을 복사해서 라즈베리파이에 'blink.c'로 저장하고 'gcc -o blink blink.c -lwiringPi'를 입력해서 컴파일 하고 'sudo ./blink' 명령으로 실행하면 아래 동영상과 같이 LED가 깜빡이는 것을 확인 할 수 있다.

#include <wiringPi.h>
int main (void)
{
  wiringPiSetup () ;
  pinMode (0, OUTPUT) ;
  for (;;)
  {
    digitalWrite (0, HIGH) ;
	delay (500) ;
    digitalWrite (0,  LOW) ;
	delay (500) ;
  }
  return 0 ;
}




  다음 포스트에서는 'blink.c' 프로그램의 코드를 살펴보고, 수정해서 LED로 신호등을 만드는 것을 알아보자.


참조

WiringPi.com

블로그 이미지

작은 조약돌

공돌이 형과 글쟁이 동생 쌍둥이 형제의 낙서장

,

  LED는 전자회로에서 가장 기본적인 소자중에 하나이다. 사용하는 방법은 매우 간단하다. 아래 그림 같이 +극에 전원을 넣고 -극에 접지를 하면 불이 켜진다. +극과 -극을 알아보려면 기본적으로 긴다리가 + 짧은 다리가 - 극이다. 다리 길이로 +,- 극을 구별할 수 없을 경우에는 헤드에서 작은쪽이 + 큰 쪽이 - 극이다.

LED


  LED를 포함한 전자소자에 최대전압 이상의 전압이 걸리면 소자가 타버릴 수 있다. 예를들어 3.2V LED에 6V의 전압을 가하면 순간 많은 전류가 흐르면서 LED가 번쩍하고 타서 더이상 쓸 수 없게 된다. 이를 조절하기 위해서 적절한 저항을 달아주는 것이 필요하다. 이때 적절한 저항의 크기를 계산하는 법은 다음과 같다. 중고등학교 물리시간에 한번쯤은 들어봤을 법한 V=IR공식을 이용하여 R=V/I로 계산 하면 된다. 예를들어 동작전압이 1.8~2.4V 이고 동작전류가 20mA 그리고 소스전압이 3.3V 인 경우, V=3.3-2.4, I=20mA 를 식에 대입하면 R=45Ω이고,  V=3.3-1.8, I=20mA를 대입하면 R=75Ω이므로 45~75Ω사이의 저항을 사용하면 된다. 저항을 계산할 때 고려해야 하는 것이 와트인데 저항마다 견딜 수 있는 전력량이 다르기 때문이다. P=VI=I^2R 이라는 공식을 사용하면 되는데 위의 예를 보면 I=20mA, R=75Ω이므로 P=0.03W이다. 따라서 1/8W 이상되는 저항을 사용하면 문제 없겠다.


LED

블로그 이미지

작은 조약돌

공돌이 형과 글쟁이 동생 쌍둥이 형제의 낙서장

,

  저항은 전자회로 구성의 필수요소라 불릴만큼 특수한 경우 외에는 거의 항상 쓰이는 소자이다. 저항의 목적은 흐르는 전류의 양을 조절하는데 있는데 누구나 한번씩은 들었을 법한 유명한 공식 V=IR에 의하면 전압이 같을 때 저항이 커지면 전류가 적게 흐르고, 저항이 작아지면 전류가 많이 흐른다. 저항을 사게되면 일반적으로 아래와 같이 저항값을 적어놓고 쓰기 때문에 저항값을 따로 읽을 필요가 없을 때가 많으나 종종 저항값을 읽어야 할 때가 있다. 테스터기가 있다면 테스터기를 이용하면 쉽게 저항 값을 읽을 수 있지만 없더라도 아래의 저항값 표만 있다면 읽을 수 있다.

저항


  저항값 표로 저항을 읽는 방법은 매우 간단하다. 저항을 보면 색깔 띠가 있는데 3색 부터 6색 저항 까지 있는데 기본적으로 저항을 읽는 방법은 큰 차이가 없으므로 4색 저항을 읽는 법으로 설명을 하자. 4색 저항의 경우 처음 두 색은 수치, 세번째 색은 승수 네번째 색은 정밀도를 나타낸다. 예를 들어, 위 사진 오른쪽 저항은 갈-빨-갈-금 으로 표시되어 있는데, 이를 아래의 표를 참조해서 읽어보면 이 된다. 그리고 네번째 색이 금색이므로 ±5%의 정밀도를 갖는다. 참고로 5색저항은 앞의 세 색이 수치, 네번째 색이 승수 그리고 다섯번째 색이 정밀도를 나타내고, 6색저항은 5색저항과 같고 여섯번째가 온도 계수를 나타낸다.

저항값 표


  위에서 알아 본 바와 같이 표만 있으면 저항값을 읽는것이 어렵지 않다. 하지만 요즘 처럼 다들 스마트폰을 들고다니는 때에 스마트 폰 앱 하나면 쉽게 저항값을 읽을 수 있다. 플레이 스토어에서 저항 읽기로 검색하면 많은 앱이 나오는데 그 중 가장 상위에 있는 저항 계산기를 사용해 봤다. 사용법은 설명할 것이 없을 정도로 간단하다. 띠를 클릭하면 색이 바뀌고 그에 따른 저항 값이 바로바로 계산되어 위에 표시된다.

저항값 읽기 앱 저항값 읽기 앱

블로그 이미지

작은 조약돌

공돌이 형과 글쟁이 동생 쌍둥이 형제의 낙서장

,

  지난 포스트 라즈베리파이 GPIO 소개에서 라즈베리파이의 GPIO에 대해서 조금 알아보았다. 아래 사진에 ⑧번이 바로 GPIO인데 핀마다 점퍼 케이블을 사용하면 되지만 좀 더 쉽게 사용하는 방법을 이번 포스트에서 알아보자.


  아래 사진에 보이는 것이 엘레파츠에서 판매하고 있는 NS-GPIO-03인데, 라즈베리파이 GPIO를 편하게 쓸 수 있게 만들어주는 보조장치라고 보면 되겠다. 아래사진에서 보이듯 별것 없고 어렵지 않게 만들 수도 있지만 완성도를 생각하면 8천원 주고 사는게 낫다는 생각이다. 아래와 같이 완성되지 않은 상태로 오기 때문에 납땜을 해야한다.


  납땜을 해서 완성하면 아래와 같이 라즈베리파이와 빵판에 연결해서 GPIO 핀들을 사용할 수 있다. 엘레파츠에 보면 NS-GPIO 종류도 여러가지가 있으니 그중 맞는걸로 찾아서 구입하면 되겠다.


p.s.

  납땜 할때 케이블 소켓을 먼저 납땜 하고 다리를 납땜하려 했더니 아래 사진처럼 계속 앞으로 넘어져서 다리 납땜하기가 쉽지 않았다. 무엇으로든 앞을 받치고 납땜을 해야하는데 필자는 백원짜리 3개 십원짜리 4개로 해결했다. 



블로그 이미지

작은 조약돌

공돌이 형과 글쟁이 동생 쌍둥이 형제의 낙서장

,

  라즈베리파이가 널리 사용되는 이유 중 하나가 GPIO를 사용해서 많은 재미난 프로젝트들을 할 수 있다는 점 일 것이다. GPIO가 무엇인지 간단히 설명하자면 General Purpose Input/Output의 줄임말인데 말그대로 일반 목적으로 사용되는 입출력 핀을 이야기 한다. 즉, GPIO를 이용하면 LED를 켜고 끄고, 센서에서 값을 읽어오는 일에서 부터 LCD 패널에 출력하고 로봇의 모터를 제어하는 일 까지 다양한 일들을 할 수 있다. 라즈베리파이 모델B Rev2는 26개의 기본 GPIO 핀과 8개의 추가 GPIO 핀을 사용할  수 있다. 아래 사진에서 ⑧이 기본 GPIO핀이고 ⑨는 추가 GPIO 핀이다.


  아래 두 테이블은 라즈베리파이 모델B Rev2의 GPIO 핀번호를 나타낸 것이다.


기본 GPIO 핀

기본 GPIO 핀


추가 GPIO 핀

추가 GPIO 핀


참조

Gordons Projects



블로그 이미지

작은 조약돌

공돌이 형과 글쟁이 동생 쌍둥이 형제의 낙서장

,

  라즈베리파이에는 PC와 달리 전원 스위치나 리셋 버튼이 없다. 리셋 버튼이 꼭 필요한 것은 아니지만 없으면 조금 성가실 정도로 불편하다. 특히 라즈베리파이가 뻗어서 재시작해야 할 경우나, 지난 포스트 라즈베리파이 종료하기에서 알아본 halt 명령어로 라즈베리파이을 종료했을때 라즈베리파이를 다시 켜려면 전원 뽑았다가 다시 연결해야한다. 이번 포스트에서는 이런 성가신 일을 해결해줄 리셋 버튼 다는 법을 알아보도록 하자.


  위에서 언급했듯 라즈베리파이에는 리셋버튼이 없다. 하지만 리셋버튼을 달 수 있는 핀을 빼 놓았다. 바로 P6핀인데 아래 사진에서 빨간색으로 테두리쳐진 부분이다. 두개의 구멍이 있는데 도체로 이 두개를 연결하면 라즈베리파이가 꺼지고 연결을 끊으면 라즈베리파이가 재시작된다. 이를 이용하면 라즈베리파이에 리셋버튼을 달 수 있다.


라즈베리파이 리셋 버튼


  스위치를 라즈베리파이에 직접 달아도 상관 없지만 필자의 경우 케이스로 덮어서 사용할 것이기 때문에 아래 사진에서 보이듯 두 선을 P6에 연결 해서 케이스 밖으로 리셋 버튼을 빼냈다. 

라즈베리파이 리셋 버튼


  버튼은 Self-Lock이 되는 버튼을 사용해도 되고, Self-Lock이 되지 않는 버튼을 사용해도 된다. Self-Lock이 되는 버튼의 경우 PC의 전원 버튼 처럼 한번 누르면 켜지고 또 한번 누르면 꺼지는 식으로 사용할 수 있고, Self-Lock이 안되는 버튼은 리셋 버튼처럼 사용할 수 있다. 필자는 TS-1109 라는 Self-Lock이 되지 않는 자그마한 버튼을 사용했는데 이는 전원버튼이 더 유용하겠지만 일반적으로 Self-Lock이 되는 버튼이 크기가 커서 라즈베리파이에 어울리지 않다고 판단했기 때문이다. 리셋 버튼은 아무래도 전원 옆에 있는게 맞는 것 같아서 아래와 같이 전원부 근처로 자리를 잡았다. 생각보다 잘어울리고 유용하다. 참고로 필자의 케이스는 엘레파츠에서 구입한 라즈베리파이 전용케이스 H타입이다.

라즈베리파이 리셋 버튼



블로그 이미지

작은 조약돌

공돌이 형과 글쟁이 동생 쌍둥이 형제의 낙서장

,