라즈베리파이 아두이노 연동

이번 포스팅에서는 라즈베리파이와 아두이노를 연동해서 사용하는 법에 대해 알아 보겠습니다.

 

사진출처:  https://www.raspberrypi.org/magpi/program-arduino-uno-raspberry-pi/

 

 

라즈베리파이와 아두이노를 연동해서 사용하는 방법에는 크게 두가지 방법이 있는데

하나는 아두이노 IDE를 사용하는 것이고

다른 하나는 라즈베리파이에서 직접 아두이노를 컨트롤 하는 것입니다.

 

지금부터 차근차근 알아 보겠습니다.

 

 

라즈베리파이에 아두이노 IDE를 설치하기 전에

라즈베리파이의 패키지를 업데이트 해야 합니다.

 

~ $ sudo apt-get update

~ $ sudo apt-get upgrade

 

위의 두 명령어를 라즈베리파이 터미널 창에 입력해 줍니다.

 

 


 

~ $ sudo apt-get install arduino

 

위의 명령어를 라즈베리파이 터미널 창에 입력해 줍니다.

설치중 [y/n] 질문이 나타나면 y를 입력하면 설치가 진행됩니다.

설치가 완료되면 바탕화면에 아두이노 IDE가 생성되었을 것입니다.

 

 

 

* apt란?

Advance Package Tool의 약자로

데비안/우분투 환경에서 사용되는 패키지 관리 도구입니다.

응용 프로그램의 설치, 삭제, 버젼 업데이트를 할 수 있게 해줍니다.

(라즈베리파이에서 apt를 사용하는 이유는 라즈비안이 데비안 파생이기 때문)

 

 

대표 명령어

apt-get install [패키지 이름]         패키지 설치

apt-get remove [패키지 이름]       패키지 삭제

apt-get purge [패키지 이름]         패키지 및 패키지 설정 삭제

apt-cache show [패키지 이름]     패키지 정보 출력

apt-cache search [패키지 이름]   패키지 검색

 

 

* apt-get, apt-cache 통합

'apt-get'과 'apt-cache'를 결합한 'apt'라는 사용자 편의성을 위한 툴이 있습니다.

 

~ $ apt install [패키지 이름]        패키지 설치

 

하지만 포스팅에서는 apt-get, apt-cache를 사용하도록 하겠습니다.

apt-get과 apt-cache를 완벽하게 통합한 툴은 아니라고 합니다.

 

 

* update와 upgrade의 차이

update는 라즈베리파이가 사용가능한 패키지의 목록을 업데이트 해주는 명령어이고,

upgrade는 라즈베리파이에 설치된 패키지들의 버젼을 최신버젼으로 만들어주는 명령어입니다.

 

 

 

 

 

라즈베리파이와 아두이노의 연결은 간단합니다.

아두이노의 usb 포트를 라즈베리파이에 연결해주면 됩니다.

 

 

usb 포트 연결이 끝났으면 아두이노 포트를 확인해줍니다.

 

 

[Tools] - [board]에서 아두이노 보드를 맞춰줍니다. 이 포스팅에선 uno 보드를 사용했습니다.

[Tools] - [Serial Port] - [/dev/ttyACM0]을 선택해줍니다.

 

 

보드, 포트 설정이 끝났으면 이후 과정은 동일합니다.

코드를 작성한 후, 업로드를 해줍니다.

 

 

라즈베리파이에서 아두이노 8번 핀을 이용해 LED를 점등해 보겠습니다.

 

 



 

 

 

int led = 8;

int val = 0;


void setup() {

pinMode(led, OUTPUT);

}


void loop() {

digitalWrite(led, HIGH);

delay(1000);

digitalWrite(led, LOW);

delay(1000);

}

 

 

 

위의 코드를 작성 후 업로드 해줍니다.

저항은 330옴 저항을 사용했습니다.

 

 

 

이번엔 PWM 제어를 해보겠습니다.

PWM 제어를 위해 LED를 9번핀으로 바꿔주어야 합니다.

 

 

int led = 9;

int val = 0;


void setup() {

Serial.begin(9600);

Serial.println("input 0~255");

pinMode(led, OUTPUT);

}


void loop() {

if (Serial.available()) {

val = Serial.parseInt();

Serial.println(val);

analogWrite(led, val);

}


delay(50);

}

 

 

 

 

참 쉽죠?

라즈베리파이와 연동이긴 하지만

아두이노 단독으로 사용할 때와 큰 차이점은 없습니다.

 

 

 

이번에는 라즈베리파이에서 파이썬을 이용해 아두이노를 제어해 보겠습니다.

우선 이 방법을 사용하기 위해선

아두이노 스케치에 Firmata 코드를 업로드 해주어야 하는데요.

예제에 있는 [Firmata]-[StandardFirmata]의 코드를 아두이노에 업로드 해줍니다.

업로드가 되면 아두이노는 라즈베리파이로부터 들어오는 데이터를 기다리게 됩니다.

 

 

* Firmata Protocol

사용자의 컴퓨터에서 아두이노 IDE를 사용하지 않고,

시리얼 통신을 이용해 아두이노에게 명령을 직접 전달하는 프로토콜입니다.

 

간단히 말해, Firmata Protocol로 아두이노와 사용자의 컴퓨터가 연결이 되면

사용자가 원하는 언어, 예를 들어 python을 이용해 아두이노를 제어할 수 있다는 말입니다.

 

 

아두이노 부분은 이것으로 끝났고, 이제 라즈베리파이 부분을 설정해 보겠습니다.

 

 

* 파이썬 설치

라즈비안을 설치할 때, 파이썬이 깔려있긴 한데

