プロデルでArduinoとシリアル通信する

今回は、ワンボードマイコンであるArudinoと通信するプログラムを作ってみようと思います。Arudinoは、IoTデバイスとしてRaspberry Piと同じぐらい知名度のあるワンボードマイコンです。

プロデルでは、シリアルポートを利用するための種類が用意されています。プロデルからUSBのシリアルポートを通じて、Arduinoに接続された部品を操作するプログラムを作ってみます。

準備

今回は次の機材やソフトを用意します。

  • Arduino本体
  • ArduinoのPC用のドライバ
  • 開発環境であるArduino IDE

記事でのテストにはArduino互換機であるStuduinoを使いました。Arduinoやその互換機は、Amazonなどで2,000円程度から販売されています。Studuinoは、Arduinoと互換性がある上で、サーボモーターや赤外線センサー、LEDライトなどの各種部品をコネクタで接続でき、電気工学の知識がなくても簡単に始められます。

また、Arduino上のプログラムを作ったり、コンパイルしたプログラムをボードへ書き込むArduino IDEも必要です。こちらは、Arduinoの公式サイトより無料でダウンロードできます。

概要

シリアル通信を利用することで、プロデルからArduinoへコマンドを送ったり、Arduinoからプロデルへセンサーの測定値を受け取ったりできます。そのためには、Arduino上でシリアルポートを通じてPCとデータを送受信するプログラムを作ります。またプロデル上ではシリアルポートを通じてArduinoとデータを送受信するプログラムを作ります。

なおArduinoでは、ボード上のプログラムをArduino言語というC言語に似たプログラミング言語で書きます。Arduino内部のプログラムはプロデルで作ることができませんので、今回はArduino言語で書くプログラムを最低限の内容にしました。Arduino側のプログラムを凝ることでもっと実用的なことも実現可能かと思います。

例1. LEDを光らせる

まずは、プロデルからArduinoの基板に付いているLEDを光らせたり消したりしてみます。

プロデルでウィンドウを作り、「光る」ボタンと「消す」ボタンの2つを貼り付けて、そのボタンをクリックすることによって、ArduinoのLEDを点滅させてみます。

Arduinoは、PCから送られるコマンド(番号)を受け取って、そのコマンドによってLEDを動作させます。

最初に、Arduinoでは、Arduino言語でシリアルポートからデータを受け取るプログラムを実行しておきます。受信した値に応じてLED(D13)を点灯(1)または消灯(0)に切り替えます。

void setup(){
  Serial.begin(19200);
  pinMode(13, OUTPUT);
}

void loop(){
  if (Serial.available() > 0) {
    int value = Serial.read();
    if (value == 1) {
      digitalWrite(13, HIGH);
    } else {
      digitalWrite(13, LOW);
    }
  }
}

Arduino IDEでプログラムを作り、「スケッチ」メニューの「マイコンボードへ書き込む」でプログラムをArduinoへ書き込みます。

一方、プロデルでは「シリアル通信」種類を使ってArduinoへ1または0の値を送ります。シリアルポートに値を送るには、「バイナリ形式で送信する」手順を使います。

なお、シリアル通信を開始する際、Arduinoが接続されたポート名を指定します。このプログラム例では、PCに接続された1つ目のシリアルポートへ接続するように作っています。プログラムを実行するときは、Arduino以外のシリアルポートを使用するUSB機器を外してください。それでも上手くいかない場合は、「ポート名」設定項目でポート名を直接指定してください。接続されているポート名は、Arduino IDEの画面下で確認できます。

Arduinoポートというシリアル通信を作る
ポート一覧は、Arduinoポートのポート名一覧
もしポート一覧の個数が0なら「接続してください」というエラーを発生させる
Arduinoポートのポート名は、ポート一覧(1)
Arduinoポートのボーレートは、19200
Arduinoポートを開く
メイン画面を表示する
待機する

メイン画面とは
	ウィンドウを継承する
	はじめの手順
		初期化する
		ーー貼り付けた部品に対する操作をここに書きます
	終わり
	初期化する手順
	ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
	この設計スケール比率を{144,144}に変える
	この内容を「メイン画面」に変える
	初期化開始する
	消えるボタンというボタンを作る
		その位置と大きさを{102,96,75,23}に変える
		その内容を「消える」に変える
		その移動順を1に変える
	光るボタンというボタンを作る
		その位置と大きさを{102,34,75,23}に変える
		その内容を「光る」に変える
		その移動順を2に変える
	初期化終了する
終わり

	光るボタンがクリックされた時の手順
		Arduinoポートから{1}をバイナリ形式で送信する
	終わり

	消えるボタンがクリックされた時の手順
		Arduinoポートから{0}をバイナリ形式で送信する
	終わり
終わり

例2. センサーの値をPCに報告する

今度は、Arduinoに接続した赤外線センサーの値を読み取るプログラムを作ってみます。

※Studuinoでは、赤外線リフレクターという部品を取り付けることで赤外線センサーによって測定値を調べることができます

