Archivi categoria: arduino

Arduino Due tra le mie mani

Da oggi tra le mie mani la nuova scheda Arduino Due e mentre scrivo questo breve post sto effettuando i primi test.

La scheda Arduino Due è basata sul microcontrollore Atmel SAM3X8E ARM Cortex-M3 (datasheet). Arduino Due è la prima scheda Arduino a 32 bit, è fornita di 54 piedini I/O digitali (di cui 12 utilizzati come uscite PWM), 12 input analogici, 4 UARTs (porte seriali hardware), ha un clock a  84 MHz, 2 DAC (digital/analog), 2 TWI (per la comunicazione I2C o Two Wire), jack di alimentazione da 2,1 mm con positivo centrale, una JTAG per la programmazione diretta del microcontrollore e per il debug, un bottone di reset ed uno di cancellazione.

A differenza di altre schede Arduino, la scheda Arduino Due funziona a 3.3V. La tensione massima che i pin I /O sono in grado di tollerare è di 3,3V. Fornire tensioni più elevate, come 5V a un pin I /O potrebbe danneggiare la scheda.

Per poter programmare la scheda è sufficiente connetterla alla micro USB di programmazione (fate riferimento a questa pagina).  L’alimentazione viene fornita direttamente dalla USB oppure mediante un alimentatore esterno. Arduino Due è compatibile con tutti gli shield Arduino che funzionano a 3,3 V e compatibili con il pinout di Arduino Uno.

E’ disponibile una porta USB nativa da usare quando si desidera usare Arduino Due come una qualsiasi periferica USB (così come avviene per un mouse o una tastiera)  oppure quando si vuole usare la scheda come host in modo che altri dispositivi si possano collegare ad essa (mouse, tastiere o telefoni Android) per connettere mediante micro USB altri dispositivi esterni. Quando la scheda è utilizzata come host USB è indispensabile alimentarla tramite connettore di alimentazione.

La USB nativa può essere usata come porta seriale virtuale usando l’oggetto “SerialUSB” nel linguaggio di programmazione di Arduino.

Caratteristiche tecniche:

  • Microcontroller:  AT91SAM3X8E
  • Tensione di funzionamento: 3.3V
  • Tensione di ingresso (raccomandata): 7-12V
  • Tensione di ingresso (limiti): 6-20V
  • Pin I/O digitali: 54 (di cui 12 utilizzati come uscite PWM)
  • Pin di ingresso analogico: 12
  • Uscite analogiche: 2 (DAC)
  • Corrente totale sulle linee I/O: 130 mA
  • Corrente sul Pin 3,3V: 800 mA
  • Corrente sul Pin 5V: 800 mA
  • Memoria Flash: 512 KB, totalmente disponibili per le applicazioni dell’utente
  • SRAM: 96 KB (due banchi: 64 KB e 32 KB)
  • Velocità di clock: 84 MHz

Per maggiori informazioni tecniche e risorse per l’utilizzo della scheda:

IDE

Per poter programmare sulla nuova scheda è indispensabile utilizzareun IDE diverso da quello che attualmente viene usato per Aduino Uno, si tratta dell’IDE 1.5.0 disponibile già per tutte le piattaforme (Mac, Linux, Windows) .

Prossimamente ulteriori dettagli.

Appunti di programmazione su Arduino: comunicazione seriale

Serial.begin(rate)
Apre la porta seriale ed imposta la velocità di trasmissione (baud rate) seriale per trasmettere i dati. La velocità di trasmissione tipica per la comunicazione del computer è di 9600 bps (bps: baud rate per secondo)

Nota: attensione a non confondere la sigla bps con bit al secondo, nel nostro caso parliamo di boud, cioè simboli e ad ogni simbolo possono corrispondere più bit.

void setup()
{
   serial.begin(9600); // apre la porta seriale ed imposta
                       // la velocità di trasmissione a
                       // 9600 bps
}

Nota: quando si usa la comunicazione seriale, i pin digitali 0 (RX) e 1 (TX) non possono essere utilizzati contemporaneamente.

Serial.println(data)
Stampa i dati sulla porta seriale (invia i dati alla seriale e li visualizza) seguito da un ritorno a capo automatico ed un avanzamento linea.
Questo comando ha la stessa struttura della Serial.print() ma è più semplice da usare per la lettura sul serial monitor.

Serial.println(analogValue); // invia il valore di
                             // analogValue

Nota: Per ulteriori informazioni sui possibili utilizzi della Serial.println() e della Serial.print() fare riferimento al manuale on-line su Arduino.cc.

L’esempio che segue legge un valore dal pin analogico 0 ed invia i dati ogni secondo al computer:

void setup()
{
   Serial.begin(9600); // imposta la comunicazione seriale
                       // a 9600 pbs
}
void loop()
{
   Serial.println(analogRead(0)); // invia il valore analogico
   delay(1000);                   // fa una pausa di 1 secondo
}

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

Appunti di programmazione su Arduino: numeri casuali

randomSeed(seed)

Imposta un valore di partenza per generare un numero casuale.

randomSeed(value); // assegna a value un valore casuale

Poiché Arduino non è in grado di creare un vero numero casuale la funzione randomSeed consente di inserire una variabile, una costante o un’altra funzione casuale per generare numeri “casuali” ancora più casuali 🙂
randomSeed viene utilizzata come base di partenza per generare un numero casuale, può essere utilizzata in diversi modi associandola ad altre funzioni, come ad esempio utilizzare il valore restituito da millis() funzione che restituisce il numero di millisecondi da quando la scheda Arduino è in funzione, o ancora con analogRead() per leggere il rumore elettrico attraverso un pin analogico, in questo modo trattandosi di rumore, che varia in modo caotico, la analogRead() restituirà un valore “abbastanza” casuale.

random(max)
random(min, max)

La funzione random permette di restituire numeri pseudo-casuali in un intervallo specificato tra un valore minimo e massimo.

value = random(100, 200); // assegna a 'value' un valore casuale
                          // compreso tra 100 e 200

Nota: utilizzare questa funzione dopo aver utilizzato la funzione randomSeed().

L’esempio che segue crea un numero casuale compreso tra 0 e 255 e fornisce un segnale PWM su un pin PWM uguale al valore casuale:

int randNumber; // variabile usata per memorizzare il valore casuale
int led = 10;   // un led con in serie una resistenza da 220 Ohm
                // inserito sul pin 10

void setup(){}  // non e' necessaria nessuna configurazione
void loop()
{
   randomSeed(millis());         // imposta millis() come base per
                                 // generare un numero
                                 // casuale da 0 a 255
   randNumber = random(255)      // numero casuale da 0 a 255
   analogWrite(led, randNumber); // uscita segnale PWM
   delay(500);                   // pausa di mezzo secondo
}

Come potete notare viene utilizzata la funzione randomSeed(millis()) per inizializzare il generatore di numeri casuali, agendo in questo modo siamo abbastanza sicuri di generare numri sempre diversi.

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

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