Guide til livagtigt lys i modelhuse.
Vi kender det alle - os der bygger modeltog. En pære eller en
lysdiode ind i en bygning og så er der lys.
Men når der nu kræses om alt andet, skal der så ikke kræses for lyset i husene?
Man kan jo kigge hos TAMS elektronik, der sælger en række "byggeklodser" kaldet "Light Computer", her er LC-11 "Belebtes Haus" ganske interessant, for den kan simulere lyset i et hus. Men så er det også at nærigheden kommer op i en, for 10€ for et byggesæt er også en slags penge, hvis der skal et sæt i hvert hus. Bevares, jeg har da set nogle sætte en LC-11 op til at trække relæer og så 5-6 ledere rundt til hvert hus, men her er jeg for magelig.
Så var det at jeg på Stummiforum faldet over et indlæg af en fyr der havde bygget sin egen "LC-11 klon", vel at mærke i en simpel udgave. Herberts side fortæller lidt om det, men går ikke i dybden med, hvordan man kommer i gang - og så er den på tysk - et sprog ikke alle danske modebanetosser forstår, så jeg vil lave min danske pendant.
Herbert har fået ideen at bruge ATtiny45 til opgaven, en ret god ide, for den kan trække 40mA per udgang, hvilket er ganske rigeligt til at forsyne en lysdiode. Her er LC-11 bygget op over en PIC processor, som skal bruge et forstærkertrin for at kunne slæbe en smule strøm. Så alt der behøves er en stabil 5 volts forsyning, en ATtiny45 og en håndfuld modstande og lysdioder.
For at kunne bruge en
ATtiny45 til styring af lys i en modelhus (eller andet), skal kredsen
programmeres.
Til dette formål kræves et stykke programmeringshardware, i beskrivelsen her
bruges der et Arduino Uno
AVR forsøgs system som hardware. Der kan også bruges Atmels egen AVRISP
programmeringshardware.
Følgende komponenter skal bruges :
1:
En PC med software
til Arduino:
2: Et "forsøgskort" eller en løs IC
sokkel (i beskrivelsen her bruges der et "forsøgskort").
3: En ATtiny processor, type 25 , 45
eller 85, alt efter eget ønske og programmets størrelse.
Først skal Arduino sættes op som ISP programmer, læs mere her.
Derefter skal der puttes en bootloader i ATtiny processoren, læs mere her.
Er de 2 ovenstående allerede på plads, så fortsætter du bare herunder.
Programmer til et levende hus.
(så skal vi i gang med at programmere!)
Herbert har sådan set lavet et fint program med flimrende tv. Er det hvad man ønsker er der ingen grund til at læse videre, tag blot hans program og brug det.
Dem der kender mig ved at jeg er svær at stille tilfreds, så jeg skulle selvfølgelig til at rode med det selv. Jeg har aldrig programmeret til processorer før, så alt hvad der er skrevet her, er kommet i løbet af 24 timer efter jeg fik min Arduino. Det gode ved at vælge Arduino/Atmel processorer er at de er så gamle at "alt er opfundet", jeg opfordrer til at man "stjæler med arme og ben", når man skal søge inspiration til sine egne programmer. At bruge Arduino som programmer til ATtiny processoren, gør også at man kan starte med at skrive programmet til processoren på Arduino boardet mens man udvikler (og tester), for herefter kun at lave få ændringer og så passer det i ATtiny processoren. Brug Arduino ved at gå ind i "Værktøjer" - "Kort" og vælg "Arduino Uno".
Mine ønsker var 5 udgange der skifter med variabel tid, eller i det mindste i variable tider indenfor nogle grænser jeg sætter op. For at gøre det simpelt startede jeg ud med at lave et program der tændte og slukkede for en udgang.
Programmet er som følger (hent der ved at klikke her):
/* Enkelt blinkende diode med tilfældigt interval Tænder og slukker en enkelt lysdiode koblet til ben 13 på Audiono Uno Tider for lysdiode tændt og slukket vælges tilfældigt i tidsrummet mellem de 2 variabler "interval1min" og "interval1max". Alle tider er i milliSekunder For at kunne se, hvor længe tiderne der vælges tilfældigt er, sendes hver ny tid, via serielport tilbage til PC og kan ses med dette programs indbyggede seriel port monitor */ // Konstanter, informationer der aldrig ændrer sig // Fortæller hvilken udgang der bruges: const int led1Pin = 13; // nummeret på udgangen lysdioden er koblet til // Variabler som ændrer sig under gennemløb af program: int led1State = HIGH; // Status på udgangen, er den tændt (HIGH) eller slukket (LOW) long previousMillis1 = 0; // Tidspunkt for, hvornår udgangen sidst skiftede status long interval1min = 5000; // Korteste tidsinterval for lysdiode tændt eller slukket long interval1max = 15000; // Længste tidsinterval for lysdiode tændt eller slukket long interval1 = 1; // Aktuelt tidsinterval, som ændrer sig hver gang status på udgang skifter. void setup() { // Sætter udgangen til output: pinMode(led1Pin, OUTPUT); // Sætter serielport op til 9600 i baudrate (kun for debugging): Serial.begin(9600); } void loop() { // Ser efter om det er tid til at skifte status på udgangen // Gøres ved at se om forskellen mellem aktuel tid og tidspunktet // for sidste skift er større end det satte interval unsigned long currentMillis1 = millis(); if(currentMillis1 - previousMillis1 > interval1) { // gemmer sidste gang udgangen skiftede previousMillis1 = currentMillis1; // hvis udgangen er slukket tænde den og omvendt: if (led1State == LOW) led1State = HIGH; else led1State = LOW; // sætter udgangen med værdien af led1State (HIGH/LOW): digitalWrite(led1Pin, led1State); // sætter interval1 til en ny tilfældig værdi mellem min og mav interval1 = random(interval1min,interval1max); // sender det nye interval via serielport Serial.println(interval1); } }
Her er det slut på programmet. Det er ret simpelt, det får en lysdiode koblet til ben 13 på Arduino til at tænde og slukke med et tidsinterval på mellem 5 og 15 sekunder (interval1min og interval1max), samt sende næste tidsværdi tilbage til PC (kan i Arduino programmet ses med: Værkstøjer - Seriel Overvågning).
Når først man har et program der kan tænde og slukke en enkelt lysdiode, så er det ikke voldsomt svært at lave et program der kan gøre det samme med 5 lysdioder (hent det ved at klikke her), det er blot at udvide med samme setup og runtiner til 5 udgange i stedet for en. Programmet for 5 udgange (stadig skrevet til Arduino og ikke direkte til ATtiny, som vi ønsker at bruge), sender nu også et tal der angiver, hvilken udgang der skifter.
Nu er der jo ingen grund til at alle 5 udgange kører med samme tidsinterval (som de er i mit eksempel), er udgang 1 en travl trappeopgang, så sætter man inteval1min til 2000 (sekunder) og interval1max til 4000 (4 sekunder). Nu vil der være en livlig trafik i trappeopgange, hvor lyset er tændt i et sted mellem 2 og 4 sekunder og slukket i 2-4 sekunder.
Man kan selvfølgelig drive det endnu videre og have intervaller for tid tændt og tid slukket, blot ved at tilføje lidt ekstra og flytte en rutine, se selv forskellen til ovenstående eksempel.
long interval1onmin = 5000; // Korteste tidsinterval for lysdiode er tændt long interval1onmax = 15000; // Længste tidsinterval for lysdiode er tændt
long interval1offmin = 5000; // Korteste tidsinterval for lysdiode er slukket long interval1offmax = 15000; // Længste tidsinterval for lysdiode er slukket
if(currentMillis1 - previousMillis1 > interval1) { // gemmer sidste gang udgangen skiftede previousMillis1 = currentMillis1; // hvis udgangen er slukket tænde den og omvendt: if (led1State == LOW) led1State = HIGH; // sætter interval1 til en ny tilfældig værdi mellem min og max interval1 = random(interval1onmin,interval1onmax); else led1State = LOW; // sætter interval1 til en ny tilfældig værdi mellem min og max interval1 = random(interval1offmin,interval1offmax); // sætter udgangen med værdien af led1State (HIGH/LOW): digitalWrite(led1Pin, led1State);
Når ellers programmet er på plads og teste i Arduino, skal der
laves få tilrettelser. Alt omkring "serial" fjernet, det kan en ATtiny nemlig
ikke og så skal der ændres i led pin, som ikke længere er 13 til 9, men 4 til og
med 0.
For at programmere til ATtiny, så skal man ind i "Værktøjer" - "Kort" og vælge
"ATtiny45" (eller den der svarer til den processor man vil bruge).
For at programmere selve kredsen, skal man først sætte Arduino op til at være
ISP programmer (læs her)
Derefter placeres den lille ATtiny processor i sin programmeringssokkel og er nu
klar til at modtage sit program (find en kopi af
mit program her)
Alt der er tilbage er at lave et lille stykke print med en IC sokkel, forbindelse til 5 volt og GND, samt mulighed for at forbinde op til 5 lysdioder (med passende formodstand), diagrammet er her:
Kommentarer
tips og tricks,modtages gerne !! |
Designet
af Moppe |