Dienstag, 9. Oktober 2012

Bug in BlinkM

Ab und zu vergessen die BlinkM's Ihre Adresse oder haben eine Adresse über 50. Hier die Lösung von folgender Seite:

You should be able to just change the hfuse and that's it. I tend to do everything ("nuke it from orbit, it's the only way to be sure") :-)
To make adjust the BOD-level by just changing the lfuse, the avrdude line becomes: 
avrdude -P usb -c avrispmkII -p attinyXX -v -U hfuse:w:0xDD:m
That sets the BOD to 2.7V. I think for BlinkM going any lower wouldn't be of much use since the lowest voltage the Red LED in BlinkM needs to turn on is around 2.5V (the Blue and Green need around 3.4V & 3.0V respectively) BlinkMs are designed to run at 5V (i.e. the colors are most balanced around that voltage)
The way the BOD works is you want it's detection level to be as high as possible so it triggers (and thus puts the chip in reset) as soon as the chip's power source gets too low. In theory, having no BOD enabled is fine, but as we're seeing with the current run of these ATtiny chips, we want to put the chip in reset as soon as possible to avoid the EEPROM getting scrambled.

Freitag, 5. Oktober 2012

Stairlight 1.0

Es hat ein wenig gedauert, aber endich kann ich sozusagen Vollzug melden ;) 

Das erste Stairlight war wirklich nur ein Prototyp, da an diesem ja nur einfache RGB LED angeschlossen waren die den Effekt einfach nicht zur Geltung bringen konnten.

Um jetzt mehr leistung schalten zu können, habe ich mir als erstes ein entsprechendes Lichtband bei der Bucht besorgt:

http://www.ebay.de/itm/5m-RGB-5050-LED-SMD-Strip-Streif-Controller-Trafo-DC12V-Neu-/270962831006

Das Netzteil sollte man vielleicht gleich mitbestellen, da so ein Strip doch schon einiges an Power braucht. Nun geht es an die Schaltungen, ihr ahnt es sicher schon. Alle Slaves müssen durch eine Version ersetzt werden die höhere Ströme schalten kann, in unserem Fall 12V mit max. 0.5A.

Da diese SMD RGB LED's wirklich sehr hell strahlen (bei 60 Leds/m) , hatte ich mich entschieden, nur 2 Segmente a 5cm für eine Stufe zu benutzen. Ich hatte mir auch schon eine Schaltung ausgesucht:

http://protofusion.org/wordpress/2011/06/tinyrgb-an-i2c-led-driver/

Problem an dieser Schaltung war aber, das diese nur mit 5V betrieben werden kann, da die LED und der Attiny85 an der gleichen Versorgungsspannung hingen.Hier ein Video von meinem ersten Entwurf:



Also selber an das virtuelle Reissbrett (DIPTrace) gesetzt und eine eigene Schaltung entworfen:
https://dl.dropbox.com/u/46359709/Stairlight_2_0_gerber.zip
https://dl.dropbox.com/u/46359709/StairlightDipTrace.zip


Gerber ansicht ATTiny Slave


Klar man kann an der Schaltung noch einiges verbessern, besonders die Größe der leiterplatte gefällt mir nicht. Aber für den 2. Versuch ist es ganz ordentlich geworden. Die Schaltung wurde so entworfen, das an dem I2C Anschluss in folgender Reihenfolge:


 [+12V, +5V, SDA, SCL, GND]

Der zweite Anschluss für den RGB LED Anschluss, sollte auch klar sein:

[+12V, Rot, Grün Blau ]

Ich habe dann an dem 10 adrigen kabel einfach noch zusätzlich die Spannung der 12V Leitung angeschlossen. Der Arduino (UNO) mit dem Stairlight Master Programm wird direkt über diese 12 betrieben und der Spannungsteiler auf dem UNO stellt die 5V zur verfügung, da an dieser Leitung nur 14 Attinys sitzen, die maximal 20-30mA brauchen kann man die Spannungsversorgung dem wackeren UNO überlassen.

Dienstag, 26. Juni 2012

Es werde Licht

Nun ist es endlich soweit, der erste Prototyp meines Stairlights ist am laufen und das Hauptprogramm fertig gestellt. Scheinbar verbraucht es weniger als 8 kByte, ein ATTiny85 würde also als I2C Master in Frage kommen.

Ich hatte noch einige Probleme mit der String klasse, scheinbar hat diese in der Arduino IDE ein Speicherleck und nach 5-10 Durchläufen hing sich das Teil auf. Ein wenig in Google rumgesucht und siehe, da gab es wohl einen Bug in der Stringklasse:

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1269804272

