Salve a tutti,
volevo sottoporre alla comunità una problematica che mi si è presentata durante la costruzione di un prototipo di robot. Premetto che ho preso spunto dal robot presentato in questo sito, il robottino domotico. Il mio sitema è dotato di:
- una coppia di motori con encoder+ ruote;
- un driver con pilotaggio tramite bus I2C;
- un sensore di distanza ad ultrasuoni (SRF08) sempre su bus I2C;
- un servo (+90° -90°) che sostiene il sensore;
- una scheda Freedon II;
- un pacco batterie;
- una struttura meccanica per provare.
Inizalmente ho collegato il sensore in maniera fissa, senza servo, e sono riuscito a fare andare il robot, infatti ogni volta che veniva visto un ostacolo dal sensore, il robot ruotando provvedeva ad evitarlo.
Funzionava in maniera accettabile, anche se bisognava regolare tempi e velocità in base agli ambienti in cui doveva muoversi.
Come avevo anticipato prendendo spunto da robottino domotico, ho comprato un servo, e vi ho montato sopra il sensore ad ultrasuoni. Per far ruoatare il servo ho pensato di usare il timer0 e ad ogni overflow di chiamare l'interrupt, in questo modo regolando il contenuto dei registri TMR0H e TMR0L riesco a gestire la durata degli impulsi e quindi il servo lo posiziono a 0°, 90° e 180°.
Ad ogni posizionamento del servo provvedo a leggere il sensore ad ultrasuoni e a memorizzare i valori letti su tre variabili (dist_F, dist_Dx e dist_SX), infine elaboro con degli IF la situazione delle distanze e provvedo a pilotare il driver dei motori.
E qui le cose cominciano a funzionare male, i motori girano seguendo delle logiche non sempre corrispondenti a quelle impostate.
Faccio presente che motori e sensore più servo in maniera indipendente funzionano correttamente, nella programmazione ho usato le librerie di Laurtec (delay e eepromi2c, quest'ultima adattata perchè nel mio caso sensore e driver hanno un indirizzo ad un solo byte).
Ho il sospetto che se durante l'esecuzione delle funzioni dei comandi I2C si presenta un interrupt del servo il comando I2C, non funzioni correttamente, quindi situazione casuale.
Ho provato ad inibire gli interrupt, durante i comandi I2C, però in questo modo il servo non è controllato regolarmente.
Qualcuno che per caso avesse affrontato un caso simile potrebbe gentilmente darmi qualche consiglio.
Grazie anticipatamente.