Nodo01 – Gateway Souliss

animated-gifs-alarm-05Aggiornato il: 29 Dec, 2015 @ 16:51

NOTA: IN CONTINUO AGGIORNAMENTO.

Casa domotica con arduino : Gateway Souliss

Nel progetto di casa domotica con Arduino, il Nodo01 veste la funzione di Gateway per il sistema Souliss. Questo ha il compito di leggere e pilotare tutti i nodi a lui associati e interfacciarsi con la Souliss App scaricabile dallo store di Google Play.

L’hardware utilizzato per questo nodo e una scheda Arduino Mega

con a bordo un micro Atmel ATmega2560 e per la comunicazione con gli altri nodi della rete ho utilizzato uno Ethernet shield W5100

Ethernet shield

Nel seguente disegno viene illustrato lo schema della casa domotica con descritto le varie funzioni che svolgerà il Nodo01 o Gateway, verrà costantemente aggiornata all’ingrandirsi della rete compreso l’interfacciamento della restante rete di nodi attraverso un collegamento RS485.

Casa domotica con arduino : Nodo01
Hardware.

L’hardware necessario, come appena descritto, è composto dalla scheda Arduino Mega e dalla Ethernet shield ed è sufficiente montarle tra loro come in figura qui sotto, poi va collegata alla rete LAN del Router Adsl o Switch che sia, con un cavo Ethernet ed alimentata.

mega + ethernet
mega + ethernet
 Software.

Come iniziare e cosa avere installato su pc per programmare e sviluppare il progetto?
La prima cosa da fare è installare il software per programmare Arduino e lo trovate a questo link. Il mio consiglio ad oggi la versione da me provata e funzionante è la 1.6.3.
Secondo si deve installare la libreria di Souliss nel pacchetto di arduino e lo trovate a questo link e cliccate sul pulsante Download.

Ora scompattare il file scaricato(zip) e mettete tutti i file nella cartella ..\Arduino\libraries\Souliss\.

Ora si è pronti per programmare ed eseguire i vari test; oltre alle schede da me usate ci sono altre soluzioni possibili e la lista di hardware disponibili per Souliss la potete trovare in questa lista.

 Di seguito il listato, in continuo aggiornamento, con la spiegazione del codice:

/**************************************************************************
*
* Progetto   :    Nodo01 Eth - Gateway - Arduino Mega 2560 + Ethernet W5100
* Autore     :    DromegaWeb
* Data       :    Gennaio 2015     -  Inizio - esito OK
*                 21 Marzo 2015    -  Introdotto SpeakEasy - esito OK
*                 02 maggio 2015   -  Aggiornato ad arduino 1.6.3
*                 28 Dic 2015      -  Aggiornato parametri MAC
*                
*
****************************************************************************/
// Indirizzo MAC per Scheda Ethernet Nodo01
#define MAC_INSKETCH                                              // "0xBF" identifica la mia rete BF 
uint8_t MAC_ADDRESS[] = {0x1A, 0xA6, 0x49, 0x6B, 0xBF, 0x01};     // l'ultimo indirizzo "0x01" identifica il Nodo01
#define AUTO_MAC         0
#define MAC_DEBUG        0


// Configure the framework
#include "bconf/StandardArduino.h"    // Uso un Arduino standard
#include "conf/ethW5100.h"            // Uso connessione Ethernet Wiznet W5100
#include "conf/Gateway.h"             // uso il nodo come Gateway Souliss


#include <SPI.h>
#include "Souliss.h"

// -------------INIZIO definizione della configurazione di rete --DromegaWeb------------------------------------

#define ip_Router		  10
#define	ip_Gateway		  11			// indirizzo ip Gateway Souliss   
#define ip_Eth_N2		  12			// indirizzo ip su Ethernet Nodo02
#define	ip_Eth_N3		  13			// indirizzo ip su Ethernet Nodo03

uint8_t ip_address_Gw[4]  = {192, 168, 2, ip_Gateway};		// indirizzo Gateway souliss su Ethernet Arduino Mega
uint8_t ip_address_E2[4]  = {192, 168, 2, ip_Eth_N2};		// indirizzo su Ethernet Nodo02
uint8_t ip_address_E3[4]  = {192, 168, 2, ip_Eth_N3};		// indirizzo su Ethernet Nodo03
uint8_t subnet_mask[4]    = {255, 255, 255, 0};
uint8_t ip_gateway_Router[4] = {192, 168, 2, ip_Router};	// indirizzo Gateway router

#define myvNet_address		ip_address_Gw[3]		// ultimo byte dell' IP address (11) è anche l'indirizzo vNet
#define	myvNet_subnet		  0xFF00
#define myvNet_supern		  0x0000
#define	myvNet_supern_E2	Nodo02_Bridge01_RS485
#define	myvNet_supern_E3	Nodo03_Bridge02_RS485

