1. 카메라 동작확인
  -. PiCAM 구입 후 파란색이 USB, 은색이 hdmi쪽을 향하게 모듈을 삽입한다.
  -. sudo raspi-config 명령어에서 5번 메뉴 camera를 enable시킨다.
     (안되면 sudo apt-get update, sudo ap-get upgrade 선행)
  -. 메뉴를 빠져나오면서 재부팅을 한다.
  -. raspistill -o image.jpg 라고 입력하여 이미지가 잘 생성되는지 확인한다.

2. 먼저 필요한 라이브러리를 설치
   $ sudo apt-get install libjpeg8-dev imagemagick libv4l-dev

3. build시 필요한 파일을 include해 두기
   $ sudo ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h

4. mjpg-streamer 소스를 받는다
  -. Git에서 받아도 되고 검색해서 일반 사이트에서 받아도 된다.

5. 빌드
   $ cd mjpg-streamer-code-182/mjpg-sreamer
   $ make mjpg_streamer input_file.so output_http.so (Makefile에서 필요한거 주석 풀어준다)
  (위에가 귀찮으면 make clean all)

6. 주요 library root로 복사
   $ sudo cp mjpg_streamer /usr/local/bin
   $ sudo cp outpu_http.so input_file.so /usr/local/lib/
   $ sudo cp -R www /usr/local/www

7. stream이 될 jpg파일이 저장될 폴더 생성
   $ mkdir /tmp/stream

8. 실행
   $ raspistill --noreview -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 & (임시 저장 폴더에 이미지를 반복하여 저장)
   $ LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg" -o "output_http.so -w /usr/local/www"

9. 포트 변경
기본 포트는 8080으로 mjpeg stream 서버가 열리는데 이를 바꿔 주기 위해서는 -p 옵션을 사용한다.
   $ LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg" -o "output_http.so -p 8888 -w /usr/local/www"

*동작원리는 mjpeg용 서버를 열어서 실제 웹페이지에서는 해당 서버의 스트리밍을 받아서 사용.(포트가 겹치지 않도록 주의)


참고 사이트 :

http://jskorl.blog.me/220379225762


1. 툴체인 받기
   $ git clone https://github.com/raspberrypi/tools raspi_toolchain

2. 툴체인 환경 변수에 추가
   $ cd raspi_toolchain
   $ cp -av  arm-bcm2708/ /opt/toolchains/
   $ vi ~/.bashrc
   
* 추가 내용
export PATH="$PATH:/opt/toolchains/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian:/opt/toolchains/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin"
추가 후 저장 종료

   $ source ~/.bashrc
   $ echo $PATH   <-- 잘 적용 됬는지 확인

3. 소스 받기
   $ git clone --depth=1 https://github.com/raspberrypi/linux raspi_kernel

4. 소스 빌드
   $ cd raspi_kernel

   $ KERNEL=kernel7
   $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
   $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs(-j n옵션으로 빠르게 빌드 가능)


Target board에서 Kernel build!!

1. Source 받기
   $ git clone --depth=1 https://github.com/raspberrypi/linux

2. bc라는 패키지 설치(근데 이게 먼지 찾아봐도 모르겠음..)
   $ sudo apt-get install bc

3. Build configuration 설정
 -. 라즈베리파이 1은...
   $ cd linux
   $ KERNEL=kernel
   $ make bcmrpi_defconfig

-. 라즈베리파이 2는...
   $ cd linux
   $ KERNEL=kernel7
   $ make bcm2709_defconfig

4. build 하기
   $ make zImage modules dtbs

5. 모듈도 build 하기
   $ sudo make modules_install

