BeneluxSpoor.net forum

Vraag en antwoord => Elektronica en analoog => Topic gestart door: Max Roodveldt op 18 november 2014, 23:07:29

Titel: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 18 november 2014, 23:07:29
Na wat experimenten met verschillende analoge regelaars heb ik een regelaar gebouwd met PBM (Puls Breedte Modulatie) op basis van een microcontroller – Arduino Uno – en een IC motor driver – Toshiba TA8050.

Eenknopsbediening door middel van een drie standen schakelaar.
Links:   locomotief rijdt naar links en versneld tot maximum snelheid.
Midden:   locomotief vertraagd tot stilstand.
Rechts:   als links maar dan naar rechts.

Bij een PBM bereik van 0%...100% moeten voor elke locomotief de minimum en maximum waarde kunnen worden ingesteld want niet elke locomotief start bij 1% en 100% is veel te snel om te kunnen rangeren (15…20 km/h is hard zat).

Met drukknoppen (+/-) wordt de startwaarde ingesteld, daarna de maximum snelheid.

Met een lichtsluis wordt de snelheid van de locomotief gemeten en aangepast aan de gewenste maximum snelheid. Drie keer heen en weer rijden is meestal voldoende.

De gewenste versnelling/vertraging kan ook worden ingesteld – belangrijk voor ‘t (ont) koppelen.

Hierna kan de stopwatch worden gestart en het rangeren beginnen.

Zoals gebruikelijk gaat het geheel gepaard met de nodige problemen cq. onduidelijkheden (’t zal eens niet…  :)).

De PBM frequentie: sommige locs lopen beter met ’n lage frequentie (< 50 Hz), anderen met ’n hoge frequentie (> 20 kHz). Sommige locs brommen, anderen fluiten.

Het regelbereik is (mede) afhankelijk van de frequentie – hoe lager hoe groter?

Ook de gebruikte spanning is van invloed – hoe hoger hoe beter?


Heeft iemand suggesties?


Mvg,

Max.


Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Klaas Zondervan op 18 november 2014, 23:34:49
Ik heb wel een suggestie. Je kunt imiteren wat de Weistra regelaar doet. Dat is een regelaar die al in de jaren '80 is ontwikkeld door Martin Weistra. Hij had geconstateerd dat locs beter aanlopen bij een lage pulsfrequentie, en dat je die frequentie moet verhogen als de snelheid toeneemt. De frequentie van de regelaar variëert van ca. 30 Hz tot ca. 100 Hz.
Ik gebruik zelf de Weistra regelaar in combinatie met een hoogfrequente spanning voor continuverlichting. Beschrijving is op mijn website te vinden
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 18 november 2014, 23:45:51
@Klaas,

heb je de Weistra regeling ook geprobeerd met moderne locs? Ik heb 'n Bachmann GE-45 en die wil niet zo best  op lage frequenties. Pas vanaf 1kHz begint 't er beetje op te lijken. Maar dan fluit 'ie...  ;D

mvg,

Max.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Klaas Zondervan op 18 november 2014, 23:54:56
Dan moet je even specificeren wat je bedoelt met moderne locs.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 19 november 2014, 00:03:34
@Klaas

Met moderne locs bedoel ik locs die vanaf de fabriek zijn voorzien van 'n decoder.

Ik heb een aantal Bachmann's waarvan ik de decoder heb verwijderd - beste frequentie >20kHz.
Antieke Athearn's - beste frequentie <100Hz.

Een oude Rivarossi wil helemaal niet...  8)

Alles bij benadering - helaas geen wet van Meden en Perzen...  :)

mvg,

Max.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Klaas Zondervan op 19 november 2014, 00:11:21
Ik zie niet precies wat het verschil is. Een loc waar je de decoder uit haalt is analoog geworden.
20 kHz komt mij erg hoog voor, die frequentie gebruik ik voor mijn HF verlichting.
Ik heb een aantal Roco draaistellocs, met middenmotor en cardanaandrijving. Verder ook nog een paar Piko en een Mehano, zelfde aandrijfconcept. En dan nog twee DE-2 treinstellen van Artitec, daar zit een Mashima motor in met cardanaandrijving naar 1 draaistel.
Rijden allemaal prima op de Weistra regelaar.
Alleen Lima's met de oude "pannekoek" motor rijden bij mij bokkig. Daartegenover staat dat ik van anderen hoor dat hun Lima's het juist heel goed doen op deze regelaar.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 19 november 2014, 00:25:55
Kan 't zijn dat 't afhankelijk is van de gebruikte motor?

Ik kan me niet aan de indruk onttrekken dat "moderne" motoren minder zijn omdat de decoder dat wel recht breidt.

Een Bachmann Spectrum GE-44 - met twee motoren - werkt 't beste met 'n lage frequentie terwijl een Bachmann GE-44 - met een motor - beter loopt op 'n hoge frequentie.

20 kHz is misschien wat erg hoog maar minder vond mijn hond niet zo leuk...
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Timo op 19 november 2014, 11:26:45
Hoi Max,

Heb je foto, schema en code voor ons? Kunnen we pas echt meekijken. Snap nog niet helemaal hoe je wilt rijden met een schakelaar.

Zelf heb ik ondervonden dat een lok beter wil rijden als op lage snelheden de hoge PWM frequntie ondersteund wordt door een lage frequentie. Dit om de loc een "zetje" te geven op lage snelheden.

En hoe stuur je de H-brug aan? DI1 laag en dan pulsen op DI2 (of andersom)? Of pulsen op DI1 en DI2 hoog? En ja, beide versies zorgen voor hetzelfde patroon aan de uitgang (mits resistief belast) met als verschil dat bij de eerste de op de rail uit staat in de lage delen van de PWM (high impedance) en bij de tweede je de motor kortsluit en dus actief remt (beide staven zijn L). De eerste versie werkt een stuk beter omdat je dan de motor in vrijloop laat en dus nut hebt van vliegwielen enzo.

Het regelbereik is (mede) afhankelijk van de frequentie – hoe lager hoe groter?
Hoezo? Voor de hoge frequenties heeft de Arduino mooie hardwarematige PWM aan boord met een resolutie van 8-bit (0-255). Lage frequenties zal je zelf in software moeten doen en toegegeven, dan kan je meer resolutie toevoegen als je dat leuk vindt. Maar met 256 stappen ben je denk ik een aardig eind.


Timo
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Klaas Zondervan op 19 november 2014, 11:38:50
Max, zoals gezegd doen bij mij bijna alle motoren het goed op de Weistra regelaar. Zelfs een loc waar ik een Faulhager motor in heb gebouwd doet het uitstekend.
Dus de problemen die je noemt ken ik niet.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 19 november 2014, 12:36:13
@Timo

