Arduino & treinen

afbeelding van Frank

De arduino is een microcontroller board. Een microcontroller verschilt van een microprocessor die in onze pc's zitten.
Een microcontroller bevat een microprocessor + geheugen + plaats voor een programma.
Een belangrijk verschil is ook dat een arduino geen operating systeem bevat en minder krachtig is dan de CPU (microprocessor) van onze PC.
De arduino bevat ook duidelijk minder geheugen: 32 Kb ipv 8,16 of zelfs 32 Gb ram in onze pc's.

De arduino is gemaakt in eerste instantie om met te experimenteren en eigen gemaakte of gekochte elektronica uitbreidingen aan te sluiten.
Eens je programma en de elektronica naar behoren werkt kan je het verkleinen tot één print en vermenigvuldigen en verkopen als product.

In dit eerste deel sluiten we aan bij een vorig artikel over LED's aansluiten en gaan we een led laten knipperen aan de hand van een arduino.
Het voordeel is dat de timer nu softwarematig werkt en we aan knippersnelheid, hoe we het laten knipperen of we morse zenden kunnen met de arduino.

Maar eerst bekijken we dus hoe we een LED laten knipperen.

Hiervoor hebben we een Arduino Uno nodig, een experimenteerbord, een weerstand ,een LED en best een set draadjes om alles met elkaar te verbinden.

Zolang we experimenteren en niet veel stroom gebruiken hebben we geen externe voeding nodig en kan alles gevoed wordenvanuit de USB waarmee de arduino verbonden is met de PC.

De opbouw van de elektronica ziet er als volgt uit:

Arduino led knipperen_0.png

Het zwarte draadje is de massa van de arduino en die verbinden we met de korte poot van de led (KNAP) Kathode = Negatief, Anode = positief én Korte poort = Negatief.
Het experimenteerbord heeft bovenaan en onderaan (buiten beeld) twee horizontale rijen pinnetjes die met elkaar verbonden zijn en vertikaal zijn de pinnetjes verbonden totaan de middellijn (net onder de weerstand).
Op deze wijze verbinden we de weerstand met de anode (lange poot) van de led. De andere kant van de weerstand verbinden we met een rode draad met aansluiting Digitaal 3~.
We moeten nu nog de editor downloaden waarmee we ons programma schrijven en kunnen uploaden naar de Arduino. De meesten zullen de Windows installer versie nodig hebben.

Dan kunnen we nu via het menu een nieuwe sketch (andere naam voor een programma voor een Arduino) maken via het menu -bestand - nieuw.

const byte LED = 3
void setup(){
pinMode(led, OUTPUT);
}
void loop(){
digitalWrite( LED, HIGH );
delay(1000);
digitalWrite(LED, LOW);
delay(1000);
}

Het programma zegt tegen de Arduino dat LED een waarde 3 heeft (dit is de nummer van de aansluiting) en dat dat niet kan wijzigen (const), de waarde valt tussen 0 en 255 dus kunnen we dit getal opslaan in een byte.
De setup() is een deel van het programma dat slechts één maal wordt uitgevoerd, bij het opstarten van de Arduino.
In de setup() vertellen we tegen de Arduino dat we de aansluiting (pin) 3 zullen gebruiken als uitvoer we zullen dus een stroomverbuiker zoals een LED kunnen aansluiten, dit gebeurd met het bevatl pinMode().
Wanneer de setup is uitgevoerd zal de arduino de commando's in de loop() blijven uitvoeren tot de spanning van de Arduino wordt afgezet.
Het eerste wat we doen is met het commando digitalWrite(), spanning op de led zetten (HIGH) zorgt daarvoor.
Dan wachten we 1000ms of 1 seconde hiervoor gebruiken we het commando delay().
Vervolgens nemen we de spanning op de pin van de LED weg met digitalWrite, LOW zorgt ervoor de dat spanning op 0V komt en we wachten opnieuw 1 seconde.
Hierna begint de Arduino terug met het eerste beval van de loop().

Weet jij nu wat je moet doen om de LED een halve seconde te laten branden en 1 seconde uit te laten?

Zou het niet leuk zijn dat de led niet plots aan en uit ging maar dat dit gelijkdelijk aan en uit gaat?
Dit kan, we zouden de spanning over de led kunnen wijzigen maar dat is eenvoudig omdat de spanning die over een led staat afhankelijk is van de kleur, helderheid en of het een felle of spaarzame led is.
Gelukkig is er een eenvoudigere oplossing en dit is PWM of Puls Wide Modulation.

Pwm_5steps.png
Afbeelding onder CC, bron: Wikimedia Commons: https://commons.wikimedia.org/wiki/File:Pwm_5steps.gif

