Doel:€250.00
Donaties:€90.00

Per saldo:€-160.00

Steun ons nu!

Laatst bijgewerkt
op 15-02-2019
Algemeen

De stichting

Recente berichten

Etoile du Nord vooroorlogs, welke rijtuigen heb ik nodig? door roadster36
Vandaag om 00:55:43
Bröckenbahn door Chris Westerduin
Vandaag om 00:35:40
MB-module: "Groeten uit Jottum" door jakeman
18 februari 2019, 23:50:21
BNLS-Module: "Spoormuseum in H0" door Edsko Hekman
18 februari 2019, 23:48:07
Project 0m, iets heel anders: Rhätische Bahn door mwdb
18 februari 2019, 23:20:18
Fleischmann "Prima-Lux" constante treinverlichting door Klaas Zondervan
18 februari 2019, 23:18:30
Buitenlust door mwdb
18 februari 2019, 23:17:05
BNLS-Werkspoor - Eerste keer Messing/Witmetaal Modelloco 3300 door Tomasso
18 februari 2019, 23:15:26
Inzetbaarheid ACME 50584 ACME MU 71 84 72-70 622-2 NS door mDDM
18 februari 2019, 23:12:57
Nieuwe baan, nieuwe schaal van N naar H0e door NS264
18 februari 2019, 23:06:13
Doornvliet door NS264
18 februari 2019, 23:02:14
LA Yard in 0 door Ronald Halma
18 februari 2019, 22:59:27
De Hondsrugbaan, H0 door NS264
18 februari 2019, 22:53:17
Mijn eerste H0 modeltreinbaan in aanbouw door bosje77
18 februari 2019, 22:47:11
01TREFF Maarn, 16 &17 februari door douweterpstra
18 februari 2019, 22:45:09
MB-module: "L'Esimé" door Chris80
18 februari 2019, 22:35:04
Voor de betere priegelaars onder ons: rc in o.a. schaal 1:87 door DJV
18 februari 2019, 22:34:14
Onlangs gespot - gefotografeerd, de foto's door johanw
18 februari 2019, 22:29:37
Kopstation aan Noordzeekust Duitsland door DJV
18 februari 2019, 22:15:33
Bouw Bührtal III door nachbar
18 februari 2019, 22:13:10
BR97501 hoe werkt deze lok? door puntenglijder
18 februari 2019, 22:09:52
NS 4300 (in spoor 0) door FritsT
18 februari 2019, 21:53:33
Verbouwing Magic Train (schaal 0e) door Wim Corduwener
18 februari 2019, 21:49:04
Het ontstaan van Trammenlandt door Marco EB
18 februari 2019, 21:44:47
"Litter Bin" voor Brits spoor en Britse modelspoorprojecten door St00mboy
18 februari 2019, 21:44:05
BNLS-Module: "Rvbr-Btk, Ringvaartbrug Haarlemmermeer nabij Buitenkaag" NS H0 door Hendrik Jan
18 februari 2019, 21:37:41
Bouw spoor nul module baan bahnhof Königshofen tijdperk III door bernhard67
18 februari 2019, 21:00:36
Terschellinger Spoor door Duizendpoot
18 februari 2019, 20:58:06
De bouw van mijn modelbaan in Thailand door DJV
18 februari 2019, 20:11:59
Een Elotrains 1500 zelf bouwen uit parts door duikeend
18 februari 2019, 19:49:54
  

Auteur Topic: Pret met Arduino  (gelezen 6263 keer)

PieterHa

  • Offline Offline
  • Berichten: 35
Re: Pret met Arduino
« Reactie #60 Gepost 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
« Laatst bewerkt op: 11 februari 2019, 12:25:18 door Bert van Gelder »

Jeroen Vreeken

  • Offline Offline
  • Berichten: 208
Re: Pret met Arduino
« Reactie #61 Gepost 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.

PieterHa

  • Offline Offline
  • Berichten: 35
Re: Pret met Arduino
« Reactie #62 Gepost op: 11 februari 2019, 11:42:11 »

Bedankt voor de uitleg.

Groeten, Pieter
« Laatst bewerkt op: 11 februari 2019, 12:25:40 door Bert van Gelder »

Bert van Gelder

  • Team forummoderators
  • Offline Offline
  • Berichten: 3299
Re: Pret met Arduino
« Reactie #63 Gepost 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

bask185

  • Offline Offline
  • Berichten: 119
Re: Pret met Arduino
« Reactie #64 Gepost 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.

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4306
Re: Pret met Arduino
« Reactie #65 Gepost 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
Verzonden vanaf mijn desktop met Firefox

bask185

  • Offline Offline
  • Berichten: 119
Re: Pret met Arduino
« Reactie #66 Gepost 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

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4306
Re: Pret met Arduino
« Reactie #67 Gepost 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:
« Laatst bewerkt op: 12 februari 2019, 08:59:37 door Timo »
Verzonden vanaf mijn desktop met Firefox

meino

  • Offline Offline
  • Berichten: 338
Re: Pret met Arduino
« Reactie #68 Gepost 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
 
A clean desk is a sign of an empty mind

RudyB

  • Offline Offline
  • Berichten: 495
  • EMV
    • RudysModelRailway
Pret met Arduino 14 Day Night Cycle with millis(), no Delay, Direct Feedback
« Reactie #69 Gepost 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



RudyB

  • Offline Offline
  • Berichten: 495
  • EMV
    • RudysModelRailway
Pret met Arduino 15 LED Dimmer, analogWrite(), Pulse Width Modulation
« Reactie #70 Gepost 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



« Laatst bewerkt op: 17 februari 2019, 11:08:39 door RudyB »

gvandersel

  • HCC!m maar toch Selectrix (RMX)
  • Offline Offline
  • Berichten: 3289
  • Als het maar elektrisch is.
    • Homepage Gerard van der Sel
Re: Pret met Arduino
« Reactie #71 Gepost 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.
Holzburg (IIIb/IVa) schaal N.
Kijk ook eens bij de bouw en lees de avonturen.

meino

  • Offline Offline
  • Berichten: 338
Re: Pret met Arduino
« Reactie #72 Gepost 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 en https://playground.arduino.cc/Main/TimerPWMCheatsheet

Overigens heb ik zelf dit nog niet uitgeprobeerd.

Groet Meino
A clean desk is a sign of an empty mind