Arduinoのプログラムでは、A0に接続した赤外線センサーから値を受け取って、シリアルポートへ送信した上で、500ミリ秒(0.5秒)待機することを繰り返します。

void setup() {
  Serial.begin(19200);
}
       
void loop() {
  long x = analogRead(0);
  Serial.write(x);
  delay(500);
}

プロデル側では、シリアルポートを通じてデータが送られてきた時に実行される「受信した時」のイベント手順を定義しておきます。受信したデータを得るには、「一字だけ受信する」手順を使います。データが送られてくる度に、受信した値を調査ウィンドウに値に表示します。

Arduinoポートというシリアル通信を作る
ポート一覧は、Arduinoポートのポート名一覧
もしポート一覧の個数が0なら「接続してください」というエラーを発生させる
Arduinoポートのポート名は、ポート一覧(1)
Arduinoポートのボーレートは、19200
Arduinoポートを開く
待機

Arduinoポートが受信した時の手順
	Arduinoポートから一字だけ受信して結果とする
	結果を報告する
終わり

実行すると、0.5秒おきに赤外線センサーが検知した値が調査ウィンドウに表示されます。センサーの前に物を置くなどして、値が変化するのを試してみてください。

Arduinoには、光センサー以外にも温度センサーや加速度センサーを取り付けることができます。このプログラムを少し改良すれば、プロデルで、それらの測定して記録するプログラムなども作ることができるかと思います。

例3. スイッチを押すことでLEDを光らせる

最後に、上記の2つのプログラムを組み合わせて、スイッチを押した時にLEDが光るようなプログラムを作ってみましょう。

※Studuinoでは、あらかじめ基板に4つのスイッチ(A0,A1,A2,A3)が備わっており、これらのスイッチを使ってプログラムを作れます

次のプログラムでは、ArduinoのA0のピンに接続したスイッチの値をシリアルポートへ送信します。またプロデルから1または0の信号が送られてきた場合には、LEDを点灯したり消灯したりするようにします。

void setup(){
  Serial.begin(19200);
  pinMode(13, OUTPUT);
  pinMode(A0, INPUT_PULLUP);
}

void loop(){
  if (Serial.available() > 0) {
    int value = Serial.read();
    if (value == 1) {
      digitalWrite(13, HIGH);
    } else {
      digitalWrite(13, LOW);
    }
  }
  long a = digitalRead(A0);
  Serial.write(a);
  delay(100);
}

一方、プロデルでは、シリアルポートから値を受信した時に、スイッチが押させている(0)時には1を送信し、スイッチが押されていないとき(1)には0を送信するようにします。このようにプログラムすることで、スイッチに応じてLEDを光らせられます。

Arduinoポートというシリアル通信を作る
ポート一覧は、Arduinoポートのポート名一覧
もしポート一覧の個数が0なら「接続してください」というエラーを発生させる
Arduinoポートのポート名は、ポート一覧(1)
Arduinoポートのボーレートは、19200
Arduinoポートを開く
待機

Arduinoポートが受信した時の手順
	Arduinoポートから一字だけ受信して結果とする
	もし結果が0なら
		Arduinoポートから{1}をバイナリ形式で送信する
	そうでなければ
		Arduinoポートから{0}をバイナリ形式で送信する
	もし終わり
	結果を報告する
終わり

では、実際にArduinoへコンパイルしたプログラムを書き込んで実行させた上で、プロデルのプログラムを実行してみましょう。

実行するとプロデルの調査ウィンドウには、1が報告され続けます。Arduinoのスイッチを押すと0に変化します。それと同時に、Arduino基板のLEDが点灯します。そして、スイッチを離すと再び1に変化して、LEDが消灯します。

最後に、プロデルで、スイッチの状態を判断しLEDを光らせるように指示するコマンドを送るプログラムを作りました。実はこのプログラムはArduinoだけでも出来てしまいます。ただプロデルでは複数の条件や動作をさせるプログラムも日本語で書くことができ、PCの画面ですぐに連動させることも簡単です。

コマンドを増やせば、複数のセンサーやモーターを組み合わせたプログラムも作ることができるかと思います。

まとめ

プロデルでArduinoとシリアル通信することで、LEDを光らせたり、センサーやスイッチの情報を取得したりしました。

Arduinoには、各種モーターやセンサー、LEDなどの表示部品を取り付けることができますので、これらをプロデルが得意なGUIやHTTP操作、キャンバスによる図形描画と組み合わせて、ちょっとした情報収集や機器操作ができるIoTツールを作れます。ぜひ挑戦してみてください。

  • いいね (4)
  • 続編を読みたい (13)

“プロデルでArduinoとシリアル通信する” への1件の返信

  1. ありがとうございます。今日プロデルの存在を知りました。arduinoとPCを連動して外部からデーターを取得していますが、Terapad頼みでいろいろ都合が悪かった部分、日本語プログラミングで実現してみようと思いました。
    早速簡単な繰り返し処理とか試してみましたが、これは楽しい。見慣れない文法ですが日本語だと習得が早いと思いますので頑張ってみます。

コメントを残す