FunctionBloX


Laat je arduino dingen doen zonder te coderen

FunctionBloX V2

Inleiding


Arduino’s zijn geweldige dingen om te gebruiken bij de modelspoorbaan. Je kan er namelijk van alles mee. Zwaailampjes, geluidjes, servo motors, DCC centrales, de mogelijkheiden zijn eindeloos.

Originele Arduino NANO

Het enige probleem is dat je ze moet programmeren en dat is niet voor iedereen weggelegd. Dit is vaak een drempel voor veel mensen om niet naar Arduino’s om te kijken. En dat is natuurlijk erg jammer als je kijkt naar de gigantische hoeveelheid dingen die je er mee kan doen.

Om deze drempel kleiner te maken, heb ik een grafische programmeeromgeving gemaakt die ik “FunctionBlox” heb genoemd. Met FunctionBlox kan je op een grafische wijze een arduino vertellen wat hij moet door door zgn. logische poorten en dat is immers heel ‘logisch’.

Er zijn verscheidene logische poorten en die zijn onderverdeeld in analoge en digitale poorten. Om te beginnen, leg ik een zo’n poort uit. Hier onder staat een digitale EN poort (AND in Engels).

Een blok heeft links ingangen (IN1, IN2 en IN3) en rechts een uitgang (Q). Bij digitale blokken is het zo dat een ingang of uitgang of HOOG of LAAG is. In het geval van een Arduino is HOOG gelijk aan 5 Volt en LAAG gelijk aan 0 Volt.

In het geval van deze EN poort is de uitgang Q hoog als alle drie de ingangen ook hoog zijn. Dus als IN1 EN IN2 EN IN3 hoog zijn dan is Q ook hoog. Als een ingang niet is aangesloten op iets anders dan doet deze ook niet mee.

Bij analoge poorten kunnen alle INs en Qs meer dan zijn dan alleen hoog of laag. Bij analoge poorten kunnen ze theoretisch elke waarde hebben.

Inhoudsopgave


  1. Getting Started
    1. Installatie
    2. Laden & opslaan
    3. Programma naar Arduino Uploaden
  2. Een programma maken
  3. Digitale Poorten
    1. EN
    2. OF
    3. SR geheugen
    4. Niet
    5. JK Flip Flop
    6. Puls generator
    7. Digitale input
    8. Digitale uitgang
    9. Rising en Falling edge
    10. DCC
    11. Seriële berichten in en uit
  4. Analoge blokken
    1. ADC
    2. PWM
    3. MAP
    4. DELAY
    5. SERVO
    6. COMPERATOR
  5. Rekenkundige poorten
    1. CONST
  6. Overige Elementen
    1. Teksten
  7. Voorbeeld programma #1 Servo’s met puntstuk relais
  8. Voorbeeld programma #2 Een AHOB

Getting Started


FunctionBloX is geschreven in processing dat is van dezelfde makers als arduino. Processing kan je makkelijk zelf installeren en gebruiken. De Source code zelf staat op mijn Github acount.

Ik heb ook een .zip bestand waar alles in staat wat je nodig heb (behalve de Arduino IDE). Met deze zip hoef je niet apart processing te installeren. Het is slechts een kwestie van unzippen en gebruiken.

Deze link brengt je naar de folder waar je Function BloX kan downloaden.

Installatie


Dit filmpje laat het installeren zien.

N.B. om in versie 2 gebruik te kunnen maken van de nieuwe “upload program” knop, is het nodig dat je eenmalig het het installatie script ‘installArduinoCLI.bat’ uitvoert. Je kan dit doen door er op te dubbelklikken. Windows zal je lastig vallen met verscheidene meldingen. Klik op ja/yes waar nodig is.

Je kan FunctionBlox nu openen door simpelweg te klikken op functionBlox.exe

