Ciao a tutti... dopo ore di sbattimento ho finalmente trovato il problema che affligge il mio script...
Vi spiego. Tutto il progettino (arduino + servo metore + sensore di distanza HC 04) è alimentato da un UBEC da 3A.
Le alimentazioni sono tutte separatamente collegate all'ubec, cioè il servo motore ha il 5v collegato all'ubec, il sensore ha il 5v collegato all'ubec, arduino ha il Vin collegato all'ubec. Insomma nessun componente prende dalla 5v di arduino.
Ovviamente tutte le masse sono collegate insieme e i 2 pin dati del sensore e il pin dati del servo motore sono collegati ad arduino.
Ebbene, nel momento in cui cambio la posizione del servo motore la lettura della distanza è sbagliata, risultando di molto inferiore al reale (5cm invece di 1m ad esempio), mentre quando il motore è fermo la lettura è corretta.
L'unico modo per non far presentare questo problema è collegare il servo motore ad un'alimentazione separata. E' come se quando il servo motore si muove il sensore non riceva la giusta energia e sbagli la misura (passatemi la frase). Il punto è che nel progetto finale non mi posso permettere un'alimentazione a parte... come posso fare?
Ho provato a collegare il sensore alla 5v di arduino invece che all'ubec ma il problema non si risolve...
Help
EDIT: SOLUZIONE!
Praticamente il servo motore quando in funzione crea delle fluttuazioni sulla linea 5v che nel mio caso (e in molti casi) è in comune con la 5v del sensore di distanza (ma il principio si applica anche ad altri sensori). Questo fa si che se leggete i valori proprio nel momento in cui il motore è in funzione (o tramite interrupts come ho fatto io) otterrete dei valori non reali. La soluzione perfortuna è molto semplice. E' sufficiente aggiungere un condensatore di disaccoppiamento il più vicino al servo motore, tra il pin 5v e il pin GND. Per il mio servo (sg90, il più diffuso) un valore corretto per il condensatore è di 470uF.
Ecco uno schemino dei collegamenti:
Brunello:
domanda:
Ma l'UBEC fornisce 5V e tu entri con questa tensione sul Vin ?
Suxsem:
Emh si perché? Quando alimentato da USB non è sempre 5v?
Perché se guardi lo schema della scheda vedi che il pin Vin entra a monte del regolatore a 5V della scheda per cui devi fornire un'alimentazione leggermente superiore affinché in uscita tu abbia i 5V stabili. Almeno 6,5/7 volt, per stare tranquillo. Ecco il dubbio di Brunello.
come ti ha detto anche Leo, sul Vin non puoi entrare con 5V, ma ne servono almeno circa 7v.
( oltretutto se avessi collegato anche la USB, se la tensione sul Vin e' minore di 6,6v , Arduino verrebbe alimentato attraverso la USB )
Ora, visto che con un alimentatore separato pare che ti funzioni bene, i problemi paiono venire proprio da un problema di alimentazione.
Quindi a occhio l'alimentatore non eroga abbastanza corrente.
Tu dici di aver un UBEC da 3A, ma visto che detto aggeggio non e' altro che un convertitore DC-DC, a cosa hai collegato l'UBEC ?
non mi dire ad una batteria da 9v
Post Scriptum : A me risulta che l'HC SR 04 abbia trigger ed echo separati, li' vedo un solo collegamento
Ciao grazie per la risposta
Allora, l'ubec è collegato ad un alimentatore da PC, quindi quello sicuramente non è un problema.
L'usb è scollegata quindi Arduino è alimentato dall'ubec.
Il sensore ha echo e trigger separati, nel disegno ne ho messo uno per semplificare.
A questo punto credo o che sia l'ubec il collo di bottiglia o che la corrente di spunto del motore causi delle oscillazioni che mi scatenano l'interrupt prima del dovuto (la distanza è letta attraverso un Interrupt associato al Pin echo... Quando il motore è fermo non ci sono problemi, se invece si inizia a muovere l'interrupt è scatenato prima del previsto)
Domani proverò a mettere un condensatore da 100uF vicino al servo motore e vediamo se attutisce queste oscillazioni. Altrimenti sto pensando di comprare un altro ubec da dedicare solo al servo motore ma sinceramente mi sembra un po' da stupidi...
Se avete altre ipotesi o prove da fare fatemelo sapere, grazie!
come immaginavo era un problema di accoppiamento elettrico, un bel condensatore da 470uF vicino all'header del servo motore ha risolto tutto!
Funziona anche con uno da 100uF ma con uno da 47uF no, quindi ho preferito inserirne uno da 470uF per avere un buon margine.
Quindi io in generale nelle varie guide per collegare servo motore OLTRE a dire di non collegarli alla 5v bisognerebbe dire di metterci un condensatore da 470uF o giù di lì il più vicino possibile al servo... perchè possono sorgere facilmente problemi.
Penso che non venga segnalato da molti perchè in generale un uso così intenso degli interrupts come quello che sto facendo io è raro e quindi il problema non si pone ma comunque è sempre avere il massimo disaccoppiamento elettrico.
EDIT: ho aggiornato il primo post con la mia soluzione