ソースをダウンロード
以前、ここで紹介した方法では、1つのモーターしか動かせなかった。
今回は、2つのモータの速度を変更するために、
ArduinoのanalogWrite()関数を使って変更することにした。
analogWrite()は、基盤にPWMと書いてあるポートが使える。

PWMとか書かれていないピンを使いたいときは、前回と同じ方法で、
HIGHとLOWをコントロールする必要がある。
今回は、ポートの9と10を使うことにした。
前回と違うところは、analogWrite()は0~255までしか扱えないので、
送信するデータを3桁に変更。
データの形式は、
s(ヘッダー) + 1つ目のデータ + 2つめのデータ
とした。
arduinoのソース
int motor1Pin1 = 4; // モータ1入力ピン
int motor1Pin2 = 5; // モータ1入力ピン
int motor2Pin1 = 6; // モータ2入力ピン
int motor2Pin2 = 7; // モータ2入力ピン
int speedPin1 = 9; // モータ1速度調整ピン
int speedPin2 = 10; // モータ2速度調整ピン
int keta, sum, count; // データ受信用
int speed1 = 0; // モータ1の速度
int speed2 = 0; // モータ2の速度
char cwFlg1 = 'c'; // モータ1の回転方向
char cwFlg2 = 'c'; // モータ3の回転方向
const int KETAMAX = 3; // 受信桁数
void setup() {
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
pinMode(motor2Pin1, OUTPUT);
pinMode(motor2Pin2, OUTPUT);
Serial.begin(9600);
}
void loop() {
//------------------------- データ受信
if(Serial.available()>0){ // データが来た
int val = Serial.read();
if(val == 's'){ // ヘッダー受信
count = 0; // データカウンター初期化
}else if(val == 'c' || val == 'n'){ // データのはじめ
if(count == 0){cwFlg1 = val;} // 回転方向
else {cwFlg2 = val;}
count++;
keta = KETAMAX; // 桁数初期化
sum = 0;
}else{ // 数値データ
val -= 48; // アスキー→数値に変換
for(int i=1; i < keta; i++){// 桁数を計算
val *= 10;
}
sum += val;
keta --;
if(keta == 0){ // すべてのデータ受信終了
if(count==1){ // モータ1の速度
speed1 = constrain(sum, 0, 255); // オーバーフローする値を切り捨て
}else{ // モータ2の速度
speed2 = constrain(sum, 0, 255); // オーバーフローする値を切り捨て
}
}
}
}
//------------------------- モータ動作
// 停止、回転方向をチェック
// モータ1
if(speed1 == 0){ // モータ停止
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, LOW);
}else if(cwFlg1 == 'c'){ // 時計回転
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
}else{ // 反時計回転
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, HIGH);
}
// モータ2
if(speed2 == 0){ // モータ停止
digitalWrite(motor2Pin1, LOW);
digitalWrite(motor2Pin2, LOW);
}else if(cwFlg2 == 'c'){ // 時計回転
digitalWrite(motor2Pin1, HIGH);
digitalWrite(motor2Pin2, LOW);
}else{ // 反時計回転
digitalWrite(motor2Pin1, LOW);
digitalWrite(motor2Pin2, HIGH);
}
// モータの速度調整
analogWrite(speedPin1, speed1);
analogWrite(speedPin2, speed2);
}