Doel:€250.00
Donaties:€88.00

Per saldo:€-162.00

Steun ons nu!

Laatst bijgewerkt
op 03-06-2025

Vacature: secretaris bestuur
Algemeen

De stichting

Recente berichten

Mijn eerste H0-modeltreinbaan in aanbouw door Vroeger
Vandaag om 06:16:38
EL11 NSB sound file door GerardH
Vandaag om 02:53:29
M.s.v. De Percee bouwt aan nieuwe clubbaan door J. Moors
Vandaag om 01:11:26
Klein mobiel ontwerp met thema stadsmuren door bask185
Vandaag om 00:39:31
Interieur ideeën voor gebouwen door Martin Domburg
Vandaag om 00:03:02
booster vraag door AP3737
09 August 2025, 23:59:48
Mooi weer om buiten te spelen door hervé
09 August 2025, 23:49:50
DDAR op basis van een Artitec DDM door Duikeend
09 August 2025, 23:30:56
Mallnitzer Tauernbahnstrecke ÖBB N Spoor door Schachbrett
09 August 2025, 23:29:13
Edelweisz in model door odaoda
09 August 2025, 23:07:44
Bouwbeschrijving Pec ex Dec van FRIE door 1200blauw
09 August 2025, 22:47:17
Sfeer op je modelbaan door meino
09 August 2025, 22:42:28
Zelf gebogen brug maken door schipcas
09 August 2025, 22:28:23
Onlangs gespot - gefotografeerd, de foto's door GerardvV
09 August 2025, 21:56:39
Raadplaatje door GerardvV
09 August 2025, 21:37:11
BR-18.6 Schaal-0. door FritsT
09 August 2025, 21:29:00
Trix BR94 ontspoort door Klaas Zondervan
09 August 2025, 21:26:08
Wat was jullie allereerste loc? door Robert vh Prutsert
09 August 2025, 20:45:22
Modules van Kees Gorter (vervolg) door ca.gorter
09 August 2025, 20:14:32
Toon hier je (model)TRAM foto's. door Huup
09 August 2025, 19:53:18
Hoe een Train-O-Matic lokdecoder voorzien van een lang adres ? door Ben
09 August 2025, 18:06:27
Welke 4-polige stroomvoerende koppeling is dit? door AlbertG
09 August 2025, 17:51:42
NS 8800 in spoor 0 door BartvD
09 August 2025, 17:44:39
Programmeren cv door Martin Domburg
09 August 2025, 17:39:44
De Projecten van RetroJack door Wim Vink
09 August 2025, 17:30:36
ByPass Junction, een Amerikaanse modelbaan in N door RobVille
09 August 2025, 16:27:14
Ombouw/Pimpen Bolle neuzen door bollen neus
09 August 2025, 15:59:22
Bentheimer Eisenbahn, gisteren, vandaag en morgen. door Hans Reints
09 August 2025, 15:55:30
23 augustus modelspoorbeurs Houten door Biesje
09 August 2025, 15:44:26
CIWL of toch niet?? Maar wat dan wel? door martijnhaman
09 August 2025, 14:19:41
  

Auteur Topic: Arcomora en mijn begrip van Arduino  (gelezen 8498 keer)

ron.kraaijkamp

  • Offline Offline
  • Berichten: 272
    • Mijn baan in opbouw op 2RSweb
Re: Arcomora en mijn begrip van Arduino
« Reactie #30 Gepost op: 31 August 2020, 12:42:04 »
Hallo Bas,

Ik snap wat je bezig houd. Zo'n probleem laat je niet los. Vroeger had ik een papiertje naast het bed, voor ideeen die ik 's nachts kreeg.

Ik begrijp wat je beschrijft en waarom het niet wilde werken.
Vanavond zal ik eens kijken. Ik ben net als jij aan het werk en dat kost best veel tijd ;-).
 Ik hoop over een paar jaar met vervroegd pensioen te gaan. Heb ik meer tijd.

Alweer bedankt.
mvg Ron

ron.kraaijkamp

  • Offline Offline
  • Berichten: 272
    • Mijn baan in opbouw op 2RSweb
Re: Arcomora en mijn begrip van Arduino
« Reactie #31 Gepost op: 31 August 2020, 13:18:04 »
Bas,

Na het nog een keer doorlezen van je bericht, ben ik toch verward.

Kan ik de initiele sketch gebruiken en de servoSweep (cpp en h) library moet ik opnieuw downloaden?

mvg, Ron

bask185

  • Offline Offline
  • Berichten: 5009
Re: Arcomora en mijn begrip van Arduino
« Reactie #32 Gepost op: 31 August 2020, 13:53:47 »
Ik vermoed het ja, maar ik heb het nog niet getest thuis. Dat kan ik vanavond pas doen.

