Visualizzazione post con etichetta seriale. Mostra tutti i post
Visualizzazione post con etichetta seriale. Mostra tutti i post

mercoledì 28 luglio 2021

ESP32 esperienze con ModBus

 Nell'era di Industria 4.0 tutte le aziende stanno effettuando la conversione dei propri sistemi verso i nuovi metodi di  gestione dei dati. Oggi i nuovi macchinari sono tutti "intelligenti", cioè sono in grado di trasmettere il proprio stato e lo stato delle lavorazioni, verso dashboard di controllo sempre più avanzate, che rendono la gestione del tempo e delle lavorazioni sempre più efficacie e consentono anche la manutenzione preventiva, per evitare i malfunzionamenti ed eventuali onerosi blocchi macchina.


Anche i macchinari più anziani, però, possono essere resi Smart, con l'ausilio di sensori e metodi di trasmissione dei dati sempre più piccoli e facilmente integrabili.

In questi giorni sto aiutando un amico proprio in un progetto di questo tipo, cioè la conversione di un macchinario al quale è stato già integrato un sistema di trasmissione dei dati su modulo ModBus seriale RS485. Il sistema attualmente trasmette i dati via cavo seriale RS485, l'intenzione è quella di convertire il sistema per poter trasmettere via WiFi gli stessi dati.


La scelta naturalmente è stata quella di utilizzare i moduli ESP32, che sono economici e molto facili da utilizzare, veloci e sicuri.

Riporto qui a fianco lo schema della GPIO del modulo che ho utilizzato per fare i test. Ho scelto il modello Mini ESP32 in quanto per questo progetto non ci sono particolari necessità di piedinatura, ed il fattore forma, per semplificare la possibilità di integrazione è una delle variabili più importanti.

Per prima cosa, ho caricato sul mio ESP32 il Micropython, come descritto in questa veloce guida ed anche in questo post qui

Successivamente, come spiegato qui, ho collegato il modulo attraverso RSHELL che per lavorare con Micropython è lo strumento più utile in assoluto.

. Sempre attraverso RSHELL ho caricato la libreria che gestirà la comunicazione con il device già inserito nella apparecchiatura, la libreria uModBus che è molto essenziale e gestisce in modo corretto la conversione dei pacchetti con i device in modalità RTU.


Per fare i primi test ho caricato la libreria direttamente dentro la flash del ESP32, anche se la maniera migliore per lavorare con librerie specifiche sarebbe quella di compilare il Micropython direttamente con le librerie che servono, attraverso l'SDK che Espressif mette a disposizione. Lo farò sicuramente finiti i primi test.

A questo punto, per poter controllare il funzionamento o meno del sistema appena montato ho bisogno di un device slave che risponda a chiamate ModBus. Problema!. In casa non ho nulla di questo genere! Ho scoperto però, che esiste un programma linux che consente di simulare il comportamento di un device slave ModBus, proprio per poter testare sistemi come il mio..... Ottimo!

Diagslave funziona in diverse modalità, a me interessa che risponda a chiamate RTU seriali, quindi , caricato su una Raspberry Pi sulla quale sta girando un Debian appena aggiornato all'utlima versione, faccio partire il programma con :

arm-linux-gnueabihf/diagslave -a 1 -m rtu -b 4800 -d 8 -s 1 -p none /dev/ttyAMA0

chiamando l'help si ha la spiegazione di ogni parametro utilizzabile, per la mia configurazione io chiamo il nuovo device 1 con -a 1 (a = address), scelgo il modo RTU con -m rtu, scelgo la velocità di comunicazione con -b 4800 -d 8 -s 1 -p none   e scelgo la seriale sul quale inviare la comunicazione  /dev/ttyAMA0

che corrisponde ai pin UART0 della Raspberry Pi

Pin 8 e 10 come da schema GPIO qui a fianco riportato.

