Jumping Jack Flash weblog

PowerDuino Standalone, ecco i sorgenti

Posted in hardware, Programmazione by jumpjack on 7 aprile 2013

AGGIORNAMENTO 29 marzo 2014 – Arduino Day 2014

Presentato in fiera progetto dimostrativo basato su sensori di luce.

power1

 

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);
}

power2

power3

 

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.
image

image

============================

Dopo la presentazione all’Arduino Day 2013, ecco i sorgenti del PowerDuino Standalone:

DOWNLOAD PowerDuino 0.3.2

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.

Puoi inserire un commento qui sotto; diventerà visibile dopo la moderazione dell'amministratore