(https://images.beneluxspoor.net/bnls/timesaver.png) (https://images.beneluxspoor.net/bnls/timesaver.png)

(https://images.beneluxspoor.net/bnls/schema_01.png) (https://images.beneluxspoor.net/bnls/schema_01.png)

Ik drukte op verzenden voordat mijn verhaal klaar was - uitleg volgt...
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 19 november 2014, 13:14:50
@Timo

op 't eerste plaatje m'n Timesaver - zo goed mogelijk met de afmetingen zoals door John Allen beschreven in de Model Railroader van November 1972. Hierop duidelijk zichtbaar de 3-standen schakelaar - links en rechts is rijden, midden is stop. Zoals 't hoort.  8)

Daaronder het schema van m'n Arduino met een TA8050 H-brug. S1 is de rij-schakelaar. Links en rechts is rijden met versnelling tot de gewenste snelheid, midden is vertragen tot stilstand.

De PBM frequentie wordt in de software ingesteld op een waarde tussen 30 Hz en 25 kHz - afhankelijk van de loc.

De code heb ik nog niet bijgevoegd want dat is een redelijke stapel A4tjes.  :)

Mijn probleem zit niet zozeer in de regelaar als wel in de combinatie regelaar - locs. Ik krijg met verschillende locs dusdanig verschillende instellingen dat ik die moeilijk kan verenigen.

Als ik een lage frequentie (<100 Hz) gebruik zie ik op m'n scoop een PBM bereik van 5..100%; bij een hoge frequentie (>20 kHz) is dat bereik 40...100%.

Hoe de H-brug wordt aangestuurd moet ik controleren - volgens de datasheet zijn inderdaad beide opties mogelijk maar welke ik gebruik moet ik nakijken.


@Klaas

ik heb momenteel 9 locs waarvan de helft redelijk loopt en de rest 'n stuk minder. En het zou wel prettig zijn als ik de regelaar onder de knie heb voordat ik andere oude locs ga kopen. Een of meerdere Climaxes en/of Shays lijken me wel aardig.  (y)

mvg,

Max.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Klaas Zondervan op 19 november 2014, 13:33:19
Max, heb je al eens een scoop aan de motoruitgang gehangen om te zien of er werkelijk uit komt wat je bedoelde?
Die lamp in serie met de motor is waarschijnlijk een stroombegrenzer. Wat gebeurt er als je die er tussenuit haalt? De TA8050 is zowel op stroom als op temperatuur beveiligd, dus die lamp ertussen lijkt me een beetje overdaad.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 19 november 2014, 13:54:25
@Klaas

Citaat
Max, heb je al eens een scoop aan de motoruitgang gehangen om te zien of er werkelijk uit komt wat je bedoelde?

Ja - uiteraard...;D en dat ziet er redelijk uit. Zonder scoop is controle bijna onmogelijk. Maar doordat mijn baantje zo kort is lukt dat maar ten dele. Eerst maar eens een railovaaltje halen zodat ik langer kan kijken. En het kan zijn dat Timo gelijk heeft en ik de H-brug op de verkeerde manier aanstuur.

Citaat
Die lamp in serie met de motor is waarschijnlijk een stroombegrenzer. Wat gebeurt er als je die er tussenuit haalt? De TA8050 is zowel op stroom als op temperatuur beveiligd, dus die lamp ertussen lijkt me een beetje overdaad.

De lamp beveiligd de wissels tegen kortsluiting (open rijden) en brand niet tijdens normaal rijden, maar als de wissel verkeerd ligt is 't een mooie controle. Weghalen verandert niets. Bijkomend voordeel: zonder lamp werkt de baan niet...

mvg,

Max.

Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Timo op 19 november 2014, 14:46:08
Om te testen wat er uit je regelaar komt heb je op zich geen ovaaltje nodig. Geen loc op de rails maar een weerstandje en je kunt nar harte lust meten met je scope.

Je zou, zolang je gebruik maakt van de hardware pwm, gewoon moeten kunnen instellen tussen 0% en 100%. Maar aangezien je ook erg laag gaat (iets dat niet kan met de hardware PWM) gok ik dat je alles met software PWM probeert. Ga je dan in de kilohertzen dan zal dat inderdaad niet goed werken. Zal je echt de hardware PWM moeten gebruiken.

Zelf had ik toen (uit me hoofd) iets van 22kHz als frequentie en daarop een 80Hz PWM met een dutycycle van (ook uit me hoofd) iets tussen de 5% en 10%. Dit om de kleef bij stilstand te overkomen.

En hoe rij je dan nu? Gewoon schakelaar om en gaan? Iets als een draaiknop lijkt me handiger...

En waar zijn die LDR's voor?  ???

Ook hoop ik niet dat je de Atmega met 9v voedt, deze heeft een max van 5,5V. Als je de hele Arduino daarmee voedt is het wel okay maar waarschijnlijk niet nodig aangezien de Arduino tot 20V input mag hebben.\

Timo
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 19 november 2014, 15:29:54
Citaat
Om te testen wat er uit je regelaar komt heb je op zich geen ovaaltje nodig. Geen loc op de rails maar een weerstandje en je kunt nar harte lust meten met je scope.
Dat klopt maar dan ziet 't er ook perfect uit - 't zijn de locs die 't eindresultaat verzieken... ;)

Citaat
Je zou, zolang je gebruik maakt van de hardware pwm, gewoon moeten kunnen instellen tussen 0% en 100%. Maar aangezien je ook erg laag gaat (iets dat niet kan met de hardware PWM) gok ik dat je alles met software PWM probeert. Ga je dan in de kilohertzen dan zal dat inderdaad niet goed werken. Zal je echt de hardware PWM moeten gebruiken. Zelf had ik toen (uit me hoofd) iets van 22kHz als frequentie en daarop een 80Hz PWM met een dutycycle van (ook uit me hoofd) iets tussen de 5% en 10%. Dit om de kleef bij stilstand te overkomen.
Zolang ik de regelaar maar belast met een weerstandje of een lampje gaat alles goed - pas als ik er een motortje aan hang beginnen de problemen. Ook met slot car motoren loopt 't redelijk maar die motoren zijn allemaal 't zelfde. En nogmaals, sommige locs lopen perfect, maar anderen... ??? 

Citaat
En hoe rij je dan nu? Gewoon schakelaar om en gaan? Iets als een draaiknop lijkt me handiger...
Het origineel van 1966 had een schakelaar - vandaar. Met een schakelaar ligt de snelheid vast, belangrijk bij een wedstrijdje.

Citaat
En waar zijn die LDR's voor?  ???
Die vormen een lichtsluis zodat ik de maximale snelheid in km/h kan instellen.

Citaat
Ook hoop ik niet dat je de Atmega met 9v voedt, deze heeft een max van 5,5V. Als je de hele Arduino daarmee voedt is het wel okay maar waarschijnlijk niet nodig aangezien de Arduino tot 20V input mag hebben.\
Volgens de documentatie is 9 volt voor een Arduino Uno perfect.


mvg,

Max.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Klaas Zondervan op 19 november 2014, 15:42:12
Na bestuderen van de datasheet van de TA8050 kom ik tot dezelfde conclusie als Timo. Als in de pulspauzes DI1 en DI2 tegelijk H zijn, dan sluit je de motor kort, en dan wordt die actief geremd. Die situatie moet je vermijden, naar mijn mening.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 19 november 2014, 16:02:33
Bedankt. Dat gaan we dus even uitzoeken.

mvg,

Max.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Timo op 19 november 2014, 16:07:13
Dat klopt maar dan ziet 't er ook perfect uit - 't zijn de locs die 't eindresultaat verzieken... ;)
Zolang ik de regelaar maar belast met een weerstandje of een lampje gaat alles goed - pas als ik er een motortje aan hang beginnen de problemen. Ook met slot car motoren loopt 't redelijk maar die motoren zijn allemaal 't zelfde. En nogmaals, sommige locs lopen perfect, maar anderen... ???
Als het er met een weerstand wel goed uit ziet maar met motor niet lijkt me er niets aan de hand. Een motor kan zelf namelijk prima spanning opwekken en dus je meting beïnvloeden. Dat je puls dan langen lijkt is dan schijn.

Wel zou je nog eens kunnen meten met aan beide motor uitgangen een weerstand naar de GND. Iets van 1k doet het altijd goed  ;D En dan geen loc op de rail. Heb je nu wel het gewenste PWM signaal (0% - 100%)? Of nog makkelijker, bij DI1 en DI2 meten...

En maak je in de code echt gebruik van hardware PWM? (Dus doormiddel van analogWrite()?)


Het origineel van 1966 had een schakelaar - vandaar. Met een schakelaar ligt de snelheid vast, belangrijk bij een wedstrijdje.
Okay, hier mis je mij even, wedstrijdje?  ::)


Die vormen een lichtsluis zodat ik de maximale snelheid in km/h kan instellen.
Ah, logisch  ;D


Volgens de documentatie is 9 volt voor een Arduino Uno perfect.
Kan ook prima, maar tot 20V kan ook prima. Hoeveel volt gebruik je voor het aansturen van de loc's?


Timo
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 19 november 2014, 16:26:25
Citaat
Wel zou je nog eens kunnen meten met aan beide motor uitgangen een weerstand naar de GND. Iets van 1k doet het altijd goed  ;D En dan geen loc op de rail. Heb je nu wel het gewenste PWM signaal (0% - 100%)? Of nog makkelijker, bij DI1 en DI2 meten...

