DEFCON Ampel, die Zweite

Um den Kollegen anzuzeigen, dass man gerade nicht unbedingt gestört werden möchte, habe ich eine kleine Ampel in Anlehnung an die DEFCON Einteilung (Grün und Blau sind getauscht) gebastelt.

Zuerst hatte ich als Gehirn der Schaltung einen Arduino Mini Pro verwendet. Da ich nur die 5V Version besitze und das Ganze mit einem kleinen Lithium-Akku betreiben wollte, brauchte ich auch noch einen Step-Up Wandler auf 5V. Die Billigdinger, die ich hier rumliegen habe, taugen aber leider nicht viel. Sie machen zwar, was sie sollen und es funktioniert auch, aber sie geben einen fiesen Pfeifton von sich. So kann die Ampel dann nicht auf dem Schreibtisch stehen.

Also habe ich mir eine andere Möglichkeit überlegt. Mein Hundeblinklicht habe ich auch von Arduino Mini Pro auf ATTiny85 gewechselt. So wollte ich es nun auch machen. Hab zwar nur noch einen ATTiny 45 hier liegen, der ist aber auch nicht viel anders als der 85er. Der ATTiny45 hat insgesamt 8 Pins. Zwei dienen der Spannungsversorgung und ein weiterer kann nicht so ohne weiteres als Aus- oder Eingang verwendet werden. Der RESET Pin. Den brauche ich, so wie er ist, zum Programmieren des ATTiny. Bleiben also noch 8 minus 3 also 5 Pins über. 3 LEDs und zwei Taster wären dann auf traditionelle Weise möglich. Das war mir bedeutend zu wenig. Immerhin hatte ich bereits 5 LEDs und 6 Taster in der ersten Version eingebaut.

Der ATTiny 45 sitzt unter den Tastern; vorne links zu sehen.

 

Über Spannungsteiler kann man unterschiedliche Spannungen am Analogeingang anlegen und im Code auswerten. Das erfordert zwar ein bisschen mehr externe Beschaltung, dafür ist die Anzahl der Taster dann nicht mehr begrenzt (praktisch wird es bei > 20 Tastern schon schwierig). Das Ganze erfordert dann auch nur noch einen Pin.

Stümperhaft bemalt, aber für einen Prototypen reicht es

Dann sind nun noch 4 Pins frei. 3 LEDs mit PWM sind mit Bordmitteln machbar oder ich verzichte auf PWM und habe dann 4 LEDs. Dennoch habe ich erst mal mit 3 LEDs und PWM angefangen. So hatten wenigstens alle 6 Taster eine Funktion.

Danach ist mir dann eingefallen, dass man LEDs antiparallel schalten kann. Einfach die Polarität tauschen und schon leuchtet die eine oder die andere LED. So wie bei Charlieplexing. In dem Fall musste ich mich dann aber vom integrierten PWM verabschieden. Mit Charlieplexing und PWM wären nur 4 LEDs möglich gewesen (beim ATTiny 45).

Schaltplan der Ampel

Statt die LED nun sanft ein und ausfaden zu lassen, blinken sie nun einfach. Mit zwei Tastern kann man die Blinkfrequenz verlangsamen oder beschleunigen. Mit übrigen zwei Tastern kann man nun das Tastverhältnis (Duty Cycle) zwischen An und Aus beeinflussen. Tja und wenn man nun die Blinkfrequenz ganz hoch setzt, hat man ein Software PWM 🙂 Ich könnte jetzt wieder das sanfte ein und ausfaden einbauen. Ich werd’s aber wohl lassen. Das Blinken und Blitzen hat auch was.

Hier der Code, den ich mit der Arduino IDE geschrieben habe. Wenn ich die Funktion analogRead(x) nun noch ersetzen kann, ist der Code auch mit anderen IDEs kompelierbar.

 

 

Hundeblinklicht Version 6

Mit dem Programm für das Blinklicht bin ich soweit zufrieden. Das Gehäuse lässt aber weiterhin Platz für Verbesserungen. Vor allem die Größe soll reduziert werden. Dies ist mir über die verscheidenen Versionen auch schon sehr gut gelaungen. Gerade der Sprung vom Arduino Mino Pro zum ATtiny und verkleinertem Akku hat das Gehäuse sehr schrumpfen lassen.

Hundeblinklicht
Altes Gehäuse mit dem Arduino Mini und großem Akku.

Zuerst hatte ich einen Arduino Mini Pro als Hirn für das Blinklicht benutzt. Der Arduino war überdimensioniert für die einfache Blinkaufgabe und hat auch zu viel Energie verbraucht.

Hundeblinklicht
Hundeblinklicht mit ATtiny und großem Akku.

Ein kleiner ATtiny ist völlig ausreichend und lässt das Gehäuse als auch den Stromverbauch kleiner werden.

Hundeblinklicht
Dies ist die Version, die gerade im Feld getestet wird.

Durch den verkleinerten Stromverbraucht konnte auch der Akku stark verkleinert werden. Ich verwende nun einen 3,7V 110 mAH Lithium Akku. Im Blinkbetrieb hat dieser Akku ca 12 Stunden durchgehalten.

