Sistema di acquisizione dati con Arduino via USB/Seriale

 

Il sistema permette al PC di leggere/generare tensioni e leggere/generare stati logici verso il mondo esterno tramite un collegamento seriale.

Sono disponibili:

·         6 terminali di ingresso analogico A0..A5 (analog in) dove si può applicare una tensione da 0 a 5V, tale tensione viene letta da PC come un numero intero con range da 0 a 1023 (0=0V e 1023=5V)

·         11 terminali di ingresso/uscita digitale  2..13 (digital) dove 0V=Livello logico 0 e 5V=Livello logico 1.
La funzione ingresso/uscita di ciascun terminale è impostabile via software.
Se impostato come ingresso il PC legge lo stato logico del terminale 0V=0  5V=1.
Se impostato come uscita il PC genera lo stato logico del terminale 0=0V  1=5V.

·         Alcuni degli 11 terminali di ingresso/uscita digitale: quelli contrassegnati da  ~ possono essere configurati come uscite PWM.
L’uscita PWM genera un segnale ad onda quadra:  livello basso=0V livello alto=5V a duty-cycle impostabile  tramite un numero intero  con range 0..255 fornito da PC, 0 corrisponde a duty-cycle 0%, 255 corrisponde a duty-cycle 100%

Collegamento della scheda al PC

Sulla scheda Arduino deve essere installato il seguente software: tseriale.ino

Si trova in: \\xnullo\pubblica\Tool di sviluppo\ardu_seriale\arduino\tseriale

Preparazione di Delphi per utilizzo del sistema

Occorre un componente per la gestione porte seriali del PC nel nostro casa si chiama AsyncFree104, per verificare se  è già stato installato aprire Delphi e controllare nella palette degli oggetti se  esiste la  scheda
altrimenti andare su: \\xnullo\pubblica\Tool di sviluppo\ardu_seriale e lanciare dphdrser.bat poi con Delphi chiuso andare su: \\xnullo\pubblica e lanciare delphi_1.reg

Come creare l’applicazione con Delphi

Per facilitare la creazione di un programma Delphi in grado si usare il sistema si parte da un progetto precostruito e lo si modifica in base alle proprie esigenze d’uso. Questo si trova in : \\xnullo\pubblica\Tool di sviluppo\ardu_seriale nella cartella delphi_tpl, copiare questa cartella nella dove si intende memorizzare il programma, è consigliabile cambiare  nome alla cartella con un nome consono alle funzioni del programma.

Aprire poi con Delphi il Project.dpr che risiede nella cartella ed iniziare a lavorare.

Nel form precostruito è presente un TButton con Caption Seriale, questo è associato il comando per la configurazione del collegamento seriale tra PC e scheda Arduino quindi non và rimosso.

Col programma in esecuzione  se si clicca su seriale appare:

 

Scegliere la COM dove risulta connessa la scheda e mettere la spunta su connesso e confermare con OK.

 

Per vedere la COM utilizzata dalla scheda eseguire:

\\xnullo\pubblica\Tool di sviluppo\ardu_seriale\devmgmt.msc

Estratto della finestra Gestione periferiche:

 

L’interazione tra Delphi ed Arduino avviene con una serie di procedure e funzioni appartenenti all’oggetto FormArduSerCom

 

function FormArduSerCom.RdAna(Ch:byte):word;

Legge la tensione dal terminale indicato in Ch  (Ch=0 : corrisponde ad A0Ch=5 : corrisponde ad A5).

Ritorna un numero da 0 a 1023 che corrisponde ad una tensione 0 a 5V. 

Esempio:

procedure TForm1.Button2Click(Sender: TObject);

var

  n:integer;

  v:real;

begin

  n:=FormArduSerCom.RdAna(0);

  v:=n*5/1023;

  StaticText1.Caption:=Format('%3.2f V',[v]);

end;

 

procedure FormArduSerCom.WrAna(Ch,v:byte);

Scrive il valore del duty v (range 0..255)  nell’uscita PWM Ch

 (i valori di Ch possono essere quello di  tutti terminali contrassegnati dal ~).

Esempio:

procedure TForm1.Button2Click(Sender: TObject);

var

  n:integer;

  v:real;

begin

  v:=StrToFloat(Edit1.Text);

  n:=round(v*255/5);

  FormArduSerCom.WrAna(5,n);

end;

 

procedure FormArduSerCom.SetMode(Ch,mode:byte);

Imposta il modo di funzionamento del I/O digitale

Ch= terminale (da 2 a 13) mode=modo di funzionamento (0:input,1:output, 2:input_pullup).

Esempio:

procedure TForm1.Button2Click(Sender: TObject);

begin

  //Imposta terminale 2 come uscita

  FormArduSerCom.SetMode(2,1);

end;

 

function FormArduSerCom.RdDig(Ch:byte):boolean;

Legge lo stato logico presente sul terminale indicato in Ch.

True se sul terminale c’è 5V.

False se sul terminale c’è 0V.

Esempio:

procedure TForm1.Button2Click(Sender: TObject);

begin

  //Imposta terminale 2 come ingresso.

  FormArduSerCom.SetMode(2,0);

end;

 

procedure TForm1.Button3Click(Sender: TObject);

begin

  if FormArduSerCom.RdDig(2) then

    Shape1.Brush.Color:=clRed

  else

    Shape1.Brush.Color:=clMaroon

end;

 

procedure FormArduSerCom.WrDig(Ch:byte;v:boolean);

Scrive lo stato logico di  v sul terminale indicato in Ch.

Se v=True V terminale= 5V.

Se v=FalseV terminale =  0V.

Esempio:

procedure TForm1.Button2Click(Sender: TObject);

begin

  //Imposta terminale 2 come uscita

  FormArduSerCom.SetMode(2,1);

end;

procedure TForm1.CheckBox1Click(Sender: TObject);

begin

    FormArduSerCom.WrDig(2,CheckBox1.Checked);

end;