Also raus mit der klasse und rein mit einer char Definition. Ein anderer Fehler, den wohl nur ein Anfänger wie ich machen kann, wenn man mit millis() rechnet sollte man immer als variable unsigned long nehmen, ansonsten wird es ein Überlauf alle x Sekunden geben, was das Programm dann verrückt spielen läßt.

http://arduino.cc/en/Reference/millis

Hier der komplette Code:

http://code.google.com/p/xstairlight/

Ich werde dieses Programm weiter entwickeln, die nächsten Ideen gehen in Richtung personalisieren der Farben, Lichtsensor usw.

Falls Fragen auftauchen, schreibt mir einfach. Ich werde Euch so gut wie möglich helfen.

Wie auch immer, hier ein paar Fotos:

BlinkM's in Aktion

ein I2C Analog Drucksensor als I2C Device


Mittwoch, 13. Juni 2012

I2C Slave in Arduino/C

Also ich sag mal so, es war ein Krampf! Das lag aber mehr an den nicht gesammelten Erfahrungen und an einem fehlerhaftem Modul, das so noch nicht kommuniziert wurde. Was war passiert?

Ich baute den ersten analogen Drucksensor als I2C Device, dieser besteht aus einem ATTiny85 sowie zwei Pullup Widerständen.

Drucksensor I2C Prototyp


Die ersten Tests mit dem Modul TinyWireS sahen auch nicht schlecht aus. Was mir aber damals schon auffiel, das Konstrukt schien ein sync Problem zu haben. Immer wenn ich den Sensor betätigt habe, kamen die informationen (je nach Delay im Master) eine Sekunde später an. Ich bin an dem Problem fast verzweifelt, bis ich gestern diesen Forumbeitrag gefunden hatte:

http://arduino.cc/forum/index.php/topic,108410.0.html

Das einzige Problem dabei, ich wusste nicht das man c++ Code direkt in der Arduino IDE editieren und compilieren konnte. Das ging schon mal wenn man folgende Tipps berücksichtigt:

http://arduino.cc/forum/index.php/topic,108410.msg819327.html#msg819327


 I created a new library in my Arduino sketchbook called usiTwiSlave and dropped the two files: usiTwiSlave.c and usiTwiSlave.h inside there.  Then, I changed the .c extension to a .cpp extension on usiTwiSlave.c .  (The compiler complains about some of the library's methods being "undefined" otherwise, since it's not actually compiling the .c file.)

