シリアル通信・・?
Arduinoを他のマイコンやソフトウェアと連携してデータのやり取りをさせたい場合、シリアル通信という機能が便利です。
シリアル通信というのは通信方式の名称で、シリアル(Serial:一続きの、連続的な)という名の通り、一本の伝送路にデータを順に並べて送受信します。
ArduinoではUSBを介したPCとのシリアル通信の他、D0、D1ピンがシリアル通信に対応しており、これを利用することで他のマイコン等の機器とシリアル通信ができます。

今回の記事では、シリアル通信の第一歩としてArduino-PC間でのシリアル通信について触れてみたいと思います。
今回の目標
ということで、今回の目標はこんな感じにしてみます。
PCに接続したキーボードからArduinoに文字を送り、送った文字に応じた処理をさせる
ついでにArduinoから命令を受け取った旨の返事をPC側へ返す
では行ってみましょう。
配線
今回はシリアル通信のテストなので、特に配線なしで行います。PCとArduinoをUSB接続すればOKです。
動作の確認は、Arduino内蔵LED(D13ピンと連動)で行います。
スケッチ
void setup(){
Serial.begin(9600); //シリアル通信を開始するための命令
pinMode(13,OUTPUT);
}
void loop(){
if(Serial.available() > 0){ //シリアルポートに何かデータが届いているか?
char val = Serial.read(); //届いたデータをchar型で吸い取る
switch (val){ //届いた文字に応じて分岐処理
case 'H':
digitalWrite(13,HIGH);
break;
case 'L':
digitalWrite(13,LOW);
break;
}
}
}
setup関数内の Serial.begin(9600); はシリアル通信の開始を宣言する関数で、これをやっとかないとシリアル通信が使えません。9600というのは通信速度で、通信相手との間で適切に設定する必要があります。
loop関数内の Serial.available() はシリアル関数に関する予約語で、Arduinoのシリアルポートに届いているデータのサイズをint型ビット数で返します。なにも届いていない場合は0になります。要するにこの値が0より大きいということは、何らかのデータを受信している、と判断できます。
その下の分岐処理では、文字’H'を受信したらLED点灯、’L'を受信したらLED消灯、となります。
動作確認
上記スケッチをArduinoに書き込んで、シリアルモニタから文字をSENDしてみましょう。HでLEDが点灯、Lで消灯するはずです。※大文字、小文字は区別されますので注意
これを応用すればLED以外もキーボードから動かせそうですね。やった!
Arduinoに返事させる
せっかく遠隔操作っぽいことができたので、Arduinoから応答を変えさせるようにしましょう。また、想定していない文字入力に対してERRORとでも返すようにすると、より親切かもしれませんね。
void setup(){
Serial.begin(9600); //シリアル通信を開始するための命令
pinMode(13,OUTPUT);
}
void loop(){
if(Serial.available() > 0){
char val = Serial.read();
Serial.print(val); //シリアルポートに受信した文字を返す
Serial.println(" is received.");
switch (val){
case 'H':
Serial.println("LED ON"); //Arduinoからの返事
digitalWrite(13,HIGH);
break;
case 'L':
Serial.println("LED OFF");
digitalWrite(13,LOW);
break;
default:
Serial.println("ERROR"); //想定していない文字に対してはERROR
break;
}
}
}
これで先ほどと同様にシリアルモニタから動作確認してみましょう。するとArduinoから返信が!操ってる感満載です!やったー!
まとめ
ここまででArduinoのシリアル通信の基本がつかめました。次回は2台のArduino同士でシリアル通信をしてみます。
Arduino UNOはAmazonでも買えます。
最初に買う参考書ならこちらがおススメ。