ArduinoとRaspberry PI間のシリアル通信

プログラミング
image_print

4軸ウィンチ(カメラ台エレベーター)の制作ができたら、コンパニオンコンピューターのRaspberry PIからのコマンドを受付け、状況を返すインターフェースを作る必要があります。

シンプルなシリアル通信

基本的な実験から始めます。Raspberry PIを動かし、USBケーブルでArduinoと接続しますが、後述するプログラムをあらかじめPCからArduinoに書き込んでおく必要があります。
ArduinoをRaspberry PIに繋いでもRaspberry Piから電源が供給されるので、便利ですね。

Raspberry PI側はさまざまなインターフェースが考えられます。USBソケットだけで4つあります。
しかし、Arduinoを接続したUSBコネクターを挿して

ls -l /dev/tty*

でttyのリストを取ると、ttyAMA0, ttyACM0かttyUSB0が現れるかと思います。
どれかがUSBシリアルです。
したがってUSBコネクターを抜いて、もう一度、上記のコマンドを打って出てこないものが、対象のシリアルということになります。
私の場合、ttyUSB0となりました。

それをふまえてRaspberry PI側のPythonプログラムです。
Raspberry PI側からコマンドを投入し、Arduino側は答えを返す基本的なプログラムです。
が、意外に例を見かけません。

import serial
import time

arduino = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
arduino.reset_input_buffer()

def conversation(Cmd):
	EncCmd = Cmd.encode("utf-8")
	arduino.write(EncCmd)

	while True:
		if (arduino.inWaiting()>0):
			recvData = arduino.readline().decode('utf-8')
			return recvData

		time.sleep(0.1)
    
if (__name__ == "__main__"):
	# arduino.open()
	while True:
		Cmd = input("enter:")
		if (Cmd == "end"):
			exit()

		Data = conversation(Cmd)
		print(Data)
  

Serialはインストールされていないことがあるので、その場合は以下のパッケージをインストールしてください。

pip install pySerial

Time.sleepで少し待っているのは、待たないと思い切りループしてCPUを浪費するプログラムになっちまうからです。

一方、Arduino側のプログラムはこちら。



void setup() {
  Serial.begin(9600);
  delay(200); // wait for start Serial
  
}

void loop() {
  String Cmd;
  if (Serial.available() > 0){
    Cmd = Serial.readString();
    Cmd.trim();

  }
  
  if (Cmd == "start"){
    delay(5000); // doing something
    Serial.println("END RC=0");
    Cmd = "";  
  } else if (Cmd == "rewind"){
    delay(10000); // doing something
    Serial.println("END RC=0");
    Cmd = "";  
  } else if(Cmd == "error") {
    Serial.println("END RC=1");
    Cmd = "";
  }
  
}

これでRaspberry PIからstart, rewind, errorを出すとArduinoからEND RC= が戻って表示されるはずです。

 

タイトルとURLをコピーしました