Archivi tag: programmazione

Appunti di programmazione su Arduino: costanti

Il linguaggio Arduino ha alcuni valori predefiniti che sono chiamati costanti. Le costanti vengono usate per rendere più semplice la lettura di un programma.

Le costanti sono classificate in gruppi:

TRUE/FALSE

Queste sono costanti booleane che definiscono i livelli logici. FALSO è definito come 0 (zero) mentre TRUE è spesso definito come 1, ma anche qualsiasi valore diverso da 0. Quindi in logica booleana -1, -2 e -200 sono tutti definiti come TRUE.

if ( b == TRUE);
{
  soSomething;
}

HIGH/LOW

Queste costanti definiscono il livello del pin come HIGH (alto) o LOW (basso) e sono usati quando si legge o scrive su un pin digitale.
HIGH è definito come livello logico 1, ON oppure 5 volt, mentre LOW è definito come livello logico 0, OFF o 0 volt.

digitalWrite(13,HIGH); // il pin 13 si trova a livello logico 1

INPUT/OUTPUT

Costanti usate con la funzione pinMode() per definire in che modalità viene utilizzato un pin , come INPUT (ingresso) o come OUTPUT (uscita)

pinMode(13, OUTPUT) // il pin 13 viene definito come OUTPUT

Per le lezioni precedenti consultare la sezione Appunti di programmazione che trovate nella pagina Arduino di questo sito.

Appunti di programmazione su Arduino: aritmetica


Gli operatori aritmetici includono: addizioni, sottrazioni, moltiplicazioni e divisioni.
Queste operazioni restituiscono, rispettivamente: la somma, la differenza, il prodotto e il quoziente tra i due operandi.

y = y + 3;
x = x -7;
i = j * 6;
r = r / 5;

L’operazione viene eseguita usando il tipo dei dati degli operandi, così ad esempio l’operazione 9/4 (dove 9 e 4 sono stati in precedenza dichiarati di tipo intero) darà come risultato 2 e non 2,25, appunto perché 9 e 4 sono stati dichiarati interi e quindi non si avrà un risultato con punto decimale.

Questo significa anche che l’operazione può causare un overflow se il risultato eccede il valore massimo che può essere memorizzato con il tipo di dato che si sta utilizzando.

Se si sta eseguendo un’operazione tra operandi di tipo diverso, per il calcolo verrà usato il tipo di dati più grande.

Ad esempio se uno degli operandi è di tipo float e l’altro è di tipo int verrà utilizzato il calcolo in virgola mobile per il calcolo.

Bisogna quindi scegliere la dimensione dei tipi delle variabili in modo appropriato in modo che i risultati non vadano in overflow.

E’ opportuno sapere sempre con esattezza i valori che ogni volta la variabile assume, positivi e negativi, ad esempio: (0 – 1) oppure (0 – -32768).

Per la matematica che usa frazioni si dovranno utilizzare variabili di tipo float, ma bisogna essere consapevoli degli svantaggi che provoca questa scelta: dimensioni grandi dei numeri (necessità di maggiore memoria per i ccalcoli), calcoli più lenti.

Nota: potete utilizzare il cast operator per convertire il tipo di una variabile in un altro.

Ad esempio:

(int)myFloat

converte immediatamente la variabile myFloat in tipo intero.

Ad esempio:

i = (int)3.6

sarà uguale a 3

Assegnazioni composte

Le assegnazioni composte combinano le operazioni aritmetiche con assegnazioni di variabili e vengono largamente usate nei cicli for. Le assegnazioni composte più comuni includono:

x++  // uguale a x = x + 1, incrementa x di +1
x--  // uguale a x = x - 1, decrementa x di -1
x+=y // uguale a x = x + y, incrementa x di +y
x-=y // uguale a x = x - y, decrementa x di -y
x*=y // uguale a x = x * y, moltiplica x per y
x/=y // uguale a x = x / y, divide x per y

Nota: per esempio, x*=3 moltiplica per tre il valore precedente di x e riassegna il risultato a x.

Operatori di confronto

Il confronto tra variabili o costanti è spesso utilizzato nelle istruzioni if, while ma anche nei cicli for, per verificare se una determinata condizione è vera. Gli operatori di confronto sono:

x==y // x è uguale a y
x!=y // x è diverso da y
x>y  // x è maggiore di y
x>=y // x è maggiore o uguale a y

Opratori logici
Gli operatori logici vengono usalmente utilizzati per confrontare due espressioni e restituiscono un valore TRUE (vero) o FALSE (falso).

Ci sono tre operatori logici:

AND logico:

if (x>0 && x<5) // vera se solo se entrambe le espressioni sono vere

OR logico:

if (x>0 || y>0) // vero se una delle due espressioni è vera

NOT logico:

if (!x>0) // vera solo se l'epressione è falsa

Per le lezioni precedenti consultare la sezione Appunti di programmazione che trovate nella pagina Arduino di questo sito.

