Verkeersregeling met Arduino

Een tijdje geleden kwam ik tussen de online aangeboden microcontroller-gadgets en elektronica-modules een model verkeerslicht met drie grote LED's tegen. De module bestaat uit een rode, gele en groene LED inclusief hun noodzakelijke voorschakelweerstanden bijeen gebracht op een klein printplaatje. Na wat aanpassingen bleek het relatief eenvoudig met deze grappige printjes een werkende verkeersregeling voor twee rijrichtingen te maken. Het gebruik van een microcontroller ligt natuurlijk voor de hand, maar waarschijnlijk lenen de verkeerslichtjes zich ook uitstekend voor het aanschouwelijk maken van verkeersregelingen die uit klassieke discrete elektronica, of zelfs elektromechanisch, zijn opgebouwd.

Video : toestemming voor cookies nodig
Instellingen

Direct op de uitgangen van de microcontroller

De LED’s op het printje hebben een z.g. 'common kathode', dus er hoeft maar één gemeenschappelijke minpool te worden aangesloten. De productomschrijving geeft al aan dat de boards geschikt zouden moeten zijn voor 5 volt, dus in principe zouden ze direct door de digitale uitgangen van een microcontroller, zoals een Arduino of Raspberry Pi moeten kunnen worden aangestuurd.

Omdat ik me kon voorstellen dat ze met enkele aanpassingen ook wel geschikt zouden zijn voor gebruik op 9 volt, bestelde ik er later nog een paar bij. Achteraf bleek dat ik bij twee verschilende handelaren had besteld. Want, hoewel zowel de productbeschrijving als de titel "Mini 5mm LED DC 5V Traffic Light LED Display Module Board for Arduino Mini-Traffic Light for Traffic Light System Model" volledig overeen stemden, bleken de boards toch van elkaar te verschillen.

Mini-LED-Traffic-Lights
really-8-mm

Nog fraaier dan geadverteerd

Dat veel adverteerders online alle foto's en specificaties klakkeloos van elkaar overnemen, was me al eens eerder opgevallen. Vandaar dat ik blij was om vast te kunnen stellen dat de in de beschrijving genoemde 5 mm LEDs, de door mij al in de foto's herkende, 8 mm exemplaren bleken te zijn. Het is wonderlijk dat de handelaren dus zelf niet eens nameten (of begrijpen?) wat ze verkopen.
 
De printafmetingen van de twee types printplaatjes bleken redelijk overeen te komen, maar er waren wel enkele fysieke verschillen. Zo zijn van het model met de afgeronde hoeken, dat ik verderop ‘PCB 1’ zal noemen, de bevestigingsgaten echte z.g. via's met koper in het gat, terwijl dit bij het model met de hoekige printplaatvorm (‘PCB 2’) eenvoudige M3 boorgaten zijn.

Uit de specificaties van beide modules zou mogen worden opgemaakt dat ze allebei zijn ontworpen voor 5 volt. En de 'operating currents' voor de verschillende kleuren zijn voor beide boards precies eender werd gespecificeerd als: Red 13mA, Yellow 13mA, Green 25mA. Die laatste waarde leek me al vrij hoog want uit specificaties van 8 mm LEDs die ik online vond, bleek dat dergelijke groene 8 mm LEDs bij een operating voltage van 2,5 volt een nominale stroom van zo'n 20 mA zouden moeten trekken. En dan lijkt 25mA voor de groene LED op zich weer relatief veel. Immers, de maximale uitgangsstroom van een Arduino uitgang is dan wel 40mA, maar in de praktijk wordt echter 20mA aangehouden als een praktische limiet.

Testen op 5 volt

Ik probeerde de stoplichtjes dus eerst maar eens gewoon op 5 volt, ook omdat ik benieuwd was hoeveel stroom ze trokken en of de drie kleuren ongeveer dezelfde lichtsterkte hadden. Spoiler: dat hadden ze niet. Het eerste dat hierbij opvalt is dat de rode LED op beide modellen eigenlijk bijna te fel brandt. [klik op de tabel voor een uitvergroting]

PCBs-compared

