シリアル通信
シリアル通信とは
シリアル通信とは,信号線を2本使ってその電圧差で信号を送る通信方式です.一度に複数の線を使って複数のデータを送信する方式はパラレル通信といいます.
USB は4本の線がありますが,2本は電源のための線,2本は通信を送受信するための線で,それを使ってシリアル通信をすることができます.
今回は Arduino Mega と Mac の間でシリアル通信を行い,mac から 台車を動かしてみます.
Mac から Arduino への通信
Arduino Mega では基板上に LED がありますが,これは 13 番に信号を送ることで光らせることができます.
試してみよう
以下のプログラムを書き込んでLEDの点滅を確認してください.
void setup(){
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
}
void loop(){
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
Arduino 側のプログラム
以下のプログラムでは,Arduino は 0 を受け取るとLEDを1秒点灯させます.
byte data = 0;
void setup(){
Serial.begin(115200);
pinMode(13, OUTPUT);
digitalWrite(13, LOW); // 初期化
}
void loop(){
if (Serial.available() > 0){
data = (byte)Serial.read();
if(data == '1'){
//3秒間LEDを光らせる
digitalWrite(13, HIGH);
delay(3000);
digitalWrite(13, LOW);
}
}
}
Python 側のプログラム
まず,以下のコマンドで pyserial をインストールします.
pip install pyserial
mac に Arduino を接続し,Terminal で接続先の番号を調べます.
接続先は /dev
のディレクトリに現れますが,数が多いので, grep
コマンドで "usbmodem" の文字列が含まれる名前を調べます.
ls /dev | grep usbmodem
そして以下のプログラムで,Arduino に接続します.xxxx の部分は自分で調べてください.
import serial
import time
ser = serial.Serial("/dev/tty.usbmodemXXXX", 115200, timeout = 0.1)
time.sleep(2)
ser.readline()
ser.write( bytes('1', 'utf-8') )
ser.close()
課題
Arduino の台車の動作テストプログラムを改変し,
- 0 が送られたら止まる
- 1 が送られたら前進
- 2 が送られたら後退
となるようにしてください.さらに,mac で,3秒ごとに前進と後退を繰り返し,それが3回繰り返されたら,止まるプログラムを書いてください.
kbhit
python では,ユーザー入力に input
を使うことが多いですが,この関数では文字を打った後必ずリターンキーを押す必要があります.ゲーム等で操作する時には,キーを押されたらキャラクターがすぐに動きますが,そのような操作を可能にするために,kbhit を使います.通常 Terminal でキーボードの入力を制御したい場合には termio という制御ライブラリを使いますが,今回は,その制御を簡単に使えるようにしたライブラリkbhit.pyを使います.
まずは
python kbhit.py
で kbhit の使い方を確認してください.
kbhit を外部から使うには import kbhit
とします。
import kbhit
kb = kbhit.KBHIT()
while True:
if kb.kbhit():
c = kb.getch()
if c == ord('a'):
print("a is pushed!")
if c == 27:
break
print("owari")
課題2
kbhit を使い,
- 's' が押されたら止まる
- 'f' が押されたら前進
- 'r' が押されたらその場で右回転
- 'l' が押されたらその場で左回転
となるようにしてください.