BeneluxSpoor.net forum

Vraag en antwoord => Digitaal => Topic gestart door: RudyB op 30 december 2018, 15:48:50

Titel: Pret met Arduino
Bericht door: RudyB op 30 december 2018, 15:48:50
Fun with Arduino - 01 - Getting Started in 6 Easy Steps.

Vrijwel iedereen heeft wel gehoord over de Arduino en over de leuke dingen die je er mee kunt doen op modelspoor gebied en op vele andere terreinen.

Niet iedere hobbyist heeft echter feeling met elektronica of met software. Voor sommigen kan de drempel net iets te groot zijn, terwijl er misschien wel interesse is om er mee aan de slag te gaan.

Vandaar het plan voor een serie artikelen en video's onder de titel 'Fun with Arduino' (ja ... het is in het Engels), waarmee ook voor niet-IT-ers het werken met een Arduino binnen bereik kan komen.

De eerste video is online: 6 eenvoudige stappen om op te starten.

Link naar  de video. (https://rudysarduinoprojects.wordpress.com/2018/12/30/fun-with-arduino-uno-01-getting-started-in-6-easy-steps/)


(https://up.picr.de/34711429bx.jpg)
Titel: Re: Pret met Arduino
Bericht door: Timo op 30 december 2018, 16:06:13
Tipje voor de volgende keer, hogere resolutie van screen capture. Tekst is heeeeel slecht leesbaar. En maak geen gebruik van Free Commander en 7Zip maar gewoon Windows explorer. Zeker omdat je doelgroep beginners zijn.

Op naar hoofdstuk 2: NEVER use delay() again ;D


Timo
Titel: Re: Pret met Arduino
Bericht door: Frans op 30 december 2018, 16:57:59
Naar ik aanneem bent u Nederlander, dus waarom kan het niet in het Nederlands.
Mijn Engels is zeer slecht en wat er staat in het Engels begrijp ik geen barst van,
wil toch aan de gang met de Arduino maar op deze manier gaat dat echt niet lukken.
Daarbij heb ik het idee dat er op het forum velen wel willen maar door de 'experts'
opzij worden gezet door anders talige lessen en sites.

Frans
Titel: Re: Pret met Arduino
Bericht door: Ronaldk op 30 december 2018, 17:50:50
@Rudy: Goed initiatief  (y)

@Frans:

Daarbij heb ik het idee dat er op het forum velen wel willen maar door de 'experts' opzij worden gezet door anders talige lessen en sites.


Uhm.. niet echt. Het probleem is alleen dat heel veel spul in het Engels en andere talen is. Je zal iets van een basiskennis Engels moeten hebben omdat je daar in programmeert. Goed, wil je echt aan de gang. Kijk dan eens bij deze webzijde:  Arduino-lessen.nl (https://arduino-lessen.nl/). video's in het nederlands.

Groet Ronald.
Titel: Re: Pret met Arduino
Bericht door: Frans op 30 december 2018, 18:57:29
Ronald bedankt voor de link. Het is een begin.

Anderzijds al is de programmeertaal in het Engels dan kan het nog in
het Nederlands uitgelegd worden. Kijk maar naar de side die jij gelinkt hebt.

Frans

Titel: Re: Pret met Arduino
Bericht door: gvandersel op 31 december 2018, 15:29:04
Sorry, een programmeertaal is niet in een natuurlijke taal (bv engels of nederlands). Het commentaar in het programma is in een natuurlijke taal. Commentaar is bij mij af een toe in 4 natuurlijke talen, afhankelijk van met wie ik over de code heb gesproken.

Groet,

Gerard van der Sel.
Titel: Pret met Arduino 02 Digital Input and Output
Bericht door: RudyB op 01 januari 2019, 16:30:29
De tweede video staat online.

We gaan code schrijven (4 regels :) ). Doel is om de on-board LED aan te zetten dmv een drukknop.

Zo komen de pinconfiguratie en de digitale input en -output en zelfs al een 'if-then-else' aan bod.

Link naar de video. (https://rudysarduinoprojects.wordpress.com/2018/12/31/fun-with-arduino-02-digital-input-and-output/)


(https://up.picr.de/34731516wf.jpg)
Titel: Re: Pret met Arduino
Bericht door: RudyB op 01 januari 2019, 16:36:14
Ik snap het punt over Nederlands / Engels maar ruim 80% van de bezoekers van de blog zijn van buiten Nederland en het is gewoon te veel werk om alles tweetalig te doen.
Titel: Re: Pret met Arduino
Bericht door: Hans1963 op 01 januari 2019, 18:32:43
Leuk dit!  ga het volgen.
Titel: Re: Pret met Arduino
Bericht door: WimNa op 01 januari 2019, 20:15:03
Zeer benieuwd naar dcc toepassingen en vooral de techniek daar achter.
Titel: Re: Pret met Arduino
Bericht door: Timo op 01 januari 2019, 20:35:20
Tipje, let op de inspringing van de code! De compiler zal het een worst zijn maar het inspringen is voor ons een van de belangrijkste kenmerken om snel de code te kunnen begrijpen. In de code op je site heb je het wel maar in het filmpje niet.

Ook een groot voorstander van wat spaties en lege regels. Niet overdrijven, in taal gebruiken we steeds ook maar één spatie of lege regel. Maar het vergroot weer de snelle leesbaarheid.
void setup() {
  pinMode(2, INPUT_PULLUP); // push button
  pinMode(13, OUTPUT); // on board LED
}

void loop() {
  if (digitalRead(2) == LOW) digitalWrite(13, HIGH); // turn the LED on
  else digitalWrite(13, LOW); // turn the LED off
}

Succes met het vervolg! (y)


Timo
Titel: Re: Pret met Arduino
Bericht door: Robert E op 01 januari 2019, 20:44:21
Leuk initiatief!

Zet svp rond ieder if /while / switch case e.d. STANDAARD een haak {}, als je er eentje mist zoek je je rot :)

void setup() {
  pinMode(2, INPUT_PULLUP); // push button
  pinMode(13, OUTPUT); // on board LED
}

void loop() {
  if (digitalRead(2) == LOW)
  {
     digitalWrite(13, HIGH); // turn the LED on
  }
  else
  {
    digitalWrite(13, LOW); // turn the LED off
  }
}

Titel: Re: Pret met Arduino
Bericht door: Timo op 01 januari 2019, 20:55:00
Ben het met je eens! Maar doe het dan wel consequent! ;D ;D ;D ;D

void setup() {
  pinMode(2, INPUT_PULLUP); // push button
  pinMode(13, OUTPUT); // on board LED
}

void loop() {
  if (digitalRead(2) == LOW) {
    digitalWrite(13, HIGH); // turn the LED on
  }
  else {
    digitalWrite(13, LOW); // turn the LED off
  }
}

of void setup()
{
  pinMode(2, INPUT_PULLUP); // push button
  pinMode(13, OUTPUT); // on board LED
}

void loop()
{
  if (digitalRead(2) == LOW)
  {
    digitalWrite(13, HIGH); // turn the LED on
  }
  else
  {
    digitalWrite(13, LOW); // turn the LED off
  }
}

Zeg het wat plagerig ;) Maar consequent zijn in zowel syntax als variabelere namen etc maakt het weer leesbaar. En zeker C/C++ kent veel verschillende voorkeuren van syntax gebruik dus ik wil er geen "opleggen" maar zolang je het consequent doen is lezen (en dus debuggen!) een stuk makkelijker. Bijvoorbeeld voor de blokhaken is een missende terug vinden als het niet consequent is een stukje lastiger.

En nee, met dit soort dingen hoef je de kijker in het begin nog niet lastig te vallen. Maar ik denk wel dat je al het goede voorbeeld moet geven. Goed voorbeeld doet volgen  (y)


Timo
Titel: Re: Pret met Arduino
Bericht door: 72sonett op 01 januari 2019, 22:20:09
Geef I/O pinnen een naam.
Gebruik interne variabelenamen.
Die if ... else  opdracht kan in één regel:

const byte pushbuttonpin = 2;   // input drukknop
//
// =========================== [ set up ]=========================================================================
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);         
  pinMode(pushbuttonpin,INPUT_PULLUP); 
 } // setup
// =========================== [ main ] ==========================================================================
void loop() {
 
  digitalWrite (LED_BUILTIN, !digitalRead(pushbuttonpin));

}

Je bent overigens opnieuw het wiel aan het uitvinden, het www staat vol met Arduinotutorials (https://www.arduino.cc/en/Tutorial/HomePage).
Titel: Re: Pret met Arduino
Bericht door: Timo op 01 januari 2019, 22:28:12
Awwww, daarmee heb je les 3 verklapt! ;D ;D


Timo
Titel: Re: Pret met Arduino
Bericht door: Sven op 01 januari 2019, 23:35:37
Dit draadje opent met "Getting Started in 6 Easy Steps", waarna de techies na verloop van tijd beginnen te pingpongen met codetaal. De beginners zijn al afgehaakt.  ;)

Rudy bedankt voor het toegankelijk maken van Arduino voor iedereen die er interesse in heeft.
Titel: Re: Pret met Arduino
Bericht door: 72sonett op 02 januari 2019, 00:02:15
Die haakten al af toen alles in het Engels bleek te zijn. Als er al behoefte aan is om het toegankelijk te maken, doe het dan in het Nederlands.
Titel: Re: Pret met Arduino
Bericht door: Sven op 02 januari 2019, 01:07:54
Zoals Rudy al aangaf, 80% van zijn van buiten Nederland. Wat hij doet is al heel veel werk en als hij een veel groter publiek kan bereiken met het in het Engels te doen, dan is dat begrijpelijk. Ik doe mijn videos ook alleen in het Engels. Als ik dat ook nog eens in het Nederlands moet doen voor die paar mensen voor wie het wat moeilijker is, ben je daarvoor zoveel meer tijd kwijt. Zelfs ondertiteling kost me al te veel tijd. Zelf neem ik dan het risico dat er mensen afhaken.

Maar niet getreurd, er zijn genoeg gereedschappen om een website in je eigen taal te lezen
1) Ga naar http://translate.google.com
2) Typ het websiteadres waar het om gaat in het linkerveld (in dit geval de eerste link van Rudy, kopieer en plak deze in het veld)
3) Kies taal als Engels
4) Kies voor het rechtervak de taal Nederlands.
5) Als je nu op de link klikt die het vertaalvenster geeft, ga je naar de website van Rudy die nu in het Nederlands wordt weergegeven. Het is zelfs een link die je kunt bewaren, dus ik plak 'm hier even:

https://translate.google.com/translate?sl=en&tl=nl&u=https%3A%2F%2Frudysarduinoprojects.wordpress.com%2F2018%2F12%2F30%2Ffun-with-arduino-uno-01-getting-started-in-6-easy-steps%2F
Titel: Re: Pret met Arduino
Bericht door: Hans Mol op 02 januari 2019, 07:29:27
Voor diegene die toch moeite hebben met de Engelse uitleg. Er is op YouTube een kanaal genaamd Bas on Tech.
Deze is Nederlandstalig. Hierin worden de basisbeginselen van Arduino op een hele duidelijk manier én in het Nederlands uitgelicht.

https://www.youtube.com/playlist?list=PL8qXAiv_31k4VKVKEjHMzZN4daLPNJjuj (https://www.youtube.com/playlist?list=PL8qXAiv_31k4VKVKEjHMzZN4daLPNJjuj)

Zeker de moeite waard om je daar op te abonneren.

Groeten,

Hans
Titel: Fun with Arduino 03 External LED and Resistor
Bericht door: RudyB op 05 januari 2019, 20:14:53
De derde video staat online.

De on-board LED bedienen is leuk, maar het wordt pas echt leuk als we LED's op een layout of op een bedieningspaneel kunnen bedienen. Deze video gaat over hoe deze aan te sluiten en hoe de waarde van de benodigde serieweerstand te bepalen.

In de volgende video gaan we hem aansturen alsof het straatverlichting is gedurende een nachtcyclus.

