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

Geluid NS Mat'46 vs NS Mat'54 door Thom
Vandaag om 02:40:57
On traXS 15 t/m 17 maart Spoorwegmuseum Utrecht door MrBoembas
Vandaag om 02:36:33
De bouw van mijn modelbaan in Thailand door Thai-Bundesbahn
Vandaag om 02:07:57
Mallnitzer Tauernbahnstrecke ÖBB N Spoor door Schachbrett
Vandaag om 00:54:59
Bahnstrecke 5867 door Schachbrett
Vandaag om 00:39:27
Mijn Ned. N. Spoorbaan ''Echthoven'' door Schachbrett
Vandaag om 00:37:53
Bouw Bührtal III door Schachbrett
Vandaag om 00:36:33
Schneidersein door MartinRT
Vandaag om 00:00:05
NS/32 door RK
18 maart 2024, 23:49:38
Modelbaan Beltheim. door Ronald69
18 maart 2024, 23:41:34
01TREFF 2024, 26&27 OKTOBER door bernhard67
18 maart 2024, 23:27:22
Mijn eerste H0-modeltreinbaan in aanbouw door Modelbaan BeltHeim
18 maart 2024, 23:18:36
De Hondsrugbaan door Modelbaan BeltHeim
18 maart 2024, 23:17:58
Vraag over 20 voets container met vlakke zijwanden door MOVisser
18 maart 2024, 23:09:27
Ijzeren Rijn: militair transport door ijzeren rijn
18 maart 2024, 23:03:28
Perronhoogte TP3 door Klaas Zondervan
18 maart 2024, 22:35:55
Kranenberg, een exercitie in code 70 door wob
18 maart 2024, 22:14:45
EifelBurgenBahn door Reinout van Rees
18 maart 2024, 22:07:31
Loconet over TCP/IP door bask185
18 maart 2024, 22:00:49
bezetmelder aantal lengte en treinstellen door Bobos
18 maart 2024, 21:36:41
Les Billards du Vivarais door Hans1963
18 maart 2024, 21:36:19
plaatsen bezetmelders lengte en treinstellen door Bobos
18 maart 2024, 21:33:54
Am Ende der Strecke, modulebaan op 1 M2 door Frank 123
18 maart 2024, 21:34:50
Resetten decoder via Twin Center Fleischmann door Pieter Bregman
18 maart 2024, 21:33:18
Foto's gevraagd Den Haag CS, oude toestand door Pauldg
18 maart 2024, 21:30:41
Zee. Land. door Huup
18 maart 2024, 21:23:57
Digikeijs DR80010 door TBBW
18 maart 2024, 20:03:37
US diorama in H0 door basjuh1981
18 maart 2024, 20:02:44
Kemlerborden (Gevi / UN nummers) ketelwagens door Falkenberg
18 maart 2024, 19:36:20
Rheinburg, TP V/VI door gdh
18 maart 2024, 19:15:56
  

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

Hennik

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

ikbenerevenniet

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

Hennik

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

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

bask185

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

Train-Science.com
Train-Science github
It ain't rocket science ;-)

meino

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

meino

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