Infatti, proprio sui Pin 8 e 10 , rispettivamente TX e RX della seriale interna UART0 di Raspberry Pi mi sono collegato con i cavetti provenienti dall'ESP32. Sul ESP32 ho indirizzato la seriale sui Pin 12 e 4 (sono Pin non utilizzati da nessun servizio interno e sui quali avevo gia' saldato di Pin rigidi, quindi ho scelto questi per comodità, ma possono essere scelti due Pin qualsiasi, ovviamente liberi da altri servizi).

A questo punto, facendo una richiesta ModBus da ESP32 il programma che gira su Raspberry Pi e che è in ascolto sulla seriale ttyAMA0, dovrebbe rispondere regolarmente.

Per effettuare le richieste dal lato ESP32 ho creato queste  poche righe di codice Micropython:

from uModBusSerial import uModBusSerial as Seriale

seriale = Seriale(uart_id = 2, baudrate = 4800, data_bits=8, stop_bits=1, parity= None, pins=(12,4), ctrl_pin=None) # inizializzo la seriale e creo l'oggetto

seriale.write_single_register(1, 100, 111, True)    #Scrive un singolo registro  sullo Slave 1 nel registro 100 scrive il valore 111

seriale.read_input_registers(1, 100, 3, signed=True) #Legge 3 registri a partire dal 100 

seriale.read_discrete_inputs(1, 99, 3)[0:3] #Legge 3 registri a partire dal 99


Il codice sopra ovviamente è solo per testare la comunicazione e fa queste cose:

from uModBusSerial import uModBusSerial as Seriale

Carica la libreria, 

seriale = Seriale(uart_id = 2, baudrate = 4800, data_bits=8, stop_bits=1, parity= None, pins=(12,4), ctrl_pin=None)

crea l'oggetto "seriale " ,passando i parametri per la configurazione della seriale sui PIN scelti in fase di cablaggio.

seriale.write_single_register(1, 100, 111, True)

Crea una chiamata di scrittura  con seriale.write_single_register(device_ID, REGISTRO, VALORE, segno)

