Discussione: costruire carro armato
Visualizza messaggio singolo
Vecchio 28 marzo 20, 15:46   #11 (permalink)  Top
Mrk89
User
 
L'avatar di Mrk89
 
Data registr.: 29-05-2006
Residenza: Catania
Messaggi: 2.933
Citazione:
Originalmente inviato da Ch3ch2oh Visualizza messaggio
Grazie! ho capito la logica delle miscelazioni ed in effetti è geniale (io avrò tante altre buone qualità ma proprio mi mancano queste intuizioni)

Però qualcosa non mi funziona, da serial monitor leggo i comandi della radio in modo corretto, sia i valori che le conversioni in % ma ho sempre un motore che gira in un senso e l'altro all'inverso. Agendo sugli stick non ci sono cambiamenti.

Sicuro ho scritto qualcosa di sbagliato, ho un sacco di dubbi anche dovuti alla ma scarsa conoscrnza della sintassi corretta.

Codice:
int channel_1_us;
int channel_2_us;
int channel_3_us;
int channel_4_us;
int channel_5_us;
int channel_6_us;

int channel_1_perc;
int channel_2_perc;
int channel_3_perc;
int channel_4_perc;
int channel_5_perc;
int channel_6_perc;


void loop() {

  //leggi la durata dell'impulso sui 6 pin
  channel_1_us = pulseIn (4, HIGH);
  channel_2_us = pulseIn (5, HIGH);
  channel_3_us = pulseIn (6, HIGH);
  //channel_4_us = pulseIn (5, HIGH);
  //channel_5_us = pulseIn (6, HIGH);
  //channel_6_us = pulseIn (7, HIGH);

  //limita la durata dell'impulso tra 1000 e 2000us e poi scalalo tra 0 e 100
  channel_1_perc = map(constrain(channel_1_us, 1000, 2000), 1000, 2000, 0, 100);
  channel_2_perc = map(constrain(channel_2_us, 1000, 2000), 1000, 2000, 0, 100);
  channel_3_perc = map(constrain(channel_3_us, 1000, 2000), 1000, 2000, 0, 100);
  channel_4_perc = map(constrain(channel_4_us, 1000, 2000), 1000, 2000, 0, 100);
  channel_5_perc = map(constrain(channel_5_us, 1000, 2000), 1000, 2000, 0, 100);
  channel_6_perc = map(constrain(channel_6_us, 1000, 2000), 1000, 2000, 0, 100);

  //stampa sul serial monitor i valori in microsecondi e in percentuale
  Serial.print("canale 1 microsec: ");
  Serial.println(channel_1_us);
  Serial.print("canale 1 %: ");
  Serial.println(channel_1_perc);

  Serial.print("canale 2 microsec: ");
  Serial.println(channel_2_us);
  Serial.print("canale 2 %: ");
  Serial.println(channel_2_perc);

  Serial.print("canale 3 microsec: ");
  Serial.println(channel_3_us);
  Serial.print("canale 3 %: ");
  Serial.println(channel_3_perc);

  Serial.print("canale 4 microsec: ");
  Serial.println(channel_4_us);
  Serial.print("canale 4 %: ");
  Serial.println(channel_4_perc);

  Serial.print("canale 5 microsec: ");
  Serial.println(channel_5_us);
  Serial.print("canale 5 %: ");
  Serial.println(channel_5_perc);

  Serial.print("canale 6 microsec: ");
  Serial.println(channel_6_us);
  Serial.print("canale 6 %: ");
  Serial.println(channel_6_perc);

  Serial.println("");

  delay (2000);
}
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 

int DIR_SX;
int DIR_DX;
int PWM_SX;
int PWM_DX;



void setup() {

    Serial.begin (9600);
  pinMode (4, INPUT);
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  //pinMode (5, INPUT);
  //pinMode (6, INPUT);
  //pinMode (7, INPUT);
  
  pinMode(pwm_a, OUTPUT);  //Set control pins to be outputs
  pinMode(pwm_b, OUTPUT);
  pinMode(dir_a, OUTPUT);
  pinMode(dir_b, OUTPUT);

  digitalWrite(dir_a, LOW); //per andare avanti 
  digitalWrite(dir_a, HIGH); //per andare indietro

  analogWrite(pwm_a, 127);  
  analogWrite(pwm_b, 127);
  

  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);

