오드로이드 C2에서 그로브파이 구동하기 리눅스

오드로이드(Odroid) C2를 이용해 센서 프로그래밍을 해보려다가, 기왕이면 간편하게 여러 센서들을 써보고 싶어서 그로브파이(GrovePi)를 구했습니다. 그로브파이는 4핀 기반 그로브 시스템을 이용하기 위한 인터페이스 보드로, Atmega328p가 내장된 라즈베리파이용 실드입니다. 비슷한 툴킷으로는 DFRobot의 그라비티(Gravity) 시리즈가 있죠. (보다 자세한 설명은 여기를 참고하세요.) 제가 구한 것은 그로브파이 스타터킷(GrovePi Starter Kit) 으로 그로브파이 보드와 몇가지 센서들을 갖추고 있습니다. 여기서는 이 키트에 포함된 그로브파이 보드로 파이썬을 이용해 LED를 점등하는 메뉴얼의 첫번째 예제를 실행하는 것 까지를 해보려고 합니다. (현재 LED/Button/Buzzer/LED 동작은 성공했으나, Ultrasonic, DHT 센서에서 값을 읽어들이는 것은 아직 방법을 찾고 있습니다. I2C 클럭 속도를 변경해야 할 것으로 추정중)

참고로 저 또한 초보이고, 그로브파이는 어쨌거나 라즈베피라이용이기 때문에 아래 내용을 따라해서 생기는 문제는 개인의 책임입니다. 그리고 아래 내용들은 낡은 내용일 수 있기 때문에 복붙하시기보다 눈으로 대략 참고만 하시고 실제 내용은 오드로이드의 공식 위키 내용 등을 보면서 진행하시기 바랍니다.

HW 설치

그로브파이는 라즈베리파이를 위해 나온 제품입니다. 다행히 오드로이드 C2는 라즈베리파이 2 이후의 제품과 비슷한 레이아웃에 40핀 GPIO 포트도 가지고 있습니다. 완전히 호환되는 것은 아니어서 37, 38, 40핀은 다릅니다. 하지만 그루브파이는 앞의 26핀만을 사용합니다. 그래서 그냥 메뉴얼대로 연결하면 되고 연결 된 모양도 거의 비슷합니다. 다만 제가 전문가는 아니어서 모르는 다른 전기적 차이들이 있을 수도 있습니다.(알려주세요)

SW 설치

오드로이드는 공식적으로 우분투와 안드로이드를 지원하며 설치용 이미지들을 제공합니다. 그로브파이 스타터킷 메뉴얼은 기본적으로 데비안 기반인 라즈비안 운영체제를 대상으로 하고 있기 때문에 여기서는 우분투를 기반으로 진행하도록 하겠습니다.

우분투 설치

가장 속편한 것은 오드로이드 공식 쇼핑몰에서 리눅스 이미지가 포함된 eMMC를 구매하는 것입니다. 하지만 막상 해보니 사용자 실수로 리눅스가 먹통이 되는 경우도 있고 이때 x86 PC에서와는 달리 바이오스를 통해 USB 부팅을 해서 복구한다던지 할 수가 없으므로 결국 매번 새로 살 것이 아니라면(...) 초기화 하는 작업은 어차피 해보게 됩니다.

저는 여기서 기존에 쓰던 8GB eMMC를 사용했습니다. 원래 안드로이드가 설치되어 있었으나 덮어쓰기 위해 C2용 2016년 5월 25일자 2.0 우분투 이미지를 다운로드했고, eMMC to MicroSD 어댑터를 통해 PC 연결을 시도했습니다. 그런데 eMMC to MicroSD 어댑터는 USB 리더기를 좀 가립니다. 호환되는 어댑터 목록은 포럼의 관련 글타래에 나와 있는데, 그냥 속편히 언급된 트랜센드 제품을 구하는 것이 좋습니다. 저는 처음에 가지고 있던 세마(SEMA) SFD321F로 시도했는데, dd로 쓰던 도중 "No Caching mode page found" 오류가 발생하더라구요. 또 글타래에 "A simple no-name microSD-USB adapter"라고 소개된 제품과 외형상 동일한 제품을 다이소에서 2천원에 파는데, 마찬가지 오류가 있었습니다. 반면에 트랜센드(Trancend) 마이크로SD -> SD 어댑터와 세마 리더기를 사용하면 문제없이 사용은 가능했고, 체크섬 검사 결과 쓰기도 잘 되었으나, 하드커널 측에서는 어댑터를 권하지 않습니다. 트랜센드 제품이 현재 다나와 기준 배송료 포함 만원도 안 되는 가격으로 팔고 있으므로 그냥 하나 사서 쓰는게 속편할겁니다.