En maak je in de code echt gebruik van hardware PWM? (Dus doormiddel van analogWrite()?)
Dat gaan we proberen. En nee - ik maak gebruik van een software library om zowel de PBM frequentie als de duty cycle in te stellen.

Citaat
Okay, hier mis je mij even, wedstrijdje?  ::)
De Timesaver is van huis uit een puzzle met als doel in de kortste tijd een bepaalde rangeertaak uit te voeren. Wie het snelste is wint de pot.  ;D

Citaat
Kan ook prima, maar tot 20V kan ook prima. Hoeveel volt gebruik je voor het aansturen van de loc's?
Ik test met spanningen tussen de 9 en 18 volt. Laptopvoedingen zijn hiervoor perfect.

mvg,

Max.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Timo op 19 november 2014, 17:19:23
En nee - ik maak gebruik van een software library om zowel de PBM frequentie als de duty cycle in te stellen.
Kijk, daar gaat het fout. Hoge PWM frequentie met software PWM is geen goed idee. Voor lage frequenties is het prima maar op hoge frequenties mis je snelheid. Hierdoor is niet zo zeer de resolutie lager maar wel de nauwkeurigheid en vooral hele korte PWM is niet te doen. De code kan niet op tijd de boel afhandelen om maar een kort pulsje te geven.

Lijkt me dus handig om met hardware PWM te gaan werken, of een mix van hardware en software. Software voor trage PWM en hardware voor snelle. Maar opzich zou je met hardware PWM ook al een eind moeten komen. PWM frequentie is in te stellen tussen de 31kHz en 30Hz met de hardware PWM. Gebruik dan geen PWM die op timer0 zit want dan kom je in de knoei met de millis().

En voor het rijden op lage snelheden zou je dus nog kunnen proberen een lage PWM over de hoge PWM heen te leggen. Dus gewoon de hardware PWM instellen maar (zoals ik het had) met 80Hz gewoon analogWrite(255) te doen voor 5% tot 10%. Dus eigenlijk gewoon software PWM maken.

Klein beetje psedo code (kunnen dus fouten in zitten)
unsigned int speed;
unsigned int speedLastKick;
unsigned int speedState //0= normale speeds, 1 = soft PWM "kick"

doSpeed(){
unsigned int millisNow;
if(speed == 0){
analogWrite(PwmPort, 0);
}
else{
millisNow = millis();
if(speedstate == 0){
if(millisNow - speedLastKick >= 19){ //time for a kick
analogWrite(PwmPort, 255);
speedState = 1;
}
else{ //just the speed
analogWrite(PwmPort, speed);
}
}
else{ //we are giving a kick
if(millisNow - speedLastKick >= 20){ //time to end the kick
analogWrite(PwmPort, speed);
speedLastKick = millisNow();
speedState = 0;
}
}
}
}
doSpeed() roep je op in de loop. int speed is de snelheid die je in wilt stellen. En je hebt een extra kick iedere 20ms (maakt 50Hz) van 1ms (maakt een dutycycle van 5%). Verander je dus 19 in 18 ga je naar 10%.

Owja, en code van meerdere A4tjes is geen probleem, daarvoor hebben ze PastBin (http://pastebin.com/) uitgevonden. Zet syntax highlighting op C#


Timo
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 19 november 2014, 17:29:40
Klaas en Timo,

hartelijk dank - voorlopig kan ik weer vooruit.  (y)

mvg,

Max.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 22 november 2014, 17:17:50
Op aanraden van Klaas en Timo maar eens aan een bodemonderzoek begonnen.

Eerst de schakeling tot het absolute minimum teruggebracht:

(https://images.beneluxspoor.net/bnls/afb_01.png) (https://images.beneluxspoor.net/bnls/afb_01.png)

Daarna de software PBM vervangen door een library die gebruik maakt van hardware PBM.
Met instelpot P2 wordt tijdens het opstarten van de Arduino de frequentie ingesteld (1Hz..30kHz)
met instelpot P1 wordt daarna de gewenste rijrichting en duty cycle ingesteld.
Middenstand is stop, links naar 5..100% links, rechts naar 5..100% rechts.
Tijdens het opstarten toont de display de ingestelde frequentie, tijdens het rijden de duty cycle.

Hier de gebruikte code:

/****************************************************************************/

#include <Wire.h>                  // display libraries
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
#include "PWM.h"                   // PWM library

Adafruit_7segment display = Adafruit_7segment();

#define port1  9 // Dl1 TA8050 H-bridge
#define port2 10 // Dl2 TA6050 H-bridge

int value; 
int cycle;

bool left  = false;
bool right = false;

int32_t frequency = 0; // PWM frequency in Hz

/****************************************************************************/

void setup() {
 
  delay(2000);
 
  frequency = ((analogRead(1)) + 1);
 
  InitTimersSafe();
 
  bool success = SetPinFrequencySafe(port1, frequency);
 
  if (success) { // set UNO LED
    pinMode(13, OUTPUT);
    digitalWrite(13, HIGH);
  }
 
  pinMode(port1, OUTPUT);
  pinMode(port2, OUTPUT);
   
  pwmWrite(port1, 0);
  pwmWrite(port2, 0);
   
  display.begin(0x70); // set display
  display.setBrightness(7); // 0..15

  display.println(frequency); // frequency to display
  display.writeDisplay();
 
  delay(2000);
   
} // end setup

/****************************************************************************/

void loop() {  // main loop
   
  value = analogRead(0) / 2; // 0...511
  cycle = 0;

  // 0..245 = left, 246..266 = deadband, 267..511 = right   
   
  if (value < 246) left  = true; else left  = false;
  if (value > 266) right = true; else right = false;

  if (left) { // write value to PWM port1.
    cycle = 255 - value; // cycle between 10..255
    pwmWrite(port2, 0);
    pwmWrite(port1, cycle);
  }
   
  if (right) { // write value to PWM port2.
    cycle = value - 256; // cycle between 10..255
    pwmWrite(port1, 0);
    pwmWrite(port2, cycle);
  }
   
  if (!left && !right) {
    pwmWrite(port1, 0);
    pwmWrite(port2, 0);
  }

  display.println((cycle * 100) / 255); // duty cycle % to display
  display.writeDisplay();
   
} // end loop

/****************************************************************************/


Voorlopig de motor vervangen door een weerstandje.

Op de scoop ziet het er fantastisch uit...  ;D

Bij frequenties van 30Hz tot 20kHz kan ik de duty cycle regelen van 5 tot 100% - heerlijk.

Volgende stap: het rijden met locomotieven - heb inmiddels een rail ovaaltje gekocht.

Wordt vervolgd.

mvg,

Max.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Fritsprt op 22 november 2014, 18:00:12
Hoi Max, leuk onderwerp. Als het signaal er over een weerstand wel goed uitziet maar je motor draait niet lekker bij lagere frequenties moet je nog eens naar je uitgangen van de Arduino of de ingangen van de TA8050 kijken. Tijdens PWM mogen de ingangen DL1 en DL2 niet tegelijkertijd hoog worden want dan krijg je remmode. M.a.w. je stuurt een stroom door de motor om hem op gang te helpen en gelijk daarna ga je remmen (de motor kortsluiten) Mocht dit zich voordoen dan is dat de verklaring waarom je motoren niet goed draaien bij lagere frequenties.
Succes.

Frits
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 22 november 2014, 18:05:39
@Frits

Daar had Timo me ook al op gewezen  :) en dat was dan ook 't eerste dat ik gecontroleerd heb. Dat bleek in orde want dat had ik niet helemaal goed begrepen. Nu wel...

Bedankt.

mvg,

Max.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 25 november 2014, 19:12:45
Meten is weten...  ;)

Meetopstelling:
•   Voedingsspanning 12 volt gelijkspanning.
•   PBM frequentie instelbaar van 20 tot 100 Hz.
•   PBM arbeidscyclus instelbaar van 2 tot 100%.
•   Rail ovaal.
•   Scoop.

Gemeten zijn 3 locomotieven: Bachmann Spectrum GE 45, Bachmann GE 44 en Bachmann Alco S2. Mijn andere locomotieven moeten eerst in groot onderhoud.

