【概要】
PC(Processing)からシリアル通信でコマンドを受けて、Arduino側でRCサーボモータを制御する。
RCサーボモータの電源+5VはArduinoからは取らずに、別途ACアダプターから供給する。
Processing側のプログラムはこちらを参照してください。(2012.3.11追記)
【シリアル通信コマンドのフォーマット】
【Arduino側のプログラム】
//注意:事情により”<”が全角になっているのでコピペして使うときは半角に直してください。(2012.3.11修正)
#include <Servo.h>
unsigned char incomingByte = 0; // for incoming serial data
unsigned char buff[30];
int RecvCount = 0;
int ParamLen = 0;
int ParamCount = 0;
Servo servo1;
Servo servo2;
Servo servo3;
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
servo1.attach(9);
servo2.attach(10);
servo3.attach(11);
}
void loop() {
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();
switch(RecvCount)
{
case 0:
ParamLen = 0;
ParamCount = 0;
if(incomingByte == 0xff) { // Headder
buff[RecvCount++] = incomingByte;
}
break;
case 1:
if(incomingByte == 0) { // ID
buff[RecvCount++] = incomingByte;
}
break;
case 2: // LENGTH
buff[RecvCount++] = incomingByte;
ParamLen = incomingByte;
break;
default:
if(ParamLen > 0) {
buff[RecvCount++] = incomingByte;
ParamCount++;
if(ParamCount >= ParamLen) {
ServoCmdExec();
RecvCount = 0;
}
} else {
RecvCount = 0;
}
break;
}
}
}
//注意:以下のコードは、事情により”<”が全角になっているのでコピペして使うときは半角に直してください。(2012.3.11修正)
void ServoCmdExec()
{
// buff[3] //CMD (not used)
if((buff[4] >= 0)&&(buff[4] <= 180))
servo1.write(buff[4]);
if((buff[5] >= 0)&&(buff[5] <= 180))
servo2.write(buff[5]);
if((buff[6] >= 0)&&(buff[6] <= 180))
servo3.write(buff[6]);
}
【参考回路】 (2013.6.20追記)
プログラムの内容は、ほぼ、理解してはおります。
この、rcサーボ回路についても、推測はつくのですが、自信持てません。回路結線についてご教示お願いできないでしょうか。実際に、作ってみたいのです。手描きの略図的なものでいいのですが。そのスキャンデータを公開いただくか、toraアットマークttst.comあてに、ご送付お願いできないでしょうか。よろしくお願いします。
参考回路を追記しましたのでそちらをご覧ください。