(참고로 eMMC를 사용하지 않고 MicroSD를 써 보려고도 하였으나 위의 세마 리더기에서는 쓰는 도중 오류가 발생하며 연결이 끊기는 현상이 리눅스(dd)와 윈도우(Win32DiskImager)에서 모두 있었습니다. 사용을 위해 새로 구매한 샌디스크(Sandisk) UHS-I 울트라 64GB 모델을 사용했는데 비교 대상이 없어 리더기 탓인지 카드 탓인지는 불분명합니다.)

한편 저처럼 기존 이미지 위에 추가로 덮어쓰려는 사용자는 안내된 것 외에 청소(wipe) 작업을 해 주는 것이 성능에 좋습니다. 제 경우 그냥 덮어씌우다 보니 24메가짜리 이맥스 패키지 푸는데 시스템이 다운되는 극적인 쓰기 성능 하락을 맛보았습니다; 최종적으로 제가 실행한 것은 다음과 같습니다.

# umount /dev/[내 장치]*
umount: /dev/sde: not mounted
# dd if=/dev/zero of=/dev/[내 장치] bs=4M
dd: '/dev/sde'에 쓰는 도중 오류 발생: 장치에 남은 공간이 없음
1865+0 레코드 들어옴
1864+0 레코드 나감
7818182656 bytes (7.8 GB, 7.3 GiB) copied, 7540.33 s, 1.0 MB/s
# dd if=ubuntu64-16.04lts-mate-odroid-c2-20160525.img of=/dev/[내 장치] bs=1M conv=fsync
5619+0 레코드 들어옴
5619+0 레코드 나감
5891948544 bytes (5.9 GB, 5.5 GiB) copied, 5736.83 s, 1.0 MB/s
# sync
# echo 1 > /proc/sys/vm/drop_caches
# umount /dev/[내 장치]*
umount: /dev/sde: not mounted
umount: /dev/sde1: not mounted
umount: /dev/sde2: not mounted

당연한 얘기지만 dd는 위험한 명령이므로, 두번 세번 확인해야 합니다. 위에서는 실수로 복붙해서 실행되는 일이 없도록 일부러 명령의 디바이스 주소를 '내 장치'로 바꾸었습니다.

이렇게 구운 eMMC(혹은 MicroSD)를 오드로이드에 연결하고 부팅하면 Mate 기반의 우분투 데스크탑이 뜹니다. 다만 눈에 띄게 느린데, top 명령으로 보면 xorg의 점유율이 꽤 높은 것으로 보아 기본 상태에서는 하드웨어 GPU 가속이 잘 안되는 것 같습니다. 일단 업그레이드를 합시다. 공식 메뉴얼대로 업그레이드를 하고 만약을 대비해 블랙스크린 관련 안내에 나온 mali, kodi 등도 설치 마킹을 해주도록 합시다. 전 메뉴얼 보지 않고 평소 습관대로 그냥 autoremove를 했다가 결국 이미지를 다시 구워야 했습니다 ;ㅁ;

이후 깃헙에서 필요한 라이브러리들을 충당하기 위해 git을 추가로 설치해야 합니다. 제 경우 이맥스 유저이므로 emacs 및 시스템 모니터링을 위한 htop까지 설치했습니다.

# apt-get update && apt-get upgrade && apt-get dist-upgrade 
...
# apt install xserver-xorg-video-mali mali-x11 kodi aml-libs
...
# apt-get install git emacs htop
..

그로브파이 실행 환경 준비

그로브파이는 다양한 언어들을 위한 라이브러리를 제공하지만, 동봉 메뉴얼의 앞부분은 파이썬 코드입니다. 여기서 라즈베리파이에 라즈비안이라면 그냥 깃헙(Github)에서 GrovePi 프로젝트를 가져다 스크립트 한번 실행하면 필요 라이브러리들까지 한번에 설치할 수 있지만, 우리는 오드로이드에 우분투를 쓰기 때문에 그렇게 하면 안 됩니다.