N.B. Het komt voor bij sommige PC’s dat de resolutie niet klopt. In dit geval helpt het om dit via de CMD terminal te doen. Klik rechts op een lege plek ergens in de folder, klik dan op Open in terminal en tik dan in de terminal .\functionBloX.exe druk daarna op ENTER om het programma te starten


De folder heeft een sub folder, ‘examples’, met een paar voorbeeld programma’s. En in de sketchbook folder kan je je eigen programma’s plaatsen

N.B. de sketchbook folder wil je misschien verplaatsen naar een andere folder zoals ‘Mijn Documenten’. Dat voorkomt dat je per ongeluk je werk wist, als je FunctionBlox update in de toekomst.

Het volgende filmpje laat zien hoe het programma werkt en hoe je het moet gebruiken. Ik laat hier zien hoe je ledje kan laten knipperen, hoe je een servomotor kan laten bewegen, hoe je dat ook langzaam kan doen en hoe je met de seriële monitor opdrachten naar de Arduino kan sturen.

Laden & opslaan


Sinds versie V1.1.0 kan Function BloX makkelijker programma’s opslaan en laden. Voor deze release zat een gebruiker vast aan 1 vast programma.

Als FunctionBloX wordt geopend, wordt er meteen gevraagd welk bestand je wilt openen. Als je een nieuw programma wilt maken, kan je op cancel drukken dan blijft alles blanco. Anders kan je een bestand naar keuze openen.

De controle knoppen

Tijdens het bewerken, kan je op Save klikken. Dit opent weer een soort gelijk venster waar je een bestandsnaam kan invoeren. Je kan ook halverwege met Load een een ander programma openen. Sla wel eerst je huidige werk op voordat je een nieuwe opent.

Als je nu op Quit klikt en je hebt niet opgeslagen wijzigingen, dan wordt je gevraagd om een bestandsnaam te selecteren.

Programma naar Arduino Uploaden


De MAKE PROGRAM knop maakt het arduino programma aan. Er wordt een Arduino project aangemaakt in de folder ArduinoProgram. Als je de Arduino IDE goed geinstalleerd heb, kan je dubbelklikken op ArduinoProgram.ino Hoewel je nu met meerdere bestanden kan werken, is er nog steeds 1 arduino programma. Als je dus iets anders in je Arduino wilt schieten, moet je eerst het corresponderende programma openen in FunctionBloX en op program klikken.

FunctionBloX V2 heeft een een extra set knoppen er bij gekregen om direct een Arduino board te programmeren zonder tussenkomst van de IDE. Als je Arduino is ingeplugd in de USB poort kan FunctionBloX zelfstandig uitvinden welke COM poort er gebruikt wordt. Je moet wel zelf selecteren welk board je gebruikt door op het witte bolletje te klikken voor het juiste board type. Met de knop ‘UPLOAD PROGRAM‘ wordt het FunctionBloX programma direct in je Arduino geladen.

N.B. Voor de Arduino NANO zijn er twee verschillende bootloader versies in omloop geweest. Dit maakt uit voor het uploaden. Als een upload voor je Arduino NANO niet werkt, dan kan je proberen om hier de andere NANO te selecteren waar achter staat: “cpu=atmega328old”.

Het uploaden kan eventjes duren.


Een programma maken


Je kan een programma maken door met de muis poortjes aan te maken en te slepen door op de rechterkant op een blokje te klikken en te slepen naar daar waar je hem wilt hebben.

Na het plaatsen van het eerste blokje verschijnt er bovenin een muissymbool met kleurtjes en teksten. Dit symbool en de teksten vertellen je ten alle tijden wat je kan doen met de muisknoppen wanneer je met je muis boven een blokje hangt.

Op dezelfde wijze kan je ook de verbindingen of ‘links’ tussen de blokjes maken.

Digitale Poorten


Veel van de digitale poorten hebben een zgn. transitie tabel. Het is niks meer dan een tabel die laat zien wat de stand van Q is afhankelijk van de combinaties van de ingangen

EN

