Doel:€250.00
Donaties:€90.00

Per saldo:€-160.00

Steun ons nu!

Laatst bijgewerkt
op 15-02-2019
Algemeen

De stichting

Recente berichten

MB-module "Dolce far N-te" door sdz1976
Vandaag om 07:40:20
Onlangs gespot - gefotografeerd, de foto's door Luc2000
Vandaag om 07:37:33
MB-module: "L'Esimé" door Daniels
Vandaag om 07:21:21
Start met TT door SimonSt
Vandaag om 06:13:54
Project 0m, iets heel anders: Rhätische Bahn door Tulpendaal
Vandaag om 06:02:15
De bouw van mijn modelbaan in Thailand door Hans Grasmaijer
Vandaag om 05:21:01
"Litter Bin" voor Brits spoor en Britse modelspoorprojecten door jandejager
Vandaag om 04:28:09
NL Baan in Canada door ArjanB
Vandaag om 03:38:50
Roco NS Sik Pimpen, kleur groen gezocht. door Biessendorf
Vandaag om 01:10:34
Verbouwing Magic Train (schaal 0e) door Sven
Vandaag om 00:25:04
BMB 00-modulebaan, Algemeen. door Pinkelpa
Vandaag om 00:22:50
Skapa.modell door Zillertalbahn002
Vandaag om 00:15:34
01TREFF Maarn, 16 &17 februari door ingenium
Vandaag om 00:08:59
Een Elotrains 1500 zelf bouwen uit parts door SuperSylvester
17 februari 2019, 22:56:05
Bouw Br 01 226, Ersatzlok Henschel-Wegmann. door wob
17 februari 2019, 22:46:23
Toon hier je nieuwe (model-) spooraanwinst(en)... door roadster36
17 februari 2019, 22:42:43
Welke soort printplaat door Dartje75
17 februari 2019, 22:34:55
Mijn eerste H0 modeltreinbaan in aanbouw door Bert V
17 februari 2019, 22:31:48
Inzetbaarheid ACME 50584 ACME MU 71 84 72-70 622-2 NS door Rondje_HO
17 februari 2019, 22:22:18
Piko 2019 door Quinzeedied
17 februari 2019, 22:20:44
NS 4500 van MK Modelbouwstudio's door roadster36
17 februari 2019, 22:16:10
Luck Feinmechanik door Erik_omBC
17 februari 2019, 22:04:46
Depot 2 door Hans Reints
17 februari 2019, 21:59:10
Sluiting traject Geldermalsen-Elst? door Martin Hornis
17 februari 2019, 21:34:56
BNLS trammodule: “Jewels of the HTM” door martijn v m
17 februari 2019, 21:26:35
Mooi weer om buiten te spelen door St00mboy
17 februari 2019, 21:25:10
Kappen DH1 Wadloper door Biesje
17 februari 2019, 21:19:57
Westlandbaan door Christoph
17 februari 2019, 21:04:16
NS modelbaan Hoekdam H0 door guus43
17 februari 2019, 20:40:21
Ombouw/Pimpen Bolle neuzen door bollen neus
17 februari 2019, 20:38:57
  

Auteur Topic: Pret met Arduino  (gelezen 6085 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: 337
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 »