arduino apricancello

Salve a tutti sono nuovo ad arduino e mi vorrei cimentare con il seguente progetto:

dovrei comandare l’apertura di un cancello e l’attivazione di un campanello tramite una coppia di arduino con shield ethernet. Mi spiego meglio, il cancello ed il pulsante del campanello sono posti a circa 800mt in linea d’aria dalla casa. Cancello e casa sono collegati tramite un ponte radio con 2 ubiquity nanostationM5. Nella postazione del cancello ci sono già 2 telecamere IP della mobotix.
Quello che vorrei ottenere è la cosa seguente:
premo il bottone del campanello al cancello, l’arduinocancello intercetta la pressione del bottone e manda all’arduinocasa un messaggio su ethernet (via UDP) il quale legge il messaggio e attiva il campanello. Dopodiche in casa sentono il campanello e premono un altro bottone che viene intercettato da arduinocasa che manda un messaggio via ethernet (UDP) ad arduinocancello che apre, ovvero cliccano su un link sul desktop che manda un messaggio ad arduinocancello via browser web che lo intercetta ed apre il cancello.

Sto procedendo per gradi e quello che attualmente ho (sono in attesa che mi arrivi) è il seguente materiale:

2012 Arduino UNO R3 ATmega328 con il cavo USB
Shield Ethernet W5100 per Arduino
modulo relè 5V http://miniimg6.rightinthebox.com/images/384x384/201206/qruono1339666705610.jpg

con questo materiale e lo sketch che ho fatto dovrei essere in grado di aprire il cancello da browser web

/*
  Apertura cancello
 Novembre 2013
 Roberto Ceccherini
 */

//Librerie impiegate per il progetto
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

//Creo un array di byte per specificare il mac address
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//creo un array di byte per specificare l'indirizzo ip
byte ip[] = { 192, 168, 0, 45}; //modificare questo valore in base alla rete
//porta utilizzata per UDP
unsigned int localPort = 7878;

char Data_RX;
char Dati_TX[20];

String msg = "";
int cmd = 0;

//creo un oggetto server che rimane in ascolto sulla porta
//specificata ud un oggetto UDP
EthernetServer ArduinoServer(80);
EthernetUDP Udp;

void setup()
{
  //inizializza lo shield con il mac e l'ip  
  Ethernet.begin(mac, ip);
  //inizializza la porta UDP
  Udp.begin(localPort);
  //inizializza l'oggetto server
  ArduinoServer.begin();
  //inizializza la porta seriale
  Serial.begin(19200);
  //definisco il pin2 come uscita
  pinMode(2, OUTPUT);

}

void loop()
{
  //IMPORTANTE pulisco la variabile msg  
  msg = "";
  EthernetClient pc_client = ArduinoServer.available();
  //controllo se pc_client è true
  if (pc_client != false)
  {
    //controllo continuamente che il client sia connesso
    while (pc_client.connected())
    {
      //Controllo se ci sono byte disponibili per la lettura
      if (pc_client.available())
      {
        //leggo i byte disponibili
        //provenienti dal client
        Data_RX = pc_client.read();

        //ricostruisco la stringa ricevuta concatenando i singoli byte
        msg += Data_RX;

        //Attendo che tutti i byte siano letti
        //quando Data_RX contiene il carattere
        //di nuova line capisco tutti i byte sono
        //stati letti
        if (Data_RX == '\n')
        {
          //cerco all'interno della stringa il parametro che mi interessa
          cmd = msg.indexOf("apri");

          //Piloto l'uscita
          if (cmd > 0)
          {                      
            digitalWrite(2, HIGH);
            delay(1000);
            digitalWrite(2, LOW);
          }
        }
      }
    }
  }
}

il .bat che ho fatto per lanciare il comando di apertura via web browser non lo posto se non è necessario tanto è banale

adesso mi manca l’altra parte, o meglio… per far suonare il campanello posso utilizzare lo stesso sketch che utilizzo per arire il cancello, la cosa che non riesco a capire è se posso collegare il bottone del campanello direttamente ad arduinocancello o devo mettere un relè anche li.

grazie per le dritte ed i consigli che vorrete darmi

Non conosco il modello di telecamera, ma di solito le telecamere IP sono dotate di uno o più ingressi digitali ed una uscita open collector.
Verifica, perché così potresti risparmiare l’Arduino del cancello.

in realtà quell che voglio è proprio eliminare il controllo di apertura porta e squillo campanello dalle telecamere il cui cavo usb costa circa 30€ perchè non è standard. La telecamera costa 600€ ma si sta divagando a me non interessa sapere cosa può fare la telecamera che lo so già, a me interessa sapere come fare quello che ho in mente con gli arduino