Installazione e primo utilizzo del compilatore Code::Blocks versione 10.05 – parte 1

Durante il corso di sistemi insegnerò a programmare in C ed ho deciso di utilizzare come IDE Code::Blocks, software free, open source e multipiattaforma, infatti è disponibile per Windows, Linux e Mac OS X.

Durante questa breve guida vedrete delle schermate riprese dal Ubuntu, ma non preoccupatevi, l’utilizzo e le funzionalità sono identiche per tutti i sistemi operativi

I’IDE può essere prelevato direttamente dal sito http://www.codeblocks.org/ dalla sezione download.

[wpspoiler name=”Download”]Click su Download

Selezionate “Download the binary release”:

Selezionate il vostro sistema operativo:

Selezionate il sito da cui effettuare il download:

[/wpspoiler]

[wpspoiler name=”Installazione Windows”]

Doppio click sul file scaricato

Esegui

Proseguite facendo click su Next

Accettate le condizioni di utilizzo facendo click su I agree

Per i componenti lasciate la selezione “Custom” e proseguite con Next

Selezionate la cartella dove installare Code::Blocks. La proposta di default è C:\Program Files\CodeBlocks, proseguite poi facendo click su Install

Alla richiesta di avviare Code::Blocks rispondete No

Dopo l’installazione premere su Next

Click su Finish

[/wpspoiler]

[wpspoiler name=”Installazione Ubuntu”]

Click su Ubuntu Software Center

Nel campo di ricerca inserite: codeblocks

Click su: Installa

Inserite la password di amministratore

Il programma è installato

Se non installato procedete installate il compilatore GNU C++ il g++, anche in questo caso vi verrà richiesta la password di amministratore per procedere nell’installazione.

[/wpspoiler]

[wpspoiler name=”Installazione Mac”]

  • doppio click sul file .dmg scaricato
  • copiare il contenuto dell’immagine sul vostro computer
  • doppio click sul file CodeBlocks

[/wpspoiler]

Creazione del progetto

Al primo avvio si presenterà una schermata per la scelta del compilatore e noterete che il GNU GCC Compiler è quello che viene rilevato, infatti appare l’indicazione “Detected”, cioè trovato sul sistema. Premete il pulsante sulla destra: “Set as default” per confermare la selezione del compilatore di default e poi fate click su ok:

I programmi che realizzeremo possono essere composti da uno o più file sorgenti, dopo la compilazione i file vengono uniti dal linker per costruire un unico file eseguibile. Tutti questi sorgenti vengono identificati come un unico progetto.

Continua a leggere

Appunti di programmazione su Arduino: tipi di dati


byte
Byte memorizza numeri a 8 bit (1 byte) interi (senza decimali) ed hanno un range da 0 a 255.

byte someVariable = 180; // dichiara 'someVariable'
                         // come una variabile di tipo byte

int
Gli interi sono dei tipi di dato usati per memorizzare numeri senza decimali e memorizzano valori a 16 bit (2 byte) nel range da 32.767 a -32.768

int someVariable = 1500; // dichiara 'someVariable'
                         // come una variabile di tipo intero

Nota:: le variabili intere se raggiungono il valore massimo o minimo in operazioni di aritmetiche o di confronto, ad esempio se x = 32.767 e ad x aggiungiamo 1:

x = x + 1

o in altro modo

x++

il nuovo valore di x sarà -32.768.

quindi il range da 32.767 a -32.768 è da considerare non come una retta di numeri ma come una circonferenza il cui massimo e minimo sono consecutivi.

long
estende la dimensione degli interi, senza virgola, memorizzati con 32 bit (4 byte) e quindi il range dei valori possibili va da 2.147.483.647 a -2.147.483.648.

long someVariable = 90000; // dichiara che 'someVariable'
                           // è di tipo long

float
E’ un tipo di dato usato per i numeri in virgola mobile ed è usato per la rappresentazione di numeri piccolissimi o grandissimi con o senza segno e con o senza decimaili. I float sono memorizzati utilizzando 32 bit (4 byte) nel range tra 3,4028235E+38 a -3,4028235E+38.

float someVariable = 3,14; // dichiara che 'someVariable'
                           // è di tipo in virgola mobile

Nota: i numeri in virgola mobile non sono esatti e possono condurre a risultati strani. Per la loro dimensione l’esecuzione di calcoli con tipi float è più lunga dei calcoli realizzati con tipi interi. Se la situazione lo permette evitate l’uso di variabili di tipo float.

Vediamo quali sono i problemi a cui si può incorrere quando si confrontano valori in virgola mobile e vediamo una possibile soluzione.

float valore = 0.5;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  valore = valore - 0.1; // riduce il valore di 0,1 ogni volta che
                         // si ripete il ciclo
  if( valore == 0)
    Serial.println("Il valore è esattamente 0");
  else if(fabs(valore) < .0001) // funzione per ricavare il valore
                                // assoluto
                                // di un numero decimale
    Serial.println("Il valore e' abbastanza vicino a zero");
  else
    Serial.println(valore);

  delay(1000);
}

