Arduinoでシリアル通信する際の注意点

Arduinoとシリアル通信をするには、起動時間のために1.5秒ほど待たなくてはならない。
でないとうまくプログラムが動かなくて、唸ることになる。

検証

検証プログラムとして、Arduino側でシリアル通信で何かの文字列を受け取ったら13番ピンに刺さっているLEDが光るプログラムを製作。

// Arduino用プログラム
const int LED = 13;

void setup()
{
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);
}

void loop()
{
  if(Serial.available() > 0) {
    // シリアル通信で何か受信したら
    digitalWrite(LED, HIGH);
  }
  
  delay(10);  // 10[ms]待つ
}

シリアル通信ソフトで文字列を送信するとLEDが点灯する。

手作業で文字列を打つのは面倒なので、pythonスクリプトで文字列を送信。5秒間光らせるだけ。

# coding: utf-8

import serial
import time

ser = serial.Serial()
ser.port = '/dev/cu.usbserial-A7006Qrd'
ser.baudrate = 9600
ser.open()

ser.write('dummy string')
time.sleep(5)

このスクリプを実行すると、5秒間何も起こらないまま終了する。

解決方法

解決方法が載ってた。
serial port - Pyserial problem with Arduino - works with the Python shell but not in a program - Stack Overflow

通信の開通後と送信との間に1.5秒ほど、Arduinoのブート用に開けないといけないらしい。
解決方法がわかったので、上のpythonスクリプトを編集する。
編集箇所はser.writeの前に1.5秒ほど停止させる。

time.sleep(1.5)
ser.write('dummy string')
time.sleep(5)

実行すると、意図したとおり5秒間LEDが点灯する。