Archivi categoria: arduino

Appunti di programmazione su Arduino: operazioni matematiche

min(x,y)

Calcola il minimo tra due numeri dati di qualsiasi tipo (nel senso di campo di appartenenza) e restituisce il più piccolo.

Parametri

x è il primo numero

y è il secondo numero

Risultato

il più piccolo tra x e y

value = min(value, 100); // imposta 'value' al valore più
                         // piccolo tra i due valori dati,
                         // 'value' o 100,
                         // assicurando che il valore
                         // non superi 100

max(x,y)

Calcola il massimo tra due numeri dati di qualsiasi tipo  (nel senso di campo di appartenenza) e restituisce il più grande.

Parametri

x è il primo numero

y è il secondo numero

Risultato

il più grande tra x e y

value = max(value, 100); // imposta 'value' al valore più
                         // grande tra i due valori dati,
                         // 'value' e 100,
                         // assicurando che il valore
                         // non superi 100

abs(x)

Restituisce il valore assoluto di x, che trasforma un numero negativo in un numero positivo.

Parametri

x: il numero

Risultato

x: se x è uguale o maggiore di 0

x: se x è minore di 0

Se x è uguale a 100 allora abs(100) restuiterà 100. Se x è uguale a -100 allora abs(-100) restituisce 100.

value = abs(-100); // alla variabile 'value'
                   // viene assegnato il valore 100

constrain(x, a, b)

Vincola un numero all’interno di un intervallo.

Parametri

x: il numero che deve essere vincolato (può essere di qualsiasi tipo)

a: il numero più piccolo dell’intervallo (può essere di qualsiasi tipo)

b: il numero più grande dell’intervallo (può essere di qualsiasi tipo)

Risultato

x: se x e tra a e b (ma diverso sia da a che da b)

a: se x è minore di a

b: se x è maggiore di b

sensVal = constrain(sensVal, 10, 150);
// limita il range del valore del sensore tra 10 e 150

map(value, fromLow, fromHigh, toLow, toHigh)

Rimappa un numero da un intervallo ad un altro intervallo

Parametri

value: valore da rimappare
fromLow: valore minimo dell’intervallo di partenza
fromHigh: valore massimo dell’intervallo di partenza
toLow: valore minimo dell’intervallo di arrivo
toHigh: valore massimo dell’intervallo di arrivo

Risultato

valore rimappato nell’intervallo toLow, toHigh

/* rimappa un valore analogico utilizzando 8 bit (da 0 a 255) */

void setup() {}

void loop()
{
  int val = analogRead(0);
  val = map(val, 0, 1023, 0, 255);
  analogWrite(9, val);
}

Si faccia riferimento alla lezione: Appunti di programmazione su Arduino: ingressi e uscite analogiche

Analizziamo il codice

int val = analogRead(0);

viene dichiarata val come variabile intera a cui viene assegnato il valore restituito da analogRead(0) che legge un valore di tensione applicato al piedino analogico 0 (la risoluzione è di 10 bit e quindi da 0 a 1023)

Il valore memorizzato in val viene rimappato dall’intervallo [0, 1023] all’intervallo [0, 255].

analogWrite(9, val);

Scrive sul piedino digitale 9 (piedino su cui è abilitato il PWM) il valore assunto dalla variabile val.

pow(base, exponent)

Calcola la potenza di un numero.

Parametri

base: numero (tipo float)

exponent: la potenza a cui è elevata la base (tipo float)

Risultato

Il risultato dell’ elevamento a potenza (tipo double)

sqrt(x)

Calcola la radice quadrata di un numero.

Parametri

x: il numero che può essere di un qualsiasi tipo

Risultato

la radice quadrata del numero (tipo double)

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

Installare l’IDE Arduino 1.0.1 su Ubuntu 12.04

Con l’avvio dell’anno scolastico ripartono i corsi di Alternanza Scuola Lavoro su Arduino per gli allievi di 4′ della sezione elettronica.
Quest’anno ho deciso di far utilizzare ai miei studenti l’ultima versione di Arduino la 1.01. La programmazione avverrà su PC con sistema operativo Ubuntu su cui ho da poco effettuato l’aggiornamento alla versione 12.04.

Problema: al primo avvio dell’IDE ho notato che non era possibile in alcun modo selezionare la porta seriale.

Come risolvere l’inconveniente?

On-line si trovano alcune soluzioni ma non risolvono completamente il mio problema.

In passato avevo superato il problema per Ubuntu 11.10, questi i tre post di riferimento:

Ma con Arduino 1.0.1 ed Ubuntu 12.04 bisogna agire in maniera un po’ diversa. Per rendere più chiaro il tutorial ripeterò alcune delle operazioni già eseguite nei post sopra citati.

Questo l’indice di esecuzione per la risoluzione del bug:

  1. installare Java
  2. installare la libreria AVR C
  3. scaricate Arduino 1.0.1
  4. riattivare la porta seriale (ttyACM0)

E’ presente inoltre un’ulteriore problema: l’avvio dell’IDE risulta molto rallentato. Mostrerò come velocizzare l’apertura del programma.

Continua a leggere

Nuova versine dello shield GSM GPS per Arduino