Mvg,

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

bask185

  • Offline Offline
  • Berichten: 5009
Re: Arcomora en mijn begrip van Arduino
« Reactie #33 Gepost op: 31 August 2020, 13:58:43 »
ik vergeet iets te zeggen!

De originele sketch moet je uitbreiden met een call naar servo1.begin()  en servo2.begin() (of hoe jij je motoren genoemd heb) aan te roepen in de void setup()

#include "ServoSweep.h"

const int interval = 3000 ;
const int inputButton = 12 ;
const int servoPin = 13 ;

unsigned long prev ;
byte state ;

//                   pin   min max speed (bigger speed = slower movement ;
ServoSweep servo1(servoPin, 10, 30, 50) ; // als je hier een 5e getal toevoegt, dan is dat getal het pinnummer van je puntstuk relais.

void setup() {
    servo1.begin() ; <-- dit toevoegen voor elke motor
}

void loop() {
 
  servo1.sweep(); // de sweep moet continu aangeroepen worden

  if( digitalRead( inputButton ) ) servo1.setState( 1 ) ; // door setState aan te roepen met een 1 of een 0, kan je motor laten bewegen
  else                             servo1.setState( 0 ) ;
 
}
« Laatst bewerkt op: 31 August 2020, 14:00:22 door bask185 »
Train-Science.com
Train-Science github
It ain't rocket science ;-)

ikbenerevenniet

  • Offline Offline
  • Berichten: 379
Re: Arcomora en mijn begrip van Arduino
« Reactie #34 Gepost op: 31 August 2020, 17:40:03 »
Wat je niet mag doen in deze constructor is ook hardware dingen initialiseren. De constructor wordt namelijk uitgevoerd voordat de init() functie wordt uitgevoerd.

Hee, weer wat geleerd, thnx!   (y)

Heb al veel geleerd van mijn eigen fouten, maar die van anderen helpen daar ook bij. ;-) Ik lees ook mee op het Arduino forum, dat is vooral heel leerzaam omdat daar problemen aan de orde komen waarover je in de handleidingen niets vindt!
« Laatst bewerkt op: 31 August 2020, 17:46:44 door Erik Baas »

bask185

  • Offline Offline
  • Berichten: 5009
Re: Arcomora en mijn begrip van Arduino
« Reactie #35 Gepost op: 31 August 2020, 20:09:53 »
Ja je raakt nooit uitgeleerd.

Volgens mij oscilloscoop lijkt deze sketch te werken...

#include "ServoSweep.h"

const int inputButton1 = 11 ;
const int inputButton2 = 12 ;
const int servoPin1 = 2 ;
const int servoPin2 = 3 ;

unsigned long prev ;
byte state ;

//                   pin   min max speed (bigger speed = slower movement ;
ServoSweep servo1(servoPin1, 0, 180, 20, 13) ; // led 13 is puntstuk output
ServoSweep servo2(servoPin2, 0, 180, 50) ;

void setup() {
    Serial.begin( 115200 ) ;
    pinMode( inputButton1, INPUT_PULLUP ) ;
    pinMode( inputButton2, INPUT_PULLUP ) ;

    servo1.begin() ;
    servo2.begin() ;
}

void loop() {
 
    servo1.sweep(); // de sweep moet continu aangeroepen worden
    servo2.sweep(); // de sweep moet continu aangeroepen worden

    char b = Serial.read() ;

    if( digitalRead( inputButton1 ) ) servo1.setState( 1 ) ; // door setState aan te roepen met een 1 of een 0, kan je motor laten bewegen
    else                              servo1.setState( 0 ) ;

    if( digitalRead( inputButton2 ) ) servo2.setState( 1 ) ; // door setState aan te roepen met een 1 of een 0, kan je motor laten bewegen
    else                              servo2.setState( 0 ) ;
 
}
..met de libraries die nu op github staan. Het puntstuk polarisatie outputje die jij wss niet nodig heb, die werkt ook  (y)

Mvg,

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

ron.kraaijkamp

  • Offline Offline
  • Berichten: 272
    • Mijn baan in opbouw op 2RSweb
Re: Arcomora en mijn begrip van Arduino
« Reactie #36 Gepost op: 31 August 2020, 21:23:39 »
Hallo Bas,

Het werkte in een keer. Dat had je al gezegd omdat je het getest had.
Je hebt de input nu anders gemaakt. En er kan nu met een tuimelschakelaar gewerkt worden.

Ik hoor de servo's nog wel een beetje rommelen. Dan komt waarschijnlijk omdat ze rommel oppikken op de servo pin.
Ik zal een test of dat te verhelpen is met een weerstand 4k7 van de servo pin naar de 5 volt te leggen.

