Guarda, di seguito il codice di esempio che si trova nel sito che hai linkato tu:
Codice:
int pwm_a = 3; //PWM control for motor outputs 1 and 2
int pwm_b = 9; //PWM control for motor outputs 3 and 4
int dir_a = 2; //direction control for motor outputs 1 and 2
int dir_b = 8; //direction control for motor outputs 3 and 4
void setup()
{
pinMode(pwm_a, OUTPUT); //Set control pins to be outputs
pinMode(pwm_b, OUTPUT);
pinMode(dir_a, OUTPUT);
pinMode(dir_b, OUTPUT);
analogWrite(pwm_a, 100); //set both motors to run at (100/255 = 39)% duty cycle (slow)
analogWrite(pwm_b, 100);
}
void loop()
{
digitalWrite(dir_a, LOW);
digitalWrite(dir_b, LOW);
analogWrite(pwm_a, 50);
analogWrite(pwm_b, 50);
delay(1000);
analogWrite(pwm_a, 0);
analogWrite(pwm_b, 0);
delay(1000);
analogWrite(pwm_a, 150);
analogWrite(pwm_b, 150);
delay(1000);
analogWrite(pwm_a, 0);
analogWrite(pwm_b, 0);
delay(1000);
analogWrite(pwm_a, 255);
analogWrite(pwm_b, 255);
delay(1000);
analogWrite(pwm_a, 0);
analogWrite(pwm_b, 0);
delay(5000);
digitalWrite(dir_a, HIGH);
digitalWrite(dir_b, HIGH);
analogWrite(pwm_a, 50);
analogWrite(pwm_b, 50);
delay(1000);
analogWrite(pwm_a, 0);
analogWrite(pwm_b, 0);
delay(1000);
analogWrite(pwm_a, 150);
analogWrite(pwm_b, 150);
delay(1000);
analogWrite(pwm_a, 0);
analogWrite(pwm_b, 0);
delay(1000);
analogWrite(pwm_a, 255);
analogWrite(pwm_b, 255);
delay(1000);
analogWrite(pwm_a, 0);
analogWrite(pwm_b, 0);
delay(5000);
}
Assegnati i pin DIR (direzione) e PWM (controllo della velocità) in queste prime righe
Codice:
int pwm_a = 3; //PWM control for motor outputs 1 and 2
int pwm_b = 9; //PWM control for motor outputs 3 and 4
int dir_a = 2; //direction control for motor outputs 1 and 2
int dir_b = 8; //direction control for motor outputs 3 and 4
void setup()
{
pinMode(pwm_a, OUTPUT); //Set control pins to be outputs
pinMode(pwm_b, OUTPUT);
pinMode(dir_a, OUTPUT);
pinMode(dir_b, OUTPUT);
non ti resta che controllare la direzione dei due motori con:
Codice:
digitalWrite(dir_a, LOW); //per andare avanti
digitalWrite(dir_a, HIGH); //per andare indietro
e la velocità dei motori da a 0 a 255 (ESEMPIO: nelle righe appena sotto, i motori sono entrambi al 50% della loro velocità massima):
Codice:
analogWrite(pwm_a, 127);
analogWrite(pwm_b, 127);
I comandi sono simmetrici rispetto allo 0, quindi meglio mapparli così:
Codice:
channel_1_perc = map(constrain(channel_1_us, 1000, 2000), 1000, 2000, -100, 100);
channel_2_perc = map(constrain(channel_2_us, 1000, 2000), 1000, 2000, -100, 100);
Misceliamo i canali (se il raggio di sterzata dovesse essere troppo brusco, aumenta la divisione a fine rigo "/1;" ).
Codice:
PWM_SX = channel_1_perc + channel_2_perc/1;
PWM_DX = channel_1_perc - channel_2_perc/1;
Ora creiamo i valori da inviare alla scheda (0-255 e non 0-100).
La velocità è comunque un valore positivo, la direzione è da selezionare a parte:
Codice:
if (PWM_SX>=0){DIR_SX = 1;}else{DIR_SX = 0;};
PWM_SX = map(abs(constrain(PWM_SX, -100, 100)), 0, 100, 0, 255);
if (PWM_DX>=0){DIR_DX = 1;}else{DIR_DX = 0;};
PWM_DX = map(abs(constrain(PWM_SX, -100, 100)), 0, 100, 0, 255);
digitalWrite(dir_a, DIR_SX);
digitalWrite(dir_b, DIR_DX);
analogWrite(pwm_a, PWM_SX);
analogWrite(pwm_b, PWM_DX);
Questo è quanto...
Ci potrebbero essere degli errori di sintassi, non ho potuto testare il codice.
Inoltre, ci sono alcune cose migliorabili nel codice, ma lascio sperimentare te e poi ci sentiamo più avanti dopo che hai fatto qualche test. Vediamo se riesci a migliorare il tutto