ArduinoによるPWM制御およびアナログ信号のシリアル通信による受信

win32apiってすごいですよね。

2001年に販売された本をまだ現役で使っています。

いつまでサポートされるんだろう?

今はwindows 8を使用していますが、自分が趣味で使用する範囲ではバリバリ動く。

新しいAPIを覚えるのはめんどくさいからなくならないでほしいな。

 

さて、そんなwin32apiを使用して、データのArduinoへ送信しPWM制御とアナログ信号の受信を行いました。 スレッドを使って、ボタン入力からデータの受信と送信を行います。 

f:id:iroha112233:20151021224702j:plain

↑コンソール側制御GUI

 

 //コンソール側のプログラムの一部

//MainClass内のデータ制御用スレッドの作成

DWORD WINAPI ThreadFunc(LPVOID vdParam)
{
MSG ThredFuncMsg;
bool Flag = TRUE;//無限ループを抜けるためのフラグ


ArduinoDrawing *deg2 = new ArduinoDrawing();//Arduino制御用クラスのインスタンス
HDC hdc = GetDC((HWND)vdParam);


while (Flag)
{
PeekMessage(&ThredFuncMsg, NULL, 0, 0, PM_REMOVE);//メッセージ確認およびキューからの削除
switch (ThredFuncMsg.message) {
case WM_SURE_TEST1://■ボタンが押されたらループから抜ける
{
Flag = FALSE;
break;
}
case WM_SURE_TEST2://speedupボタンが押されたら1を送信
{
deg2->SendingControl(1); //()内は送信用データ
PostThreadMessage(dwID, WM_SURE_TEST4, 0, 0);
break;
}
case WM_SURE_TEST3://speeddownボタンが押されたら2を送信
{
deg2->SendingControl(2); //()内は送信用データ
PostThreadMessage(dwID, WM_SURE_TEST4, 0, 0);
break;
}
case WM_SURE_TEST4://アナログデータの受信
{
deg2->TxMain((HWND)vdParam, hdc);
PostThreadMessage(dwID, WM_SURE_TEST4, 0, 0);
break;
}

default://三角ボタンが押されたらアナログデータの受信を開始。
{
deg2->TxMain((HWND)vdParam, hdc);
break;
}
}
}

ReleaseDC((HWND)vdParam, hdc);
//delete deg2; // <- ここでdeleteするとヒープ破壊のエラーが生じてしまう。どしよ・・・。

ExitThread(0);
}

 

Arduinoプログラム

/*

This code is used for rover program to control arduino 
2015/10/21
*/
const int LED = 11;
int incomingByte = 0; // for incoming serial data
int roverSpeed = 128;

// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
pinMode(LED,OUTPUT);
digitalWrite(LED,LOW);
}

void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);

// print out the value you read:
Serial.print(sensorValue);
Serial.print('\0');



if (Serial.available() > 0) {
incomingByte = Serial.read();
if(incomingByte == 1){
roverSpeed = roverSpeed + 16;
if(roverSpeed > 255) roverSpeed = 255;
analogWrite(LED,roverSpeed);
}

if(incomingByte == 2){
roverSpeed = roverSpeed - 16;
if(roverSpeed < 0) roverSpeed = 0;
analogWrite(LED,roverSpeed);
}
}

delay(100); // delay in between reads for stability
}

 

コンソールから1が入力された場合、16/256スピードアップ

コンソールから2が入力された場合、16/256スピードダウン

実験結果が下の写真になります。

DCモーターの代わりにLEDを使用し、ADC入力は圧力センサを接続しています。

コンソールGUIに表示されている内容が、ADC出力です。

SPEED UPボタンを押す度に光量が大きくなっていることがわかります。

あとはこれをモーターに変えれば良いハズ・・・。

 

 

f:id:iroha112233:20151021224713j:plain

f:id:iroha112233:20151021224717j:plain

f:id:iroha112233:20151021224707j:plain

~参考~

・web

http://monitorgazer.blogspot.jp/2013/06/carduinoled.html

http://www.japanese-makers.com/archives/157

・書籍

Win32 API 完璧マスタ