Arduinoと通信するPCアプリケーションの為の試作

f:id:naru-panda:20150221164013j:plain

Arduino

買いました。

電子工作クラスタでも電気屋でも情報屋でもありませんが、

諸事情により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への通信は細切れでバラバラと届くので、その辺りをうまく拾いとる実装が必要になります。