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.

Prima uscita pubblica per PowerDuino standalone ad Arduino day 2013

Posted in Uncategorized by jumpjack on 6 aprile 2013

image

Oggi c’e’ stata la presentazione ufficiale al pubblico del progetto PowerDuino Standalone. Nato dopo lunghe vicissitudini durate addirittura un anno, e’ diventato possibile grazie a un Arduino Uno originale (al posto del clone Luigino usato per le innumerevoli prove fallite) e ad un Ardulog, successore dell’OpenLog. I numerosi visitatori, dapprima solo un po’ incuriositi, poi decisamente colpiti, hanno mostrato la validita’ dell’idea di un cosino largo 2 ceentimetri in grado di monitorare I consumi di tutta casa senza bisogno di nessuna conoscenza di elettronica: basta un rotolo di nastro adesivo, e PowerDuino Standalone e’ operativo! Il nastro serve ad attaccare la fotoresistenza al led presente sui normali contatori elettronici; 30 secondi per effettuare la calibrazione (da farsi solo la prima volta, poi verra’ mantenuta anche staccando la batteria), e poi il logger inizia a registrare. Presto I sorgenti saranno disponibili sul blog per chiunque desideri costruire l’apparecchio in proprio. Per chi non ama il fai da te, il modello standalone costera’ 30 euro e il modello da quadro 65.

Appunti su OpenLog – il file di configurazione config.txt

Posted in Uncategorized by jumpjack on 31 marzo 2013

La documentazione di questo pur utile, minuscolo cosino in grado di registrare miliardi di dati in 4 cm2 lascia molto a desiderare a causa delle molteplici versioni succedutesi nel tempo.

Ecco quindi una breve spiegazione del file di configurazione di OpenLog:

  •  si deve chiamare CONFIG.TXT (tutto maiuscolo)
  • il file deve contenere un’unica riga, non sono ammesse righe di commento
  • la riga contiene numeri separati da virgole, senza nessun identificativo; è cioè un file di configurazione POSIZIONALE

Parametri ammessi:

Versione 1:

  • baudrate (max 230400), carattere di escape, numero di ripetizioni necessarie del carattere di escape, tipo di logging

Esempio:

  • 115200,103,14,0 = 115200 bps, escape char of ASCII(103), 14 times, new log mode

Versione 2:

  • Come versione 1 (ma baud max=115200)

Versione 3:

  • baudrate (max=115200), carattere di escape, numero di ripetizioni necessarie del carattere di escape, tipo di logging, modalità prolissa on/off, echo on/off

Esempio:

  • 115200,103,14,0,1,1 = 115200 bps, escape char of ASCII(103), 14 times, new log mode, verbose on, echo on.

Spiegazione parametri:

  • 9600: The communication baud rate. 9600bps is default. Acceptable values are 2400, 4800, 9600, 19200, 38400, 57600, 115200.
  • 26: The ASCII value (in decimal form) for the escape character. 26 is ctrl+z and is default. 36 is ‘$’ and is a commonly used escape character.
  • 3: The number of escape characters required. By default it is three so you must hit ctrl+z three time to drop to command mode.
  • 0: System mode. OpenLog starts in newlog mode (0) by default. Acceptable values are 0 = New Log, 1 = Sequential Log, or 2 = Command mode.
  • 1: Verbose mode. Extended (verbose) error messages are turned on by default. Setting this to 1 turns on verbose error messages such as unknown command: remove !. Setting this to 0 turns off verbose errors but will respond with a ‘!’ if there is an error. Turning off verbose mode is handy if you are trying to handle errors from an embedded system.
  • 1: Echo mode. While in command prompt characters are echoed by default. Setting this to 0 turns off character echo. Turning off echo is handy if you are trying to handle errors and don’t want to have the sent commands echoing back to the sender.

Nota: nessuna versione di firmware consente al momento di registrare letture dei PIN piuttosto che dei dati seriali, sebbene TX e RX possano teoricamente essere configurati come input digitali; non sono presenti pin analogici sulla board, sebbene A0, A1, A3, A4 e A5 siano disponibili sul chip (A2 non è disponibile).

Nota2: su ArduLog, una variante di OpenLog,  sono presenti anche 4 piedini analogici, ma poichè usa lo stesso firmware di OpenLog, non è comunque possibile registrare nessun input!