Zoals eerder gezegd. Q is hoog als alle ingangen ook hoog zijn. Als je van de drie ingangen niet gebruikt, telt hij ook niet mee.

OF

Bij de OF poort is Q hoog als 1 van de drie ingangen hoog is.

SR geheugen

Als de set (IN1) hoog wordt, wordt Q hoog, als de reset (IN2) hoog wordt, wordt Q laag . Als set en reset beiden hoog zijn dan is Q laag (reset is dominant over set) en als beide ingangen laag zijn dan blijft Q wat hij is op dat moment. IN2 is niet aanwezig

Niet

De NIET poort inverteert simpelweg de enige ingang IN2.

JK Flip Flop

De JK flipflop is een van de meeste toegepaste logische poorten. Dit is ook een erge handige. De JK flipflop lijkt erg op de SR geheugenpoort maar heeft als toevoeging een klok (CLK) ingang. Deze poort doet alleen iets als de CLK ingang van laag naar hoog verandert (opgaande flank). Als J en K beiden hoog zijn dan zal Q omklappen van laag naar hoog of van hoog naar laag (toggelen) bij elke opgaande flank op Q.

Ik heb toegevoegd dat zowel J als K standaard hoog zijn als ze niet zijn aangesloten. Dit zorgt er voor dat Q toggelt bij elke opgaande flank op CLK.

Met een JK Flipflop kan je bijvoorbeeld een binaire teller maken.

De overige digitale poorten hebben geen transitietabellen

Puls generator

De puls generator heeft geen ingangen alleen een uitgang. Deze uitgang toggelt elke x aantal tijd. Deze tijd kan je instellen in millisecondes. De tijd instellen kan je doen door met je muis boven de 0 te hangen. Bovenin verschijnt dan deze tekst.

Als je nu links klinkt, kan je met het toetsenbord een getal in drukken en afronden met de enterknop

Digitale input

Dit blokje is onderhuids gekoppeld aan een fysieke input pin op het arduino board. Net als bij de pulse generator kan je een getal invoeren door met je muis op D0 te klikken, een getal in te voeren en te bevestigen met enter.

Q is hoog als de input hoog is, en laag als de input laag is.

N.B. Elke ingang is met een interne pull-up weerstand verbonden aan

Digitale uitgang

De digitale output is gekoppeld aan een fysieke digitale uitgang op de Arduino. Als de ingang hoog wordt, zal de output ook hoog zijn.

Rising en Falling edge

Deze twee blokjes geven beiden een korte puls af op Q van gedurende 20ms elke keer wanneer de ingang verandert. Bij de FALL poort komt de puls als de ingang van hoog naar laag gaat (neergaande flank) en bij de RISE poort is het andersom en komt de puls als de ingang van laag naar hoog gaat (opgaande flank).

DCC

Het DCC blokje (toegevoegd in versie V1.2.0) kan worden gebruikt om een arduino via DCC aan te sturen. De uitgang Q wordt hoog als het corresponderende wisseladres recht wordt gezet en Q wordt laag als dit wisseladres krom wordt gezet.

N.B. om een arduino aan te kunnen sluiten op de DCC bus, heb je een klein DCC printje nodig.

Seriële berichten in en uit

Met deze twee blokjes kan je seriële berichten ontvangen en sturen naar de seriële monitor van de arduino IDE.

De Q van de MESS (message) IN poort wordt hoog als het ontvangen bericht hetzelfde is als het opgegeven bericht.

De MESS OUT poort verstuurt het opgegeven bericht eenmalig als IN van laag naar hoog gaat. Dit voorkomt dat hetzelfde bericht continu verstuurd wordt.

Welk bericht je wilt ontvangen of versturen kan je simpel instellen door onder het blokje te klikken. Dan kan je het bericht tikken. Bovenin wordt het bericht dan zichtbaar.

Als ik bovenstaande voorbeeld uitprobeer op de arduino dan ziet dat er zo uit:

