Lysstyring med Arduino 2

I første afsnit fortalte jeg lidt om de betratninger, der har været årsag til, at jeg har besluttet at bruge en Arduino til at styre belysning på min modelbane.

Men nu er det nok på tide at komme rigtigt i gang, så i dette indlæg vil jeg fortælle, hvordan man rent faktisk får noget til at lyse ved hjælp af en Arduino. For at lege med, skal du have en Arduino og måske forskelligt andet tilbehør - men det vil jeg ikke komme nærmere ind på her. Jeg forudsætter, at læseren har anskaffet det nødvendige og installeret udviklingsmiljøet til Arduinoen; hvis ikke - og hvis det driller - kan man finde hjælp et utal af steder på nettet, og man kan naturligvis også spørge her på Sporskiftet.

I Arduino-miljøet er der en vis angst for at kalde et program for et program - det lyder nok alt for teknisk til nogle, så derfor taler man i stedet om en sketch (selv i den danske udgave) og samlingen af programmer på harddisken for sketchbook. Det engelske udtryk kan bedst oversættes med skitse og skitsebog - men i denne forbindelse betyder det altså program. Har man prøvet at programmere før, ved man, at det første program, man skriver i ethvert nyt programmeringssprog, man vil lære, normalt vil skrive "Hello world!" på skærmen, i et vindue eller noget lignende; men en Arduino kan som udgangspunkt slet ikke skrive - og så må man jo finde på noget andet.

Det første program

Dette "andet" er programmet blink, der får en lysdiode til at blinke. For at prøve det af, skal man blot have en Arduino og det nødvendige software - lysdioden, man bruger til dette første program, er loddet fast direkte på Arduinoen, så man behøver ikke anden hardware:

Billede

Man skal først forbinde sin Arduino til computeren med et USB kabel; det er ikke nødvendigt med en strømforsyning - Arduinoen får strøm direkte fra computeren via kablet. Når den er forbundet og de nødvendige drivere indlæst, skal man finde ud af, hvilken COM port, den kører på. Teknikken til dette varierer fra computer til computer, men på nyere Windows-versioner skal man ind i Device Manager (Enhedsstyring) for at finde det:

 Billede

I dette tilfælde sidder Arduinoen på COM11, så det skal man fortælle udviklingsmiljøet:

Billede

Man skal også fortælle, hvilken Arduino man har:

Billede

Så er man klar til at åbne programmet:

Billede

Når det er åbnet, ser det sådan ud;

Billede

Programmet skal ikke ændres, så det eneste, man skal gøre, er at compile det og uploade det til Arduinoen. Det gøres med et enkelt klik med musen på knappen markeret med rødt:

Billede

og hvis alt går godt, har man efter kort tid følgende skærmbillede:

Billede

Nået så langt skulle lysdioden på Arduinoen gerne være begyndt at blinke. Tillykke: Du har compilet og uploadet dit første Arduino program!

Programmet er lagret i Arduinoen, og vil nu blive kørt automatisk, hver gang man tænder for den. Træk USB stikket ud og sæt det i igen - lysdioden skulle gerne begynde at blinke igen. Prøv eventuelt at trække USB kablet ud og sæt strøm til Arduinoen på anden hvis - med en ekstern strømforsyning eller et batteri - lysdioden vil fortsat blinke lystigt.

Prøv at ændre blinkfrekvens ved at rette i disse linier i programmet: Delay(1000) betyder "vent 1000 millisekunder" - det er det samme som 1 sekund, så prøv at fordoble eller halvere blinkfrekvensen, og upload så programmet igen.

Eksterne komponenter

Når glæden over at have lavet det første program har lagt sig, vil man naturligvis gerne forbinde nogle eksterne komponenter til Arduinoen - ellers kan man jo ikke rigtigt bruge den til noget i praksis. Her kan det være smart at bruge et breadboard, som man vil have, hvis man har købt et begyndersæt:

Billede

Her er der sat en ekstern lysdiode på, og den er forbundet til digital port 9 - normalt omtalt som D9. Vi kan bruge det samme program som før, det er kun nødvendigt at rette den variabel, der fortæller hvilken port, lysdioden er forbundet til:

// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;

Ret værdien fra 13 til 9, send programmet til Arduinoen - og nu skulle det gerne være den eksterne lysdiode, der blinker. Prøv at skrive programmet om, så begge lysdioder blinker.

Flere porte

Den opmærksomme læser har nok allerede regnet ud, at der kun er 14 porte på Arduinoen - og det sætter en naturlig grænse for, hvor mange lysdioder, man kan sætte på. Det bliver ikke bedre af, at man også skal bruge nogle af portene til andre formål. Derfor har jeg besluttet at bruge et ekstra kredsløb til at styre dioderne, som jeg allerede fortalte om i første del. Her vil vi se nærmere på TLC5940 breakout boardet fra Sparkfun Eletronics.

Når man køber det, får man en næsten nøgen printplade:

Billede

TLC kredsløbet er den største af de sorte klodser på printet. Et board som dette kan styre 16 enheder, der kan være lysdioder, men også f.eks. servomotorer. TLC kredsen er egentligt lavet til at styre lysdioder i et fladskærms-TV, så det har en stribe funktioner, vi ikke har brug for; f.eks. kan man måle samtlige sine lysdioder med en farveanalysator, og så lægge en tabel ind i TLC kredsen, der automatisk korrigerer for farvedifferencer mellem dioderne. Meget brugbart på et TV - men ret meget overkill på en modelbane.

For at det skal være nemt at arbejde med, har jeg loddet stik på mine:

Billede

Til lysdioder behøver man kun to poler på hver udgang - men til servoer behøver man alle tre, så jeg har loddet tre poler på hver, selvom jeg nøjes med at bruge de to til lys. Det er de ni ben i venstre side af billedet mærket input, der skal forbindes til Arduinoen. Benene i højre side skal bruges, hvis man vil koble flere TLCer sammen. Det gøres nemt med en metode, man kalder daisy chaining - se billedet her:

Billede

Med to TLC koblet sammen på denne måde kan man styre 32 lysdioder - og da man kan koble op til 14 TLCer sammen, kan man på den måde styre op til 14 x 16 = 224 lysdioder. Udgangene på den TLC, der er nærmest Arduinoen - den til venstre på billedet - har numrene 0 - 15, mens udgangene på den næste bliver nummeret 16 højere - dvs. 16 - 31. Man skal ikke konfigurere noget, blot koble dem sammen, resten går af sig selv.

Arduinoen skal naturligvis kunne tale med TLC kredsløbet, og det sker gennem en seriel forbindelse. Normalt behøver man kun tre ledninger for at lave en sådan, men udviklerne af TLCen har af en eller andre grund lavet en løsning med hele ni forbindelser - ret specielt og i den høje ende, men til at leve med. For at styre TLCen fra Arduinoen skal man have en ret kompliceret kode, men den behøver man heldigvis ikke lave selv - andre har gjort arbejdet og lavet et library, så man skal blot installere dette og skrive en ret simpel kode selv. Man kan finde en introduktion på Arduinos Playground - som i næste omgang henviser til selve biblioteket, som man finder i Googles kodebibliotek. Biblioteket skal downloades og installeres på ens computer, men er så også klart til brug.

Herefter skal man forbinde sin Arduino til sit TLC board. På bibliotekets hjemmeside findes denne illustration:

Som det kan ses på denne illustration, har folkene bag biblioteket brug en almindelig TLC kreds i et stort DIL hus sammen med et breadboard. Tegningen viser dog næsten alt det, man har brug for - Gnd på Arduinoen skal forbindes til GND på TLC boardet, 5V til VCC, SCLK til SCLK og så fremdeles. Kun de to sidste ben på TLC boardet er ikke med - dem kan man finde en beskrivelse af på en anden af siderne om biblioteket: XERR skal ikke forbindes, og VPRG skal forbindes til Gnd. Med denne information kan man lave alle forbindelserne - med stik og kabel, ved at lodde ledninger direkte på, gennem et breadboard osv. Mulighederne er mange, så man bestemmer selv - når forbindelserne er på plads, er man - næsten - klar til at programmere.

