シリアル通信

シリアル通信とは

シリアル通信とは,信号線を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' が押されたらその場で左回転

となるようにしてください.