Dopo l’albero, le luci di Natale

by Gaspar Torriero on 09/12/2014

Dopo l’albero di Natale con Scratch, ecco le luci di Natale con Arduino:

Il relativo codice (migliorabilissimo):

/*
  Arrays
 
 Demonstrates the use of  an array to hold pin numbers
 in order to iterate over the pins in a sequence. 
 Lights multiple LEDs in sequence, then in reverse.
 
 Unlike the For Loop tutorial, where the pins have to be
 contiguous, here the pins can be in any random order.
 
 The circuit:
 * LEDs from pins 3 through 11 to ground
 
 created 2006
 by David A. Mellis
 modified 30 Aug 2011
 by Tom Igoe
 modified 08 Dec 2014
 by Gaspar Torriero
 
 The original code is in the public domain.
 
 http://www.arduino.cc/en/Tutorial/Array
 */

int N;
int timer = 100;           // The higher the number, the slower the timing.
int selector = 4;
int ledPins0[] = {
  3, 4, 5, 6, 7, 8, 9, 10, 11};       // an array of pin numbers to which LEDs are attached
int ledPins1[] = {
  3, 6, 9, 4, 7, 10, 5, 8, 11};       // an array of pin numbers to which LEDs are attached
int ledPins2[] = {
  3, 11, 4, 10, 5, 9, 6, 8, 7};       // an array of pin numbers to which LEDs are attached
int ledPins3[] = {
  3, 5, 7, 9, 11, 4, 6, 8, 10};       // an array of pin numbers to which LEDs are attached
int pinCount = 9;           // the number of pins (i.e. the length of the array)

void setup() {
  for (int N = 3; N < 12; N++) {
    pinMode(N,OUTPUT);
  }
}

void loop() {
  timer = analogRead(A0);
  // one of the next two lines must be uncommented
  selector = (analogRead(A1) / 255); // knob-selected status
  //selector = random(3); //random status

  if (selector == 0) {
    // loop from the lowest pin to the highest:
    for (int thisPin = 0; thisPin < pinCount; thisPin++) { 
      // turn the pin on:
      digitalWrite(ledPins0[thisPin], HIGH);   
      delay(timer);                  
      // turn the pin off:
      digitalWrite(ledPins0[thisPin], LOW);    

    }

    // loop from the highest pin to the lowest:
    for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) { 
      // turn the pin on:
      digitalWrite(ledPins0[thisPin], HIGH);
      delay(timer);
      // turn the pin off:
      digitalWrite(ledPins0[thisPin], LOW);
    }
  }

  else if (selector == 1) {
    // loop from the lowest pin to the highest:
    for (int thisPin = 0; thisPin < pinCount; thisPin++) { 
      // turn the pin on:
      digitalWrite(ledPins1[thisPin], HIGH);   
      delay(timer);                  
      // turn the pin off:
      digitalWrite(ledPins1[thisPin], LOW);    

    }

    // loop from the highest pin to the lowest:
    for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) { 
      // turn the pin on:
      digitalWrite(ledPins1[thisPin], HIGH);
      delay(timer);
      // turn the pin off:
      digitalWrite(ledPins1[thisPin], LOW);
    }
  }

  if (selector == 2) {
    // loop from the lowest pin to the highest:
    for (int thisPin = 0; thisPin < pinCount; thisPin++) { 
      // turn the pin on:
      digitalWrite(ledPins2[thisPin], HIGH);   
      delay(timer);                  
      // turn the pin off:
      digitalWrite(ledPins2[thisPin], LOW);    

    }

    // loop from the highest pin to the lowest:
    for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) { 
      // turn the pin on:
      digitalWrite(ledPins2[thisPin], HIGH);
      delay(timer);
      // turn the pin off:
      digitalWrite(ledPins2[thisPin], LOW);
    }
  }

  else if (selector == 3) {
    // loop from the lowest pin to the highest:
    for (int thisPin = 0; thisPin < pinCount; thisPin++) { 
      // turn the pin on:
      digitalWrite(ledPins3[thisPin], HIGH);   
      delay(timer);                  
      // turn the pin off:
      digitalWrite(ledPins3[thisPin], LOW);    

    }

    // loop from the highest pin to the lowest:
    for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) { 
      // turn the pin on:
      digitalWrite(ledPins3[thisPin], HIGH);
      delay(timer);
      // turn the pin off:
      digitalWrite(ledPins3[thisPin], LOW);
    }
  }
}