Voordat er wordt gemeten worden de locs eerst een aantal minuten warmgedraaid.

Drie metingen bij respectievelijk 20, 50 en 100 Hz. Arbeidscyclus 50%.
Dit resulteert in de volgende snelheden:
•   GE 45:     25 km/h.
•   GE 44:     63 km/h.
•   Alco S2:   55 km/h.

Deze zijn – veel – te hoog om goed te kunnen rangeren en moeten dus omlaag.
Arbeidscyclus bij 20 km/h:
•   GE 45:     45%.
•   GE 44:     20%.
•   Alco S2:   23%.

Verschillende frequenties:
•   De frequentie is niet van invloed op de snelheid – wel op het regelbereik.
•   20 Hz: alle aandrijvingen rammelen en klinken inderdaad als ’n diesel.  ;D
•   50 Hz: hoe hoger de frequentie hoe kleiner het regelgebied dwz. bij verhogen van de frequentie schuift het startpunt op.
•   100 Hz: als bij 50 Hz.

Wat verder opvalt is het snelheidsverschil tussen voor en achteruit rijden. Loopt soms op tot wel 5 km/h – bij 20 km/h maximum…  ???

Ook valt op dat bij oudere locs (bv. Athearn) de maximum snelheid veel hoger is waardoor het effectieve regelgebied nog veel kleiner wordt.

Voorlopige conclusies:
•   Langzamer lopende motoren zouden een oplossing zijn?
•   Voor mijn toepassing hoeft de frequentie niet variabel te zijn.
•   50 Hz is een mooi compromis.

Wordt vervolgd (als het groot onderhoud achter de rug is).

mvg,

Max.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Timo op 25 november 2014, 21:24:47
Wat verder opvalt is het snelheidsverschil tussen voor en achteruit rijden. Loopt soms op tot wel 5 km/h – bij 20 km/h maximum…  ???
Hangt af van de loc, vooral hoe de aandrijving in elkaar zit. Moderne loc's hebben vaak goede symetrische aandrijving en hebben er een stuk minder last van.

Ook valt op dat bij oudere locs (bv. Athearn) de maximum snelheid veel hoger is waardoor het effectieve regelgebied nog veel kleiner wordt.
Ze hielden vroeger inderdaad van racetreinen. Gelukkig tegenwoordig wel eens stuk beter geworden. Komt de rijeigenschappen inderdaad ten goede.

•   50 Hz is een mooi compromis.
Als je op 50 Hz zit maak je inderdaad gebruik van de hardware PWM maar met een trucje. (De teller niet op 0 laten beginnen dus knijp je de resolutie.) Als je echt de invloed van de PWM frequntie wilt bekijken zou ik eens gaan wisselen tussen de verschillende hardware PWM frequnties. Zie daarvoor Timer PWM Cheatsheet (http://playground.arduino.cc/Main/TimerPWMCheatsheet) en Secrets of Arduino PWM (http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM). Blijf alleen van timer 0 (dus PWM4 en PWM13) af. Hiermee breng je de millis() functie in de war. Je hebt dan de beschikking over 31,4kHz, 3,9kHz, 980Hz, 490Hz, 245Hz, 123Hz en 31Hz bij gebruik van PWM3 en PWM11 in phase-correct PWM en het dubbele van die getallen in fast PWM. Je hebt dan op alle frequenties gewoon de beschikking over 256 stappen resolutie, geen library nodig.

Grote nadeel van 50Hz is dat het hoorbaar en zichtbaar is. Heb je LED verlichting ga je dat echt terug zien. In een LoPi 3 wordt een PWM frequentie van 16kHz gebruikt (zo uit me hoof) om je een idee van orde grote te geven. Zelf reed bij mij de loc mooi en soepel alleen had hij een beetje hulp nodig om de stilstand kleef te overwinnen.


Timo
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 26 november 2014, 01:29:38
Hangt af van de loc, vooral hoe de aandrijving in elkaar zit. Moderne loc's hebben vaak goede symetrische aandrijving en hebben er een stuk minder last van.

't duurde even tot 't muntje viel maar het komt omdat de borstels niet goed gecentreerd staan tov de magneten. Er is toch geen hond die 't merkt... ;D Ik herinner me slotcarmotoren met een verdraaibaar borstelschild - die lopen de ene kant op een stuk harder dan andersom. 8) Want voor de tandwielen maakt het niets uit welke kant 't op draait.

Citaat
Grote nadeel van 50Hz is dat het hoorbaar en zichtbaar is. Heb je LED verlichting ga je dat echt terug zien. In een LoPi 3 wordt een PWM frequentie van 16kHz gebruikt (zo uit me hoof) om je een idee van orde grote te geven. Zelf reed bij mij de loc mooi en soepel alleen had hij een beetje hulp nodig om de stilstand kleef te overwinnen.

Het grootste probleem met de hoge frequenties is de hoorbaarheid. Mijn hond vond 15 kHz niet zo'n fijn idee. :) Erger was dat het regelbereik steeds kleiner werd. Vergeet niet dat ik alleen geinteresseerd ben in 't stuk tussen 0 en 20 km/h...  :)

mvg,

Max.

PS - die 31 Hz ga ik nog even proberen - ben benieuwd...

M.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Klaas Zondervan op 26 november 2014, 09:06:38
In een LoPi 3 wordt een PWM frequentie van 16kHz gebruikt
Is volgens mij niet helemaal vergelijkbaar. De Lopi koppelt terug op de tegen-EMK van de motor, en bij een analoge regelaar heb je die terugkoppeling niet. Ik heb vroeger veel geëxperimenteerd met PWM en bij mij werkten de frequenties in het kilohertz bereik voor geen meter.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Timo op 26 november 2014, 12:57:47
Dat klopt wel, de duty cycle zal vanzelf toenemen als de loc vanuit stilstand nog niet wil rijden en dan afnemen als de motor eenmaal draait. Maar verder zit er geen verschil in.

Als je hond 15kHz niet fijn vond zal 32kHzook wel eens niet kunnen werken. Gehoor van een hond loopt tot zo'n 50kHz maar hangt ook af van soort hond en (net als bij de mens) leeftijd. Overigens vergeten oude mensen ook wel eens dat jonge mensen 15kHz ook niet fijn vinden  ;D  Tijdens practica er wel achter gekomen dat mijn gehoor iig nog ver doorloopt en oude CRT's vond ik een ramp.

Net even gecheckt, een LoPi 2, 3 en 4 stuurt de motor aan met 40kHz (en instelbaar op 20kHz). In mijn projectje deed ik het met 31kHz (met een superpositie van +-89 Hz met dutycycle van +-9% tegen kleef). Tenminste, dit zijn de laatste waarde in mijn project, weet dus niet meer of dat de beste waren  ::)

Erger was dat het regelbereik steeds kleiner werd.
Als je dus de "standaard" frequenties gebruikt zoals ik aan gaf zal je regelbereik niet kleinen worden, blijf 8-bit ofwel 0-255.


Timo
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 26 november 2014, 13:17:18
Overigens vergeten oude mensen ook wel eens dat jonge mensen 15kHz ook niet fijn vinden ;D

Ik hoor duidelijk in die categorie (de hond ook trouwens): hoor weinig meer boven de 10 kHz. Gevolg van jaren in de constructie werken... ;D

Als je dus de "standaard" frequenties gebruikt zoals ik aan gaf zal je regelbereik niet kleinen worden, blijf 8-bit ofwel 0-255.
Voor de duidelijkheid: als ik schrijf dat 't regelbereik terugloopt bedoel ik niet het 8-bit 0..255 bereik, maar het percentage dat ik moet instellen voor dat een loc begint te bewegen. Bij 50 Hz kan ik dus regelen van 0..100% maar de loc beweegt pas bij 5%. Bij 100 Hz beweegt de loc pas bij 10%. Als de gewenste maximum snelheid ligt bij 25% wordt het regelgebied dus 5..25% resp. 10..25%. Dus in zijn algemeenheid: hoe hoger de frequentie hoe kleiner het regelbereik... 8)

