Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Funzione map Arduino

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[1] Funzione map Arduino

Messaggioda Foto Utentelucaventimiglia » 15 mag 2016, 17:55

Salve a tutti,
spero di essere nella sezione giusta. In caso contrario, chiedo cortesemente agli Admin di spostare l'argomento nella sezione giusta. Ho già posto il problema direttamente sul forum di Arduino, ecco il thread:

"Vi spiego il mio problema sperando che riusciate a darmi una mano.
Devo fare un controllo proporzionale della velocità di un motore in corrente continua in funzione dei gradi letti da un accelerometro MPU6050. Ho scaricato la libreria I2cdev che mi ha permesso di visualizzare correttamente i valori dei gradi convertendo quelli grezzi che mi arrivavano dal sensore.
Siccome non so implementare i PID nel mio codice, ho deciso di fare da me un controllo proporzionale sfruttando la comoda funzione maps di Arduino: in pratica, nella funzione maps ho fatto la proporzione tra i gradi letti dal giroscopio e la velocità del motore.Per cambiare il verso e regolare la velocità del motore sto utilizzando un driver BTS7960 che ho correttamente interfacciato ad Arduino.
Per ragioni di lunghezza del codice, vi condivido solo la parte iniziale del loop, che poi è quella che secondo me ci interessa.
Codice: Seleziona tutto
void loop() {
  int vel;  //valore della velocità del motore                         

  float y=ypr[2] * 180/M_PI; // valore dell'angolo di Pitch/beccheggio che va da -90° fino a 90°

     if(buttonState==1) {
     if(y>=0) {// se l'angolo è positivo...
       vel=map(y, 0, 40, 50, 255);//fai la proporzione tra 0-40° da 50-255 di velocità del motore
       analogWrite(LPWM,vel);      //scrivi questo valore di velocità: il motore gira in un verso
       }
     if(y<0)  {  // se l'angolo è negativo...
       vel=map(y, 0, -40, 50, 255);//fai la proporzione tra 0-(-40°) da 50-255 di velocità del motore
       analogWrite(RPWM,vel);      //scrivi questo valore di velocità: il motore gira nell'altro verso
      }
}
else {analogWrite(RPWM,0);  analogWrite(LPWM,0); }
   

Siccome ho bisogno che il mio motore abbia una certa coppia all'inizio per far girare un carico prima in senso orario e poi in senso antiorario, nella funzione maps ho messo che per y>=0° e y<0°, il motore inizia già con una velocità di 50, in un senso se i gradi misurati sono per y>=0° e nell'altro senso se y<0°, in modo da avere quella spinta in più all'avviamento (spero di essermi spiegato).

In LPWM ed RPWM andranno scritti i valori da 0-255 che regoleranno la velocità del motore attraverso il driver motori.

Il mio problema è questo: il valore di velocità varia sempre da 0-255 anche se ho messo 50-255, cioè a più di 0 gradi il motore non inizia con una velocità di 50 ma sempre di 0: sebbene sul monitor seriale esca scritto che il valore di velocità che viene inviato al motore è effettivamente 50, ho notato che il motore a 1° non si muove proprio, mentre a velocità 50 dovrebbe già girare (ho provato a inserire anche valori più alti all'inizio fino e 120 ma niente!). Ho notato però che se inizio già inclinato di un tot di gradi (ad esempio +5°), quella proporzione mi vale e in effetti il motore gira alla velocità dettata dalla proporzione, ma, non appena voglio cambiare inclinazione facendola diventare negativa (ad esempio -5°), nel momento in cui passo oltre gli 0° per dirigermi verso gli angoli negativi, ecco che la proporzione non vale più e diventa di nuovo da 0-255. E' come se quel valore di 0° imponesse che la proporzione deve essere per forza 0-255 se ci passo attraverso (oddio ragazzi spero di non avervi confuso le idee...). Secondo voi quale potrebbe essere il problema? E' quel valore troppo preciso di 0° che mi dà problemi e non mi fa iniziare con una velocità di 50 per gradi superiori(o inferiori) a 0°? Oppure sono io che non so usare la funzione maps? Oppure la funzione maps permette di fare proporzione solo da 0 ad un valore generico(non credo proprio...)? Ho cercato di essere il più preciso possibile, se non avete compreso qualcosa chiedete pure. Spero che qualcuno abbia un'idea su quale possa essere il problema o su come, eventualmente, poterlo aggirare."
In realtà quelli del forum di Arduino mi hanno detto che il problema sta forse nel fatto che la funzione map lavora con numeri interi, mentre io sto utilizzando la variabile float y per leggere i valori di inclinazione. Quindi, mi hanno consigliato di convertire la variabile float y in una intera scrivendo questa riga di codice che mi permette di ottenere anche dei decimi di grado :
Codice: Seleziona tutto
vel = map(int(y * 10), 0, 400, 50, 255);

Ma ho già provato è il problema mi si ripresenta puntualmente.
Non voglio mancare di rispetto a nessuno ma credo che sentire più opinioni sia comunque una cosa buona. Anche perché sono in ritardo con i tempi di consegna in tutta onestà.
La mia applicazione è quella di uno skateboard self balancing ad una ruota, come già postai nella sezione "Elettronica generale" un po' di tempo fa, alla fine grazie ai consigli fornitomi riuscii a costruirmi da me il ponte H, ma ora sto utilizzando questo già fatto per fare le prove dato che ha già gli ingressi isolati.
Spero che a qualcuno venga un'idea, sono disperato. :(
Avatar utente
Foto Utentelucaventimiglia
50 3
New entry
New entry
 
Messaggi: 65
Iscritto il: 18 feb 2016, 0:25

1
voti

[2] Re: Funzione map Arduino

Messaggioda Foto Utentelucaventimiglia » 15 mag 2016, 19:28

Salve a tutti di nuovo,
ho risolto in questo modo. che non è del tutto corretto a livello ANALOGICO ma comunque per la mia applicazione va più che bene.
Vi condivido il codice con la speranza che aiuti anche gli altri che hanno il mio stesso problema:
Codice: Seleziona tutto
void loop() {
  int vel;
  int buttonState=digitalRead(button);
  float y=ypr[2] * 180/M_PI;
  Serial.print("                    y=   ");
  Serial.println(y);
  digitalWrite(R_EN,HIGH);
  digitalWrite(L_EN,HIGH);
     
     if(buttonState==1) {
     if(y>=2.00f) {
       
      // vel=map(y, 1, 41, 40, 200);
       vel = map(int(y * 10), 50, 400, 15, 255);
       analogWrite(LPWM,vel+50);
       //Serial.print("Destra");
       }
       else analogWrite(LPWM,0);
    if(y<-2.00f) {
       
      // vel=map(y, 1, -39, 40, 200);
        vel = map(int(y * 10), -50, -400, 15, 255);
       analogWrite(RPWM,vel+50);
       }
       else analogWrite(RPWM,0);
       }
       else  {analogWrite(RPWM,0); analogWrite(LPWM,0);}
       // Serial.print("Sinistra");

Ciao a tutti.
Avatar utente
Foto Utentelucaventimiglia
50 3
New entry
New entry
 
Messaggi: 65
Iscritto il: 18 feb 2016, 0:25

0
voti

[3] Re: Funzione map Arduino

Messaggioda Foto Utentealev » 15 mag 2016, 19:45

Discussione spostata in Arduino
Avatar utente
Foto Utentealev
5.990 2 9 12
free expert
 
Messaggi: 6282
Iscritto il: 19 lug 2010, 14:38
Località: Altrove


Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 18 ospiti