Doel:€250.00
Donaties:€55.00

Per saldo:€-195.00

Steun ons nu!
Actie: steun €2.50 via de Wim Vink kalender 2021!

Laatst bijgewerkt
op 18-10-2020
Algemeen

De stichting

Recente berichten

Doornvliet door cor_b
Vandaag om 11:27:49
Mijn eerste H0-modeltreinbaan in aanbouw door Wim Vink
Vandaag om 11:26:57
NS modelbaan Hoekdam H0 door Ronald1974
Vandaag om 11:25:58
"Bij nader omzien", een Nederlands spoorwegfotoarchief door Dpc Fo
Vandaag om 11:19:40
BNLS-module: "Werkspoor-Kathedraal" door Niels B
Vandaag om 11:16:21
DCCNext, een nieuwe DCC decoder! door heuvelbaan
Vandaag om 11:14:44
Projekt 083-338 door 44
Vandaag om 10:51:08
Martin's geknoei met groen.. door Ronald Koerts
Vandaag om 10:45:37
Asse-Bad - Assche-les-Bains door wpinkhof
Vandaag om 10:29:54
Minimale lengte terugmeldsectie door VvKan
Vandaag om 10:26:14
Den Zoeterdam 1/87 H0 366x110 door Arjan6511
Vandaag om 10:24:51
Keuzeschakelaar digitaal/analoog door hgr
Vandaag om 10:23:56
Eerste H0, Marklin M-rail modelbaan door nkob
Vandaag om 10:22:29
Raadplaatje door Falkenberg
Vandaag om 10:16:25
Postwagen/Dg HSM P445 / NS 2001 in messing. Schaal 0. door mwdb
Vandaag om 10:14:50
Pola Maxi spoor naar Staatsspoor 626 in 0 door daempfer
Vandaag om 09:47:33
Baanbouw Bosje77 door Wim Vink
Vandaag om 09:25:04
Baanbouw Frycio; eindelijk ruimte door Frycio82
Vandaag om 09:13:09
Bouw Br 03 001 Borsig door puntenglijder
Vandaag om 07:28:10
Update: baan in de tropen door Hans Grasmaijer
Vandaag om 05:32:42
Gezocht: kleine trekveertjes, 6mm, diameter 3mm? door Hans Grasmaijer
Vandaag om 02:58:50
Old England door sdz1976
Vandaag om 01:16:04
Bouw "Bahnhofsvorfeld" door mwdb
Vandaag om 00:31:34
LGB-tuinbaan, gezocht: foto's en/of ontwerpen. door Kvdmodelspoor
23 oktober 2020, 23:40:17
Onlangs gespot - gefotografeerd, de foto's door Focus2
23 oktober 2020, 23:23:43
De bouw van een modulebaan met Nederlands Landschap door Hendrik Jan
23 oktober 2020, 23:16:54
Nieuwe datum Nederlandse Modelspoordagen Rijswijk, 24-26 sept. ‘21 door Hendrik Jan
23 oktober 2020, 23:14:25
Model van vrachtauto van Technische Unie door adrievanst
23 oktober 2020, 23:11:14
Modelbouwwedstrijd op TV. door W. Thomas
23 oktober 2020, 21:38:27
Artitec: Plan E, serie 2020, materieelbespreking door Duvel
23 oktober 2020, 20:42:52
  

Auteur Topic: Zonder fouten een Arduino programmeren  (gelezen 5952 keer)

Hennik

  • Offline Offline
  • Berichten: 92
Re: Zonder fouten een Arduino programmeren
« Reactie #75 Gepost op: 28 juni 2020, 21:04:38 »
Hallo Bas,

Ik heb je "Weistruino" regelaar uitgeprobeerd en hij doet het fantastisch... Een analoge lok die normaal slecht op gang komt, veel last van kleef, rijdt met deze regelaar mooi langzaam weg  (y)

In jouw sketch moest ik alleen deze aanpassing doen, anders komt ie bij mij maar één keer bij de setSpeed in de if. Ik heb een Uno gebruikt.
    //byte currentTime = millis() & 0xff;
    //static byte previousTime = 0;
    unsigned int currentTime = millis() & 0xff;
    static unsigned int previousTime = 0;

Ik heb geen H-brug gebruikt, maar een enkele Mosfet achter een optocoupler.
Met een H-brug van Alie had ik al eens eerder gemerkt dat er sluiting ontstaat als er vanaf een permanent gevoede sectie naar de H-brug-sectie wordt overgestoken, waarbij opgemerkt dat de voeding van de H-brug dezelfde was als die van de permanent gevoede sectie.

bask185

  • Offline Offline
  • Berichten: 818