Nota3: SDLogger, altra variante di OpenLog, utilizza versioni leggermente modificate del firmware di OpenLog, e utilizza SD Card grandi invece che mircoSD. Ha 4 pin analogici (oltre a una porta seriale aggiuntiva), ma non può comunque registrare dati letti dai pin.

Tagged with: , , ,

Appunti su OpenLog (e ArduLog)

Posted in Programmazione by jumpjack on 29 marzo 2013

Tempo fa ho acqustato un Openlog della Sparkfun, un logger seriale arduino-based.

Non sono mai riuscito a farlo funzionare, però nel frattempo tanta gente ci si è rotta la testa trovando un sacco di problemi, e risolvendoli alcuni; le soluzioni sono sparse nellalunghissima pagina dell’openlog, provo a riassumerle qui sotto; nel frattempo, ho ordinato invece un ARDUlog, che essendo un successore sembra un po’ migliore: ha dei fori per avvitarlo a un supporto, e ha vari pin analogici di ingresso, quindi è predisposto a livello hardware per diventare un logger standalone, anche se ancora non esiste un firmware adatto.

 

Openlog:

Ardulog 1.0:

 

 

Ardulog 2.0 (notare l’inversione di TX e RX per coincidere con la board FTDI):

PROBLEMA 1 – Condensatori di disaccoppiamento sull’alimentazione:

Member #124829 | about 3 months ago 1

I am using the open log to log weather and cosmic ray data once a minute. I have an Atmega 328 connected on the bread board to the open log for data logging, and to a FTDI header for programming. The open log log’s data fine when I have the FTDI adaptor (DEV-09716) attached, but doesn’t log anything when It isn’t attached. I assume I have a hardware failure, and I forgot to connect something to the open log that the FTDI is connecting for me, but I checked and the TX and RX pins are connected properly, and so are GND and VCC. Right now my only guess is that the FTDI is putting more capacitance on the power supply that causes it to start working, but I haven’t tested it yet. However when I measured the voltage W/ the FTDI adaptor both the TX and RX lines sat at 4.7 to 4.9V and W/O it was 3.3 for both of them. Can I please get some help?

I fixed the problem, there wasn’t enough capacitance and the bypass caps on the FTDI were making the open log work. Make sure you have bypass caps on your power supply, I added a 10uf about 10cm of wire away and a 0.1uf right on the header of the open log and it started working perfectly.

PROBLEMA 2 – Livelli a 5V o 3,3 V?

tsm | about a month ago * 1

I’m getting a stream of 1s back from the data logger over serial.

I’m using a 5V Arduino, powering the OpenLog off of its 5V pin, and sending serial over to it and getting serial back. When the TX from the Arduino is not connected to the RX on the OpenLog, the OpenLog reports “12<”. However, when I connect the Arduino’s TX pin to the OpenLog’s RXI pin, I only getting “11111111….”

While the datasheet says that the RXI pin can take up to 6V, I notice that the schematic shows regulation of VCC down to 3.3V, while the RXI pin undergoes no translation and is connected directly to the ATMEGA. This makes me think that in fact a 5V TTL signal from the Arduino is too high and is causing the ATMEGA to result. Just a guess though.

