無線ラジコンの動作改善
解決したいこと
IM920sLとarduinoを使って無線のラジコン(オムニホイール3駆)を作ったのですが、動きが不安定で困っています。
やっていることとしては、
送信側では4つのボタンを使い、それぞれ文字列を送信しています。
受信側は文字列を受信するとそれを符号ありの10進数に直し、分岐でモーターを制御しています。
ですがボタンを押し続けても、ほんの少し進んでは止まる、という動作を繰り返しています。
何かを受信したら100、そうでなかったら0としてシリアルプロッタに表示してみたところ下の画像のようになり、送信側で長押ししていても受信側では一定間隔で何も受信していない状態になっているようでした。↓
どうすれば改善できるか、教えてください。
(モーター制御はL293Dモータードライバシールドを使用しています)
該当するソースコード
送信
#include <SoftwareSerial.h>
SoftwareSerial IM920Serial(8, 9); // RX, TX
int busy;
void setup() {
IM920Serial.begin(19200);
Serial.begin(19200);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
pinMode(10, INPUT);
}
void loop() {
do {
busy = digitalRead(10);
} while (busy != 0);
if (digitalRead(4) == LOW) {
IM920Serial.print("TXDU 0002,AA\r\n");
Serial.println("AA send");
}
if (digitalRead(5) == LOW) {
IM920Serial.print("TXDU 0002,BB\r\n");
Serial.println("BB send");
}
if (digitalRead(6) == LOW) {
IM920Serial.print("TXDU 0002,CC\r\n");
Serial.println("CC send");
}
if (digitalRead(7) == LOW) {
IM920Serial.print("TXDU 0002,DD\r\n");
Serial.println("DD send");
}
delay(50);
}
受信
#include <SoftwareSerial.h>
#include <AFMotor.h>
#define m1SPEED 128
#define m2SPEED 128
#define m3SPEED 140
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
SoftwareSerial IM920Serial(A4, A5); // RX, TX
signed char num2;
void setup() {
Serial.begin(19200);
IM920Serial.begin(19200);
motor1.setSpeed(m1SPEED);
motor2.setSpeed(m2SPEED);
motor3.setSpeed(m3SPEED);
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(RELEASE);
pinMode(10, INPUT);
}
void loop() {
int busy;
do {
busy = digitalRead(10);
} while (busy != 0);
if (IM920Serial.available()) { //データが送られてきたら
String input = IM920Serial.readStringUntil('\n'); //シリアル値をString型で読み取る
Serial.println(input); //読み取った文字列を出力
String rs = input.substring(11, 13); //読み取った文字列の一部を文字列として切り出し
char Buf[50];
rs.toCharArray(Buf, 50);
int num = strtol(Buf, NULL, 16); //16進数→10進数に変換
num2 = num;
switch (num2) {
case -86: //前進
motor1.run(RELEASE);
motor2.run(FORWARD);
motor3.run(BACKWARD);
break;
case -69: //左旋回
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor3.run(BACKWARD);
break;
case -52: //右旋回
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(FORWARD);
break;
case -35: //後退
motor1.run(RELEASE);
motor2.run(BACKWARD);
motor3.run(FORWARD);
break;
default:
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(RELEASE);
break;
}
} else {
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(RELEASE);
}
delay(50);
}