Man skal dog nok forbinde en diode eller to til TLCen, så man kan se, at ens program rent faktisk virker. Jeg har loddet et stik på en rød 5 mm. diode, som jeg har sat på udgang nummer 5 på en TLC - det er derfor denne udgang, jeg koncentrerer mig om i de følgende eksempler. Husk, at dioden ikke skal have nogen modstand - TLCen har som tidligere omtalt en konstantstrømsgenerator i udgangen, så strømmen styres via software i stedet for hardware. Det er en af de store fordele ved denne løsning.

Dioden skal forbindes til de to ben, der er nærmest midten af printet - med minus nærmest midten og plus nærmest kanten. Benet helt ud mod kanten bruges ikke med lysdioder.

Programmering af TLC kredsen

Det første, man skal gøre for at bruge TLCen, er at fortælle programmet, at man vil bruge TLC biblioteket. Det gør man ved at skrive følgende kode i toppen af programmet:

#include "Tlc5940.h"

Når compileren ser denne kommando, ved den, at den skal hente koden ind i programmet, så man kan bruge den i sin egen kode. Herefter er det blot at programmere løs - i første omgang ved at følge de eksempler, man kan finde på nettet. Det er dog nok på plads at forklare lidt om arkitekturen i et Arduino program.

Der er to funktioner, der skal være tilstede i ethvert Arduino program: setup() og loop(). setup() bliver kørt een gang, når Arduinoen bliver startet - herefter kaldes funktionen loop(), der bliver ved med at køre i ring. Det sidste betyder altså, at Arduinoen udfører alle kommandoerne i loop() fra start til slut, og så starter igen forfra, lige så snart den sidste kommando er udført. Det virker ofte lidt mærkeligt for begyndere, men det er faktisk den måde, næsten alle computerprogrammer er lavet, når man går i dybden.

I forhold til TLC kredsen er det et krav, at man kalder funktionen Tlc.init() i sin setup() funktion:

void setup() { 
  Tlc.init();
}

I loop() kan man kalde Tlc.clear(), der nulstiller alle udgange. Herefter kan man tænde for lysdioden på udgang 5 med et kald som dette: Tlc.set(5, 4095). De to parametre i dette funktionskald er først nummeret på udgangen, og derefter den lysstyrke, man ønsker på dioden. Jeg har her brugt værdien 4095: Det betyder fuld styrke, da styrken skal angives med en præcision på 12 bit. Det betyder 212 = 4096 værdier, men da den første værdi er 0, bliver det i praksis en værdi med 0 som den mindste og 4095 som den største. Sætter man værdien til 2048, vil dioden lyse med halv styrke. Det er altså her, man styrer lysstyrken i stedet for at gøre det med en modstand - og det er ret smart, for det er meget lettere at justere lyset gennem software end ved at skulle lodde nye modstande på. Man vil også kunne lave styrepulte mm., hvor lyset i kontrollamperne kan reguleres op og ned i forhold til den omgivende belysning.

Når man ændrer værdi på en udgang, træder ændringen ikke i kraft med det samme: Først når man kalder Tlc.update() vil ændringerne træde i kraft. Det betyder, at man kan ændre værdi på alle 224 dioder stille og roligt - og så sætte ændringen i kraft med eet hug. Det betyder nok ikke så meget på en modelbane, men i et TV er det meget vigtigt.

Vores blinkprogram fra før kan altså skrives om på denne måde, så det tager hensyn til den nye hardware:

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
 
#include "Tlc5940.h"
 
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 5;
 
// the setup routine runs once when you press reset:
void setup() {                
  // initialize the TLC library.
  Tlc.init();
}
 
// the loop routine runs over and over again forever:
void loop() {
  Tlc.set(led, 4095);        // turn the LED on (HIGH is the voltage level)
  Tlc.update();
  delay(1000);               // wait for a second
  Tlc.set(led, 0);           // turn the LED off by making the voltage LOW
  Tlc.update();
  delay(1000);               // wait for a second
}

Resultatet kan ses på denne Youtube video:

__________________

MVH
Lars

Like 2 kan lide
Top