Omdat ik geïnteresseerd was hoe (en óf) de lichtsterkte van de verschillende kleuren LED's was gebalanceerd, bestudeerde ik de waarden van de SMD voorschakelweerstanden op de printplaatjes.

Tot mijn onsteltenis moest ik vaststellen dat het ‘PCB 1’ printje een 0Ω SMD weerstand, feitelijk een doorverbinding dus, als voorschakelweerstand voor de groene LED heeft. Deze LED hangt aldus direct aan 5 volt en trekt meer dan 110 mA! Omdat de nominale spanning over een dergelijke LED’s slechts 2,4 volt bedraagt, zal deze LED waarschijnlijk geen enorm lang leven beschoren zijn. Als je hem direct vanuit een Arduino aanstuurt, zou het zelfs de vraag kunnen zijn wat er eerder sneuvelt: de betreffende uitgang van de Arduino of de LED! Ik besloot de belangrijkste verschillen eerst maar eens in kaart te brengen en kwam voor de twee modelletjes die ik ontving tot de volgende waarden zoals in de tabel hierboven.

De voorzichtige conclusie is dat het eerste model printplaat, met de 0Ω voorschakelweerstand voor de groene LED, in zijn huidige uitvoering niet erg bruikbaar is voor direct gebruik op een Arduino en/of 5 volt. Anderzijds is op dit board voor de gele LED een veel te grote voorschakelweerstand van 4K7Ω opgesoldeerd. Deze zal moeten worden aangepast als we deze LED iets zichtbaarder en feller willen laten branden en we de helderheid van de drie LEDs van dit kleine verkeerslichtje op 5 volt een beetje willen balanceren.

R-values

Wie geen SMD weerstanden wil gaan wisselen, raad ik aan dit mini verkeerslicht maar liever met enkele toegevoegde voorschakelweerstanden op een voedingsspanning van 9 volt te gebruiken. Zie hiervoor de volgende paragraaf.

Op het andere model pcb heeft de groene LED wél een (kleine, slechts 47Ω) voorschakelweerstand maar daar loopt er een te hoge stroom (~30mA) omdat er een te hoge spanning (~3,7 volt) over deze LED valt. Ook niet aan te raden dus dit board direct op 5 volt te gebruiken. Door het voorschakelen van aanvullende weerstanden zou het echter wel mogelijk zijn dit board bruikbaar te maken voor gebruik op 5 volt.

Op de afbeelding de SMD-serieweerstanden die ik aantrof op mijn verschillende printplaatjes, ik veronderstel dat deze simpelweg per bestelling, of productie-batch, kunnen verschillen! Eerst even controleren dus!

Aanvullende voorschakelweerstanden

Voordat ik nou meteen SMD weerstanden ging lossolderen en wisselen, leek het me zinvol om eens in kaart te brengen met welke extra voorschakelweerstanden de lichtsterkte van de drie kleuren wat meer in balans kon worden gebracht.

Op die manier zou immers ook het compleet ontbreken van een voorschakelweerstand op het board zelf kunnen worden opgelost. Proefondervindelijk bepaalde ik deze waarden voor zowel 5 volt, voor toepassing met microcontrollers, als 9 volt voor toekomstige schakelingen opgebouwd uit bijvoorbeelde meer concrete elektronica of fischertechnik modules. [klik op de tabel voor een uitvergroting]

Series-resistors

De gele LED heeft op ‘PCB 1' echter al een veel te hoge voorschakelweerstand en zal zonder desolderen en wijzigen van deze SMD weerstand altijd, ook op 5 volt, eigenlijk slecht zichtbaar blijven. Daar komt bij dat voor de groene LED duidelijk geen low-current exemplaar lijkt te zijn gebruikt. We zouden door het zelf opnemen van een serieweerstand van 150Ω de stroom door de groene LED tot onder de 20mA kunnen begrenzen. Maar dan brandt deze groene LED nog relatief zwak. Hierdoor lijkt het nog niet zo gemakkelijk, om binnen aanvaardbare stroomgrenzen, de lichtsterkte van deze kleur enigzins aan te lijnen aan de lichtsterkte van de rode ‘low-current’ LED van datzelfde verkeerslicht.

