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

Welke Vallejo kleur voor drijfstangen van een DB stoomlocomotief? door Bahn-AG
Vandaag om 16:42:57
Toon hier je nieuwe (model-) spooraanwinst(en)... door Nullus
Vandaag om 16:29:51
MARDEC, de Multifunctionele ARduino dcc DECoder. door bord4kop
Vandaag om 16:29:12
Gebruik je Arduino zonder te "programmeren" ;) door fleischmann1
Vandaag om 16:18:39
Ombouw/Pimpen Bolle neuzen door bollen neus
Vandaag om 15:58:15
Al mijn goede ideeën... door bask185
Vandaag om 15:23:03
US diorama in H0 door VAM65
Vandaag om 15:22:05
Beekdaelen in H0 door VulcanRaven
Vandaag om 15:15:11
Hengelo in 1981-1982, maar dan anders: Kassenberg in N door spoorijzer
Vandaag om 15:08:30
Kleine Baan in H0 (≤ 0.5m²) door Jack Black (NS1220)
Vandaag om 15:06:14
U-vorm beperkte ruimte (H0 C-rails) door Jelmer
Vandaag om 14:58:04
Onlangs gespot - gefotografeerd, de links door Jeroen Water
Vandaag om 14:33:00
N spur scenery elementen maken van gips of klei? door Dave.......
Vandaag om 14:30:06
De overeenkomst tussen een Ovaalramer en een Motorpost. door RK
Vandaag om 14:28:54
Onlangs gespot - gefotografeerd, de foto's door mass am see
Vandaag om 14:18:46
BMB-Module: “Corfe Castle Station” door Hans van de Burgt
Vandaag om 14:07:52
welk jaar ging Marklin OVP voor wagons van blauw naar wit door Railman
Vandaag om 13:40:42
GSS Jubileumbaantje (0e / 0n30) door MacArthur
Vandaag om 12:55:30
NTM P1 in Schaal-1 door MaraNCS
Vandaag om 11:39:38
Mijn eerste H0-modeltreinbaan in aanbouw door Jack Black (NS1220)
Vandaag om 11:33:00
Rio Grande Southern - Lizard Head Pass door Hans GJ
Vandaag om 11:30:20
Bauarbeiten im gange door Dave.......
Vandaag om 10:55:26
Variaties op Station Zetten Andelst in HO door Duikeend
Vandaag om 10:54:40
De IJmuider spoorlijn - korte geschiedenis en plaatjes door Vislijn
Vandaag om 10:42:29
Internationale Spoor 0 en 1 dagen in Gießen, 23 en 24 maart, 2024 door bernhard67
Vandaag om 08:42:53
De Hondsrugbaan door mass am see
Vandaag om 08:15:11
Pfarrerwinkel bahn door Jelmer
Vandaag om 08:00:19
M.s.v. De Percee bouwt aan nieuwe clubbaan door J. Moors
Vandaag om 01:00:05
30 maart Modelspoorbeurs Houten & HCC Kennisdag door WimM
Vandaag om 00:42:50
Raadplaatje door Magic
27 maart 2024, 23:27:03
  

Auteur Topic: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan  (gelezen 14469 keer)

hepost

  • Offline Offline
  • Berichten: 58
Hallo,

Voor mijn analoog smalspoorbaantje heb ik een besturing gemaakt met een arduino nano, een H-brug bordje, aan-uit-aan schakelaar voor de rijrichting en een potmeter voor de snelheid. Bij mijn eerste poging kwam er geen beweging maar wel rook uit het treintje. Wat betreft elektronica en programmeren heb ik nog heel wat te leren. Na wat gepuzzel kwam ik erachter dat de frequentie te hoog was om het treintje op gang te helpen. Ik heb vervolgens de frequentie regelbaar gemaakt. Een frequentie tussen de 20 en 100 hertz lijkt goed te werken. Het rijgedrag is nog niet optimaal, de vraag is of het aan de aansturing ligt of aan het treintje zelf (een tweedehands liliput h0e treintje).

