WiRC dispone di 4 uscite digitali e 4 ingressi digitali, i primi premendo i bottoni A,B,C e D si portano a livello logico 0 (GND) mentre i secondi
accendono il triangolino rosso vicino ai pulsanti, facendolo diventare verde, quando sono corto-circuitati a massa (GND).
In questo modo puoi comandare dei led sul tuo rover o altri attrezzi di cui lo hai dotato. Il carico che puoi collegarvi è ridotto ed inoltre potrebbe esserti più utile rilevare la pressione di uno dei bottoni da parte di Arduino per interagire con lo sketch ed impartire comandi ad Arduino e non al modellino controllato.
Con questa idea in mente ho iniziato a fare degli esperimenti per rilevare la pressione dei pulsanti, dapprima collegando solo dei led come da schema WiRC:
poi aggiungendo anche il collegamento ad arduino.
Inizialmente avrei voluto collegare i 4 output digitali a 4 ingressi digitali aspettandomi come risultato il cambio di valore da HIGH a LOW alla pressione di ciascun bottone. Purtroppo non ci sono riuscito, ho scritto alla Dension, casa produttrice del WiRC, per chiedere informazioni in merito al tipo di segnale digitale in uscita, anche se output digitale per me significa 0 o 1, ad oggi non ho ricevuto risposta.
Ho collegato allora i 4 pin a 4 ingressi analogici di Arduino e … miracolo … vedo delle variazioni di segnale tra la pressione del bottone e il valore letto dall’ADC di Arduino.
Notice
Digressione: la variazione che sono riuscito a rilevare sugli ingressi analogici è 0-255 e siccome sai che il convertitore di arduino è un 10 bit ( 0-1023 ) questo significa che siamo a 1/4 dei valori rilevabili.
Su una scala 0-5v ottieni 5v/1024 = 0,00488v => 4,88mV circa per ogni step del convertitore analogico digitale da cui puoi ricavare la variazione in millivolt rilevata da Arduino sui terminali analogici: 255 * 4,88 = 1244,4mV che in volt significa 1244,4 / 1000 = 1,24v forse è questo il motivo per cui collegando ai pin digitali le uscite del WiRC rilevi sempre 0, ossia LOW, non supera mai i 2,5 valore TTL di soglia.
Ho contattato la dension, produttore del WiRC, chiedendo loro se la mia considerazione fosse vera e i dati rilavati corretti.
Mi hanno risposto in questi giorni inviandomi due schemi relativi il primo alle uscite digitali 1,2 e 3:
ed il secondo relativo all’uscita 4:
entrambi gli schemi hanno in comune il voltaggio: 3,3v il che significa che i valori rilevati dal convertitore analogico di Arduino non sono completamente errati ma solo riferiti ad un voltaggio errato, per far lavorare il convertitore in modo corretto devi connettere il pin 3V3 di Arduino al pin AREF in modo che la tensione di riferimento dell’ADC sia 3,3v
La differenza tra le uscite 1,2,3 e 4 del WiRC è che l’ultima uscita presenta un partitore costituito da due resistenze da 10Kohm di cui dovrai tener conto quando progetterai il circuito di interfaccia, ad esempio un semplice led resterà lievemente accesso anche se l’uscita è disabilitata.
Lo schema di collegamento al WiRC
Il collegamento che ho utilizzato è il seguente:
come vedi ho connesso sia i led come da schema originale sia arduino. In questa configurazione potrai vedere sia i led accendersi sia rilevare il valore analogico sui pin A5,A4,A3 e A2 di arduino.
Lo sketch di controllo delle uscite digitali
L’esperimento non sarebbe completo senza lo sketch con cui puoi gestire la lettura dei valori, troverai all’interno anche le linee di codice del precedente articolo, che non commento perché puoi leggerle li:
int pinX = 7; int pinY = 8; int dInA = A5; int dInB = A4; int dInC = A3; int dInD = A2; unsigned long durationX; unsigned long durationY; int sInA = 0; int sInB = 0; int sInC = 0; int sInD = 0; void setup() { Serial.begin( 9600 ); pinMode(pinX, INPUT); pinMode(pinY, INPUT); pinMode(dInA, INPUT); pinMode(dInB, INPUT); pinMode(dInC, INPUT); pinMode(dInD, INPUT); } void loop() { durationX = pulseIn(pinX, HIGH); durationY = pulseIn(pinY, HIGH); sInA = analogRead( dInA ); sInB = analogRead( dInB ); sInC = analogRead( dInC ); sInD = analogRead( dInD ); Serial.print( "X: " ); Serial.print( durationX ); Serial.print( " Y: " ); Serial.print( durationY ); Serial.print( " dInA: " ); Serial.print( sInA ); Serial.print( " dInB: " ); Serial.print( sInB ); Serial.print( " dInC: " ); Serial.print( sInC ); Serial.print( " dInD: " ); Serial.println( sInD ); delay (500); }
Inizia dalle linee 03-06: in cui definisci i pin analogici a cui hai collegato le 4 uscite digitali;
linee 10-13: definisci 4 variabili di tipo integer in ciascuna delle quali memorizzerai il valore analogico letto sul pin corrispondente;
linee 20-23: imposta i pin analogici definiti alle linee 03-06 in modalità INPUT;
linee 30-33: per ciascun pin analogico leggi il valore con il comando analogRead() e memorizzalo nella variabile corrispondente;
linee 39-46: scrivi sul monitor seriale i valori letti per ciascuna uscita digitale.
Il Video dimostrativo del WiRC
come per gli altri articoli ho realizzato un video in cui puoi vedere la demo dello sketch e i valori del WiRC che ho rilevato con Arduino, oltre all’accensione dei 4 led:
nel video è abbastanza chiaro che la pressione di un qualsiasi dei 4 bottoni porta a 0 il valore analogico letto da Arduino, mentre ripremendo i bottoni i valori letti tornano a 255.
Se guardi attentamente noterai che uno dei 4 segnali è sempre a 0, il segnale connesso all’uscita 4 o D questo comportamento è dovuto al partitore formato dalla due resistenze da 10KΩ, il led connesso a questa uscita resta sempre leggermente acceso, anche se varia notevolmente la sua luminosità alla pressione del bottone.
Ho in mente di utilizzare degli optoisolatori connessi a queste uscite per commutare l’accensione del led in un contatto digitale rilevabile da Arduino.
Buon divertimento !!!
Prima di inserire un commento, per favore, leggi il regolamento
13 pings
Skip to comment form