PWM_SX = channel_1_perc + channel_2_perc/1;
PWM_DX = channel_1_perc - channel_2_perc/1;

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);

  }
ah p.s. non voglio approfittare troppo del tuo tempo, non sertiti obbligato
Nel programma che hai scritto devi avere due procedure, setup() e loop().
Il setup viene eseguito una sola volta, mentre il loop viene eseguito di continuo all'infinito.
I comandi per regolare la velocità e la direzione dei motori devono andare dentro il loop.
Prova questo. Dovrebbe funzionare, ma hai parecchie limitazioni e dovresti pulire parecchio il software. Fammi sapere

Codice:
int channel_1_us;
int channel_2_us;
int channel_3_us;
int channel_4_us;
int channel_5_us;
int channel_6_us;

signed int channel_1_perc;
signed int channel_2_perc;
int channel_3_perc;
int channel_4_perc;
int channel_5_perc;
int channel_6_perc;

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 

int DIR_SX;
int DIR_DX;
signed int PWM_SX;
signed int PWM_DX;

void setup() {

  Serial.begin (9600);
  pinMode (4, INPUT);
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  //pinMode (5, INPUT);
  //pinMode (6, INPUT);
  //pinMode (7, INPUT);
  
  pinMode(pwm_a, OUTPUT);  //Set control pins to be outputs
  pinMode(pwm_b, OUTPUT);
  pinMode(dir_a, OUTPUT);
  pinMode(dir_b, OUTPUT);
}

void loop() {

  //leggi la durata dell'impulso sui 6 pin
  channel_1_us = pulseIn (4, HIGH);
  channel_2_us = pulseIn (5, HIGH);
  channel_3_us = pulseIn (6, HIGH);
  //channel_4_us = pulseIn (5, HIGH);
  //channel_5_us = pulseIn (6, HIGH);
  //channel_6_us = pulseIn (7, HIGH);

  //limita la durata dell'impulso tra 1000 e 2000us e poi scalalo tra 0 e 100
  //channel_1_perc = map(constrain(channel_1_us, 1000, 2000), 1000, 2000, 0, 100);
  //channel_2_perc = map(constrain(channel_2_us, 1000, 2000), 1000, 2000, 0, 100);
  channel_3_perc = map(constrain(channel_3_us, 1000, 2000), 1000, 2000, 0, 100);
  channel_4_perc = map(constrain(channel_4_us, 1000, 2000), 1000, 2000, 0, 100);
  channel_5_perc = map(constrain(channel_5_us, 1000, 2000), 1000, 2000, 0, 100);
  channel_6_perc = map(constrain(channel_6_us, 1000, 2000), 1000, 2000, 0, 100);

  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);

  PWM_SX = channel_1_perc + channel_2_perc/1;
  PWM_DX = channel_1_perc - channel_2_perc/1;

  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);

  //stampa sul serial monitor i valori in microsecondi e in percentuale
  Serial.print("canale 1 microsec: ");
  Serial.println(channel_1_us);
  Serial.print("canale 1 %: ");
  Serial.println(channel_1_perc);

  Serial.print("canale 2 microsec: ");
  Serial.println(channel_2_us);
  Serial.print("canale 2 %: ");
  Serial.println(channel_2_perc);

  Serial.print("canale 3 microsec: ");
  Serial.println(channel_3_us);
  Serial.print("canale 3 %: ");
  Serial.println(channel_3_perc);

  Serial.print("canale 4 microsec: ");
  Serial.println(channel_4_us);
  Serial.print("canale 4 %: ");
  Serial.println(channel_4_perc);

  Serial.print("canale 5 microsec: ");
  Serial.println(channel_5_us);
  Serial.print("canale 5 %: ");
  Serial.println(channel_5_perc);

  Serial.print("canale 6 microsec: ");
  Serial.println(channel_6_us);
  Serial.print("canale 6 %: ");
  Serial.println(channel_6_perc);

  Serial.println("");

  delay (2000);
}
__________________
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