Een tweede vraag is wat ik kan doen om de boel te ontstoren. Ik heb een arduino asar besturing voor de servo's. Zodra het treintje begint te rijden gaan de servo's aardig tekeer. Ik heb wat gelezen over een condensator tussen de rails, draden wikkelen en zilverfolie om de draden van de servo. Wat is effectief? Wat voor condensator en hoe moet ik dit aansluiten? Dit heb ik nog niet kunnen vinden. In het treintje zit geen condensator o.i.d. Hoe kan ik er voor zorgen dat de motorregeling geen storingen op de servo's veroorzaakt?
« Laatst bewerkt op: 05 september 2017, 13:15:15 door Bert van Gelder. Reden: Titel »

hepost

  • Offline Offline
  • Berichten: 58
Re: pwm met frequentieregeling met arduino t.b.v. besturing analoge dc treinbaan
« Reactie #1 Gepost op: 05 september 2017, 09:18:36 »
Hierbij de code voor mijn treinbesturing.

#include <Bounce2.h>

//Deze code werkt op een Arduino Uno/nano rev.3 met een L298n h-brug board.
//Hardware: 4 aan-uit-aan schakelaars, 3 potmeters
//frequentieregeling gebaseerd op code van http://www.oxgadgets.com/2011/04/creating-a-variable-frequency-pwm-output-on-arduino-uno.html

//pin setup
int P_SPEEDA = 14; //potmeter A
int P_SPEEDB = 15; //potmeter B
int freq = 16; //potmeter voor frequentieregeling
const byte enA = 9; //enable A op h-brug
const byte enB = 10; //enable B op h-brug
const byte in1 = 3;
const byte in2 = 4;
const byte in3 = 5;
const byte in4 = 6;
#define dirA_F 7 //pin schakelaar A vooruit
#define dirA_R 8 //pin schakelaar A achteruit
#define dirB_F 11 //pin schakelaar B vooruit
#define dirB_R 12 //pin schakelaar B achteruit


// debounce voor de schakelaars
Bounce debouncer1 = Bounce();
Bounce debouncer2 = Bounce();
Bounce debouncer3 = Bounce();
Bounce debouncer4 = Bounce();

unsigned long duty1,duty2; // Duty Cycle in percentage.
unsigned long pwm1; // Value read from A0 and A2 to give PWM duty cycle output in terms // of 0-5V
unsigned long pwm2;
float xxx; // Float numbers to calculate duty for PWM 1 and PWM 2
float yyy;
int freqmap = 0;

//SETUP-----------SETUP-----------SETUP-----------SETUP-----------SETUP-----------SETUP

void setup(){
Serial.begin(9600);
delay(100);

TCCR1A = _BV(COM1A1) | _BV(COM1B1) ; // phase and frequency correct mode. NON-inverted mode
// TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(COM1A0) | _BV(COM1B0) ;
//phase/frequency correct mode. SELECT THIS FOR INVERTED OUTPUTS.
TCCR1B = _BV(WGM13) | _BV(CS11);
// Select mode 8 and select divide by 8 on main clock.

pinMode(enA,OUTPUT);
pinMode(enB,OUTPUT);
pinMode(in1,OUTPUT);
pinMode(in2,OUTPUT);
pinMode(in3,OUTPUT);
pinMode(in4,OUTPUT);
pinMode(dirA_F,INPUT);
pinMode(dirA_R,INPUT);
pinMode(dirB_F,INPUT);
pinMode(dirB_R,INPUT);

debouncer1.attach(dirA_F);
  debouncer1.interval(5); // interval in ms
debouncer2.attach(dirA_R);
  debouncer2.interval(5); // interval in ms
debouncer3.attach(dirB_F);
  debouncer3.interval(5); // interval in ms
debouncer4.attach(dirB_R);
  debouncer4.interval(5); // interval in ms
}