일단 파이썬용 RPi.GPIO 모듈이 필요한데, 이 모듈은 패키지를 구해 설치하더라도 동작 환경 검사 코드가 있어서 실행되지 않습니다. 또 내부적 차이들도 있는 것 같은데 다행히 어떤 분이 맞지 않는 부분들을 고쳐 오드로이드 C1에서도 동작하는 버전을 만드셨더군요. (관련 글타래) 다만 C2에서는 C1용 동작 환경 검사 코드가 동작하지 않으므로 수정이 필요합니다. (물론 수정한 내용을 PR하는 것이 인터넷의 법도이겠으나 /proc/cpuinfo만 봐서는 C2만 특정할 마땅한 방법을 모르겠어서 일단 이렇게 땜빵합니다; )

$ git clone https://github.com/swkim01/RPi.GPIO-OdroidC1.git
...
$ cd RPi.GPIO-OdroidC1
...
$ emacs source/cpuinfo.c           # 43줄 앞뒤로 감싼 if 블럭을 없애버립니다. 안 그러면 나중에 
...                                # "This module can only be run on a Raspberry Pi!" 메시지를 보게 됩니다.
$ sudo apt-get install python-dev  # 설치를 위해서는 Python.h가 필요하기 때문에...
...
$ sudo python setup.py install
...
$ python                           # 테스트를 해봅시다.
Python 2.7.12 ...
>>> import RPi.GPIO
>>>                       # 오류가 없으면 성공!

다음으로 smbus 라이브러리도 필요합니다. 다행히 소스 저장소에 있어서 그냥 설치하면 되는데, 참고로 파이썬 3용 패키지가 필요하다면 python3-smbus 패키지는 라즈비안에만 있으므로 HOW TO INSTALL SMBUS I2C MODULE FOR PYTHON 3 문서를 따라서 빌드해주면 됩니다.

$ sudo apt-get install python-smbus

이렇게 파이썬 모듈들은 준비됐고, 이제 하드웨어를 구동시킬 차례입니다. 우선 i2c 모듈을 올립니다. 자세한 내용은 ODroid C2 running Ubuntu I2C Setup 문서를 참고하세요.

$ sudo apt-get install i2c-tools
...
$ sudo modprobe aml_i2c
$ i2cdetect -y 1 # 잘 잡혔나 테스트
...
$ python         # 역시 또 테스트
...
import smbus
smbus.SMBus(1)   # i2c 디바이스가 없을 경우 IOError: [Errno 19] No such device 오류가 발생.

여기까지 되면 예제를 실행시킬 수 있지만 오류만 없지 실제 점등이 되지는 않습니다. 마지막으로 SPI 모듈을 올려야 합니다. 자세한 내용은 오드로이드 위키의 How to use SPI on ODROID-C2 내용을 참고하세요.

$ sudo modprobe spi_bitbang
$ sudo modprobe spi_gpio
$ sudo modprobe spidev

예제 실행

대망의 구동 시간입니다. 깃헙의 GrovePi 프로젝트를 복제합니다.

$ git clone https://github.com/DexterInd/GrovePi.git
...
$ cd GrovePi

이제 예제를 실행하면 빨간 불이 주기적으로 점멸하는 것을 볼 수 있습니다.

$ sudo python Software/Python/grove_led_blink.py

남은 작업들

  • 매번 부팅되는 때마다 모듈을 다시 올리지 않도록 /etc/modules 에 위에서 올린 모듈들을 추가해주고, /etc/modprobe.d/blacklist-spi.conf 파일은 제거합니다.
  • 매번 sudo로 실행할 필요가 없게끔 권한 추가도 필요합니다.
  • 펌웨어 업그레이드를 위해서는 하드커널에서 제공하는 WiringPi를 이용한 커스텀 avrdude 패키지가 필요할 것 같은데 확실치는 않아요. Scripts/install.sh에서 설치하는 커스텀 avrdude 참고.
  • 파이썬 grovepi 모듈을 전역 설치하는 작업이 필요합니다. Script/grove.pth 파일을 열어 경로를 지금 상태에 맞게 고쳐 준 다음 다음과 같이 복사합니다.
$ sudo cp Script/grove.pth /usr/lib/python2.7/dist-packages/grove.pth

이것들에 대해서는 다음에 시간 남으면 보충해 보겠습니다.

그밖의 참고 문서

  • 그로브파이 각 포트의 맵핑 http://www.dexterindustries.com/GrovePi/engineering/port-description/
  • 오드로이드를 위한 WiringPi https://github.com/hardkernel/wiringPi
Tag :
, , ,

Leave Comments