Doel:€250.00
Donaties:€50.00

Per saldo:€-200.00

Steun ons nu!

Laatst bijgewerkt
op 03-01-2024

Vacature: secretaris bestuur
Algemeen

De stichting

Recente berichten

Piko NS 2015 stroomafname probleem door hmmglaser
Vandaag om 17:41:00
Mijn eerste H0-modeltreinbaan in aanbouw door aad52
Vandaag om 17:40:42
HSM D1715 door vpeters1984
Vandaag om 17:34:25
Beekdaelen in H0 door Stieven76
Vandaag om 17:17:41
Bauarbeiten im gange door 741230
Vandaag om 17:14:07
Punt- en hartstukken door FritsT
Vandaag om 17:11:38
Al mijn goede ideeën... door Monobrachius
Vandaag om 17:10:33
Gebruik je Arduino zonder te "programmeren" ;) door Rsd1000
Vandaag om 17:07:59
Welke Vallejo kleur voor drijfstangen van een DB stoomlocomotief? door Ronald69
Vandaag om 17:04:52
MARDEC, de Multifunctionele ARduino dcc DECoder. door Bert55
Vandaag om 17:02:41
Punt- en hartstukken door odaoda
Vandaag om 16:59:12
Toon hier je nieuwe (model-) spooraanwinst(en)... door Ronald69
Vandaag om 16:54:22
Ombouw/Pimpen Bolle neuzen door bollen neus
Vandaag om 15:58:15
US diorama in H0 door VAM65
Vandaag om 15:22:05
Hengelo in 1981-1982, maar dan anders: Kassenberg in N door spoorijzer
Vandaag om 15:08:30
Kleine Baan in H0 (≤ 0.5m²) door Jack Black (NS1220)
Vandaag om 15:06:14
U-vorm beperkte ruimte (H0 C-rails) door Jelmer
Vandaag om 14:58:04
Onlangs gespot - gefotografeerd, de links door Jeroen Water
Vandaag om 14:33:00
N spur scenery elementen maken van gips of klei? door Dave.......
Vandaag om 14:30:06
De overeenkomst tussen een Ovaalramer en een Motorpost. door RK
Vandaag om 14:28:54
Onlangs gespot - gefotografeerd, de foto's door mass am see
Vandaag om 14:18:46
BMB-Module: “Corfe Castle Station” door Hans van de Burgt
Vandaag om 14:07:52
welk jaar ging Marklin OVP voor wagons van blauw naar wit door Railman
Vandaag om 13:40:42
GSS Jubileumbaantje (0e / 0n30) door MacArthur
Vandaag om 12:55:30
NTM P1 in Schaal-1 door MaraNCS
Vandaag om 11:39:38
Rio Grande Southern - Lizard Head Pass door Hans GJ
Vandaag om 11:30:20
Variaties op Station Zetten Andelst in HO door Duikeend
Vandaag om 10:54:40
De IJmuider spoorlijn - korte geschiedenis en plaatjes door Vislijn
Vandaag om 10:42:29
Internationale Spoor 0 en 1 dagen in Gießen, 23 en 24 maart, 2024 door bernhard67
Vandaag om 08:42:53
De Hondsrugbaan door mass am see
Vandaag om 08:15:11
  

Auteur Topic: Pret met Arduino  (gelezen 52722 keer)

PieterHa

  • Offline Offline
  • Berichten: 72
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: 297
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: 72
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

  • Offline Offline
  • Berichten: 4387
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: 4007
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.
Train-Science.com
Train-Science github
It ain't rocket science ;-)

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4656
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: 4007
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
Train-Science.com
Train-Science github
It ain't rocket science ;-)

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4656
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: 2087
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
De CanBus komt naar Kranenberg

RudyB

  • Offline Offline
  • Berichten: 630
  • 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: 630
  • 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: 3602
  • 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: 2087
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
De CanBus komt naar Kranenberg

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4656
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: 630
  • 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()