Op het andere board, ‘PCB 2’, is eigenlijk ook een vrij grote weerstandswaarde opgesoldeerd voor de gele LED, maar we zouden de lichtsterkte van deze LED als uitgangspunt kunnen nemen. Door voor de groene en rode LED een aanvullende voorschakelweerstand van 1KΩ op te nemen, zijn de helderheden van de drie kleuren min of meer in balans bij een voedingsspanning van 5 volt. De groene en rode LEDs zijn hier z.g. low-current types en de stroomsterkte is erg laag terwijl deze toch mooi helder branden.
 
Bij een voedingsspanning van 9 volt wordt de lichtsterkte van de gele LED op ‘PCB 1’ zelfs aanvaardbaar. Opname van een extra serieweerstand, zoals voor de groene en rode LED, is niet nodig voor dit board. Zie de waarden in de tabel voor weerstandswaarden waarbij ik zelf vond dat de lichtsterkte van de drie LEDs niet te veel uiteenloopt.

stadia

Omdat er dus kennelijk verschillen in helderheid en voorgemonteerde voorschakelweerstand van de verschillende LED-stoplichtjes zijn, leek het me daarom nuttig een klein printje te ontwerpen waarop de voorschakelweerstand- en helderheidsverschillen, afhankelijk van de toepassing, kunnen worden aangepast. Voor toekomstige projecten op 9 volt, leek het me handig als de 2,5mm fischertechnik stekkers direct op het printje zouden kunnen worden aangesloten.

De vierpolige Dupont connector voerde ik dubbel uit, zodat het verkeerslichtje in beide richtingen kan worden gebruikt. Het verkeerslicht board model 'PCB 2' leek me het meest bruikbaar. De gele LED behoefde dan geen aanvullende voorschakelweerstand en de helderheid van de andere twee LED kon hierop worden afgestemd. Ik liet ook direct een ‘riser-board’ maken waarmee het verkeerslichtje nog 6 centimeter kan worden verlengd.

Daarnaast ontwierp ik er een kleine behuizing met bevestigings-sleuven voor het fischertechnik systeem. Toen dat allemaal klaar was kon het experimenteren beginnen.

traffic-control-detail with-riser arduino-mega-pro-mini-case

Programmeren met AI

Voor de aansturing van de verkeerslichten, gebruikte ik een Arduino Mega Pro Mini. Om de opbouw van het experiment met het fischertechnik systeem te kunnen doen, was kwam een hiervoor ontworpen behuizing voor de Arduino goed van pas (zie meest rechtse foto hierboven).
 
Een 'verkeersregeling' voor één verkeerslicht bleek snel gemaakt. Het was een mooie test voor 'Duino Code Generator', die met behulp van Artificial Intelligence (AI) voorstellen voor Arduino software kan doen. Na ingave van de beschrijvende definitie "Generate a program to control 3 LEDs like a traffic light" werd een programma getoond dat zich zonder compileer-fouten in de door de mij voor dit project gebruikte Arduino liet uploaden. Na aansluiten van de drie stuursignalen voor de LED’s op de pinnen D2, D3 en D4 en het aansluiten van de gemeenschappelijke massa van het verkeerslichtje, bleek dit inderdaad een soort van verkeersregeling op te leveren. De drie LED’s van het mini verkeerslichtje kwamen in elk geval tot leven.

De LED’s werden afwisselend aangestuurd. De tijdsduur van elke stap was echter hardgecodeerd, en belangrijker, de sequentie klopte nog niet helemaal. Maar toch geeft een dergelijke jumpstart natuurlijk al een mooi beginpunt waarbij direct een werkend resultaat wordt bereikt dat daarna zelf eenvoudig aan te passen is.

Twee verkeersrichtingen

Na wat 'intellectueel finetunen' van de eerste automatisch gegenereerde software, probeerde ik hoe ver de AI Code Generator zou komen bij het aansturen van twee mini LED-verkeerslichtjes voor twee verschillende rijrichtingen. De input was deze keer "Generate a program to control two traffic light poles with 3 LEDs each for traffic control of two traffic directions".

