Libreria PID Android HMI

La BieMme è orgogliosa di annunciare di aver sviluppato una libreria dedicata ai pannelli Ltouch7 GS che permetto l’utilizzo della funzione PID. Grazie al sistema operativo Android sarà molto più facile creare e personalizzare le tue esigenze.

Non vi servirà altro che solamente un nostro HMI Android Ltouch7 GS che ha di serie due ingressi analogici con risoluzione fino a 17bit, 4 uscite a relè oppure la linea RS485 Modbus che permette l’interfaciamento con sucessiva modulazione a dispositivi slave.

La libreria ha il nome di MathProcess, con molteplici funzionalità e personalizzazioni. Di seguito alcuni metodi disponibili:

  • String GetVersion();
    restituisce la versione della libreria in uso
  • int InitPid(char channels):
    Anzitutto chiamare questa funzione per dichiarare il numero di canali richiesti
    channels : numero di canali da gestire
    valori di ritorno : EXIT_FAIL, EXIT_OK
  • void ClosePid()
    chiamare alla chiusura dell’applicazione per liberare le risorse allocate
  • double[] ChangePidGains(char ch, double p_gain, double i_gain, double d_gain)
    imposta i guadagni per il canale selezionato
    restituisce i guadagni applicati
  • double[] GetPidSettings(char ch)
    restituisce le impostazioni in uso per il canale impostato: p_gain, i_gain, d_gain , inverted state (true se invertito, false altrimenti)
  • public native int SetPidCh(boolean inverted, char ch, double p_gain, double i_gain, double d_gain, int sample_time_ms, int pulse_time_ms, double refval, double maxval, double minval);
    boolean inverted:
    char ch: canale da configurare
    double p_gain, double i_gain, double d_gain : guadagni
    int sample_time_ms : tempo in ms tra 2 elaborazioni
    int pulse_time_ms : durata dell’impulso nell’ uscita a relè (durata dell’impulso intesa come somma del tempo in cui l’uscita è alto e in cui è bassa)
    double refval : valore target per il segnale
    double maxval : valore massimo per il segnale oltre cui non si deve salire
    double minval : valore minimo per il segnale oltre cui non si deve scendere
  • public native int PidLoop(double []inputs,double []outputs);
    double []inputs :vettore conente le acquisizioni dagli ingressi analogici
    double []outputs : vettore contenente i valori calcolati dalla libreria pid

La funzione MathProcess.SetPidCh dovrà essere richiamata ciclicamente attraverso un thread, questa potrà comandare dei relè a bordo oppure modulare altri dispositivi attraverso la porta seriale Modbus di serie.

How to measure a level trought analog inputs and with LtouchGS

Our LtouchGS product is ideally suited for the industrial environment, where analog signals are to be acquired.
LtouchGS comes standard with two analog inputs, voltage or current, with a resolution of 17 bits.
In this article, we explain the main steps to create an application that detects a tank level and then triggers an alarm and sends it via email.

First we need to connect our level sensor with 0.20 mA analog output to our input, following this image.

We must respect the polarity and so we connect the ground of power supply wire to the GND terminal of the Ltouch.
The output wire of sensor must be connected to the current mA terminal of the Ltouch.

Finally, the code for this setup is very simple. The following diagram measures the 0-20mA signals on channel 1, with a resolution of 17 bits, and maps the current over a level range. This mapping will depend on the transmitter, the example below maps from 0 mA to 0 cm and from 20 mA to 100 cm.

Now let’s move on to the code part for the APP:

You can use the library BMTouch to configure and read the values in to android studio.

View this for download library 

View this for how to use BMtouch Library

To configure the sampling frequency directly write the value of the frequency and scale through the library subito dopo protected void onCreate :

BMTouch.ADC_set_scale((byte) 0, (byte) 0, 1);

BMTouch.ADC_set_frequency((byte) 0, 15);

Now we can call the library function to read the analog value through a single call or by creating a TimerTask that executes this cyclically, you can see on this video how to do it.