{ 0 comments }

Ho fatto l’albero!

by Gaspar Torriero on 08/12/2014

(clicca la bandierina verde)

{ 0 comments }

Arduino al Coder Dojo Ticino

by Gaspar Torriero on 07/11/2014

Metto qui le slide che userò domani al Coder Dojo Ticino. Partiremo seguendo i capitoli 1 e 2 del libro dei progetti dello Starter Kit per prendere confidenza col mezzo, e proseguiremo con Scratchbot che è una versione appositamente modificata di Scratch per interagire con Arduino.

Tra parentesi: oggi è il compleanno di questo blogghettino, nato il 7 novembre 2001. 3.169 post, e non mi sono ancora stufato.

{ 1 comment }

Un mese fa mi è arrivato a casa a Como lo scatolino di Sam Knows, un servizio che cerca di misurare il più accuratamente possibile le reali prestazioni dei fornitori di accesso internet nel mondo. I grafici del primo mese di utilizzo non sono incoraggianti.

What is ‘UDP Packet Loss’?

Packet loss is relatively rare in modern networks [e infatti]. That said, some broadband providers have been known to suffer high packet loss at peak times. If this is the case for your ISP, you may find that time sensitive applications such as Voice over IP (VoIP) and online gaming will suffer. Packet loss is recorded as a percentage; lower is better.

ADSL Alice 20Mb di Telecom Italia ADSL Alice 20Mb di Telecom Italia

What is ‘UDP Latency’?

This test measures how long it takes one packet to be sent to one of our test servers and then return back to you. This can effectively be thought of as the responsiveness of the connection between your home and our servers on the Internet. Times are recorded in milliseconds; lower is better.

ADSL Alice 20Mb di Telecom Italia ADSL Alice 20Mb di Telecom Italia

 

Per la cronaca, ho una connessione Alice 20 Mega che da qualche mese (da quando a Como hanno messo la fibra fino al marciapiede?) funziona al massimo nominale, mentre l’anno scorso viaggiava tra gli 11 e i 14 Mbit in download.

netgear_2014_10

 

Ci sarebbe l’offerta tuttofibra che promette 30Mb in download e 3Mb in upload nominali, anche se ovviamente “l’effettiva velocità dipende da molteplici e variabili fattori tecnici”. Offerta che potrei anche considerare se riguardasse solo la connessione. Ma invece viene assieme a un sacco di altre cose che non mi interessano:

  • il telefono VoIP che ho già Skype, grazie
  • le chiamate gratuite illimitate ma non più di 50 minuti al giorno
  • I telefoni cordless “a solo 1€” ma se disdici il contratto li paghi 50€
  • Internet Pay “per acquistare online contenuti digitali con addebito sul conto (Telecom Italia, ho da darvi una brutta notizia: c’è già PayPal)

Quindi per ora soprassiedo, aspettando che la perdita di pacchetti UDP scenda a 0 e che la latenza media si attesti sotto i 10ms.

{ Comments on this entry are closed }

iBeacon trials and errors

by Gaspar Torriero on 30/07/2014

Trials:

  • Selected users of the American Airlines app will be sent messages aimed primarily at guiding them round the airport. This will include information about walking time to gates and boarding updates.
    American Airlines says that 65% of passengers arrive at their gate early because they are worried about being late or getting lost.
  • Tesco’s trial began earlier this year in its Chelmsford store. It has said that the technology won’t be used to push out marketing messages, but will instead notify shoppers that their pre-ordered goods are waiting for them.
    Ultimately iBeacons could be a central feature in Tesco’s new beta MyStore app, helping customers to find specific items in-store.

And errors:

  • Initially launched with just 100 users, the trial involved sending marketing messages to customers as they entered one of Eat’s stores.

  • The technology enabled fans at 20 baseball stadiums to check-in at games and receive exclusive offers.

  • Virgin passengers with an electronic boarding pass loaded in their iPhone Passbook app could receive messages relevant to their location within the airport.

  • For example, passengers in the departures section of the airport would be sent special offers such as a commission-free currency exchange.

  • In June Odeon Cinemas announced that it planned to imminently begin trials with iBeacons to welcome people to its cinemas, share information and inform them of special offers.