68 letture e nemmeno una risposta?

killrob: ... adesso mi manca l'altra parte, o meglio... per far suonare il campanello posso utilizzare lo stesso sketch che utilizzo per arire il cancello, l*a cosa che non riesco a capire è se posso collegare il bottone del campanello direttamente ad arduinocancello o devo mettere un relè anche li*. ...

Tieni conto della massima corrente che ciascun pin di Arduino UNO può dare (max 40 mA per un breve periodo) e della massima corrente che tutti i pin assieme possono dare (max 200 mA per un breve periodo) , della massima tensione che può sopportare in ingresso (max 5v) e ... vedi tu se sei entro i limiti o se ti serve necessariamente la logica per pilotare un relè.

Guglielmo

gpb01: Tieni conto della massima corrente che ciascun pin di Arduino UNO può dare (max 40 mA per un breve periodo) e della massima corrente che tutti i pin assieme possono dare (max 200 mA per un breve periodo) , della massima tensione che può sopportare in ingresso (max 5v) e ... vedi tu se sei entro i limiti o se ti serve necessariamente la logica per pilotare un relè.

Guglielmo

grazie per la risposta ma non ho ancora capito... in pratica dovrei vedere con un tester che tensione passa per i cavi una volta premuto il bottone del campanello e quindi decidere se collegarli direttamente ad arduino oppure metterci in mezzo un relè?

il pulsante del campanello ( se deve fare solo quello ) lo colleghi ad un pin e al GND. Inserendo anche una resistenza di Pullup da 10K tra il pin e il +5V

L'apriporta invece, come dici tu, lo piloti attraverso un rele'

Brunello: il pulsante del campanello ( se deve fare solo quello ) lo colleghi ad un pin e al GND. Inserendo anche una resistenza di Pullup da 10K tra il pin e il +5V

Mmm ... Brunello, lui scrive "Mi spiego meglio, il cancello ed il pulsante del campanello sono posti a circa 800mt in linea d'aria dalla casa. Cancello e casa sono collegati tramite un ponte radio con 2 ubiquity nanostationM5." ... quindi sembrerebbe non esserci una connessione fisica, ma occorre vedere il ricevitore cosa genera veramente dall'altra parte (dentro casa) per far suonare il campanello ... ;)

@ killrob : Si, devi prima verificare che tensioni sono in gioco, se il campanello è in DC o in AC e quindi, con tutti gli elementi, puoi decidere come e cosa usare.

Guglielmo

il pulsante del campanello starà fisicamente nello stesso posto di arduinocancello, dopo aver collegato il suddetto pulsante, arduinocancello intercetta la pressione e fa partire un messaggio tramite UDP (via ponte dadio) ad arduinocasa dove il messaggio verrà recepito ed un campanello, collegato ad un altro relè, verrà fatto suonare. Ecco questa è l'idea che vorrei realizzare.

killrob: il pulsante del campanello starà fisicamente nello stesso posto di arduinocancello, dopo aver collegato il suddetto pulsante, arduinocancello intercetta la pressione e fa partire un messaggio tramite UDP

Ok, quindi ... ... o usi il pulsante SOLO per mandare un segnale al arduinocancello, ed allora ti basta un pin dichiarato in input pull-up (HIGH) e, con il pulsante ne rilevi il collegamento a GND (LOW) ... ed in tal caso è un semplice filo, o invece il pulsante resta comunque collegato al resto dell'impianto e allora devi fare le misure che ti ho detto per vedere che tensioni sono in gioco.

Guglielmo

gpb01:
Ok, quindi …
… o usi il pulsante SOLO per mandare un segnale al arduinocancello, ed allora ti basta un pin dichiarato in input pull-up (HIGH) e, con il pulsante ne rilevi il collegamento a GND (LOW) … ed in tal caso è un semplice filo, o invece il pulsante resta comunque collegato al resto dell’impianto e allora devi fare le misure che ti ho detto per vedere che tensioni sono in gioco.

Guglielmo

ok allora chiedo all’elettricista come è collegato attualmente e mi regolo di conseguenza, ripeto solo una cosa mi sto cimentando adesso per la prima volta con arduino e quindi scusa ma certe cose non le capisco ancora… cosa intendi per… “ti basta un pin dichiarato in input pull-up (HIGH) e, con il pulsante ne rilevi il collegamento a GND (LOW)”?
intendi questo?

int inPin = 6;
int val = 0;

pinMode(inPin, INPUT);
digitalWrite(inPin, HIGH);

da dichiarare in setup?

e poi nel loop
val = digitalRead(inPin);
if val = LOW

ecc. ecc. ecc…

corretto?

