컴퓨터

Raspberry PI와 Arduino Serial 통신

codebank 2018. 1. 7. 11:13


Raspberry PI와 Arduino Serial 통신


최근 Arduino와 온도센서(DS18B20)를 구입해서 놀고 있다가 외부 온도를 측정하려는데 괜찮은 방법이 없었다.
LCD를 붙이기도 그렇고(연결 장비가 없다.) 직접 통신은 Serial로만 가능하고(통신 Hat 구입을 하지 않았다.)
그러다 문득 예전 GPS까지 연결하고 Raspberry PI에서 해당 값을 가져오면 TCP/IP로 데이터 전송이 가능할 거라고 생각을 했다.
(라이브러리 찾기와 포함 방법, 연결방법 등은 이미 알고 있다고 가정하자.)

먼저 환경을 보면 다음과 같다.

Raspberry PI 모델 B
(사진의 선들은 Camcoder를 만들었던 흔적)
Raspberry PI는 Arduino에서 넘어온 정보를 보는 역할을 한다.
예전 모델이라 무선 Wifi를 이용한다.



Arduino Nano (328p) 호환보드, DS18B20, GPS  Module
Arduino는 온도센서값을 측정하고 GPS값을 받아들여 Serial로 보낸다.
온도센서는 Serial로부터 값이 들어왔을 때만 측정해서 Serial로 값을 보낸다.
GPS는 들어오는 값이 들어올 때마다 Serial로 값을 보낸다.



두 기기간 연결



Arduino 소스

DS18B20은 1 Wire 통신방법으로 9600,N,8,1로 Arduino D2에 연결한다.
GPS는 Serial 방법으로 통신하는데 Serial은 Raspberry PI와 연결하는데 사용함으로 SoftwareSerial을 사용하여 연결한다.
GPS TX는 D10번에 GPS RX는 D11번에 9600,N,8,1로 연결한다.
(N,8,1은 Default로 기본 값을 사용함으로 표현안함)
Arduino는 아래 소스를 올리면 된다.

/*-----( Import needed libraries )-----*/
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SoftwareSerial.h>

/*-----( Declare Constants )-----*/
#define ONE_WIRE_BUS 2 /*-(Connect to Pin 2 )-*/

/*-----( Declare objects )-----*/
/* Set up a oneWire instance to communicate with any OneWire device*/
OneWire ourWire(ONE_WIRE_BUS);

/* Tell Dallas Temperature Library to use oneWire Library */
DallasTemperature sensors(&ourWire);

SoftwareSerial gpsSerial (10, 11);

/*-----( Declare Variables )-----*/

void setup() /*----( SETUP: RUNS ONCE )----*/
{
    /*-(start serial port to see results )-*/
    delay(1000);
    Serial.begin(9600);

    delay(1000);
    gpsSerial.begin(9600);
    
    /*-( Start up the DallasTemperature library )-*/
    sensors.begin();
}/*--(end setup )---*/

void loop() /*----( LOOP: RUNS CONSTANTLY )----*/
{
    /* Get temperatures data. */
    if (Serial.available () > 0)
    {
      int inByte = Serial.read ();
      sensors.requestTemperatures(); // Send the command to get temperatures
      Serial.print("$TEMP,");
      Serial.println(sensors.getTempCByIndex(0));
    }
    /* Get GPS data. */
    if (gpsSerial.available () > 0)
    {
      Serial.write(gpsSerial.read());
    }
}/* --(end main loop )-- */

/* ( THE END ) */



Raspberry PI 측

프로그램을 이용하여 관찰하는 것을 목표로 했지만 일단 귀찮아서 데이터가 들어오는 것을 minicom으로 확인만 한다.

$ sudo apt install minicom               # minocom 설치
$ sudo usermod -a -G dialout pi       # user pi가 Serial Port에 접근할 권한을 준다
$ minicom -D /dev/ttyUSB0 -b 9600  # 9600으로 Arduino와 통신


일단은 여기까지. :-)