Doel:€250.00
Donaties:€40.00

Per saldo:€-210.00

Steun ons nu!

Laatst bijgewerkt
op 15-08-2019
Algemeen

De stichting

Recente berichten

Baanbouw Bosje77 door bosje77
Vandaag om 20:08:35
Lima V80/BR280, ontbrekend onderstel door Biesje
Vandaag om 19:57:14
Toon hier je nieuwe (model-) spooraanwinst(en)... door Klaas Zondervan
Vandaag om 19:48:52
Station Rekerdam door Joran
Vandaag om 19:41:25
Mijn eerste H0-modeltreinbaan in aanbouw door bosje77
Vandaag om 19:41:11
Modules van Kees Gorter door ca.gorter
Vandaag om 19:35:48
Bouw NS 2200 in spoor-0 door JaJo
Vandaag om 18:29:40
EifelBurgenBahn door Reinout van Rees
Vandaag om 18:23:47
CityNightLine 1:1, 1:87 en 1:160 door Fritsprt
Vandaag om 18:21:22
Mijn baan (Erwin) door metpetergaathetbeter
Vandaag om 18:06:08
(Hoontje's Beursbaan) "Kamp Rijen" door Hoontje
Vandaag om 17:59:38
Update: baan in de tropen door Patrick1975
Vandaag om 17:54:43
Projekt 083-338 door 44
Vandaag om 17:45:04
Depot + vervolg Vlieringen-2 door Hans Reints
Vandaag om 17:44:58
Hoekdiorama door Scratchbuilt
Vandaag om 17:44:03
Baanbouw met Ecos besturing genaamd: Giessenstad Rbf door Johnnytrein
Vandaag om 15:58:12
Wie heeft ervaring met ESU Ecos + MultiMaus? door lare0008
Vandaag om 15:42:50
Onlangs gespot - gefotografeerd, de foto's door Floris
Vandaag om 14:49:30
Woonkamer Diorama "Station Almelo" door maarten_siffels
Vandaag om 14:44:57
LTM-51 Garratt in messing, Spoor-0 door FritsT
Vandaag om 14:39:05
Roco 2400 is defect door edwin1974
Vandaag om 14:37:08
Decoder foppen door weerstand ipv motor door Timo
Vandaag om 14:32:50
Westlandbaan door Niels B
Vandaag om 14:30:21
Bentheimer Eisenbahn, gisteren, vandaag en morgen. door Hans Reints
Vandaag om 13:41:50
Baan in Los Angeles door AndrevdG
Vandaag om 13:34:48
Zoutkamp 1921 - 1942 door MR
Vandaag om 13:25:24
Fleischman 434x onderdelen, maar waar door Tijdperk||
Vandaag om 13:22:51
Roco BR23, motor maakt veel geluid na decoderinbouw door Mechiel_
Vandaag om 13:21:36
Er ook ingerold door Wim Vink
Vandaag om 12:53:29
Nieuw huis, nieuwe baan door MOVisser
Vandaag om 12:35:09
  

Auteur Topic: Pret met Arduino  (gelezen 17108 keer)

PieterHa

  • Offline Offline
  • Berichten: 39
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: 39
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: 3394
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: 179
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: 4451
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: 179
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: 4451
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: 458
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

Kranenberg

RudyB

  • Offline Offline
  • Berichten: 529
  • 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: 529
  • 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: 3368
  • 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: 458
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

Kranenberg

Timo

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

RudyB

  • Offline Offline
  • Berichten: 529
  • EMV
    • RudysModelRailway
Pret met Arduino 16 LED Dimming with Fade, analogWrite(), millis()
« Reactie #74 Gepost 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()