mvg,

Max.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Klaas Zondervan op 26 november 2014, 13:42:45
Nog een suggestie: kijk eens naar de schema's van mijn Permaloog systeem (http://people.zeelandnet.nl/zondervan/permaloog2.html), en dan in het bijzonder de HF oscillator. Daarin zit een trimpotmeter om het signaal symmetrisch te maken. Die bleek nodig te zijn omdat bij een directe terugkoppeling van de uitgang naar de -ingang van de opamp de positieve en negatieve pulsen niet precies evenlang waren. Daar gingen de locs op kruipen.

Ik heb dat in hardware gemaakt, maar is softwarematig ook wel te doen. Op de rails krijg je dan een blokvormige wisselspanning. Zolang de pulsen symmetrisch zijn doet de loc niks, maar ga je ze bewust asymmetrisch maken, dan zal hij de ene of de andere kant op rijden.
Wel oppassen met klokankermotoren, die gaan in rook op als je er langdurig een HF wisselspanning op zet (ervaringsfeit), maar gewone motoren met een ijzeren anker hebben daar geen last van.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Timo op 26 november 2014, 15:17:15
Ah, dit zou kunnen. Maar dan een vraag van mij. 50Hz en 100Hz zijn geen standaard frequenties op de Arduino. Hiervoor moet je de resolutie al aanpassen (= verkleinen). Ook blijf je spreken van procenten dus ik neem aan dat je in die library de snelheid in procenten op geeft? Als dat zo is zou ik je willen vragen eens te testen zonder die library. Je snijdt jezelf namelijk al in de vingers als je voor een 0-100 bereik kiest ipv 0-255. Helemaal omdat het intern toch gemapt zal worden naar iets dat geen 0-100 bereik heeft. Zo krijg je een aardige onnauwkeurigheid in je stappen. Zo kan dus een aantal stappen groter zijn dan andere, iets dat voor een mooi soepen rijgedrag niet helpt. Wil je dus een lage frequentie gebruiken zou ik eens kijken naar de 123Hz. Hierop zie je LEDverlichting niet meer knipperen en is een dus nog laag te noemen. Vervolgens kan je gewoon rijden met analogWrite() met een waarde tussen 0-255. En ja, 0-100 bereik klinkt lekker makkelijk voor ons als mensen maar ik zou toch proberen te gaan voor wat natuurlijk is voor een Arduino en dat is 8-bit.

Overigens kan het inderdaad nog zijn dat op de hoge frequentie (dus in de kHz) de loc niet gelijk begint te lopen maar, zoals je al aan gaf, bij 5% ofzo. Maar dit is dan waarschijnlijk door de kleef die de loc heeft in stilstand. Nadat de loc eenmaal in beweging is kan je waarschijnlijk verder terug regelen. Dit was dus de rede dat ik over de hoge PWM frequentie nog een lage software PWM had van 80Hz. Dat was wel op een PIC microcontroller met een 10-bit PWM.

@Klaas, kan jij aangeven op welke frequentie die HF generator werkt bij permaloog?


Timo
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Klaas Zondervan op 26 november 2014, 15:31:08
De Permaloog oscillator loopt op 20kHz. Maar voor de goede orde, die is bij mij niet bedoeld om te rijden, maar om continu spanning op de baan te hebben voor de verlichting. Ik heb die spanning juist moeten symmetreren om te voorkomen dat locs er op gaan rijden.
Wat ik nu aan Max adviseer is dus precies wat ik zelf probeer te vermijden.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 26 november 2014, 15:47:40
Ah, dit zou kunnen. Maar dan een vraag van mij. 50Hz en 100Hz zijn geen standaard frequenties op de Arduino. Hiervoor moet je de resolutie al aanpassen (= verkleinen). Ook blijf je spreken van procenten dus ik neem aan dat je in die library de snelheid in procenten op geeft? Als dat zo is zou ik je willen vragen eens te testen zonder die library. Je snijdt jezelf namelijk al in de vingers als je voor een 0-100 bereik kiest ipv 0-255. Helemaal omdat het intern toch gemapt zal worden naar iets dat geen 0-100 bereik heeft. Zo krijg je een aardige onnauwkeurigheid in je stappen. Zo kan dus een aantal stappen groter zijn dan andere, iets dat voor een mooi soepen rijgedrag niet helpt.

In de Arduino gebruik ik stappen 0..255. Die 0..100% zijn inderdaad alleen maar om dat makkelijker klinkt. En omdat overal de arbeidscyclus in %% wordt aangeven. En zo helpen we dus stap voor stap de spraakverwarring de wereld uit. ;D

Citaat
Wil je dus een lage frequentie gebruiken zou ik eens kijken naar de 123Hz. Hierop zie je LEDverlichting niet meer knipperen en is een dus nog laag te noemen. Vervolgens kan je gewoon rijden met analogWrite() met een waarde tussen 0-255. En ja, 0-100 bereik klinkt lekker makkelijk voor ons als mensen maar ik zou toch proberen te gaan voor wat natuurlijk is voor een Arduino en dat is 8-bit.

Kun jij gedachten lezen? ;) Ik zit net te kijken wat de mogelijke vaste waarden zijn: 31 Hz, 62 Hz of 122 Hz. Want dan heb ik inderdaad die library niet meer nodig.

Wat ik nu aan Max adviseer is dus precies wat ik zelf probeer te vermijden.