6. 빌드한거 적용하기
   $ sudo cp arch/arm/boot/dts/*.dtb /boot/
   $ sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
   $ sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
   $ sudo scripts/mkknlimg arch/arm/boot/zImage /boot/$KERNEL.img

* 라즈베리파이 2는 kernel7.img 로 복사한다.


라즈베리 파이의 부팅 순서는 다음과 같다.


1. 보드에 전원이 들어오고 GPU가 활성화된다.

2. SoC 내 ROM에 있는 첫번째 부트로더(Firmware)를 읽어들인다.

3. 첫번째 부트로더가 SD카드에 있는 두번째 부트로더(bootcode.bin)을 호출한다.

4. 두번째 부트로더가 SD카드에 있는 config.txt를 읽고 실행한다.

4. 두번째 부트로더가 세번째 부트로더(start.elf)를 호출 및 실행하여, ARM Core를 활성화한다.

6. ARM Core가 활성화되면 네번째 부트로더(kernel.img)를 호출, 실행한다.

리눅스를 이용해서 라즈베리파이에 웹서버 올리는 소스가 있을까요?

라즈베리파이에 LED연결해서 불들어오게 하려고 하는데...



답변 드립니다.



리눅스를 이용해서 라즈베리파이에 웹서버를 올리는 소스는 따로 없습니다.
직접 만든 웹서버 소스(또는 오픈 소스)를 가지고 있으시다면, ssh 통신이나 아니면 직접 시리얼을 통해 라즈베리 파이에 접근하여 서버를 구성하셔야 합니다.

php나 jsp를 사용하실 거라면 tomcat과 같은 서버를 설치하여 올리시면 되고
nodejs와 같은 경우엔 서버이기 때문에 그대로 사용 하시면 됩니다.

개인적으로 간단한 LED 불들어 오게 하는 정도로 구상 중이시라면 nodejs를 추천드립니다.
nodejs에서 제공하는 수많은 library중에 라즈베리파이의 gpio를 컨트롤(LED켜기) 하는 기능도 포함되어있기 때문에 쉽게 작업하실 수 있으실 거에요(검색해보시면 자료도 많고요)

또한 서버 구성을 하여 웹으로 LED제어 하도록 만드신 후 해야 할 일은 라즈베리파이가 재부팅 되었을 경우에 다시 웹서버가 실행 되어야 겠죠.
이를 위해선 리눅스의 기본 개념을 이해하셔야 하며, 간단히 방법만 알려 드리면 init.rd에 부팅 시 호출하고자 하는 시스템을 추가하시면 됩니다.


지난 시간에 node server에서 rpi-temp-module를 설치하여 사용하는 방법에 대해 알아 보았다.


이제 앞으로 좀 더 많은 살을 붙여 나가면서 더 많은 package를 설치하게 될텐데

이를 좀 더 효율적으로 관리하기 위해 npm에서 제공하는 기능을 통해 package를 관리하도록 해보자.


pi@raspberrypi ~/server/was $ npm init
 This utility will walk you through creating a package.json file.
 It only covers the most common items, and tries to guess sane defaults.

 See `npm help json` for definitive documentation on these fields
 and exactly what they do.

 Use `npm install <pkg> --save` afterwards to install a package and
 save it as a dependency in the package.json file.

 Press ^C at any time to quit.
 name: (was) rpi_was
 version: (1.0.0) 1.0.0
 description: fish box management system
 entry point: (index.js) index.js
 test command:
 git repository:
 keywords:
 author: szinlee
 license: (ISC)
 About to write to /home/pi/server/was/package.json:

 {
    "name": "rpi_was",
    "version": "1.0.0",
    "description": "fish box management system",
    "main": "index.js",
    "dependencies": {
      "rpi-temp-module": "^1.0.0"
    },
    "devDependencies": {},
    "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1"
    },
    "author": "szinlee",
    "license": "ISC"
  }


 Is this ok? (yes) yes


설정을 완료 하면 package.json 파일이 생성된 것을 확인할 수 있다.

해당 파일을 열어 보면 우리가 지난 시간에 추가했던 모듈이 dependencies안에 위치한 것을 확인할 수 있다.

설치 버전은 1.0.0이다.


앞으로는 이 파일에 모듈을 추가해 가면서 작업을 진행할 것이다.

저번 시간에 온도센서를 라즈베리파이에 연결하는 방법에 대해 알아 보았다.


오늘은 앞서 말했던 것과 같이 모듈을 하나 테스트 했으니 서버에 붙일 예정이다.


8일차에 진행했던 node server에 진행해 보도록 한다.


login as : pi
pi@192.168.0.10's password:
pi@raspberrypi ~ $ cd server/was


node server로 이동 하였다면 이제 index파일에 프로그래밍을 할 것이다.


사실 /sys/bus/w1/devices 밑에 잡힌 온도 센서 디바이스에서 w1_slave란 파일을 읽어서 필요한 부분만 짤라서 사용해도 어렵지 않게 코딩을 할 수 있다.


하지만 nodejs는 package를 통해 대부분의 필요한 library를 제공한다.

스스로 직접 코딩해 보는 것도 좋지만 깔끔한 프로그래밍을 위해서는 library를 잘 활용하는 것도 좋다.


nodejs에 package를 간편하게 설치 하기 위해서는 npm이라는 툴이 필요하다.


혹시 nodejs version이 v0.10.x 미만인 경우 v0.10 이상으로 설치하도록 하자.

버전 확인은 nodejs -v로 할 수 있고, 변경 방법은 8일차를 참고하도록 하자.


npm 툴은 아래와 같이 설치한다.


pi@raspberrypi ~/server/was $ sudo apt-get install npm
pi@raspberrypi ~/server/was $ npm -v
1.1.4


npm이 잘 설치 되었는지 확인 후 npm에서 제공하는 raspberry pi 온도 측정 package를 받아 보자.


pi@raspberrypi ~/server/was $ npm install rpi-temp-module


node_modules라는 폴더안에 설치한 rpi-temp-module이라는 package가 생성된 것을 볼 수 있다.


사용해 보도록 하자. 사용전 미리 /sys/bus/w1/devices 밑에 생긴 device 이름을 알아두자

필자는 28-0215529be4ff이다. (이 장치명은 다르므로 꼭 확인하고 맞게 작성해야 한다.)


pi@raspberrypi ~/server/was $ vi index.js



8일차에 작성했던 console.log('Hello World'); 는 이제 지워주고 아래와 같이 입력한다.


var rpiTemp = require('rpi-temp-module');

setInterval(function()
{
    rpiTemp.getTemperature('28-0215529be4ff', function(value)
    {
        console.log("Temperature: ", value);
    });

}, 1000);


저장하고 나온다.

이 코드는 rpi-temp-module를 사용하여 1초에 한번씩 온도를 체크해서 console에 찍어 주도록 하는 프로그램이다.

이제 잘 동작하는지 실행해 보자.



pi@raspberrypi ~/server/was $ node index.js


빠른 변화를 보기 위해서는 온도센서를 물에 담그거나 손으로 꽉 쥐면 된다.


Temperature: 21.5 
Temperature: 22.5 
Temperature: 23 
Temperature: 23.5 
Temperature: 24.5 
Temperature: 25 


잘 변경됨을 확인할 수 있다.

종료 방법은 Ctrl + C 이다.


이로서 nodejs로 간단한 온도 체크 프로그램을 만들어 보았다.


첫번째 알아볼 모듈은 어항의 물 온도를 측정하기 위한 방수형 온도센서이다.


필자가 구매한 센서는 DS18B20이다.


이 모듈을 사용하기 위해서는 DS18B20센서, 10k 저항, 빵판(브레드보드), 라즈베리파이가 필요하다.



구성은 다음과 같이 하면 된다.



(검정 빵판을 준비 했지만 사진빨을 잘 받지 못하여 노란 빵판으로 교체 하였다.)

빨간선은 DC선이며 3.3v에 연결해 주고,

노란선은 센서로부터 데이터를 받는 선이며 GPIO4번에 연결해 주면된다.

검정선은 ground이기 때문에 아무 GND에 연결해 줘도 상관없다.


주의할 점은 노란선과 빨간선 사이를 10k저항으로 연결해 줘야 한다.

보통 3.3v에는 4.7k~10k 옴의 저항을 사용하는데 집에 10k밖에 없었다.


회로 구성이 완료 되었으면 이제 라즈베리파이에 전원을 연결하도록 한다.

부팅이 완료 되고 /sys/bus/w1/devices/ 경로를 확인해 보면 28-xxxxxxxx로 시작하는 device가 하나 잡힌 것이 보인다.(원래는 없다. 믿을 수 없다면 센서를 뽑고 확인해 보도록 한다.)


이 방수형 온도센서는 device처럼 인식되기 때문에 연결만 하면 usb처럼 자동으로 인식이 된다.

그리고 이 센서는 디지털 신호로 데이터를 보내기 때문에 라즈베리파이에서 바로 사용가능하다.

아날로그로 신호를 보내는 온도센서를 구매했다면 별도의 ADC(analog to digital conversion) 장치가 필요하다.

라즈베리파이엔 analog신호를 받아서 digital로 변환해 줄 칩이 없기 때문이다.


다시 본론으로 들어가서 만약 /sys/bus/w1/devices 밑에 28-xxxxxx로 시작하는 device가 인식되지 않았다면

/boot/config.txt 파일을 열어 dtoverlay=w1-gpio 정보를 추가해 주자.


pi@raspberrypi ~ $ sudo vi /boot/config.txt


dtoverlay 항목을 찾아 보고 없으면 맨 아래쪽에 다음 정보를 추가.

dtoverlay=w1-gpio


재부팅을 한다.

pi@raspberrypi ~ $ sudo reboot


온도가 잘 나타나는지 확인해 보자. 

확인 방법은 /sys/bus/w1/devices 밑에 28-xxxxxxx 폴더로 들어가서 w1_slave 정보를 읽어 보면된다. 

(필자는 28-0215529be4ff라는 이름의 device가 잡혔다.)

pi@raspberrypi ~ $ cat /sys/bus/w1/devices/28-0215529be4ff/w1_slave
 50 01 80 80 1f ff 80 80 d2 : crc=d2 YES
 50 01 80 80 1f ff 80 80 d2 t=21000


아래 정보 중 t=21000이란 정보가 온도이다. 

실제로 사용하기 위해서는 1000으로 나눠서 사용하면 되겠다.


이제 온도 센서를 물에 담가서 온도 변화를 측정해 보면 온도가 변하는 것을 볼 수 있을 것이다.

근데 필자는 센서가 0.5도 단위로 변한다. (21000 => 21500)

원래 이런건가(?) 모르겠지만 변화는 잘 나타나니 우선은 넘어 가도록 하자.


다음 시간에는 nodejs에서 이 온도 센서를 가지고 실제 물의 온도를 측정 해 보도록 하겠다.



이제 어느 정도 세팅이 끝난 것 같으니 모듈을 하나하나 테스트 하며 라즈베리 파이에 붙여 보자.


그 전에! 

모듈을 테스트 하며 하나하나 구현 할지, 

아니면 서버를 먼저 구성 후 하나하나 살을 붙여 나갈지 고민에 고민을 거듭 하다가 서버를 먼저 구성해 놓고 모듈이 하나하나 완성되면 붙여 나가면서 진행하기로 결정했다.


1일차에 잠시 언급했던 대로 서버는 nodejs를 사용하도록 한다!

(머.. 중간에 한계점이 있다면 파이썬이나 C/C++로 변경 될 수 있으나, 그렇지 않길 바란다.)


라즈베리파이에 Node.js를 설치해 보자. 간단하다.


 login as : pi
 pi@192.168.0.10's password:
 pi@raspberrypi ~ $ sudo apt-get update
 pi@raspberrypi ~ $ sudo apt-get upgrade
 pi@raspberrypi ~ $ sudo apt-get install nodejs
 pi@raspberrypi ~ $ sudo apt-get install nodejs-legacy
 pi@raspberrypi ~ $ node -v
 v0.6.19


설치가 끝났다.아마 kernel 버전이 높으면 nodejs만 설치해도 될 것이다.(기억이 가물가물...)

필자의 kernel 버전은 3.18.5-v7+ 이며, uname -a 명령어를 통해 확인할 수 있다.


필자가 설치한 node 버전은 v0.6.19 !! (원하는 버전이 있으면 공식 홈페이지에서 직접 받아서 설치하여도 무방!)



---------------- 2015.11.27일 추가 내용 ----------------


10일차 작업 중에 nodejs package를 설치하는 과정에서 nodejs 버전이 너무 낮음에 일부 package를 설치할 수 없었다. 때문에 nodejs버전을 올리는 작업을 진행했다.

10일차에 다시 지우고 새로 설치하는 부분을 적으려 했지만 애초에 높은 버전으로 설치하는게 좋을 것 같아 이쪽 글을 수정하기로 하였다. (이미 설치했던 사람은 sudo apt-get purge nodejs npm후 진행하도록 하자)


아래와 같이 설치 한다.


 pi@raspberrypi ~ $ sudo apt-get update
 pi@raspberrypi ~ $ sudo apt-get upgrade
 pi@raspberrypi ~ $ curl -sL https://deb.nodesource.com/setup | sudo bash -
 pi@raspberrypi ~ $ sudo apt-get install nodejs
 pi@raspberrypi ~ $ node -v
 v0.10.40


0.6버전에서 0.10버전으로 올라갔다!!


-------------------------------------------------------



먼가 허무하지만 이제부터가 진짜다. 간단한 프로그래밍을 해보자.


pi@raspberrypi ~ $ mkdir -p server/was
pi@raspberrypi ~ $ cd server/was
pi@raspberrypi ~/server/was $ vi index.js


프로그래밍을 할 폴더를 만들고 index.js파일을 하나 만들어 아래와 같이 코딩한다.


console.log('Hello World!');


저장하고 나와서 실행해 보자.(vim, nano 등 본인이 편한 편집기를 사용하자, vi 사용법에 대한 자세한 내용은 생략한다.)


pi@raspberrypi ~ $ node index.js
 Hello World!


시작이 반이라고 했던가, Hello world를 찍었으니 반은 개발에 성공한 것이다!!



기본적이 세팅이 끝났다면 본격적으로 라즈베리파이를 가지고 이래 저래 요리해야 할텐데 매번 모니터를 연결하고 키보드/마우스를 연결하며 개발하기는 다소 불편할 수도 있다.


불편하지 않다면 그렇게 해도 되지만, 그렇지 않은 필자와 같은 사람을 위해 집에 있는 노트북이나 데스크톱으로 원격 접속하여 사용할 수 있는 환경을 만들어 보자.


시작 전 꼭 알아야 할 것은 6일차에서 진행한 wifi 연결을 하거나, 직접 LAN선을 꽂아 원격 접속하려고 하는 PC와 동일한 로컬 환경에 있어야 한다는 것이다. (같은 공유기에 접속 되어 있으면 된다.)


이제 라즈베리 파이에 ssh를 사용할 수 있도록 설정해 보자


5일차에서 보았던 raspi-config를 통해 간단히 설정할 수 있다.

번거롭지만 라즈베리파이와 모니터를 연결하여 아래와 같이 진행 해 보자



이제 라즈베리 파이에서 ssh server를 사용할 수 있도록 설정이 완료 되었다.

잠시 키보드와 모니터를 빼기 전에 아래와 같이 접속할 아이피를 알아두자!



필자와 같이 wifi로 접속한 경우는 "ifconfig wlan0" 명령어를 통해 조회하고,

LAN를 연결한 사람들은 "ifconfig eth0"로 조회할 수 있다.


앞으로는 별 문제가 없는 한 라즈베리파이에 키보드/마우스/모니터를 연결 할 필요가 없어졌다!


이제 PC로 와서 원격 접속을 해보자.

원격 접속을 위해 사용하는 대표적인 프로그램으로 putty가 있다. 이걸 사용해 보도록 한다.


putty는 http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 에서 받을 수 있다.

그것도 귀찮은 사람은 아래 링크를 클릭하여 받도록 하자.


Window 64bit용 putty 설치 프로그램 받기


설치 후 실행하여 아래와 같이 접속해 보자.



이제 라즈베리파이에 전원만 연결하고 간편하게 프로그램을 즐기면 된다!


+ Recent posts