Analoge blokken


Bij de analoge blokken kunnen alle INs en Qs veel meer zijn dan slechts laag of hoog. Om ook gebruik te kunnen maken van de niet digitale componenten zoals een servo motor, potmeters en PWM heb ik ook een aantal analoge blokken toegevoegd.

ADC

Arduino boards hebben nagenoeg allemaal analoge ingangen. Op een analoge ingang wordt een spanning van tussen de 0V en 5V ingelezen en omgezet in een bereik van 0-1023 waarbij 1023 overeenkomt met 5V.

Deze 0 tot 1023 komt hier dan ook op de Q te staan afhankelijk van de spanning op de fysieke ingang van het arduino board. Net als bij de digitale ingang kan je hier ook een pinnummer in voeren door op de onderkant van het klokje te klikken.

PWM

De arduino heeft vaak ook PWM uitgangen. Ik ga hier niet diep in de materie duiken over wat PWM nou precies is. Het technische verhaal achter PWM staat ook op wikipedia. Kort door de bocht, je kan de helderheid van een led regelen of de snelheid van bijvoorbeeld een analoge trein.

De PWM poort heeft standaard een bereik van 0-255. Dit is ook wat je op de ingang moet zetten.

MAP

De Map poort is een van de belangrijkste blokjes in FunctionBlox. Map komt voort uit de map() functie van Arduino. Deze functie is heel handig om een bereik van twee getallen lineair om te schalen naar een ander bereik. Als je dus bijvoorbeeld een analoge ingang wilt gebruiken om een PWM pin aan te sturen dan kan je de map poort gebruiken om de 0 – 1023 om te schalen naar 0 – 255.

Boven in staan de getallen voor in1 en in2 en onderin staan out1 en out2. Map schaalt in1 en in2 om naar ou1 en out 2. Om de getallen in te voeren moet je net als bij de andere blokken onderin klikken en dan kan je alle vier de getallen afmaken. Dit proces moet je afmaken om verder te kunnen werken in Function Blox. Dit filmpje laat zien hoe je een analoge ingang omschaalt naar een klein bereik voor een servo motor.

De Map poort heeft nog een belangrijke eigenschap. Als je in1 en in2 gelijk maakt aan 0 en 1 (of andersom), dan kan je Q uitgangen van digitale blokken zoals bijvoorbeeld een digitale ingang pin koppelen aan de ingangen van analoge poorten. Denk hierbij aan een servo die je naar 2 standen kan sturen met een schakelaar.

N.B. Bij de map poort maakt het niet uit hoe om je de getallen invoert. Je kan dus 0-1023 omschalen naar 0-255, maar je kan ook 1023-0 omschalen.

DELAY

De delay poort was aanvankelijk een digitale poort die de ingang direct doorgeeft aan zijn uitgang Q maar met een instelbare vertraging. Deze poort werkt nu echter ook voor analoge poorten. De delay doet Q ophogen of verlagen met 1 totdat Q gelijk wordt aan IN.

Als je dus IN verandert van 0 naar 100, dan zal de delay Q ophogen naar 100 elke x aantal milliseconde. Dit is erg handig om bijvoorbeeld een servomotor langzaam te laten bewegen of om een fading led te realiseren.

In dit voorbeeld wordt met een schakelaar op pin 1 van de arduino een servo motor aangestuurd op pin 2 door middel van een map blokje en een vertraging.

Als hier de Input D1 verandert, dan zorgt de map poort er voor dat of 90 of 180 wordt doorgegeven aan de delay en de delay verhoogt/verlaagt deze waarde elke 50ms todat de servo of op 90 of op 180 graden staat. Met een bereik van 90 graden en een delay tijd van 50ms zal de servo er 4500ms of 4,5s over doen om van 90 graden naar 180 graden te draaien.

SERVO

