Trappola per roditori azionata da laser

Buongiorno a tutti.
Ho bisogno del vostro aiuto per capire o meglio imparare come compilare il software arduino per il seguente progetto: azionare un servo motore, (facendolo ruotare di 180 gradi e poi ritornare a 0 gradi), quando un topo passa attraverso la barriera laser costituita dal laser e sensore (fotoresistenza). Ho provato con le mie modeste conoscenze, ma haimè non ci riesco. Per poter capire come compilare un esperimento del genere ho bisogno del vostro aiuto; ritengo che vedendone uno compilato correttamente, arrivi a capire come compilarlo per bene.
Ringrazio in anticipo chi vorrà aiutarmi ed illuminarmi.
grazie

Nella tua presentazione dici di aver già fatto esperimenti con componenti di base, quindi deduco tu abbia uno starter kit o simile, giusto?
In tal caso dovresti avere un servo motore e gli esempi per farlo funzionare.
Hai provato a farlo?
Dovresti anche avere un laser con ricevitore e gli esempi anche qui.
Se sei riuscito a fare i due esperimenti separatamente sei già a buon punto, basta solo mettere insieme i vari pezzi e il problema, in questo caso, è la logica con cui metterli assieme, più che la programmazione in se e la logica la si può descrivere in italiano, inizialmente, per vedere se è corretta.
Se non hai ancora fatto gli esperimenti, ti consiglio di iniziare da li e farli separatamente per prendere dimestichezza.
Poi inizia a ragionarci e a fare le prove di integrazione e se hai problemi posta una descrizione della logica che vuoi usare, spiegata in modo semplice come si fa con un bambino :wink: e i codici che stai cercando di mettere assieme.

Salve Maubarzi,
dunque il progetto è apparentemente semplice da fare (credo):
dentro una gabbia per uccelli dispongo il laser che punta sulla fotoresistenza, il servo in stato di "riposo" blocca la porticina che è provvista di molla per la chiusura. Orbene, nell'attimo in cui l'uccellino passa attraverso il laser, deve ruotare il servo per permettere alla porticina di chiudersi.
Costruttivamente è facile, il problema lo trovo nel compilare il codice.
Per quanto riguarda qualche esperimento fatto, sono quelli descritti nel manuale della confezione, giusto per iniziare ad avere dimistichezza.
Ho realizzato il semplice allarme quando si passa attraverso il raggio laser attivando il buzzer, e da qui mi è partita l'idea di sostituire il buzzer con un servo che faccia quello che ho descritto sopra, però non ci riesco.
Per questo ho chiesto aiuto e ti ringrazio per il tuo interessamento.
saluti

Dovresti partire a "sviluppare" l'esempio del servomotore.

Cioè?

Come suggerito da @speedyant prova l'esempio del servo e poi con i due codici provi a vedere come metterli assieme.
Inizia e poi posta tutto, che ti si da una mano.
Il trucco è di cercare di isolare le varie azioni dentro variabili e a funzioni specifiche da richiamare poi nel modo opportuno con la logica di contorno che orchestra l'interazione tra i vari pezzi.

di seguito riporto quello che sono riuscito a compilare:

#include <Servo.h>
Servo myservo;

int laser = 4; // pin del laser
int soglia = 200; // da verificare con monitormode

void setup() {
Serial.begin(9600);
myservo.attach(9); // pin del segnale per il servo
myservo.write(0); // servo a 0 gradi
Serial.begin(9600);

pinMode(laser,OUTPUT);
digitalWrite(laser,HIGH);
}

void loop() {

int lettura=analogRead(A0); // legge il valore della fotoresistenza
Serial.println(lettura); // a monitor leggo il valore
if(lettura<soglia) myservo(); // se il valore letto è < della soglia attivare il servo
myservo.write(180); // ruotare di 180 gradi
delay(2000);
myservo.write(0); // tornare a o gradi
delay(1000);

}

fotoresistenza pin A0 e gnd
laser pin 4 e gnd
servo +5volt gnd pin 9

Ciao, non per rompere le scatole ma, in base al regolamento, dovresti editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag:

[code] _il _tuo_ codice_ [/code]

così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo.

domen66:
... il servo in stato di "riposo" blocca la porticina che è provvista di molla per la chiusura....

Intendi che la porticina aperta "carica" la molla e il servo deve solo "liberarla" per permetterle di chiudersi da sola?

domen66:
--- quando un topo passa attraverso la barriera laser ---

Qui è un topo...

domen66:
... nell'attimo in cui l'uccellino passa attraverso il laser, ...

Qui un uccello...

Ci fai vedere come e dove hai collegato la fotoresistenza?

Ciao,
P.

Laser pin 4 e GND
Fotoresistenza pin A0 e GND
Servo pin 9 GND +5Volt

C'è un serial.begin di troppo.

inoltre al blocco if

if(lettura<soglia) myservo(); // se il valore letto è < della soglia attivare il servo[color=#222222][/color]
myservo.write(180); // ruotare di 180 gradi [color=#222222][/color]
delay(2000);[color=#222222][/color]
myservo.write(0); // tornare a o gradi[color=#222222][/color]
delay(1000);[color=#222222][/color]

mancano delle parentesi graffe e c'è un myservo(); che mi pare non serva (!)

if(lettura<soglia) { // se il valore letto è < della soglia attivare il servo
myservo.write(180); // ruotare di 180 gradi 
delay(2000);
myservo.write(0); // tornare a o gradi
delay(1000);
}

Comunque devi mettere il codice nei tag giusti che si inseriscono premendo su </>

Stai usando i moduli KY-008 Laser sensor module e KY-018 Photo resistor module? oppure i componenti singoli?

Un primo suggerimento: evita di usare delay() e studiati la funzione millis().
La delay viene usata negli esempi più semplici, ma nelle applicazioni effettive non si usa quasi mai.
Questo perchè delay() mette tutto in pausa per il tempo indicato, millis, invece, è una sorta di cronometro in millisecondi che ti permette di pianificare le attività in base allo scorrere del tempo senza bloccare nulla. Salvandoti un certo valore, puoi verificare quando, dall'istante salvato, è passato un certo lasso di tempo e quindi compiere una certa azione che risulterà, quindi, opportunamente distanziata nel tempo rispetto all'istante iniziale.