//LOOP-----------LOOP-----------LOOP-----------LOOP-----------LOOP
void loop() {

debouncer1.update();
debouncer2.update();
debouncer3.update();
debouncer4.update();

// Get the updated value:
  int value1 = debouncer1.read();
  int value2 = debouncer2.read();
  int value3 = debouncer2.read();
  int value4 = debouncer2.read();

//bepalen van de rijrichting regelaar A
if(value1==HIGH){
  digitalWrite(in1,LOW);
  digitalWrite(in2,HIGH);
  Serial.println("A vooruit");
  }
else if(value2==HIGH){
  digitalWrite(in1,HIGH);
  digitalWrite(in2,LOW);
  Serial.println("A achteruit");
  }
else{
  digitalWrite(in1,LOW);
  digitalWrite(in2,LOW);
  Serial.println("A stop");
  }

//bepalen van de rijrichting regelaar B
if(value3==HIGH){
  digitalWrite(in3,LOW);
  digitalWrite(in4,HIGH);
  Serial.println("B vooruit");
  }
else if(value4==HIGH){
  digitalWrite(in3,HIGH);
  digitalWrite(in4,LOW);
  Serial.println("B achteruit");
  }
else{
  digitalWrite(in3,LOW);
  digitalWrite(in4,LOW);
  Serial.println("B stop");
  }

//frequentieregeling en snelheid
freqmap = analogRead(freq);
ICR1 = map(freqmap, 0, 1023, 15000 , 5000); // 50000 = 20Hz en 10000 = 100Hz
//Serial.println(ICR1);           


pwm1 = analogRead(P_SPEEDA);
pwm2 = analogRead(P_SPEEDB);
xxx = float(pwm1);
// Turn read values from the POTs to float for mathematical
// adjustment.
yyy = float(pwm2);
xxx = xxx * ICR1;
// Multiply with ICR1 and divide by 1023 to give required percentage
yyy = yyy * ICR1;
xxx = xxx / 1023;
yyy = yyy / 1023;
//Assign values to OCR Registers, which output the PWM duty cycle.
OCR1A = int(xxx);
OCR1B = int(yyy);
}

Menno

  • Offline Offline
  • Berichten: 3340
    • Mijn van-alles website
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #2 Gepost op: 05 september 2017, 19:15:36 »
Bij mijn eerste poging kwam er geen beweging maar wel rook uit het treintje. Wat betreft elektronica en programmeren heb ik nog heel wat te leren. Na wat gepuzzel kwam ik erachter dat de frequentie te hoog was om het treintje op gang te helpen. Ik heb vervolgens de frequentie regelbaar gemaakt. Een frequentie tussen de 20 en 100 hertz lijkt goed te werken.
Dat is voor PWM-begrippen heel erg laag. In decoders wordt niet voor niets al jaren met 22 kiloHertz en (inmiddels) hoger gewerkt.
Wat wél kan: als je te lang hoogfrequente spanning op de baan zet met een te lage spanning om de motor aan te laten lopen, dan zal de motor wel opwarmen maar omdat die verder niet beweegt, wordt 'ie daar niet beter van. De truc van PWM is dat de spanning altijd maximaal is (bij een hele kleine dutycycle kan die zelfs nog hoger worden) maar dat je de dutycycle gaat variëren.
Een tweede vraag is wat ik kan doen om de boel te ontstoren. Ik heb een arduino asar besturing voor de servo's. Zodra het treintje begint te rijden gaan de servo's aardig tekeer. Ik heb wat gelezen over een condensator tussen de rails, draden wikkelen en zilverfolie om de draden van de servo. Wat is effectief? Wat voor condensator en hoe moet ik dit aansluiten? Dit heb ik nog niet kunnen vinden. In het treintje zit geen condensator o.i.d. Hoe kan ik er voor zorgen dat de motorregeling geen storingen op de servo's veroorzaakt?
Allereerst uitleggen hoe je de voeding regelt (los, uit 1 voeding?): bij dit soort zaken moet je hoge piekstromen gescheiden houden van stuurstromen, ook al delen die dezelfde massa. Zie het maar als een snelweg met een parallel-lopend fietspad: zowel auto's als fietsers kunnen dezelfde kant op, maar omdat de fietsers (de stuurstromen) zich ook vrijelijk op de snelweg kunnen begeven, gaat dat al snel mis.
Met een afgescheiden fietspad, is het probleem opgelost en kunnen zowel auto's als fietsers nog steeds dezelfde kant op.

Dat zal je ook moeten doen: scheid de voedingsspanningen zo snel mogelijk zodat de servo's zo min mogelijk meekrijgen van andere zaken. Ontkoppelen heet dat. Daarnaast kan een condensator hier en daar vaak niet zoveel kwaad om te proberen.
Draden van servo's en railspanning twisten is ook altijd een goed idee.