There is no demand for messages. (*)

{ Comments on this entry are closed }

Arduberry_finale

Dato che Yahoo Weather offre il feed della situazione meteo della mia città, ho deciso di aggiungere questi dati al mio database, in modo da avere sia la temperatura interna che quella esterna. Ho quindi modificato il codice in Python aggiungendo queste righe:

from xml.dom.minidom import *
import urllib
import csv
LocationID = '714505'
# Fetch weather XML for Como, Italy
Trier = urllib.urlopen('http://weather.yahooapis.com/forecastrss?w=' + LocationID + '&u=c').read()
# Parse the XML
Trier = parseString(Trier)
# Get date
Date = Trier.getElementsByTagName('lastBuildDate')[0].firstChild.data
# Get today's weather
Today = Trier.getElementsByTagName('yweather:condition')[0]
T = Today.attributes["temp"].value
W = Today.attributes["text"].value
#print(W,T)

Se vuoi divertirti anche tu, ho messo online il nuovo arduinotomysql.py con le relative modifiche.

Tra parentesi, questa sera canto nel coro alla prima della Cavalleria Rusticana che dovrebbe tenersi all’aperto nell’Arena del teatro Sociale. In questo momento splende il sole, ma si prevede nuvolo con occasionali piogge. Incrocio le dita.

{ Comments on this entry are closed }

Arduino: connessione a MySQL su Raspberry Pi

by Gaspar Torriero on 20/06/2014

Ecco il mio Arduberry:

Arduberry

Un Arduino Leonardo con sensore di temperatura e di luce, connesso direttamente via porta USB a un Raspberry Pi su cui gira un server LAMP. I dati del sensore vengono scritti ogni dieci minuti su un database MySql sul Raspberry.

Il vantaggi di questa soluzione rispetto a quella precedente sono che a) non si appoggia a nessun servizio esterno e quindi ne ho il pieno controllo, e b) che mi sono divertito un casino a smanettare tra java, python, sudo nano e crontab. Ho tratto grande giovamento dai vari tutorial in circolazione, in particolare Connect Raspberry Pi and Arduino with Serial USB CableTutorial: store Arduino data with RaspBerry PI to MySql che ringrazio di cuore: ragazzi, non ce l’avrei mai fatta senza di voi.

Prossimo passo: trovare un alimentatore separato per l’Arduino, che la porta USB del Raspberry alimenta ma appena appena. Potrei provare a utilizzare il server Apache del Raspberry per la visualizzazione dei dati. Magari un’altra volta.

Ecco la non semplicissima ricetta, al netto degli innumerevoli prova ed errore:

1)

/*
  Termometro 
  con smoothing dei valori del sensore
  (media di 10 letture)

  vedi
  http://www.arduino.cc/en/Tutorial/Smoothing
  
*/


const int numReadings = 10;     // numero di letture per la media
int readings[numReadings];      // le letture dal sensore analogico
int index = 0;                  // 'indice della lettura corrente
int total = 0;                  // il totale corrente
int average = 0;                // la media
float temp;                       // la temperatura in C°
int light;
int inputPin = A0;              //la connessione al sensore di temperatura
int lightPin = A1;
int x;
int y;
unsigned long temptot;



void setup()
{
  Serial.begin(9600);
  // metto a 0 le letture: 
  for (int thisReading = 0; thisReading < numReadings; thisReading++)
    readings[thisReading] = 0;          
}