Ricevo da Boris Landoni, Responsabile Tecnico Futura Elettronica srl, la segnalazione che è stata resa disponibile la nuova versione della GSM Shield, basata sui moduli GSM/GPRS SIM900 o GSM/GPRS & GPS SIM908. Moltissime le innovazioni ed i miglioramenti che consento la massima personalizzazione.

Per tutti i dettagli vi invito alla lettura dell’articolo su open-electronics.org.

Appunti di programmazione su Arduino: orologio interno

delay(ms)

Mette in pausa un programma per la quantità di tempo specificata in millisecondi, un valore di 1000 millisecondi equivale a 1 secondo.

delay(1000);   // attende per 1 secondo

millis()

Restituisce il numero di millisecondi da quando la scheda Arduino ha incominciato l’esecuzione del programma corrente. Il tipo di dato è un unsigned long.

value = millis();   // imposta la variabile 'value'
                    // al valore restituito dalla funzione

Nota: questo valore va in overflow (supera il limite della memoria) per cui ricomincia da zero dopo circa 9 ore.

micros()

Restituisce il numero di microsecondi da quando la scheda Arduino ha incominciato l’esecuzione del programma corrente. Il tipo di dato è un unsigned long.

Nota: questo valore va in overflow (supera il limite della memoria) per cui ricomincia da zero dopo circa 70 minuti.

Sulle schede Arduino a 16MHz (ad es. Duemilanove e Nano), questa funzione ha una risoluzione di 4 microsecondi (il valore restituito è un multiplo di 4 secondi). Sulle schede Arduino a 8 MHz (ad es. LilyPad), questa funzione ha una risoluzione di 8 microsecondi.

Nota: ci sono 1.000 microsecondi in un millisecondo e 1.000.000 di microsecondi in un secondo.

delayMicroseconds(us)

Mette in pausa il programma per una quantità di tempo (in microsecondi) specificato dal parametro della funzione. Il tipo di dato è un unsigned long.

delayMicrosecons(1000);   // attende un millesimo di secondo

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

Appunti di programmazione su Arduino: ingressi e uscite analogiche


analogRead(pin)
Legge un valore di tensione applicato al piedino analogico ‘pin’ con una risoluzione di 10 bit. La funzione restituisce un valore compreso tra 0 e 1023.

value = analogRead(pin);   // imposta 'value' uguale al
                           // valore letto su 'pin'
                           // dalla funzione analogRead

Nota: i pin analogici a differenza di quelli digitali non hanno bisogno di essere dichiarati come pin di INPUT o OUTPUT.

analogWrite(pin, value)

Cambia il duty cycle (nella funizione: ‘value’) della modulazione di ampiezza di impulso (PWM: Pulse Width Modulation) su uno dei ‘pin’ contrassegnati dall’etichetta PWM.
Sull’attuale Arduino UNO su cui è montato un ATmega 328, il PWM è abilitato sui piedini 3,5,6,9,10 e 11.
Il valore del duty cycle può essere specificato da una variabile o una costante con un valore compreso tra 0 e 255.

analogWrite(pin, value);   // scrive il valore 'value'
                           // sul 'pin' analogico

Un valore di 0 genera in uscita una tensione continua di 0 volt sul pin specificato nella funzione; un valore di 255 genera una tensione continua 5 volt sul pin specificato nella funzione. Per valori compresi tra 0 e 255, il valore in uscita varierà rapidamente tra 0 e 5 volt. Più alto sarà il valore di ‘value’ più spesso su ‘pin’ si avrà una tensione di 5 volt. Ad esempio un valore di ‘value’ pari a 64 genera un segnale in cui per tre quarti del periodo dell’onda il segnale sarà a 0 volt e per un quarto del periodo dell’onda sarà a 5 volt. Se ‘value’ è posto a 128 avremo un segnale che per metà del periodo sarà a 0 volte e per la restante metà del periodo sarà a 5 volt. Se ‘value’ è posto a 192 avremo 0 volt per un quarto del periodo e 5 volt per i restanti tre quarti del periodo.

Per approfondire l’argomento sul PWM leggete la lezione su questo sito: Arduino – lezione 06: modulazione di larghezza di impulso (PWM) corredata da esempi pratici e filmati.

Poiché analogWrite è una funzione hardware, sul pin avremo un onda quadra dopo una chiamata della funzione analogWrite e questa verrà continuativamente emessa in background fino alla successiva chiamata della analogWrite (o chiamata della digitalRead o digitalWrite sullo stesso pin).

L’esempio che segue legge un valore analogico da un pin di ingresso analogico, converte il valore dividendolo per 4, e fornisce un segnale PWM sul pin PWM specificato:

int led = 10;   // al pin 10 è collegato un LED
                // in cui in serie è posta un
                // resistore da 220 Ohm
int pin = 0;    // inseriamo un potenziometro sul pin 0
int value;      // valore che sarà letto

void setup(){} // non è necessaria nessuna configurazione
void loop()
{
   value = analogRead(pin); // imposta 'value' al
                            // valore letto su 'pin'
   value /= 4; // dividendo per 4 si converte
               // il valore letto compreso tra
               // 0 e 1023 in un valore
               // compreso tra 0 e 255
   analogWrite(led, value); // il valore del PWM
                            // viene assegnato al led
}

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