PowerDuino Standalone, ecco i sorgenti
AGGIORNAMENTO 29 marzo 2014 – Arduino Day 2014
Presentato in fiera progetto dimostrativo basato su sensori di luce.
Il progetto dimostrativo utilizza due fotoresistenze e un sensore con accelerometro e bussola.
Le fotoresistenze mostrano come si possa programmare Arduino per rilevare la luce o il buio e per controllare apparecchi a 330V (lampadine);
PowerDuino è una dimostrazione di utilizzo del rilevamento di luce : ad ogni lampeggio del led di un contatore di energia, arduino incrementa un contatore, riuscendo così a calcolare la potenza istantanea e l’energia consumata.
Il sensore con bussola+accelerometro serve a illustrare la facilità con cui è possibile interfacciare sensori ad Arduino: bastano due fili per i sensori dotati di protocollo I2C; altri due fili servono per la massa e l’alimentazione. Opportune librerie permettono di pilotare i sensori con facilità.
Il sensore in uso nel progetto dimostrativo è un LSM303D, utilizzato con questa libreria.
Sketch dimostrativo:
#include <Wire.h>
#include <LSM303.h>
LSM303 compass;
char report[80]; int ControlPin=13; int RelayOne=7; int RelayTwo=8; int SensorOne=A1; // Light sensor one (SHORT RESISTOR - DARKNESS) int SensorTwo=A2; // Light sensor two (LONG RESISTOR - LIGHT) int GND_One=11; // For light sensor one (SHORT RESISTOR - DARKNESS) int GND_Two=12; // for light sensor two (LONG RESISTOR - LIGHT) int GND_Three=6; // For I2c Sensor
int DARKNESS_THRESHOLD = 200; // if above, it's dark, turn on the light int LIGHT_THRESHOLD = 450; // if below, light is detected, turn on the lamp!
void setup() { Serial.begin(9600); Serial.println("Init wire..."); delay(1000); Wire.begin(); delay(1000); Serial.println("Init compass..."); compass.init(); delay(1000); Serial.println("Enable compass..."); compass.enableDefault(); delay(1000); Serial.println("Init vars..."); pinMode(ControlPin,OUTPUT); //Led pinMode(RelayOne,OUTPUT); //Xboard relay 2 pinMode(RelayTwo,OUTPUT); //Xboard relay 2 pinMode(GND_One,OUTPUT); digitalWrite(GND_One,LOW); pinMode(GND_Two,OUTPUT); digitalWrite(GND_Two,LOW); pinMode(GND_Three,OUTPUT); digitalWrite(GND_Three,LOW); pinMode(SensorOne,INPUT); pinMode(SensorTwo,INPUT); digitalWrite(ControlPin,HIGH); digitalWrite(SensorOne,HIGH); digitalWrite(SensorTwo,LOW); delay(1000); digitalWrite(ControlPin,LOW); Serial.println("Program started!");
}
void loop() { compass.read();
snprintf(report, sizeof(report), "A: %6d %6d %6d M: %6d %6d %6d", compass.a.x, compass.a.y, compass.a.z, compass.m.x, compass.m.y, compass.m.z); Serial.print("ResistenzE; "); Serial.print(analogRead(SensorOne)); Serial.print(","); Serial.print(analogRead(SensorTwo)); Serial.print(","); Serial.println(report); // GRAVITY //////////////// if (compass.a.z<0) { digitalWrite(RelayOne,HIGH); } if (compass.a.z>0) { digitalWrite(RelayOne,LOW); }
// COMPASS //////////////// if (compass.m.x<0) { digitalWrite(RelayTwo,HIGH); } if (compass.m.x>0) { digitalWrite(RelayTwo,LOW); }
// DARKNESS ///////////////// if (analogRead(SensorOne)>DARKNESS_THRESHOLD) { digitalWrite(RelayOne,HIGH); }
if (analogRead(SensorOne)<=DARKNESS_THRESHOLD) { digitalWrite(RelayOne,LOW); }
// LIGHT /////////////////// if (analogRead(SensorTwo)<LIGHT_THRESHOLD) { digitalWrite(RelayTwo,HIGH); } if (analogRead(SensorTwo)>=LIGHT_THRESHOLD) { digitalWrite(RelayTwo,LOW); }
delay(100); }
Powerduino può essere usato per disegnare la curva di carico di lavatrice e lavastoviglie, scoprire quando e per quanto tempo assorbono 2000W, e quindi scoprire di quanto va sfalsata l’acdensione dei due elettrodomestici in modo che possano lavorare insieme senza far saltare il contatore.
============================
Dopo la presentazione all’Arduino Day 2013, ecco i sorgenti del PowerDuino Standalone:
E’ sufficiente caricarlo(*) su un normale Ardulog (meglio evitare l’Openlog, a meno di essere in grado di effettuare microsaldature a mano…), e immediatamente l’Ardulog si trasformerà da logger seriale a logger standalone, ossia in grado di registrare autonomamente dati dal pin analogico A1, senza bisogno di una Arduino esterna di supporto.
Al momento il listato è ancora un po’ primitivo, non è assolutamente ottimizzato, al contrario di quello originale Openlog 3.0 superottimizzato a basso livello in modo da ridurre al minimo i consumi del processore (quello distribuito con Ardulog è invece molto più rudimentale).
In futuro avrei in mente di realizzare un listato generico che, anzichè registrare specificamente la potenza misurata da un energy monitor esterno, semplicemente registri i dati grezzi letti dai 4 pin analogici e due digitali presenti su Ardulog: in questo modo, Hobbytronics, autore dell’Ardulog, potrebbe vendere il prodotto in versione “standalone” oltre che “serial”, e tale versione sarebbe adatta per qualunque applicazione: basterebbe demandare al file excel in cui si copiano i dati il compito di elaborarli in modo opportuno. Il file conterrebbe infatti semplicemente una riga per ogni lettura, effettuata ogni TOT millisecondi, e in ogni riga ci sarebbero i valori dei pin.
Bisogna però decidere in che modo impostare l’intervallo dall’esterno senza dover riprogrammare l’Ardulog; potrei ad esempio usare i due pin digitali per impostare 4 livelli diversi di precisione (2 bit= 4 valori), oppure i due digitali più A1, che sta fisicamente separato dagli altri, in modo da poter impostare 8 valori (2^3=8), semplicemente a seconda di quali pin sono a massa e quali a +Vcc.
Spero di riuscire a farmi un’idea più chiara in tempo per la prossima “uscita pubblica” di PowerDuino, che probabilmente sarà in occasione della “Geek Sunday” in programma a Roma per il prossimo 5 maggio.
(*) Per caricare uno “sketch” (=listato=programma) su Ardulog, bisogna collegarlo al PC tramite circuito adattatore FTDI (RS232/TTL), oppure tramite una Arduino Uno priva del microchip, collegando i pin RX-RX, TX-TX, Vcc-3.3V, GND-GND, RST-RESET, e impostando Arduino Uno sull’IDE.
leave a comment