device_ID = il numero identificativo del device ( in una rete ModBus su seriale RS485 possono coesistere fino a 255 device, che avranno ID diversi in funzione della loro collocazione fisica (1, 2 3,......, 255) 

REGISTRO E VALORE sono parametri intuitivi

segno se settato = a True, mantiene il segno scritto nel registro, se settato a False, rende il valore del registro senza tenere conto del segno eventuale (elimina il segno meno davanti al valore del registro se esiste)

seriale.read_input_registers(1, 100, 3, signed=True)

Crea una chiamata di lettura di uno specifico registro (in questo caso il 100, quello su cui, alla riga precedente, avevo scritto il valore 111) il valore 3 indica al sistema di leggere 3 registri consecutivi, che nel nostro caso varranno 111 (l'unico valore che ho programmato alla riga precedente), 0, 0 (naturalmente i valori dei registri 101 e 102 saranno 0 in quanto non sono ancora stati scritti.

seriale.read_discrete_inputs(1, 99, 3)[0:3] 

Questo è un metodo di lettura alternativo, che consente di leggere il contenuto di uno o più  registri di un determinato device. Questo metodo ha bisogno della specifica dell'intervallo di lettura tra parentesi quadre, come riportato nel comando sopra.

Qui sotto il video dove e' possibile vedere le due finestre di terminale affiancate, una corrisponde al sistema Diagslave (quella in alto a DX) l'altra finestra, corrisponde alle chiamate effettuate dal modulo ESP32 utilizzato come Master in questa configurazione.



Buon Lavoro a tutti
TecnoGeppetto

domenica 25 luglio 2021

USB2serial PL2303 su Win 10

Con un laconico Deprecated Microsoft ha deciso di eliminare il driver  per le chiavette USB PL2303  definitivamente.


Seguendo questa guida si riesce a recuperare il device ed utilizzarlo regolarmente.

Grazie Windows !

http://www.ifamilysoftware.com/news37.html


forse anche qui 

http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=225&pcid=41



Istruzioni direttamente dal primo Sito elencato:


1. Download and Save the installer file at the link below:

https://www.ifamilysoftware.com/Drivers/PL2303_64bit_Installer.exe

You can just Save it to your Desktop to make it easier. Norton's 360 won't like it, so to save all the grief of dealing with that beast you might want to disable your anti-virus before running the installer.

2. Unplug all USB-To-Serial adapters and Double click on the installer "PL2303_64bit_Installer.exe". This file can be deleted later.

3. The "PL2303 Code 10 Fix" program will be installed along with a shortcut on your Windows Desktop.

4. Double click on the "PL2303 Code 10 Fix Shortcut"

5. Plug in one (1) of your USB-To-Serial adapters and click "Continue".

6. When it finishes, Reboot your computer.

7. Unplug the adapter and plug back in again. That's it! Donations are appreciated.:



A me ha funzionato subito.

Ciao a tutti

mercoledì 13 gennaio 2021

Collegare un display I2C alla Raspberry Pi

 Molto spesso nello sviluppo dei progettini con Raspberry si rende necessario visualizzare lo stato di esecuzione dei comandi o lo stato dei pin, insomma abbiamo bisogno di "vedere" a che punto ci stiamo trovando nell'esecuzione del nostro sistema. La maniera piu' veloce ed economica e' quella di utilizzare un display 1602 con integrata l'interfaccia I2c.


Il display in questione costa circa 2 euro su Aliexpress e consente di visualizzare 2 righe di 16 caratteri totalmente gestibili dal nostro programma. L'utilizzo della interfaccia I2C velocizza la comunicazione tra Raspberry e Display e fa risparmiare un po' di cavetteria che crea solo confusione e aumenta il rischio di malfunzionamenti.

Effettuati i collegamenti come da schema, non ci resta che utilizzare una libreria per cominciare a comunicare con il Display.

Ho trovato questa libreria  che aiuta nella gestione del Display e che e' molto facile installare ed utilizzare.

Cominciamo: (da Github)

Installation

  • Install git

    sudo apt install git
    
  • Clone the repo in your pi home directory

    cd /home/pi/
    git clone https://github.com/the-raspberry-pi-guy/lcd.git
    cd lcd/
    
  • Run the automatic installation script with sudo permission

    sudo ./install.sh
    
  • After rebooting, try one of the demos

    cd /home/pi/lcd/
    ./demo_clock.py


Ecco il risultato:



Questo e' il circuito completo che ho montato per farlo diventare una Radio Web.







domenica 23 luglio 2017

Orange Pi 2G IOT setup

Do po aver ricevuto la prima scheda Orange Pi Zero, mi sono deciso ad acquistare anche il modello 2G IOT che sembra una scheda fatta apposta per la gestione dei sensori e la costruzione di device linux embedded molto piccoli e potenti.
 La scheda mi e' appena arrivata ed ho dovuto iniziare subito la lotta per farle digerire la microSD del sistema operativo.

Si, sembra proprio che la Orange PI 2G IOT sia molto piu' schizzinosa della sua sorellina maggiore, la Zero, nella accettazione delle microSD dove gira il sistema operativo. Infatti la medesima SD utilizzata per per la Zero, anhce dopo aver sostituito il SO con quello regolarmente scaricato dal sito ufficiale, non intende funzionare. Il fatto pero' che inserendola nella Zero invece, funzionasse perfettamente, mi ha fatto perdere diversi pomeriggi, prima di tentare la strada della sostituzione del supporto.
Comunque, dopo aver pèrovato con ben tre schede diverse, adesso ho trovato quella che va d'accordo con la versione 2G IOT, una mmicroSD da 8 GB della Verbatim classe 10,  sembra essere di suo gradimento.
Non sono state accettate invece ne' una Kingston da 8 GB classe 10, ne' una da 8GB classe 4.
Anche nel caso della Orange PI 2G IOT la documentazione fornita dal costruttore e' completa e dettagliata e consente con facilita' (SD permettendo) di costruire un sistema funzionante in meno di 10 minuti (magari non proprio la prima volta ! )
Ho scaricato la versione Armbian del sistema operativo ottimizzato per la scheda in oggetto, ed attraverso il collegamento con convertitore seriale, ho predisposto la connessione col pc, per il primo login nel sistema, come ben spiegato nel manuale delle istruzioni fornito dal costruttore.
Si accede al sistema con utente : root   e
password : 1234
E' consigliato modificare la password al primo accesso

Queste sono le caratteristiche principali della scheda:
  • 1GHz ARM Cortex-A5 32-bit processor
  • Vivante GC860 graphics processor 
  • 256MB RAM
  • 512MB of onboard NAND storage
  • External storage is supported by a microSD slot
  • A USB 2.0 port
  • MicroUSB OTG port
  • Audio jack
  • Microphone, and optional speaker.
  • Camera connector 
  • 40-pin GPIO connector
  • Power Supply – 5V via micro USB port; optional battery

venerdì 7 febbraio 2014

Display 1602 con adattatore seriale I2C

Per uno dei tanti progetti che ho iniziato (non posso dire terminato perche' buona parte dei miei progetti rimangono incompleti.... accidentaccio ho il segno dei gemelli come ascendente e mi rovina la produttivita'!!).
Allora, dicevo:
Sto construendo un sistema di stampa su Display a matrice di LED, vedi il post precedente.
Per poter controllare il menu di gestione del marchingegno (ps. si chiamera' Talking Car) ho bisogno di avere a disposizione un display con il menu per le scelte di visualizzazione, quindi ho prima collegato la shild apposita di Arduino, ma questa occupa troppi PIN e non mi lascia disponibili quelli di cui ho bisogno per far funzionare il tutto.Allora ho pensato di collegare un display semplice e l'interfaccia I2C (che consente di utilizzare fino a 8 display in cascata) ma soprattutto utilizza solo 2 PIN per la comunicazione.
I PIN sono A4 e A5 perche' sto utilizzando Arduino UNO Rev3
Con gli Arduino precedenti i piedini sono diversi (ho sulla scrivania un Arduino 2009 e sono diventato matto per un pomeriggio intero perche' non funzionava!!!)

Qui la libreria e gli sketch di prova

Sketch di test
/*
Progetto di TecnoGeppetto - by AEnima
Novara 02/02/2014
Parte del progetto Talkin'Car
***********

Collegamento di LCD 1602 con Convertitore I2C
la libreria setta i
PIN
A4  SDA e
A5  SCL
*/

#include 
#include 
LiquidCrystal_I2C lcd(0x27,16,2);  //    16x2 e il tipo del lcd -
                        //address si puo settare attraverso i jumper della scheda
char motd0[16] = "   Talkin' Car ";
char motd1[16] = "   by AEnima  ";
void setup()
{
  lcd.init();                      // inizializza  lcd
 
  // Stampa il messaggio su LCD.
  lcd.backlight();
  lcd.home();
  lcd.print("Hello, world!");
  delay(1000);
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print(motd0);
  lcd.setCursor(0,1);
  lcd.print(motd1);
 }
void loop()
{
}

domenica 17 novembre 2013

RTC e Beaglebone Black


 

Beh, e' un po' che non aggiorno piu' il sito, ma  questo non significa che sono rimasto fermo senza fare nulla, anzi!
In questo periodo ho messo le mani su tanti progetti nuovi, dei quali, uno per volta, vi rendero' partecipi.
Per oggi parliamo di aggiungere la RTC alla Beaglebone.
Verso le 11,30 di oggi, come sempre durante i sabati degli ultimi mesi, ero in chat su Skype con il mio compagno di avventura Simone e stavamo procedendo sul nostro progetto piu' importante di questo periodo che utilizza la Beaglebone Black come "cervello".
Durante la stesura del progetto, ci siamo accorti che poteva verificarsi la possibilita' che, in assenza di rete,  ci fosse un reboot del sistema, che avrebbe prodotto,  senza un adeguato circuito di mantenimento dell'ora, la perdita del date-time ed il suo reset alla data di sistema (alla data cioe' di quando e' stato generato il sistema).
 Questo ovviamente non va bene e deve essere corretto.
Da qui la scelta di montare una scheda RTC sul nostro sistema per far si che l'ora e la data di sistema venga mantenuta anche a sistema spento o fuori linea.
RTC, acronimo di Real Time Clock, e' una scheda con pochissimi componenti che utilizza un semplice integrato il DS1307     che funziona come orologio di sistema, ed al quale la macchina si riferisce per mantenere l'ora di sistema aggiornata al boot.
Quindi mi sono messo a rovistare nei cassetti ed ho tirato fuori la scheda RTC che sapevo di avere, quella della foto qui sopra.
 Il primo problema da risolvere per il collegamento della RTC in questione con la Beaglebone Black e' stato in ordine ai livelli di tensione in gioco, in quanto la Beaglebone Black lavora a 3 volt mentre la RTC che ho a disposizione e' fatta per lavorare a 5 volt. Non sarebbe un problema grave di per se, in quanto i livelli alto - basso sarebbero comunque compatibili, infatti lo stato "alto" sui pin SCL e SDA viene ottenuto con un a tensione che va da 2,2 a Vcc+0,3 Volts, quindi si potrebbe provare,  se non fossero previste le resistenze di pull-up  che mantengono lo stato delle porte sempre a 5Volts, la cui costanza pregiudicherebbe il funzionamento e potrebbe anche far danni irreparabili sulla nostra Beaglebone. Quindi altra ricerca frenetica nel fondo dei cassetti per individuare delle schedine che non ho mai utilizzato, ma che so' di avere.... vediamo..... ah, eccole,  ecco due bei  convertitori di livello. Queste schede sono proprio quelle che fanno al caso mio, servono per poter utilizzare, come nel mio caso, schede che funzionano a 5Volts con altre che invece hanno 3 volts come tensione di riferimento. Proprio quello che ci vuole.
Allora, montato il circuito con i jumper da test, ecco come si presenta la mia costruzione odierna:

A questo punto non resta che vedere se funziona.
Spento scollegato dalla alimentazione la Beaglebone Black, sono passato a cablare i cavi di alimentazione delle due schede collegate, i 5v per la la RTC e i 3v3 di alimentazione della scheda convertitore di livello, il GND e' in comune ( le tensioni sono tutte disponibili sulla GPIO della Beaglebone, come riportato sullo schema qui di fianco).
I segnali SDA ed SCL invece si trovano sui piedini numero 19-SCL e 20-SDA della GPIO. Appena collegato e alimentato il tutto sono andato a vedere se la BeagleBone "vede" la RTC e se riesce a ricevere i dati di date e time corretti facendo cosi:

Il comando per "vedere" se la periferica I2C comunica correttamente col sistema e'

i2cdetect -y -r 1
Tale comando che va dato con i poteri di root, fa parte di un pacchetto chiamato i2c-tools che in Arch linux (che e' il sistema che sto utilizzando in questo momento sulla BBB ) si istalla cosi:
pacman -S i2c-tools
Questo funziona in Arch, mentre in debian potrebbe gia' essere residente o, comunque, se previsto si potra' istallare con apt-get che e' il relativo gestore di pacchetti. Ma mi sto allontanando dal discorso iniziale, e torno subito in carreggiata.
Con il comando di cui sopra si ottiene uno specchietto dove all'indirizzo 68 si dovrebbe trovare la nostra periferica. Se si verifica questa situazione, la RTC comunica regolarmente con la BBB.
 A questo punto :
hwclock --debug   e' il cmando per vedere come il sistema recepisce l'ora dalla RTC, come si puo' vedere nella foto a fianco l'ora impostata in origine e' dell'anno 2000.
a questo punto con il comando      /usr/bin/ntpdate -b -s -u pool.ntp.org si aggiorna l'ora di sistema attraverso la lettura del server NTP

E poi  con     hwclock -w -f /dev/rtc0   si ottiene la scrittura dell'ora ricevuta dal server NTP nella eprom della RTC
Richiedendo quindi la lettura dell'ora all' hardware collegato, si ottiene adesso la corretta impostazione del date-time anche nella nostra RTC.