#define Nodo02_Bridge01_RS485		0xCE01	// Indirizzo Nodo02 bridge01 della Seriale RS485
#define Nodo04_Bridge01_Peer01			0xCE02	// Indirizzo Nodo04 peer01 su bridge01 remota Seriale RS485
#define Nodo05_Bridge01_Peer02			0xCE03	// Indirizzo Nodo05 peer02 su bridge01 remota Seriale RS485

#define Nodo03_Bridge02_RS485		0xCF01	// Indirizzo Nodo03 bridge02 della Seriale RS485
#define Nodo06_Bridge02_Peer01			0xCF02	// Indirizzo Nodo06 peer01 su bridge02 remota Seriale RS485
#define Nodo07_Bridge02_Peer02			0xCF03	// Indirizzo Nodo07 peer02 su bridge02 remota Seriale RS485
#define Nodo08_Bridge02_Peer03			0xCF04	// Indirizzo Nodo08 peer03 su bridge02 remota Seriale RS485

// -------------FINE definizione della configurazione di rete --DromegaWeb------------------------------------




#define LED_O_N1			0	// This is the memory slot for the logic that handle the light
#define LED_1_N1			1
#define LED_2_N1			2
#define LED_3_N1			3
#define ALLARME  			4
#define WATCHDOG      5


void setup()
{
  Initialize();
  Souliss_SetIPAddress(ip_address_Gw, subnet_mask, ip_gateway_Router);    // Questo nodo sarà --> 192.168.2.11
  SetAsGateway(myvNet_address);                                           // Questo nodo è Gateway Souliss app
  
  SetAsPeerNode(ip_Eth_N2, 1);                       // definisco Nodo02 Eth + brige01 RS485
  SetAsPeerNode(ip_Eth_N3, 2);                       // definisco Nodo03 Eth + brige02 RS485

  SetAsPeerNode(Nodo04_Bridge01_Peer01, 3);      // definisco Nodo04 peer01 su bridge01
  SetAsPeerNode(Nodo05_Bridge01_Peer02, 4);      // definisco Nodo05 peer02 su bridge01
  SetAsPeerNode(Nodo06_Bridge02_Peer01, 5);      // definisco Nodo06 peer01 su bridge02


  //         Set tipici e I/O LED
  
  Set_T11(LED_O_N1);
  Set_T11(LED_1_N1);
  Set_T11(LED_2_N1);
  Set_T11(LED_3_N1);
  
  pinMode(2, INPUT);	    // Ingresso pulldown 
 
  pinMode(8, OUTPUT);	    // Power the LED
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  
  
  //      Set tipici e I/O ALLARME  
 
  Set_T41(ALLARME);
  //pinMode(7, INPUT);      // Ingresso pulldown
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}

void loop()
{
  EXECUTEFAST() {
    UPDATEFAST();

    FAST_30ms() {      
      DigIn(2, Souliss_T1n_ToggleCmd, LED_O_N1);  // Usa Pin2 per cambiare lo stato pull-down
      Logic_T11( LED_O_N1);                       // Esegue la logica che gestisce i LED
      Logic_T11( LED_1_N1);
      Logic_T11( LED_2_N1);
      Logic_T11( LED_3_N1);
      DigOut(8,  Souliss_T1n_Coil, LED_O_N1);     // Usa PinX per alimentare e accendere i LED
      DigOut(9,  Souliss_T1n_Coil, LED_1_N1);
      DigOut(10, Souliss_T1n_Coil, LED_2_N1);
      DigOut(11, Souliss_T1n_Coil, LED_3_N1);
     
    }
    
    FAST_510ms() {      
        //DigIn(7, Souliss_T4n_Alarm, ALLARME);           // Pin7 ingresso sensore allarme pull-down
        Logic_T41(ALLARME);                             //esegui logica allarme
        nDigOut(12, Souliss_T4n_Antitheft, ALLARME);    // Pin12 alto se allarme attivo              
        LowDigOut(13, Souliss_T4n_InAlarm, ALLARME);    // Pin13 alto se allarme spento
    }
    
    FAST_2110ms()   {    // watchdog di controllo presenza dei nodi    
            mInput(ALLARME) = Watchdog(Nodo04_Bridge01_Peer01, WATCHDOG, Souliss_T4n_Alarm);
        }
    
    FAST_GatewayComms();   //Qui elaboriamo tutte le comunicazioni con altri nodi la Souliss App


  }
  EXECUTESLOW() {
    UPDATESLOW();
    SLOW_10s() {		// Gestiamo il timer luce con un tempo di base di 10 secondi
      Timer_T11( LED_O_N1);
      Timer_T11( LED_1_N1);
      Timer_T11( LED_2_N1);
      Timer_T11( LED_3_N1);
    }
  }
}


