製作実験という授業で作るライントレーサーとサークルのモジュールで使うために、Raspberry PiとArduinoでシリアル通信をしました。


・準備すること
 ラズパイでシリアル通信をするためにはpysirialというライブラリが必要なのですが、それをインストールするためにはpipというものが必要です。それぞれをダウンロードするために↓のコマンドをターミナルで打ちます。
$ sudo apt-get install python-pip
$ pip install pyserial

・Arduinoのプログラム
 ラインとレースをする都合でいろいろシリアル通信と関係ない部分が多いですが、Arduinoから出力する分にはシリアルモニタに出力するときと一緒です。
 ちなみにこのプログラムで読み取っているのはフォトリフレクタからの出力で、出力しているのはTA7291pへの信号です。
int val1,val2,val3,val4,val5;
int thre1=500;
int thre2=500;
int thre3=500;
int thre4=500;
int thre5=500;

int repo;

void setup() {
  Serial.begin(9600);
  pinMode(13,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(10,OUTPUT);
}
 
void loop() {
  
  val1=analogRead(0);
  val2=analogRead(1);
  val3=analogRead(2);
  val4=analogRead(3);
  val5=analogRead(4);
  
  if(val2>thre2){
  repo=2;
  digitalWrite(13,HIGH);
  digitalWrite(12,LOW );
  digitalWrite(11,HIGH);
  digitalWrite(10,HIGH);}
  
  if(val3>thre3){
  repo=1;
  digitalWrite(13,HIGH);
  digitalWrite(12,LOW );
  digitalWrite(11,LOW );
  digitalWrite(10,HIGH);}
  
  if(val4>thre4){
  repo=3;
  digitalWrite(13,HIGH);
  digitalWrite(12,HIGH);
  digitalWrite(11,LOW );
  digitalWrite(10,HIGH);}
  
  if(val1>thre1){
  repo=4;
  digitalWrite(13,LOW );
  digitalWrite(12,HIGH);
  digitalWrite(11,LOW );
  digitalWrite(10,HIGH);}
  
  if(val5>thre5){
  repo=5;
  digitalWrite(13,HIGH);
  digitalWrite(12,LOW );
  digitalWrite(11,HIGH);
  digitalWrite(10,LOW );}
  
  if(val1>thre1 && val5>thre5){
  repo=0;
  digitalWrite(13,HIGH);
  digitalWrite(12,LOW );
  digitalWrite(11,LOW );
  digitalWrite(10,HIGH);}
  
  Serial.println(repo);
  delay(10);
}

・Raspberry Piのプログラム
# coding: UTF-8

from serial import *

from sys import exit

from datetime import datetime

# ArduinoのUSBデバイス名

port = '/dev/ttyACM0'

# シリアルポートを開く

try:

   ser = Serial(port, 9600)

   print('open port: %s' % port)

except:

   print('cannot open port: %s' % port)

   exit(1)

# 読み出しと出力

while True:

   # 1ライン単位で読み出し、末尾の改行コードを削除

   line = ser.readline().rstrip()

   try:

       print(datetime.now(),line)

   except Exception as e:

       print(e.message)


・動作
 これを入れて、Ardinoと普通のパソコンをつなぐのと同じ様にラズパイとArduinoをつなぐと、Serialprintされた値がラズパイに表示されます。この値を使ってラズパイ側で音を鳴らしたり画像を表示したりしたいのですが、いまいちいい方法が見つからず...まあ、いろいろ試行錯誤してやっていこうと思います。それではまた今度。


こんな感じで動かしてました。
JPiAwx-C