Casa domotica con Arduino: Souliss Gateway - Nodo01

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 illustrata la prima bozza con descritto le varie funzioni che svolgerà il Gateway e verrà costantemente aggiornata all'ingrandirsi della rete compreso l'interfacciamento della restante rete di nodi attraverso un collegamento RS485.

Nodo 01
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


 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:



[sourcecode language="cpp"]

/**************************************************************************
*
* 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
*
****************************************************************************/

// 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------------------------------------
uint8_t ip_address_Gw[4] = {192, 168, 2, 11}; // indirizzo Gateway souliss su Ethernet Arduino Mega
uint8_t ip_address_E2[4] = {192, 168, 2, 12}; // indirizzo su Ethernet Nodo02
uint8_t ip_address_E3[4] = {192, 168, 2, 13}; // indirizzo su Ethernet Nodo03
uint8_t subnet_mask[4] = {255, 255, 255, 0};
uint8_t ip_gateway_Router[4] = {192, 168, 2, 10}; // indirizzo Gateway router

#define Gateway_address 11 // indirizzo ip Gateway Souliss
#define E2_address 12 // indirizzo ip su Ethernet Nodo02
#define E3_address 13 // indirizzo ip su Ethernet Nodo03
#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_address_Gateway_RS485_01
#define myvNet_supern_E3 Nodo03_address_Gateway_RS485_02

#define Nodo02_address_Gateway_RS485_01 0xCE01 // Indirizzo Nodo02 bridge01 della Seriale RS485
#define Nodo04_address_peer01_Gw_01 0xCE02 // Indirizzo Nodo04 peer01 su bridge01 remota Seriale RS485
#define Nodo05_address_peer02_Gw_01 0xCE03 // Indirizzo Nodo05 peer02 su bridge01 remota Seriale RS485

#define Nodo03_address_Gateway_RS485_02 0xCE11 // Indirizzo Nodo03 bridge02 della Seriale RS485
#define Nodo06_address_peer01_Gw_02 0xCE12 // Indirizzo Nodo06 peer01 su bridge02 remota Seriale RS485
#define Nodo07_address_peer02_Gw_02 0xCE13 // Indirizzo Nodo07 peer02 su bridge02 remota Seriale RS485
#define Nodo08_address_peer03_Gw_02 0xCE14 // Indirizzo Nodo08 peer03 su bridge02 remota Seriale RS485

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

// Indirizzo MAC per Scheda Ethernet Nodo01
#define MAC_INSKETCH const uint8_t MAC_ADDRESS[] = { 0x1A, 0xA6, 0x49, 0x6B, 0xBF, 0xBA};

#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 LED_4_N1 4
#define LED_5_N1 5

void setup()
{
Initialize();
// Set parametri network
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(E2_address, 1); // definisco Nodo02 --- Eth + brige01 RS485
SetAsPeerNode(Nodo04_address_peer01_Gw_01, 2); // definisco Nodo04 peer01 su bridge01
SetAsPeerNode(Nodo05_address_peer02_Gw_01, 3); // definisco Nodo05 peer02 su bridge01

// Set the typical
Set_T11(LED_O_N1);
Set_T11(LED_1_N1);
Set_T11(LED_2_N1);
Set_T11(LED_3_N1);
Set_T12(LED_4_N1);
Set_T12(LED_5_N1);

// Define inputs, outputs pins
pinMode(2, INPUT); // Hardware pulldown required
pinMode(3, INPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(7, INPUT);

pinMode(8, OUTPUT); // Power the LED
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}

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

FAST_30ms() {
// Usa PinX per cambiare lo stato
DigIn(2, Souliss_T1n_ToggleCmd, LED_O_N1);
DigIn(3, Souliss_T1n_ToggleCmd, LED_1_N1);
DigIn(4, Souliss_T1n_ToggleCmd, LED_2_N1);
DigIn(5, Souliss_T1n_ToggleCmd, LED_3_N1);
DigIn(6, Souliss_T1n_ToggleCmd, LED_4_N1);
DigIn(7, Souliss_T1n_ToggleCmd, LED_5_N1);

// Esegue la logica che gestisce i LED
Logic_T11( LED_O_N1);
Logic_T11( LED_1_N1);
Logic_T11( LED_2_N1);
Logic_T11( LED_3_N1);
Logic_T12( LED_4_N1);
Logic_T12( LED_5_N1);

// Usa PinX per alimentare e accendere i LED
DigOut(8, Souliss_T1n_Coil, LED_O_N1);
DigOut(9, Souliss_T1n_Coil, LED_1_N1);
DigOut(10, Souliss_T1n_Coil, LED_2_N1);
DigOut(11, Souliss_T1n_Coil, LED_3_N1);
DigOut(12, Souliss_T1n_Coil, LED_4_N1);
DigOut(13, Souliss_T1n_Coil, LED_5_N1);
}
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);
Timer_T12( LED_4_N1);
Timer_T12( LED_5_N1);
}
}
}

[/sourcecode]

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:

[sourcecode language="cpp"]
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---------------
}
}
}

[/sourcecode]

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).





Commenti

  1. Ciao, se volessi escludere lo stato degli ingressi e quindi utilizzare tutto solo tramite l'app souliss e non utilizzare i pulsanti fisici come posso modificare il codice?
    Grazie
    Claudio

    RispondiElimina
  2. Ciao, devi eliminare le righe dalla 75 alla 80 per il set dei pin e le righe 97 a 102 per il riconoscimento nella SoulissApp.

    DW

    RispondiElimina
  3. ciao ma se io vorrei comandare tutto con una sola scheda arduino quindi creare un solo nodo lo posso fare e cosa devo cambiare nella programmazione
    ho un arduino mega e quindi vorrei utilizzare tutte i pin della scheda
    grazie angelo

    RispondiElimina
  4. salve, ho creato sull'app souliss quattro pulsanti per comandare 4 relè per accendere e spegnere, i pin sono: 8-9-10-11, ma non riesco ad assegnare un pin diverso ad ogni pulsante, come devo configurare i pulsanti dell'app souliss?
    Grazie

    RispondiElimina
  5. Come avrai notato, nel programma di esempio,vengono gestiti sei ingressi e sei uscite, è sufficiente aumentare la dichiarazione di queste istruzioni.

    RispondiElimina
  6. I pin da te citati (8-9-10-11), sono le uscite che pilotano i rele o gli ingressi dei pulsanti?

    RispondiElimina
  7. Ciao,sono luca, inanzi tutto complimenti per il progetto,lo sto sperimentando e modificando un po,ma ti vorrei chiedere un cosa per ora,
    Ho notato che togliendo tensione ad Arduino lo stato dei pin output vanno in HIGH,come se tenessero in memoria sempre lo stato alto dei pulsanti e possibile impostarli in LOW all'accensione.
    per adesso grazie

    RispondiElimina
  8. Nello sketch manca l' #include più importante !!!!
     
    // Configure the framework

    #include "SoulissFramework.h" // è il più importante e manca

    #include "bconf/StandardArduino.h" #include "conf/ethW5100.h"
    #include "conf/Gateway.h"

    Senza questo la compilazione logicamente da svariati errori.

    RispondiElimina
  9. Giustissimo!! nella data dell'inserimento del commento, ma ricordiamo che non era un errore il 7 maggio 2015 quando è stato scritto l'articolo; #include “SoulissFramework.h” è stato introdotto molto tempo dopo.
    Con le ultime versioni di souliss, come hai sottolineato, è fondamentale.
    Grazie della precisazione, appena possibile aggiornerò tutto il progetto con i nuovi listati .

    RispondiElimina

Posta un commento