ch1_val = BMTouch.ADC_read_channel((byte) 0, (byte)0);

ich1_val returns the value read from 0 to 32768, it is up to us to know that 32768 is hight 100 cm, so we can make a portion and find the quantity of the tank.

To send an email at a minimum or maximum threshold, we can watch this video that explains in detail how to send an email through gmail.

that’s all, if you have any doubts or requests, contact us by email.

PT100 with 4-20mA transmitter

The PT100 and PT1000 are standard industrial temperature sensors (RTD = Resistance Temperature Detectors) that can easily be used with an Ltouch43 and Ltouch7GS by adding a 4-20mA transmitter that converts the measured resistance into a 4-20mA signal.

The PT100 sensor comes with 2, 3, or 4 wires. 2 wires give us the resistance of the sensor PLUS the leads, so we can’t be sure about the exact sensor resistance. 3 wires solve this by adding a wire to one side, so we can measure also the resistance of 1 lead wire, and assume the other one is similar. 4 wires allow us to measure the resistance of both lead wires. More details here.

A common way to use the PT100 is to add a transmiter, that converts the resistance into a 4-20mA signal. Such current loop is stable over long cable lengths. In this example we use a K109PT transmitter which can handle 2,3,4 wire PT100 sensors, and has programmable ranges and error handling.

The Ltouch7 GS has 2 analog input channels, we can connect up to 2 PT100 sensors. In below example we connect 1.

This is a close-up of our transmitter:

  • PT100 connected with 3 wires, on terminals 2, 3, 4 as per Seneca datasheet. the sensor resistance is between terminal 2 and 3 (red and white wires)
  • The converter needs a separate power supply and we connect the 24Vdc to terminals 7 and 8
  • We connect the current signal coming out of the K109PT board to the analog input of our Ltouch7 GS. We must respect the polarity and so we connect the gray wire to the GND terminal of the Ltouch.
  • The orange wire must be connected to the current mA terminal of the Ltouch
Finally, the code for this setup is very simple. The following diagram measures the 0-20mA signals on channel 1, with a resolution of 17 bits, and maps the current over a temperature range. This mapping will depend on the transmitter, the example below maps from 0 mA to 0 degrees and from 20 mA to 100 degrees (constants defined by the dip switches).
Now let’s move on to the code part for the APP:

You can use the library BMTouch to configure and read the values in to android studio.

View this for download library 

View this for how to use BMtouch Library

To configure the sampling frequency directly write the value of the frequency and scale through the library subito dopo protected void onCreate :

BMTouch.ADC_set_scale((byte) 0, (byte) 0, 1);

BMTouch.ADC_set_frequency((byte) 0, 15);

Now we can call the library function to read the analog value through a single call or by creating a TimerTask that executes this cyclically :

ch1_val = BMTouch.ADC_read_channel((byte) 0, (byte)0);

ch1_val returns the value read from 0 to 32768, it’s up to us to multiply it by 100 and divide by 32768 to find the temperature.

temp = (ch1_val*100)/32768;

that’s all, if you have any questions please contact us

Nuovo HMI Ltouch Plus

E’ in arrivo un nuovo pannello HMI touch screen 7″ sistema operativo Android 5.1 con ingressi ed uscite a bordo.

16 Ingressi/Uscite digitali, 4 ingressi analogici configurabili con risoluzione 16bit, 4 uscite analogiche 0..10 Volt / 4..20 mA.

Display capacitivo 7″ HD con risoluzione 1280×800 e protezione IP54. Monta un processore quad core A9 con frequenza scalabile da 400 a 1.4 G Hz.

Verrà distribuito con una libreria nativa per un facile e veloce gestione degli ingressi/uscite.

Uso dei Relè con la nuova libreria Android

In questo semplice post vi spiego come usare i 4 relè a bordo del Ltouch 4.3, HMI touch screen da 4.3″ con sistema operativo Android

La nuova libreria è scaricabile dal nostro portale download.

Tutti e quattro i relè sono disponibili in contatto di scambio con la possibilità di collegarli in Normalmente Aperto oppure in Normalmente chiuso. Un’ulteriore comodità di questi relè è la loro connessione grazie a morsetti estraibili così da permettere un plug and play veloce ed istantaneo.

Creiamo un progetto utilizzando uno degli ambienti di sviluppo per Android, in questo caso usiamo Android Sudio.

Dopo aver aggiunto la libreria BMTouch nel nostro progetto, non si fa altro che eseguire tre semplici operazioni:

1)  Inizializziamo la nostra libreria subito dopo onCreate con il comando byte LIBsetup(long pinsetting):

BMTouch.LIBsetup( BMTouch.EN15+ BMTouch.EN14 + BMTouch.EN13 + BMTouch.EN12);

pinsetting: ()long), a ciascun bit corrisponde lo stato bloccato (bit a 0) o sbloccato di un piedino (bit a 1) .
LSB del primo byte corrisoponde a GP0
Se il piedino non viene sbloccato, ogni operazione di lettura scrittura su di esso termina con un codice di errore.
exit codes: EXIT_OK per uscita terminata con successo
EXIT_HW_ERROR : hardware non riconosciuto
EXIT_WRONG_PARAM : si è cercato di attivare un piedino non esistente
EXIT_FAIL nel caso di errori

Fisicamente i relè sono assegnati così:
Relè 1 : BMTouch.EN12
Relè 2 : BMTouch.EN13
Relè 3 : BMTouch.EN14
Relè 4 : BMTouch.EN15

2) Oltre al comando di questi relè la Libreria BMTouch dispone di ulteriori input/output GPIO fisicamente presenti nell’Ltouch4.3 e dato che i relè sono come uscite, configuriamo questi piedini in modalità uscita.

byte GPIOsetup (byte pin,byte mode,byte value):

val[0]= 0;
<%%KEEPWHITESPACE%%>        BMTouch.GPIOSetupOut(BMTouch.GP15, val[0]);
<%%KEEPWHITESPACE%%>        BMTouch.GPIOSetupOut(BMTouch.GP14, val[0]);
<%%KEEPWHITESPACE%%>        BMTouch.GPIOSetupOut(BMTouch.GP13, val[0]);
<%%KEEPWHITESPACE%%>        BMTouch.GPIOSetupOut(BMTouch.GP12, val[0]);

per configurare ciascun piedino di gpio;
pin: indice compreso tra 0 e lastgpio() , indica il piedino di gpio da utilizzare secondo la numerazione indicata per la scheda in uso
mode: indica il tipo di accesso richiesto:
0x00 – GPIO_OUT : piedino di uscita
0x10 – GPIO_IN : piedino di ingresso
0x20 – GPIO_RELEASE : rilascia il piedino
value: impostazione iniziale per i piedini configurati come uscita; ininfluente per i piedini impostati come ingresso.
Exit codes: EXIT_FAIL (1) : errore generico
EXIT_WRONG_PARAM (2) : specificato un piedino non valido
PIN_LOCKED (3) : il piedino non è stato sbloccato durante l’inizializzazione
EXIT_OK (0) : uscita terminata con successo
EXIT_SETTING_NOT_APPLICABLE : se viene impostata la scrittura o la lettura per un piedino che non la supporta

3) Supponiamo che vogliamo commutare tutti i 4 relè in ON, non ci resta che usare il comando:

byte GPIOwrite (byte pin,byte value):

val[0]= 1;
tmp=BMTouch.GPIOWrite(BMTouch.GP15, val[0]);
tmp=BMTouch.GPIOWrite(BMTouch.GP14, val[0]);
tmp=BMTouch.GPIOWrite(BMTouch.GP13, val[0]);
tmp=BMTouch.GPIOWrite(BMTouch.GP12, val[0]);

Questo non configura il piedino come uscita , ma imposta il valore in uscita nel caso di piedini configurati come uscita.
pin : intero che indica il numero di piedino, secondo la numerazione di cui sopra
value : valori possibili 0x01 – GPIO_PIN_HI
0x00 – GPIO_PIN_LOW
Exit codes: EXIT_FAIL (1) :errore generico
EXIT_WRONG_PARAM (2) :pin o value non validi
PIN_LOCKED (3) :piedino non sbloccato/disponibile
EXIT_SETTING_NOT_APPLICABLE : se viene richiesta la scrittura su un piedino che non la supporta

 

Nel prossimo post vi spiegheremo come usare la libreria con la funzione modbus RTU.

Nuovo pannello touch HMI 4,3 ” Android Ltouch43

Siamo orgogliosi di annunciare che un nuovo prodotto sarà presto rilasciato. E’ un pannello touch Android per progetti HMI di automazione industriale e domotica.

Si caratterizza di un display multi touch resisttivo da 4,3″ con un processore ancora più performante Samsung S5P6818 64-bit Octa-Core  frequenza scalabile 8*Cortex -A53  da 400MHz a 1.4 MHz dotato di uscite a relè e interfaccia di comunicazione RS485. Dispone di una memoria RAM di 2GB 32bit DDR3 ed una memoria interna eMMC da 16GB con uno slot MICROSD per memorie sopra i 128GB.

Pieno supporto a Ethernet come anche a reti wifi WAN 802.11 b/g/n. dotato di antenna interna mod. porcelain ipx interfacee bluetooth 4.0 dual mode.

Il prodotto è disponibile con cornice frontale in acciaio inox finitura a specchio con una cover posteriore sempre in acciaio inox 10/10 finitura 2B.razie a questi layer di protezione e ad un particolare processo di assemblaggio, il prodotto raggiunge un livello di protezione IP54 nella parte frontale (acqua e polvere).

Nuove librerie ancora più veloci e performanti sviluppate dal nostro staff tecnico, scaricabili dalla nostra area download,  per disporre un massimo controllo e comando della periferica RS485 modbus e ingressi / uscite digitali (GPIO), 4 uscite a relè con contatto di scambio 5 A .

AUDIO e VIDEO : Microfono a bordo e jack audio 3.5mm e uscita aggiuntiva in HMI Type-A 1-1.4A

La periferica RS485 è completamente optoisolata con possibilità in modalità MASTER di polarizzare la linea tramite un

semplice dip-switch posto sul retro e attivare la resistenza di terminazione linea di 120 ohm.

Alimentazione a 24 Vdc con riconoscimento intelligente della tensione di linea, se al di sopra o di sotto del 20% il nostro Ltouch4_3 si spegne.

Display capacitivo 4,3 ” con risoluzione 480 X 800 dimensioni 55 x 93 mm

Sarà presto disponibile nel nostro wiki tutto il supporto tecnico per la realizzazione dei Vostri progetti domotici ed industriali.

Come configurare l’Android Vnc Server sui nuovi panneli Ltouch

In questo breve tutorial vedremo come collegarci ai ai nostri dispositivi android tramite Android Vnc Server. Tutta la serie di panneli come il Ltouch43 – Ltouch7″ – Ltouch10 “ può supportare questa funzione

Occorrerà l’eseguibile androidvncserver ed un visualizzatore da installare sul pc (ad esempio tightvnc);
androidvncserver richiede i permessi di root, occorrerà quindi un dispositivo android “rooted” per non essere vincolati all’uso di adb.
Nei nostri pannelli questo è possibile !

Per non dover lanciare un eseguibile specificandone anche il percorso, questo va copiato in una directory che faccia parte del percorso di ricerca degli eseguibili.
Visualizziamolo aprendo il prompt dei comandi di windows e lanciando:

adb shell echo $PATH

Ad esempio:

/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin

scegliamo per semplicità /system/bin
normalmente la partizione montata su /system è in sola lettura, occorrerà rimontarla in lettura-scrittura:

adb remount

copiamo androidvncserver, che si può scaricare dal nostro sito nell’area download, in un percorso del nostro computer da dove sia possibile lanciare adb e carichiamolo nel dispositivo android:

adb push androidvncserver /system/bin/

accediamo al dispositivo android :

adb shell

impostiamo i permessi

chmod 755 /system/bin/androidvncserver

i parametri supportati si visualizzano con il comando androidvncserver -?
si consiglia di non modificare metodo di cattura lasciando framebuffer (i frame vengono letti da /dev/graphics/fb0), non tutti i metodi di cattura sono supportati da i dispositivi.
l’opzione -r permtte di impostare la rotazione dello schermo in gradi, con valori ammessi: 0 90 180 270
l’opzione -s permette di impostare il fattore di scala, non tutti i fattori di scala sono accettati, sono valori validi: 25 50 100
l’opzione -p permette di impostare una password

occorre prendere nota dell’indirizzo ip in uso ad esempio con il comando netcfg dalla shell adb (la rete wifi è indicata da wlan0 e quella cablata da eth0, ma questi nomi possono cambiare a seconda del
dispositivo android).

androidvncserver -r 90 -s 50 -p abcdef
notiamo la riga:
Listening for VNC connections on TCP port 5901
indica a quale porta connettersi con il visualizzatore, se ad esempio si usa tight vnc come visualizzatore e l’ip annotato era 192.168.2.15 , specificheremo
come remote host: 192.168.2.15:5901

in questo modo il terminale adb non è più disponibile, per terminare androidvncserver si usa la combinazione di tasti ctrl+c
per mantenerlo in eseuzione in background basta aggiungere & a fine riga di comando: androidvncserver -r 90 -s 50 -p abcdef &
per terminarne l’esecuzione usare i comandi:
ps | grep androidvncserver
annotarne il pid e terminarne l’esecuzione con
kill seguito dal pid appena annotato

con un dispositivo rooted è possibile installare busybox e creare uno script per lanciare androidvncserver direttamente dal desktop di android.
un semplice script (se androidvncserver è stato copiato in /system/bin/):

#!/system/bin/sh
/system/bin/androidvncserver -r 90 -s 50 -p abcdef

Tutto qua. Se avete trovato interessante l’articolo, condividetelo! 🙂 Come al solito, i commendi sono sempre ben accetti.

COME FARE UN GRAFICO CON ANDROID STUDIO E IL PLTOUCH – (Parte 3) Finalizzazione

In questa lezione vi mostriamo come finalizzare il grafico appena realizzato.

Inanzitutto tramite la vostra funzione “getData()” per prendetevi i dati e sistemate su una/piu variabili, poi aggiungete uno o piu parametri per ogni giorno della settimana inserito:


	int[][] datas = getData();	 	// calls a user created function tha gets all the data from source
	int[] d= datas [0];
	yAx2.add(new Entry(d[0],0)); 		// it requires a new Entry, Entry requires a numeric value, and for 2th argument an Integer index
	yAx2.add(new Entry(d[1],1));
	yAx2.add(new Entry(d[2],2));
	yAx2.add(new Entry(d[3],3));
	yAx2.add(new Entry(d[4],4));
	yAx2.add(new Entry(d[5],5));
	yAx2.add(new Entry(d[6],6));

Attivaze lo Zoom, lo scroll, impostate eventuali limiti di spostamento per le varie Asssi e altre opzioni.


	lc.setVisibleXRangeMaximum(65f);					//Sets the max visible field on the x Axis
        lc.setVisibleYRangeMaximum(50, YAxis.AxisDependency.LEFT);		//Sets the max visible field on the y Axis
        lc.setTouchEnabled(true);						//Activates the touch Control
        lc.setDragEnabled(true);						//Enables dragging
        lc.getAxisLeft().setAxisMinValue(0);					//Set minimum axis Zoom level
        lc.getAxisLeft().setAxisMaxValue(50);					//Set maximum axis Zoom level
        lc.setScaleMinima(0, 1);						//Set the graph total scale, from min to max

Abbiamo così realizzato con semplicità il nostro grafico!

COME FARE UN GRAFICO CON ANDROID STUDIO E IL PLTOUCH – (Parte 1) Inizializzazione

In questo esempio vi mostriamo come creare un grafico con Android Studio, sui nostri dispositivi PlTouch. Per realizzare il grafico,
utilizzare la libreria esterna MpAndroidChart, reperibile qui, oppure senza scaricarla potrete includerla sucessivamente nel vostro gradle build.

Questo Articolo si divide in tre Post, Inizializzazione, Settaggio dati, Finalizzazione

Per prima cosa aprite un vostro progetto o createne uno nuovo, tenendo conto che potrete posizionare il grafico su una Activity apposita oppure direttamente
sulla Main Activity.

Se volete importare la Libreria scaricandola, e non sapete come importarla in android studio, qui cè un tutorial che fa al caso vostro, altrimenti,
seguite la procedura tramite build gradle:
COLLEGAMENTO TRAMITE BUILD GRADLE:
Andate nel vostro gradle.build file e incollate le seguenti righe di codice avendo cura di posizionarle fuori application.

<code>
repositories {
    maven { url 'https://jitpack.io' }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.github.PhilJay:MPAndroidChart:v2.2.4'
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support:design:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}

</code>

Bene, ora la libreria che vi permetterà di realizzare il grafico, è stata inclusa nel progetto!
Nel prossimo post vedremo come inizializzare ogni Componente in maniera corretta, restate collegati.

COME FARE UN GRAFICO CON ANDROID STUDIO E IL PLTOUCH – (Parte 2) Settaggio Dati

Per prima cosa avremmo bisogno di posizione nel file layout.xml dell’Activity il grafico, per fare ciò basta cercare nel layout designer il lineChart e inserirlo, o scrivere a mano il tag lineChart nel file xml.

A questo punto abbiamo bisogno di dichiarare alcune variabili, che ci permetterano di comunicare con gli elementi interni di questo Plugin/Libreria:



    LineChart lc; 				//lineChart Main Component
    ArrayList<String> xAx2;			//xAxis titles Array
    ArrayList<Entry> yAx2;			//yAx entry Array (Values associated with an index)
    ArrayList<ILineDataSet> dss;		//multidimensional Array containing the whole DataSet
    LineDataSet lds;			//the DataSet Component


Poi inizializziamo ogni componente, nel metodo onCreate dell’Activity:


    lc = (LineChart) findViewById(R.id.lnCH1);		//xml layout Id Reference
    dss = new ArrayList<>();				//Initiate the DataSet Component as an empty Array
    xAx2 = new ArrayList<>();				//Initiate xAxis titles as an empty Array
    yAx2 = new ArrayList<>();				//Initiate yAxis values as an empty Array

Fatto questo dobbiamo riempire il grafico con dei dati, per fare questo prima di tutto decidiamo come salvare i dati che poi andranno resi disponibili al grafico.
– TRAMITE FILE DI TESTO Vai al Tutorial
– TRAMITE DATABASE

Una volta creato il sistema di salvataggio dei dati, dopo aver istanziato i dati e fatti i dovuti controlli, creare una funzione per caricare i dati che avete salvato, in questo esempio chiameremo la funzione “getData()”

Aggiungete all’ArrayList tutti i giorni della Settimana, questi dati compariranno come titoli sul grafico.


        xAx2.add("LUNEDI");		//It only adds a string parameter to the xAxis of the Graph as a Title
        xAx2.add("MARTEDI");
        xAx2.add("MERCOLEDI");
        xAx2.add("GIOVEDI");
        xAx2.add("VENERDI");
        xAx2.add("SABATO");
        xAx2.add("DOMENICA");

Nel prossimo post vedremo come aggiungere dei valori al grafico, e completare la configurazione, restate collegati.