Re: Zonder fouten een Arduino programmeren
« Reactie #76 Gepost op: 28 juni 2020, 21:55:48 »
Blij dat die het doet. Ik heb even gekeken waarom het niet goed werkte.
if(currentTime - previousTime >= 200) { // 5 updates per seconde
        previousTime = currentTime;
Na de eerste maal in if-statement krijgt previousTime de waarde 200. Vanaf dat punt moet currentTime gelijk of hoger dan 400 kunnen worden. En zijnde het een byte, kon dit niet.

Het is in dit geval alleen nodig om een currentTime te veranderen in een unsigned int. De previous mag wel een byte zijn.

Bas

Erik Baas

  • Offline Offline
  • Berichten: 279
Re: Zonder fouten een Arduino programmeren
« Reactie #77 Gepost op: 28 juni 2020, 22:22:41 »
Neem nou meteen een unsigned long, anders loop je later weer stuk...

Hennik

  • Offline Offline
  • Berichten: 92
Re: Zonder fouten een Arduino programmeren
« Reactie #78 Gepost op: 28 juni 2020, 22:47:55 »
Ik moet na wat verder testen wel iets terugkomen op de regeleigenschappen.
Bij een belabberde loc ging het redelijk, maar een normaal goedlopende loc schokt enorm in het lagere regelbereik (tot ca 30/100) Maar wellicht ligt dat aan mijn simpele Mosfet schakelingetje...
In ieder geval leuk om verder mee te knutselen.

bask185

  • Offline Offline
  • Berichten: 818
Re: Zonder fouten een Arduino programmeren
« Reactie #79 Gepost op: 28 juni 2020, 22:57:09 »
Neem nou meteen een unsigned long, anders loop je later weer stuk...
Ik gebruik voor mezelf al geen millis meer. Ik gebruik 8 bit counters die in een ISR naar 0 tellen. In mijn code zie je vaak:
if( !someTimer ) {
    someTimer = 5; // afhankelijk van de gekozen tijdbasis kan dit 5ms, 5cs, 5ds of 5s zijn
Minder tikwerk en minder geheugen gebruik. Het is ook erg dynamisch en werkt goed mijn state-machine structuur. Het werkt alleen absoluut niet goed als je het in een class wilt bouwen.

@Hennik
Ik heb deze Weistra regelaar 1x gebruikt thuis, had idd goede rij-eigenschappen, maar de knipperende lichtjes op 20Hz... ik had geen zin om de loc aan te passen dus ik ging op 31kHz rijden, belabberd gedrag op de hoge snelheden, maar het ding rijdt.

Het kan misschien liggen aan eventuele onstoringscondensators of smoorspoelen. Ik heb het niet veel ervaring met dit soort problemen. Maar je kan je locs openschroeven om te kijken naar de verschillen.

Bas
« Laatst bewerkt op: 28 juni 2020, 23:01:46 door bask185 »

Hennik

  • Offline Offline
  • Berichten: 92
Re: Zonder fouten een Arduino programmeren
« Reactie #80 Gepost op: 20 september 2020, 22:37:00 »
Ik ben nog weer aan het stoeien geweest met de "Weistruino" regelaar.
Inmiddels ontdekt dat het schokkende gedrag veroorzaakt werd door een belabberde voeding. Ik had de gelijkspanningsuitgang van een simpele modelspoortrafo gebruikt, en die is alles behalve vlak, schoot me te binnen. Een elco loste dat direct op.

Nu probeer ik meerdere regelaars te definiëren in dezelfde sketch. Ik denk dan aan een array.
Weistra regelaar(13); // maak het object en gebruik pin 13

Weistra is het type object en regelaar is de naam. Kan deze als array gedefinieerd worden (zoals de servo library) t.b.v. laten we zeggen 3 regelaars?

Wat ik geprobeerd heb is:
const byte regelaarPin[3] = {2,3,4};
Weistra regelaar[0](regelaarPin[0]);
Dat accepteert de compiler nog... maar zo gauw ik Weistra regelaar[1](regelaarPin[1]); toevoeg, dan volgt de foutmelding "conflicting declaration 'Weistra regelaar [1]'"

Of moet hiervoor iets in de Weistra library aangepast worden?


meino

  • Online Online
  • Berichten: 876
Re: Zonder fouten een Arduino programmeren
« Reactie #81 Gepost op: 20 september 2020, 23:14:23 »
Je werkt met een array, die moet je anders initialiseren

const byte regelaarPin[3] = {2,3,4};
Weistra regelaar[3] = {Weistra(regelaarPin[0]), Weistra(regelaarPin[1]), Weistra(regelaarPin[2])};

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

Kranenberg
De CanBus komt naar Kranenberg

Hennik

  • Offline Offline
  • Berichten: 92
Re: Zonder fouten een Arduino programmeren
« Reactie #82 Gepost op: 22 september 2020, 23:44:45 »
Bedankt Meino, dat had ik echt nooit zelf kunnen verzinnen.

Weer een stapje verder dus, maar nog niet helemaal.
Geen compilatiefouten meer, maar nog wel een probleem om void setup()
{
    regelaar.begin(); // initialiseert de regelaar
}
om te bouwen naar een array.

Wat werkt is:const byte regelaarPin[3] = {2,3,4};
Weistra regelaar[3] = {Weistra(regelaarPin[0]), Weistra(regelaarPin[1]), Weistra(regelaarPin[2])};

void setup()
{
    regelaar[0].begin(); // initialiseert de 1e regelaar
}

Maar als ik doe:
void setup()
{
    regelaar[0].begin(); // initialiseert de 1e regelaar
    regelaar[1].begin(); // initialiseert de 2e regelaar
}
ofvoid setup()
{
  for(byte i=0; i<numRegelaars; i++)
  {
    regelaar[i].begin(); // initialiseert alle regelaars
  }
}

Dan zie ik in de serialmonitor de waarde van throttle nog netjes variëren met de stand van de potmeter, maar de outputpinnen blijven laag.

Hoe de Weistra begin() method te gebruiken?

bask185

  • Offline Offline
  • Berichten: 818
Re: Zonder fouten een Arduino programmeren
« Reactie #83 Gepost op: 23 september 2020, 08:45:51 »
Ik zit op werk en kan niet bijzonder veel doen. Ik heb natuurlijk wel permanent een arduino aan mijn PC hangen. In de pauze zal ik ook proberen om met een array 3 objecten te maken. Ik heb echter alleen led pin 13 als visuele hulpmiddel om te zien of 1 van de regelaren het daadwerkelijk doet of niet.

Ik heb overigens een vermoeden van iets wat ik fout gedaan zou kunnen hebben. Ik had vorige maand namelijk iets nieuws geleerd wat ik nog niet eerder wist, dus ik zal de code ook even nalopen.

Mvg,

Bas

bask185

  • Offline Offline
  • Berichten: 818
Re: Zonder fouten een Arduino programmeren
« Reactie #84 Gepost op: 23 september 2020, 09:01:21 »
Ja ik zie het al, ik heb een fout gemaakt in de update functie:

void Weistra::update() {
    static byte counter = 0;
    static uint32_t prevTime = 0;

    if( portx_p != 0 ) {
        uint32_t currentTime = micros()/* & 0x0000FFFF*/; // we only use the last 2 bytes of micros()

        if( currentTime - prevTime >= intervalTime ) { // interval
            prevTime = currentTime;

           
            if( counter == 0 && dutyCycle > 0) {  // if counter reaches 100, reset it to 0 and enable the track power pin
                *portx_p |=  trackPin;
            }
            if( counter == dutyCycle && dutyCycle < 100) {
                *portx_p &= ~trackPin;
            }
            counter++;
            if(counter > 100) counter = 0;
        }
    }
}

Omdat deze functie een deel is van een class (ofwel we noemen het nu een 'method') mag ik geen static variabele gebruiken. Deze static variabele zijn lokale variabele, static zorgt er voor dat deze variabele hun waarde blijven behouden buiten de functie om. Normaal is dat rete handig om te gebruiken, maar niet je als je met met classes en meer dan 1 object ga werken.

Doordat we 3 objecten hebben gemaakt met dezelfde class, delen deze 3 objecten exact dezelfde variabele (prevTime en counter). Dit zou misschien ooit handig kunnen zijn als je wilt dat verschillende objecten met elkaar kunnen communiceren maar nu is het resultaat catastrofaal.

De fix
In weistra.cpp zet deze lijnen in commentaar of verwijder ze helemaal.
//   static byte counter = 0;
 //   static uint32_t prevTime = 0;

In weista.h moet je achter het 'private' labeltje het volgende toevoegen:
private:
    unsigned int  intervalTime;
    unsigned char dutyCycle;
    unsigned char trackPin;

    uint32_t prevTime; // <-- voeg toe (uint32_t is het zelfde als unsigned long)
    uint8_t counter;     // <-- voeg toe (uint8_t is hetzelfde als byte)

Feitelijk geef je elke object nu hun eigen variabelen die nodig zijn voor de werking.

Ik kwam hier vorige maand achter toen ik er achter kwam dat mijn debounceClass niet goed werkte als ik 2 of meer inputs wilde 'deboucen'. Ik merkte dat er een soort overspraak was tussen de verschillende inputs die niet mogelijk zou moeten zijn.

Mijn excuses voor het ongemak en veel treinplezier verder.

Mvg,

Bas


meino

  • Online Online
  • Berichten: 876
Re: Zonder fouten een Arduino programmeren
« Reactie #85 Gepost op: 23 september 2020, 09:46:10 »
Omdat deze functie een deel is van een class (ofwel we noemen het nu een 'method') mag ik geen static variabele gebruiken. Deze static variabele zijn lokale variabele, static zorgt er voor dat deze variabele hun waarde blijven behouden buiten de functie om. Normaal is dat rete handig om te gebruiken, maar niet je als je met met classes en meer dan 1 object ga werken.

En dus in strijd met alle regels betreffende goed programmeren. Dat was iets dat ik bij een code review er uit liet halen, bedenk maar wat anders.

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

Kranenberg
De CanBus komt naar Kranenberg

bask185

  • Offline Offline
  • Berichten: 818
Re: Zonder fouten een Arduino programmeren
« Reactie #86 Gepost op: 23 september 2020, 10:01:36 »
En dus in strijd met alle regels betreffende goed programmeren  in C++ ..

..bedenk maar wat anders.
Je hebt wel het gedeelte achter "De fix" gelezen?? Ik heb er alweer private variabele van gemaakt en gepusht op git

meino

  • Online Online
  • Berichten: 876
Re: Zonder fouten een Arduino programmeren
« Reactie #87 Gepost op: 23 september 2020, 10:20:41 »
Dag Bas

De rest had ik zeker wel gelezen. Maar het ging mij meer over je opmerking "dat is rete handig...." omdat dat suggereert dat je dit soort constructies vaak gebruikt. Ik heb in mijn werkzame leven te veel door de bagger van anderen moeten spitten om zaken aan de praat te krijgen. Dus er zijn programmeer constructies die ik simpelweg fout vind en door hoort het gebruik van static variabelen zeker bij. Dat is misschien ook een reden dat ik een sterke affiniteit met "Object Oriented..." heb.

Groet Meino

A clean desk is a sign of an empty mind

Kranenberg
De CanBus komt naar Kranenberg

Hennik

  • Offline Offline
  • Berichten: 92
Re: Zonder fouten een Arduino programmeren
« Reactie #88 Gepost op: 23 september 2020, 10:26:29 »
Het werkt nu, ook met meerdere regelaars op één arduino. Bedankt Bas!

bask185

  • Offline Offline
  • Berichten: 818
Re: Zonder fouten een Arduino programmeren
« Reactie #89 Gepost op: 23 september 2020, 11:09:53 »
@hennik
 (y)

@Meino,
Dat hangt af van de toepassing of static handig is of niet, soms moet je wel. Class -> nee. ISR -> ja

Als ik bijvoorbeeld in de void loop 10 functies heb lopen die allemaal getimed worden met millis() worden dan vind ik het zelf logischer om elke functie een static 'prevTime' te geven. Aangezien elke 'prevTime' alleen in 1 functie wordt gebruikt, vind ik het zelf beter om de scoop dan te beperken tot die functie. Alle 10 de functies kunnen dan allemaal dezelfde naam 'prevTime' blijven gebruiken zonder conflicten. En bedenk, het alternatief zou 10 verschillend genaamde globale variabelen zijn? Je kan misschien iets leuks met namespace of structs doen of een andere C++ feature met ingewikkelde syntax gebruiken die ik nog niet ken?

void foobar() {
    static uint32_t prevTime = 0 ;
    uint32_t currentTime = millis() ;

    if( currentTime > ( prevTime + interval ) ) {
        prevTime = currentTime ;

        // code 2 run
    }
}
muv de interval constante, kan je de code zo kopieren voor andere functies. En ik ben van mening dat meeste beginnelingen snappen wat hier gebeurt, zelfs als ze static niet kennen, komt de context wel over. Ik denk dat ik hier trouwens ook nog een schitterend setje macro's voor zou kunnen maken   ::) Maar nu wil ik je niet boos maken natuurlijk :P

Er is trouwens een leuke library genaamd 'fireTimer' die denk ik meer jouw voorkeur heeft, daar die OOP is. Ik hem nog niet zelf gebruikt, maar de syntax bevalt mij wel.
En je hoeft helemaal weinig te tikken:
FireTimer msTimer;

void setup()
{
  msTimer.begin(1000); // every 100ms
}

void loop() {
  if( msTimer.fire() ) {
    // code 2 run
  }
}
Doet onderhuids precies hetzelfde :police:

Mvg,

Bas