Hundeblinklicht im Größenvergleich
Hundeblinklicht im Größenvergleich

Viel kleiner bekomme ich das Gehäuse nun nicht mehr. Der hintere schmale Teil wird vom Akku ausgefüllt und vorne sitzen der ATiny mit den ganzen Kablen und auch der Taster.

Jetzt muss ich mir immer noch eine gute Möglichkeit einfallen lassen, das Gehäuse bequem am Hundegeschirr zu befestigen. Bisher klebe ich den Blinki einfach mit Tesafilm an oder klette ein Klettband herum.

Für mich hilfreiche Links zum ATtiny

Ich benutze gerne den Arduino in seinen verschiedenen Formen. Alle Anschlüsse sind leicht erreichbar (steckbar) und die Programmierung mit der Arduino IDE ist für gewöhnlich auch ein Kinderspiel. Der Nachteil ist, dass so ein Arduino, auch in den kleinen Varianten, immer noch recht groß ist und auch viel Strom verbraucht. Also musste mal was Neues her. Am besten sollte es auch noch weitest gehend kompatibel mit dem Arduino sein. Da bin ich dann auch den ATtiny gestoßen. Immerhin werden auf dem Arduino auch die Chips von Atmel verbaut. Nur diesmal sollte es eben ein ATtiny statt des ATmega sein.

Den ATtiny gibt es in verschiedenen Ausführungen. Ich habe mir zum Testen einen ATtiny12, ATtiny45 und ATtiny85 besorgt. Jeweils in der Duchsteckversion mit 8 Beinchen. Von Außen sind alle Versionen gleich. Nur im Innern ergeben sich kleine Unterschiede. So hat beispielsweise der ATiny85 drei PWM Ausgänge und der ATtiny 45 nur 2.

Für mein Hundeblinklicht ist es wichtig, dass die Elektronik sparsam mit der Energie umgeht. Zusätzlich habe ich noch nach einer einfachen Möglichkeit gesucht, die Elektronik mit einem einfachen Taster statt eines Schalter abzuschalten. Der ATtiny funktioniert auch ohne Spannungsstabilisierung. 1,8 V bis 5,5 V Betriebsspannung benötigt der kleine Chip. Ideal für einen 3,7 V Lithium-Akku, dessen Spannung von 4,2 V bis ca 3,6 V geht.

Ich fassen einmal kurz meine erreichten Vorteile des ATtiny gegenüber des Arduinos auf.

  • Einsparung des Schalters zum Abschalten der Elektronik
  • Wegfallen des DC-DC Spannungswandlers von 3,7 V auf 5 V
  • ATtiny ist bedeutend kleiner als ein ganzes Arduino Mini Bord
  • ATtiny ist günstiger
  • ATtiny ist stromsparender

 

Unten: Gehäuse mit Arduino Mini, Oben: ATtiny Das aktuelle Gehäuse ist sogar noch einmal etwas kleiner geworden.

Die Größeneinsparung ist schon enorm. Aber auch die Kosteneinsparung ist sehr gut. So ein Arduino Mini (Klon) kostet ca. 8 Euro, vielleicht auch nur 5 Euro. Der ATtiny nur um die 1 Euro. Kostenintensiv ist auch der DC-DC Wandler. Der von mir verwendete Pololu Wandler kostet um die 4 US$. Der eingesparte Schalter kostet nur ein par Cent. Aber man spart auch noch Platz im Gehäuse 🙂

Nun ist der ATtiny da. Wie soll der nun programmiert werden. Ein dafür geeigneten „Flasher“ habe ich mir nicht gekauft. Mit einem Arduino soll das Ganze auch funktionieren. Also mal kurz rumgesucht und folgenden Link (neben anderen) gefunden: http://www.frag-duino.de/index.php/maker-faq/37-atmel-attiny-85-mit-arduino-arduinoisp-flashen-und-programmieren Dort wird beschrieben, was man machen muss, damit man mit Hilfe eines Arduinos den kleinen ATtiny mit Daten füttern kann. Zuerst hatte ich es mit einem Arduino Leonardo versucht, aber damit klappte es nicht. Mit einem Arduino Mega funktionierte es dann.

Danach habe ich nach einer Möglichkeit gesucht, den ATtiny in einen Energiesparmodus zu versetzten. Auch hier gibt es diverse Programmbeispiele. Angefangen habe ich mit diesem hier: http://www.arduino-hausautomation.de/2014/emils-ampel-attiny45-im-tiefschlaf/ Eine kleine Ampel wird per Knopfdruck eingeschaltet. Nach einer bestimmten Zeit wird der ATtiny wieder schlafen geschickt. Den dort abgebildeten Code musste ich noch ein bisshen anpassen, damit der ATtiny per Knopfdruck aufgeweckt und auch wieder schlafen geschickt werden kann.

 

 

Pinbelegung ATTiny
Pinbelegung ATtiny 45 – Seite 2