Dat is fraai - aan zulke adviezen heb ik wat... ;D ;D ;D (er ontbreekt op dit forum 'n LOL (schateren) emoticon...)

mvg,

Max.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Timo op 26 november 2014, 15:55:31
@Klaas, dat snap ik. Vroeg het me gewoon af  ;D

@Max, is een kleine gave  ;D Maar omdat ik in me glaze bol even niet kon vinden welke lib je gebruikte wist ik niet of die misschien gemapt was op 0-100, want dat zou zonde zijn.  ;D


Timo
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 27 november 2014, 14:03:57
(https://images.beneluxspoor.net/bnls/afb_02.png) (https://images.beneluxspoor.net/bnls/afb_02.png)

Nieuw schema - veel eenvoudiger dan dit zal 't niet worden. (tenzij ik de display weglaat...)

/****************************************************************************/

#include <Wire.h> // display libraries
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"

Adafruit_7segment display = Adafruit_7segment();

#define port1  9 // DL1 TA8050 H-bridge
#define port2 10 // DL2 TA8050 H-bridge

int value; 
int cycle;

bool left  = false;
bool right = false;

/****************************************************************************/

void setup() {
 
  pinMode(port1, OUTPUT);
  pinMode(port2, OUTPUT);
 
  // set PWM frequency timer 1 to 122 Hz
  // base frequency 31250 / 256 = 122 Hz
 
  TCCR1B = TCCR1B & 0b11111000 | 0x04; // set timer 1 divisor 256
   
  analogWrite(port1, 0);
  analogWrite(port2, 0);
   
  display.begin(0x70); // set display
  display.setBrightness(7); // 0..15
   
} // end setup

/****************************************************************************/

void loop() {  // main loop
   
  value = analogRead(0) / 2; // read pot.: 0..511
  cycle = 0;

  // value: 0..249 = left, 250..260 = deadband, 261..511 = right   
   
  if (value < 250) left  = true; else left  = false;
  if (value > 260) right = true; else right = false;

  if (left) { // write duty cycle to PWM port1
    cycle = 255 - value; // duty cycle between 5..255
    analogWrite(port2, 0);
    analogWrite(port1, cycle);
  }
   
  if (right) { // write duty cycle to PWM port2
    cycle = value - 256; // duty cycle between 5..255
    analogWrite(port1, 0);
    analogWrite(port2, cycle);
  }
   
  if (!left && !right) {
    analogWrite(port1, 0);
    analogWrite(port2, 0);
  }

  // cycle: 255 (left) - 0 - 255 (right)
 
  display.println(cycle); // duty cycle to display
  display.writeDisplay();
   
} // end loop

/****************************************************************************/

Aangepaste code - zonder PBM library...

Resultaten van bovenstaande aanpassingen:

Meetopstelling:
•   Voedingsspanning 12 volt DC.
•   PBM frequentie 122 Hz.
•   PBM arbeidscyclus regelbaar in 255 stappen. (0-100%)
•   Rail ovaal.
•   Scoop.
•   HP 35s Calculator.

GE 45:   start bij stap 25, 20 km/h bij stap 100, regelbereik 75 stappen.
GE 44:   start bij stap 30, 20 km/h bij stap   56, regelbereik 26 stappen.
Alco S2: start bij stap 35, 20 km/h bij stap   65, regelbereik 30 stappen.

Conclusie:
eigenlijk is van deze locs alleen de GE 45 echt geschikt om te rangeren. Van de andere 2 is de topsnelheid te hoog en derhalve het lage snelheidsregelgebied te klein. Bij oudere locs is het probleem alleen maar groter omdat vaak de topsnelheid veel hoger is. Een Athearn Hustler - met snaaraandrijving - haalt wel 250 km/h... ;D

De schakeling zelf werkt prima: geen gebrom en/of gefluit; goed regelbaar; stabiel; makkelijk uit te breiden met allerlei toeters en bellen (optrek- en rem-vertraging, start en snelheid instelling,  lichtsluis, stopwatch, enz.).

Het betekent wel dat ik op zoek moet naar locomotieven met een zo laag mogelijke maximale snelheid - of bestaande exemplaren moet ombouwen. En dat ik met aanschaf van "oud" spul heel voorzichtig zal moeten zijn...  8)

Wordt vervolgd.

mvg,

Max.

Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Timo op 27 november 2014, 15:22:02
Yep, gelukkig zijn fabrikanten er langzaam ook achter dat de overbrenging omhoog mocht voor lagere topsnelheid en lagere kruipsnelheid.

Nog een vraagje. Hoe heb je die minimale snelheden bepaald? Door steeds de snelheid met een stapje te verhogen tot de loc in beweging komt? Zo ja, dan kan je nog eens testen of de loc daarna misschien nog een stapje omlaag kan zonder tot stilstand te komen.

En wat betreft de code, snelle scan. Probeer in de setup eerst de belangrijke dingen te doen (zorgen dat de motordriver uit is) en dan pas de rest. Ik heb even niet in de Atmega328 opgezocht of de state van de pinnen vast ligt na reset maar ga uit van wel. Maar voor de zekerheid, doe eerst pinMode() en dan gelijk de analogWrite(). Dan pas klok aan gaan passen en andere dingen doen. Zo definieer je zo snel mogelijk je pinnen en trek je ze laag zodat de motordriver niet per ongeluk even aan kan gaan bij het inschakelen.

En nog een klein doorzaagpuntje, de Arduino groep heeft het liefst dat je geen DEFINE gebruikt voor een port aanwijzing maar een const.
#define port1  9 // DL1 TA8050 H-bridge
#define port2 10 // DL2 TA8050 H-bridge
Zou dan worden
const unsigned int PwmDL1 =  9 // DL1 TA8050 H-bridge
const unsigned int PwmDL2 =  10 // DL2 TA8050 H-bridge
Hierbij heb ik ze gelijk logischere namen gegeven (want port1 en port2 zegt echt niets als je de boel uitbreid  ;D) en volgens Arduino gebruik heb ik de const variabele laten beginnen met een hoofdletter (PwmDL1 en PwmDL2). Met een find and replace moet je natuurlijk dit ook doorvoeren in de rest van je programma.

Je gebruikt nu twee booleans voor de richting. Maar ze sluiten elkaar uit dus dat is niet echt nodig. Die zou je dus net zo goed kunnen veranderen in een boolean direction. Sterker nog, je zou het ook gewoon op kunnen nemen in je je speed. Negatief voor links en positief voor rechts. Code kan dan dit worden
void loop() {  // main loop
int speed;

speed = map(analogRead(SpeedKnob), 0, 1023, -255, 255); //map the SpeedKnob value to a speed between -255 (left) and 255 (right)

if(speed <= 5 && speed >=-5){ //5 point deadband around 0
analogWrite(PwmDL1, 0);
analogWrite(PwmDL2, 0);
}
else if(speed < 0){ //so turn left, deadband excluded
analogWrite(PwmDL2, 0);
analogWrite(PwmDL1, -speed);   //analogWrite expects a positive value, double negative is positive again
}
else{ //or it's right
analogWrite(PwmDL1, 0);
analogWrite(PwmDL2, speed);
}

display.println(cycle); // duty cycle to display
display.writeDisplay();
}


Succes verder!

Timo

PS Kleine voetnoot, code is geschreven op basis van de orginele code en niet gecompiled. Er kunnen dus kleine fouten in zitten maar het gaat om de basis.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: De Stoker op 27 november 2014, 15:31:17
Leuk topic, deze ga ik eens doorlezen, in afwachting op de levering van mijn Arduino's
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 27 november 2014, 15:46:06
Nog een vraagje. Hoe heb je die minimale snelheden bepaald? Door steeds de snelheid met een stapje te verhogen tot de loc in beweging komt? Zo ja, dan kan je nog eens testen of de loc daarna misschien nog een stapje omlaag kan zonder tot stilstand te komen.

Inderdaad. Precies zo... ;) Dat werkt 't best.

Je opmerkingen inzake m'n code zal ik ter harte nemen - met uitzondering van links en rechts. :)
Ik vind soms verschillende waarden voor links en rechts rijden en die worden dan verschillend ingesteld zodat de rijsnelheid gelijk wordt.
Dan krijg ik iets als speedLeft en speedRight... 8)

In ieder geval hartelijk dank voor je bijdrage. (y)

Nu kunnen de toeters en bellen weer terug in de schakeling en de code.

mvg,

Max.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Timo op 27 november 2014, 17:28:48
Hoi Max,

Ik was al weer vergeten dat je wilt rijden met een schakelaar  ;D Maar dan nog zou het wel handig kunnen zijn om speed gewoon tussen -255 - 255 te gebruiken en er alleen voor links en rechts een andere waarde in zetten. Dus aan de hand van de schakelaar speed = speedLeft of speed = speedRight waarbij speedLeft dus een negatief getal is. Je hebt dan altijd genoeg aan het schrijven naar één variable om de snelheid en richting in te stellen.

Ow, en als je nog eens een keer een kort if else statement hebt kan je hem inkorten

if( a == b){
  c = HIGH;
}
else{
  c = LOW;
}
kan je verkorten tot
(a == b ? c = HIGH : c = LOW);
of
c = (a == b ? HIGH : LOW);

Gebruik je dit voor complexe statements wordt het wel een zooitje  ;D Maar vooral als je één var aan wilt passen aan de hand van een statement is het lekker kort en overzichtelijk.


Timo[/code]
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 27 november 2014, 17:45:24
Timo,

't bestaan van die ingekorte statements is me bekend, maar ik moet eerlijk zeggen dat ik ze zo weinig mogelijk gebruik.
Vooral omdat ik maanden later soms moeite heb m'n eigen schrijfsels terug te lezen.
Vandaag schrijf ik wat voor m'n Arduino, morgen misschien weer iets in Javascript of C/C++.
Als ik dan te kort schrijf of geen commentaar genoeg hebt aangebracht zie ik door de bomen 't bos niet meer.
M'n korte termijn geheugen is ook niet meer wat 't geweest is...  ;D

Max.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 20 december 2014, 15:11:30
(https://images.beneluxspoor.net/bnls/afb_04.png) (https://images.beneluxspoor.net/bnls/afb_04.png)

Na een paar weken rondjes rijden, meten en knutselen: een PBM regelaar tbv rangeren – en veel eenvoudiger dan dit zal ’t niet worden…  8)

Een kleine toelichting:

•   P1 – regelt de snelheid.
•   P2 – begrenst de maximale snelheid.
•   S – bepaald de rijrichting.

Afhankelijk van de geladen software zijn er verschillende mogelijkheden. Zo kan de rijrichtingsschakelaar worden weggelaten: dan wordt met P1 zowel de snelheid als de rijrichting bepaald (stop in de middenstand). En als de maximum snelheidsbegrenzing niet nodig is kan P2 er ook uit.

