Discussione: costruire carro armato
Visualizza messaggio singolo
Vecchio 27 marzo 20, 21:49   #9 (permalink)  Top
Mrk89
User
 
L'avatar di Mrk89
 
Data registr.: 29-05-2006
Residenza: Catania
Messaggi: 2.933
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
__________________
Il filo attaccato all'antenna non mente mai....Troppo vento, si torna a casa....
I miei circuiti elettronici autocostruiti: Postbruciatore per ventole intubate ; Circuito luci per aeromodello-elimodello ; Rallenta servo con protezione da corto circuito
Mrk89 non è collegato   Rispondi citando