Bij eerdere testen had ik detach gebruikt. Dan hield het ook op. Is dat hier ook te gebruiken? Ik twijfel namelijk omdat detach voor alle servo's tegelijk werkt.

Weer bedankt voor je moeite die je erin gestoken hebt.

mvg Ron

ron.kraaijkamp

  • Offline Offline
  • Berichten: 272
    • Mijn baan in opbouw op 2RSweb
Re: Arcomora en mijn begrip van Arduino
« Reactie #37 Gepost op: 31 August 2020, 22:41:52 »
De pull up op de servo pin hielp niet.
Nu slapen. Half zes weer op.


Verzonden vanaf mijn iPhone met Tapatalk

spock

  • Offline Offline
  • Berichten: 764
Re: Arcomora en mijn begrip van Arduino
« Reactie #38 Gepost op: 31 August 2020, 23:05:02 »
Hoi,

Dat rommelen van de servo ga je niet oplossen door een pullup weerstand.
Het rommelen wordt veroorzaakt omdat de aanstuurpuls van de servo softwarematig wordt gegenereerd en dit niet exact constant is bij een arduino.

mvg spock

ron.kraaijkamp

  • Offline Offline
  • Berichten: 272
    • Mijn baan in opbouw op 2RSweb
Re: Arcomora en mijn begrip van Arduino
« Reactie #39 Gepost op: 01 September 2020, 07:54:25 »
Dat dacht ik ook Spock, was het proberen waard. Had het ergens in een draadje gelezen.

Ik ga vanavond maar eens kijken of dat met een detach goed gaat.

bask185

  • Offline Offline
  • Berichten: 5009
Re: Arcomora en mijn begrip van Arduino
« Reactie #40 Gepost op: 01 September 2020, 08:02:16 »
Dat moet sowieso werken omdat je dan de pulsentrein stopt. Ik kan dat wel toevoegen aan de library. Dan hoef jij alleen maar de library weer te update ;)

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

RobGood

  • Offline Offline
  • Berichten: 158
Re: Arcomora en mijn begrip van Arduino
« Reactie #41 Gepost op: 01 September 2020, 08:58:01 »
Als je het goed doet dan is die puls super stabiel. Probleem is hier dat er een library wordt gebruikt. Lijkt slim maar voor een eenvoudig stukje hardware als een servo die alleen maar een tussen 1 en 2 mseconde regelbaar pulsje nodig heeft is dat een olifantengeweer gebruiken voor een veldmuis.
Veel beter 1 van de drie timers gebruiken op een interupt. Omdat die puls van die ene ms slechts een 50tal keer per seconde hoeft te worden gegeven blijft er een zee van tijd over om wel tot 16 servo met die ene timer aan te sturen. Jawel dat is de truck van dat adafruit printje.
Wel is er dan een schuifregister story nodig om de seriele aansturing van de servoos parallel te maken. Das niet zo een grote uitdaging....Succes..... Rob

bask185

  • Offline Offline
  • Berichten: 5009
Re: Arcomora en mijn begrip van Arduino
« Reactie #42 Gepost op: 01 September 2020, 09:35:34 »
Citaat
Lijkt slim maar voor een eenvoudig stukje hardware als een servo die alleen maar een tussen 1 en 2 mseconde regelbaar pulsje nodig heeft is dat een olifantengeweer gebruiken voor een veldmuis.
Welkom in de wereld van C++ en OO programmeren. Collega Meino gebruikte zelfs een eigen library om de stand van een input uit te lezen terwijl hij het volgens mij afkon met digitalRead(), maar nogmaals, dat is C++ voor je.

Ik vind je analogie met library en olfifantengeweer wel wat vergezocht, een classe of een library is eigenlijk niet veel dan een geupgrade struct.

Dat adafruit printje werkt trouwens met I2C, daar heb je geen schuifregister voor nodig. Ik weet niet waar je dat vandaan heb? ander printje?

Ik weet wel dat je met een decade counter wel 10 servo's kan aansturen met een IO pin. Maar dat is weer wat anders.

Ik weet niet precies hoe die arduino library precies werkt. Ik weet alleen dat hij drie servo's op willekeurige IO kan laten draaien. Ik weet alleen niet hoe hij dat doet.

Arduino libraries zijn allemaal OO (object orientated) geschreven en dan heb je dus dit soort dingen. Ik vind het al knap dat hun library zo werkt zoals het nu doet.

Wat ik zelf wel eens gedaan heb, is om inderdaad zelf via een timer ISR meerdere servo's aan te sturen. Dat zag er ongeveer zo uit:

ISR(TIMER1_COMPA_vect) { // set at every 5us
    static uint16_t counter = 0 ;

    if( counter == 0 ) {
        PORTB |= ( 1 << motor1.pin ) | ( 1 << motor2.pin ) | ( 1 << motor3.pin ) ; // turn on all pwm pins
    }

    if( counter == motor1.pos ) PORTB &= ~ (1 << motor1.pin ) ; // turn them off when it is their time
    if( counter == motor2.pos ) PORTB &= ~ (1 << motor2.pin ) ;
    if( counter == motor3.pos ) PORTB &= ~ (1 << motor3.pin ) ;

    counter ++ ;
    if( counter == 3600 ) counter = 0 ;
}

Even gauw in elkaar geflanst. De interval tijd zou hier 5.55556us moeten zijn omdat ( 2000us - 1000us) / 180 posities = 5.55556us per graad.
Na 3600 cycles is er dan precies 20ms gepasseerd en begint het weer opnieuw.
Probleem is alleen dat dit niet werkt met de standaard Arduino macro's een OO manier van programmeren. Volgens mij vreet deze methode ook meer performance, maar daar ik niet weet hoe hun library werkt, weet ik het zeker.
Train-Science.com
Train-Science github
It ain't rocket science ;-)

ron.kraaijkamp

  • Offline Offline
  • Berichten: 272
    • Mijn baan in opbouw op 2RSweb
Re: Arcomora en mijn begrip van Arduino
« Reactie #43 Gepost op: 01 September 2020, 11:45:37 »
Dat moet sowieso werken omdat je dan de pulsentrein stopt. Ik kan dat wel toevoegen aan de library. Dan hoef jij alleen maar de library weer te update ;)

Bas
Graag dan.
Had zelf al zitten proberen. En kwam erachter dat het via de library moest.
Werd te laat.
Mvg Ron


Verzonden vanaf mijn iPhone met Tapatalk

bask185

  • Offline Offline
  • Berichten: 5009
Re: Arcomora en mijn begrip van Arduino
« Reactie #44 Gepost op: 01 September 2020, 13:21:43 »
Ik heb de code aangepast en dit wordt de nieuwe sketch. Je moet op de github pagina ook even zoeken naar de debounceClass.cpp en .h  die heb je nu ook nodig omdat:

Om de servo sweep te laten attachen, moest ik dit doen in de functie setState. Tot op heden, riepen wij deze functie eigenlijk continu aan. De debounce class is gemaakt om precies dit soort problemen op te vangen. De schakelaars worden gefiltered van ruis en inputs kennen nu behalve de states ON en OFF ook een RISING en een FALLING state.

Als we dit in de sketch implementeren:

#include "ServoSweep.h"
#include "debounceClass.h"

const int pin5 = 5 ;
const int pin6 = 6 ;

Debounce btn1( pin5 ) ;
Debounce btn2( pin6 ) ;

unsigned long prevTime = 0 ;

byte state1 = 1;
byte state2 = 1;

ServoSweep servo1(3, 10, 180, 20, 1, 13 ); // de 1 is nieuw en geeft aan dat we detach willen gebruiken
ServoSweep servo2(4, 6, 10, 1, 20 );

unsigned long prev ;

void setup() {
    Serial.begin(115200) ;
    Serial.println("hello world");
}

void loop() {

    unsigned long currTime = millis() ;

    if( currTime > prevTime ) {
        prevTime += 20 ;        // debounce interval is 20ms

        btn1.debounceInputs();
        btn2.debounceInputs();
    }

    uint8_t btnState = btn1.readInput() ;
    if( btnState == RISING ) {
        servo1.setState( 1 );
        Serial.println("motor 1 is true") ;
    }
    if( btnState == FALLING ) {
        servo1.setState( 0 );
        Serial.println("motor 1 is false") ;
    }

    btnState = btn2.readInput() ;
    if( btnState == RISING ) {
        servo1.setState( 1 );
        Serial.println("motor 2 is true") ;
    }
    if( btnState == FALLING ) {
        servo1.setState( 0 );
        Serial.println("motor 2 is false") ;
    }

   
    servo1.sweep( );
    servo2.sweep( );
}
Het is natuurlijk ongetest en mijn pauze is weer voorbij ;D dus het is nog experminenteel. Maar ik heb er vertrouwen in  (y)

De debounce code heb ik getest en werkt:
hello world
motor 1 is true
motor 2 is true
motor 1 is false
motor 1 is true
motor 2 is false
motor 2 is true

De code in de library heeft nu deze toevoeging in setState
if( turnOff ) servo.attach( servoPin ) ;

en in sweep staat:
if( ( pos == servoMax || pos == servoMin ) && turnOff == 1 ) servo.detach( ) ;
Dus de sweep functie detacht, en de setState attacht, mits turnOff gelijk is aan 1 en die wordt in de constructor gezet.

Mvg,

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