Ciao ragazzi, oggi come da titolo vedremo che grazie ad Arduino ed un modulo RF 433MHz più altri pochi componenti, possiamo realizzare una centralina per automatizzare la serranda del nostro garage oppure per il cancello del nostro giardino.
Grazie alla centralina possiamo quindi aprire e chiudere serrande o cancelli che siano, agendo a distanza da un computer o uno smartphone se Arduino è connesso in rete o semplicemente da un telecomando RF.
A questo punto vi consiglio di leggervi anche i seguenti articoli per approcciarvi sicuramente in modo migliore al progetto se siete alle prime armi!!
- Collegare un relè ad arduino
- Arduino standalone: atmega328 su breadboard
- Arduino standalone upload bootloader o sketch su atmega328
- Arduino e moduli RF 433Mhz
Adesso vediamo quali sono i componenti che ci occorrono:
- Arduino standalone
- basetta millefori (va bene anche 5cm x 7cm)
- 15 x screw terminal
- 2 x relè singolo scambio 230Vac 10A
- 2 x diodo 1N4007
- 2 x transistor BC547
- 4 x resistore 10K
- 2 x resistore 4.7K
- lampeggiante (con elettronica incorporata) optional
- fotocellule con alim. 12Vdc optional (ma ne vade la vostra sicurezza)
- alimentatore 12Vdc 5A
- moduli RX-TX RF 433MHz
e qui uno schizzo dello schema:
Se non avete a disposizione una coppia di fotocellule, collegate il piedino 6 di Arduino direttamente a 5Vdc.
Ma fate molta attenzione perché senza fotocellule uno rischia di farsi male!!!
Adesso cerchiamo di capire quali sono i punti da dover tenere in considerazione per svilluppare lo sketch.
Per prima cosa dobbiamo pensare alla sicurezza, vi immaginereste cosa potrebbe succedere se qualcuno rimanesse bloccato sotto la serranda durante la marcia di discesa??? Un disastro!!!!
Ed in fine dobbiamo far in modo di far salire o scendere la nostra serranda oppure aprire o chiudere il nostro cancello senza bloccare lo sketch, mantenendo sempre il controllo sullo stato delle fotocellule ed il controllo di un eventuale comando ricevuto da telecomando o pulsante per fermare o cambiare marcia.
Come procedere??
Per il primo punto, sappiamo che dal piedino 6 di Arduino andremo a leggere lo stato delle fotocellule, quindi ci permetterà di sapere se qualcuno o qualcosa è posizionata davanti ad esse, perciò noi dobbiamo mettere in relazione al controllo delle fotocellule una variabile che blocchi la marcia in caso sia necessario!!
Ultimo punto per evitare quanto abbiamo detto basta salvare l’istante di tempo in cui parte la marcia e confrontare costantemente se il tempo necessario prestabilito per la marcia è trascorso o meno!!!
In questo modo possiamo evitare l’uso della funzione delay() e quindi evitare di bloccare lo sketch.
Lo sketch:
#include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); #define interruptAntenna 1 // pin 3 #define pinAlimentazione 4 #define pinScambioMarcia 5 #define pinFotocellule 6 #define pinPulsante 7 int keycode = 5393; boolean ultimaMarcia = false; // assumiamo FALSE = chiudi - TRUE = apri boolean muovi = false; unsigned long T; int deltaT = 5000; // tempo di marcia del cancello/serranda per apertura/chiusura (da scegliersi in base alle proprie situazioni) void setup() { pinMode(pinAlimentazione, OUTPUT); pinMode(pinScambioMarcia, OUTPUT); pinMode(pinFotocellule, INPUT); pinMode(pinPulsante, INPUT); mySwitch.enableReceive(interruptAntenna); } void loop() { // se stiamo eseguendo la marcia "chiudi" // e viene rilevato un ostacolo dalle fotocellule fermo tutto if ( digitalRead(pinAlimentazione) == HIGH && ultimaMarcia && digitalRead(pinFotocellule) == LOW ) { muovi = false; } // se ho ricevuto un segnale dal telecomando o dal pulsante if ( segnale() || digitalRead(pinPulsante) == HIGH ) { // e il cancello/serranda è in movimento fermo tutto if ( digitalRead(pinAlimentazione) == HIGH ) { digitalWrite(pinAlimentazione, LOW); muovi = false; ultimaMarcia = ! ultimaMarcia; } // altrimenti setto il verso di marcia opposto al precedente. else { if ( ultimaMarcia ) { digitalWrite(pinScambioMarcia, LOW); // chiudi } else { digitalWrite(pinScambioMarcia, HIGH); // apri } muovi = true; T = millis(); } } // faccio partire la marcia finché non scade il tempo di marcia prestabilito // oppure qualcuno o qualcosa bloccano la marcia if ( muovi && (millis() - T) < deltaT ) { digitalWrite(pinAlimentazione, HIGH); } else { digitalWrite(pinAlimentazione, LOW); muovi = false; ultimaMarcia = ! ultimaMarcia; } } // funzione per ricevere il segnale dal telecomando boolean segnale() { if ( mySwitch.available() ) { if ( mySwitch.getReceivedValue() == keycode ) { return true; } else { return false; } mySwitch.resetAvailable(); } else { return false; } }
In fine ecco qualche foto del prototipo: