Salve a tutti,
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.
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(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
}
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.