Het resultaat was een eind in de goede richting, met het voorstel de drie aanvullende LED’s op de pinnen D5, D6 en D7 aan te sluiten. De software was echter weinig economisch geprogrammeerd. Zo was er er voor elke lamp een aparte functie opgenomen die alleen die lamp aanschakelt en de andere twee uitschakelt. Wat erger is, is dat de code syntactisch niet in orde was. De commando's voor het configureren van de Arduino pinModes voor de gebruikte output-pinnen veroorzaakte compilerfouten. Na het met de hand verplaatsen van dit stukje code binnen de hiervoor aangewezen setup() routine, kon het programma worden gecompileerd en geüpload. De regeling van de twee verkeerslichten moest echter daarna, net als bij het vorige voorbeeld, met de hand worden uitgebreid en gecorrigeerd.

Verschillende regelingen onder de knop...

De proof of concept was geslaagd. De bruikbaarheid van de kleine LED-verkeerslichtjes was aangetoond, maar de volgorde waarin de lampen achtereenvolgens oplichten en de timing daarvan lag nog volledig vast in de hoofdzakelijk automatisch gegenereerde software.
De cyclus waarin de gekleurde lampen elkaar afwisselen of tegelijk branden verschilt echter per land. In Nederland branden nooit twee lampen van een driekleurig verkeerslicht tegelijk. Hier springt het rode licht direct naar groen. In veel andere landen, zoals bijvoorbeeld Zweden, Groot-Brittannië, Oostenrijk of Duitsland, brandt voordat het rode licht op groen gaat eerst het oranje licht in combinatie met het rode licht ten teken dat het groene licht eraan komt en men alvast kan oprijden.

Bruikbaarder zou het zijn als de verkeersregeling zodanig configureerbaar zou zijn dat er verschillende regelingen met een druk op de knop konden worden opgeroepen. Ik besloot de software wat flexibeler en intelligenter op te bouwen en twee aanraakschakelaars voor de configuratie te gebruiken. Het idee was dat met de linker schakelaar zou moeten kunnen worden gekozen tussen de 'Nederlandse' en de 'Duitse' verkeersregeling, en dat de rechter schakelaar indien geactiveerd deze instelling zou overrulen met een eenvoudig knipperlicht-gedrag van het verkeerslicht. Het programma zou daarvoor, naast twee aanvullende ingangen scannen om de aanraakschalaars werkzaam te maken, het liefst de hele lampen-sequentie en timing er van in configureerbare arrays moeten opslaan.

Code genereren met AI

In de hoop snel een syntactisch correct basisprogramma te verkrijgen, probeerde ik de 'Duino Code Generator' met de zin "Generate a program to control two traffic light poles with 3 LEDs each for traffic control of two traffic directions. The lamp-sequence and timing must be configurable in an array of structs."

Het leverde een op zich complieerbaar programma op, dat helaas nogal onoverzichtelijk was. De noodzakelijke configuratie van de LED-pinnen was deze keer weliswaar correct in de setup() functie geplaatst, maar de 'structs' waren op verkeerslicht-niveau en bevatten daardoor slechts de drie parameters voor de drie lampen. De timing van de verschillende lampen was in arrays ondergebracht.
 
Mijn uitgangspunt was daarentegen een andere structuur waarbij elke individuele stap in de lichten-sequentie van een verkeersregeling in een struct is opgenomen. Op die manier kan er voor elke stap een tijdsduur en het wel of juist niet branden van elk van de zes lampen worden geconfigureerd per array element. Door een array van deze structuren te maken zou het dan mogelijk zijn heel flexibel verschillende ‘verkeersregelingen’ te configureren. Idealiter zou de definitie van een structuur van een ‘stap’ zoiets moeten zijn als de definitie van de struct lightsStep hieronder.

De boolean in deze struct geeft voor elke lamp met ‘true’ of ‘false’ aan of deze brandt of gedoofd is in deze stap of ‘state’. Met een array van deze structuren kunnen we vervolgens elke van de drie gewenste verkeersregelingen configureren als een array als hiernaast weergegeven.