De servo poort koppelt een opgegeven getal aan een fysieke pin op het arduino board. Met deze pin kan je dan een servo motor aansturen. Het opgeven van een pin is hetzelfde als bij de andere blokken. Onderin het blokje klikken, getal invoeren en op enter drukken.

De servo poort is tevens voor van een optionele ‘latch’. Met de latch kan je de motor uitschakelen met een digitaal laag signaal. Als je de latch niet aansluit, staat de servo altijd aan. Zo kan je bijvoorbeeld meerdere servo’s individueel bedienen met een enkele potmeter.

De servo is tevens geprogrammeerd om onbekrachtigd te zijn als de gewenste stand behaald is.

COMPERATOR

De comperator kan net als de map poort een brug vormen tussen de analoge en digitale poorten. De Comperator heeft twee analoge ingangen en een digitale uitgang. Als de + ingang hoger is dan de – ingang dan is Q hoog. En is – hoger dan + dan is Q laag. De comperator is voornamelijk handig om analoge sensor informatie te verwerken.

N.B. Het verschil tussen + en – moet minstens 3 zijn. Dit heeft als doel om eventuele ruis op een analoge ingang te negeren. Dit heet een Schmitt trigger

Rekenkundige poorten

Er zijn momenteel vijf analoge blokken waarmee je kan rekenen. De EQUAL poort heeft ook een digitale uitgang. Q is hoog wanneer beide INs gelijk zijn aan elkaar.

De ADD poort telt de twee ingangen op en zet het resultaat op Q

De SUB poort trekt de onderste ingang af van de bovenste.

De DIV deelt de bovenste ingang door de onderste

En de MUL port vermenigvuldigt beide ingangen en zet dat op uitgang Q.

CONST

De constante poort heeft slechts een analoge uitgang en de waarde hiervan kan je opgeven in Function BloX. Constante waardes kunnen handig zijn voor verschillende dingen. Je kan het gebruiken om te kijken of een sensorwaarde een bepaalde grens overschrijdt niet of niet. De waarde is instelbaar net zoals bij de andere blokken.

Overige Elementen


Teksten

Sinds FunctioBloX V2 is het mogelijk om beschrijvende teksten toe te voegen. Je kan simpelweg op de letter ‘t’ drukken op je toetsenboard om een tekst te plaatsen. Onder je muis wordt dan een tekst geplaatst. Je kan deze aanpassen door op de tekst te klikken. De GUI geeft dan aan of een muisklik de tekst kan verplaatsen of aanpassen.

Voorbeeld programma #1 Servo’s met puntstuk relais


Het eerste voorbeeld programma is een simpele. Ik laat zien hoe je een servo motor kan aansturen met een wipwap schakelaar of met 2 druktoetsen.

Omdat sommige mensen de puntstukken van hun wissels willen schakelen met een relais voeg ik ook toe dat een output geschakeld wordt halverwege de slag.

Als eerste de servo. Ik laat hier een servo bewegen van 70 graden tot 110 graden met een wipwap schakelaar. De schakelaar is of AAN of UIT. Hier sluit ik de schakelaar aan op pin 2 en de servo op pin 3.

De MAP zet de Q van de input wat alleen maar laag of hoog kan zijn om in 70 of 110 voor de servo. De DELAY poort zorgt er voor dat de servo 1 graad opschuift per 50ms.

Stel nu dat we in plaats van 1 continu schakelaar (de wipwap) 2 moment schakelaars willen gebruiken. Dan kunnen we input vervangen door 2 inputs met een SR geheugen poort.

Dan nu het puntstukrelais. In dit geval willen we dat het relais omschakelt als de wissel halverwege zijn slag is. Dit doen we door middel van een comperator en een constante.

De comperator wordt continu gevoed met de positie van de servo motor. Als de positie groter is dan 90 graden dan wordt het relais bekrachtigd en als de positie kleiner is dan 90 graden dan valt het relais af.

Voorbeeld programma #2 Een AHOB