No, intendo :

pinMode(inPin, INPUT_PULLUP);

... vai a vedere il reference ... in questo modo viene attivata una resistenza di pull-up interna al chip e quindi comunque, quando il pin non è collegato, è stabile a valore HIGH. L'unica cosa quindi che in tale caso dovrai fare è, con il pulsante, collegarlo a massa per dargli un segnale LOW.

Ti consiglio di leggere anche QUI per imparare a fare il debouncing, altrimenti, ogni volta che viene premuto il pulsante, a causa dei "rimbalzi" della meccanica, invece che un impulso avrai un treno di impulsi ;)

Guglielmo

ok grazie per le dritte e la pazienza... vado a studiare :)

Mmm ... Brunello, lui scrive "Mi spiego meglio, il cancello ed il pulsante del campanello sono posti a circa 800mt in linea d'aria dalla casa. Cancello e casa sono collegati tramite un ponte radio con 2 ubiquity nanostationM5." ... quindi sembrerebbe non esserci una connessione fisica, ma occorre vedere il ricevitore cosa genera veramente dall'altra parte (dentro casa) per far suonare il campanello ..

Dato che ha a disposizione un ponte radio con doppio ingresso ethernet, presupponevo che

2012 Arduino UNO R3 ATmega328 con il cavo USB
Shield Ethernet W5100 per Arduino

venisse collegato a uno di quei due ingressi

lo stesso dicasi sul ricevitore, visto che e' identico, ci collega un Arduino "casa"

Brunello: Dato che ha a disposizione un ponte radio con doppio ingresso ethernet, presupponevo che

2012 Arduino UNO R3 ATmega328 con il cavo USB
Shield Ethernet W5100 per Arduino

venisse collegato a uno di quei due ingressi

lo stesso dicasi sul ricevitore, visto che e' identico, ci collega un Arduino "casa"

esatto

vorrei fare esattamente in questo modo, ma per il momento, visto che ho un solo arduino, lo installo lato cancello e lo utilizzo per fare da apricancello via comandi web

rieccomi qui adesso ho tutto in mano ma ho un piccolo problema e chiedo aiuto a voi:

questo è il mio sketch funzionante:

/*
  Apertura cancello
 Novembre 2013
 Roberto Ceccherini
 */

//Librerie impiegate per il progetto
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

//Creo un array di byte per specificare il mac address
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//creo un array di byte per specificare l'indirizzo ip
IPAddress ip( 192, 168, 1, 45); //modificare questo valore in base alla rete
//Creo un array per definire il gateway
IPAddress gateway(192,168,1,254);
//Creo un array per la subnet
IPAddress subnet(255,255,255,0);
//porta utilizzata per UDP
unsigned int localPort = 7878;

char Data_RX;
char Dati_TX[20];
int ouPin = 2;
String msg = "";
int cmd = 0;
int inPin = 6;

//creo un oggetto server che rimane in ascolto sulla porta
//specificata ed un oggetto UDP
EthernetServer ArduinoServer(80);
EthernetUDP Udp;

void setup()
{
  //inizializza lo shield con il mac e l'ip  
  Ethernet.begin(mac, ip, gateway, subnet);
  //inizializza la porta UDP
  Udp.begin(localPort);
  //inizializza l'oggetto server
  ArduinoServer.begin();
  //inizializza la porta seriale
  Serial.begin(19200);
  //definisco il pin 2 come uscita ed il pin 6 come input impostato ad HIGH
  pinMode(ouPin, OUTPUT);
  pinMode(inPin, INPUT_PULLUP);
  Serial.println(Ethernet.localIP());
}

void loop()
{
  //IMPORTANTE pulisco la variabile msg
  msg = "";
  EthernetClient pc_client = ArduinoServer.available();
  //controllo se pc_client è true
  if (pc_client != false)
  {
    //controllo continuamente che il client sia connesso
    while (pc_client.connected())
    {
      //Controllo se ci sono byte disponibili per la lettura
      if (pc_client.available())
      {
        //leggo i byte disponibili
        //provenienti dal client
        Data_RX = pc_client.read();

        //ricostruisco la stringa ricevuta concatenando i singoli byte
        msg += Data_RX;

        //Attendo che tutti i byte siano letti
        //quando Data_RX contiene il carattere
        //di nuova line capisco tutti i byte sono
        //stati letti
        if (Data_RX == '\n')
        {
          //cerco all'interno della stringa il parametro che mi interessa
          if (cmd = msg.indexOf("apri"));
           //Piloto l'uscita
          {                      
            digitalWrite(ouPin, HIGH);
            delay(1000);
            digitalWrite(ouPin, LOW);
          }
          break;
        }
      }
     pc_client.stop();
    }
  }
}