(Don't forget to restart the IDE after adding a new library!)

To get Jochen's Arduino code working, I changed Wire.send to Wire.write an Wire.receive to Wire.read

Ich musste am Ende noch den Eintrag common.h entfernen und es rödelte durch. Nun ging es aber richtig los, schließlich musste ich in dem C++ Code auch noch angeben, welche Pin high ist (um den Sensor mit 5V zu versorgen) und natürlich wie ich den Wert des Sensors auslese. Sehr geholfen hat mir dabei diese Seite:

http://joehalpin.wordpress.com/2011/06/19/multi-channel-adc-with-an-attiny85/

und hier wieder ein paar regelon für I2C:
  • schalte immer den Master aus, wenn du ein I2C Slave im Bus austauschst. Sollte der Leseprocess hängen, liegt es mit großer Sicherheit daran das der Master versucht den Slave zu finden und dieser nicht antwortet.
  • Denke an die Pullup Widerstände!
  • lass dem Slave Zeit (delay(10)) die Daten an den Master zu senden.
Am Ende der Code für Master sowie Slave, Slave nutzt eine spezielle Library die im o.g. Beitrag erwähnt wurde:
https://www.dropbox.com/sh/4m0c64u7gaz6rot/xx66uwrG7_

Die ATTiny's werden nach folgender Anleitung programmiert:



Montag, 4. Juni 2012

Fuses oh Fuses!

Tja, das programmieren eines kleines achtbeinigen ATTiny ist schon etwas besonderes, bevor man mit einem Frischling aus dem Laden Leben einhaucht, sollte man aber UNBEDINGT an die Fuses denken:

http://www.mikrocontroller.net/articles/AVR_Fuses

Nach langem Suchen und einigen Missverständnissen des online Fusecalc( http://www.engbedded.com/fusecalc ), habe ich es nun doch geschafft. Hier einige Punkte die wichtig sind:


  • Fuses auslesen:
    avrdude -c usbasp -p t85 -B20 -v -U lfuse:r:-:i

  • Fuses schreiben:
    avrdude -c usbasp -p t85 -B20 -v -U lfuse:w:0xe2:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m
Nach diesem Vorgang kann man den ATTiny programmieren wie man will, die Einstellungenm (Fuses) werden für immer gespeichert. Auch sollte man beachten, das jetzt erst die meisten Programmer gewillt sind ungedrosselt den µC programmieren zu wollen! Ansonsten muss man, wie oben beschrieben mit '-B20' den programmer etwas drosseln.



Freitag, 1. Juni 2012

Arduino Treppenlicht per I2C

Ich habe mir einige Anleitungen für "Treppenlichter" angesehen und diese sehen meist auch toll aus. Ich wollte aber einen anderen Weg gehen und mich näher mit I2C beschäftigen. Ein Treppenlicht bietet sich da förmlich an, hier also mein Plan:


Steuerung(Arduino nano) --> I2C Bus: 


I2C_1ATtiny85 mit Drucksensor (FSR) und Lichtsensor
I2C_2ATtiny85 mit Nachbau BlinkM Modul
I2C_XATtiny85 mit Nachbau BlinkM Modul
I2C_14ATtiny85 mit Drucksensor (FSR)


Die Treppe besteht aus 13 Stufen, also benötige ich 13 I2C Devices die mit der Firmware von BlinkM arbeiten. Plus 2 Devices, die ermitteln ob die erste oder letzte Stufe betreten wurde sowie ein Lichtsensor. Hier wurden auch schon Leiterplatten mit Fritzing erstellt und in Auftrag gegeben. Die ATtinys selber werden ja immer billiger, ich habe mich für den ATtiny85 entschieden. bei 0.80 Euro braucht man da nicht mehr nachdenken  smiley-cool


So, alles aufgebaut und was soll ich sagen, es funktionierte auf Anhieb. Hier mal ein Foto des Versuchsaufbau's und der Code für master und Slave. Auf dem Foto seht ihr den Arduino Nano sowie ein BlinkM Device sowie das I2C mit dem Drucksensor FSR 402. Das BlinkM hat in dem Aufbau erst einmal keine Funktion ... sobald man den Sensor betätigt bekommt man Werte bis 256 auf der Konsole.





Nun, ich habe als erstes ein BlinkM Clone in Fritzing entworfen. Die habe ich dann als Gerberfiles an einen Leiterplattenhersteller:https://www.haka-lp.de geschickt und gestern bekommen. Aber wie das Leben so spielt, zwei Fehler waren in dem Entwurf. Ich hatte 2 Massen und der Reset Pin des Tinys war auf masse smiley-wink Aber nach brutalem umbiegen des Pin's lies sich das Teil ansprechen smiley-wink Mein größtes Problem, die Bohrungen der RGB LED waren einfach zu klein und ich muss mir jetzt was ausdenken um die gelieferten Leiterplatten doch noch nutzen zu können.


Hier mal mein geänderter Entwurf mit extra Buchsenleiste für die LED ...


so am Wochenende habe ich endlich zeit gehabt mich weiter um mein Projekt zu kümmern smiley-wink Die 13 Devices sind jetzt alle zusammen gelötet. Die falsche Routenführung hatte ich mit einem kleinen kabel gelößt. Der resetpin auf masse wurde durch brutales entfernen des pins an dem IC Sockel deaktiviert.


Um das I2C Problem etwas zu umgehen, habe ich mich entschlossen bei Reichelt ein 10 poliges Flachbandkabel nebst 2x5 Pfostensteckern zu kaufen. Die Signalleitungen haben dadurch immer eine Masseleitung zwischen sich und werden damit stabiler arbeiten. 


Hier also ein paar Fotos von den kleinen Dinger smiley-wink






Endlich sind auch die platinen für die I2C AnalogSensoren gekommen. Gleich einen mal zusammengelötet und siehe da, auf Anhieb funktioniert ... jedenfalls sah es so aus ;) Der Sensor arbeitet, Problem war nur .... immer wenn ein Event ausgelöst wurde kam der einige Sekunden später bei dem Master an. Ich hab eine Weile gebraucht um herauszufinden das die Fuses nicht richtig gesetzt wurden und der Attiny85 mit seinen  Standart Fuses also 1 MHZ nur läuft. Gut, man lernt immer dazu ;)

Am Wochenende werde ich die Zeit finden um endlich das Programm aufzubauen und den I2C Drucksensor aufzubauen.