Doel:€250.00
Donaties:€105.00

Per saldo:€-145.00

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

Laatst bijgewerkt
op 26-10-2020
Algemeen

De stichting

Recente berichten

Projekt 083-338 door puntenglijder
Vandaag om 08:34:08
B-Models containerdraagwagens - Hoe zijn de ervaringen? door Arjan6511
Vandaag om 08:33:43
Mijn eerste H0-modeltreinbaan in aanbouw door Wim Vink
Vandaag om 08:29:31
Update: baan in de tropen door Edgy
Vandaag om 08:27:21
Goederenloods Apeldoorn door Arjan6511
Vandaag om 08:22:19
Postwagen/Dg HSM P445 / NS 2001 in messing. Schaal 0. door Tulpendaal
Vandaag om 07:20:53
Gekke/vreemde/rare filmpjes en video's met treinen erin. door Eric B
Vandaag om 07:19:10
BR 81 met rookgenerator in O voor belachelijk lage prijs door Eric B
Vandaag om 06:21:26
Relaisbesturing of toch Arduino? door Erik Baas
Vandaag om 01:20:59
Station Apeldoorn, op foto's en ansichtkaarten door hmmglaser
Vandaag om 00:35:16
Grunn, NS modelbaan tijdperk IIIa door Rondje_HO
Vandaag om 00:06:46
NCS 7/8 tot NS 61 62 Maffei lok in spoor 0 door FritsT
30 oktober 2020, 23:43:46
DR4088 aansluiting en diodeschakeling door Klaas Zondervan
30 oktober 2020, 23:25:16
Een kleine baan in een grote schaal: Laden en lossen in 1:22.5 door NS1220
30 oktober 2020, 22:52:02
Digitaal pendelen met Lenz ABC-systeem - Esu Lokpilot V5 door VvKan
30 oktober 2020, 22:50:03
Multimaus programmeren : probleem 2 locs zelfde adres door Bahn-AG
30 oktober 2020, 22:24:40
Tortoise en DR4018 maakt een halve beweging door Klaas Zondervan
30 oktober 2020, 22:24:27
Rocrail gebruikersgroep door Hans1963
30 oktober 2020, 22:17:15
Waarom bij Lenz geen diodes bij ongedetecteerde railstukken? door Klaas Zondervan
30 oktober 2020, 22:01:24
Van Fleischmann spoor N, naar beginner Märklin spoor h0 digitaal door Bahn-AG
30 oktober 2020, 21:50:40
Ontraxs 2021 GEANNULEERD, nieuwe datum n.n.b. door Gerard van de Weijer
30 oktober 2020, 21:47:38
Toon hier je nieuwe (model-) spooraanwinst(en)... door roadster36
30 oktober 2020, 21:42:30
Ergensnergens in H0e door NS1220
30 oktober 2020, 21:41:42
Paul's model train stuff door Duikeend
30 oktober 2020, 21:38:19
NS modelbaan Hoekdam H0 door Rob E.
30 oktober 2020, 21:33:40
Kopen in de VS door Alexander
30 oktober 2020, 21:27:19
Laag-Baarlo door Mark Lin
30 oktober 2020, 21:26:56
Ervaringen met bezorgdiensten (PostNL, DHL, etc) door Rob E.
30 oktober 2020, 21:14:48
Spoor op industrieterrein Lage Weide door Jos_1972
30 oktober 2020, 21:08:35
EifelBurgenBahn door Reinout van Rees
30 oktober 2020, 20:59:08
  

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

Hennik

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

  • Online Online
  • Berichten: 841
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: 287
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: 102
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

  • Online Online
  • Berichten: 841
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: 102
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: 881
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: 102
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

  • Online Online
  • Berichten: 841
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

  • Online Online
  • Berichten: 841
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

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

  • Online Online
  • Berichten: 841
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

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

  • Online Online
  • Berichten: 841
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