Has anyone else seen this? The closest thing I found was unanswered (https://github.com/sparkfun/OpenLog/issues/138).

For reference, everything works correctly when I use a 3.3V FTDI.

I just soldered up a TTL logic level shifter (the Sparkfun one), taking my 5V TTL on the Arduino side down to 3.3V on the OpenLog side, and now it’s working. It looks like the 5V serial signal in fact is unacceptable to the ATMEGA, despite that the datasheet suggests it can accept 6V. Big debugging nightmare! Does anyone k

PROBLEMA 3 – Malfunzionamento a batterie

This is working when using USB power, but not battery power. Setup:

5V Arduino’s TX –> logic level shifter –> OpenLog’s RX

OpenLog’s TX –> resistor –> Arduino RX

Arduino’s reset pin –> logic level shifter –> OpenLog’s reset pin

tsm | about 2 weeks ago 1

I had a high-current device on the same bus. Interestingly, a separate mistake was drawing the 3.3V bus to 5V, but when the high-current device was on the line, it was pulling too much current and bringing the bus back down closer to 3.3V. When I used the battery, which delivered more current, this didn’t happen, and so the OpenLog would reset. Nasty problem. Fixed with a separate bus for that current-hungry component.

PROBLEMA 4 – flashing firmware con AVRDUDE:

gek | about 3 years ago 1

I’m using a FTDI 3.3v (DEV-09717) cable connected to my OpenLog. Using teraterm on COM10 I can make a connection to the device. all is good.
to upgrade the firmware I’m using the follow cmd:
avrdude.exe -p atmega328p -P COM10 -c stk500v1 -b 57600 -Cavrdude.conf -U flash:w:main.hex
and get this response:
avrdude.exe: ser_open(): can’t open device “COM10”: The system cannot find the file specified.
I have put libusb0.dll in the system32 directory.
is the problem that arvdude can’t handle high number com ports?
thank you
gek

I did a little hacking with regedt32 and changed the comport from 10 to 3. I can now update the firmware.
see:
http://www.ftdichip.com/Documents/AppNotes/AN_132_Re-Assigning_COM_Port_Numbers_Using_Registry.pdf
The registry remembers all FTDI converters that have been used. The driver does not reassign unused comport numbers. In some cases that a good thing. It would be nice to be able to “reserve” a set of comport numbers to be reused as devices are used and removed.

PROBLEMA 5 – flashing firmware

kzwinn | about 2 years ago 1

Hi,
Anyone encountered this problem while flashing the firmware? Thanks!

C:\openlog>avrdude.exe -p atmega328p -P COM6 -c stk500v1 -b 57600 -Cavrdude.conf
-U flash:w:main.hex
avrdude.exe: stk500_getsync(): not in sync: resp=0x00
avrdude.exe: stk500_disable(): protocol error, expect=0x14, resp=0x51

  • ok..solved. you need to connect all pins of FTDI Basic board and openLog. Not just TX/RX/5V/GND won’t be able to download.
    https://github.com/nseidle/OpenLog/wiki/Datasheet
    Under this topic
    How do I attach a FTDI Basic board to OpenLog for configuring and bootloading?

    PROBLEMA 6 – output 1, no prompt, no logging

    Lubin | about a year ago * 1

    Hello,

    I get an OpenLog with firmware v1.51 as I remmeber. I have a standard FTDI cable.

    I downloaded newer firmware through the git repository. I can upgrade sucessfully to any firmware version. I Only have Rx-Tx wires with Vcc-GND. I power up openlog whild pressing enter with: avrdude -p atmega328p -P COM2 -c stk500v1 -b 57600 -Cavrdude.conf -U flash:w:main.hex

    It’s programming without error. However, open log is only showint one 1 at hyperterm when starting. I do not have anymore 12>.

    What’s going on ? any ideas ?

    • Find out : the computer corrupted the Sd card. reformating the card make its working with latet firmware.

CONSIGLIO 1

Just got it working! Very nice.
Couple of hints for others.
—Default baud is 9600 8n1.
—Make sure your card is formated as fat16.
—If you hook it directly up to FTDI Basic don’t forget to cross the rx and tx lines.

CONSIGLIO 2:

to format FAT16 with dos in xp:
c:>format e: /fs:fat

INFO:

STAT1 LED is the LED right of the word OpenLog and is sitting on PD5 (Arduino D5). This LED toggles on/off every time a new character is received. This LED helps troubleshoot and indicate serial communication is working.
STAT2 LED is the LED left of the word OpenLog and is sitting on PB5 (Arduino D13). This LED is attached to the SPI Serial Clock line. You will see this LED flash rarely. It only turns on when the SPI interface is active and this is rare as the OpenLog buffers 512 bytes at a time before recording to the SD card. Recording 512 bytes is very fast so the LED is on for very little.

Nate | about 3 months ago 1

OpenLog expects TTL voltage levels. RS232 will not work and could (maybe) harm the OpenLog (probably not though). You’ll need a MAX3232 or a shifter circuit.

UPLOAD FIRMWARE SENZA AVRDUDE:

Hobbytronics | last year 1

If you want to upgrade the firmware on this board with the latest version, you don’t have to go through the hassle of installing a custom version of Arduino as suggested. The compiled hex file is included in the download. There is a great little program called XLoader (http://xloader.russemotto.com/) which you can use to download the firmware into the openlog. (No avrdude knowledge required)