Hier maak ik een voorbeeld programma van een AHOB met twee sporen. In dit voorbeeld worden de sporen wel elk in een richting bereden. De overgang moet dichtgaan als een trein op de eerste sensor rijdt en van de tweede sensor afrijdt en dit voor 2 sporen.

Als eerst de leds zelf. Ik ga 3 outputs gebruiken, pinnen 5 en 6, 7 om alle lampjes aan te sturen. 5 en 6 zullen samen in tegenfase knipperen (500ms) en 7 zal continu branden.

Voor het gemak gebruik ik de Seriele monitor om de overgang aan of uit te zetten. Met de letter ‘A’ doe ik de overgang dicht en met ‘U’ gaat de overgang weer open.

De SR geheugenpoort is aktief wanneer er een trein is. Leds 5 en 6 hebben slechts twee condities in de leidende EN poorten. De SR geheugen moet hoog zijn. En er moet een puls aanwezig zijn.

Om de tegenfase te realiseren, heb ik een NIET poort direct achter de pulsengenerator gezet. Dit zorgt er voor dat twee EN poorten om en om hoog worden.

Omdat ik graag moeilijk doe, wil ik ook perse dat deze leds in en uit faden zoals gloeilampen dat kunnen doen. Daarvoor moet ik de digitale uitgangen vervangen door PWM en ik heb een MAP en DELAY er bij nodig.

Nu wil ik hieraan de twee servo’s toevoegen. Voor het gemak laat ik ze beiden van 0 tot 90 graden draaien in 10 seconde. Ik doe dus feitelijk hetzelfde als voor de fading leds, alleen met iets andere waardes voor de MAPs en DELAYs.

Er komt alleen een maar bij kijken. De leds die moeten doorgaan met knipperen totdat de bomen weer geopend zijn. Ik moet dus de stand van de bomen gebruiken om te kijken wanneer de leds uit mogen. Dit ga ik doen met een EQUAL. Maar eerst de servo’s zelf.

Dit is eigenlijk hetzelfde als bij de fading leds. De MAPs maken een analoge waarde en deze worden vertraagd doorgegeven aan de servo’s die 1 graad per 111ms zullen draaien.

Dan nu de servo stand ‘uitlezen’ om de leds mee te bedienen.

De stand van de servo’s worden nu ook doorgevoerd naar een EQUAL poort. Deze poort checkt dus continu of de servo stand gelijk is aan 0 (de CONST). De uitgang van de EQUAL blok wordt hier ook geïnverteerd. Eigenlijk staat hier: Als de servo stand ongelijk is aan 0 graden -> zet de leds aan. Als we dat aan elkaar knopen:

Dan hoeven we alleen nog de bezetmelding voor de sporen toepassen. Als een trein over de inrijsensor rijdt, moeten de bomen dicht en als een trein van de uitrijsensor af rijdt moeten de bomen weer open.

Hiervoor gaan we flank gevoelige inputs en ook geheugen nodig hebben. Laten we beginnen met het eerste spoor. Ik wil ook filtering van de ingangen gaan toepassen. Een sensor moet minstens 50ms gemaakt zijn, voordat er bezetmelding mag zijn.

Zoals je ziet, kan je de DELAYs ook prima gebruiken om ingangen te filtreren. Mocht je met Function BloX ooit bezetmelders maken, kan dit een hoop spookmeldingen voorkomen.

De RISE en FALL blokken geven pulsjes af naar de geheugen. Zoals ik eerder zei, moet het geheugen hoog zijn als er een trein op een sensor komt. En het geheugen moet laag worden wanneer de trein van de andere sensor AF rijdt.

Nu hoeven we eigenlijk dit alleen nog te kopiëren en aan te sluiten op de rest van de overgang.

De bezetmelders gaan beiden naar de OF poort. Dus als er tenminste 1 spoor bezet is, zullen de bomen dichten gaan en de lampen knipperen.

Blog op WordPress.com.