De getekende schakelaar is ’n drie standen exemplaar maar met ’n twee standen werkt ’t ook.

Voeding: het werkt prima met een – oude – laptop voeding van 12 volt. Als een voeding met een hogere spanning wordt gebruikt is het aan te bevelen de getekende spanningsregelaar toe te passen – wel is waar zou de Arduino Uno bestand zijn tegen een spanning van max. 20 volt maar je weet maar nooit…  ;)

Opmerkingen:

In de software staat de PBM frequentie ingesteld op 31 kHz. Dit is een in de Arduino ingebouwde standaard frequentie. Andere standaard opties zijn 4 kHz, 488 Hz, 122 Hz en 30 Hz. Alternatieve frequenties zijn (bij gebruik van een bibliotheek) mogelijk maar gaven niet ’t gewenste resultaat – met name in het regelbereik. Het grootste bezwaar tegen frequenties onder de 20 kHz is het geluid: variërend van hoorbaar fluiten tot brommen.

In alternatieve schema’s waarin de TA 8050 wordt gebruikt ontbreken de twee weerstanden R1 en R2. Weglaten kan leiden tot een onbepaald gedrag bij het opstarten of resetten van de Arduino, dwz de loc rijdt even op topsnelheid in willekeurige richting weg. Ietwat slordig…  :D

In plaats van een Arduino Uno kunnen ook andere Arduino’s gebruikt worden. Een goed alternatief lijkt de Arduino Pro Mini 5v. In dat geval zal de spanningsregelaar hoe dan ook moeten worden gebruikt. Het wachten is op de postbode…  (y)

Hier de Arduino sketch voor de uitvoering zonder schakelaar en maximum snelheid begrenzer:

/*****************************************************************************
  kale versie met potmeter: links - stop - rechts
*****************************************************************************/

const int PwmDl1 =  9;                           // Dl1 TA8050 H-bridge left
const int PwmDl2 = 10;                           // Dl2 TA8050 H-bridge right

bool left  = false;
bool right = false;

/****************************************************************************/

void setup() {                     // set PWM frequency timer 1 to 31,25 kHz.
  TCCR1B = TCCR1B & 0b11111000 | 0x01;
}

/****************************************************************************/

void loop() {
   
  int value = analogRead(0) / 2;                // read potentiometer: 0..511
  int cycle = 0;
  delay(100);

  // value: 0..249 = left, 250..260 = deadband, 261..511 = right   
   
  if (value < 250) left  = true; else left  = false;
  if (value > 260) right = true; else right = false;

  if (left) {                               // write duty cycle to PWM PwmDL1
    cycle = 255 - value;                    // duty cycle between 5..255
    analogWrite(PwmDl2, 0);
    analogWrite(PwmDl1, cycle);
  }
   
  if (right) {                              // write duty cycle to PWM PwmDL2
    cycle = value - 256;                    // duty cycle between 5..255
    analogWrite(PwmDl1, 0);
    analogWrite(PwmDl2, cycle);
  }
   
  if (!left && !right) {
    analogWrite(PwmDl1, 0);
    analogWrite(PwmDl2, 0);
  }
}

/****************************************************************************/

Wordt vervolgd…

Mvg

Max.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Timo op 20 december 2014, 15:49:16
De getekende schakelaar is ’n drie standen exemplaar maar met ’n twee standen werkt ’t ook.
Een aan-uit schakelaar moet ook werken en heb je maar één input nodig. NIet dat dit slecht is maar puur als aanvulling.

In alternatieve schema’s waarin de TA 8050 wordt gebruikt ontbreken de twee weerstanden R1 en R2. Weglaten kan leiden tot een onbepaald gedrag bij het opstarten of resetten van de Arduino, dwz de loc rijdt even op topsnelheid in willekeurige richting weg. Ietwat slordig…  :D
Denk dat het inderdaad een goed idee is. Maar iets wat hiermee te maken heeft en ik mis in je code is netjes een pinMode() configuratie in setup().  ;)

In plaats van een Arduino Uno kunnen ook andere Arduino’s gebruikt worden. Een goed alternatief lijkt de Arduino Pro Mini 5v. In dat geval zal de spanningsregelaar hoe dan ook moeten worden gebruikt.
Nee hoor ;D De Arduino Pro Mini is prima te gebruiken zonder voltage regulator. De term 5v wijst alleen op de interne spanning van het Arduino bordje. Je hebt hem ook op 3,3V en deze loopt op 8Mhz (sneller dan dat is instabiel op 3,3V). Maar de Arduino Pro Mini is gewoon voorzien van een spanningsregulator  ;D

Wat betreft de code, mooi simpel voorbeeldje. Maar ontbreekt eigenlijk de nette pinMode() declaratie. Ook heeft de input van de potmeter geen mooie toegankelijke naam gekregen  ;) En de if, if, if constructie kan je vervangen door een if, else if, else if constructie. Voor hier niet echt van toepassing maar scheelt de Arduino weer checks :p

Ook prima schema. Denk er inderdaad aan dat je na een 78xx niet een grote condensator aansluit maar inderdaad zoals jij hebt gedaan ervoor (de 10uF).


Veel plezier met knutselen!

Timo
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 20 december 2014, 16:11:33
Wat betreft de code, mooi simpel voorbeeldje. Maar ontbreekt eigenlijk de nette pinMode() declaratie.

en dat terwijl ik in de Arduino handleiding lees dat dat voor een eenvoudige analogWrite niet nodig is...  ;D

Citaat
Ook heeft de input van de potmeter geen mooie toegankelijke naam gekregen  ;)

daar heb je volkomen gelijk in - vergeten... (iets met m'n korte termijn geheugen...)  :)

Citaat

En de if, if, if constructie kan je vervangen door een if, else if, else if constructie. Voor hier niet echt van toepassing maar scheelt de Arduino weer checks :p

dat komt omdat ik deze constructie nodig heb voor nog aan te brengen toeters en bellen - ik weet 't: zwak excuus...  ;D

Citaat
Veel plezier met knutselen!

hartelijk dank en hetzelfde...  (y)

mvg,

Max
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Timo op 20 december 2014, 16:18:15
en dat terwijl ik in de Arduino handleiding lees dat dat voor een eenvoudige analogWrite niet nodig is...  ;D
pinMode is inderdaad niet nodig voor analogWrite() maar wel best practice. Ook zorgt dit ervoor dat de pin gelijk laag getrokken wordt bij het opstarten en niet pas in de eerste keer dat de loop doorlopen wordt. Maar aangezien de bootloader toch even tijd inneemt met opstarten zijn de pull downs net zo makkelijk.

Dat komt omdat ik deze constructie nodig heb voor nog aan te brengen toeters en bellen - ik weet 't: zwak excuus...  ;D
Ga je een situatie maken waarin left en right tegelijk true zijn?  ;D


Timo
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 20 december 2014, 16:25:39
pinMode is inderdaad niet nodig voor analogWrite() maar wel best practice. Ook zorgt dit ervoor dat de pin gelijk laag getrokken wordt bij het opstarten en niet pas in de eerste keer dat de loop doorlopen wordt. Maar aangezien de bootloader toch even tijd inneemt met opstarten zijn de pull downs net zo makkelijk.

't vreemde was juist dat dat op hol slaan ook gebeurde met de pinMode er nog in. Met de weerstandjes was het over...  ???

Citaat
Ga je een situatie maken waarin left en right tegelijk true zijn?  ;D

dat weet je bij mij maar nooit...  8)

Max
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Timo op 20 december 2014, 16:38:21
Dan hebben de pinnen flink de nijging omhoog te floaten (in goed Nederlands  8) ). Met opstarten hangt de Arduino zeker een seconde in de boatloader dus dan wordt de pin nog niet laag getrokken door de pinMode(). Pull down weerstanden is dan een goed idee :)


Timo
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Fritsprt op 20 december 2014, 17:51:08
@Timo, wat is de reden dat de elco na de 78xx niet te groot mag zijn? Ik wil ook graag nog wat leren.