혹시라도 파이썬이 없는 경우에는 터미널창을 열고 아래와 같이 명령어를 입력해 줍니다.

 

~ $ sudo apt-get install python

이렇게 입력하면 python2가 설치됩니다.

 

python3을 설치하고 싶다면

~ $ sudo apt-get install python3 명령을 입력하면 됩니다.

 

 

라즈베리파이에서도 PyFirmata라는 라이브러리를 사용해야 하는데,

PyFirmata는 내부적으로 PySerial 라이브러리를 사용하기 때문에 PySerial을 설치해야 합니다.

PySerial은 Github을 이용해 소스를 관리하는 라이브러리이기 때문에 라즈베리파이에 git을 추가로 설치해 주어야 합니다.

 

~ $ sudo apt-get install python-serial

터미널 창에 위 명령어를 입력하여 PySerial 라이브러리를 설치합니다.

 

~ $ sudo apt-get install git

~ $ git clone https://github.com/tino/pyFirmata.git

~ $ cd pyFirmata

~ $ sudo python setup.py install

위 명령어들을 차례대로 입력해 줍니다.

 

이제 라즈베리 파이를 이용해 아두이노를 제어할 준비가 끝났습니다.

 

 

9번 핀에 LED가 꽂혀 있는 위의 회로도를 그대로 이용하겠습니다.

 

터미널 창을 열어서 아래와 같이 입력해 내려갑니다.

 

~ $ sudo python

>>> import pyfirmata

>>> board = pyfirmata.Arduino('/dev/ttyACM0')

>>> pin9 = board.get_pin('d:9:o')

>>> pin9.write(1);

>>> pin9.write(0);

 

 

 

sudo python 명령어를 입력하면

터미널 환경에서 python IDLE를 실행합니다.

 

>>> 로 표시된 줄에 코드를 입력하면 파이썬 인터프리터가 한줄 한줄 읽어 내려갑니다.

 

pin9.write(1)을 입력하면 LED가 켜지고

pin9.write(0)을 입력하면 LED가 꺼집니다.

 

Ctrl + Z를 눌러서 python IDLE를 종료합니다.

 

 

* 코드 설명

board.get_pin('d:9 :o')는 핀모드를 결정하는 코드입니다.

 

'd/a : 핀번호 : o/i/p'

d/a는 디지털, 아날로그를 의미하고

o/i/p는 순서대로 출력(OUTPUT), 입력(INPUT), PWM을 의미합니다.

위 코드는 9번 핀을 디지털 출력으로 설정하겠다는 뜻이 됩니다.

 

 

 

이번엔 PWM 제어를 해보겠습니다.

코드는 아래와 같습니다.

 

import pyfirmata


boiard = pyfirmata.Arduino('/dev/ttyACM0')

pin9 = board.get_pin('d:9:p')


while True:

value = int(raw_input())

pint9.write(value/100.0)

 

 

* 파이썬 IDLE

여러줄의 코드를 사용할 때에는 python 파일을 만들어 사용하는 것이 더 효과적입니다.

위 코드를 파이썬 IDLE에 복사하여 저장 후 사용하거나

nano, vi, vim 같은 텍스트 편집기를 이용하여 .py 파일을 만들어 사용합니다.

파일을 실행할 때에는 ~ $ sudo python [파일이름] 명령을 입력합니다. (python3는 python3 [파일이름])

 

 

 

 

아두이노와 라즈베리파이가 firmata로 연결될 때까지 잠시 기다려 주어야 합니다.

 

PWM 출력은 pin, write 안의 값이 0 ~ 1입니다.

ex) pin.write(0.3), pin.write(0.6)의 형태로 입력해 주어야 합니다.

 

 

 

위에 나온 두가지 방법을 상황에 맞게 사용하면 될 거 같네요.

 

지금까지 라즈베리파이에서 아두이노를 동작시키는 방법에 대해 알아 보았습니다.

 

 

  •  56,982
  •  7
  •  0

박성태 2020-02-03 11:17:04

질문이 있습니다. 위와 같이 라즈베리파이에 아두이노를 연결해서 사용하게 되면 아두이노에는 충분한 전원이 공급되나요? 그리고 위와 같이 연결했을 때, 아두이노에 여러가지 센서나 led를 연결해서 사용할 경우 아두이노에서 각 센서와 led에 충분한 전원을 공급해줄 수 있나요?

오재호 2020-04-28 07:16:31

멀티미터로 측정하면, 어느 순간에 숏나는지 알죠. LED 한개당 10-20mA 먹으니 50이상 led사용하면 숏 날듯

박성준 2020-04-29 14:45:31

질문이 있습니다. 라즈베리파이 욜로에서 검출한 데이터를 아두이노에 보내서 제어할 수 있나요..?

오재호 2020-05-01 23:19:42

아두이노의 센서값을 라즈베리파이에서 데이터베이스에 pho로 받아 crontab 주기적으로 저장 가능하고 제어도 라.파에서 가능합니다만.. 욜로가 뮈죠? 라즈베리파이값을 보내는 것은 pwm 핀의 아두이노로 send 가능. 수동으로!

김성태 2021-06-24 19:06:55

한가지 질문이 있습니다. 라즈베리파이에 연결한 카메라로부터 얻은 데이터를 제어 신호로 바꾸어 아두이노에 보낼 수 있는 방식이 있을까요?

윤민혁 2023-09-13 10:52:39

섹스구구섹스구구섹스

윤민혁 2023-09-13 10:54:27

죄송합니다 친구가 제가 자리를 비운동안 장난을 쳤습니다. 저 이 사이트 애용하면서 많은 정보 얻고 있습니다. 사랑합니다. 감사합니다.


댓글을 남겨 주세요.