Door PWM te gebruiken laten we de led een deeltje van de tijd licht geven, dat deeltje noemen we de "duty cycle" en deze variëert van 0% tot 100%.
Bij 0% geeft de led geen licht, dit is gelijk aan digitalWrite LOW, bij 100% geeft de led evenveel licht als we ze met digitalWrite op HIGH zouden plaatsen.
Elke digitale aansluiting op een Arduino die voorzien is van een tilde teken, ~, is geschikt voor PWM.
De arduino kent geen oneindig aantal mogelijke "duty cycles", het zijn waardes tussen 0 en 255 waarbij 0 staat voor 0% en 255 voor 100%.
De groene lijnen voemzn de frequentie waarmee de pulsen plaats vinden. In een Arduino Uno (de basis versie) is dit ongeveer 4900 tot 500Hz.
Dus als de duty cycle 50% is zal onze led 50% van de tijd branden "flikkeren" aan ongeveer 500Hz, voor het menselijke oog is dit niet merkbaar en zien we alleen dat de LED minder licht geeft.
We moeten nu enkel ons programma aanpassen zodat de led "langzaam" aan en uit gaat.

const byte LED = 3;
byte helderheid = 0;
byte vijf = 5;

void setup()  {
  pinMode(LED, OUTPUT);
}

void loop()  {
  analogWrite(LED, helderheid);    
  helderheid+=vijf;
  if (helderheid == 0 || helderheid == 255) {
    vijf = -vijf ;
  }     
  delay(50);                            
}

Ons elektrisch schema in ongewijzigd dus de led blijft aangesloten op pin 3.
We starten ons programma met de helderheid op 0, dus volledig uit.
We gaan de helderheid "duty cycle" wijzigen in stappen van 5, dit zijn geen percenten omdat 255 = 100% het is dus 1/51e of iets minder dan 2%.
De setup van ons programma is ongewijzigd we vertellen de Arduino dat pin 3 gebruikt wordt voor uitvoer, dat er dus een stroomverbruiker aan hangt.
De loop is wel gewijzigd.
Pin 3 is een digitale pin die geschikt is voor PWM (zie ~ teken naast de 3), wanneer we nu analogWrite gebruiken stellen we de duty cycle in. In dit geval op 0.
Vervolgens verhogen we de waarde van helderheid met de waarde die in de variabele vijf zit, dit is nu het getal 5.
De waarde van de variabele helderheid is dus nu 5.
We vragen ons vervolgens af of de helderheid 0 of 255 is, wat niet waar is dus het commande dat tussen de accolades { } staat wordt niet uitgevoerd.
Dan wachten we 50 milleseconden de de loop start opnieuw.
Wanneer de helderheid uiteindelijk 255 geworden is brand de LED de volledige tijd van de cuty cycle.
Dan zal de test  "helderheid == 0 || helderheid == 255" helderheid gelijk aan 0 of helderheid gelijk aan 255 is nu waar en wordt het commando tussen de accolades uitgevoerd.
De waarde van de variabele vijf wordt nu gelijk aan -5.
De optelling van de helderheid : helderheid+=vijf; wordt dus nu een aftrekking met -5.
De helderheid of de duty cycle neemt nu terug af tot deze 0 zal worden.
Dan zal de test  "helderheid == 0 || helderheid == 255" helderheid gelijk aan 0 of helderheid gelijk aan 255 is nu waar en wordt het commando tussen de accolades uitgevoerd.
De waarde van de variabele vijf wordt nu gelijk aan de 5 en de duty cycle zal terug toenemen.

Weet jij nu wat je moet doen om de LED als de duty cycle 0% of 100% de led 1 seconde aan of uit te laten?

Disclaimer van Aansprakelijkheid:
Het gebruik van alle schema's formules en alle installatie instructies, berekeningen die kunnen worden gevonden op deze site volg je op eigen risico. Alle formules, tabellen, berekeningen werden gecontroleerd, maar er is geen garantie dat ze foutvrij zijn. Alles is gemaakt voor eigen gebruik, en ik vind ze zeer nuttig. Daarom wil ik ze hierbij delen met andere modelspoorweg hobbyisten. Al de items en procedures zijn getest op mijn eigen modelbaan, zonder dat deze enige schade heeft veroorzaakt. Maar dit wil natuurlijk niet noodzakelijk zeggen dat alle schema's in elke omgeving of op elk systeem zal werken. Ik kan natuurlijk geen aansprakelijkheid aanvaarden voor wat ik niet zelf heb gebouwd of heb berekend. Gebruik dus altijd je eigen oordeel en gezond verstand!