void loop() {
  // tolgo l'ultima lettura:
  total= total - readings[index];         
  // leggo più volte dal sensore
  // e faccio la media per stabilità: 
  temptot = 0;
  for(x = 0; x < 64; x++) {
    temptot += analogRead(inputPin);
  }
  y = temptot >> 6;
  readings[index] = y;
 
  //readings[index] = analogRead(inputPin); 
  // aggiungo la lettura al totale:
  total= total + readings[index];       
  // avanzo alla posizione seguente nell'array:  
  index = index + 1;                    

  // se siamo alla fine dell'array...
  if (index >= numReadings) {              
    // ...ricomincio da capo: 
    index = 0;                           
  }
  // calcolo la media:
  average = total / numReadings;
  
  // converto voltaggio sensore in °C
  temp = ( 5.0 * average * 100.0) / 1024.0;  
  // leggo l'output per debug:
  // Serial.println(temp); 
  light = analogRead(lightPin);
  

  // scrivo sulla porta seriale:
  Serial.print(temp);
  //Serial.print(average);
  Serial.print(" ");
  Serial.print(light);
  Serial.println();

  delay(2000);        // ritardo tra le letture per stabilità 
  
}

2)

Codice in python (il file è questo) che legge la USB del Raspberry , preleva i valori dei sensori e li scrive nel database MySQL:

arduinotomysql1

 

3)

La riga aggiunta in Raspberry con il comando crontab -e che esegue la lettura della porta seriale ogni dieci minuti (l’ultima parte serve a evitare le mail di alert):

*/10 * * * * /usr/bin/arduinotomysql.py >/dev/null 2>&1

 4)

Enjoy!

{ Comments on this entry are closed }

Arduino: il grafico delle temperature

by Gaspar Torriero on 17/06/2014

ArduTemp

Per cucinare il grafico della temperatura della mia camera da letto, ho impiegato i seguenti ingredienti:

  • Un Arduino 2009 con Internet Shield
  • Un sensore analogico di temperatura LM35
  • Un database MySQL su Amazon Web Services (gratis) su cui registrare i dati ogni 10 minuti
  • MySQL Workbench (gratis) per creare e gestire il database e la tabella
  • Un account su Temboo (gratis fino a 1000 calls/mese)) per trasferire i dati da Arduino a MySQL
  • MySQL for Excel (gratis) per riversare i dati raccolti in un foglio di Excel
  • Excel 2013 per trasformare i dati del sensore in gradi centigradi e creare la media oraria con relativo grafico.

La ricetta ha molti passaggi ma non è complicatissima. Richiede qualche conoscenza di programmazione, di SQL e di Excel, oppure richiede il tempo di fare numerosi errori, consultare gli innumerevoli manuali presenti in rete, riprovare con maggiore fortuna.

E’ un buon inizio e sono soddisfatto, ma c’è molto da migliorare.

Il fatto è che avevo già in casa un server MySQL sul Raspberry Pi, e il Raspberry ha i suoi bei pin di input/output. Ma ho scoperto che i PIO del Rasberry sono digitali, mentre il mio sensore è analogico. Morale: comprerò un sensore di temperatura digitale (tipo questo) e riproverò con una soluzione più diretta e più elegante.

Nel frattempo: come spiegare il picco delle ore sei?

AGGIORNAMENTO:

MySQL for Excel è fantastico e funziona perfettamente; inoltre importa automaticamente le connessioni create con MySQL Workbench; ma alla terza volta che riscaricavo i dati per aggiornare il grafico mi sono stufato.

Ho invece installato il driver ODBC per MySQL, e adesso la pivot si aggiorna direttamente dal database, senza passaggi intermedi e senza dove ogni volta rifare il lavoro. Molto meglio.

{ Comments on this entry are closed }

Da Spark a Google Spreadsheets: una storia d’amore con finale tragico

giugno 6, 2014

Una delle cose interessanti dello Spark (il simil-Arduino con WiFi integrato) è che pubblica automaticamente nel cloud il suo stato. Una delle cose interessanti di Google Spreadsheets è che è programmabile, e gli puoi chiedere di prendere i dati da una url: Metti insieme le due cose, e questo è il risultato: Ero molto contento della scoperta, […]

Read the full article →

Cavalleria Rusticana – Appunti di regia

maggio 27, 2014

(post in progress, mentre aspetto che mi venga affidata la messa in scena) La trama dell’opera: Turiddu torna da soldato, trova la sua antica fiamma Lola sposata con il carrettiere Alfio e per dispetto si mette con Santuzza, che abita vicino a Lola. Lola si ingelosisce e, approfittando dell’assenza di Alfio, si riprende Turiddu come amante. […]

Read the full article →