Gr. Frits
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Timo op 20 december 2014, 18:04:55
twee redenen, eerste is de laadstroom die de 78xx dan moet verwerken maar waar ze (als ik me goed herinner) ook voor waarschuwen in de handleiding is dat hij instabiel kan worden. Dus beter zware elco's voor de 78xx (kan hij ook meer lading opslaan) en dan alleen een kleine als ontstoring.

Timo
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Fritsprt op 20 december 2014, 18:17:53
Klinkt logisch. Nu zit er 100n in de afgaande kant, dat is volgens mij tegen hf storing. Voor afvlakking kan 100 u geen kwaad.
Nu ik beter kijk zie ik C1, 10u in de voeding zitten. Dus toch afvlakking
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 20 december 2014, 18:26:37
Die 10u moet volgens het datasheet van de firma Toshiba zo dicht mogelijk op de TA 8050 worden gemonteerd.
Wie ben ik om daar aan te twijfelen...  ;D

M'n scoop ziet trouwens zonder geen verschil.  8)

Max.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Fritsprt op 20 december 2014, 18:51:51
Hallo Max, ik schreef dat die 10U voor de afvlakking is maar dat is onjuist. Die is voor de buffering ingeval je stroompieken gaat trekken. Dat is ook de reden dat hij dicht bij die 8050 moet zitten ivm minimale weerstand. In de praktijk zal e.e.a. wel meevallen zoals je op de scoop kan zien.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Menno op 20 december 2014, 23:04:24
@Timo, wat is de reden dat de elco na de 78xx niet te groot mag zijn? Ik wil ook graag nog wat leren.
twee redenen, eerste is de laadstroom die de 78xx dan moet verwerken maar waar ze (als ik me goed herinner) ook voor waarschuwen in de handleiding is dat hij instabiel kan worden. Dus beter zware elco's voor de 78xx (kan hij ook meer lading opslaan) en dan alleen een kleine als ontstoring.
Het grootste bezwaar is puur het 'optillen' van de uitgang ten opzichte van de ingang.
Als om wat voor reden dan ook, iets de uitgang langer van spanning blijft voorzien dan de ingang en de uitgang krijgt een hogere voedingsspanning te verwerken dan de ingang, dan loopt het met grote kans fout af voor de 7800 regelaar...

Er wordt daarom nog wel eens een beschermingsdiode over de regelaar geplaatst.

@ Fritsprt: hoe snel is je scoop? Naaldpulsen (beter bekend als 'spikes') zijn vaak moeilijk zichtbaar met de gemiddelde scoop
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Fritsprt op 20 december 2014, 23:32:10
Het ging om de scoop van Max en om de invloed van de 10 u elco. En volgens mij zit de 100n erin tegen de spikes
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 20 december 2014, 23:38:46
En ik ga eerst proberen of het gaat zonder spanningsregelaar want volgens Timo moet dat goed gaan...  :)

Trouwens het idee van minder onderdelen staat me wel aan.  (y)

mvg,

Max.
Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: Max Roodveldt op 25 december 2014, 12:26:10
Omdat ook ik ’t niet kan laten aan een goede schakeling te rommelen…

Een van de vervelende eigenschappen van een Arduino is dat ‘ie lijdt een vorm van geheugenverlies - ingestelde minimum en maximum snelheden gaan bij ’n reset verloren.

Voor de goede orde: in bijgaand schema wordt met P3 de snelheid geregeld volgens het inmiddels bekende principe: links – stop – rechts met een regelbereik van 100% - 0 – 100% (255 - 0 - 255).

(https://images.beneluxspoor.net/bnls/afb_05.png) (https://images.beneluxspoor.net/bnls/afb_05.png)

/*****************************************************************************
versie met potmeters voor links/stop/rechts, minimum en maximum snelheid.
*****************************************************************************/

// libraries
#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"

Adafruit_7segment display = Adafruit_7segment();

const int PwmDl1 =  9;                           // Dl1 TA8050 H-bridge left
const int PwmDl2 = 10;                           // Dl2 TA8050 H-bridge right
const int SpeedP =  0;                                 // speed potentiometer
const int MinPot =  1;                         // minimum speed potentiometer
const int MaxPot =  2;                         // maximum speed potentiometer
const int ButMin =  0;                                // button minimum speed
const int ButMax =  1;                                // button maximum speed

bool  left     = false;
bool  right    = false;
int   minSpeed =   0;
int   maxSpeed = 255;
float factor   =   1.0;

/****************************************************************************/

void setup() {

  // set display
  display.begin(0x70);
  display.setBrightness(7); // 0..15

  // set PWM frequency timer 1 to 31,25 kHz.
  TCCR1B = TCCR1B & 0b11111000 | 0x01;

  // set input pins
  pinMode(ButMin, INPUT_PULLUP);
  pinMode(ButMax, INPUT_PULLUP);
}

/****************************************************************************/

void loop() {

  int value = analogRead(SpeedP) / 2;                  // read speedP: 0..511
  int cycle = 0;

  // value: 0..249 = left, 250..260 = deadband, 261..511 = right   
   
  value < 250 ? left  = true: left  = false;
  value > 260 ? right = true: right = false;

  if (left) {                       // duty cycle between minspeed - maxspeed
    cycle = minSpeed + int((249.0 - value) * factor);
    analogWrite(PwmDl2, 0);
    analogWrite(PwmDl1, cycle);             // write duty cycle to PWM PwmDL1
  }
   
  if (right) {                      // duty cycle between minSpeed - maxSpeed
    cycle = minSpeed + int((value - 261.0) * factor);
    analogWrite(PwmDl1, 0);
    analogWrite(PwmDl2, cycle);             // write duty cycle to PWM PwmDL2
  }
   
  if (!left && !right) {
    analogWrite(PwmDl1, 0);
    analogWrite(PwmDl2, 0);
 
    if (digitalRead(ButMin) == 0) {
      cycle  = minSpeed = analogRead(MinPot) / 4;                   // 0..255
      factor = (maxSpeed - minSpeed) / 250.0;
    }
 
    if (digitalRead(ButMax) == 0) {
      cycle  = maxSpeed = analogRead(MaxPot) / 4;            // minSpeed..255
      factor = (maxSpeed - minSpeed) / 250.0;
    }
  }
 
  display.println(cycle);
  display.writeDisplay();
 
}

/****************************************************************************/


Omdat proefondervindelijk is vastgesteld :) dat dit zowel aan de onder- en de bovenkant verbetering behoeft kunnen we dit aanpassen. Tijdens stilstand (0) kan als schakelaar S1 wordt gedrukt met P2 de minimale snelheid worden ingesteld en als schakelaar S2 wordt gedrukt met P1 de maximale snelheid. Bij voorbeeld: van stap 30 tot stap 127 (10%..50%). Dit wordt net zolang herhaald tot het gewenste resultaat is bereikt…

Als nu de Arduino wordt gereset gaan deze instellingen verloren, maar…: als er nu even op S1 en S2 wordt gedrukt worden de potmeter instellingen weer geladen en kunnen we verder waar we gebleven waren. Wederom blijkt dat er voor elke oplossing een probleem is.

Nog ‘n probleempje: als ’n loc is warm gedraaid zijn de resultaten anders dan koud uit de doos. Warm draaien doe ik op een ovaaltje; hoe dat straks op mijn baantje moet weet ik nog niet. Misschien voorgloeien? Het zijn tenslotte allemaal diesels… 8)

Uit het schema blijkt dat ik de spanningsregelaar heb verwijderd, alsmede de ontstorings-condensatoren – het werkt net zo goed (uiteraard).

Om de instellingen zichtbaar te maken wordt een display gebruikt; dat display staat niet in dit schema maar wel in de software – sorry.  :-[

Wordt vervolgd…

Mvg,

Max.

Titel: Re: Snelheidsregelaar met Arduino Uno en TA8050.
Bericht door: De Stoker op 09 februari 2015, 11:37:54
Mooi overzicht en ook netjes de codes overzichtelijk bij in het verhaal. Ben inmiddels ook aan de Arduino's, me nog wat aan het inwerken maar het is erg mooi spul.