in questo modo in relè si eccita sempre, come faccio, una volta trovata la stringa che mi interessa, a mandare il segnale di output una sola volta?

grazie a tutti

con lo sketch riportato sopre il relè si eccita tre volte e non capisco perchè

nessuno mi può dare una mano?

mi sono aiutato da solo
questo è lo sketch finale funzionante, a chi può interessare, con il relè che si eccita una sola volta

/*
  Apertura cancello
 Novembre 2013
 Roberto Ceccherini
 */

//Librerie impiegate per il progetto
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

//Creo un array di byte per specificare il mac address
byte mac[] = { 
  0x2B, 0x79, 0x88, 0xCC, 0xA0, 0xBC };
//creo un array di byte per specificare l'indirizzo ip
IPAddress ip( 192, 168, 0, 45); //modificare questo valore in base alla rete
//Creo un array per definire il gateway
IPAddress gateway(192,168,0,30);
//Creo un array per la subnet
IPAddress subnet(255,255,255,0);
//porta utilizzata per UDP
unsigned int localPort = 7878;

char Data_RX;
char Dati_TX[20];
int ouPin = 2;
String msg = "";
int cmd = 0;
int inPin = 6;

//creo un oggetto server che rimane in ascolto sulla porta
//specificata ed un oggetto UDP
EthernetServer ArduinoServer(80);
EthernetUDP Udp;

void setup()
{
  //inizializza lo shield con il mac e l'ip  
  Ethernet.begin(mac, ip, gateway, subnet);
  //inizializza la porta UDP
  Udp.begin(localPort);
  //inizializza l'oggetto server
  ArduinoServer.begin();
  //inizializza la porta seriale
  Serial.begin(9600);
  //definisco il pin 2 come uscita ed il pin 6 come input impostato ad HIGH
  pinMode(ouPin, OUTPUT);
  pinMode(inPin, INPUT_PULLUP);
  Serial.println(Ethernet.localIP());
  }

void loop()
{
  //IMPORTANTE pulisco la variabile msg e cmd
  msg = "";
  EthernetClient pc_client = ArduinoServer.available();
  //controllo se pc_client è true
  if (pc_client != false)
  {
    //controllo continuamente che il client sia connesso
    while (pc_client.connected())
    {
      //Controllo se ci sono byte disponibili per la lettura
      if (pc_client.available())
      {
        //leggo i byte disponibili
        //provenienti dal client
        Data_RX = pc_client.read();
        Serial.write(Data_RX);

        //ricostruisco la stringa ricevuta concatenando i singoli byte
        msg += Data_RX;

        //Attendo che tutti i byte siano letti
        //quando Data_RX contiene il carattere
        //di nuova line capisco tutti i byte sono
        //stati letti
        if (Data_RX == '\n')
        {
          //cerco all'interno della stringa il parametro che mi interessa
          cmd = msg.indexOf("apri");
          //Piloto l'uscita
          if (cmd > 0)
          { 
            pc_client.print("<p>Apertura cancello</p>");
            digitalWrite(ouPin, HIGH);
            delay(2000);
            digitalWrite(ouPin, LOW);
          }
          break;
        }
      }
    }
    //fermo il client
    pc_client.stop();    
  }
}

ok riccomi qui con le ultime news....

la situazione è la seguente, lato cancello ho: una antenna ubiquity nanostation loco M5 con IP 192.168.0.70 2 telecamere IP mobotix con rispettivamente IP 192.168.0.23, 192.168.0.21 arduino con IP 192.168.0.46 tutti collegati allo stesso switch, se collego il portatile allo switch in questione e, da browser do il comando di apertura, il cancello si apre se pingo 192.168.0.46 ottengo risposta

lato casa: antenna nanostation M5 IP 192.168.0.60 4 pc con ip dinamico tutti collegati allo stesso switch

entrambi gli switches sono unmanaged se da uno dei pc lato casa provo a dare il comando di apertura cancello non funziona, se pingo 192.168.0.46 ottengo richiesta scaduta

la domanda è: possibile che le antenne ostacolino la trasmissione? dopo tutto io do solo il comando http://192.168.0.46/apri/ da web browser (ho provato con firefox, chrome e IE ed ottengo sempre lo stesso risultato e cioè indirizzo non raggiungibile)

qualcuno ha già provato a fare questi esperimenti? mi è venuto da pensare che potrebbe essere la porta l'ostacolo posso impostare una porta differente per l'ascolto da parte di arduino? e modificare quindi il comando in http://192.168.0.46:65500/apri/ grazie a chi mi sapra aiutare, ma anche a tutti gli altri :)