라즈베리파이 아두이노 제어 - lajeubelipai adu-ino jeeo

라즈베리파이(Raspberry Pi)의 장점은 라즈베리파이 자체가 리눅스 기반의 소형 컴퓨터라는 점입니다. 즉, 우리가 데스크탑에서 할 수 있는 작업들을 라즈베리파이에서도 시도해 볼 수 있습니다. 또한 무선랜과 블루투스가 사용 가능하고 웹캠과 같은 다양한 USB 기기를 사용할 수 있습니다. 또한 GPIO를 통해 여러 장치들을 제어할 수 도 있습니다. 

반면, 아두이노(Arduino)는 하드웨어적으로 구현된 PWM을 통해서 정밀하게 모터와 같은 기기들을 제어할 수 있습니다. 하지만 아두이노는 하드웨어 제어에 특화되어있기 때문에 라즈베리파이가 가지는 소형 컴퓨터로써의 장점은 가질 수 없습니다. 

그래서 저는 라즈베리파이와 아두이노를 연결해서 사용해 볼려고 합니다. 즉, 라즈베리파이는 소프트웨어를 담당하고 아두이노는 하드웨어 제어를 담당해서 서로의 역할을 나누는 것이죠. 

라즈베리파이와 아두이노를 연동하는 방법은 여러가지가 있습니다. 제가 제시하는 방법은 Firmata를 사용하는 방법입니다. (Firmata는 마이크로컨트롤러(Microcontroller)와 일반 컴퓨터 소프트웨어 사이의 통신을 위한 프로토콜입니다.) 이제 그 방법을 알아보겠습니다. 

아두이노 Firmata 업로드

Firmata를 사용해서 라즈베리파이와 아두이노가 통신하기 위해선, 먼저 아두이노에 Firmata를 업로드 해줘야 합니다. 아두이노에 Firmata를 업로드 하면 더이상 아두이노에 프로그래밍 할 필요가 없습니다. 왜냐하면 라즈베리파이에서 Firmata 프로토콜로 아두이노를 제어할것이기 때문입니다. 아래처럼 StandardFirmata를 열어주세요. 

라즈베리파이 아두이노 제어 - lajeubelipai adu-ino jeeo

그리고 아래와 같이 코드창이 나타나면 아두이노에 업로드 해주세요. 

라즈베리파이 아두이노 제어 - lajeubelipai adu-ino jeeo

이제 아두이노는 준비가 완료되었습니다. 

라즈베리파이 pyfirmata 설치

라즈베리파이에서 Firmata를 사용하기 위해서, 저는 pyfirmata를 사용하도록 하겠습니다. 설치는 pip를 통해서 할 수 있습니다.

pip install pyfirmata

이제 라즈베리파이와 아두이노를 USB 케이블로 연결해 주세요. 

라즈베리파이 아두이노 제어 - lajeubelipai adu-ino jeeo

라즈베리파이 + 아두이노 연동 테스트

라즈베리파이에서 파이썬(Python) 코드를 통해서 아두이노의 led를 제어해 보겠습니다. 아두이노 우노(Uno)의 디버그용 led는 13번 핀넘버로 제어할 수 있습니다. 아래 코드를 파일로 저장 후 실행을 하면, 아두이노의 led가 깜박 거리는것을 확인 할 수 있습니다. 

import time
import pyfirmata

# 아두이노에 연결합니다. 
board = pyfirmata.Arduino('/dev/ttyACM0')

# 디지털(digital) 핀(pin) 13번을 출력(output) 모드로 가져옵니다. 
led_builtin = board.get_pin('d:13:o')

while True:
    # 핀에 출력값으로 1을 주면 led 불이 켜집니다. 
    led_builtin.write(1)
    time.sleep(1)
    # 핀에 출력값으로 0을 주면 led 불이 꺼집니다.     
    led_builtin.write(0)
    time.sleep(1)

위의 코드에서 get_pin() 함수에 'd:13:o' 라거 인자를 넣어주었습니다. d는 핀 타입(Pin Type)이 디지털(Digital) 이라는것을 의미하고, 숫자는 핀넘버, 그리고 o 는 핀 모드(Pin Mode)를 나타냅니다. 핀 타입은 d(digital), a(analog) 가 사용 가능합니다. 핀 모드는 i(input), o(output), p(pwm), s(servo) 가 사용 가능합니다. 핀 넘버는 아래 그림에서 확인 가능합니다. 

라즈베리파이 아두이노 제어 - lajeubelipai adu-ino jeeo
이미지 출처: https://www.arduino.cc/en/Reference/Board

실제 동작 화면은 아래와 같습니다. 깜박거리는 led가 아두이노 보드에 기본적으로 달려있는 디버그용 led 입니다. 

라즈베리파이 아두이노 제어 - lajeubelipai adu-ino jeeo

라즈베리파이 아두이노 제어 - lajeubelipai adu-ino jeeo

라즈베리파이 모듈 설치 및 설정

아두이노와 시리얼 통신을 하기위한 모듈을 설치합니다.

arduino 패키지 설치하실 필요없습니다.

sudo apt-get install pyserial

group 을 확인해봅니다.

tty group 에는 pi(계정)가 없네요.

cat /etc/group | egrep -i 'tty|dialout'
tty:x:5:
dialout:x:20:pi

usermod 명령어로 tty 그룹에 pi 를 추가 시킵니다.

sudo usermod -a -G tty pi

추가 되었습니다.

cat /etc/group | egrep -i 'tty|dialout'
tty:x:5:pi
dialout:x:20:pi

다음 id 명령어로도 확인할 수 있습니다.

id
uid=1000(pi) gid=1000(pi) grupper=1000(pi),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),105(input),109(netdev),997(gpio),998(i2c),999(spi)

시리얼 연결 확인

USB-Serial adapter 가 보이네요.

lsusb
Bus 001 Device 006: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

파이썬 코드에서 사용될 경로입니다. (연결이 안되있으면 안나옵니다.)

ls /dev/ttyUSB
/dev/ttyUSB0

아두이노 코드 업로드

아두이노 IDE 설치 / 적외선 센서 다루기

아두이노(Arduino)란? 아두이노는 오픈 소스를 기반으로 한 단일 보드 마이크로컨트롤러로 완성된 보드(상품)와 관련 개발 도구 및 환경을 말한다. 2005년 이탈리아의 IDII(Interaction Design I

jvvp.tistory.com

라즈베리파이 아두이노 제어 - lajeubelipai adu-ino jeeo

아두이노를 설치하면서 아두이노에 적외선 센서 제어 코드를 업로한 상태입니다. 

따라서 라즈베리파이와 연결하기만하면(전원공급) 아두이노 메모리에 업로드된 코드에 따라 작동합니다.

라즈베리파이 아두이노 제어 - lajeubelipai adu-ino jeeo

데이터 전송을 하는 코드입니다.

Serial.write(distance)

아두이노에 코드가 업로드 되지 않았다면 아두이노 IDE 에서 업로드 시켜야합니다.

라즈베리에서 하실 필요는 없습니다. 윈도우에서 업로드를 시킨 후, 라즈베리파이에 연결하면 됩니다.

코드

아두이노에서 전송하는 데이터를 전송받을 때 라즈베리가 제어하는 LED 에 불을 킵니다.

import RPi.GPIO as GPIO
import serial

GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.OUT)

port = "/dev/ttyUSB0"
serial = serial.Serial(port, 9600)
serial.flushInput()

while True:
    if(serial.inWaiting() > 0):
        if serial.read():
            GPIO.output(11, True)
    else:
        GPIO.output(11, False)

좌 라즈베리파이, 우 아두이노

라즈베리파이 아두이노 제어 - lajeubelipai adu-ino jeeo
안보여서 불좀 껏습니다.jpg