Mini Solar Projekt mit ATtiny25/45/85
Gerade baue ich einen RC Crawler und hin und wieder kommen mir Ideen, was
man da noch umsetzen könnte. Die meisten Ideen verwerfe ich, nur wenige
verbleiben bei mir als Notiz in OneNote.
Zum Schluss gibt es dann doch meistens zu viele Gründe, warum ich eine Idee
nicht mehr weiter verfolge. Das fängt häufig damit an, das ich nicht die
passenden Teile habe oder ich will die fehlenden Komponenten nicht
bestellen.
Heute konzentrierte ich mich auf die Teile, die ich da habe. In meinem
Sortierschrank befinden sich zahlreiche Komponenten mit denen sich etwas
anfangen lässt. Allerdings meine ich, wenn ich von Basteln spreche, eher
etwas auszuprobieren oder sich damit auseinandersetzen und dann ein Beispiel
darüber zu schreiben. Diesmal soll es ein fertiges Teil sein, dass einfach
zu modden ist.
Benötigt wird:
- Solar Platte 40mm x 40mm, 2V, 40mA
- 5 LEDs (Idealerweise Rot, wegen der Erforderlichen Spannung)
- ATtiny 45 oder 85
- 5 x 10 Ohm Widerstände
Zielbeschreibung
Mit der Solar Zelle soll ein ATtiny 45/85 betrieben werden, dass mit 1MHz
läuft. Die 5 LEDs sollen einen Dezimal Wert in Binär abbilden, der hier
einfach hochgezählt wird bis 32. Wenn die 32 erreicht wurde, sollen alle
LEDs nacheinander ausgeschaltet werden, anschließen hinter einander wieder
an und dann wieder hintereinander aus.
Schaltung
Kommen wir zur Schaltung, die eigentlich für keine stabile Spannung
ausgelegt sein kann. Die Solarplatte, die ich hier verwendet, erzeugt bei
Sonnenlicht etwas mehr als 2V und 40mA. Genug um den ATtiny mit 1,8V
Mindestspannung und mit 1MHz zu betreiben. Die Stromaufnahme von 300µA ist
so klein, dass sie zu anderen betreibbaren Komponenten kaum auffällt. Da
können glatt noch zwei LEDs mehr mit betrieben werden (naja, nicht glatt
20mA) oder 19 x Low Current LEDs. Die Low Current LEDs wollte ich als erstes
verwenden, jedoch ist das Licht zu schwach bei Sonnenlicht zu sehen. Die
normalen LEDs leuchten nicht mit ihrer Nennleistung, aber sie sind dennoch
deutlich heller.
Nun hatte ich zu den benötigten Teilen 5 LEDs genannt und in der Anforderung
sollten sogar alle 5 zum Leuchten gebracht werden. Nun direkt werden nicht
alle an sein. Durch die Programmierung werden die LEDs im Schnell-Wechsel
durchgeschaltet, so das für uns alle LEDs scheinbar an sind. Vielleicht kann
man das leichte Flimmern (Ähnlich wie bei PWM Betrieb) sehen, aber dafür
leuchten mehr, als eigentlich die Solar Platte an Strom her geben kann.
Alle Lampen mit geringen Stromverbrauch
Der Wechsel wird durch eine Methode verwaltet, die die einzuschaltenden Ausgänge steuert.
void LightControllerShow() {
if(mCurrentLED < 4)
mCurrentLED++;
else
mCurrentLED = 0;
for(int i = 0; i < 5; i++) {
if(mCurrentLED == i && mLightsOn[i] == true)
digitalWrite(i, HIGH);
else
digitalWrite(i, LOW);
}
}
Das Beispiel weist mehr Aufwand auf, als bei einem üblichen Programmablauf,
bei dem die Ausgänge alle wirklich durchgeschaltet sind. Dafür wird nur noch
ein Fünftel des Stroms benötigt.
Testlauf
Auch wenn später der ATtiny mit nur 1 MHz läuft, können wir dies testweise
mit einem Arduino prüfen. Die Kamera ist mit einer schnellen Verschlusszeit eingestellt, deshalb wird der Schaltvorgang als Flimmern war genommen im folgendem Clip.
Zielgerade
Kommen wir zu dem eigentliche Programm. Wie bereits in der Anforderungen beschrieben, soll bis 32 gezählt werden. Der Wert wird wiederum Binär auf die 5 LEDs ausgegeben. Kommen wir zum nächsten Codeabschnitt.
bool mLightsOn[5];
int mLastTime = 0, mCurrentLED = 0, mVal = 0;
void setup() { for(int i = 0; i < 5; i++) { pinMode(i, OUTPUT); mLightsOn[i] = false; } }
void loop() {
LightControllerShow();
int currentTime = millis();
if(currentTime - mLastTime > 1000) { mLastTime = currentTime; Next(); }
}
void Next() {
if(mVal > 32) { mVal = 0; RunLight(); } else { mVal++; }
DecimalToBinar(mVal);
}
void DecimalToBinar(int val) {
int bin = 16, index = 0;
SetOnTo(-1);
while(true) {
if(val >= bin) { mLightsOn[index] = true; val -= bin; }
else { mLightsOn[index] = false; }
index++; bin /= 2;
if(val <= 0 || index > 4 || bin == 0) { break; }
}
}
void RunLight() {
int iteration = 0,lastTime = 0, lightOn = 0;
bool up = true;
SetOnTo(lightOn);
while(true) {
if(iteration > 10) { break; }
LightControllerShow();
int currentTime = millis();
if(currentTime - lastTime > 200) {
lastTime = currentTime;
if(up) { lightOn++; } else { lightOn--; }
if(lightOn >= 5) { up = false; lightOn = 4; }
if(lightOn < 0) { up = true; lightOn = 0; iteration++; }
SetOnTo(lightOn);
}
}
}
void SetOnTo(int indexLight){
for(int i = 0; i < 5; i++) { mLightsOn[i] = false; }
if(indexLight < 0) { return; }
mLightsOn[indexLight] = true;
}
void LightControllerShow() {
if(mCurrentLED < 4) { mCurrentLED++; }
else { mCurrentLED = 0; }
for(int i = 0; i < 5; i++) {
if(mCurrentLED == i && mLightsOn[i] == true) { digitalWrite(i, HIGH); }
else { digitalWrite(i, LOW); }
}
}
Ab auf den ATtiny
Der ATtiny 45 erfüllt die Anforderung. Ob nun ein ATTiny25 geht, konnte ich
wegen fehlendem Bestand nicht prüfen.
Nun sollte der Arduino IDE im Board Manager die Unterstützung für ATtiny
haben. Falls nicht, dann solltet ihr in: File -> Preference und dann in
'Additional Boards Manager URLs:' diesen Link eintragen:
Für mehr Detail zu ATtiny und Arduino kann ich diese Seite empfehlen:
Programming an ATtiny with Arduino
Arduino UNO als ISP verwenden
Der Arduino kann einen ATtiny mit dem Ziel Code beschreiben. Dazu muss der Arduino mit dem Code für ISP beschrieben werden. Die sollte unter den Beispiel Programmcode hinterlegt sein.
Auswählen und dann auf den Arduino.
Ziel Einstellung
Board: ATtiny25/45/85
Processor: ATtiny45
Clock: Internal 1 MHz
Bevor der Code geladen wird, muss der Bootloader auf den ATtiny. Wie bereits
im letzten Bild zu sehen, kann über den letzten Eintrag 'Burn Bootloader'
der ATtiny gebracht werden.
Nun kann der Sketch auf den ATtiny geschrieben werden und anschließend in
die Schaltung eingebracht werden.
Fertig
Nun brauchen wir etwas Sonnenlicht, um das Ergebnis zu prüfen. Je nach
Sonnenschein kann auch indirekt die Solar Platte Energie erzeugen. Auf dem
Hinterhof konnte selbst im Schatten genügend Energie erzeugt werden, dass
die Schaltung anlief.
Was nun?
Statt auf dem Breadboard die Schaltung weiter laufen zu lassen, kann man
daraus etwas geschlossenes bauen. In meinem Fall habe ich daraus ein
Gepäckstück für mein RC Modell gebaut, so dass halt nicht nur das Aussehen
einer So
larplatte erfüllt, sondern
auch etwas Funktion zeigt.
Source
Alles über die Sourcen zum Thema ATtiny25/45/85:
Highlowtech - Programming an ATtiny with Arduino
Und Natürlich:
Kommentare