Thanks.
The code is here. It doesn't use the readString(),
#include <VirtualWire.h>
//motor A connected between A01 and A02
//motor B connected between B01 and B02
int STBY = 10; //standby //// An integer (more commonly called an int) is a number without a decimal point.
//Motor A
int PWMA = 3; //Speed control
int AIN1 = 9; //Direction
int AIN2 = 8; //Direction
//Motor B
int PWMB = 5; //Speed control
int BIN1 = 6; //Direction
int BIN2 = 16; //Direction ////WAS16
const boolean FORWARD = HIGH; //
const boolean REVERSE = LOW;
float speed_Max = 255; //
float speed_Min = 0;
float analogInput_Max = 1023; ////
float analogInput_Min = 0;
float analogInput_Middle_X = 515;//
float analogInput_Middle_Y = 495;//
float deadBand = 0;
float middleMax = (analogInput_Max / 2) + deadBand;
float middleMin = (analogInput_Max / 2) - deadBand;
boolean pastDirection = FORWARD;
void setup(){
Serial.begin( 9600 );
pinMode(STBY, OUTPUT); //
pinMode(PWMA, OUTPUT);
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(PWMB, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
//receiver setup
vw_set_rx_pin(2); //
vw_set_ptt_inverted(true); //
vw_setup(2000); // Bits per sec
vw_rx_start(); //
}
void loop(){
uint8_t buf[VW_MAX_MESSAGE_LEN]; //
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;
int column = 0;
String message;
int commands[30];
// Message with a good checksum received, dump it.
for (i = 0; i < buflen; i++)
{
//DEBUG:
if(char(buf[i]) == '|'){ //
commands[column] = message.toInt();
message = "";
column++;
}else{
message += char(buf[i]);
}
}
//one more time to capture the last value since the message does not end with |
commands[column] = message.toInt();
// DEBUG
// Serial.print("X: ");
// Serial.print(commands[0]);
// Serial.print(" Y: ");
// Serial.println(commands[1]);
motorControl(commands[0], commands[1]);
}
}
void move(int motor, int speed, boolean direction){
digitalWrite(STBY, HIGH); //disable standby //
if(motor == 1){
digitalWrite(AIN1, direction);
digitalWrite(AIN2, !direction);
analogWrite(PWMA, speed); ///
}else{
digitalWrite(BIN1, !direction);
digitalWrite(BIN2, direction);
analogWrite(PWMB, speed);
}
}
void motorControl(float x, float y) {
boolean currentDirection = y >= analogInput_Middle_Y;
//map(value, fromLow, fromHigh, toLow, toHigh);
if(currentDirection == REVERSE){
y = map(y, analogInput_Middle_Y, analogInput_Min, speed_Min, speed_Max) ;
}else{
y = map(y, analogInput_Middle_Y, analogInput_Max, speed_Min, speed_Max);
}
int subtractFromLeft = map(x, analogInput_Middle_X, analogInput_Min, speed_Min, y);
int subtractFromRight = map(x, analogInput_Middle_X, analogInput_Max, speed_Min, y);
if(subtractFromRight < 0){
subtractFromRight = 0;
}
if(subtractFromLeft < 0){
subtractFromLeft = 0;
}
int Throttle_RIGHT = y - subtractFromRight;
int Throttle_LEFT = y - subtractFromLeft;
boolean currentDirection_LEFT = currentDirection;
boolean currentDirection_RIGHT = currentDirection;
if(Throttle_LEFT < 1 && Throttle_RIGHT > 1){
currentDirection_LEFT = !currentDirection; ////如果值为true,则!运算后为false
Throttle_LEFT = Throttle_RIGHT;
}
if(Throttle_RIGHT < 1 && Throttle_LEFT > 1){
currentDirection_RIGHT = !currentDirection;
Throttle_RIGHT = Throttle_LEFT;
}
move(1, Throttle_LEFT, currentDirection_LEFT);
move(2, Throttle_RIGHT, currentDirection_RIGHT);
}