Hierbij is trafficControl_nl het verkeersprogramma met een typisch Nederlandse lampensequentie. In het verkeersprogramma trafficControl_de zijn de tweede en vierde stap zodanig aangepast dat de gele lamp zich bij de rode voegt, voordat in de volgende stap de groene lamp brandt en voor de andere rijrichting het rode licht wordt ontstoken. trafficControl_blink tenslotte is een programma waarin de gele lampen afwisselend knipperen. Deze stand wordt vaak gebruikt als de verkeerslichten niet in bedrijf zijn.

In het uiteindelijke programma, of de video is te zien hoe, op basis van de gedefinieerde array’s, de verkeersprogramma’s tijdens het uitvoeren van het programma worden doorlopen.

// Define struct for traffic light sequence
struct LightsStep {
  int duration; // Time in ms for this step in the sequence
  bool red1;    // Red light 1
  bool yellow1; // Yellow light 1
  bool green1;  // Green light 1
  bool red2;    // Red light 2
  bool yellow2; // Yellow light 2
  bool green2;  // Green light 2
};

// Define array of structs for traffic light sequences
LightsStep trafficControl_nl[] = {
  { 5000, true, false, false, false, false, true }, // Red1 & Green2 are on...
  { 3000, true, false, false, false, true, false }, // Red1 stays, Green2 --> Yellow2...
  { 5000, false, false, true, true, false, false }, // Green1 & Red2 are on...
  { 3000, false, true, false, true, false, false }  // Green1-->Yellow1, Red2 stays on...
};

LightsStep trafficControl_de[] = {
  { 5000, true, false, false, false, false, true }, // Red1 & Green2 are on...
  { 3000, true, true, false, false, true, false },  // Red1+Yellow1 are on, Green2 --> Yellow2...
  { 5000, false, false, true, true, false, false }, // Green1 & Red2 are on...
  { 3000, false, true, false, true, true, false },  // Green1-->Yellow1, Red2+Yellow2 are on...
};

LightsStep trafficControl_blink[] = {
  { 800, false, true, false, false, false, false },  // Yellow1 & Yellow2 on...
  { 800, false, false, false, false, true, false } // All lamps off...
};

uint8_t controlSequence = 0; // 1=nl, 2=de, 3=blink. Set to 0 to force initialisation...
uint8_t SequenceStep = 0;    // Current step/state in the sequence...
int SequenceSteps;           // Number of steps in the active sequence. This is size/8 because each struct has a size of 8 bytes...
LightsStep *currentSequence; // Pointer to the current traffic control sequence...
traffic-control2

Keuze met aanraakschakelaars

De Arduino stuurt de zes verschillende LEDs aan via de als uitgang geconfigureerde In-/Uitgangen D2 t/m D7. In een voorgaand project werden reeds de HTTM-aanraaksensoren besproken. Het aansluiten en gebruik hiervan met een Arduino of andere microcontroller is erg eenvoudig. Een voordeel is dat de touchsensor zélf reeds zó geconfigureerd kan worden dat hij werkt als een omschakelaar. De eerste aanraking schakelt de schakelaar in, een volgende weer uit, enz. Er hoeven hiervoor in de software dus geen extra voorzieningen te worden getroffen. Ook hoeft de schakelruis van een fysieke schakelaar niet in de software onderdrukt te worden.

In de foto is de complete opbouw van mijn verkeerslichten-experiment te zien. De twee aanraaksensoren werden aangesloten op de ingangen D12 en D13. Zoals gezegd gebruikte ik een Arduino Mega Pro Mini, maar de schakeling kan vanzelfsprekend ook met een Arduino Uno, Nano, of enige elke microcontroller met minimaal 2 ingangen en 6 uitgangen worden opgebouwd.

Ik koos er voor dat bij het activeren van de linker aanraak-schakelaar het programma wisselt van de typisch ‘Nederlandse’ naar de ‘Duitse’ verkeersregeling. De rechter aanraak-schakelaar heeft een hogere prioriteit. Als deze is geactiveerd knipperen de gele lampen afwisselend in de ‘service-stand’. Hieronder de Arduino Sketch van mijn experiment waarin eventueel eenvoudig de wijzigingen voor jouw specifieke situatie te maken zijn.

