2013年6月8日土曜日

C言語でArduinoとシリアル通信してLEDを制御する

こんにちは。
C言語でArduinoとシリアル通信して制御する必要に駆られたのでサンプルプログラムを書いてみました。

まずはArduino側のプログラム

const int LED = 12;
int incomingByte = 0;   // for incoming serial data

void setup() {
        Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
        pinMode(LED,OUTPUT);
        digitalWrite(LED,LOW);
}

void loop() {

        // send data only when you receive data:
        if (Serial.available() > 0) {
                incomingByte = Serial.read();
                if(incomingByte == 1){
                  digitalWrite(LED,HIGH);
                }
        }
     
        delay(10);
}

Arduino側のプログラムではC言語のプログラムから送信されてきた数字を受信し、それがもし1であったらLEDを発光、そうでなかったら何もしない。

それに対してC言語側のプログラム

#include <windows .h>
#include <stdio .h>
#include <stdlib .h>

HANDLE arduino;
bool Ret;

void main(void){
 BYTE data = 1;
 //1.ポートをオープン
 arduino = CreateFile("COM7",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 //2014/01/22追記 これでつながらない場合には"\\\\.\\COM7"とするとつながるかもしれません。

 if(arduino == INVALID_HANDLE_VALUE){
  printf("PORT COULD NOT OPEN\n");
  system("PAUSE");
  exit(0);
 }
 //2.送受信バッファ初期化
 Ret = SetupComm(arduino,1024,1024);
 if(!Ret){
  printf("SET UP FAILED\n");
  CloseHandle(arduino);
  system("PAUSE");
  exit(0);
 }
 Ret = PurgeComm(arduino,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
 if(!Ret){
  printf("CLEAR FAILED\n");
  CloseHandle(arduino);
  exit(0);
 }
 //3.基本通信条件の設定
 DCB dcb;
 GetCommState(arduino,&dcb);
 dcb.DCBlength = sizeof(DCB);
 dcb.BaudRate = 9600;
 dcb.fBinary = TRUE;
 dcb.ByteSize = 8;
 dcb.fParity =NOPARITY;
 dcb.StopBits = ONESTOPBIT;

 Ret = SetCommState(arduino,&dcb);
 if(!Ret){
  printf("SetCommState FAILED\n");
  CloseHandle(arduino);
  system("PAUSE");
  exit(0);
 }
 //4.送信
 DWORD dwSendSize;
 DWORD dwErrorMask;
 
 Ret = WriteFile(arduino,&data,sizeof(data),&dwSendSize,NULL);
 if(!Ret){
  printf("SEND FAILED\n");
  CloseHandle(arduino);
  system("PAUSE");
  exit(0);
 }
 printf("FINISH\n");
 CloseHandle(arduino);
 system("PAUSE");
}

C言語側のプログラムでdataの値を1でなくするとプログラム実行時にLEDが発光しなくなることを確認することができました。
したがって、dataの値を指令値としてサーボモータの制御等に利用することができます。
ではまた!

参考にしたサイト

追記 2014/12/04 18:40
ArduinoからPCへデータを送信するC言語のプログラムはhttp://monitorgazer.blogspot.jp/2014/12/visualstudioarduinowin32cc.html
に書きました。


1 件のコメント:

  1. 失礼致しました。Amazonで日本のラズベリーパイを販売している林遠です。
    ブログを拝見しました。弊社のラズベリーパイ4bレビューブログ記事を書きしてくれませんか。
    こちらは無料でサンプルを提供します。
    連絡メールはjp02@vertue.cnです。
    御返事お待ちしております。どうぞよろしくお願いします。

    返信削除