Wiring

 Introduzione
Wiring e’ il linguaggio di programmazione, derivato dal C++, utilizzato per scrivere programmi installabili sul microcontrollore ATmega328 che equipaggia Arduino uno.
Il microcontrollore legge, attiva e disattiva le porte di Arduino seguendo le istruzioni contenute in uno sketch.
Uno sketch è un programma scritto in wiring e compilato (tradotto in linguaggio macchina) attraverso l’IDE, un ambiente di sviluppo gratuito operante su pc.

Struttura di un programma
1 parte: dichiarazioni del programma
2 parte: settaggio del programma
3 parte: il programma viene eseguito all'infinito
1 parte
/* -----( note esplicative sulle finalità e sul funzionamento del programma ) -----*/
/*-----( dichiarazione delle eventuali librerie utilizzate dal programma )-----*/
/*-----( dichiarazione degli oggetti utilizzati )-----*/
/*-----( dichiarazione delle costanti )-----*/
/*-----( dichiarazione delle variabili )-----*/
/*-----( codifica di eventuali routine )-----*/

routine: parti di codice che vengono eseguite solo quando sono richiamate da una specifica istruzione.

2 parte
void setup()
{  /* ----( inizio del setup )------*/
/*  ----( dichiarazione delle porte di input e di output )----*/
/*  ----( eventuali istruzioni da eseguire all’avvio del programma )----*/
}/*   ----( fine del setup )---*/

3 parte
void loop()
{ /* ----( inizio del loop )----*/
/* ----( istruzioni di programma )-----*/
} / *----( fine del loop )----*/

Ortografia, grammatica e sintassi
Il Wiring è dotato di regole che devono essere seguite:

⦁    Ogni istruzione termina con un “;”
⦁    Le parentesi tonde e quadre delimitano gli operatori di un’istruzione 
⦁    Le parentesi graffe delimitano una serie di istruzioni riferibili ad una condizione, a una routine o a una parte di programma. Da un’istruzione dipende anche l’esecuzione di altre istruzioni (istruzioni subordinate) che sono di norma racchiuse tra parentesi graffe.
⦁    Ad ogni parentesi aperta deve corrispondere una parentesi chiusa. 
⦁    La combinazione di caratteri /* indica l’inizio di una zona di note che può estendersi su più righe e che deve necessariamente essere chiusa dalla combinazione */
⦁    La combinazione // indica l’inizio di una zona di note (o commenti) che si protrae fino alla fine della riga.
⦁    Le variabili e le costanti devono essere dichiarate prima (in termini di posizione fisica nel programma) del loro utilizzo. 

Le parole chiave
Il compilatore riconosce alcune parole chiave alle quali assegna particolari significati:

⦁    HIGH e LOW sono parole chiave utilizzate nella gestione delle porte di Arduino e nella gestione di una varibile. 
LOW implica che alla variabile (o alla porta) sia associato il valore 0. 
HIGH implica che sia associato il valore 1.
⦁    INPUT e OUTPUT sono parole chiave utilizzate per definire se una specifica porta deve essere considerata di entrata (una porta alla quale e’ collegato un sensore) o di uscita (una porta alla quale e’ collegato un attuatore).
⦁    true e false sono parole chiave utilizzate per verificare l’esito di una condizione.

Le variabili
​Sono aree di memoria dove vengono memorizzati i dati necessari al funzionamento del programma.
In un programma le variabili devono essere definite prima del void setup () e prima delle 
routine.

Le più comuni tipologie di variabili sono:

byte 
Può contenere un numero tra 0 e 255 non segnato.

int 
Può contenere un numero compreso tra -32768 e 32767. 

unsigned int 
Può contenere solo numeri positivi tra 0 e 65535. 

long  
Può contenere un numero compreso tra -2.147.483.648 a 2.147.483.647.

unsigned long 
Può contenere un numero che va da 0 a 4.294.967.295.

float   
Può memorizzare numeri con la virgola. 

double 
Puo’ contenere numeri a doppia precisione in virgola mobile, con valore massimo di 17976931348623157x10^308.

char  
Se la si usa come un numero può contenere un valore che va da -128 a +127 se invece la si usa come testo può contenere un qualunque carattere ASCII. 
Se si aggiungono due parentesi quadre char[]  diventa una variabile di tipo string nella quale è possibile memorizzare un testo.


Le istruzioni

⦁    Istruzioni di struttura 
Sono due:
void setup()
void loop()

⦁    Istruzioni di controllo

If (..condizione..)
{ ..codice da eseguire solo se la condizione e’ vera..; }

else
{ ..codice da eseguire solo se la condizione e’ falsa..; }
…. codice che verra’ eseguito in ogni caso….

for (..inizializzazione di una variabile..; ..condizione..; ..modifica della variabile.. )
{ .. codice da eseguire e ripetere fino a quando la condizione e’ vera.. }

switch ( ..nome di una variabile.. )
{ case XX: …codice.. ; break; case YY: ..codice.. ; break; default: ..codice.. }

While ( ..condizione.. )
{ .. codice da ripetere sino a quando la condizione risulta vera.. }

do
{ ..codice da ripetere fino a quando la condizione di while risulta vera.. } while ( ..condizione.. );

Break
Questa istruzione consente di bloccare un ciclo di for.., do.. oppure while… e continuare ad eseguire il codice fuori dal ciclo. Viene anche utilizzato nell’istruzione switch per interrompere l’analisi delle condizioni.