// Whizzbizz.com - Arnoud - July 2024
//
// Traffic LEDs for two directions. Sequences are configurable in an array of structs.
//
// The cycle in which the colored lights alternate or burn at the same time differs from country to country.
// In the Netherlands, only one light of the tri-color traffic is on at a time. Here in the Netherlands, the
// red light jumps directly to green. In other countries, for example Germany, Hungary, Great Britain, Austria, 
// Switzerland, Poland, Lithuania, Norway, Russia and Sweden, before the red light turns green, the orange light
// is lit together with the red light to indicate that the green light will be lit soon.
//
// Written for Arduino. Mega board was used, but should also work with Uno and other types.
// This Sketch also reads two inputs (touch sensors) at inputs D12 and D13
// Sensor 1 off/false shows the 'Dutch traffic lights sequence'
// Sensor 1 on/true switches to the 'German traffic lights sequence'
// When sensor 2 is on/true it overrules and only the two yellow lights will blink
//

// Define digital input pins of touch sensors...
#define touchSensor1 12
#define touchSensor2 13

// Define pins for traffic LED lights
#define redLight1    2
#define yellowLight1 3
#define greenLight1  4
#define redLight2    5
#define yellowLight2 6
#define greenLight2  7

#define debug 0 // Set to 1 for logging to serial monitor...

// Define struct for traffic light sequence
struct LightsStep {
  int duration; // Time in ms for this step in the sequence
  bool red1;    // Red light 1
  bool yellow1; // Yellow light 1
  bool green1;  // Green light 1
  bool red2;    // Red light 2
  bool yellow2; // Yellow light 2
  bool green2;  // Green light 2
};

uint8_t controlSequence = 0; // 1=nl, 2=de, 3=blink. Set to 0 to force initialisation...
uint8_t SequenceStep = 0;

// Define array of structs for traffic light sequences
LightsStep trafficControl_nl[] = {
  { 5000, true, false, false, false, false, true }, // Red1 & Green2 are on...
  { 3000, true, false, false, false, true, false }, // Red1 stays, Green2 --> Yellow2...
  { 5000, false, false, true, true, false, false }, // Green1 & Red2 are on...
  { 3000, false, true, false, true, false, false }  // Green1-->Yellow1, Red2 stays on...
};

LightsStep trafficControl_de[] = {
  { 5000, true, false, false, false, false, true }, // Red1 & Green2 are on...
  { 3000, true, true, false, false, true, false },  // Red1+Yellow1 are on, Green2 --> Yellow2...
  { 5000, false, false, true, true, false, false }, // Green1 & Red2 are on...
  { 3000, false, true, false, true, true, false },  // Green1-->Yellow1, Red2+Yellow2 are on...
};

LightsStep trafficControl_blink[] = {
  { 800, false, true, false, false, false, false },  // Yellow1 & Yellow2 on...
  { 800, false, false, false, false, true, false } // All lamps off...
};

int SequenceSteps; // Number of steps in active sequence. This is size/8 because each struct has a size of 8 bytes...
LightsStep *currentSequence; // Pointer to the current traffic control sequence...

void doLightsStep(LightsStep thisLights) {
  // Light the LED lights of both traffic light posts according this step...
  digitalWrite(redLight1, thisLights.red1);
  digitalWrite(yellowLight1, thisLights.yellow1);
  digitalWrite(greenLight1, thisLights.green1);
  digitalWrite(redLight2, thisLights.red2);
  digitalWrite(yellowLight2, thisLights.yellow2);
  digitalWrite(greenLight2, thisLights.green2);

  // Delay for the duration of this step in the sequence...
  if (debug) {
    Serial.print("Delay: ");
    Serial.println(thisLights.duration);
    Serial.println();
  }
  delay(thisLights.duration);
}

void setup() {
  // Initialize serial communication at 19200 baud rate
  Serial.begin(19200);

  // Set the input pins as inputs
  pinMode(touchSensor1, INPUT);
  pinMode(touchSensor2, INPUT);

  // Initialize traffic light pins as outputs
  pinMode(redLight1, OUTPUT);
  pinMode(yellowLight1, OUTPUT);
  pinMode(greenLight1, OUTPUT);
  pinMode(redLight2, OUTPUT);
  pinMode(yellowLight2, OUTPUT);
  pinMode(greenLight2, OUTPUT);
}

