Arduinoと通信するPCアプリケーションの為の試作
買いました。
電子工作クラスタでも電気屋でも情報屋でもありませんが、
諸事情によりArdinoを触る機会に恵まれましたので購入しました。
※写真のものは、Arduino Unoの互換品らしいです。詳しいこと分かりません。
ArdinoUnoとPCがUSBシリアルポートで通信して、
文字列を送ったり返したりできるサンプルコードを書きましたので、紹介します。
【実装の目的】
ArdinoIDEのシリアルモニタとやってることは変わりませんが、
独自のアプリケーションにArdinoとシリアル通信する機能をつけたい場合を想定しています。
将来的には、Rasberry Piを母艦にして、複数のArdinoを小間使いに使う(制御する)構成を作るために書いたコードです。(なので、PCはUbuntu Linuxを使いました。)
【実装の条件】
・ArdinoUnoまたは互換機と通信します。
・PC側の環境はUbuntu Linuxを利用しています。
・Ardinoのポート(?)は、/dev/ttyACM1とします。
・言語はBetter-C
【試作品の挙動】
whatyournameとテキストをaurduinoに投げたら、aurduinoが自分の名前を返してくれる。複数のaurduinoが接続して、個体を認識する状況を想定。
【参考文献】
シリアル通信をおこなうプログラムを作成するには? | 組み込みLinuxのArmadilloサイト
Linuxでシリアル通信しようとしたら引っかかった - 明日から本気出す( ´・ω・`)
ArduinoとMacでシリアル通信(C言語) - まりぴよこのブログ
【PC側ソースコード】
【Ardino側ソースコード(スケッチっていうの?)】
#define IFDEBUG false void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(13, OUTPUT); } void loop() { // put your main code here, to run repeatedly: char c; char s[256]; char whatyournamecmd[] = "whatyourname"; int i; for (i = 0; i < 256; i++) s[i] = (char)NULL; if (Serial.available() > 0) { for (i = 0; i < 255; i++ && s[i] != '') s[i] = Serial.read(); if (strncmp(whatyournamecmd, s, strlen(whatyournamecmd)) == 0) { if(IFDEBUG)digitalWrite(13, HIGH); //messegewrite(myname()); Serial.write("Ardino #01 "); } } delay(500); if(IFDEBUG)digitalWrite(13, LOW); }
こんな感じになりました。
【解説】
int serial_ardinowrite(char *devicename,char *messege)
文字列をArdinoに送る関数
devicename: /dev/ttyACM1とか
messege:送るメッセージ
int serial_ardinoread(char *devicename,char *messege);
Ardinoから文字列を受け取る関数
*messegeにaurduinoからかえってきた文字列を入れる。
通信する文字列は225バイト未満とし、aurduinoからかえってくる文字列は改行コードで終わるものとする。(改行コードはserial_ardiunoread関数内で消してから返す)
基本的なことは参考文献に書いてあります。
シリアル通信をおこなうプログラムを作成するには? | 組み込みLinuxのArmadilloサイト
のコードをベースに、ポートの設定であったり9600bps固定の設定など、詳しく書いてない点は
Linuxでシリアル通信しようとしたら引っかかった - 明日から本気出す( ´・ω・`)
から、
aurduinoからデータを受取る際の要点については
ArduinoとMacでシリアル通信(C言語) - まりぴよこのブログ
に書いてありました。
Arduonoでシリアル通信から文字列を拾うのはSerial.read()で大したこと無いから良いですが、ArduinoからPCへの通信は細切れでバラバラと届くので、その辺りをうまく拾いとる実装が必要になります。