Mega      Duem
D53       Reset (SS)
D51       D11 (MOSI)
D50       D12 (MISO)
D52       D13 (SCK)
Gnd       Gnd
+5         +5

Auch dieser Link war hilfreich: http://playground.boxtec.ch/doku.php/arduino/attiny Hier werden ein paar der ATtiny Typen verglichen.

 

Um den Code auf den jetzigen Stand zu bringen, musste ich einiges lesen. Auch das anfangs kryptisch wirkende Datenblatt des ATtiny hat sich mir ein wenig geöffnet. Hier ist noch ein Quellcode zu finden, in dem die Verwendung der Register ausführlich beschrieben ist: http://matt16060936.blogspot.de/2012/04/attiny-pwm.html
Zu guter Letzt habe ich mich noch mit den Interrupts auseinander gesetzt. http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

Meine Methode „lauflicht()“ ist so gestaltet, dass die ohne die Funktion delay auskommt. So war es möglich, schnell auf einen Tastendruck zu reagieren. Bei Verwendung von delay hätte der Taster während des delays nicht reagiert. Mittlerweile müsste ich soweit sein, dass ich den Taster komplett als Interrupt definiere. Dann müsste der ATtiny auch während der Wartephase reagieren. Das probiere ich später noch mal aus.

Hundeblinklicht V5 – Nachtrag

Im letzten Code gab es ein paar Unstimmigkeiten. Beim Testen habe ich festgestellt, dass durch die Schaltung selbst im Power Down Modus immer noch etwas über 1 mA fließt. Der Grund dafür war ganz einfach. Statt in den Power Down Modus zu gehen, wurden einfach nur die LEDs ausgeschaltet. Von Außen macht das keinen Unterschied, aber der Stromverbraucht ist schon enorm unterschiedlich.

Den Code habe ich nun etwas geändert. Leider funktioniert mein Code nun nicht mehr mit dem ATTiny45. Statt dessen habe ich nun den ATTiny85 eingebaut. Der Stromverbrauch im Power Down Modus liegt nun bei 0,1 µA. Diesen Wert zeigt jedenfalls mein Messgerät an.

Die Stromsparfunktion müsste eigentlich auch mit dem ATTiny45 funktionieren. Vielleicht finde ich noch heraus, was da schief läuft.

Hundeblinklicht, Version 5 – es wird Tiny

Der kleine Arduino, den ich bisher in den Hundeblinklichtern verbaut habe, war einfach zu groß und auch zu teuer. Ein kleiner ATTiny45 reicht für das bisschen Blinken völlig aus. Man könnte die Funktion natürlich auch als diskrete Schaltung aufbauen. Nachteil ist nur, dass diese Schaltung mit meinen hier vorhandenen Bauteilen alles andere als stromsparend ist. Der kleine ATTiny hingegen ist im Betrieb schon stromsparend und kann sogar noch in einen Schlafmodus versetzt werden. Somit erspare ich mir einen Schalter, mit dem ich die Stromzufuhr unterbechen muss. Der bereits vorhandene Taster schaltet nun zwischen den verschiedenen Modi durch. 1. Blinkmodus mit sehr hellen Blinkimpulsen. 2. Dauerlicht, das nicht ganz so hell ist, damit es nicht blendet. 3. Aus: der ATTiny wird in den Schlafmodus versetzt. Im Schlafmodus soll der Stromverbrauch so gering sein, so dass der verwendete Akku sehr lange hält. Laut dieser Seite http://www.mikrocontroller.net/articles/Sleep_Mode#Power_Down_Mode fließen nur um die 0,3 µA. Mein Messgerät zeigt in diesem Modus allerdings immer noch 1 mA an. Leider bin ich mir auch nicht so ganz sicher, ob ich den ATTiny richtig programmiert habe. Die Funktion für den Schlafmodus (Methode goToSleep)habe ich aus dieser Seite entnommen: http://www.arduino-hausautomation.de/2014/emils-ampel-attiny45-im-tiefschlaf
Vielleicht mache ich da was falsch. Viel Ahnung habe ich noch nicht.

Blinklicht für Hunde
Links Version 4, Rechts Version 5

 

 

Blinklicht für Hunde
Links Version 4, Rechts Version 5

Ich bin aber schon mal froh, dass der Schalter nun weg ist. Dieser war schwierig vor Wasser zu schützen.

Blinklicht für Hunde
Dank des neuen Innenlebens ist die neue Version um einiges kleiner geworden

Der Tester liegt im Innern des Gehäuses und kann duch Eindrücken des Gehäusedeckels (0,4 mm dickes Nylon) betätigt werden.

Blinklicht für Hunde
Hundeblinklicht, vorne: neue Version

Die seitlichen Arme habe ich nun auch wieder durch einen fertigen Schlauch ersetzt. Viel stabiler und transparenter. Es sind noch Pins am ATTiny frei. Da könnte ich noch eine Akkuanzeige einbauen. Wenn die Spannung des Akkus auf einen bestimmten Wert absinkt, fängt eine rote LED an zu blinken.