void loop() {
  // Read the status of the two touch sensors...
  if (digitalRead(touchSensor2)) {
    // Blink mode overrules any traffic control...
    if (controlSequence!=3) {
      currentSequence = trafficControl_blink;
      controlSequence = 3;
      SequenceStep = 0;
      SequenceSteps = (sizeof(trafficControl_blink)/sizeof(trafficControl_blink[0]));
    }
  } else {
    if (digitalRead(touchSensor1)) {
      if (controlSequence!=2) {
        currentSequence = trafficControl_de;
        controlSequence = 2;
        SequenceStep = 0;
        SequenceSteps = (sizeof(trafficControl_de)/sizeof(trafficControl_de[0]));
      }
    } else {
      if (controlSequence!=1) {
        currentSequence = trafficControl_nl;
        controlSequence = 1;
        SequenceStep = 0;
        SequenceSteps = (sizeof(trafficControl_nl)/sizeof(trafficControl_nl[0]));
      }    
    }
  }

  if (debug) {
    Serial.print("controlSequence: ");
    Serial.println(controlSequence);
    Serial.print("SequenceStep: ");
    Serial.println(SequenceStep);
    Serial.print("SequenceSteps: ");
    Serial.println(SequenceSteps);
  }

  // Do the current traffic light step of the sequence...
  doLightsStep(currentSequence[SequenceStep]);

  // Increment current sequence index for next step...
  SequenceStep++;
  
  // Check if current sequence index is greater than or equal to the number of steps in this sequence...
  if (SequenceStep >= SequenceSteps) {
    // Reset current sequence index to 0...
    SequenceStep = 0;
  }
}

Conclusie

De online aangeboden "Mini 5mm LED DC 5V Traffic Light LED Display Module Board for Arduino" LED-boards zijn erg bruikbaar voor het spelen met verkeersregelingen. Maar controleer, voordat je ze aansluit, even op de printjes welke serieweerstanden de fabrikant er in heeft gesoldeerd. Bij te hoge waarden zal de betreffende SMD-weerstand op de module zelf moeten worden vervangen, maar bij te lage waarden (zoals de op mijn boards aangetroffen 0Ω!) valt dit te corrigeren met aanvullende weerstanden op het kleine printplaatje dat ik er voor ontwikkelde.

Dit kleine printplaatje doet, in het kleine (bij fischertechnik te gebruiken) bouwsteentje dienst als voetstukje voor de kleine verkeerslichtjes. De 2,5mm stekkers van het fischertechnik systeem kunnen er direct op worden aangesloten. Maar het is natuurlijk ook prima mogelijk dit eenvoudig op te lossen door de verkeerslichtjes op een klein breadboard of kleine gaatjes-printplaat te plaatsen.

traffic-control1

Het was, vooral met de headstart die de 'Duino Code Generator' maakte, betrekkelijk eenvoudig om snel een werkende verkeersregeling met de kleine LED-boards op te bouwen. De aanraakschakelaars zijn een nuttige toevoeging om ‘live’ te kunnen wisselen tussen de verschillende verkeersregelingen. Een mogelijke toekomstige uitbreiding zou een potmeter op een van de analoge ingangen kunnen zijn, waarmee de snelheid van de regeling kan worden ingesteld. Dit laat ik aan jou over!
 
De Arduino Sketch kan hierboven worden gedownload. De STL files van de Arduino Mini Mega houder en de bouwsteen voor het verkeerslichtje kunnen worden gedownload van Printables en Thingiverse. Wie op zoek is naar de Gerber-files van het kleine printplaatje, kan deze vinden op GitHub. Daar is ook alles in één keer als verzameling te downloaden. Wie op zoek is naar losse onderdelen zoals de printplaat, een bouwpakketje of de compleet gebouwde verkeerslichtjes help ik vanzelfsprekend graag met maatwerk.