Pythonでarduinoを動かしてみる

2022.01.05

2022.01.17

Fabeee社員ブログ


どうも、むらです。
普段はiOSのアプリの開発をしてますが、arduinoを使う機会があったので、
そこで学んだことを書いてみました。

arduinoとは

arduinoとはマイコンボードの一種で、
センサ等のハードウェアを動かす装置として用いることができます。
arduinoは当時、ロボットのデジタル制御装置の試作用のボードを
従来のものより安価でシンプルなものにするために、2005年にイタリアで開発されました。
arduinoは「arduino IDE」という開発環境を用いて、
C言語とC++言語をベースにした「arduino言語」のプログラムを制作・コンパイルし、
それをarduinoボードに転送することによって動かすことができます。
Resberry piと比較されることが多いのですが、大きな違いとしては、
OSがなく、電源を入れた瞬間に起動できる点ではないかと感じています。

シリアル通信でarduinoを動かす

ハードを動かすだけであば、arduinoだけでも可能ですが、
センサの情報をPCに表示させたり、PCからサーボモーターを動かす、
といったことをしようとすると、PCとの通信を行う必要があります。
そういった場合、シリアル通信を用いてarduinoと通信を行うのが一般的です。

シリアル通信とは、一本の通信線で直列にデータの送受信を行う通信方式です。
シリアル通信とは対照的に複数の通信線で並列に通信を行う通信方式をパラレル通信といいます。
パラレル通信はシリアル通信に比べて速度が早いのですが、
通信線のコストがかかる、データの同期をとるのが困難、
といったデメリットもあるため、現在ではシリアル通信の方が主流になっています。

PCとの接続で設定すること

PCとの接続には以下の設定が必要です。

  • シリアルポート・・・シリアル通信で使われるインターフェース。通信先の機器を識別するための情報。
  • ボーレート・・・通信の速度。9600bps、19200bps、57600bpsといった数値を設定する。

圧電ブザーを鳴らす装置

以下はPCとarduinoをシリアル接続して圧電ブザーを鳴らす装置の実装サンプルです。
標準入力から文字を1文字入力すると、音階を鳴らします。

 

配線

圧電ブザーの+極を8番ピンに、−極をGNDに接続しました。

python側のプログラム

pythonでシリアル通信をするために、pySerialというモジュールを使用しました。
以下の例では、pySerialの通信を開く際にシリアルポートとボーレートを設定し、
その後、標準入力で入力した文字をarduinoに送信します。

import serial

def main():
    with serial.Serial('/dev/cu.usbmodem143101', 9600, timeout=1) as ser:   # シリアルポートとボーレートを設定
        while True:
            print("Input Char (q:quit)", end=' > ')
            p = input()

            if p == 'q':
                break

            flag = bytes(p, 'utf-8')
            ser.write(flag)   # 入力した文字を送信

        ser.close()

if __name__ == "__main__":
    main()

arduino側のプログラム

setupメソッドでボーレートを設定し、
loopメソッドでpcから受信した文字を判定して音階を鳴らします。


int pin = 8;     // ピン番号

void setup() {
  Serial.begin(9600);
}

void loop() {
  int data = Serial.read();
  if (data != -1) {
    switch(data){
      case 'z':     // ド
        tone(pin, 262, 200);
        break;
      case 'x':     // レ
        tone(pin, 294, 200);
        break;
      case 'c':     // ミ
        tone(pin, 330, 200);
        break;
      case 'v':     // ファ
        tone(pin, 349, 200);
        break;
      case 'b':     // ソ
        tone(pin, 392, 200);
        break;
      case 'n':     // ラ
        tone(pin, 440, 200);
        break;
      case 'm':     // シ
        tone(pin, 494, 200);
        break;

      // 中略
      
      default:
        tone(pin, 262, 200);
        break;
    }
  }
}

動かした様子

意外に楽器のような音が出せるので驚きました。

Fabeee編集部

Fabeee編集部

こちらの記事はFabeee編集部が執筆しております。