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= が戻って表示されるはずです。