Spiegazione del codice in breve:

Setup

012 – Stabilisce che l’hardware usato è la scheda di Arduino

013 – Comunica al compilatore che lo shield montato su Arduino è in scheda Ethernet

014 – Definisce questo nodo come il nodo gateway del sistema Souliss con il quale si interfaccia la Souliss App sullo smartphone o tablet. Questo settaggio nella rete Souliss deve comparite una sola volta in quanto la Souliss App si aggancia ad un solo gateway.

016-017 – Libreria Souliss da inserire sempre.
020 – Definisco l’indirizzo IP del Nodo01, Arduino Gateway, questo nodo per intenderci.
021 – Definisco l’indirizzo IP del Nodo02 altra scheda arduino con modulo shield Ethernet.
022 – Definisco l’indirizzo IP del Nodo03 altra scheda arduino con modulo shield Ethernet.
023 – Definizione della subnet mask, tipico parametri presente in tutte le reti dati ethernet.
024 – Definisco l’indirizzo IP del Router o modem router che funge da gateway sulla propria rete per l’accesso a internet.
026-033 – Definizione indirizzi vNet.
035 – Definisco l’indirizzo del ponte per la prima linea di RS485 sul Nodo02
036 – Definisco l’indirizzo del peer Nodo04 per la prima linea di RS485
037 – Definisco l’indirizzo del peer Nodo05 per la prima linea di RS485
039 – Definisco l’indirizzo del ponte per la seconda linea di RS485 sul Nodo03
040 – Definisco l’indirizzo del peer Nodo06 per la seconda linea di RS485
041 – Definisco l’indirizzo del peer Nodo07 per la seconda linea di RS485
042 – Definisco l’indirizzo del peer Nodo08 per la seconda linea di RS485
047 – Definisco il MAC nello sketch.
049-054 – Definisco i 6 LED come slot
058 – inizializza la mappa di memoria degli slot Souliss
060 – Setta l’indirizzo IP del Nodo01, Arduino Gateway.
061 – Setto questo nodo come Gateway di Souliss App, da fare solo su questo nodo della rete( va settato solo una volta.)

062-063 – In queste righe vengono settati i nodi peer di tutta le rete Souliss, in questo caso sono presenti solo i 3 nodi (Nodo02,Nodo04 e Nodo05) quelli in uso ora, in futuro verranno aggiunti anche gli altri quando pronti.

067-072 – Dei vari slot viene settato il tipico.

075-080 – Vengono definiti gli ingressi.

082-087 – Vengono definite le uscite.

Loop

La base del ciclo di sistema per i vari nodi è la seguente:

void loop()
{
EXECUTEFAST() {
UPDATEFAST();

FAST_30ms() {
-------------Definire intrusioni di in e out per Soulis---------------
}
FAST_50ms() {
-------------Definire intrusioni di in e out per Soulis---------------
}

}
EXECUTESLOW() {
UPDATESLOW();
SLOW_10s() {  // Gestiamo il timer degli slot
-------------Definire timer---------------
}
}
}

Questo è il ciclo che viene ripetuto all’infinto del nostro nodo e sono presenti nei “FAST_XXms()”  le istruzioni che vengono ripetute con maggiore frequenza e nei “SLOW_xxs()” le istruzioni che vengono ripetute con un lasso di tempo più lungo settabile anche una volta al giorno, secondo quanto descritto nel file SpeakEasy.h.

Quindi:

097-102 – La funzione DigIn rileva il cambiamento di stato dell’ingresso (2,3,4,5,6,7 di Arduino) e cambia lo stato dello SLOT (LED_0_N1, LED_1_N1, LED_2_N1, LED_3_N1, LED_4_N1, LED_5_N1).

105-110 – Esegue la logica inerente allo stato dello SLOT e al tipico.

113-118 – La funzione DigOut setta il relativo pin di Arduino (8, 9 ,10, 11, 12, 13) a livello logico alto o basso in relazione allo sto dello slot, in parole povere accende o spegne il LED connesso tra GND e il pin di Arduino.

120 – In questa dichiarazione vengono gestite parecchie cose:

– Elabora più canali di comunicazione gestiti in round-robin, i dati di uscita sono situati nella mappa di memoria e sono pronti per essere letti dall’interfaccia utente.

– Recupera i dati dei canali di comunicazione

– Ottenere le definizioni dei tipici dai dispositivi remoti in caso di riavvio del gateway

123-131 – Vengono gestite le temporizzazioni (timer).

 

 

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

This blog is kept spam free by WP-SpamFree.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.