Usare operazioni con numeri in virgola mobile restituisce numeri che possono avere errori di approssimazione.
Per superare il problema non bisogna verificare che i valori siano esattamente quelli che ci si aspetterebbe usando l'aritmetica standard, ma bisogna verificare che i valori calcolati si trovino all'interno di un intervallo di valori.

L'output dello sketch precedente sarà:

0.50
0.40
0.30
0.20
0.10
Il valore e' abbastanza vicino a zero
-0.10
-0.20
...

Analizzando il codice ci si aspetterebbe che quando valore assume il valore 0.1, sottraendo successivamente 0.1 venga eseguita la porzione di codice:

if( valore == 0)
    Serial.println("Il valore è esattamente 0");

ma valore non assumerà mai il valore 0, si avvicinerà molto ma non sarà mai 0.
Quindi l'unico modo per rappresentare il risultato di calcoli di numeri in virgola mobile è quella di darne un'approssimazione.

Array
Un array è un insieme di valori a cui si accede con un indice.
Un valore nell'array può essere richiamato con il nome dell'array e l'indice numerico che corrisponde al numero d'ordine del valore nell'array.
Gli array vengono indicizzati partendo dal numero zero e quindi il primo valore dell'array avrà indice 0.
Un array deve essere dichiarato ed opzionalmente si possono assegnare i valori prima di utilizzarlo.

int myArray[] = { value0, value1, value2...}

Allo stesso modo è possibile dichiarare un array dichiarandone il tipo e la dimensione e poi assegnare i valori:

int myArray[5]; // dichiara un array di interi avente una dimensione di 6
myArray[3] = 10; // assegna in quarta posizione il valore 10

Per recuperare un valore all'interno di un array, bisogna dichiarare una variabile a cui poi viene assegnato il valore assunto allo specifivo indice:

x = myArray[3]; // ora x ha il valore 10

Gli array sono molto spesso utilizzati all'interno dei cicli for, dove il contatore di incremento è anche usato come indice posizionale per ogni valore dell'array. L'esempio che segue viene utilizzato per l'accensione e spegnimento rapido (fliker) di un LED. Usando un ciclo for, il contatore incomincia da 0, scrive il valore nell'array fliker[] in posizione 0, in questo caso 180, al pin 10, pausa per 200ms, poi si sposta nella posizione successiva in quanto l'indice è incrementato di 1.

int ledPin = 10; // variabile ledPin inizializzata a 10
byte fliker[] = {180, 30, 255, 200, 10, 90, 150, 60};
                // sopra ono riportati 8 valori diversi
void setup()
{
   pinMode(ledPin, OUTPUT);
}

void loop()
{
   for (int i=0; i<8; i++)            // esegue un ciclo un numero di volte
   {                                  // pari al numero di elementi dell'array
      analogWrite(ledPin, fliker[i]); // ad ogni ciclo viene attivato ledPin          
                                      // con con un valore di duty cycle 
                                      // corrispsondente al valore indicato  
                                      // dall'indice dell'array 
      delay(200);                     // pausa di 200 ms
   }
}

Nota: il ciclo for verrà eseguito fino a quando la condizione i<8 risulta vera, cioè per valori di i che vanno da 0 a 7 compreso. Per le lezioni precedenti consultare la sezione Appunti di programmazione che trovate nella pagina Arduino di questo sito.

Manuali gratuiti on-line in italiano di programmazione in C

Aggiungo ai miei precedenti post:

alcune risorse interessanti, dal punto di vista didattico e che sto utilizzando per la realizzazione delle mie lezioni sulla programmazione in C:

Wikiversity sito che offre una grande quantità di corsi a livello universitario. Sul sito Ottimo corso sulla programmazione in C corredato da molti esempi.

Tra i manuali che preferisco, già segnalati in passato: Il linguaggio C – guida pratica alla programmazione di BlackLight una guida ottima per la realizzazione di lezioni a scuola.

Appunti di informatica libera di Daniele Giacomini, opera vastissima e in continua evoluzione, il 5° capitolo raccoglie tutto ciò che bisogna sapere sui linguaggi di programmazione, tra cui anche il C. L’intero corso di circa 125 MB può essere scaricato.

L’ottima documentazione di Umberto Zappi sulle librerie standard e non solo.

Sul sito Orebla, sito dedicato alle news sull’HiTech, trovate un buon manuale dedicata al linguaggio c/c++.

Pierotofy è un sito su cui troverete informazioni su moltissimi linguaggi di programmazione, completo e di alto profilo. Possibilità di consultare, prelevare e modificare numerosissimi sorgenti. Il forum molto frequentato.

Guida alla Programmazione in Linux” di Simone Piccardi che parla in modo approfondito di system call e di le librerie standard del C.

Guida C di Fabrizio Ciacchi una guida essenziale e di facile consultazione.