Salve, dovrei simulare la pressione di un tasto su raspberry utilizzando un sensore a infrarosso(il sensore che utilizzo è un sensore che rileva un input quando avvicino un oggetto) ho provato a scrivere il codice, ma non ha funzionato
Il codice è il seguente
#define sensore 4
byte val = HIGH;
byte val_old = HIGH;
void setup() {
pinMode(sensore, INPUT);
}
void loop() {
val = digitalRead(sensore);
if ((val_old == HIGH) && (val == LOW)) {
// si è avvicinata la mano
val_old = val;
pinMode (10, OUTPUT);
delay (300);
pinMode (10, INPUT);;
}
}
L'uscita 10 "effettua la simulazione di pressione", non riesco a capire dov'è che sbaglio
SukkoPera:
Ma scusa, nell'altro thread non dicevi che avevi il problema che ti rilevava invece troppe pressioni?!? :o
Ciao, se leggi bene, nell'altro thread ho provato utilizzando una fotoresistenza, ho abbandonato quest'ultima in quanto l'influenza della luce ambientale è troppa, quindi ho deciso di utilizzare un sensore ir trasmettitore-ricevitore
OK, capito. Ti suggerisco di procedere con un problema alla volta: fai prima uno sketch in cui leggi solo il sensore IR e stampi quel che esce, e vedi se corrisponde a quello che ti aspetti. Se va bene, allora aggiungi la parte per pilotare il pulsante e prosegui così fino alla fine.
Se ho capito bene la simulazione della pressione di un tasto consiste nel portare LOW il pin10 quando un oggetto è posto davanti all'infrarosso e nel riportarlo HIGH quando l'oggetto NON è più davanti all'infrarosso. Ma se è così non è più semplice riportare sul pin10 la lettura del pin4? Una cosa così:
Occhio che dall'altra parte c'è un Raspi, che funzia a 3.3V. Lo "strano" pilotaggio dell'uscita era per evitare di usare hardware esterno per la traduzione dei livelli. E funzionava!
Giusto per chiarezza: Miriam, con le soluzioni proposte NON puoi collegare direttamente Arduino e Raspberry.
Giusto per prova, la parte che rileva l'oggetto prova a farla cosi:
void loop()
{
val = digitalRead(sensore_infrarosso);
if ((val_old != val) && (val == LOW)) //oggetto davanti al sensore
{
... istruzioni del pin uscita
val_old = val;
}
if ((val_old != val) && (val == LOW)) //oggetto allontanato
{
val_old = val;
}
}
Il primo if viene eseguito una sola volta nel momento in cui l'oggetto viene rilevato, poi NON viene piu eseguito finche' l'oggetto non se ne va e ritorna di nuovo (perche' val_old non e' piu diverso da val finche' non viene resettato dal secondo if), il secondo if allo stesso modo viene eseguito solo una volta quando l'oggetto si allontana dal sensore ... a proposito, le istruzioni del pin di uscita dovrebbero essere digitalWrite, non pinmode ...
SukkoPera: ovviamente va usato un partitore resistivo per la connessione dei due ... meglio non rischiare comunque, date le differenze di alimentazione
Si, dato che e' unidirezionale, ti basta un partitore di tensione (due resistenze, 1800 ohm fra il pin di arduino e quello della raspberry, 3300 ohm fra il pin della raspberry e massa, le due masse ovviamente in comune)
Etemenanki:
Si, dato che e' unidirezionale, ti basta un partitore di tensione (due resistenze, 1800 ohm fra il pin di arduino e quello della raspberry, 3300 ohm fra il pin della raspberry e massa, le due masse ovviamente in comune)
Non ho ben capito come devo collegarle, mi sono persa di quando parli della seconda resistenza.
La prima da 1800ohm ho capito che va collegata tra il pin di arduino(che genera l'output) e raspberry(che riceve input)
poi non ho capito la seconda come va collegata
ed infine devo collegare gnd di arduino a gnd di raspberry
la seconda, fra il pin della raspberry ed il GND (quale e' indifferente, perche' sono in comune i due GND, per comodita' collegala a quello della raspberry)
Non riesco a far funzionare il sensore a infrarossi in nessun modo, potrebbe essere che funziona attraverso l'input analogico? Il sensore in questione è un POLOLU GP2Y0D810Z0F
Etemenanki:
Giusto per prova, la parte che rileva l'oggetto prova a farla cosi:
void loop()
{
val = digitalRead(sensore_infrarosso);
if ((val_old != val) && (val == LOW)) //oggetto davanti al sensore
{
... istruzioni del pin uscita
val_old = val;
}
if ((val_old != val) && (val == LOW)) //oggetto allontanato
{
val_old = val;
}
}
Il primo if viene eseguito una sola volta nel momento in cui l'oggetto viene rilevato, poi NON viene piu eseguito finche' l'oggetto non se ne va e ritorna di nuovo (perche' val_old non e' piu diverso da val finche' non viene resettato dal secondo if), il secondo if allo stesso modo viene eseguito solo una volta quando l'oggetto si allontana dal sensore ... a proposito, le istruzioni del pin di uscita dovrebbero essere digitalWrite, non pinmode ... ;)
> SukkoPera: ovviamente va usato un partitore resistivo per la connessione dei due ... meglio non rischiare comunque, date le differenze di alimentazione ;)
Stavo vedendo la soluzione proposta da te e seguendo il tuo ragionamento non mi trovo, nel caso dell'oggetto allontanato
if ((val_old != val) && (val == LOW)) //oggetto allontanato
il secondo confronto va fatto con
val == HIGH
Giusto?
Per quanto il pinmode, in un altro topic mi è stato detto che per simulare la pressione del tasto potevo fare nel seguente modo:
Quel sensore fornisce una uscita digitale il cui livello HIGH è determinato dalla tensione di alimentazione: se lo alimenti a 5V, devi inserire un partitore di tensione che riduca la tensione in uscita sino a 3.3V di Raspberry.
Inoltre devi effettuare alcuni collegamenti tra i pin del sensore (non necessari se montato su PCB della Pololu):
Pin
4 Gnd
11-12-14 Vcc
1 - 3 ponticello
2 resistore da 4.2 ohm verso Gnd
7 condensatore 10-100nF verso Gnd
cyberhs:
Quel sensore fornisce una uscita digitale il cui livello HIGH è determinato dalla tensione di alimentazione: se lo alimenti a 5V, devi inserire un partitore di tensione che riduca la tensione in uscita sino a 3.3V di Raspberry.
Inoltre devi effettuare alcuni collegamenti tra i pin del sensore (non necessari se montato su PCB della Pololu):
Pin
4 Gnd
11-14 Vcc
1 - 3 ponticello
2 resistore da 4.2 ohm verso Gnd
7 condensatore 10-100nF verso Gnd
La tipologia di sensore che utilizzo io è quella in foto, penso non sia necessario utilizzare il resistore da 4.2 e il condensatore da 10-100nf giusto?
In un altro topic dove volevo utilizzare al posto del sensore infrarosso una fotoresistenza, mi era stato suggerito da SukkoPera che rigrazio, un modo per evitare di utilizzare il partitore di tensione e consisteva nel fare cosi:
SukkoPera:
E allora chiude a massa, è già chiaro. Visto che è necessaria una conversione di livelli e che immagino sia già presente un pull-up, suggerirei di usare un'uscita in stile open-collector, per evitare di aggiungere componenti. Collega un pin qualunque di Arduino, ad esempio l'8, e per far partire il video fai: