Il video che vi vogliamo presentare in questo post riguarda un esempio di Automazione Industriale Android. In particolare, vi faremo vedere un progetto che abbiamo realizzato in cui una <a title=”Ltouch biemme” href=”http://www.biemmeitalia.net/automazione-android-arduino-modbus/”>board Android</a>, <strong>Ltouch F</strong>, equipaggiata di un microprocessore <strong>Cortex A8 a 1Ghz</strong> controlla un espansione RS485 analogica, nello specifico ho usato un modulo espansione <strong>bm6PTI</strong>.

Dall’interfaccia touch screen Android è possibile:

<span style=”font-weight: 300;”>Acquisire distintamente 6 sonde di temperatura mod. pt100 classe B attraverso un’ espansione in RS485 utilizzando una comunicazione modbus ad una velocità di 19200</span><span style=”font-weight: 300;”>. </span>

Volendo è possibile estendere l’applicazione aggiungendo altri moduli di espansione fino ad un totale di 250 bm6PTI con un’ acquisizione di 1500 sonde di temperatura.

<center><iframe src=”http://www.youtube.com/embed/lSUiK8Q8SOw” frameborder=”0″ width=”420″ height=”315″></iframe></center>&nbsp;

I prerequisiti per la realizzazione di questo progetto sono i seguenti:
<ul>
<li><a title=”Download Eclipse IDE” href=”http://www.eclipse.org/downloads/” rel=”nofollow”>Eclipse IDE</a>,</li>
<li><a title=”Eclipse ADT plugin” href=”http://developer.android.com/tools/sdk/eclipse-adt.html” rel=”nofollow” target=”_blank”>Eclipse ADT</a> plugin,</li>
<li><a title=”Android SDK homepage” href=”http://developer.android.com/sdk/index.html” rel=”nofollow” target=”_blank”>Android SDK</a></li>
</ul>
<div>

Un progetto Android è formato dalla seguente struttura e file:
<ul>
<li>la cartella <strong>/src</strong>, contiene l’Activity principale e la classe Java che definisce le firme delle funzioni della libreria modbus che verranno utilizzate nel progetto</li>
<li>nella cartella <strong>libs/armeabi</strong>, si trova la libreria modbus</li>
<li>la cartella <strong>res/layout</strong>, contiene il layout dell’Activity principale</li>
<li>la cartella <strong>res/values</strong>, contiene il file string.xml</li>
<li>nella cartella root, ci sarà il file AndroidManifest.xml che definisce il progetto Android</li>
</ul>
</div>
Nel blocco di codice che segue, vi presento il layout xml che è collegato alla main activity.
Ho utilizzato un <a title=”Absolute layout Android” href=”http://developer.android.com/reference/android/widget/AbsoluteLayout.html” rel=”nofollow” target=”_blank”>AbsoluteLayout</a>, anche se altri layout più responsive potevano essere usati, in modo da riutilizzare l’applicazione in device con diverse risoluzioni. Ho volutamente scelto di non concentrarmi sui aspetti di design delle interfacce, ma bensì sugli aspetti più tecnici del progetto. Potreste essere voi, lettori, che attraverso la votra fantasia create la miglior interfaccia che risponda alle vostre necessità.

[sourcecode language=”xml”]
<AbsoluteLayout xmlns_android="http://schemas.android.com/apk/res/android"
xmlns_tools="http://schemas.android.com/tools"
android_layout_width="wrap_content"
android_layout_height="match_parent"
tools_context=".MainActivity" >

<TextView
android_id="@+id/TextView01"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_x="-346dp"
android_layout_y="7dp"
android_text="MAX"
android_textAppearance="?android:attr/textAppearanceSmall"
android_textColor="@color/red" />

<RelativeLayout
android_id="@+id/relativeLayout1"
android_layout_width="match_parent"
android_layout_height="wrap_content" >
</RelativeLayout>

<TextView
android_id="@+id/textView1"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_x="37dp"
android_layout_y="11dp"
android_text="ANALOG 1"
android_textAppearance="?android:attr/textAppearanceMedium"
android_textSize="18dp" />

<TextView
android_id="@+id/textView2"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_x="245dp"
android_layout_y="11dp"
android_text="ANALOG 2"
android_textAppearance="?android:attr/textAppearanceMedium"
android_textSize="18dp" />

<TextView
android_id="@+id/textTemp2"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_x="11dp"
android_layout_y="23dp"
android_text="0"
android_textColor="@color/red"
android_textSize="82dp" />

<TextView
android_id="@+id/texTemp1"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_layout_x="229dp"
android_layout_y="28dp"
android_text="0"
android_textColor="@color/red"
android_textSize="82dp" />

<TextView
android_id="@+id/TextTemp4"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_layout_x="457dp"
android_layout_y="28dp"
android_text="0"
android_textColor="@color/red"
android_textSize="82dp" />

<TextView
android_id="@+id/textView3"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_x="479dp"
android_layout_y="11dp"
android_text="ANALOG 3"
android_textAppearance="?android:attr/textAppearanceMedium"
android_textSize="18dp" />

<TextView
android_id="@+id/textTemp3"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_x="12dp"
android_layout_y="213dp"
android_text="0"
android_textColor="@color/red"
android_textSize="82dp" />

<TextView
android_id="@+id/TextView02"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_x="246dp"
android_layout_y="192dp"
android_text="ANALOG 5"
android_textAppearance="?android:attr/textAppearanceMedium"
android_textSize="18dp" />

<TextView
android_id="@+id/TextView03"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_x="50dp"
android_layout_y="192dp"
android_text="ANALOG 4"
android_textAppearance="?android:attr/textAppearanceMedium"
android_textSize="18dp" />

<TextView
android_id="@+id/TextTemp6"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_x="230dp"
android_layout_y="213dp"
android_text="0"
android_textColor="@color/red"
android_textSize="82dp" />

<TextView
android_id="@+id/TextTemp5"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_layout_x="452dp"
android_layout_y="213dp"
android_text="0"
android_textColor="@color/red"
android_textSize="82dp" />

<TextView
android_id="@+id/TextView04"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_x="480dp"
android_layout_y="192dp"
android_text="ANALOG 6"
android_textAppearance="?android:attr/textAppearanceMedium"
android_textSize="18dp" />
[/sourcecode]

<span style=”font-style: normal; font-weight: 300;”>La classe speciale </span><strong style=”font-style: normal;”>ModbusLib</strong><span style=”font-style: normal; font-weight: 300;”> contiene semplicemente la firma delle funzioni modbus che possono essere utilizzate nel progetto Android e che sono definite all’interno della libreria nativa.</span>

[sourcecode language=”xml”]

package com.biemme.modbus;
public class ModbusLib {
public native static int openCom(int baudrate, long rtimeout, long wtimeout);
public native static long ReadHoldingRegisters(int fd, int id, int address, int no_of_registers,int []holdingRegs);
public native static int closeCom(int fd);
static{
System.loadLibrary("com_biemme_modbus_ModbusLib");
}
}

[/sourcecode]

L’attività principale che sarà eseguita all’avvio del progetto si chiama MainActivity.java.
Come si vede dalla firma, MainActivity estende la classe Activity per poter esser una finestra Android visualizzabile.

[sourcecode language=”xml”]
public class MainActivity extends Activity implements OnClickListener {
[/sourcecode]

Il primo metodo che verrà eseguito in apertura della finestra è <strong>OnCreate</strong>. All’interno di questo blocco viene associato il content view (cioè il layout xml) e vengono memorizzati in attributi privati della classe i riferimenti agli elementi grafici della finestra quali testi, immagini ecc…., in modo tale che le loro proprietà possano essere modificare in un secondo momento.

[sourcecode language=”xml”]
protected void onCreate(Bundle savedInstanceState) {

requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

temperature1= (TextView) findViewById(R.id.texTemp1);
temperature2= (TextView) findViewById(R.id.textTemp2);
temperature3= (TextView) findViewById(R.id.textTemp3);
temperature4= (TextView) findViewById(R.id.TextTemp4);
temperature5= (TextView) findViewById(R.id.TextTemp5);
temperature6= (TextView) findViewById(R.id.TextTemp6);

}
[/sourcecode]

Il medoto <strong>onResume</strong> sarà eseguito non appena la finestra viene caricata, ma dopo onCreate oppure dopo che è stata messa in pausa. Contiene il codice che apre la porta seriale del <a title=”Android touch screen specifications” href=”http://www.biemmeitalia.net/specifiche-tecniche-android-touch-screen/” target=”_blank”>touch screen Android</a> e memorizza il riferimento all’id del file in una variable privata della classe. Inoltre, inizia il refresh dello status dei testi, mandando delle richieste modbus agli slave.

[sourcecode language=”xml”]
protected void onResume() {
super.onResume();
if (fid == 0){
fid = ModbusLib.openCom();
Log.d("uart=",String.valueOf(fid));
}
cancelReadThread();
workingthread=new ReadsWrites();
workingthread.start();
}
[/sourcecode]

Nel prossimo post vi spiegheremo come, in una semplice riga di comando, si possono salvare le temperature in una sd così da realizzare un <strong>datalogger.</strong>

Lascia un commento