Link naar Fun with Arduino 03 External LED and Resistor (https://rudysarduinoprojects.wordpress.com/2019/01/04/fun-with-arduino-03-connect-an-external-led/)

(https://up.picr.de/34766252wx.jpg)
Titel: Re: Pret met Arduino
Bericht door: WR op 05 januari 2019, 21:24:15
Zoals Rudy al aangaf, 80% van zijn van buiten Nederland. Wat hij doet is al heel veel werk en als hij een veel groter publiek kan bereiken met het in het Engels te doen, dan is dat begrijpelijk. Ik doe mijn videos ook alleen in het Engels. Als ik dat ook nog eens in het Nederlands moet doen voor die paar mensen voor wie het wat moeilijker is, ben je daarvoor zoveel meer tijd kwijt.

Waarom dan je tijd willen verdoen op dit forum.
Honderden site, s vertellen dit verhaal.
Dus totaal overbodig.
Als je echt stoer wilt zijn neem dat de pic cursus site als voorbeeld.
Alles uitgelegd, tot de programmering commando, s toe,,,  in het nederlands.
Hier kan je als leek wat mee.
Hoera voor diegene die dit voor de arduino
 op het forum zet.

https://www.picbasic.nl

Titel: Re: Pret met Arduino
Bericht door: Paul_V op 05 januari 2019, 23:02:01
Waarom dan je tijd willen verdoen op dit forum.
Honderden site, s vertellen dit verhaal.
Dus totaal overbodig.


Dit soort reacties begrijp ik dus niet. Iemand doet zijn best om een beginnerscursus te maken, maar besluit vanwege voor hem goede redenen om dat in het Engels te doen. Dat mag hij toch helemaal zelf weten?
Als je de taal niet machtig bent, of je hebt het al honderd keer gezien, of er is een andere reden waarom het je niet interesseert, dan kun je het draadje toch gewoon negeren? Ik volg ook niet alle draadjes, maar sommige wel. En op de draadjes die ik, om welke reden dan ook, niet volg, lever ik geen commentaar dat het draadje niet nodig zou zijn, of dat een draadje over een ander onderwerp WEL zinvol zou zijn. Die draadjes laat ik dan gewoon. Is dat een idee?

MvrGr,
Paul


Verzonden met Tapatalk
Titel: Re: Pret met Arduino
Bericht door: René 4312 op 06 januari 2019, 09:36:17
Volgens mij heb je bij 2 SMD leds de anode en kathode omgewisseld. (Vanaf 1:07).

Rene
Titel: RudyB
Bericht door: RudyB op 06 januari 2019, 10:13:24
Klopt ... alleen die met het pijltje is goed, die met de streepjes moeten andersom.
Titel: Re: Pret met Arduino
Bericht door: Timo op 06 januari 2019, 14:13:36
De tabel met voltages voor de ledjes is naar mijn idee ook wat achterhaald. 4V voor een witte led heb ik nog nooit gezien. Nu gebruik ik meestal echt een botte bijl methode: 3V voor fosfor leds en 2V voor GaAsP. ;D Waar je alleen op moet letten dat rood, groen en oranje te krijgen zijn in zowel GaAsP als fosfor. Maar top dat je meldt dat 20mA is de max en dat je meestal weg komt met een heel stuk minder. (y)


Timo
Titel: Pret met Arduino 04 Leesbare en Onderhoudbare Code met #define
Bericht door: RudyB op 11 januari 2019, 13:07:59
De vierde video staat online.

De doelen in deze video zijn:
- De externe LED aansturen en tegelijk de code beter leesbaar en onderhoudbaar maken
- We doen net of die ene LED staat voor 20 straatlantaarns op onze layout. Na een druk op de knop moeten die een nachtcyclus nabootsen van bijvoorbeeld 3 minuten en dan weer automatisch uit gaan.

Link naar Fun with Arduino 04 Readable & Maintainable Code , #define, delay() (https://rudysarduinoprojects.wordpress.com/2019/01/11/fun-with-arduino-04-readable-and-maintainable-code-with-define/)


(https://up.picr.de/34815336ne.jpg)
Titel: Re: Pret met Arduino
Bericht door: 72sonett op 11 januari 2019, 14:55:07
Een I/O pinnummer is een constante, dus daarom ook als const declareren i.p.v. #define.

https://www.arduino.cc/reference/en/language/variables/variable-scope--qualifiers/const/ (https://www.arduino.cc/reference/en/language/variables/variable-scope--qualifiers/const/)

Citaat van: www.arduino.cc/reference/
Constants defined with the const keyword obey the rules of variable scoping that govern other variables. This, and the pitfalls of using #define, makes the const keyword a superior method for defining constants and is preferred over using #define.
Titel: Re: Pret met Arduino
Bericht door: Timo op 11 januari 2019, 15:56:17
Yep, delay() en macro's voor pinnen in de ban graag :-\ Goed aanleren en je kan de helft van het Arduino forum opdoeken :police:


Timo
Titel: Pret met Arduino 05 Meerdere LEDs aansluiten via relais of FET
Bericht door: RudyB op 13 januari 2019, 12:14:54
De vijfde video is online.

De Arduino uitgangen kunnen niet genoeg stroom leveren om meerdere LED's tegelijk aan te sluiten, tenzij het high brighness / low current types zijn. Om meerdere LEDs aan te sluiten op de Arduino, om bijvoorbeeld straatverlichting, licht in huisjes of stationverlichtimng te schakelen, is een externe voeding nodig en een relais of een power FET. Ze worden aangestuurd door de Arduino en ze schakelen de benodigde hogere stroom / spanning.

Link naar Fun with Arduino 05 Connect multiple LEDs with a Relay or a FET (https://rudysarduinoprojects.wordpress.com/2019/01/13/fun-with-arduino-05-connect-multiple-leds-with-a-relay-or-a-fet/)


(https://up.picr.de/34829491px.jpg)
Titel: Re: Pret met Arduino
Bericht door: Timo op 13 januari 2019, 13:57:16
Kleine opmerking over de mosfet bordjes, ze kunnen grappig genoeg veel meer aan dan 24V, de mosfet is tot 100V. Maar goed, voor de hobby is een max van 24V denk ik wel beter. Maar ze kunnen echt NIET 5A aan. Bij 1,5 - 2,0 A houden ze wel op. Dat komt omdat het geen logic level mosfets zijn en je de gate voor 5A gewoon niet hard genoeg aanstuurt (je werkt in het verzadigingsgebied). Ja, als je 5 meter ledstrip aan sluit zal deze wel oplichten maar met een veel grotere spanningsval over de mosfet. Gevolg, veel warmte in de mosfet en een stuk minder vermogen naar de load. Je zou de mosfet op het bordje kunnen vervangen door een IRLB3034 of iets dergelijks. Dan is de mosfet geen limitatie meer maar de printsporen ;D

En het design van de meeste van die relais bordjes is dusdanig dat ik het niet aan zou durven er netspanning mee te schakelen.... ::)


Timo

PS Een FET is geen speciaal type transistor, het is gewoon een type transistor ;)
Titel: Pret met Arduino 06 Automatische Dag-Nacht Cyclus met Schakelaar en LED
Bericht door: RudyB op 17 januari 2019, 13:25:08
In de zesde video gaan we een automatische dag-nacht sequencer maken, met een aan/uit schakelaar en een indicator LED op ons schakelpaneel. De dag en nacht tijden willen we kunnen instellen in seconden.

Link naar Fun with Arduino 06 Automatic Day & Night Cycle with on/off Switch (https://rudysarduinoprojects.wordpress.com/2019/01/17/fun-with-arduino-06-automatic-day-night-cycle-with-on-off-switch/)


(https://up.picr.de/34856405df.jpg)
Titel: Pret met Arduino 07 Dag / Nacht Cyclus met Meerdere Lichtgroepen, met Variatie
Bericht door: RudyB op 20 januari 2019, 12:08:58
Onze dag / nacht module van de vorige video werkt perfect, maar hij schakelt maar 1 lichtgroep. Op onze layout hebben we waarschijnlijk meerdere lichtgroepen ... huisjes, straatverlichting, een station of industrie. In deze video kijken we hoe we deze kunnen schakelen in een dag / nacht cyclus, maar natuurlijk niet allemaal tegelijk en ook zonder dat het eentonig wordt.

Link naar Pret met Arduino 07 Dag / Nacht Cyclus met Meerdere Lichtgroepen, met Variatie (https://rudysarduinoprojects.wordpress.com/2019/01/19/fun-with-arduino-07-day-night-cycle-multiple-light-groups-random-times/)


(https://up.picr.de/34878792si.jpg)
Titel: Re: Pret met Arduino
Bericht door: tuurtje op 20 januari 2019, 12:21:27
Hallo Rudy,

Kom dit nu pas tegen, echt real fun en goed uitgelegd voor de ouderen zoals ik  (y) (y) (y)


Groetjes


Arthur
Titel: Re: Pret met Arduino
Bericht door: RudyB op 20 januari 2019, 12:28:58

Dank voor je feedback Arthur, dat is fijn om te horen.
Titel: Re: Pret met Arduino
Bericht door: Haas67 op 20 januari 2019, 22:29:24
Leuke serie Rudy!
Hopelijk gaat de serie nog verder de DCC richting op. Ben benieuwd!
Titel: RudyB
Bericht door: RudyB op 21 januari 2019, 00:22:19
Bedankt voor de feedback 'haas67’. Waarschijnljk gaat in deze serie DCC niet aan bod komen, dat is qua code toch meer 'advanced'. Arduino software voor een DCC decoder (servo en/of accessory), voor een 'DCC sniffer' en voor een S88 bus is te downloaden op de software pagina (https://rudysmodelrailway.wordpress.com/software/) van mijn blog (rudysmodelrailway). En natuurlijk bij Nico's arcomora.
Titel: Re: Pret met Arduino
Bericht door: bask185 op 21 januari 2019, 13:33:52
Rudy,

Ik zit zo ff te lezen en te kijken. Het ziet er wel leuk uit voor d'n beginner.

Het was ook al opgemerkt, maar ik zie nogal veel delay() voorkomen. Ik snap dat het voor dummies wel handig is voor een simpel dingetje maar ik vroeg me af. Ga je ook een aflevering maken waar je iets gaat multitasken? 3 functies ofzo parallel laten lopen, elk met een eigen interval zonder delay maar met millis()? En een simpel state machine'tje met een switch case ofzo?

Wat misschien voor jou ook welk leuk is, om voor deze doeleinden je eigen timer library te maken. De code in de lirary laat je dan weg voor de lezers. Maar het gebruik er van is misschien wel grappig. Ik programmeer voor m'n werk complexe machines in C en daarvoor had ik een simpele library gemaakt. Ik gebruik alleen maar een struct en een array en ik kan zo x aantal functies laten uitvoeren met een willekeurige interval.

Ik roep dan bijvoorbeeld aan:

start(TIMER_1,foo,500);

En functie foo() wordt elke 500ms uitgevoerd.

Aanvullend kon ik dan de interval veranderen en natuurlijk de timer stoppen. Het kan allemaal heel simpel gehouden worden zodat de dummies (no offense) onder ons ook makkelijk kunnen multi tasken en dingen automatiseren.

Met 13 + 6 I/O pinnen en een modeltreinbaan, is het denk ik goed mogelijk dat iemand misschien wel 3 afzonderlijke lichtcircuits wilt bedienen met verschillende tijden en dan nog bedenkt, goh een spoorweg overgang kan er ook nog wel bij.

Bas.
Titel: RudyB
Bericht door: RudyB op 21 januari 2019, 17:26:36
Ja, natuurlijk gaan we binnenkort van de delay() afstappen. Voor de huidige sequencer was het gewoon lekker gemakkkelijk, maar zodra we een spoorwegovergang gaan maken, met knipperende LED's, een servo en sensors om de trein te detecteren, dan kan het knipperen van de LEDs niet meer met een delay(), omdat we dan meer te doen hebben.
Titel: Pret met Arduino 08 User Interface met Serial.print()
Bericht door: RudyB op 24 januari 2019, 16:29:01
Onze manier van de dag/nacht tijd veranderen leek wel handig, met de #define helemaal bovenaan de code, maar je moet wel elke keer als je een andere cycle time wilt de code aanpassen en opnieuw uploaden. Kan dat misschien gemakkelijker?

Ja ... dat kan. We gaan een User Interface maken waarmee de cycle time 'on the fly' aangepast kan worden. Dat kan via hardware of via software. We gaan ze alletwee proberen. In deze video de eerste werkzaamheden ... text en variabelen naar het beeldscherm schrijven via Serial.print().

Link naar Fun with Arduino 08 User Interface met Serial.print() (https://rudysarduinoprojects.wordpress.com/2019/01/24/fun-with-arduino-08-user-interface-serial-print/)


(https://up.picr.de/34911023ti.jpg)
Titel: Re: Pret met Arduino
Bericht door: Timo op 24 januari 2019, 22:26:45
Hoi RudyB,

Je hebt er nogal een dikke vette bug in geschreven ;) Preistertjes moeten nu 49,7 dagen wachten voor het weer licht is ;D Rekenen met literals kan een beetje tricky zijn.

Twee andere dingen,

- als je toch variabelen introduceert kunnen de macros ook weg. Krijg je eindelijk minder cryptische errors.
- je breekt nogal met de normale "Arduino stijl" door niet gebruik te maken van camelCaseVariabelen


Timo
Titel: Re: Pret met Arduino
Bericht door: bask185 op 25 januari 2019, 08:23:20
@Timo
Die bug? Ik zie hem niet.

Als DAY_NIGHT_CYCLE_ON_OFF_PIN is ingedrukt (en dus LOW is) dan wordt  LIGHTS_PIN elke 180 seconde van state getoggled en LED_PIN gaat uit nadat je die knop uitzet en die delays zijn verlopen.

En er wordt niet gerekend met de literals. Die #defines geven alleen I/O namen aan en die int 'cycle_time is desondanks hij niet gewijzigd wordt, technisch gezien geen literal omdat het noch een const noch een #define is. Hij is veranderlijk.

En het is heel gebruikelijk om #defines te gebruiken om I/O pinnen aan te duiden. Dit vreet namelijk geen extra geheugen. En er kan niks mee gebeuren. De pre compiler vervangt al die #define namen door de constantes. Als je variabelen gaat toewijzen aan I/O dan gebruik je minimaal 1 byte per I/O pin.

@RubyB
Ik vind het opvallend dat je eigenlijk nu pas met variabelen komt. Ik zou dit zelf in les #1 behandelen en misschien ook alle logic operators en anders zou ik die in les #2 behandelen.

En waarom? Nu heb je net Serial.print() uitgelegd en delay() is ook al aan bod gekomen. Deze functies kunnen allemaal variabelen meenemen als argumenten. Vooral voor de print() die verscheidene soorten aan variabelen kan hebben, zou het handig te zijn om een string of een integer te kunnen manipuleren. En dan kan je ook andere dingen gaan doen zoals een potmeter uitlezen en diens waarde in een delay of print gooien.

Een goede arduino/C oefening zou zijn om met je arduino te rekenen en waardes op het scherm te dumpen zodat je ziet wat de arduino uitspuugt, zo kan je ook heel goed overflows en unsigned/signed waardes demonstreren.

Vooral als je straks Serial.Read() gaat behandelen, is het noodzakelijk dat je goed kan rekenen, want stel nou dat je cycle_time nu wilt instellen met de terminal? Dan moet je '1', '8' en '0' apart inlezen, er 48 of '0' van aftrekken, vermenigvuldigen met 100 of 10 en dan de boel bij elkaar optellen.

En dan zou ik voor les #3 dus functies in het algemeen behandelen zodat je ook meteen snapt wat print, read en delay zijn en wat ze doen en waar die () voor zijn en wat ze kunnen returnen.

Titel: Re: Pret met Arduino
Bericht door: Cees Baarda op 25 januari 2019, 10:29:45
En er wordt niet gerekend met de literals. Die #defines geven alleen I/O namen aan en die int 'cycle_time is desondanks hij niet gewijzigd wordt, technisch gezien geen literal omdat het noch een const noch een #define is. Hij is veranderlijk.

En het is heel gebruikelijk om #defines te gebruiken om I/O pinnen aan te duiden. Dit vreet namelijk geen extra geheugen. En er kan niks mee gebeuren. De pre compiler vervangt al die #define namen door de constantes. Als je variabelen gaat toewijzen aan I/O dan gebruik je minimaal 1 byte per I/O pin.

Een stukje code:
#define ledPin 4
.
// allerlei andere statements
.
#define ledPin 13
Is volledig legale code. Echter na de laatste regel  wordt LedPin voortaan vertaald door 13.
Het gevolg kan dan zijn dat je programma totaal niet doet wat je verwacht. Het zoeken naar zo'n "fout" is beslist niet gemakkelijk.

Nog een stukje code:
const int ledPin = 4;
.
// allerlei andere statements
.
const int ledPin = 13;
Levert een foutmelding op van de compiler, omdat je een const niet mag veranderen. Je bent daarmee gewaarschuwd, dat je iets doet wat mogelijk niet wenselijk is.
Als je beide stukjes compileert, levert dat dezelfde hoeveelheid bytes in programmageheugen en geen ruimtegebruik bij de variabelen op in je microcontroller.
Daarom wordt er al geruime tijd in de Arduino-wereld aangeraden bij dit soort toekenningen const te gebruiken i.p.v. #define.

groet Cees
Titel: Re: Pret met Arduino
Bericht door: RudyB op 25 januari 2019, 11:03:25
@Timo @Bas

Het plan is om in de volgende video iets te vertellen over (unsigned) int en long variabelen en hoe we de delay(cycle_time * 1000) , die nu niet doet wat je zou verwachten, aan de praat krijgen.
Titel: Re: Pret met Arduino
Bericht door: bask185 op 25 januari 2019, 12:20:05
Als je beide stukjes compileert, levert dat dezelfde hoeveelheid bytes in programmageheugen en geen ruimtegebruik bij de variabelen op in je microcontroller.
Oe dat wist ik niet, excuus.

Ik heb ff gecheckt met arduino, maar je kan een defined waarde ook geen waarde toewijzen. Als je doet #define x 5  en later x = 7; dan krijg je ook een compiler fout. Dus daarvoor maakt het niet uit wat je kiest.

Maar dan alsnog. Als je gewoon de syntax aanhoudt en hoofdletters gebruikt voor constantes dan zou je zeggen dat het bijna niet mis kan gaan. Als ik een regel code tik, heeft die regel een rede, een doel. Ik kan me nooit geen rede bedenken om ooit te tikken

#define LED_PIN 13
LED_PIN = 12; // wat moet dit nu doen?
Je ziet aan de syntax alleen al dat je een waarde in een constante probeert te proppen. Als je je bedenkt: "wat doet deze regel", dan moet je tot de conclusie komen dat je iets nutteloos doet. Maar goed, het maakt in dit voorbeeld niet uit of je een #define of een const int gebruikt, je krijgt in beide gevallen een compiler fout.

dit:
const int ledPin = 4;
.
// allerlei andere statements
.
const int ledPin = 13;
is trouwens een slecht voorbeeld omdat de compiler eerst al struikelt over het feit dat je 2x een variabele declareert met dezelfde naam dan dat je een const probeert te wijzigen. Als je hier geen const tikt, wordt de compiler ook al boos
const int ledPin = 4;
.
// allerlei andere statements
.
ledPin = 13;
illustreert het probleem beter. Maar er is een maar....

Ik had nog iets geprobeerd en daarmee een argument gevonden om geen const te gebruiken.
Wat zonder fouten compileert is de volgende code. Een lokale variabele, const of geen const, kan dezelfde naam hebben als een globale variabele.
const int x = 5;

void setup()
{
  const int x = 6; // compileert prima
}

void loop()
{

}

zodoende
const int x = 5;

void setup()
{
  int x = 6;

  x = 10; // kan gewoon
}

void loop()
{

}
compileert dit ook prima.

Ik heb nog een 2e argument om geen const te gebruiken.
In C++ weet ik het niet, maar bij ansi C heeft const bij lokaal gebruik in een functie body een compleet andere functie dan als een globale variabele. In Keil's C compiler kan je const in een functie gebruiken. Dit is dan een variabele die bij het 1e keer aanroepen van de functie een waarde krijgt, die je kan wijzigen en die zijn waarde niet verliest als de functie opnieuw wordt uitgevoerd.

voorbeeld:
void foobar()
{
  const int x = 5;

  x++;
  Serial.println(x); // 6,7,....16
}
Als je deze functie in je programma 10x aanroept, dan heeft x een waarde van 16. De eerste keer krijgt x 5 aangewezen en wordt opgehoogd met 1 en alle andere keren wordt hij alleen opgehoogd.

Dus daarom zie ik geen voordelen in het gebruik van const tov #define en wel nadelen.[/code]
Titel: Re: Pret met Arduino
Bericht door: Timo op 25 januari 2019, 15:50:38
Even korte reactie want zit in België alleen op een mobiel
@Timo
En er wordt niet gerekend met de literals. Die #defines geven alleen I/O namen aan en die int 'cycle_time is desondanks hij niet gewijzigd wordt, technisch gezien geen literal omdat het noch een const noch een #define is. Hij is veranderlijk.
De macro en de int's inderdaad niet, maar 1000 is wel een literal. En aangezien het in een int past is het een signed int literal. De compiler pakt voor het rekenwerk altijd het grootste gebruikte type, niet groter! Voor int maal int literal een signed int dus. Maar de vermenigvuldiging past niet in een signed int! Overflow is het gevolg. En pas daarna vind de impliciete cast naar unsigned long plaats voor delay(). Waarna je dus een delay hebt van 47 dag....


Timo
Titel: Re: Pret met Arduino
Bericht door: Ed K. op 25 januari 2019, 15:55:43
Als ik dit allemaal probeer te lezen, vergaat mij bij voorbaat al de pret met Arduino.   ??? ??? ??? ??? ???

Gr. Ed
Titel: Re: Pret met Arduino
Bericht door: 72sonett op 25 januari 2019, 22:06:41
...
void foobar()
{
  const int x = 5;
  x++;
  Serial.println(x); // 6,7,....16
}
Als je deze functie in je programma 10x aanroept, dan heeft x een waarde van 16.  ...

Dat compileert niet in C++, en terecht, geeft foutmelding "increment of read-only variable 'x'". Je probeert een constante te veranderen, het is alsof je pi een andere waarde wil geven dan 3,14.

Ik heb 35 jaar geleden leren programmeren in Pascal en ook dat je variabelen een zinvolle naam moet geven en het juiste type. C is niet zo strikt, daarom vind ik het ook geen prettige programmeertaal.
Titel: Pret met Arduino 09 variabelen byte int long unsigned
Bericht door: RudyB op 27 januari 2019, 10:44:22
Voor we verder werken aan onze User Interface nemen we even een moment om iets dieper in te gaan op variabelen en data types. In de komende video's gaan we namelijk steeds meer variabelen gebruiken ... en ... we kijken naar een valkuil met betrekking tot data types die maakte dat de code uit de vorige video 8 niet altijd goed werkte.


Link naar Fun with Arduino 09 Variables byte int long unsigned (https://rudysarduinoprojects.wordpress.com/2019/01/25/fun-with-arduino-09-variables-byte-int-long-unsigned/)


(https://up.picr.de/34943763me.jpg)

Titel: Re: Pret met Arduino
Bericht door: meino op 27 januari 2019, 12:14:33
Al hoewel ik zelf een hekel heb aan het geven van kritiek, want ik vindt deze training voor de Arduino erg goed, heb ik toch een kleine opmerking. Je gebruikt hier de "int" als een 16 bit integer. Het probleem is dat in C en C++ de grootte van de int niet gespecificeerd is, dat hangt af van de hardware en keuzes die gemaakt zijn tijdens de compiler generatie (GNU C-C++). Die kan in theorie varieren van 8-32 bits. Op de arduino UNO en Mega is de "int" inderdaad 16bits, maar ik durf niet te beweren dat het voor alle Arduino's geldt, daar zitten ook een aantal exoten tussen met bijv. Cortex cpu's. Ik denk dan ook dat je de "short"  moet opnemen, want die is wel een eenduidig gedefinieerd.

Groet Meino
Titel: Re: Pret met Arduino
Bericht door: RudyB op 27 januari 2019, 12:23:36
Dat klopt Meino, bij verschillende typen microprocessoren kan een int een ander aantal bytes beslaan. De getoonde tabel is voor de UNO die we hier gebruiken. Feit blijft dat een 'automatische upgrade' van int naar long op plaatsen waar je dat wellicht impliciet verwacht niet plaats vindt.
Titel: Re: Pret met Arduino
Bericht door: 72sonett op 27 januari 2019, 14:36:06
In je tabel gebruik je een punt (.) voor scheiding van duizendtallen. Áls je die scheiding al wil aangeven moet dat met een komma (,) of een spatie. Een punt gebruik je als decimaalteken voor reële getallen in de typen float en double.
Titel: Re: Pret met Arduino
Bericht door: Timo op 28 januari 2019, 13:05:23
Goed, terug van een lekker lang weekendje weg. Weer een gewone lunchpauze op kantoor dus tijd voor een reactie :angel: De volgorde daarvan is redelijk willekeurig.

Als ik dit allemaal probeer te lezen, vergaat mij bij voorbaat al de pret met Arduino.   ??? ??? ??? ??? ???
Daar moet je denk ik reacties bij de tutorial los zien van hier. Mijn idee is als je het hier op het forum zet onder "Vraag en antwoord" dat je er ook commentaar op wilt. En zeker als er fouten in een voorbeeld zit is dat enorm vervelend voor een beginner.

Ik vind het opvallend dat je eigenlijk nu pas met variabelen komt.
Ik ook. Niet zo zeer dat er mee begonnen moest worden om het helemaal uit te bouwen maar als beginner is het net zo duidelijk om een echte variabele aan te namen als een macro. En die vormen een moderner, veiliger en doelbewuster alternatief. Waarom eerst slechte dingen aanleren? En het gaat gepaard met "probeer niet slimmer te zijn dan de compiler" (tenzij je dat echt bent ;D).

Zelfde geldt voor delay(). Meer dan de helft van de problemen op het Arduino forum komen door het gebrek aan uitleg over de limitatie daarvan. Of eigenlijk nog algemener, het probleem met blocking code. Er worden steeds leuke voorbeelden bedacht waar het geen probleem is maar het eerste eigen project wat mensen doen willen ze "meerdere loop()'s" hebben :-\ Leren coden is dan ook niet het precies onthouden wat alles betekend maar vooral de manier van denken. En dat is precies wat ik mis bij de meeste tutorials.*

C is niet zo strikt, daarom vind ik het ook geen prettige programmeertaal.
Oefffff, dan moet je heeeeeeeel ver weg blijven van alle moderne talen! :o Vergeleken met Python, Java, JavaScript, PHP, Lua, Swift etc is C++ enorm strict...

Ik heb ff gecheckt met arduino, maar je kan een defined waarde ook geen waarde toewijzen. Als je doet #define x 5  en later x = 7; dan krijg je ook een compiler fout. Dus daarvoor maakt het niet uit wat je kiest.
Maar wel in de duidelijkheid van de error die je daarmee krijgt :)

Maar dan alsnog. Als je gewoon de syntax aanhoudt en hoofdletters gebruikt voor constantes dan zou je zeggen dat het bijna niet mis kan gaan.
Dat je een foutje maakt met programmeren is dan ook niet zo erg. Je code zo maken dat de compiler goed kan aangeven waar je welke fout gemaakt hebt wel!

@RudyB
En even inhakende op de naamgeving, je wijkt inderdaad aardig af van wat "gebruikelijk" is binnen Arduino. Dat is standaard camelCaseVoorVariabelenEnFuncties en UpperCamelCase voor classes en ook redelijk gebruikelijk voor constantes. Staat je natuurlijk vrij maar kan extra verwarring zijn.

Ik had nog iets geprobeerd en daarmee een argument gevonden om geen const te gebruiken.
Wat zonder fouten compileert is de volgende code. Een lokale variabele, const of geen const, kan dezelfde naam hebben als een globale variabele.
Dat heeft absoluut niets met const te maken ;) Dat is variabele scope. Je kan ook twee niet const variabelen hebben of zelfs ander type met dezelfde naam. Vandaar dat twee dingen belangrijk zijn:
1) Maak alleen dingen global als je dat nodig hebt.
2) Geeft variabele donders duidelijke namen, zeker global.

Overigens is de global variabele ook nog te benaderen door de scope operator te gebruiken:
int x = 5;

void setup(){
  char x = 'a';

  x = 'b'; // kan gewoon
  ::x = 5; //voor de global
}

Ik heb nog een 2e argument om geen const te gebruiken.
In C++ weet ik het niet, maar bij ansi C heeft const bij lokaal gebruik in een functie body een compleet andere functie dan als een globale variabele.
Uhmm, nee :angel: Daar verwar je const met static ;)

Met andere woorden, geen redenen om const te schrappen. Ook al kan ik er inkomen dat je die niet gelijk vanaf het begin gebruikt maar later pas uitlegt. Zeker in het begin moet je nu eenmaal wat dingen "voor waar" aannemen.

Voor we verder werken[...]
Zullen we maar niet proberen 128 in een char te schrijven? ;)

In je tabel gebruik je een punt (.) voor scheiding van duizendtallen. Áls je die scheiding al wil aangeven moet dat met een komma (,) of een spatie.
Eens, niet zo zeer omdat het in de code zo is maar omdat je Engels als taal gebruikt. Daar is een punt het decimaalteken.

En zullen we String ook weg laten ::) Dat is denk ik na delay() het grootste pijnpunt op het Arduino forum :-X


Timo



* En dat lijkt hier niet anders ::) (duikt snel onder de tafel ;D

@RudyB, maar waardeer je werk! Heb er zelf niet de tijd voor om een cursus te schrijven dus daar heb je zeker een streepje voor! Maar denk alleen dat weinig anders doet dan de meeste tutorials:-\ en dat is denk ik jammer voor de moeite die je er in steekt. (y)
Titel: punt of komma ...
Bericht door: RudyB op 28 januari 2019, 13:19:58
Het plaatje is aangepast. Wil er verder geen punt van maken.  :D
Titel: Re: Pret met Arduino
Bericht door: bask185 op 28 januari 2019, 15:15:06
@ Timo,

Klopt ik had const idd door de war gehaald met static, nu bad
Titel: Pret met Arduino 10 Show Cycle Status and Time with Serial.print
Bericht door: RudyB op 31 januari 2019, 13:14:43

Nu we de code werkend hebben, door het juiste gebruik van data types en/of via typecasting, kunnen we verder werken aan onze User Interface. Doel voor deze video is om de status van de dag / nacht cylus weer te geven, aangeschakeld of uitgeschakeld, en om ook de huidige waarde van de dag en nacht tijden weer te geven ... alles dynamich ververst.


Link naar Fun with Arduino 10 Show Cycle Status and Time with Serial.print (https://rudysarduinoprojects.wordpress.com/2019/01/31/fun-with-arduino-10-show-the-day-night-cycle-status-on-the-user-interface/)


(https://up.picr.de/34964832sg.jpg)
Titel: Video 10 weer bereikbaar
Bericht door: RudyB op 31 januari 2019, 15:41:54
Blijkbaar was video 10 een tijdje niet bereikbaar, maar dat is nu hersteld.
Titel: Pret met Arduino 11 Keyboard Input via Serial Read and ParseInt
Bericht door: RudyB op 03 februari 2019, 09:31:21
De User Interface werkt, we worden op ons beeldscherm op de hoogte gehouden van de huidige status waarin de dag / nacht verlichtingsmodule zich bevindt. Nu gaan we de mogelijkheid toevoegen om de cyclustijd te wijzigen via het toetsenbord. De functies die we gaan gebruiken zijn Serial.available(), die vertelt ons dat er nieuwe input is, en Serial.read() of Serial.parseInt() om de ingetikte karakters te lezen.

Link naar Fun with Arduino 11 Keyboard Input via Serial Read and ParseInt (https://rudysarduinoprojects.wordpress.com/2019/02/03/fun-with-arduino-11-data-input-via-keyboard-serial-read-serial-parseint/)


(https://up.picr.de/34986161sw.jpg)
Titel: Pret met Arduino 12 Analog Input, analogRead(), Change Range, map()
Bericht door: RudyB op 07 februari 2019, 11:25:31
Nu we de User Interface via keyboard input werkend hebben gaan we kijken naar een hardware oplossing: een draaiknop. We sluiten een potentiometer aan op een analoge ingang en we lezen hem uit met de analogRead() instructie. Om de range van 0-1023 te converteren naar een range van zeg 1-9 (minuten) voor onze cycle time gebruiken we het map() commando.

Link naar Fun with Arduino 12 Analog Input, analogRead(), Change Range, map()  (https://rudysarduinoprojects.wordpress.com/2019/02/07/fun-with-arduino-12-analog-input-analogread-change-range-map/)


(https://up.picr.de/35016651zo.jpg)
Titel: Pret met Arduino 13 Timer with millis(), no delay(), Multitasking
Bericht door: RudyB op 10 februari 2019, 10:24:07

Tot nu toe hebben we de delay() instructie gebruikt om dag en nacht tijden te generen. De Arduino blokkeert tijdens een delay(), waardoor we geen feedback krijgen als we aan onze potmeter draaien of als we een tijd opgeven via het keyboard. Gelukkig is er een oplossing … we kunnen de interne klok van de Arduino gebruiken, deze telt de milliseconden vanaf het moment dat de Arduino gestart werd. Met de millis() instructie kunnen we zien 'hoe laat het is' waarna we kunnen we besluiten of het tijd is voor actie.

Link naar Fun with Arduino 13 Timer with millis(), no delay(), Multitasking (https://rudysarduinoprojects.wordpress.com/2019/02/10/fun-with-arduino-13-timer-with-millis-no-delay-multitasking/)


(https://up.picr.de/35036320hc.jpg)
Titel: Re: Pret met Arduino
Bericht door: Timo op 10 februari 2019, 11:05:30
En daarmee leer je precies aan hoe nooit millis() te gebruiken voor timing ::) Daar komen dus alle horror verhalen van millis() en overflow vandaan... Gebruik, zoals Blink without delay ook doet:
if(millis() - previousMillis >= Interval){
  previousMillis += Interval;
  //of
  previousMillis = millis();
  //beide hebben voor en nadelen
}
En tadaaa, de overflow speelt geen rol meer.


Timo
Titel: Re: Pret met Arduino
Bericht door: PieterHa op 11 februari 2019, 09:59:43

PreviousMillis heeft hetzelfde probleem met de overflow als de verkeerde variabele definitie wordt toegepast. In beide codes worden de verstreken aantal millis bijgehouden.

Groeten, Pieter
Titel: Re: Pret met Arduino
Bericht door: Jeroen Vreeken op 11 februari 2019, 11:29:27
Nee, het werkt wel aangezien millies en previousmillis allebei overflowen op 32bit. Door ze eerst van elkaar af te trekken krijg je echt het verschil.
Wanneer je echter eerst de nieuwe waarde uit rekent (deze krijgt een overflow) en vergelijkt met de actuele millis waarde (heeft nog geen overflow) gaat de timer te vroeg af.

Stel millis (en onze variabele) zijn maar 4 bit en overflowen van 15 terug naar 0.
Als je nu op tijdstip 13 een timeout van 5 wilt, dan krijg je het volgende:

millies previous delta
13 13 0
14 13 1
15 13 2
0   13 (-13 maar bij een 4 bit type underflowed dat naar:)3
1   13 (-12 ) 4
2   13 (-11) 5
En dan gaat je alarm af

Had je het vergeleken op de foute manier: en eerst timeout berekend krijg je dit:
millis timeout
13  5
En deze gaat dus onmiddelijk af want millis is duidelijk groter dan timeout.
Titel: Re: Pret met Arduino
Bericht door: PieterHa op 11 februari 2019, 11:42:11

Bedankt voor de uitleg.

Groeten, Pieter
Titel: Re: Pret met Arduino
Bericht door: Bert van Gelder op 11 februari 2019, 12:27:04
Pieter,

Vriendelijk verzoek om niet op de CITAAT-knop te drukken als je wilt reageren op het laatste bericht. Want daarmee kopieer je dat laatste bericht in jouw bericht, en staan dus alle berichten dubbel op het forum. Gebruik daarvoor in de plaats de REAGEER-knop.

Met dank!

Gr, Bert
Team moderatoren
Titel: Re: Pret met Arduino
Bericht door: bask185 op 11 februari 2019, 13:18:32
2^32 / (1000 x 60 x 60 x 24) = 49,7 dagen voordat millis() overflowt.

Voor de eind gebruikers, de arduino beginnelingen, is de overflow niet erg relevant, maar ben het wel eens dat je het beter meteen goed kan aanleren.

Een nadeel van millis() is dat je hem nooit kan resetten. Althans niet zonder een functie aan de arduino sourcecode toe te voegen.
Een andere mogelijkheid is een functie te maken die continu checkt of millis() van waarde verandert en daar op in te spelen.


void updateTimers()    // continu in void loop aanroepen
{
  if(millis() != previousMillis) {   // als millis() is veranderd
    previousMillis = millis() ;

    counter1++;                         // hoog 3 counters op die je vrij kan gebruiken in je programma.
    counter2++;
    counter3++;
}

Nu kan je counter1 t/m counter3 gebruiken om je timing dingen te regelen. En je kan er nog meer bijmaken ook.
Als je een van deze counters wilt gebruiken, zet je hem op nul en dan wacht je af wanneer hij groter of gelijk is dan een bepaalde waarde.

In mijn werk software maak ik gebruik van downcounters, structs en arrays en lijkt op:
void updateTimers()
{
  if(millis() != previousMillis) {   // als millis() is veranderd
    previousMillis = millis() ;

    for(int i = 0; i < nCounters; i++){
      if(counter[i].isActive == 1) {     // als counter aanstaat
        if(counter[i].interval > 0) counter[i].interval--;   // decrementeer interval als hij groter is dan 0
        if(counter[i] == 0) {                                         // als interval 0 is
          counter.func();                                                // voer de functie uit
          counter[i].interval = counter[i].reload;              // laadt een nieuwe waarde in interval
        }
      }
    }
  }
}

// dan bedien ik ze met
start(COUNTER1, foo, 500);    // functie foo() wordt nu elke 0,5s uitgevoerd   COUNTER1 is een #define als index voor het struct arrray
// en
stop(COUNTER1);             // stopt de functies         
/*
Toevoegend maak ik ook nog gebruik van een simpel up countertje, is gewoon rete handig
*/

Als je het echt goed wilt doen, wordt de code misschien te ingewikkeld voor de 'intented users'. De volgende stap zou zijn om een array van structs aan te maken ongeveer zoals ik laat zien. Maar voor de doelgroep is mijn 1e voorbeeld misschien praktischer omwille de simpelheid.
Titel: Re: Pret met Arduino
Bericht door: Timo op 11 februari 2019, 13:33:30
@Jeroen Vreeken, bedank, inderdaad dat (y)

Een nadeel van millis() is dat je hem nooit kan resetten.
Waarom zou je dat willen ??? Dan ben je allemaal extra variabelen aan het aanmaken die hetzelfde doen als millis()... Waardoor je elke tik tig variabelen moet aanpassen en previousMillis bijhouden. Kan je het net zo goed direct van millis() afleiden.

En ja, je kunt er strucs of objecten voor maken. Laatste zijn genoeg libraries voor te vinden. Niet allemaal even goed maar idee is duidelijk ;D


Timo
Titel: Re: Pret met Arduino
Bericht door: bask185 op 12 februari 2019, 08:17:54
Goed voor die counter kan je makkelijk array maken icm met constantes. Met 2kb ram heb je toch genoeg geheugen. Ik vind het voordeel van deze counters dat je ook unsigned int kan gebruiken als je process korter is dan 65 seconden en je hebt nooit last van overflows.

Ik vind het namelijk zelf overkill om een unsigned long te gebruiken per knipper functie. Die atmega is ook maar een 8 bit microcontroller. En ik ben zelf sws tegen het gebruik van time stamps zoals we die icm millis() gebruiken.

Maar even iets anders.  Ik bedacht me opeens dat het voor de gemiddelde modelbouwer die met arduino wat lichtjes laat knipperen een resolutie van 1ms misschien een beetje overkill is. Dus ik zat na te denken en schreef dit ff:

bool PIGS_CAN_FLY = true;
byte counter;

void updateTimers()
{
if(PIGS_CAN_FLY) {
if(millis() & NINTH_BIT_MASK){
PIGS_CAN_FLY = false;
}
}

else {
if((millis() & NINTH_BIT_MASK) == 0){
PIGS_CAN_FLY = true;
counter++;                     // elke 1024ms wordt counter opgehoogd
}
}
}

Ik heb het niet getest, maar het zou volgens mij moeten werken ???. Ik test telkens het 9e bitje van millis(). Deze klapt elke 512ms om. Met de boolean PIGS_CAN_FLY zorg ik er alleen voor dat ik op de neergaande 'puls' van dat bitje een of meerdere counters in/de-crementeren. Dat gebeurt elke 1024ms.

Voordelen zijn dat je geen unsigned long variabelen meer hoeft te gebruiken. Je kan je counter(s) met bytes uit kan voeren voor processen niet langer dan ~262 secondes. (256*1024/1000). Je kan ook andere bits testen voor nog grotere intervallen zoals een dag/nacht overgang.

Nadeel is dat je niet op precies een seconde zit.

Beste blijft nog altijd wat ik eerder zei, maak je eigen library of kies er een uit! Dan is de eindgebruiker het beste af.
Die code die ik nu uitpoep is misschien ook te ingewikkeld voor de doelgroep.

Waar je nu nog steeds mee zit, is dat je void loop nu blijft groeien met 5 regels voor elke knipperende led.

Als we nu met les 14 leren hoe functies werken...  (y) (y) (y)  :angel:

Bas
Titel: Re: Pret met Arduino
Bericht door: Timo op 12 februari 2019, 08:54:56
Goed voor die counter kan je makkelijk array maken icm met constantes. Met 2kb ram heb je toch genoeg geheugen. Ik vind het voordeel van deze counters dat je ook unsigned int kan gebruiken als je process korter is dan 65 seconden en je hebt nooit last van overflows.
Grappig, meeste mensen vinden 2k juist weinig ;D Maar ook zonder counters kan je prima uint16 gebruiken ;) En overflows zijn niets slechts ::)

Beste blijft nog altijd wat ik eerder zei, maak je eigen library of kies er een uit! Dan is de eindgebruiker het beste af.
Zoek dan wel een goede. Er zijn namelijk heeeel veel tenenkrommende slechte timing libraries. Maar aan de andere kant, denk eigenlijk niet dat de doelgroep er beter af mee is. Timing en het niet blokkeren / uit zijn neus laten vreten van de processor is een van de meest essentiële aspecten als je mensen microcontrollers wilt laten programmeren. En denken in een continue flow blijkt één van de meest voorkomende problemen op het Arduino forum. En mensen de klok kijken analogie geven werkt meestal aardig goed.


Timo

PS Geen persoonlijke kritiek! Gewoon hoe ik het ervaar / over denk. Wil hier geen wellus-nietus discussie / ruzie :police:
Titel: Re: Pret met Arduino
Bericht door: meino op 12 februari 2019, 12:33:17
Stel millis (en onze variabele) zijn maar 4 bit en overflowen van 15 terug naar 0.
Als je nu op tijdstip 13 een timeout van 5 wilt, dan krijg je het volgende:

millies previous delta
13 13 0
14 13 1
15 13 2
0   13 (-13 maar bij een 4 bit type underflowed dat naar:)3
....

Misschien had je ook even moeten vermelden dat dit werkt omdat millis() een unsigned long retourneert. Dat is erg essentieel, voor ons, gepokt en gemazeld, - is dat vanzelfsprekend. Maar voor degenen waarvoor dit bedoeld is, is dat waarschijnlijk niet zo vanzelfsprekend.

Groet Meino
 
Titel: Pret met Arduino 14 Day Night Cycle with millis(), no Delay, Direct Feedback
Bericht door: RudyB op 14 februari 2019, 10:32:09
Nu we in video 13 gezien hebben hoe we de delay() kunnen vervangen door de millis() klok krijgen we directe on screen feedback wanneer de cycle time door de gebruiker wordt aangepast. Ook zal de cycle nu direct stoppen en het licht uigaan wanneer de aan/uit schakelaar op uit gezet wordt.

We kunnen we onze Automatische Dag Nacht Verlichting Unit nu afronden. Voor het feit dat we pas gestart zijn met Arduino heeft onze unit heel aardige specificaties:
- Configureerbare timing, keyboard of analoog in, met on screen display
- Een optie om random tijd toe te voegen om het wat 'levendiger' te maken
- On screen weergave van de aan/uit en dag/nacht status met de actuele cyclustijd.

Link naar Fun with Arduino 14 Day Night Cycle with millis(), no Delay, Direct Feedback (https://rudysarduinoprojects.wordpress.com/2019/02/10/fun-with-arduino-14-day-night-cycle-with-millis-no-delay/)


(https://up.picr.de/35064128sm.jpg)
Titel: Pret met Arduino 15 LED Dimmer, analogWrite(), Pulse Width Modulation
Bericht door: RudyB op 17 februari 2019, 10:45:34
We hebben de analogRead() functie gebruikt om de spanning op een potentiometer te lezen. De Arduino beschikt ook over de tegenovergestelde functie: analogWrite(). Deze naam is enigszins misleidend. Bij analogRead() wordt een 10 bit A/D converter gebruikt, maar de Arduino beschikt niet over een D/A converter ... er is geen echt analoog uitgangssignaal.

De techniek die gebruikt wordt is pulsbreedte modulatie. Hierbij wordt een digitaal signaal met hoge frequentie aan/uit geschakeld. Als het aangesloten apparaat te traag is om de snelheid van de pulsen te volgen, dan 'ziet' het apparaat het gemiddelde van de hoog/laag pulstijden. Dit geldt ook voor LED licht ... hoewel LEDs snel genoeg zijn om de schakelfrequentie te volgen, zijn onze ogen + hersenen dat niet en zien we het gemiddelde lichtniveau.

Link naar Fun with Arduino 15 LED Dimmer, analogWrite(), Pulse Width Modulation (https://rudysarduinoprojects.wordpress.com/2019/02/17/fun-with-arduino-15-led-dimmer-with-pulse-width-modulation-analogwrite/)

(https://up.picr.de/35088670bd.jpg)

Titel: Re: Pret met Arduino
Bericht door: gvandersel op 18 februari 2019, 11:21:36
Is er  ook een manier om de pulsfrequentie in te stellen? Behalve de timers opnieuw te configureren.

Groet,

Gerard van der Sel.
Titel: Re: Pret met Arduino
Bericht door: meino op 18 februari 2019, 11:53:58
Dag Gerard

voor zover ik weet, lukt dat alleen door de timers te manipuleren, 2 artikeltjes hierover
https://playground.arduino.cc/Code/PwmFrequency (https://playground.arduino.cc/Code/PwmFrequency) en https://playground.arduino.cc/Main/TimerPWMCheatsheet (https://playground.arduino.cc/Main/TimerPWMCheatsheet)

Overigens heb ik zelf dit nog niet uitgeprobeerd.

Groet Meino
Titel: Re: Pret met Arduino
Bericht door: Timo op 20 februari 2019, 09:55:41
@gvandersel, nee, niet bij de "standaard" 8-bit Arduino's. Bij andere (onofficiële) zoals de ESP32 wel. Er zijn wel libraries voor de 8-bitters die het kunnen maar niet via de standaard HAL en het blijft timers instellen (en dus beperkte frequenties/resoluties). Vooral de PWM CheatSheet is erg handig om het in te stellen :) Voor projecten met led zet ik het altijd op 4kHz om knipper-effecten* te verminderen.


Timo

* Nee, 490Hz zie je niet direct, dat klopt. Maar dingen die bewegen zoal stromend water zien er altijd een beetje raar uit dan. ;D
Titel: Pret met Arduino 16 LED Dimming with Fade, analogWrite(), millis()
Bericht door: RudyB op 21 februari 2019, 11:59:11
Met analogWrite() kunnen we LEDs dimmen. Als we de dim factor veranderen over tijd kunnen we een geleidelijk 'fade' effect maken. Dit is leuk voor bijvoorbeeld verlichting onder de keukenkastjes, of voor een modelbaan LED strip verlichting met een heel geleidelijke ovegang van nacht naar dag. En ook voor de rood/groen overgang van seinen langs de baan geeft een fade effect net even dat kleine beetje extra 'eye candy'.


Link naar Pret met Arduino 16 LED Dimming with Fade, analogWrite(), millis() (https://rudysarduinoprojects.wordpress.com/2019/02/21/fun-with-arduino-16-led-strip-fading/)


(https://up.picr.de/35120672uf.jpg)
Titel: Pret met Arduino 17 Railway Crossing, State Transition Diagram, switch()
Bericht door: RudyB op 25 februari 2019, 10:32:30
We staan aan de start van een nieuw Arduino project: een automatische spoorwegovergang.

Het systeem bestaat uit een aantal componenten: treindetectie (optisch), knipperende lampen ('blink' met een twist) en een bewegende slagboom (servo motor).

We bekijken een manier om dit soort systemen te specificeren en een manier om de specificaties om te zetten in code, via een stappenplan, zonder onze grijze cellen al te zwaar te hoeven belasten.


Link naar Fun with Arduino 17 Railway Crossing, State Transition Diagram, switch() (https://rudysarduinoprojects.wordpress.com/2019/02/22/fun-with-arduino-17-railway-crossing-state-transition-diagram-switch-case/)


(https://up.picr.de/35150263is.jpg)
Titel: Re: Pret met Arduino
Bericht door: Eegtrain op 25 februari 2019, 15:01:49
Kijk, dit zien we nu graag.
Wel een idee voor links op de "Spoormuseum" bakken. Dan snel eens een Ahob printen.
 (y)
Volgens mij komt er nog veel meer fun met Arduino aan.

Groeten Jake
Titel: Re: Pret met Arduino
Bericht door: Haas67 op 25 februari 2019, 15:14:07
Het wordt steeds leuker nu  (y)
Ben vooral geintereseerd in de optical sensors.
Tot nu toe geprobeerd met FC-95 en TCRT5000, maar die lijken teveel last te hebben van omgevingslicht (of juist het ontbreken ervan).
Ga zo door !
Titel: Re: Pret met Arduino
Bericht door: Timo op 27 februari 2019, 08:47:51
@Haas67, de FC-95 ken ik niet (en kan ik niet vinden). De TCRT5000 heeft inderdaad alleen maar een comparator aan boord. Om (meer) immuun te worden voor omgevingslicht moet kan 8) je gebruik maken van modulatie. Bijvoorbeeld met de IS471F (http://www.floodland.nl/aim/info_lichtsluis_1.htm) of de CNY70/LM567 (https://www.opendcc.de/s88/s88_reflex/Schaltplan_IR_Reflex_CNY70_LM567.gif).


Timo
Titel: Re: Pret met Arduino
Bericht door: Haas67 op 27 februari 2019, 09:29:58
Die FC-95 was een fout van mijn kant. Ik bedoel de FC-51 hier op Ali (https://nl.aliexpress.com/item/10-PCS-SAMIORE-ROBOT-IR-Infrarood-Obstakel-vermijden-Sensor-Module-Smart-Auto-Robot-3-draad-Reflecterende/32831301678.html?spm=a2g0s.9042311.0.0.66434c4dyfJaGi).
Met de TCRT5000 bedoel ik de losse sensor, zonder comparator hier op Ali (https://nl.aliexpress.com/item/10-STKS-TCRT5000L-TCRT5000-Reflecterende-Optische-Sensor-Infrarood-950mm-5-V-3A-sensor-infravermelho/32832150144.html?spm=a2g0s.9042311.0.0.66434c4dyfJaGi).
Dat van die modulatie ga ik zeker nazoeken. Bedankt voor de tip.

Titel: Re: Pret met Arduino
Bericht door: Timo op 27 februari 2019, 11:32:29
Ah, vandaar ;D De FC-51 rust alleen maar op een comperator. Met een losse IR led en ontvanger (zoals de TCRT5000) ben je natuurlijk vrij om mee te doen en laten wat je wilt :) Maar neem aan dat je deze ook gewoon hebt gebruikt met de Arduino al "comparator". Je zou de Arduino dit ook met modulatie kunnen laten doen maar dan moet je waarschijnlijk met de timers aan de slag (of een library vinden die dit voor je doet ;D).


Timo
Titel: Pret met Arduino 18 Railway Crossing, Servo Motor to Operate the Gate
Bericht door: RudyB op 28 februari 2019, 10:45:46
In deel 2 van het spoorwegovergangproject gaan we de servo motor aansluiten en gaan we hem besturen vanuit de Arduino. In de video is de slagboom direct op de motoras gemonteerd. In de praktijk zal de motor waarschijnlijk onder de plank gemonteerd worden en wordt de slagboom bediend via een metalen staafje door een gat in de plank. Op welke manier de aandrijving ook geschiedt ... we moeten in staat zijn de juiste de servo hoeken af te regelen. Daarom maken we een Arduino sketch waarmee we de servo hoeken kunnen 'tunen' zodat we de gevonden hoeken later over kunnen nemen in de definitieve code.


Link naar Fun with Arduino 18 Railway Crossing, Servo Motor to Operate the Gate (https://rudysarduinoprojects.wordpress.com/2019/02/23/fun-with-arduino-18-railway-crossing-servo-motor-to-operate-the-gate/)


(https://up.picr.de/35173980gt.jpg)
Titel: Re: Pret met Arduino
Bericht door: Haas67 op 28 februari 2019, 12:19:43
@RudyB: Zou je zodra de Servo in de gewenste positie staat, de servo niet kunnen/moeten ontlasten door een servo.detach() te doen ?
Zie ook hier (http://www.modsbyus.com/how-to-properly-detachturn-off-a-servo-with-arduino/).
Titel: RudyB
Bericht door: RudyB op 28 februari 2019, 13:05:25
Is niet nodig. Soms blijft een servo 'brommen', dan kan je door het stuursignaal eraf te halen het gebrom stoppen. Om ook nog de voeding eraf te koppelen, zoals beschreven in de link die je stuurde, kan misschien interessant zijn voor toepassingen met batterij voeding.
Titel: Re: Pret met Arduino
Bericht door: Haas67 op 28 februari 2019, 14:43:31
Het stuursignaal eraf halen is denk ik wat servo.detach() doet, maar daar heb je (nog) geen gebruik van gemaakt in je video.
Bovendien wordt in het voorbeeld dat ik aanhaalde niet de 5v voeding eraf gehaald, maar het 5v stuursignaal.
Zie de quote "When you do servo.detach(); you turn off the 5 volt pulses that control the servos position. "
Titel: Re: Pret met Arduino
Bericht door: René 4312 op 28 februari 2019, 19:57:42
Waarom zou je de spanning of stuurpulsen van een servo willen halen? Servo die niet beweegt vreet amper vermogen en als je de pulsen lekker laat lopen corrigeert de servo zijn positie ook nog als er een preisertje die voor de overweg staat te wachten de slagboom omhoog probeert te duwen.  ;D

René
Titel: Re: Pret met Arduino
Bericht door: Timo op 01 maart 2019, 09:30:40
@René 4312, en daarmee spreek je dus jezelf tegen ;) Zolang de servo kracht moet leveren gebruikt deze stroom. .detach() is inderdaad niet noodzakelijk maar kan wel gebrom schelen (omdat de servo denkt continue een klein van positie te moeten wisselen). Vandaar dat het vaak wel gedaan wordt.

Servo uit zetten is zelden nodig en zitten wat haken en ogen aan. Zonder stuursignaal is verbruik minimaal.

En voetnoot voor servo's, gebruik een goede voeding voor de 5V van de servo.


Timo
Titel: Re: Pret met Arduino
Bericht door: CeesV op 05 maart 2019, 14:37:10
Beste Rudy,
Bij het gedownloade programma voor mijn spoorbomen loop ik vast bij het uploaden nl,Foutmelding kopiëren: expected unqualified - id before "switch"
Enig idee wat er hier fout loopt?
Hoor graag van je.
mvg, Cees Vermaas
Titel: Re: Pret met Arduino
Bericht door: Haas67 op 05 maart 2019, 15:06:43
Je moet alleen het laatste blok code kopieren, waarbij de switch() statements binnen de loop() functie staan.
Titel: Gedownload?
Bericht door: RudyB op 05 maart 2019, 15:40:34
Hallo Cees. Misschien kan je aangeven wat je precies hebt 'gedownload', en waar vandaan? Als ik dat weet, dan moet het daarna op te lossen zijn.
Titel: Pret met Arduino 19 Railway Crossing Train Detection with Optical Sensor
Bericht door: RudyB op 07 maart 2019, 11:21:29
Er zijn diverse methoden voor treindetectie, zoals rail stroom meting, of een magneetje onder de trein dat een reed switch triggert, of dmv een optische sensor, of nog andere, meer exotische methoden. In deze video worden twee TCRT5000 IR sensoren gebruikt, zonder special reden, alleen maar omdat ik ze had liggen en omdat ze gemakkelijk op te nemen waren in een testopstelling.

Als we de sensors dan toch aangesloten en aan de praat hebben, maken we een treinsnelheidsmeter als klein intermezzo.


Link naar Fun with Arduino 19 Railway Crossing Train Detection with Optical Sensor (https://rudysarduinoprojects.wordpress.com/2019/03/07/fun-with-arduino-19-railway-crossing-train-detection-optical-sensor/)


(https://up.picr.de/35224667gx.jpg)
Titel: Re: Pret met Arduino
Bericht door: Haas67 op 07 maart 2019, 13:00:19
Bedankt Rudy, voor de tip over de "Beam Interrupt Sensor" in deze video.  (y)
Ik heb een heel aantal tcrt5000 sensors liggen die veel te gevoelig zijn voor omgevingslicht als ze als "Reflective Sensor" gebruikt worden.
Hopelijk gaat dit beter werken.
In ieder geval weer wat leuks te doen dit weekend.  ;D

Titel: Re: Pret met Arduino
Bericht door: RudyB op 07 maart 2019, 13:25:26
We hebben ze op de beam interrupt manier in gebruik in een schaduwstation ... werkt prima.
Titel: Re: Pret met Arduino
Bericht door: Haas67 op 07 maart 2019, 14:19:00
Ik wil ze gaan gebruiken voor een keerlus. 2 sensoren, 2 relais en een ATTiny85.

Titel: Pret met Arduino 20 Railway Crossing Putting it all Together
Bericht door: RudyB op 10 maart 2019, 12:02:10

In de voorgaande drie videos hebben we de losse onderdelen bekeken: knipperlicht, servo voor de slagboom, sesnors voor treindetectie. In deze video voegen we alles samen tot een werkende bewaakte overweg. Het State Transition Diagram dient als uitgangspunt en we maken de software op basis daarvan in 5 eenvoudige stappen.


Link naar Fun with Arduino 20 Railway Crossing Putting it all Together (https://rudysarduinoprojects.wordpress.com/2019/03/10/fun-with-arduino-20-railway-crossing-part-4-putting-it-all-together/)

Railway Crossing UK version (https://rudysarduinoprojects.wordpress.com/2019/03/10/fun-with-arduino-21-railway-crossing-uk/)



(https://up.picr.de/35246191mm.jpg)
Titel: Re: Pret met Arduino
Bericht door: tuurtje op 10 maart 2019, 13:01:59
Hoi Rudy,

Reuze bedankt hiervoor  (y)

Ik heb alleen nog een vraag is het mogelijk om te starten als het begin van de trein de eerste sensor passeert en de laatste wagon de tweede sensor passeert?

Groetjes

Arthur
Titel: Re: Pret met Arduino
Bericht door: RudyB op 10 maart 2019, 14:59:25
In software is alles mogelijk. De Arduino weet natuurlijk niet wat de laatste wagon is ... maar een manier om dat te checken is met een wachttijd. Bij een sensor overgang kan een timer starten ... als er tot het eind van de timer geen nieuwe verandering van de sensor was, dan was dit de laatste wagon. O.i.d ... ik moet er even over nadenken.
Titel: Re: Pret met Arduino
Bericht door: TEE-RAM op 11 maart 2019, 15:29:01
Rudy,
Bedankt, werkt heel leuk. Ga mij verder verdiepen in arduino. (y) (y) (y)
Wim
Titel: Pret met Arduino 22 Step Sequencer for LEDs
Bericht door: RudyB op 14 maart 2019, 15:12:35
Een politieauto, brandweerauto of ambulance met knipperende lichten kan op een layout wat extra leven in de brouwerij geven. De uitdaging is om niet elke keer nieuwe code te hoeven schrijven als we een ander knipperpatroon willen. De uitdaging is om dezelfde software te gebruiken en alleen het aantal LEDs, het aantal stappen en het patroon van knipperen te configureren. Zou dat lukken? Ja natuurlijk lukt ons dat ...

Link naar Fun with Arduino 22 Step Sequencer for LEDs (https://rudysarduinoprojects.wordpress.com/2019/03/14/fun-with-arduino-22-flashlights-with-a-step-sequencer-array-for-loop/)


(https://up.picr.de/35275550sn.jpg)
Titel: Re: Pret met Arduino
Bericht door: bask185 op 14 maart 2019, 15:34:05
byte sequencer[NUM_LEDS][NUM_STEPS] = {
  1,1,1,1,0,0,0,0,   // LED 1
  1,1,0,0,1,1,0,0,   // LED 2
  1,0,1,0,1,0,1,0 }
vraagje, moeten hier geen extra accolades om de regels heen?
zoals:

byte sequencer[NUM_LEDS][NUM_STEPS] = {
  {1,1,1,1,0,0,0,0},   // LED 1
  {1,1,0,0,1,1,0,0},   // LED 2
  {1,0,1,0,1,0,1,0} }

Ander vraagje. Hoewel op dit niveau nog niet echt significant, je gebruikt tamelijk veel geheugen voor je arrays.
Om een factor 8 geheugen te besparen kan je je arrays veranderen in bijvoorbeeld unsigned int of long zoals:
unsigned long sequence1 = 0b10010001000110001001000100011000

In je loopje kan je dan met >> en & operators hetzelfde effect bereiken.

for(n=0;n<32;n++) {
  byte bitje = (sequence1 >> j) & 1; // heb dit ff uit mn pols geschud.

  digitalWrite(ledPin,bitje);
}
Bij de eerst iteratie is n 0 en dan pak je alleen het achterste bit, bit0. De volgende iteratie worden alle bits met 1 opgeschroven naar rechts en dan wordt er alleen naar dat bitje gekeken.

Het is ook niet al te ingewikkeld voor onze eindgebruiker.

Het verschil in geheugen voor deze 32 bits bedraagt 28 bytes.

also. Omdat jij je arrays meteen initialiseert is het onnodig om de groottes mee te geven.
Bij "byte sequencer[NUM_LEDS][NUM_STEPS] = {"
zijn NUM_LEDS en NUM_STEPS optioneel.

P.S. ik weet niet of er bij de initialisatie van 'bitje' nog een cast naar byte nodig is. Zou zomaar eens kunnen dat de compiler gaat klagen, maar dat weet ik zo niet.
Titel: Re: Pret met Arduino
Bericht door: Timo op 15 maart 2019, 09:23:43
@bask185, voor de compiler maakt het niet zo uit, voor overzicht is extra haken wel aan te raden.

En inderdaad, een bool als byte opslaan is erg hongerig. Nu reserveert de AVR compiler voor een bool ook een heel word (aka, een byte) maar het is in ieder geval type safe en goed gebruik om altijd het kleinst mogelijke te gebruiken.

Dus jij ook ;) En als je de hoeveelheid bit-foo wilt verminderen kan je ook bitRead() gebruiken (ook al doet die hetzelfde :D)

Ik snap alleen wel dat je niet gelijk aan de bit-foo wilt beginnen maar het dan als bool array definiëren is wel het minimale.

also. Omdat jij je arrays meteen initialiseert is het onnodig om de groottes mee te geven.
Bij "byte sequencer[NUM_LEDS][NUM_STEPS] = {"
zijn NUM_LEDS en NUM_STEPS optioneel.
Niet correct ;) Als je dat probeert krijg je:
declaration of 'test' as multidimensional array must have bounds for all dimensions except the first
P.S. ik weet niet of er bij de initialisatie van 'bitje' nog een cast naar byte nodig is. Zou zomaar eens kunnen dat de compiler gaat klagen, maar dat weet ik zo niet.
Nee, gaat impliciet :)


Timo
Titel: Re: Pret met Arduino
Bericht door: bask185 op 15 maart 2019, 13:59:40
hmm nooit geweten dat je bij multidimensionele arrays geen extra haakjes hoef te zetten  ???, dat vind je echt terug in elke tutorial. Dat verklaart meteen wel waarom je dan wel de groottes moet opgeven :)

Titel: Re: Pret met Arduino
Bericht door: Timo op 20 maart 2019, 21:55:25
Dat komt omdat het voor de definitie van een array niet echt uit maakt, alleen voor de grote ervan.

byte a[][2] = {{1, 2}, {3, 4}, {5, 6}};
//of
byte b[] = {1, 2, 3, 4, 5, 6};
Zal naar exact hetzelfde compilen, namelijk 4 opvolgende geheugenadressen gevuld met 1, 2, 3 en 4. Vandaar ook dar je in C/C++ zonder waarschuwing buiten een array kunt lezen/schrijven.

Voor het lezen doet de compiler eigenlijk weer hetzelfde. Je kunt 'b' ook benaderen als
b[2];Omdat je altijd terug kunt naar een dimensie omdat het nu eenmaal zo in het geheugen staat.

Ook kun je 'a' als parameter gebruiken voor een functie als:
void foo(byte bar[2][3]){
  bar[1][0]; //geeft 3
}
foo(a);
Voor de compiler is zowel a als b simpelweg een pointer naar een byte. Deze pointer wordt opgehoogd met het product van de grote zoals aangegeven bij definitie. Wat dus in geval van een functie niet dezelfde definitie hoeft te zijn.

Dus je mag ook een functie maken als
void foobar(byte *p)
//en dan
foobar(a);
//of
foobar(b);


Timo
Titel: Pret met Arduino 23 Neopixel Addressable LEDs, WS2812, struct{...}
Bericht door: RudyB op 21 maart 2019, 14:49:44
Neopixels zijn adresseerbare LEDs met een ingebouwd IC dat zorgt voor datacommunicatie over slechts 1(!) draad en voor de pulsbreedtemodulatie  van de RGB(+W) LEDs. Deze data lijn is verbonden met een Arduino output. Zo kunnen we de kleur en de helderheid van elke individuele LED besturen. Met super simpele bedrading kunnen we zo bijvoorbeeld meerdere huisjes in een dorpje voorzien van verlichting, ieder met zijn eigen kleur en helderheid en timing ... net als in het echt.

De video miste tijdelijk in de blog post ... dat is nu hersteld.


Link naar Fun with Arduino 23 Neopixel Addressable LED, WS2812, struct{...} (https://rudysarduinoprojects.wordpress.com/2019/03/21/fun-with-arduino-23-neopixel-addressable-leds-with-ws2812-ic/)


(https://up.picr.de/35325786gn.jpg)
Titel: Pret met Arduino 24 Neopixel Sequencer with Flexible Timing and Colors
Bericht door: RudyB op 29 maart 2019, 11:59:38

In de vorige video hebben we een step sequencer gemaakt voor adresseerbare LEDs (Neopixel). Het mooie van die sequencer is dat de stappen op een visuele manier kunnen worden opgegeven via een reeks enen en nullen: 1,1,1,1,0,0,0,0,1,1,0,0,1,1,0,0. Het nadeel van die werkwijze is dat de kleur per LED vast staat en dat de intervaltijd vast staat. De sequencer in deze video heeft volledige flexibiliteit, elke stap heeft zijn eigen timing en LED kleur.


Link naar Fun with Arduino 24 Neopixel Sequencer with Flexible Timing and Colors (https://rudysarduinoprojects.wordpress.com/2019/03/29/fun-with-arduino-24-neopixel-sequencer-with-flexible-timing-and-colors/)


(https://up.picr.de/35387660po.jpg)
Titel: Pret met Arduino 25 Rotary Encoder with Switch
Bericht door: RudyB op 05 april 2019, 14:23:05

Een rotary encoder heeft het formaat van een potientiometer, maar het is een volledig digitale unit die pulsen afgeeft, draairichting informatie geeft, en die ook een (druk)schakelaar bevat. Als we de encoder aansluiten op de Arduino, kunnen we door aan de knop te draaien de waarde van een variabele wijzigen. De variable kan gebruikt worden om wat dan ook te doen, bijvoorbeeld de lichtsterkte van een LED(strip) regelen, of de hoek van een servomotor aanpassen.

Link naar Fun with Arduino 25 Rotary Encoder with Switch (https://rudysarduinoprojects.wordpress.com/2019/04/05/fun-with-arduino-25-rotary-encoder-with-switch/)


(https://up.picr.de/35440500dh.jpg)
Titel: Re: Pret met Arduino
Bericht door: Jip op 05 april 2019, 16:23:04
Interessante serie. Ga je ook iets met servo's en wisselaansturing doen?
Groet Johanna
Titel: Re: Pret met Arduino
Bericht door: NTeering op 05 april 2019, 16:34:15
Hallo Jip-Johanna,

Voor servo's en Arduino's kun je hier alles vinden.

https://www.arcomora.com/mardec (https://www.arcomora.com/mardec) of https://forum.beneluxspoor.net/index.php?topic=68257.new&topicseen#new (https://forum.beneluxspoor.net/index.php?topic=68257.new&topicseen#new)

Mvg
Nico
Titel: Re: Pret met Arduino
Bericht door: RudyB op 11 april 2019, 11:11:06
@Jip: toevallig gaat de volgende video over het afregelen van een servo. Binnenkort maken we ook een DCC accessory decoder en een DCC servo decoder.
Titel: Pret met Arduino 26 Tune a Servo with a Rotary Encoder
Bericht door: RudyB op 11 april 2019, 11:16:07
In de vorige video hebben we software gemaakt om een rotary encoder uit te lezen: pulsen, richting en drukknop. We gaan dat nu gebruiken om een servo motor af te regelen.

Bij elke constructie waar we een servo motor gebruiken om iets te bewegen zal de minimum en maximum hoek van de servo gevonden moeten worden waarbij de constructie precies dat doet wat we willen. In deze video gaan we een 'servo tuner' bouwen waarmee we die hoeken kunnen vinden.

Link naar Fun with Arduino 26 Tune a Servo with a Rotary Encoder (https://rudysarduinoprojects.wordpress.com/2019/04/11/fun-with-arduino-26-tune-a-servo-with-a-rotary-encoder/)


(https://up.picr.de/35486094lg.jpg)
Titel: Pret met Arduino 27 Rotary Encoder Slow / Fast Recognition
Bericht door: RudyB op 18 april 2019, 10:38:59
De 'Servo Tuner' die we in de vorige video gemaakt hebben kon nog verbeterd worden met een aantal functies:
1: Herkenning van snel of langzaam roteren, waarmee we de motor kleine of grote stappen kunnen laten maken.
2: Herkenning van kort of lang indrukken van de drukknop, waarmee we de motor naar de min/max hoek kunnen sturen, of naar het midden.

In deze video gaan we deze functies toevoegen.

Op de blog staat ook code om de Servo Tuner te bedienen met een draadje, of met drukknoppen, zodat hij ook gebruikt kan worden als je niet in bezit bent van een rotary encoder.


Link naar Fun with Arduino 27 Recognize Slow / Fast Rotation of Rotary Encoder (https://rudysarduinoprojects.wordpress.com/2019/04/18/fun-with-arduino-27-rotary-encoder-recognize-slow-or-fast-rotation/)


(https://up.picr.de/35540935gm.jpg)
Titel: Pret met Arduino 28 Use an External Editor like Notepad++
Bericht door: RudyB op 25 april 2019, 11:25:38
Voor het schrijven van code die iets langer dan een paar regels, is het de moeite waard om een andere editor te gebruiken. De standaard Arduino IDE editor 'does the job', maar ook niet meer dan dat. Er zijn editors die veel meer mogelijkheden hebben en die daarmee het schrijven van code plezieriger en efficienter maken.

Link naar Fun with Arduino 28 Use an External Editor like Notepad++ (https://rudysarduinoprojects.wordpress.com/2019/04/25/fun-with-arduino-28-use-an-external-editor-like-notepad/)


(https://up.picr.de/35602399oy.jpg)
Titel: Re: Pret met Arduino
Bericht door: Robert E op 25 april 2019, 20:00:15
Citaat
Er zijn editors die veel meer

Ik gebruik tegenwoordig Sloeber...

Sloeber is een Eclipse plugin (of je download gelijk hele pakket zonder plugin gedoe) met geïntegreerde Arduino ondersteuning voor flashen en al..

Ook ondersteuning voor andere Arduino platformen zoals bijv  STM32, ESP8266

https://eclipse.baeyens.it/

Mvg

Robert
Titel: Pret met Arduino 29 DCC Accessory Decoder
Bericht door: RudyB op 06 mei 2019, 12:05:23
Met behulp van een heel klein beetje extra hardware kan de Arduino ingezet worden als DCC decoder, met een prijskaartje dat bijna 10x lager ligt dan commercieel verkrijgbare decoders.

In deze video maken we een DCC Accessory Decoder. In de volgende video maken we een DCC Servo Decoder. Natuurlijk kan je ook Nico's MARDEC (https://www.arcomora.com/) gebruiken.


Link naar Fun with Arduino 29 DCC Accessory Decoder (https://rudysarduinoprojects.wordpress.com/2019/05/06/fun-with-arduino-29-dcc-accessory-decoder/)


(https://up.picr.de/35692729rd.jpg)
Titel: Re: Pret met Arduino
Bericht door: bask185 op 06 mei 2019, 14:05:55
Wil je stiekem niet een tussen lesje invoegen waarbij je misschien wat standaard C(++) dingetjes uitlegt?? Volgens mij heb je het concept "functie" nog niet uitgelegd terwijl je wel ontzettend veel functies gebruikt. Functies zijn zo'n beetje de basis van alles. En nu maak je een array van structs maar er wordt niet uitgelegd wat een struct precies is (nu heb ik niet naar de video geluisterd omdat ik ook maar in de pauze op werk zit). Ik snap wel dat het doel is om dummy's te leren hoe ze bepaalde resultaten kunnen bereiken met een arduino en niet zozeer mensen wilt leren programmeren maar desalniettemin, functies zijn bijna het belangrijkste wat er is.

Je doet nu een soort van "aapjes" (no offense intended) truukjes leren om een bepaald resultaat te bereiken, dit is opzich niet een slecht iets, want "it get's the job done". Maar een beetje uitleg over wat het precies is, wat ze aan het doen zijn, kan levens zo veel makkelijker maken. Een beetje structuur in de vorm van functies, een beetje uitleg over waarom je een array van structs gebruikt. Nu kunnen mensen wel je code overnemen en kleine aanpassingen er in fietsen maar snappen ze misschien niet wat ze precies doen en waarom ze dat doen. En als ze wel weten wat ze ongeveer doen dan wordt het makkelijker om dingen aan te passen of om zelf dingen te bedenken.
Titel: Pret met Arduino 30 DCC Servo Decoder
Bericht door: RudyB op 13 mei 2019, 11:56:48

We kunnen de Accessory Decoder van de vorige video uitbreiden met een paar stukjes code om een servo motor aan te sturen en we hebben een gecombineerde Accessory + Servo decoder. 

Natuurlijk kan je ook Nico's MARDEC gebruiken.


Link naar Fun with Arduino 30 DCC Servo Decoder (https://rudysarduinoprojects.wordpress.com/2019/05/13/fun-with-arduino-30-dcc-servo-decoder/)


(https://up.picr.de/35744851vf.jpg)
Titel: Pret met Arduino 31 Stepper Motor with 4 Pulse Driver
Bericht door: RudyB op 23 mei 2019, 12:20:17
Voor sommige toepassingen is het fijn om een stappenmotor te gebruiken. Bijvoorbeeld voor het langzaam laten draaien van een windmolen, of voor het positioneren van een draaischijf, een translatietafel, of een treinlift.

In deze video sluiten we een zeer goedkope (< €2,-) stappenmotor met driver aan op onze Arduino en laten hem draaien. In volgende video's voegen we functies toe als draairichting, snelheidregeling en positioneren en we bekijken ook stevigere motoren en drivers.

Link naar Fun with Arduino 31 Stepper Motor with 4 Pulse Driver (https://rudysarduinoprojects.wordpress.com/2019/05/23/fun-with-arduino-31-stepper-motor-with-4-input-driver-using-a-function/)

(https://up.picr.de/35817901ro.jpg)
Titel: Pret met Arduino 32 Stepper Motor Change Direction and Control Speed
Bericht door: RudyB op 31 mei 2019, 11:10:27

In de vorige video hadden we de stappenmotor aan het draaien. In deze video voegen we twee functies toe: draairichting en snelheid.

Link naar Fun with Arduino 32 Stepper Motor Change Direction and Control Speed (https://rudysarduinoprojects.wordpress.com/2019/05/31/fun-with-arduino-32-stepper-motor-change-direction-and-control-speed/)


(https://up.picr.de/35883789dh.jpg)
Titel: Re: Pret met Arduino
Bericht door: bask185 op 06 juni 2019, 08:43:59
Een stappenmotor aansturen dmv een software timer zoals micros() kan leiden tot onregelmatigheden naarmate je programma groter wordt. Het kan bijvoorbeeld voorkomen dat je soms of altijd te laat ben als je programma loop te lang gaat duren. Je kan zoiets beter op een timer ISR laten lopen.

Je gebruikt ook digitalWrite voor het aansturen van 4 I/O. Een digitalWrite instructie duurt als ik het me goed herinner 25x langer dan een directe port instructie. Een uno gebruikt rond de 50 klokcycles om digitalWrite uit te voeren en dat duurt ca 3us. + met een port instructie kan je 4 pinnen tegelijk aansturen (1 of 2 klok cycles) en dan ben je 100x sneller. Je moet alleen je pinnen goed kiezen zodat ze op dezelfde port zitten. Dan kan je de porten aansturen icm met een paar defines.

Dus echt niet om azijn te zeiken hoor maar als je een stappermotor op jouw manier aanstuurt, dan kan je weinig andere dingen meer doen met je arduino.

// voorbeeldje
#define step1 0b0001
#define step2 0b0010
#define step3 0b0100
#define step4 0b1000

steps++;
if(steps == 4) steps=0;
switch(steps) {
  case 0: PORTB = step1; break;
  case 1: PORTB = step2; break;
  case 2: PORTB = step3; break;
  case 3: PORTB = step4; break;  // dit is al ongeveer 100x sneller dan met digitalWrite
}

De arduino mensen hebben voor ons al een mooie library: (https://www.arduino.cc/en/Reference/Stepper) gemaakt. En deze werkt op basis van een timer interrupt. Een ander voordeel is dat je eigen code 3x meer eenvoudiger wordt omdat je de simpele functies kan gebruiken van arduino.
Stepper stepper(stepsPerRevolution, 8, 9, 10, 11); // constructor

stepper.setSpeed(speed); // functie om snelheid in te stellen
stepper.step(Nsteps);   // aantal stapjes af te leggen kan zowel positief als negatief zijn

Titel: Re: Pret met Arduino
Bericht door: RudyB op 06 juni 2019, 09:57:54
Bas, bedankt voor de input. Klopt:
 - digitalWrite is sloom (waar we handig gebruik van gaan maken bij de volgende stappenmotor die met 'pulse' en 'direction' aangestuurd wordt
- De library gaan we gebruiken in een volgende video om een exact aantal stappen te doen ... na nulpunt zoeken.
Titel: Pret met Arduino 33 Find Zero Switch or Sensor
Bericht door: RudyB op 06 juni 2019, 10:57:33
Een stappenmotor weet niet waar ie is na opstarten. Als we een stappenmotor willen gebruiken voor nauwkeurig positioneren, dan moeten we eerst een nulpunt vaststellen. Dit kan door de motor te laten draaien totdat een micro-switch of een sensor geactiveerd wordt.

In deze video gaan we nulpunt zoeken ter voorbereiding van de volgende video waar we de motor nauwkeurig gaan  positioneren. De video daarna maken we een aandrijving voor een draaitafel met 3 posities.

Link naar Fun with Arduino 33 Find Zero Switch or Sensor (https://rudysarduinoprojects.wordpress.com/2019/06/06/fun-with-arduino-33-stepper-motor-control-find-zero-switch-or-sensor/)


(https://up.picr.de/35934058ez.jpg)
Titel: Re: Pret met Arduino
Bericht door: Thai-Bundesbahn op 06 juni 2019, 14:21:18
Hoi Ruud,

Alhoewel ik nog niks met Arduino doe, heb ik wel zo'n starter-kit in huis. In  de toekomst heb ik toepassingen genoeg voor arduino projecten.
Bedankt voor alle intersant filmpjes over de diverse toepassingen. Erg leerzaam en interessant.  (y)
Titel: Re: Pret met Arduino
Bericht door: Meine op 06 juni 2019, 15:30:44
Mooi en duidelijk uitgelegd allemaal.  Ik blijf dit volgen.

Meine
Titel: Pret met Arduino 34 Rotate an Exact Number of Steps
Bericht door: RudyB op 13 juni 2019, 11:38:52
Als we met een micro switch of een sensor het nulpunt hebben gevonden, kunnen we onze applicatie vanaf dat punt nauwkeurig positioneren door de motor een exact aantal stappen te laten maken. Het maakt niet uit of het 97 stappen zijn of 144668 ... zolang het motorkoppel en de spanning en stroom die de driver kan leveren volstaan om de applicatie aan te drijven zonder stappen te verliezen, kunnen we tot op 1 stap nauwkeuring positioneren.

Link naar Fun with Arduino 34 Rotate an Exact Number of Steps (https://rudysarduinoprojects.wordpress.com/2019/06/13/fun-with-arduino-34-stepper-motor-control-rotate-exact-amount-of-steps/)


(https://up.picr.de/36001225fw.jpg)
Titel: Re: Pret met Arduino
Bericht door: Eegtrain op 13 juni 2019, 18:53:36
Zeer interessant (y)
Groeten Eeg Jake
Titel: Re: Pret met Arduino
Bericht door: 72sonett op 14 juni 2019, 00:13:02
Je laat de motor nu met 4 fasen draaien, dat kan ook nog met 8 (halve stappen), dan draait hij nog nauwkeuriger.
Titel: Pret met Arduino 35 Turn Table Control with a Stepper Motor
Bericht door: RudyB op 17 juni 2019, 12:37:39
We kunnen het nulpunt vinden en we kunnen een exact aantal stappen draaien ... we hebben alle ingredienten in huis om code te maken voor het aansturen van bijvoorbeeld een draaitafel of een schuiftafel of een lift.

Met behulp van een 'Tuning' programma bepalen we het aantal stappen vanaf het nulpunt voor elke stoppositie. De gevonden waarden gebruiken we in de code voor de draaitafel besturing. Digitale ingangen vertellen de Arduino naar welke positie hij moet gaan.

Link to Fun with Arduino 35 Turn Table Control with a Stepper Motor (https://rudysarduinoprojects.wordpress.com/2019/06/17/fun-with-arduino-35-turn-table-control-with-stepper-motor/)



(https://up.picr.de/36033228kx.jpg)
Titel: Pret met Arduino 36 Store Data in Non Volatile Memory EEPROM
Bericht door: RudyB op 01 juli 2019, 10:53:29
Omdat een stappenmotor na opstarten niet weet waar ie is, moeten we een methode hebben om dit te weten te komen. We hebben daarvoor een sensor en een 'nulpunt zoek' routine gebruikt. Maar stel dat we onze laatst bezochte positie zouden kunnen opslaan in geheugen en deze kunnen uitlezen na opstarten?

Het goede nieuws is: dit kan. Arduino heeft 1024 bytes aan 'non volatile' EEPROM geheugen ingebouwd. De video laat zien hoe we naar het geheugen kunnen schrijven en hoe we het kunnen uitlezen. Zo kunnen we na opstarten de draaitafel meteen gebruiken zonder eerst het nulpunt te hoeven zoeken.

Link naar Fun with Arduino 36 Store Data in Non Volatile Memory EEPROM (https://rudysarduinoprojects.wordpress.com/2019/07/01/fun-with-arduino-36-store-data-in-non-volatile-memory-eeprom/)

(https://up.picr.de/36151676ta.jpg)
Titel: Re: Pret met Arduino
Bericht door: gvandersel op 02 juli 2019, 15:18:01
Tamelijk riskante methode. Wie garandeert dat de brug niet verdraait is?

Groet,

Gerard van der Sel.

PS.: Denk je ook aan het aantal write cycles.
Titel: Pret met Arduino 37 Control a NEMA 17 Stepper Motor with Easy Driver
Bericht door: RudyB op 08 juli 2019, 14:16:30

Er zijn diverse driver circuits beschikbaar voor het aansturen van een wat zwaardere stappenmotor. In deze video wordt een NEMA 17 motor aangestuurd door een Easy Driver, die verkrijgbaar is voor minder dan €2,-.

Link to Fun with Arduino 37 Control a NEMA 17 Stepper Motor with Easy Driver (https://rudysarduinoprojects.wordpress.com/2019/07/08/fun-with-arduino-37-control-a-nema-17-stepper-motor-with-easy-driver/)


(https://up.picr.de/36205987bk.jpg)
Titel: Fun with Arduino 38 - Ultrasonic Distance Measurement with HC-SR04
Bericht door: RudyB op 19 augustus 2019, 11:49:01
Fun with Arduino 38 - Ultrasonic Distance Measurement with HC-SR04

De HC-SR04 is een sensor met een luidsprekertje en een microfoontje waarmee we de afstand tot een object kunnen meten.

Verwacht van deze minder dan €1,- kostende sensor geen al te hoge nauwkeurigheid, maar tot mijn verbazing is het prima mogelijk tot op enkele mm nauwkeurig te meten. Natuurlijk kan er ook een aan/uit aanwezigheidssensor mee gemaakt worden.

Link naar Pret met Arduino 38 - Ultrasonic Distance Measurement HC-SR04 (https://rudysarduinoprojects.wordpress.com/2019/08/19/fun-with-arduino-38-ultrasonic-distance-measurement-with-hc-sr04/)


(https://up.picr.de/36544908fy.jpg)
Titel: Re: Pret met Arduino
Bericht door: Ad Cleijsen op 21 augustus 2019, 20:04:42
Ben er aan begonnen.

Maar mijn laptop accepteert de USB-driver installatie niet? Oplossing gezocht.

groet Ad
Titel: Re: Pret met Arduino
Bericht door: RudyB op 21 augustus 2019, 21:02:27
Bedoel je de CH340 driver? Enkele download links:

https://sparks.gogo.co.nz/ch340.html

http://www.wch.cn/download/CH341SER_ZIP.html
Titel: Re: Pret met Arduino
Bericht door: NTeering op 22 augustus 2019, 11:53:24
Hallo Ad,

Als je de Arcomora software hebt geïnstalleerd, en als Arcomora gebruiker heb je dat neem ik aan, zijn de CH340 drivers al geïnstalleerd.
Evenals de originele Arduino drivers.

Mvg
Nico
Titel: Re: Pret met Arduino
Bericht door: NL-modelspoor op 22 augustus 2019, 18:46:15
Waarschijnlijk Windows 10 en dan een niet gesigneerd stuurprogramma? Maar we weten natuurlijk niet wat er op de laptop voor software aanwezig is.
Titel: Re: Pret met Arduino
Bericht door: Ad Cleijsen op 24 augustus 2019, 17:51:15
zou zo maar kunnen kloppen. W10 in ieder geval.
Titel: Re: Pret met Arduino
Bericht door: Ad Cleijsen op 04 september 2019, 19:50:05
Timo,

Ben aan het proberen (nog bij video 1), maar ik krijg 'een error op gedurende laden van de schets'.
avrdude: stk500v2-recieveMessager() : timeout

??
zou dat met windows 10 te maken kunnen hebben?

gr. Ad
Titel: Re: Pret met Arduino
Bericht door: Timo op 04 september 2019, 19:56:58
In de basis, nee :angel: Windows 10 is niet veel anders dan Windows 7 daarin. Hoe zeker ben je er van dat je:

- de juiste driver hebt geïnstalleerd?
- de juist COM-poort hebt geselecteerd?
- het juiste bord (+ andere instellingen!) hebt geselecteerd?

De complete error hier plaatsen kan helpen om de fout te vinden.


Timo
Titel: Re: Pret met Arduino
Bericht door: Zilte op 04 september 2019, 19:58:32
@ Ad Cleijsen: gaat u in het programma van Arduino bij: Bestand > Voorbeelden > Basics en dan klik Blink? Dit gaat bij mij onder Windows 10 vlekkeloos.

@Timo: het laden van de schets kan zonder de Arduino aangesloten te hebben. Uit de reactie van heer Cleijsen maak ik op dat het probleem zich daar voordoet en niet bij het uploaden naar de Arduino. Zou het deïnstalleren van de software en een her-ïnstallatie soelaas bieden?
Titel: Re: Pret met Arduino
Bericht door: Timo op 04 september 2019, 20:28:23
Uit de reactie van heer Cleijsen maak ik op dat het probleem zich daar voordoet en niet bij het uploaden naar de Arduino.
Maar het is wel degelijk met uploaden ;) stk500v2 wordt alleen aangeroepen tijdens het programmeren (stk500 is het protocol voor de AVR bootloaders).

Zou het deïnstalleren van de software en een her-ïnstallatie soelaas bieden?
Dus nee :)


Timo
Titel: Re: Pret met Arduino
Bericht door: RudyB op 04 september 2019, 20:32:50
Things you can try:

Use the official factory driver:
http://www.wch.cn/download/CH341SER_EXE.html

Disable Windows 10 signed driver enforcement:
https://ph.answers.acer.com/app/answers/detail/a_id/38288/~/windows-10%3A-disable-signed-driver-enforcement

Temporary disable your anti virus program.

Run the install as administrator (Right click, select Run as administrator).
Titel: Re: Pret met Arduino
Bericht door: Timo op 04 september 2019, 20:42:08
De CH340 is inderdaad de meest gebruikte chip voor Arduino clones uit China, grote kans dat die erop zit. Maar die driver is gewoon ondertekend, zou dus niet de moeite nemen om de driver handtekeningcontrole uit te zetten zonder even verder te kijken.

Om te kijken of je de juiste driver hebt en of deze correct werkt kan je simpelweg apparaatbeheer openen. Onder poorten zou hij dan moeten verschijnen als je de USB erin drukt. Moet verschijnen zonder uitroepteken en zal erachter het COM-nummer tonen.


Timo
Titel: Re: Pret met Arduino
Bericht door: Ad Cleijsen op 07 september 2019, 12:56:02
Timo,

Een en ander leidt weer tot een paar vragen.

board gecontroleerd (uno)
com = com9
driver zou correct moeten zijn.

Bij Blink uploaden. Ik zie dat dit gebeurt, de LED's op de arduino blinken op (DK en XT), maar LED 9 gaat niet knipperen, zoals op het voorbeeld filmpje.
Heb bij het uploaden geen foutmeldingen meer, dat is dus de eerste winst.

Ik ga verder met filmpje 2, misschien brengt dat wat nieuwe wijsheid.

Groet
Titel: Re: Pret met Arduino
Bericht door: ETH023 op 07 september 2019, 21:00:35
@Ad,

Is de arduino van merk Wavgat? Die werken namelijk niet goed. Heb ik ook problemen mee ondervonden helaas.

Mvg
Erwin
Titel: Re: Pret met Arduino
Bericht door: Timo op 08 september 2019, 20:03:52
Hoi Ad,

Dus nadat je op "Upload" hebt geklikt krijg je in de groene balk (en die is niet rood geworden) "Done uploading"? Of een Nederlandse versie als je die gebruikt.

Dan zou de led op pin 13 (niet 9) moeten knipperen. Anders er eens een externe led (met weerstand!) aan hangen.

@ETH023, daar heb ik nooit klachten over gezien dus
- of je deed iets fout
- of je had een maandag morgen model
- of het was in de tijd van de nep FTDI chips.


Timo
Titel: Re: Pret met Arduino
Bericht door: Fritsprt op 08 september 2019, 20:49:18

@ETH023, daar heb ik nooit klachten over gezien dus
@Ad,

Is de arduino van merk Wavgat? Die werken namelijk niet goed. Heb ik ook problemen mee ondervonden helaas.

Mvg
Erwin



Ik heb daar vaker iets over gelezen. Volgens mij hebben ze een afwijkende bootloader. Maar aangezien er wel een sketch geupload kan worden zal het daar niet aan liggen.

Gr. Frits
Titel: Pret met Arduino 39 - OLED display SSD1306
Bericht door: RudyB op 09 september 2019, 11:34:31
We gaan de ultrasone afstand meter uitbreiden met een OLED display. Samen met een batterij wordt het zo een portable meetinstrument. Daar gaat het eigenlijk niet om, die maken we just for fun. Het gaat om de OLED display ... als we die eenmaal aan de praat hebben zijn daar vele leuke en nuttige toepassingen mee te maken.

Link naar Fun with Arduino 39 - OLED dDisplay SSD1306 (https://rudysarduinoprojects.wordpress.com/2019/09/09/fun-with-arduino-39-oled-display-ssd1306/)


(https://up.picr.de/36717754og.jpg)
Titel: Re: Pret met Arduino
Bericht door: Ad Cleijsen op 16 september 2019, 18:52:13
Alhoewel ik van fout naar fout ga, toch een vordering.

Dit is de foutmelding op de DCC decoder

Arduino:1.8.9 (Windows 10), Board:"Arduino Nano, ATmega328P"

Build-opties gewijzigd, alles wordt opnieuw gebuild
De schets gebruikt 930 bytes (3%)  programma-opslagruimte. Maximum is 30720 bytes.
Globale variabelen gebruiken 9 bytes (0%) van het dynamisch geheugen. Resteren 2039 bytes voor lokale variabelen. Maximum is 2048 bytes.
avrdude: ser_open(): can't set com-state for "\\.\COM9"

En dit is de foutmeding op de UNO -

geen, verhip het werkt zoals bedoeld en als ik speel met tijdstip lampie aan, lampie uit. Het werkt.

Bedankt voor de input, ik ga weer verder.

Groeten Ad
Titel: Re: Pret met Arduino
Bericht door: Timo op 16 september 2019, 21:28:08
Heb jij heel toevallig de Arduino IDE uit de Windows store gehaald?


Timo
Titel: Re: Pret met Arduino
Bericht door: Ad Cleijsen op 17 september 2019, 11:36:41
Timo,
Geen idee.
Volgende zoektocht.

Overigens wel toppiemoment als dan in een keer zo'n dom lampie gaat branden, zoals je bedoeld had.

Groet Ad
Titel: Re: Pret met Arduino
Bericht door: Timo op 17 september 2019, 12:41:02
Hoi Ad,

Leuk is dat hè!  ;D

En ik kijk weer even naar de error, doet me toch geloven dat je niet de goede driver hebt.

Klein stappenplan dat je even zou kunnen doen:
- Laat de Nano even los
- Open "Device manager" (apparaatbeheer)
- Vouw "Ports (COM & LPT)" (Poorten) uit (als je deze hebt)
- Verbind de Nano, onder "Ports" moet er nu een (extra) apparaat verschijnen
- Is dat COM9?
- Open dan de Properties (Eigenschappen)
- Ga naar tabblad Driver
- Plaats daarvan een screenshotje hier (tip, gebruik Windows Snipping Tool)


Timo
Titel: Re: Pret met Arduino
Bericht door: Ad Cleijsen op 17 september 2019, 21:10:19
Timo,

Ick vermaeck me kostelyck. Lering ende vermaeck.
Al het commentaar gegeven sla ik over en met de adviezen puzzel ik verder. In ieder geval, langzaam maar wel vooruit. Ben aan video 3 begonnen.

Zoals het er nu uit ziet ga ik met het volste vertrouwen verder. Stapjes vooruit, stapje terug. Prima toch.

Groet Ad
Titel: Pret met Arduino 40 Station Platform Departure Display with Analog Clock
Bericht door: RudyB op 23 september 2019, 11:39:19
In de vorige video hebben we een OLED display aangestuurd en een tekst en wat lijnen getoond. Die zelfde functies gebruiken we in deze video om een NS vertrekbord na te bootsen, waarbij het leuke is dat er een echt werkende analoge klok op zit.

Veschillende vertrekberichten kunnen getoond worden, afhankelijk van digitale inputs, die via een drukknop binnen kunnen komen, of via een DCC decoder.

De klok loopt hier nog op een random tijd, hiervoor is alleen een Arduino en een OLED nodig. In de volgende video voegen we een Real Time Clock module toe zodat ie de werkelijke tijd aangeeft.

Link naar Fun with Arduino 40 Station Platform Departure Display with Analog Clock (https://rudysarduinoprojects.wordpress.com/2019/09/23/fun-with-arduino-40-station-platform-departure-display-with-analog-clock/)


(https://up.picr.de/36827560uc.jpg)
Titel: Re: Pret met Arduino
Bericht door: Reinout van Rees op 17 november 2019, 22:52:02
Ik heb een paar mardec-vragen naar het mardec draadje verplaatst (https://forum.beneluxspoor.net/index.php?topic=68257.msg3222068432#msg3222068432).
De vragen daaromtrent horen hier niet thuis, want dit gaat over Rudy's leuke video's.

Reinout-als-moderator
Titel: Re: Pret met Arduino
Bericht door: Ad Cleijsen op 29 december 2019, 17:47:37
Hoi Rudy, Nico,

Even uit geweest, wat dingen die ik niet begreep en twijfel. Afgelopen week weer gestart en huppekee, I'm on track. Loopt en gaat vooruit.
Nico bedankt voor de uitleg
Rudy bedankt voor de filmpjes.

Groeten Ad
Titel: Pret met Arduino 41 Real Time Clock DS1307
Bericht door: RudyB op 24 februari 2020, 12:06:06
De stationsklok van de vorige video loopt, maar hij start op een random tijd. We kunnen een Real Time Clock module toevoegen om de werkelijke tijd aan te geven. Er zijn diverse RTC modules verkrijgbaar. Deze video gaat over het aansluiten en het gebruik van de DS1307 RTC, met een prijskaartje van minder dan een euro.
 
Link naar Fun with Arduino 41 Real Time Clock DS1307 (https://rudysarduinoprojects.wordpress.com/2020/02/24/fun-with-arduino-41-station-platform-display-with-real-time-clock-ds1307/)


(https://up.picr.de/37939342lr.jpg)
Titel: Re: Pret met Arduino
Bericht door: guy1846 op 19 juni 2020, 18:05:23
 goede dag.
de railway crossing all together, ik heb een kleine aanpassing gedaan, nml bij het open gaan van de slagboom blijven de signalen nu ook 3 sec
door blinken als hij al helemaal open is.dat was vroeger niet zo. ik werk nog aan de detektie van de laatste wagon.bij mij gaan de slabomen te vroeg open. opmerking, ik weet niet waarom hier opeens een aantal woorden met rood zijn onderlijnd.
voor het geval je hier iets moest aan hebben.
vr gr guy noels

    #define GATE_SPEED   50 // [ms] lower number is higher servo speed
    #define GATE_DELAY  3000 // [ms] delay time before gate closes
    #define GATE_OPEN     50 // servo angle
    #define GATE_CLOSED  145 // servo angle
    #define BLINK_SPEED  400 // [ms] smaller number is faster blinking
    #define SERVO_PIN      8 // outp pin 8
    #define LED1_PIN       10  // outp pin 10
    #define LED2_PIN       11  // outp pin 11
    #define SENSOR1_PIN   2  // input pin 2
    #define SENSOR2_PIN   3  // input pin 3

    byte state = 1, transition;
    byte led1, led2, blink_enabled;
    byte angle    = GATE_OPEN;
    byte setpoint = GATE_OPEN;
    unsigned long time_to_blink;
    unsigned long time_to_close_gate;
    unsigned long time_to_open_gate;
    unsigned long time_for_servo;

    #include <Servo.h>
    Servo gate_servo;

    void setup() {
    pinMode(SENSOR1_PIN, INPUT_PULLUP);
    pinMode(SENSOR2_PIN, INPUT_PULLUP);
    pinMode(LED1_PIN, OUTPUT);
    pinMode(LED2_PIN, OUTPUT);
    gate_servo.attach(SERVO_PIN);
    gate_servo.write(angle);
    Serial.begin(9600);
    Serial.println("Railway Crossing Control Ready");
    Serial.println();
    Serial.println("Waiting for train");
    led1 = 1;
    led2 = 1;
      }
    void loop() {
   
    switch(state) {
    case 1: // idle
      if(digitalRead(SENSOR1_PIN) == LOW) transition = 12;
    break;
 
    case 2: // blinking, gate still open
      if (millis() > time_to_close_gate) transition = 23;
    break;
 
    case 3: // blinking, gate closing
      if(digitalRead(SENSOR2_PIN) == LOW) transition = 34;
    break;
 
    case 4: // blinking, gate opening
      if(angle == GATE_OPEN) transition = 45;
    break;

    case 5: // gate open , but still blinking
        if (millis() > time_to_open_gate) transition = 51;
      }

    switch(transition) {
    case 12: //
      Serial.println("Train detected, start blinking");
      blink_enabled = 1;
      time_to_close_gate = millis() + (unsigned long)GATE_DELAY;
      transition = 0;
      state = 2;
    break;
 
    case 23: //
      Serial.println("Time to close the gate");
      gate_servo.attach(SERVO_PIN);
      setpoint = GATE_CLOSED;
      transition = 0;
      state = 3;
    break;
 
    case 34:
      Serial.println("Train detected, open the gate");
      gate_servo.attach(SERVO_PIN);
      setpoint = GATE_OPEN;       
      transition = 0;
      state = 4;
    break;
 
    case 45:
      Serial.println("Gate is open, still blinking");
      Serial.println();
      Serial.println("Waiting for train");
      time_to_open_gate = millis() + (unsigned long)GATE_DELAY;
      transition = 0;
      state = 5;
    break;
   
    case 51:
      blink_enabled = 0;
      led1 = 1;
      led2 = 1;
      gate_servo.detach(); // to avoid servo flutter
      transition = 0;
      state = 1;
    break;
      }

      if (millis() > time_for_servo) {
    time_for_servo = millis() + (unsigned long)GATE_SPEED;
    if (angle < setpoint) angle++;
    if (angle > setpoint) angle--;
    gate_servo.write(angle);
      }
   
      if(blink_enabled == 1) {
    if(millis() > time_to_blink) {
      time_to_blink = millis() + (unsigned long)BLINK_SPEED;
      led1 = !led1;
      led2 = !led1;
       }
      }
    digitalWrite(LED1_PIN, led1);
    digitalWrite(LED2_PIN, led2);
      }
Titel: Re: Pret met Arduino
Bericht door: RudyB op 19 juni 2020, 18:24:29
Trigger op eind van de trein is mogelijk door nadat het sensor signaal is weggevallen een tijdje later weer te kijken. Is het signaal nog steeds weg dan was dit het einde van de trein. Is het signaal weer aanwezig dan was dit het gat tussen twee wagons. De methode is niet fail safe ... als de trein heel langzaam rijdt of stil staat kan onterecht het eind van de trein worden aangegeven.
Titel: Re: Pret met Arduino
Bericht door: Patrick Smout op 19 juni 2020, 19:26:00
De manier hoe er getest wordt op het aflopen van timers lijkt me ook nog een verborgen probleem te hebben. Als de ms timer de overgang maakt van de maximale naar de minimale tijd zal de tijd niet correct zijn. Een manier om dit op te lossen is door de code te herschrijven naar

If( something)
    Starttijd = millis();

If ( millis() - Starttijd > BLINK_SPEED )
  ... Do something

En Starttijd is van het type unsigned long

Mvg, Patrick Smout
Titel: Re: Pret met Arduino
Bericht door: bask185 op 19 juni 2020, 23:50:47
Een trein detectie sensor ding kan je niet zomaar samplen met een vaste interval. Je moet het volgende doen als je een detector goed wilt debouncen.

Je neemt ca elke 5ms ofzo een sample. Je kan varieren hiermee, 20 volstaat waarschijnlijk maar vaker is in principe beter.

Elke keer als je detector (lichtsluis, reflectie sensor, LDR, whatever) een trein ziet, dan zet je een aftellende timer op een bepaalde timeOut. Laten we 2000ms of 2s nemen. Dus bij elke waargenomen flikkering van de sensor, stop je opnieuw de timeout waarde in de timer.

Dan... deze timer laat je dus continu aftellen naar 0. Indien de timer 0 bereikt. Dan is er zeker weten geen trein. Als je timer niet 0 is, dan is er een trein.


Stel dat je een heel slechtziende reflectie sensor of andere slecht detecterend rot apparaat heb die niet meer dan 10% van de trein waarneemt, dan lost deze code dat op.

De loop is heel simpel. Die laat een led branden als er een trein is, en anders is de led uit.
void loop() {
  if( readDetector() == occupied ) digitalWrite( 13, HIGH );
  else                             digitalWrite( 13, LOW );
}
Duidelijke syntax, niet?

De functie readDetector regelt de terugmelder.
Dit stukje van de functie regelt het interval. Ik maak geen gebruik van unsigned longs omdat dat simpelweg niet nodig is.  De timeOut tijd wordt elke sampleInterval  afgeteld naar 0 toe. Een berekening van de timeOut waarde houdt rekening mee met de sampleInterval tijd

const int sampleInterval = 5;
const int timeOut = 2000 / sampleInterval ; //          // 2 second timeout, kan je ook 10 of 20s maken, net wat je wilt

uint8_t readDetector() {
    static uint16_t timeCounter = 0;
    static uint16_t prevTime = 0;                 // op deze wijze hebben we geen long nodig
    uint16_t currentTime;

    currentTime = millis() & 0x0000FFFF;            // ( and masker is eigenlijk overbodig. Hij staat er om te illustreren dat we alleen de laatste 16 bits gebruiken van millis)

    if( currentTime - prevTime > sampleInterval ) {      // elke 5ms
        prevTime = currentTime;

Direct hieronder staat de code die bijhoudt of er een trein is of niet. Nogmaals, als er een trein gedetecteerd wordt, dan stop ik een vaste timeout waarde in een counter die hier timeCounter heet (bij gebrek aan beter). Dit gebeurt dus bij de minste flikkering van de sensor. Als de sensor alleen al een trein ruikt, dat is het blok voor minimaal 2 seconde bezet.

if( digitalRead( sensor ) == LOW ) {         // if train is detected
            timeCounter = timeOut;                    // force the counter again to 2 seconds
        }

        if( timeCounter > 0 ) timeCounter--;        // start counting down time

        if( timeCounter == 0) {
            return freed;
        }
        else {
            return occupied;
        }
Als deze timeCounter gelijk is aan 0, dan betekent dat er gedurende de timeOut tijd geen trein is gezien. Dan weet je zeker dat de trein weg is (Onder voorbehoud dat je net geen trein stil zet op de sensor op precies een plek dat de sensor hem niet zien). Als deze timeCounter nog geen 0 is geworden dan is de trein nog op het blok.

De hele code in 1 snippet:
const int ledPin = 13;
const int sensor = 3; // ??

enum blockStates {
    occupied,
    freed,
};

void setup() {
  pinMode( 13, OUTPUT );
  pinMode( sensor, INPUT_PULLUP );
}

void loop() {
  if( readDetector() == occupied ) digitalWrite( 13, HIGH );
  else                             digitalWrite( 13, LOW );

}

const int sampleInterval = 5;
const int timeOut = 2000 / sampleInterval ; //          // 5 second timeout

uint8_t readDetector() {
    static uint16_t timeCounter = 0;
    static uint16_t prevTime = 0;                 // op deze wijze hebben we geen long nodig
    uint16_t currentTime;

    currentTime = millis() & 0x0000FFFF;            // ( and masker is eigenlijk overbodig, we hebben zo geen long nodig )

    if( currentTime - prevTime > sampleInterval ) {      // elke 5ms ofzo
        prevTime = currentTime;

        if( digitalRead( sensor ) == LOW ) {         // if train is detected
            timeCounter = timeOut;                    // force the counter again to 3 seconds
        }

        if( timeCounter > 0 ) timeCounter--;        // start counting down time

        if( timeCounter == 0) {
            return freed;
        }
        else {
            return occupied;
        }
    }
}
Ik heb het getest en het werkt zoals uitgelegd!

Ik hoop dat ik er iemand mee kan helpen. Denk dat ik deze maar verwerk in een library formaat voor arduino.

Mvg,

Bas
Titel: Re: Pret met Arduino
Bericht door: RudyB op 20 juni 2020, 09:41:42
Dat is wel een heel wetenschappelijke aanpak. Dit werkt ook:

if(!digitalRead(SENSOR_PIN)) {
  train_detected = 1;
  end_of_train_time = millis() + 2000UL; // wachttijd in [ms]
}
if(millis() > end_of_train_time) train_detected = 0;

Complete werkende sketch:
#define WAIT_TIME   2000 // [ms]
#define SENSOR_PIN     8

byte train_detected;
unsigned long end_of_train_time;

void setup() {
  pinMode(SENSOR_PIN, INPUT_PULLUP);
  pinMode(13, OUTPUT); // on board LED
  digitalWrite(13, LOW);
}

void loop() {
  if(!digitalRead(SENSOR_PIN)) {
    end_of_train_time = millis() + (unsigned long)WAIT_TIME;
    train_detected = 1;
  }
  if(millis() > end_of_train_time) train_detected = 0;
  digitalWrite(13, train_detected);
}
...
Titel: Re: Pret met Arduino
Bericht door: Patrick Smout op 20 juni 2020, 10:04:35
Dat is wel een heel wetenschappelijke aanpak. Dit werkt ook:
if(!digitalRead(SENSOR_PIN)) {
  train_detected = 1;
  end_of_train_time = millis() + 2000UL; // wachttijd in [ms]
}
if(millis() > end_of_train_time) train_detected = 0;
Een sterk voordeel van de wetenschappelijke aanpak is dat het ook blijft werken op lange termijn (24/24 en 7/7 onder spanning).
Van het betere hobbywerk kan dit niet altijd gezegd worden (maar je zal er ook niet tegenaan lopen als je na een aantal uren je baan telkens spanningsloos brengt)

mvg, Patrick Smout
Titel: Re: Pret met Arduino
Bericht door: RudyB op 20 juni 2020, 10:08:14
Als je bedoelt dat deze code elke 49 dagen een keer fout zou kunnen gaan door overflow van de millis() ... ja, klopt. :)
Titel: Re: Pret met Arduino
Bericht door: Patrick Smout op 20 juni 2020, 12:26:51
Inderdaad maar zoals gezegd maakt het in deze toepassing niet veel uit.
Nu is het wel zo dat, als iemand besluit om dit soort code te lenen om thuis een domotica systeem te bouwen, het plots wel belangrijk wordt. Hij of zij kan dan beter in de juiste richting vertrekken want, zoals wij techneuten allemaal ondervonden hebben, het afleren van foute gewoontes is knap lastig. ;)

Mvg, Patrick Smout
Titel: Re: Pret met Arduino
Bericht door: guy1846 op 28 juni 2020, 18:08:50
 Goede dag Rudy
misschien zijn er forumleden die hier iets aan hebben.
het is een volledig ontwerp geworden met bijhorende interface die ik nog probeer door te sturen.
uitvoerig getest en goed bevonden.


     //sketch_railw-cross-4-3-test
    //Slagbomen werken in beide richtingen.
    //Slagbomen gaan pas open als laatste wagon gepasseerd is
   
    #define GATE_SPEED   50 // [ms] lower number is higher servo speed
    #define GATE_DELAY  1000 // [ms] delay time before gate closes
    #define GATE_OPEN     50 // servo angle
    #define GATE_CLOSED  145 // servo angle
    #define BLINK_SPEED  400 // [ms] smaller number is faster blinking
    #define SERVO_PIN      8 // outp pin 8
    #define LED1_PIN       10  // outp pin 10
    #define LED2_PIN       11  // outp pin 11
    #define SENSOR1_PIN   2  // input pin 2
    #define SENSOR2_PIN   3  // input pin 3

    byte state = 1, transition;
    byte led1, led2, blink_enabled;
    byte angle    = GATE_OPEN;
    byte setpoint = GATE_OPEN;
    unsigned long time_to_blink;
    unsigned long time_to_close_gate;
    unsigned long time_to_open_gate;
    unsigned long time_for_servo;

    #include <Servo.h>
    Servo gate_servo;

    void setup() {
    pinMode(SENSOR1_PIN, INPUT_PULLUP);
    pinMode(SENSOR2_PIN, INPUT_PULLUP);
    pinMode(LED1_PIN, OUTPUT);
    pinMode(LED2_PIN, OUTPUT);
    gate_servo.attach(SERVO_PIN);
    gate_servo.write(angle);
    Serial.begin(9600);
    Serial.println("Railway Crossing Control Ready");
    Serial.println();
    Serial.println("Waiting for train");
    led1 = 1;
    led2 = 1;
      }
    void loop() {
       switch(state) {
    case 1: // idle
      if(digitalRead(SENSOR1_PIN) == LOW) transition = 12;
      if(digitalRead(SENSOR2_PIN) == LOW) transition = 17;
      break; 
    case 2: // blinking, gate still open
      if (millis() > time_to_close_gate) transition = 23;
    break;
    case 3: // blinking, gate closing
      if(digitalRead(SENSOR2_PIN) == LOW) transition = 34;
    break;
    case 4: //blinking waiting last wagon
      if(digitalRead(SENSOR2_PIN) == HIGH) transition = 45;
    case 5: // blinking, gate opening
      if(angle == GATE_OPEN) transition = 56;
    break;
    case 6: // gate open , but still blinking
        if (millis() > time_to_open_gate) transition = 61;
       }
         switch(transition) {
    case 12: //
      Serial.println("Train detected, start blinking");
      blink_enabled = 1;
      time_to_close_gate = millis() + (unsigned long)GATE_DELAY;
      transition = 0;
      state = 2;
    break;
 
    case 23: //
      Serial.println("Time to close the gate");
      gate_servo.attach(SERVO_PIN);
      setpoint = GATE_CLOSED;
      transition = 0;
      state = 3;
    break;
 
    case 34:
      Serial.println("Train detected, open the gate");
      gate_servo.attach(SERVO_PIN);
      //setpoint = GATE_OPEN;       
      transition = 0;
      state = 4;
    break;
    case 45:
      gate_servo.attach(SERVO_PIN);
      setpoint = GATE_OPEN;       
      transition = 0;
      state = 5;
    break;
    case 56: 
      Serial.println("Gate is open, still blinking");
      Serial.println();
      //Serial.println("Waiting for train");
      time_to_open_gate = millis() + (unsigned long)GATE_DELAY;
      transition = 0;
      state = 6;
    break;
    case 61:
      blink_enabled = 0;
      led1 = 1;
      led2 = 1;
      gate_servo.detach(); // to avoid servo flutter
      transition = 0;
      state = 1;
    break;
      }
     if (millis() > time_for_servo) {
      time_for_servo = millis() + (unsigned long)GATE_SPEED;
      if (angle < setpoint) angle++;
      if (angle > setpoint) angle--;
      gate_servo.write(angle);
      } 
      if(blink_enabled == 1) {
      if(millis() > time_to_blink) {
      time_to_blink = millis() + (unsigned long)BLINK_SPEED;
      led1 = !led1;
      led2 = !led1;
       }
     
    digitalWrite(LED1_PIN, led1);
    digitalWrite(LED2_PIN, led2);
      }
       
     switch(state) { 
    case 7: // blinking, gate still open
      if (millis() > time_to_close_gate) transition = 78;
    break;
 
    case 8: // blinking, gate closing
      if(digitalRead(SENSOR1_PIN) == LOW) transition = 89;
    break;
    case 9: // blinking,waiting last wagon
      if(digitalRead(SENSOR1_PIN) == HIGH) transition = 9,10;
 
    case 10: // blinking, gate opening
      if(angle == GATE_OPEN) transition = 10,11;
    break;

    case 11: // gate open , but still blinking
        if (millis() > time_to_open_gate) transition = 11,1;
      }
      switch(transition)  {
    case 17: //
      Serial.println("Train detected, start blinking");
      blink_enabled = 1;
      time_to_close_gate = millis() + (unsigned long)GATE_DELAY;
      transition = 0;
      state = 7;
    break;
    case 78:
      Serial.println("Time to close the gate");
      gate_servo.attach(SERVO_PIN);
      setpoint = GATE_CLOSED;
      transition = 0;
      state = 8;
    break;
    case 89:
      //Serial.println("Train detected, open the gate");
      gate_servo.attach(SERVO_PIN);
      //setpoint = GATE_OPEN;       
      transition = 0;
      state = 9;
    break;
    case 9:10,
      Serial.println("Train detected, open the gate");
      gate_servo.attach(SERVO_PIN);
      setpoint = GATE_OPEN;       
      transition = 0;
      state = 10;
    break;
    case 10:11,
      Serial.println("Gate is open, still blinking");
      Serial.println();
      Serial.println("Waiting for train");
      time_to_open_gate = millis() + (unsigned long)GATE_DELAY;
      transition = 0;
      state = 11;
    break;
    case 11:1,
      blink_enabled = 0;
      led1 = 1;
      led2 = 1;
      gate_servo.detach(); // to avoid servo flutter
      transition = 0;
      state = 1;
    break;
      }
    if (millis() > time_for_servo) {
    time_for_servo = millis() + (unsigned long)GATE_SPEED;
    if (angle < setpoint) angle++;
    if (angle > setpoint) angle--;
    gate_servo.write(angle);
      }
   
      if(blink_enabled == 1) {
    if(millis() > time_to_blink) {
      time_to_blink = millis() + (unsigned long)BLINK_SPEED;
      led1 = !led1;
      led2 = !led1;
       }
      }
    digitalWrite(LED1_PIN, led1);
    digitalWrite(LED2_PIN, led2);
      }
     

 
                 
Titel: Re: Pret met Arduino
Bericht door: RudyB op 28 juni 2020, 18:36:40
Mooi werk, daar kan iedereen die twee kanten op wil rijden gebruik van maken.

Als ik het even snel bekijk dan wacht je nadat sensor2 laag is geworden tot hij weer hoog wordt en dat is dan einde trein? Dat werkt alleen als de sensor zo geplaatst is dat de ruimte tussen wagons niet gezien wordt. Voor een optische sensor kan dat lukken als sensor en ontvanger diagonaal over de rails staan. Betrouwbaarder zou zijn om de 4 regels code een paar posts hierboven te gebruiken, die reageert pas als de tijd na de laatste L>H  langer duurt dan een instelbare tijd, zeg 2 seconden.
Titel: Re: Pret met Arduino
Bericht door: guy1846 op 28 juni 2020, 21:35:25
beste Rudy
ik heb hier een projectje van gemaakt dat zo kan nagebouwd worden, maar wel voor de 3rail gebruikers,met CS3+ met de rail onderbreking als feedback.  de interface is daar ook op gemaakt. met een galvanische scheiding tussen baan en micro controller.ontdaan van debounce.
je kan het zo publiceren, het werkt perfect. ik krijg het echter niet doorgestuurd.
als je me een mail stuurt zal ik het zo proberen.
mijn email   ......@gmail.com
gr
guy

On spam te voorkomen emailadres verwijderd. Beter even per Pb doen..
Titel: Re: Pret met Arduino
Bericht door: bask185 op 28 juni 2020, 22:41:06
@Guy, als je code plaats tussen code tags dan wordt de boel wat leesbaarder voor anderen.
[ c o d e ] ( zonder de spaties )
// dit wordt dan code
[ / c o d e ]

Ik wil als je het niet erg vindt, je een paar tips meegeven om meer leesbare code te maken. Je code zoals hij is, is een klein beetje cryptisch. Het is nog wel te behappen maar het kan netter.
Je uitlijning klopt niet op bepaalde plaatsen en er staan aparte constructies in. Ik weet niet of het trouwens zo bedoeld is, ik vermoed van wel, maar sommige cases hebben geen break-statement.

    void loop() {
       switch(state) {
    case 1: // idle
      if(digitalRead(SENSOR1_PIN) == LOW) transition = 12;
Dit kan je schrijven als:
    void loop() {
        switch(state) {
        case 1: // sommige mensen doen dit, omdat de case een label is, een oud obsolete ding uit assembly.
            if(digitalRead(SENSOR1_PIN) == LOW) transition = 12;
// of als

    void loop() {
       switch(state) { // dit is iets meer standaard
          case 1: // idle
          if(digitalRead(SENSOR1_PIN) == LOW) transition = 12;
// of als
    void loop() {
       switch(state) { // dit is iets meer standaard
          case 1: // Ik ben zelf geen fan van inspringen na een : alleen na een {   maar ook dit wordt geaccepteerd
              if(digitalRead(SENSOR1_PIN) == LOW) transition = 12;

Een wit regel achter een break; kan ook geen kwaad.
case 8: // blinking, gate closing
      if(digitalRead(SENSOR1_PIN) == LOW) transition = 89;
    break;
    case 9: // blinking,waiting last wagon
      if(digitalRead(SENSOR1_PIN) == HIGH) transition = 9,10;
 
    case 10: // blinking, gate opening
      if(angle == GATE_OPEN) transition = 10,11;
    break;

// dit is netter
    case 8: // blinking, gate closing
    if(digitalRead(SENSOR1_PIN) == LOW) transition = 89;
    break;

    case 9: // blinking,waiting last wagon
    if(digitalRead(SENSOR1_PIN) == HIGH) transition = 9,10;
    // het klopt dat hier geen break hoort te staan neem ik aan

    case 10: // blinking, gate opening
    if(angle == GATE_OPEN) transition = 10,11;
    break;
// wat ik dan zelf nog wel eens wil doen is, creatief uitlijnen en meer dingen per regel zetten
switch(state) {
    case 7:  if (millis() > time_to_close_gate)     transition = 78;    break;  // blinking, gate still open
    case 8:  if(digitalRead(SENSOR1_PIN) == LOW)    transition = 89;    break;  // blinking, gate closing
    case 9:  if(digitalRead(SENSOR1_PIN) == HIGH)   transition = 9,10;          // blinking,waiting last wagon
    case 10: if(angle == GATE_OPEN)                 transition = 10,11; break;  // blinking, gate opening
    case 11: if (millis() > time_to_open_gate)      transition = 11,1;          // hier hoort wel een break eigenlijk
}
Niet iedereen is het hier mee eens omdat het niet 'standaard' is, maar ik vind dat de boel wel leesbaarder wordt. Met deze stijl valt het ook veel eerder op, als er iets niet klopt zoals bijvoorbeeld een missende break; of het valt eerder op dat er een case is bewust zonder een break;  ;)

Ik snap in grote lijnen wat je doet. Je hebt 1 switch-statement die de input en de flow regelt, en een tweede switch-statement die de output afhandelt. Ik begrijp alleen niet waarom je dan nog 2 switch-statements heb. Dit ruikt wel erg naar die Meally en Moor theorieën :)

Wat ik wilde zeggen er over:
Normaliter in state machines zijn nummertjes erg ongewenst. Ik snap dat je ze hier nodig dacht te hebben vanwege je gebruikte structuur. Maar je bent toch beter af met constantes met praktische namen. Bijvoorbeeld
case 1: // idle
...
case 2: // blinking, gate still open
...
case 3: // blinking, gate closing
...
case 4: //blinking waiting last wagon
...
case 5: // blinking, gate opening
...
case 6: // gate open , but still blinking

// Beter is:
enum states {
    idle,
    gate_is_open,
    waiting_last_wagon,
    gate_opening,
    still_blinking,
}
...

case idle:
...
case gate_is_open:
...
case gate_closing:
...
case waiting_last_wagon:
...
case gate_opening:
...
case still_blinking:
Als je consequent met namen werkt ipv nummers, dan maken de daadwerkelijke waardes niet meer uit. Als je hebt
byte state = idle;
...
case  idle:
dan maakt het geenzins uit of idle nu 0, 3 of 252 is. Dat maakt het ook makkelijker om states ergens midden in toe te voegen.

Als je netter omgaat met je code, dan wordt het werken met je code ook fijner voor jezelf. Als je veel case labels maakt met nummertjes dan kan je op  een bepaald door de bomen het bos niet meer zien. En als je uitlijning niet klopt, is het lastig te zien welke code achter welke if-statement valt.

Ik heb trouwens nog een vraagje aan iedereen trouwens. Ik heb deze syntax nog nooit waargenomen:
transition = 9,10;
en
case 9:10,
Kan iemand mij uitleggen wat er hier precies gebeurt?

Bas



Titel: Re: Pret met Arduino
Bericht door: guy1846 op 28 juni 2020, 23:03:46
Beste Bas
zoals je terecht opmerkt,ik heb er nog niet veel kaas van gegeten.ik heb al oefenend de file van Rudy uitgebreid. samen met de interface is het een projectje dat uitgebreid getest is en bij mij althans perfekt werkt.weet dat de interface (je) gemaakt is voor 3Rail (Marklin) met rail detektie en galvanisch gescheiden van de micro controller, de schakeling heeft geen last van debounce.
ik kijk de komende dagen met belangstelling uit naar je reacties.
Titel: Re: Pret met Arduino
Bericht door: guy1846 op 29 juni 2020, 12:30:13
crossrail interface
De interface voor de verbinding met het arduino printje.
is bedoeld voor 3rail gebruikers.
100% veilig voor de micro controller dankzij de galvanische scheiding met opto coupler.
is uitvoerig getest.
kan met aparte kontaktrail verbonden worden, of met reeds aanwezige bezetmelder-aansluiting aan de kontaktrail zelf of een S88, of een mix van beiden.
kan uiteraard ook voor andere toepassing op de spoorbaan gebruikt worden.

(https://images.beneluxspoor.net/bnls/CROSSRAIL-SCHEMATIC-1_1.jpg) (https://images.beneluxspoor.net/bnls/CROSSRAIL-SCHEMATIC-1_1.jpg)



Titel: Re: Pret met Arduino
Bericht door: guy1846 op 01 juli 2020, 15:21:04

crossrail video

Code:[Selecteer]
[flash=640,480]https://www.youtube.com/v/QXV8STIhZhQ[flash]
Titel: Re: Pret met Arduino
Bericht door: 72sonett op 01 juli 2020, 15:41:56
https://www.youtube.com/v/QXV8STIhZhQ