Continue
Usato in un ciclo do.., for.. o while… consente di interrompere l’esecuzione del codice interno al ciclo e tornare alla verifica della condizione.

⦁    Operatori matematici
+    per le addizioni

-    per le sottrazioni

/    per le divisioni

*    per le moltiplicazioni

=   per l’assegnazione del risultato

% restituisce il resto di una divisione.

    Operatori di comparazione
Sono operatori utilizzabili nelle condizioni.

== uguale a (il doppio segno di uguale è indispensabile per differenziare una condizione da un’assegnazione)

>    maggiore di

<    minore di

!=  diverso da

<=  minore o uguale di

>=  maggiore o uguale di

    Operatori booleani
Sono operatori usati per combinare più condizioni

Esistono tre tipi di operatori booleani:

&&  corrisponde alla “and”

||    corrisponde alla “or”

!    corrisponde al “not”

Operatori computazionali
Sono operatori utilizzati per semplificare alcune operazioni elementari

++ somma 1 alla variabile che precede l’operatore

--   sottrae 1 alla variabile che precede l’operatore

Le funzioni

⦁    funzioni di input/output
pinMode(porta,utilizzo);

questa istruzione e’ utilizzata per configurare una delle 14 porte digitali; nella variabile porta deve essere inserito il numero della porta digitale (da 0 a 13) che si intende definire mentre in utilizzo deve essere indicato il tipo di utilizzo (INPUT oppure OUTPUT).

digitalWrite(porta,valore);

attiva (HIGH) o disattiva (LOW) una porta digitale di OUTPUT. L’attivazione implica che la porta in oggetto venga alimentata con una tensione di 5 volt mentre la disattivazione implica che attraverso la porta non circoli alcuna tensione (in pratica attiva o disattiva l’attuatore collegato alla porta)

variabile = digitalRead(numero della porta);

rileva lo stato di una porta digitale di INPUT. Inserisce il valore 1 (HIGH) in variabile se sulla porta rileva una tensione superiore a 3 volt, inserisce 0 (LOW) se rileva una tensione inferiore a 1,5 volt e lascia inalterato il valore di variabile se rileva una tensione compresa tra 1,5 e 3 volt.

variabile = analogRead(porta);

rileva la tensione presente su di una porta analogica e inserisce in variabile un numero, compreso tra 0 e 1023, proporzionale alla tensione rilevata. 0 corrisponde ad una tensione pari a 0 mentre 1023 corrisponde ad una tensione pari a 5 volt.


analogWrite(porta,valore);

Con questa istruzione e’ possibile utilizzare una porta digitale in maniera PWM e cioe’ come una porta analogica di OUTPUT. L’istruzione e’ in grado di fornire in uscita sulla porta in questione una tensione (tra 0 e 5 volt) proporzionale al numero (compreso tra 0 e 255) inserito nella variabile valore.

⦁    funzioni di comunicazione
Serial.begin(velocita); // istruzione da utilizzare in fase di setup, prepara Arduino a mandare
// e a ricevere dati tramite la porta seriale. In “velocita” si inserisce
//  normalmente il valore 9600 (9600 bit per secondo) ma e’ possibile
//  utilizzare anche altri valori, fino ad un  massimo di 115200

Serial.print(valore);    // Invia al monitor seriale il contenuto della variabile valore e
// mantiene il cursore del monitor sulla linea corrente, in attesa
// di un nuovo valore.

Serial.println(valore); // invia al monitor seriale il contenuto della variabile valore seguito
// dal segnale di ritorno a capo, in modo da esporre i successivi
// messaggi su di una nuova riga

val = Serial.available(); // inserisce in val (una variabile intera) la lunghezza della parola digitata
//  sulla tastiera collegata serialmente ad Arduino (normalmente la tastiera
//  del monitor seriale e cioe’ la tastiera del pc collegato con il cavo usb)

val = Serial.read();    // legge (inserisce in val, una variabile normalmente di tipo chr) cio' che
// e' stato battuto sulla tastiera collegata serialmente ad arduino

⦁    funzioni di tempo

millis();
Fornisce i millisecondi trascorsi dall’inizio del programma. Esempio:
tempo=millis();    // inserisce nella variabile tempo i millisecondi trascorsi dal momento
// dell’accensione della scheda

delay(pausa);
Mette in pausa il programma per un numero di millisecondi specificato in pausa.

⦁    funzioni matematiche
gamma = min (alfa,beta);

inserisce in gamma il valore minore tra i due valori contenuti nelle variabili alfa e beta

⦁    funzioni di generazione di numeri a caso
val = random (max)    // inserisce in val un numero a caso compreso tra 0 ed il
// valore contenuto in max

Poiche’ i numeri generati sono in realta’ pseudo casuali (fanno cioe’ parte di una enorme sequenza predefinita), per evitare di ripetere la medesima sequenza di numeri ad ogni avvio del programma e’ opportuno inizializzare il generatore di numeri a caso utilizzando l’istruzione:

randomSeed(seme);  // inizializza il generatore di numeri a caso

Inserendo in seme un numero sempre diverso e quindi derivato, ad esempio, da una funzione di tempo applicata ad un’azione umana (come il tempo intercorso tra l’avvio del programma e la pressione di un pulsante) oppure il valore fornito da una porta analogica non utilizzata. In questo modo ad ogni avvio del sistema l’istruzione random () restituira’ numeri a caso in sequenze sempre diverse.

Commenti