Nog mooier is een scoop: dan kan je kijken of je storing puur hardwarematig is (en veroorzaakt wordt door een rijdende trein) of dat de programmatuur rammelt, maar daar heb ik te weinig verstand van bij Arduino's.
Sowieso zie ik in die code (waarvan het fijn zou zijn als je het te lange commentaar even inkort) 4 schakelaars staan: ik weet dus niet wat er op een Arduino Uno of Nano gebeurt met ingangen die niet aangesloten zijn. Digitale ingangen die geen gedefiniëerd niveau hebben omdat ze niet aangesloten zijn maar wél aangeroepen worden als zijnde een ingang, moeten vaak een status krijgen om duidelijk te maken (voor de software) wat het niveau is. Dat kan dus betekenen dat je de ingang aan massa of voedingsspanning moet leggen (maar let op: zoek dat uit, ik heb geen idee hoe Atmel dat oplost (Atmel = fabrikant van de microcontrollers op Arduino's)

Klaas Zondervan

  • Offline Offline
  • Berichten: 25180
    • Pagina van klaas
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #3 Gepost op: 05 september 2017, 19:44:12 »
Dat is voor PWM-begrippen heel erg laag. In decoders wordt niet voor niets al jaren met 22 kiloHertz en (inmiddels) hoger gewerkt.
In de analoge wereld is een lage frequentie heel gewoon. De befaamde Weistra regelaar werkt met een frequentie tussen 30 en 100 Hz, variërend met de duty cycle. Die hele hoge frequenties in het kilohertz bereik werken alleen maar goed in combinatie met lastregeling.

David Hoogvorst

  • Offline Offline
  • Berichten: 354
    • AnyRail
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #4 Gepost op: 05 september 2017, 19:46:06 »
Standaard zet je voor 'zwevende' ingangen, die dus een losse draad kunnen hebben, de pinMode op INPUT_PULLUP.
De waarde die je dan uitleest is HIGH.

Als je de schakelaar sluit, moet deze aan aarde worden verbonden, dus niet aan de 5V, maar aan GND.
De waarde die je dan uitleest is LOW.

De logica is dan:
waarde HIGH: schakelaar is uit
waarde LOW: schakelaar is aan

Dit alles om te voorkomen dat je willekeurige waarden uitleest omdat de zwevende draad als antenne werkt.
De elektronica voor dit Pull up-gedrag is in de Arduino ingebouwd, je hoeft verder niets te doen.

Succes!

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4656
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #5 Gepost op: 05 september 2017, 21:23:51 »
Voor PWM zou hoog prima moeten werken. Nouwja, prima als in "geen rook" :angel: Maar zeker op lage snelheden is een loc niet echt willend om weg te rijden, zeker oude motoren niet. Vandaar dat ik toen ik een analoge regeling had gemaakt met een microcontroller 30kHz hardware PWM en daar dan 80Hz software PWM (met lage duty) bovenop. Dat laatste overkwam de "motorkleef" waarna de 30kHz de loc prima kon regelen.

En voor voeding en klapperende servo's, de boel inderdaad ontkoppelen etc. Anders even een schema plaatsen van hoe je alles hebt aangesloten nu.


Timo
Verzonden vanaf mijn desktop met Firefox

hepost

  • Offline Offline
  • Berichten: 58
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #6 Gepost op: 05 september 2017, 22:41:30 »
Hierbij het huidige schema. De voeding voor de baan is een gestabiliseerde 12v netvoeding van 2A (geaard). De voeding voor de arduino's is een 9v netadapter, 2A. De voeding voor de servo's is een gestabiliseerde netvoeding van 5v, max. 10A (geaard). Er zijn 2 arduino Nano's, een voor de asar servobesturing en een voor de rijregelaar.

De aan-uit-aan schakelaars werken goed, geen storing op de rijrichting. Wat ik echter begrijp van David is dat het toch verstandiger is om de weerstanden verwijderen van de schakelaars, rechtstreeks aan de arduino aansluiten en in de code de pinMode op INPUT_PULLUP zetten voor de desbetreffende pinnen.

Voor de asar servobesturing weet ik niet zeker of hier ook sprake is van zwevende ingangen. Het werkt met drukknoppen en een weerstandsladder.

Het is inderdaad mijn bedoeling om een soort Weistra regelaar te maken met behulp van een Arduino. Mijn idee is om de frequentie op te laten lopen tijdens het vermeerderen van de snelheid. Eerst een snelheidspuls om de kleef te overwinnen lijkt ook te helpen. Hoe ik dit allemaal nog in mijn code moet verwerken weet ik nog niet. Of ik iets met lastregeling kan/moet doen is mij ook nog niet duidelijk. Eerst maar eens wat meer te weten komen over dat onderwerp.

Hierbij het schema voor mijn rijregelaar. In het schema heb ik een Uno bord geplaatst maar ik maak gebruik van een nano. Ook het motorbord komt niet helemaal overeen maar de aansluitingen zijn praktisch hetzelfde.




Klaas Zondervan

  • Offline Offline
  • Berichten: 25180
    • Pagina van klaas
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #7 Gepost op: 05 september 2017, 23:24:06 »
Vandaar dat ik toen ik een analoge regeling had gemaakt met een microcontroller 30kHz hardware PWM en daar dan 80Hz software PWM (met lage duty) bovenop. Dat laatste overkwam de "motorkleef" waarna de 30kHz de loc prima kon regelen.
Precies, je moet met een lage frequentie beginnen om de motorkleef te overwinnen. Een decoder met lastregeling doet dat door in eerste instantie "volle bak" te gaan en direct in te binden zodra hij constateert dat de motor draait.

David Hoogvorst

  • Offline Offline
  • Berichten: 354
    • AnyRail
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #8 Gepost op: 06 september 2017, 09:54:30 »
Over de schakelaars: dit is niet per se verstandiger, maar wel veel eenvoudiger. Het scheelt 4 draden en weerstanden.

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4656
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #9 Gepost op: 06 september 2017, 19:44:17 »
@Klaas Zondervan, inderdaad :)

@David Hoogvorst, wat bedoel je met "niet verstandig"?


Timo
Verzonden vanaf mijn desktop met Firefox

David Hoogvorst

  • Offline Offline
  • Berichten: 354
    • AnyRail
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #10 Gepost op: 07 september 2017, 09:15:20 »
@Timo: 'hepost' suggereerde dat mijn suggestie 'verstandiger' zou zijn. Ik bedoelde te zeggen dat het niet verstandiger is, maar wel eenvoudiger om het Pull up mechanisme van de Arduino te gebruiken, omdat dit bedrading en weerstanden scheelt.

Hansepansje

  • Offline Offline
  • Berichten: 672
    • Perrongeluk - van de regen uit de drup
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #11 Gepost op: 07 september 2017, 11:40:39 »
Als we toch gaan vereenvoudigen qua hardware: laat dan ook de aparte potmeter voor de frequentie vervallen.
In plaats hiervan: regel softwarematig (voor A en B apart) dat (net als bij de Weistra regelaar) de frequentie aangepast wordt aan de ingestelde snelheid. Dan krijg je ook een beter rijgedrag.

Groets, Hans
Dachbodenheim: N-spoor, Fleischmann Piccolo, HCCM elektronica, eigen software

Klaas Zondervan

  • Offline Offline
  • Berichten: 25180
    • Pagina van klaas
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #12 Gepost op: 07 september 2017, 13:24:44 »
En gewoon de Weistra regelaar nabouwen, is dat een optie? Of zeg ik nou iets heel raars?  ;D

72sonett

  • Team encyclopedie
  • Offline Offline
  • Berichten: 2083
    • El Carrilet
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #13 Gepost op: 07 september 2017, 13:56:03 »
Of een  kant-en-klare kopen bij Aliexpress. Voor dat geld kun je ze niet zelf maken.

El Carrilet
"te dom om te poepen"
MH

Klaas Zondervan

  • Offline Offline
  • Berichten: 25180
    • Pagina van klaas
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #14 Gepost op: 07 september 2017, 14:30:11 »
Dat is een ding wat op 10 kHz draait. Dus heel wat anders dan een Weistra regelaar.