Casa domotica Souliss – Nodo con RS-485

Nodo con RS-485: parte prima

Premessa prima di integrare il modulo nel progetto del nodo.

Con l’utilizzo del modulo di figura 1 si può implementare ad arduino la seriale RS-485 per inviare dati su lunghe distanze (fino a 1 Km) con un semplice doppino intrecciato.

RS485 Module.jpg

Figura 1

Lo schema elettrico relativo al modulo RS-485 è mostrato in figura 2.

RS-485 Arduino Module
Figura 2

La rete di periferiche RS-485, collegate tra loro con i pin A e B, vedi figura 3, ha resistenze da 120 ohm di terminazione ad ogni estremità, già incluse sul modulo (R7). Se si utilizzano più di 2 moduli sulla propria rete RS-485,  è necessario rimuovere la resistenza da 120 ohm (R7) su quei moduli intermedi.

Connessione RS-485
Figura 3 – Connessione RS-485

Teoria in breve.

La connessione seriale utilizzata è in configurazione a due fili twistati, half-duplex e multipunto. Lo standard specifica un sistema di gestione del segnale in forma differenziale: la differenza tra la tensione presente sui due fili costituisce il dato in transito. Una polarità indica un livello logico 1, quella inversa indica il livello logico 0. La differenza di potenziale deve essere di almeno 0,2 V per un’operazione valida, ma qualsiasi tensione compresa tra +12 V e −7 V permette il corretto funzionamento del ricevitore.

 

Arduino Souliss e ESP8266

ESP8266: Primo test come gateway.

Con pochi euro ho acquistato sul sito di www.dx.com, due pezzi di ESP8266 da programmare con il framework di Souliss , nello specifico il modello scelto è il ESP-01.

ESP8266
ESP-01

Il collegamento effettuato per la programmazione è il seguente:

Prog_ESP8266

Da tener ben presente che il chip funziona a 3,3V e non a 5V come per Arduino, il pin di GPIO0 durante la programmazione viene collegato a GND, successivamente, nel mio test, viene collegato a un led con opportuna resistenza, per verificarne il funzionamento. Nel mio programmatore, un CP2102, il filo verde con nome RES in realtà è il 3,3V che serve ad alimentare il ESP8266, il Jumper nel caso della foto di seguito è nella posizione di accensione del LED, spostandolo tutto a destra viene messo GPIO0 a GND e quindi nello stato di programmazione.

ESP8266_zoom

 

In questa prova il ESP8266 viene programmato come gateway, essendo l’unico nodo sulla rete di test, e dopo averne accertato il funzionamento modificherò opportunamente il software  per lavorare come peer sulla mia rete souliss.

Software Arduino Souliss e ESP8266

Il software caricato è il seguente:


/**************************************************************************
    Souliss - ESP8266 test come gateway

 Questo è l'esempio per il controllo un LED tramite un pulsante o l'applicazione
 Android SoulissApp (scaricabile da Play Store). 

 Eseguire questo codice su ESP8266 come WiFi SoC.

***************************************************************************/

// Configurare il framework
#include "bconf/MCU_ESP8266.h"
#include "conf/Gateway.h"
#include "conf/IPBroadcast.h"

// **** Definisco il nome e la password della rete WiFi a cui mi connetto ****
#define WIFICONF_INSKETCH
#define WiFi_SSID "xxxxxxx" //scrivi tra virgolette il nome della tua rete
#define WiFi_Password "xxxxxxxx" //scrivi tra virgolette la password della tua rete 

// Includere codice del framework e librerie
#include <ESP8266WiFi.h>
#include <EEPROM.h>
#include "Souliss.h"

// Questo identifica il numero della logica LED
#define MYLEDLOGIC 0 

// Definire la configurazione di rete
// in base alle impostazioni del router
uint8_t ip_address[4] = {192, 168, 2, 10};
uint8_t subnet_mask[4] = {255, 255, 255, 0};
uint8_t ip_gateway[4] = {192, 168, 2, 1};
#define Gateway_address 10
#define myvNet_address ip_address[3]
#define myvNet_subnet 0xFF00
#define myvNet_supern Gateway_address

// **** Define here the right pin for your ESP module ****
#define OUTPUTPIN 0

void setup()
{
 Initialize();

 // Impostare i parametri di rete
 Souliss_SetIPAddress(ip_address, subnet_mask, ip_gateway);
 SetAsGateway(myvNet_address); 

 // Definire una semplice logica di luce a LED
 Set_SimpleLight(MYLEDLOGIC); 

 pinMode(OUTPUTPIN, OUTPUT); // Pin alimentazione LED
}

void loop()
{
 // Qui iniziamo il ciclo
 EXECUTEFAST() {
 UPDATEFAST(); 

 // Elaboriamo la logica e relativo ingresso
 // e uscita ogni 50 millisecondi
 FAST_50ms() {
 // Set del LED come da comando
 Logic_SimpleLight(MYLEDLOGIC);
 DigOut(OUTPUTPIN, Souliss_T1n_Coil, MYLEDLOGIC);
 } 

 // Qui si gestisce la comunicazione
 FAST_GatewayComms(); 

 }
} 

Di seguito la figura illustra il messaggio finale della compilazione ed in basso a destra i parametri settati relativi alla tipologia di chip usato.

Comp_ESP8266
Compilazione ESP8266

Le figure di seguito illustrano il funzionamento relativo al tipico T11 con uscita sul GPIO0, quella di sinistra in stato di ON e a destra lo stato di OFF

ESP8266_ON
ESP8266 ON
ESP8266_OFF
ESP8266 OFF

 

 

 

 

Inserisco  un breve video del funzionamento.

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.

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

// 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);
 }
 }
}

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