BeneluxSpoor.net forum

Vraag en antwoord => Elektronica en analoog => Topic gestart door: smits66 op 13 maart 2014, 23:55:09

Titel: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 13 maart 2014, 23:55:09
Hoi forumleden

Inleiding.

In deze topic wil ik een beschrijving geven, van het ontwerpen testen en bouwen van een analoge modelbaan sturing met een Arduino.

Het is niet de bedoeling om hier allerlei discussies te gaan voeren wat beter is analoog of digitaal of een
pic processor beter is als een Atmel processor, in deze topic gaat het over het ontwerpen testen en bouwen van een analoge modelbaan sturing met een Arduino.

Mochten er mensen zijn die toch een discussie willen voeren over wat beter is zijn er genoeg andere topics waar dat wel kan.

Ik hoop dat de mensen er begrip voor hebben.

Aanvullingen met betrekking tot schema's, programma's, fouten in programma's en schema's, tips en truuks om het geheel eenvoudiger te maken enz. zijn altijd welkom.


Waarom wil ik analoog blijven rijden 

Ik heb een twintigtal analoge locomotieven die ook nog zo'n tien a twintig jaar oud zijn, nieuwe locomotieven zijn duur, tweede hands locomotieven zijn nog betaalbaar maar zijn meestal analoog en hebben geen voorzieningen voor een decoder ingebouwd.
 
Ik wil geen geld stoppen in decoders, die kosten al gauw vijfentwintig a dertig euro per stuk( n-spoor decoders), dat heb ik er niet voor over.

Ook de voordelen van digitaal rijden zie ik niet direct, om geld te gaan steken in decoders en aanverwante elektronica.

Er zijn wel zeker een aantal voordelen als je digitaal rijd, front/sluit verlichting inschakelen, twee kanten op het zelfde baanvak rijden onafhankelijk van de rijrichting meerdere locomotieven tegelijk en onafhankelijk van elkaar rijden.
Maar voor mij rechtvaardigt het niet om daar veel geld aan te besteden, modelspoor blijft een dure hobby, ik investeer liever in scenery dan in decoders.

Hetzelfde geld voor Dinamo sturing, dat kost zomaar even 1000 euro om er alleen een basis pakket voor te kopen.

Ok,  je kan dan digitaal en analoog op een baan rijden maar voor mij weegt dat niet op, om er zoveel geld in te steken.
Voor dat geld heb ik bijna de voledige modelspoor elektronica om mijn baan analoog te automatiseren.

Ik hoor meteen al zeggen dat de electronica om een Arduino modelbaan sturing te bouwen ook veel geld kost dan kan je beter meteen een aantal decoders of dinamo voor kopen.

Dat kost inderdaat ook geld,  alleen koop ik voor dertig euro genoeg onderdelen om mijn baan al voor een klein gedeelte te automatiseren.

Arduino uno rv3 (kloon)  8,00  euro per stuk
Protoshield Arduino        3,50 euro per stuk
Relais kaart 4 voudige      5,00  euro per stuk
Relais kaart 2 voudige      2,50  euro per stuk
Reed relais klein model  5,00  euro per 10 stuks (soms kan het nog goedkoper)

Dit zijn gemiddelde prijzen vaak kun je er goedkoper aankomen.

Met deze onderdelen kan ik al een eenvoudige 6 voudige bloksturing bouwen.

Basis Arduino modelbaan sturing,

(https://images.beneluxspoor.net/bnls/IMG1472_2448_x_1836_1.jpg) (https://images.beneluxspoor.net/bnls/IMG1472_2448_x_1836_1.jpg)

Foto boven : Uitgangspunt voor het verder ontwikkelen van een Arduino analoge modelbaan sturing.

De wissels worden voorlopig  nog met de hand (elektrische) omgezet. (kan overigens prima met een Arduino gestuurd worden.)

Later wil ik pwm, voor het rijden gaan gebruiken.

Voor een pwm sturing voor de arduino betaal ik gemmiddeld 5,00 euro per stuk, vaak minder.

Om een lang verhaal kort te maken zijn dat de argumenten om analoog gestuurde modelspoorbaan met een arduino te maken.

Analoge modelbaan sturing met een Arduino.

Wat is een Arduino.

Arduino is een opensource-computerplatform dat is opgebouwd rond de ATmega168-microcontroller van Atmel (de nieuwe generatie gebruikt een ATmega 328 pu-microcontroller).

Er is een arduino mega verkrijgbaar, meer gegeugen en meer I/O poorten.

Arduino uno

(https://images.beneluxspoor.net/bnls/ArduinoUno_R3_Front_450px.jpg) (https://images.beneluxspoor.net/bnls/ArduinoUno_R3_Front_450px.jpg)

Arduino mega

(https://images.beneluxspoor.net/bnls/ArduinoMega.jpg) (https://images.beneluxspoor.net/bnls/ArduinoMega.jpg)

Wat kan je er mee:

Ik zou zeggen heel veel je fantasie is je limmid.

Arduino dcc decoder

Op het forum is er al een topic Arduino dcc decoder, in deze topic word uitgelegd hoe je dcc codes uitleest met een Arduino, in deze topic ga ik het niet hebben over een Arduino dcc sturing.


Ontwerpen testen en bouwen van een analoge modelbaan sturing met een arduino

In het onderstaande flowchart laat ik zien hoe ik een Arduino modelbaan sturing wil gaan maken.

(https://images.beneluxspoor.net/bnls/Arduino_modelbaan_sturing_1.jpeg) (https://images.beneluxspoor.net/bnls/Arduino_modelbaan_sturing_1.jpeg)


Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Sacull op 14 maart 2014, 10:11:22
Zeer interessant !
Ik lees dit met veel belangstelling.

Sacull.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 14 maart 2014, 15:58:28
Ik vraag me alleen nu af wat je precies wilt gaan sturen... Zonder wissel sturing kom je niet veel verder dan een pendel. En wat is je doel voor de interface? Wil je dit analoog houden, soort cab controle ofzo? Of wil je zelf ook een programma maken?


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 14 maart 2014, 17:18:21
Hoi,

@ Sacull

Bedankt voor je reactie.

Ik hoop dat ik jou belangstelling kan vasthouden :).
Ik ben geen expert op Arduino gebied ::), meer een hobbyist met wat elektronica ervaring, ik moet zelf ook nog veel leren en proberen met een Arduino.
Ik zie dit project dan ook als een grote uitdaging.

@Timo

Bedankt voor je reactie.

Citaat
Ik vraag me alleen nu af wat je precies wilt gaan sturen...

Ik wil mijn modelbaan met de Arduino gaan besturen, via een bloksysteem, de wissels worden ook gestuurd door de Arduino alleen niet direct, dat geld ook voor de pwm sturing en allerlei andere sturingen (mijn fantasie is mijn limit ), de pwm sturing word later vervangen door faseaansnijding (beter voor oude loc motoren), maar een stuk moeilijker om te ontwerpen en te programmeren.

Citaat
De wissels worden voorlopig  nog met de hand (elektrische) omgezet. (kan overigens prima met een Arduino gestuurd worden.)
Later wil ik pwm, voor het rijden gaan gebruiken.

Citaat
Of wil je zelf ook een programma maken?
Een Arduino kan alleen werken als er een programma in zit.  ;)

Citaat
soort cab controle ofzo?
kun je me uitleggen wat dat is. :o

@allen

Ik ben geen expert op Arduino gebied en moet nog veel uitzoeken en veel proberen, vandaar dat ik eenvoudig begin om zo meer ervaring in het ontwikkelen programmeren en bouwen met de Arduino. ::)

Het hoeft gisteren ;D niet af, ik neem er de tijd voor.

Ik begin simpel en bouw het systeem er verder mee uit.

Als de mensen dit interessant vinden vind ik alleen maar mooi. ;D


mvg Paul  (y)
 
 
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Tukker op 14 maart 2014, 20:20:04
Ga dit draadje zekers volgen net zoals de andere arduino draadjes  overigens ::)
Veel succes
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Darkwing Duck op 14 maart 2014, 20:33:19
Waarom wil je I2C tussen de master en slaves gebruiken? Hier zijn mooiere protcollen voor  ;)
Waarom zou je alle bezetmeldingen naar direct naar de master sturen als je toch met slaves gaat werken?
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 14 maart 2014, 22:05:18
Hoi,

@ Tukker

Bedankt voor je reactie.

Ik word een beetje nieuwsgierig waarom je alle Arduino topics volgt, heb je interesse om ook iets met de Arduino te gaan doen?  ;)

@ Darkwing Duck

Bedankt voor je reactie.

Het I2C protocol zit hardwarematig op de ATmega 328 processor  en binnen de programmeer omgeving(Arduino) is daar een  library voor (Wire) waardoor het niet zo moeilijk is om het I2C protocol te gebruiken en voor deze sturing is geen snelle communicatie nodig tussen de master en de slave.

Waarom moeilijk doen als het makkelijk kan.  ;D

Maar ik ben dan wel benieuwd naar de mooiere protocols voor de Arduino ::) zoals jij schrijft.

Ik wil twee soorten meldingen hebben analoog(stroom detectie) en digitaal (reed relais).
Op de Arduino mega zitten 16 analoge ingangen op de Arduino uno maar 6 waarvan er al twee geserveerd zijn voor I2C bus, op de Arduino uno wil ik de digitale melding gaan gebruiken en op de Arduino mega, de analoge bezet melding.

Voor ik zover ben, gaat daar wel een tijdje overheen.
Ik ga eerst met de basis aan de slag. (zie foto 6 posten terug)

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 15 maart 2014, 00:56:14
Uitleg flowchart

Het hart van de "analoge modelbaan sturing met een Arduino" is de Arduino mega, deze Arduino heeft veel I/O onboard en heeft een hardware matige I2C bus onboard.
waardoor deze Arduino perfect is als het hart van de modelbaan sturing.

Analoge modelbaan sturing met een arduino in het kort.

Boven aan zien we de schematische weergave van de Arduino mega en hoe de modelbaan sturing bedacht is (of het uteindelijk zo gaat werken weet ik niet)

Links zien we de I2C bus waarop zes Arduino uno's aanzitten, deze Arduino werken geheel zelfstandig maar wisselen data uit met de Arduino mega via de I2C bus.

De Arduino mega verwerk deze data en stuurt de data naar de pc waar je de data in realtime op het scherm getoond word (niet het verloop van de treinen alleen puur de data)
Het is ook mogelijk om via de pc commando's te sturen naar de Arduino mega die vervolgens de commando's doorstuurt naar de desbetreffende Arduino slave (dat is uiteindelijk de bedoeling).

Voorlopig ga ik daar nog niet aan beginnen hou ik me alleen bezig met de Arduino mega als commandopost voor de modeltrein sturing.

Als tweede taak heeft de Arduino mega, het sturen van de baan verlichting (huizen, gebouwen, lantaarnpalen)

Als derde heeft de Arduino mega de taak om de communicatie tussen de pc en Arduino te regelen, of met een usb kabel of via een bluetooth verbinding (data van en naar de pc sturen, commando's van de pc naar de Arduino sturen).

Als vierde taak heeft de Arduino mega om een realtime clock en temperatuur regeling (elektronica)  te sturen (deze gegevens worden getoond op het lcd display en later op het scherm van de pc).

Als vijfde taak heeft de Arduino mega , om de analoge bezetmelding te registreren, daarmee de modelspoor baan in de gate te houden en deze gegevens te tonen op het pc beeldscherm ( ook daar ben in nog niet mee bezig).

Als zesde taak heeft de Arduino mega, de data, temperatuur elektronica, tijd enz. te tonen op het lcd scherm, in een later stadium zullen deze gegevens op het pc beeldscherm te zien zijn.

Om het kort samen te vatten wil ik met "analoge modelbaan sturing met een Arduino"  via de Arduino mega of via de pc te sturen of allebij tegelijk (dat ga ik pas proberen als het allemaal goed werkt).

Het is nu wachten op de bestelde onderdelen voor ik verder kan gaan ontwerpen/programeren met de Arduino mega.
Ik hoop dat één dezer dagen de bestelde onderdelen aankomen.

De tweede flowchart

(https://images.beneluxspoor.net/bnls/slavesturing_1.jpg) (https://images.beneluxspoor.net/bnls/slavesturing_1.jpg)

De Tweede flowchat laat een uitvergroting zien van twee Arduino uno slave modules, de functies die deze Arduino's  moeten gaan vervullen staan erbij.

Arduino slave 1

Slave 1 ,  is voor het regelen van de verschillende blokken en voor het omzetten van drie wissels (per paar geschakeld zes wissels).

Blok 1 tot en met 6, zijn er voor om een blok bezet melding (digitale bezet melding met reed relais) te geven ik kan zes blokken sturen met deze sturing (blok bezet melding),
Wissel 1 tot en met 3  (heb totaal 6 poorten nodig voor drie wissel sturingen rechtdoor en afbuigend) als ik ze per paar schakel kan ik zes wissels schakelen.

Arduino slave 2

Slave 2, is voor het regelen van de snelheid via pwm en een sein regeling

De Arduino uno heeft 6 pwm kanalen, per kanaal kan er in één blok de snelheid geregeld worden, het nadeel kan zijn dat de treinen maar één kant kunnen oprijden (hondenbot ontwerp)
Wil je zowel vooruit als achteruit en de snelheid in een blok regelen kun je maximaal 2 pwm sturingen gebruiken (per blok heb je dan drie poorten nodig,  in1, in2 en en.)
Sein 1 tot en met 3 (heb totaal 6 porten nodig sein stand rood en groen) als je ze per paar schakel 6 seinen (anti parallel of één op één of voorsein hoofdsein)  uitgaande van een eenvoudig bloksein.

Er blijven per slave unit nog één digitale I/O en vier analoge in kanalen die je dan nog kunt gebruiken.

tot zover

mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 16 maart 2014, 22:46:00
Hoi,

We gaan weer verder met de beschrijving.

Motorsturing

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

Er zal gedacht worden weer een flowchart, ik gebruik veel flowchart het maakt het ontwikkelproces zichtbaar en begrijpelijk, voor het programmeren maak ik ook vaak gebruik van flowchart.

Op mijn modelspoor baan wil ik de treinen kunnen regelen snelheid en richting ik heb daarvoor een motorsturing nodig.
Voor de Arduino zijn verschillende motorsturingen verkrijgbaar (motorshields) op een motorshield zitten of twee motorstuur ic (L293D) of één motorstuur ic (L298D)

(https://images.beneluxspoor.net/bnls/IMG1490_2448_x_1836.jpg) (https://images.beneluxspoor.net/bnls/IMG1490_2448_x_1836.jpg) (https://images.beneluxspoor.net/bnls/IMG1492_1836_x_2448.jpg) (https://images.beneluxspoor.net/bnls/IMG1492_1836_x_2448.jpg)

Met deze motorshields kan je motoren sturen via pwm, dat is net wat ik nodig heb, in een later stadium wil ik de treinen sturen via het zaagtand principe, daarover later.

Met pwm kun je de motoren langzaam laten optrekken en langzaam laten afremmen perfect voor de Analoge modelbaan sturing met een Arduino.

Ik ga eerst wat experimenteren met de motoshield met twee motor stuur ic's, dit is een opzet shield voor de Arduino

(https://images.beneluxspoor.net/bnls/IMG1491_2448_x_1836.jpg) (https://images.beneluxspoor.net/bnls/IMG1491_2448_x_1836.jpg)

Als ik met deze motorshield 4 motoren linksom en rechtsom kan sturen en de snelheid kan regelen, dan kan ik op mijn modelbaan er 4 blokken mee aansturen. :)

Met reed relais kan ik registreren of er een trein een blok inrijd , op dat moment kan ik het bloksein van het vorige blok op rood zetten en de achterliggende trein laten afremmen.

De reed relais kan ik via de analoge poort inlezen, met één analoge poort kan ik 4 reed relais detecteren (of meer).

Later wil ik dat doen met stroom detectie, ik wil eerst de basis beheersen om van daaruit verder te ontwerpen.

Op de digitale poort 2 kan ik een drukknop aansluiten die als noodstop werkt, als het dreigt fout te gaan.

Schema blok detectie en drukknop volgt nog.

Dit is puur theorie ik moet het nog gaan uitproberen.

Deze motorsturing met de Arduino communiceert met de Arduino master via de I2C bus.

Het onderstaande programma laat de motor 5 seconden linksom draaien dan 4 seconden stoppen en dan 5 seconden rechtsom draaien en dat de motor voor 1 seconde stopen.

#include <AFMotor.h>
 
AF_DCMotor motor(2, MOTOR12_64KHZ); // create motor #2, 64KHz pwm
 
void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Motor test!");
 
  motor.setSpeed(100);     // set the speed to 100/255
}
 
void loop() {
  Serial.print("motor linksom");
 
  motor.run(FORWARD);      // turn it on going forward
  delay(5000);
 
 Serial.print("Stop motor");
  motor.run(RELEASE);      // stopped
  delay(4000);
 
  Serial.print("motor rechtsom");
  motor.run(BACKWARD);     // the other way
  delay(5000);
 
  Serial.print("Stop motor");
  motor.run(RELEASE);      // stopped
  delay(1000);
}

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 17 maart 2014, 20:27:28
Hoi Paul!

Erg leuk idee als je het zelf ook leuk vindt om te doen :) Zelf ben ik een student elektrotechniek en mag ook graag hobbien :) Toch ga ik je nu best wat opmerkingen geven. Zie deze niet als kritiek, ik vind het super leuk, maar het zijn punten van aandacht.

Een Arduino kan alleen werken als er een programma in zit.  ;)
Dat snap ik. 8) Maar ik doelde vooral op een programma op een PC die het denkwerk gaat doen.

Cab controle
Cab controle is vooral in Amerika gebruikt. Ipv dat je met een rijregelaar een blok stuurt kies je met schakelaars welk blok met welke rijregelaar verbonden is. Door het volgende blok op dezelfde regelaar te schakelen als het huidige blok volg je de loc met dezelfde regelaar. Net alsof je in de cabine (cab) de boel bestuurd (controle).

Natuurlijk hoef jij niet met schakelaars de boel op dezelfde regelaar te schakelen. Jij hebt de kracht van een uC  ;D Jij kan de regeling van het volgende blok exact gelijk maken aan het huidge blok en zo doorrijden. Maar je zou nog wel een regelaar (gewoon een potmeter) aan de Arduino kunnen hangen voor de snelheid. Omdat je weet wanneer een trein het volgende blok in rijdt kan je deze regelaar de trein ook gewoon laten volgen. Op deze manier heb je weer een echte regelaar per blok  ;D

I2C
Je zegt I2C als bus te willen gebruiken. Dit is mogelijk maar I2C is niet zo goed met lengtes. Dus als de Arduino's niet naast elkaar liggen zou ik het niet gebruiken. Zelf zou ik alleen gekozen hebben voor serial uart netwerk. Dit zit namelijk ook al als hardware op een Arduino, op de Mega zelfs 4 keer. En als je de slave Arduino's verspreid onder de baan wilt hebben zou ik zelfs gaan voor RS485 (http://nl.wikipedia.org/wiki/RS-485). Hiermee ben je verzekerd van een goede en snelle communicatie.

Reed relais
Waarom wil je deze lezen met een analoge pin? De uitgang van een reedrelais is gewoon digitaal en daarmee gewoon uit te lezen. Vergeet niet om een redelijk stevige pull-up te gebruiken en bouw een debounce in. Of ben je van plan om meerdere reedrelais uit te lezen met behulp van een weerstandsladder? Dit kan wel maar ik weet niet of het handig is. Ook hier wil je een vorm van debounce hebben en een analoge lezen is erg traag vergeleken van een digitale lezing. Denk je dat je te weinig input hebt (let wel, de PWM poorten en de analoge poorten zijn ook gewoon digitaal te lezen), dan kan je misschien nog makkelijker een shift register (http://www.arduino.cc/en/Tutorial/ShiftIn#.Uyc50Pl5OkE) gebruiken icm de shiftIn functie (http://arduino.cc/en/Reference/ShiftIn#.Uyc6s_l5OkE).

Stroomdetectie
Je zegt dat je later stroomdetectie wilt gebruiken. Let wel dat je geen detectie hebt als je spanningsloos bent, bijvoorbeeld als de trein stil staat. Maar ook als je precies kijkt op het moment dat de PWM sturing uit is. Dit kun je oplossen door een condensator op te nemen in de uitgang van de stroomdetectie. Veel ontwerpen hebben ook wel zoiets. Er zijn iig tig ontwerpen bruikbaar.

Ook hier meld je dat je een analoge pin wilt gebruiken, weer via een weerstandsladder?

Zaqagtand sturing
Ik snap ook niet helemaal waarom je dit wilt doen. Met PWM is een betere sturing te maken dan met een zaagtand. Zeker niet als je een relatief trage zaagtand gebruikt. In het verleden heb ik ook wel eens een loc met PWM aangestuurd en  had ik wat last van kleef. Zeker vanuit stilstand wilde de loc niet soepel beginnen met rijden. Ik heb toen, boven op de normale PWM sturing van 32kHz nog een soort softwarematige trage PWM puls gelegd van 80Hz en 9% duty cycle. Dit door 80 keer per seconde de PWM output voor 9% (2/22 van de tijd) van die 80Hz op 100% te zetten. Dit geeft net een extra kick en is er heerlijk mee te rijden. Het signaal ziet er dan schematisch zo uit:
  _        _        _        _        ________        _        _
_| |______| |______| |______| |______|        |______| |______| |
De lange pulsen zijn de 80Hz 9% pulsen tegen kleef en de korte pulsen zijn de te regelen PWM pulsen voor de snelheid. Het is wel wat lastig uit te leggen zo. Ik zou een voorbeeld kunnen schrijven door de arduino als het moet maar ik heb nog weinig gewerkt met de timers op een Arduino  ::)

Eventueel is het natuurlijk mogelijk meerdere profielen voor de sturing aan te maken zodat je per loc een andere kunt gebruiken die beter werkt. Deze kan je dan, net als de snelheid bij cab controle, ook doorsturen naar het volgende blok. Je zou zelfs dingen als optrek en afrem vertraging, cab controle stijl, door kunnen laten sturen om een goederentrein eerder te laten remmen. Of een rangeer stand met halve snelheid regeling op hele bereik van de rijregelaar enzo. Maar dit gaat misschien wat ver.

Motor sturing H-brug
Verder zeg je de blokken te willen sturen met een H-brug. Dit is goed mogelijk. Je geeft alleen aan dan 2 inputs  met PWM te moeten sturen en een enable voor 1 blok. Nu kan je de enable lijn al last leggen en deze altijd hoog maken (gewoon aan de 5V, niet via een output van de Arduino). Dit scheelt al een pin. Nu heb je nog twee inputs op je motor driver. Nu hoef je deze niet beide met een PWM te voeden. Je zou input1 aan een PWM kunnen hangen en input2 aan een gewone output. Als de digitale uitgang LOW is dan rij je linksom (ligt er natuurlijk net aan hoe je kijkt  ;D ) door met PWM te sturen op de PWM pin. Maak je de uitgang HIGH dan rij je rechtsom en stuur je met PWM. Enige is alleen, je PWM signaal is verkeerd om bij rechts om rijden. analogWrite(pwmPin, 0) levert volle snelheid op en analogWrite(pwmPin, 255) is stilstand.

Wat je ook zou kunnen doen is met 1 driver 4 blokken aansturen met ieder een halve H-brug. Per blok heb je dan een input pin om te PWMen voor de snelheid. Nu hoor ik je denken, en de andere kant dan op? Hiervoor kun je gewoon met een relais de boel omkeren. Voordeel: veel blokken per driver, PWM staat voor de snelheid in beide richtingen, je hebt echt een richtings bit (de pin naar het relais). Nadeel, je hebt weer relais nodig.

motor sturing met vrijloop
Iets wat je in de voorgaande stukken ook niet doet is gebruik maken van de vrijloop van de loc. Het vliegwiel in de loc wordt te niet gedaan. Met PWM en een H-brug stuur je het spoor HIGH of LOW. HIGH dan wil de motor draaien maar bij LOW sluit je als het ware de motor kort (kan geen kwaad  ;) ) maar zo rem je hem wel af. Vandaar dat er in de datasheet dan ook gesproken wordt van "Fast motor stop". Dit is leuk voor een motor die je nauwkeurig wilt regelen of als je een noodstop wilt maken maar voor de rest eigenlijk vervelend. Er zit niet voor niets een vliegwiel in veel loc's! Beter is om, wanneer de motor geen PWM puls krijgt, niet te remmen maar om te gaan voor "Free running motor stop" zoals ze dat in de datasheet noemen. Je laat dan de uitgangen van de H-brug zweven en je sluit de motor niet kort, deze kan dus in de tussentijd vrij blijven draaien maar zal niet versnellen. (Nu staat er een fout in de datasheet (http://users.ece.utexas.edu/~valvano/Datasheets/L293d.pdf), in de tabel op pagina 9 bij figuur 5 moet op de onderste regel bij L X X ook  "Free running motor stop" staan ipv "Fast motor stop".) Voor deze manier zet je het PWM signaal op de enable ingang. De 2 inputs sluit je aan op digitale outputs van je arduino. Door de inputs HIGH en LOW te maken draai je rechts om en maak je ze L en H (andersom dus) dan draai je links om. Maak je ze beide H of beide L en enable is H, dan doe je als nog een "Fast motor stop", een noodrem.

De oplossing met een relais werkt nu niet omdat je maar per 2 uitgangen van de motor driver een enable pin hebt. Hierdoor zouden 2 uitgangen altijd dezelfde snelheid hebben. Wel zou je de motor driver kunnen laten vallen en vervangen door een NMOS-FET of een ULN2003 (http://pdf.datasheetcatalog.com/datasheets/120/489337_DS.pdf) als driver. (Als je twee uitgangen samen neemt kan je met 1 IC 4 blokken sturen van elk 1A.) Wel heb je dan een relais nodig om de rijrichting te wisselen.

De ULN2003 is dus ook erg geschikt om je wissel (en sein) bediening mee te maken :) De Arduino kan niet zo veel leveren op de uitgang en natuurlijk ook maar 5V.

Oef, dat was het wel weer, hele bevalling. Ik hoop dat je er wat aan hebt :) Als je het zo lees bedenk ik het snel maar het even uitschrijven duurde toch zeker 1,5 uur  ::) Veel succes! Ik blijf het volgen en als er nog vragen zijn hoor ik het wel.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 17 maart 2014, 22:15:48
Hoi Timo

Bedankt voor je reactie.

1,5 uur  :o :P

Opmerkingen zie ik niet als kritiek, ik kan er nog wat van leren.

Dat is een heel verhaal waar ik de helft nog niet van snap ::), ik ben wel werkzaam als elektromonteur, maar mijn kennis van de Arduino en elektronica  is net hobby kennis, ik zal hier wel even op moeten studeren, ik vind het in ieder geval fijn dat er mee gedacht word (y).

Mijn eerste idee was om een aantal relais te gebruiken om sporen spanningsloos te maken zodat de treinen zouden stoppen, hiervoor wilde ik de Arduino gebruiken, dit om eens te experimenteren met de Arduino (heb er vier ;D)

Ik kwam later nog een motorshield tegen in mijn elektronica bak, zodoende ben ik daar eens mee gaan stoeien en kwam tot de conclusie dat een motorshield prima toe te passen is voor bloksturing.

Wat ik begrepen heb, is een zaagtand sturing beter voor de elektromotor dan pwm, minder slijtage.

Mijn uiteindelijke doel is om een Arduino bloksturing te maken naar het voorbeeld van het van Meekeren bloksystem alleen dan de Arduino gestuurde.

Het is de bedoeling dat de diverse arduino's in een centrale kast zitten en met de baan verbonden worden met sub-d 9 polige of 24 polige connectoren.

Het is niet de bedoeling om op de pc een programma te hebben draaien om de Arduino's aan te sturen, alleen word er data zoals sein standen, wisselstanden, blok bezet meldingen enz en misschien wat comando's  naar de pc gestuurd het denkwerk doet de Arduino mega in combinatie met de Arduino uno's.

De meeste van mijn locomotieven hebben geen vliegwiel.

Voor de overige opmerkingen moet ik deze tekst nog even bestuderen.

Mvg Paul



Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Falkenberg op 17 maart 2014, 22:21:16
Deze opzet lijkt heel erg op CMRI (http://www.jlcenterprises.net/Index.htm) uit de 80er jaren (alle goede ideeën zijn al bedacht  ;)
Centrale aansturing van blokken met een stuk VB als logica erachter. Werkte toen, dus kan nu ook werken.

dirkjan
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 17 maart 2014, 23:15:24
@Dirkjan, dat systeem nooit gezien. Dus hoe dat verder moet. Maar leuke van uC tegenwoordig is dat je voor relatief weinig veel rekenkracht hebt.

1,5 uur  :o :P
Tja, je wilt toch een beetje een begrijpelijk verhaal neerzetten...

Mijn eerste idee was om een aantal relais te gebruiken om sporen spanningsloos te maken zodat de treinen zouden stoppen, hiervoor wilde ik de Arduino gebruiken, dit om eens te experimenteren met de Arduino (heb er vier ;D)
Dit kan natuurlijk prima. Maar de mogelijkheden zijn dan natuurlijk beperkt.

Ik kwam later nog een motorshield tegen in mijn elektronica bak, zodoende ben ik daar eens mee gaan stoeien en kwam tot de conclusie dat een motorshield prima toe te passen is voor bloksturing.
En toen werd het leuk  ;D Daarmee heb je wel een heel stuk meer mogelijkheden. Maar automatisch natuurlijk een stuk meer uitdagingen  ;D Ik zou gewoon lekker die motor drivers gebruiken in full H-brug en dan PWM sturen op de enable. Heb je geen relais nodig en free running is mogelijk.

Het is de bedoeling dat de diverse arduino's in een centrale kast zitten en met de baan verbonden worden met sub-d 9 polige of 24 polige connectoren.
Zelf ben ik wel fan van een gedecentraliseerde opstelling (modules op de plek waar het nodig is, niet in een centrale kast). In een centrale kast lijkt erg overzichtelijk, je hebt immers alles bij elkaar. De hoeveelheid draden die je vervolgens alleen naar die kast moet gaan trekken  ::) Vroeger wat het een voordeel. Zo konden verschillende modules onderdelen delen om kosten te besparen. Maar met de komst van betaalbare uC's is dat voordeel een beetje verdwenen. Kijk ook maar naar de telefoon. Vroeger had een stad één grote telefooncentrale waar alle kabels van alle losse telefoons bij elkaar kwamen. Maar met de komst van digitale techniek en vooral goedkopere techniek wordt die juist uit elkaar getrokken. De kabels komen nu in de wijk bij elkaar waar een soort mini centrale staat. Vanaf daar gaat het dan verder als (digitaal) netwerk. Bespaard een hele hoop kabels en doordat alles digitaal is kan het makkelijk aangepast worden. Ik zeg dus niet dat het niet kan of slecht is, maar ik weet niet of het systeem daarmee zo simpel/overzichtelijk mogelijk blijft.

Wat ik begrepen heb, is een zaagtand sturing beter voor de elektromotor dan pwm, minder slijtage.
Ik zou niet weten waarom. Slijtage aan het elektronische deel van de motor bestaat eigenlijk niet. En de motor zelf is een beste spoel die als laag doorlaat filter werkt voor het signaal. De motor kan dus niet echt onderscheid maken tussen hele snelle PWM en een gelijkspanning. De regeling wordt er wel een stuk makkelijker van  ;D PWM sturing wordt dan ook breed toegepast in de wereld.

De meeste van mijn locomotieven hebben geen vliegwiel.
Ondanks dat ze geen vliegwiel hebben zetten ze wel massa in beweging. En het is best zonde om dat echt te gaan remmen als het ons eignelijk niet uitmaakt, zolang het niet versneld. Zie het als het gas los laten of de koppeling indrukken. (Okay, niet op een te moderne auto, die past namelijk ook allemaal trucjes toe. Denk even aan een oud diesel busje  ;D) Als je het gas even los gaat zal de auto gaan afremmen op de motor. Terwijl als je de koppeling even indruk en het gas los laat de boel prima even lekker kan rollen. Omdat je dit met PWM eigenlijk heel veel keer per seconde doet is het zonde om steeds te remmen.

Het is niet de bedoeling om op de pc een programma te hebben draaien om de Arduino's aan te sturen, alleen word er data zoals sein standen, wisselstanden, blok bezet meldingen enz en misschien wat comando's  naar de pc gestuurd het denkwerk doet de Arduino mega in combinatie met de Arduino uno's.
Dit kan met een uC super leuk, maar hoe modulair tegen hoe baan specifiek maakt ligt wel hoe bruikbaar het is op een andere baan. Modulairder is eigenlijk altijd complexer=lastiger, je moet dan rekening houden met alle mogelijke toepassingen. Ik denk dat het voor jou vooral leuk is hoe je jou baan zo leuk mogelijk kunt aansturen.

Als je verder nog vragen hebt moet je ze maar stellen. (pseudo) Code voor een Arduino kan ik wel schrijven (ook al heb ik even geen Arduino laat staan shields liggen). Ook het schrijven van libraries voor de Arduino heb ik genoeg ervaring mee. Heb alleen nog nooit zo veel gespeeld met de timers op de Arduino  ::) Voor alles een eerste keer.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 26 maart 2014, 22:54:07
Hoi Timo

Bedank voor je reactie.

Hoewel ik al een aantal dagen niets gepost heb ben ik wel verder gegaan.

Ik heb ondertussen een werkende, nog wel beperkte modelbaan sturing met een Arduino geprogrammeerd en een visual basic programma om met de Arduino te communiceren en het werk goed.
Hoewel de code niet compact is werk het programma zowel in de Arduino als in Visual Basic goed.

Met het Visual Basic programma kun je de wissels omzetten, handmatig een blok bezet melding geven, noodstop geven zodat alle treinen meteen stil staan, baanspanning aanzetten baan verlichting in en uitschakelen in meerde groepen, tekst meldingen ontvangen van de Arduino en commando's aan de Arduino sturen.

Ik heb het getest met Led's op de poorten van de arduino, dat werkt goed, als ik de Led's vervang door bv relais werk het nog steeds.

Nog even een vraagje je schreef dat je  libraries voor de Arduino kon schrijven, hoe doe je dat ::)
Om het Arduino programma wat overzichtelijk te houden wil ik graag het onderstaand stukje programma in libraries zetten, of werk dat niet ?
Er zullen wel meer "const int" en andere variablen er bij gezet worden als ik verder ben met dit project.

const int Stijd = 10 * 1000;  // Stoptijd stopblok
 const int Wtijd = 10 * 1000;  // Wachttijd wachtblok
 //const int Noodstop = 1;       // Noodstop actief hoog
 //const int Sda = 20;           // I2C bus serial data
 // const int Scl = 21;           // I2C bus serial clock
 
 // initialisatie noodstop
 
 const int LED = 52;      // Stoppen Arduino Mega modelspoor sturing.
 const int LED1 = 53;     // Vrijgave Arduino Mega modelspoor sturing.
 const int LEDN = 50;    // Noodstop geactiveerd
 const int LEDV = 51;    // Noodstop Opgeheven

// initialisatie poorten blokken


 const int Blok1 = 22;   // Inkomende spoor
 const int Blok2 = 23;   // Uitgaande spoor
 const int Blok3 = 24;   // Schaduwstation spoor 1
 const int Blok4 = 44;   // Schaduwstation spoor 2
 const int Blok5 = 26;   // Stationspoor spoor 1
 const int Blok6 = 27;   // Stationspoor spoor 2
 const int Blok7 = 28;   // Wachtspoor
 const int Blok8 = 29;   // Goederenspoor
 const int Blok9 =  5;   // Wisselblok 1
 const int Blok10 = 6;  // Wisselblok 2

// initialisatie poorten voor wissel sturing

 const int Wis1 = 30;  // wissel 1
 const int Wis2 = 31;  // wissel 2
 const int Wis3 = 32;  // wissel 3
 const int Wis4 = 33;  // wissel 4
 const int Wis5 = 34;  // wissel 5
 const int Wis6 = 35;  // wissel 6
 const int Wis7 = 36;  // wissel 7
 const int Wis8 = 37;  // wissel 8
 const int Wis9 = 38;  // wissel 9
 const int Wis10 = 39; // wissel 10
 const int Wis11 = 40; // wissel 11
 const int Wis12 = 41; // wissel 12

Zijn er programma's waarmee je libraries kunt schrijven.  ::)

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 27 maart 2014, 22:04:27
We gaan weer verder met de sturing

Jawel  ;D daar is i weer een Flowchart.

(https://images.beneluxspoor.net/bnls/Untitled_Document.jpeg) (https://images.beneluxspoor.net/bnls/Untitled_Document.jpeg)

Op de Flowchart kun je zien dat de Arduino Mega (werk ook met een arduino uno)  modelbaan sturing via een terminal programma Of via een visual basic programma gestuurd kan worden, voor nu nog handmatig.

In principe moet de gehele Arduino modelbaan sturing zelfstandig gaan werken, maar ik wil ook de baan handmatig blijven kunnen sturen.

Als de baan in automatische mode staat kun je de status van de sturing aflezen op het Lcd display, deze werk ook als de baan in hand mode staat.

Met zelfstandig bedoel ik dat de treinen een blok in rijden en het achterliggende blok automatische bezet melden, ook moeten de treinen zelfstandig (automatische mode) de wissels kunnen omzetten, ook het schaduw station moet automatische gestuurd worden.

IK heb nu de proef opstelling klaar en getest, voor zo ver ik het kan zien werk het programma goed in handmatige mode (automatische mode moet nog geprogrammeerd worden) , ik wil eerst de handmatige sturing werkend hebben, als proef opstelling werk het goed, ga de led's vervangen door relais en testen of het nog steeds goed werkt.

Proefopstelling met led's en het LCD display.

(https://images.beneluxspoor.net/bnls/IMG1500_2448_x_1836.jpg) (https://images.beneluxspoor.net/bnls/IMG1500_2448_x_1836.jpg)

Nog even een drietal screenshots van de terminal bediening en van het Visual Basic programma.

Terminal weergave

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

Visual Basic weergave

(https://images.beneluxspoor.net/bnls/visualbasicprogrammaa.jpg) (https://images.beneluxspoor.net/bnls/visualbasicprogrammaa.jpg)(https://images.beneluxspoor.net/bnls/visualbasicprogramma1.jpg) (https://images.beneluxspoor.net/bnls/visualbasicprogramma1.jpg)

Hoewel het Visual Basic programma goed werk zijn er zeker in het scherm interface verbeteringen nodig, hierbij moet je denken aan de plaatsing van de knoppen beginscherm scherm interface (nu staan de sporen standaard op vrij, dat willen we eigenlijk niet hebben), grotere scherm afmeting, misschien een ander soort bediening. Voor het testen van de sturing voldoen de bedienings- knoppen prima.

Het volgende wat er dan in het programma gebouwd moet worden is een snelheid regeling, dit word met een arduino Uno gedaan die via het I2C protocol met de Arduino Mega communiceert.

Dat was het weer.

Op of aanmerkingen, suggesties, verbeteringen zijn altijd welkom.  ::)

Mvg Paul  ;D

 



 
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: memen op 27 maart 2014, 22:43:38
Misschien een beetje offtopic, maar ik zou je pc even updaten naar windows 7 of hoger. Wel zo veilig.

Groeten,

Rauke

Verstuurd van mijn GT-S7500 met Tapatalk

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Klaas Zondervan op 27 maart 2014, 23:17:17
Zolang die PC niet met het internet verbonden is, is er geen enkel probleem.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: ingenium op 28 maart 2014, 03:07:57
En dan nog...  ::)
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 28 maart 2014, 09:04:37
Ziet er leuk uit Paul! Zelf heb ik helaas geen ervaring met VB maar dit zit er al leuk uit. Zou je misschien, als je dat wilt, je code ergens online willen zetten? Vooral van de Arduino's. In je vorige bericht zie ik vooral een berg met constanten. Heb je ook een soort protocol opgesteld? Of hoe geef je opdrachten tussen de units?

Verder zou ik toch nog willen zeggen, denk je keuze voor I2C nog eens na. Dit is een trage en gevoelige bus. Je kan ook de UART pakken. Deze kan meer data aan, eventueel zelfs full duplex, en is minder storing gevoelig. En makkelijk uit te breiden naar grotere afstanden met RS485 mocht dat nodig zijn. (Want bij centrale opstelling krijg je echt heeeel veel draden bij elkaar.) De uno's hebben één UART en de Mega heeft er vier. Op de mega kan je dan makkelijk één UART gebruiken voor de PC (doe je nu al) en dan een andere voor de uno's.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 28 maart 2014, 11:41:30
Timo,

Vraag meteen de compiler erbij. Zover ik het kan zien is het VB6. Dit wordt al enige tijd niet meer ondersteund door MS.

Groet,

Gerard van der Sel.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 28 maart 2014, 13:33:21
Hoi Gerard

Hoe weet jij dat dit vb6 is. ???

Groet Paul ;D


Verstuurd vanaf mijn SMP53-210 met Tapatalk

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 28 maart 2014, 15:16:28
IDE verraad je. VB.NET (de opvolger) heeft een andere IDE.

Groet,

Gerard van der Sel.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 28 maart 2014, 17:04:18
Hoi, Gerard

Bedankt voor je reactie.

Je hebt het verkeerd gezien  ;D  ;), vroeg het expres, ben een beetje in een plaagbui ;D

Het is Microsoft Visual Basic 2010 express, het kan best lijken op vb6 maar het is het niet, ik weet ook niet of microsoft nog ondersteuning geeft op deze vb 2010 express, dit is een gratis versie die je kunt downloaden van de microsoft webpage, je kan er programma's mee schrijven die je kunt starten binnen windows.
Ik test mijn programma binnen de ide van visual basic 2010 express.

Ik weet niet of je binnen vb6 de com poorten makkelijk kunt aansturen, dat gaat met deze versie wel heel gemakkellijk.

Mvg Paul  ;D



Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Tukker op 28 maart 2014, 17:12:25
Citaat
@ Tukker

Bedankt voor je reactie.

Ik word een beetje nieuwsgierig waarom je alle Arduino topics volgt, heb je interesse om ook iets met de Arduino te gaan doen?  ;)

Ik had min of meer hetzelfde idee een paar jaar terug. Ik wilde het alleen zo programmeren dat een ander op een simpele manier ook zijn baan kan aansturen met een arduino.
Door omstandigheden (geboorte van dochter 1,5 jaar geleden ) is er de laatste 1,5 jaar weinig gebeurd.
Ik moest, vanzelfsprekend, mijn hobby ruimte afstaan voor een slaapkamer.
Dus af en toe zit ik nu aan de eettafel te `knooien`

Aankomend zomer komt er een nieuwe `mancave` ,de planning is een nieuwe schuur te bouwen vast aan het huis met verwarming. Dus hopelijk kan ik dan weer in alle rust verder met de hobby.

Een kleine afbeelding wat er al is gebeurd
(https://images.beneluxspoor.net/bnls/afdruk.png) (https://images.beneluxspoor.net/bnls/afdruk.png)

Ik stuur via de arduino een H-brug aan (L293D) voor een baanvak.
Bezetmelding via stroom detectie.

Het idee is om in auto modus een geheel zelfdenkende modelbaan te hebben. Dus arduino kiest uit uit de vrije sporen bij een station welk spoor hij op rijd. Hij kiest welk spoor vertrekt. Hij kiest de wacht tijd etc.

Dus vandaar  mijn interesse in alle arduino draadjes

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 28 maart 2014, 18:26:49
Hoi Tukker

Nu snap ik het :)

Het programma ziet er interessant uit.
 
Het programma wat ik aan het maken ben met Visual Basic is op dit moment een soort bedienings- paneel, dit programma gedraagt zich min of meer als terminal( theoretisch dan).

Uiteindelijk wil ik er een intelligente terminal van maken, kan ik kiezen voor handbediening of automatische bediening, de Arduino Mega is het hart van deze sturing en zal de modelbaan gaan aansturen, ik sta nu nog aan het begin van het bouwen en ontwerpen van de Arduino modelbaan sturing.

Ik wil wel teksten op het scherm zien van wat er gebeurd op de modelbaan, daarom zit er een LCD display aan de Arduino en zit de Arduino met de Pc gekoppeld via de usb poort.

Ik maak dit programma in principe alleen voor eigen gebruik, de broncode mag iedereen gebruiken voor zijn eigen modelbaan sturing.

Ik zie dat jij C# 2010 express gebruikt, ik blijf het een lastige programmeertaal vinden, vandaar dat ik voor Visual Basic 2010 express hebt gekozen.

Succes met het ontwikkelen van jou modelbaan sturing, ik zal kijken of ik de broncode van het Arduino programma en het Visual Basic programma online kan zetten.

Deze broncode is niet het meest compacte broncode en er zal nog veel aan geprogrammeerd moeten worden om het een automatische sturing van te maken, maar het begin is er, dit geld ook voor het Visual Basic programma.

Mvg Paul  ;D

PS, kan je of Wil je mij de broncode of een deel, van jou Arduino programma  sturen, ik ben namelijk benieuwd hoe jij de stroomdetectie hebt geprogrammeerd binnen de Arduino IDE, ik ben daar zelf nog niet uit hoe ik dat moet programmeren.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 01 april 2014, 23:06:36
Hoi

We gaan weer verder

Ik ben nu zo ver dat ik een motorstuurprogramma ben gaan programmeren.
De I2C routine is nog niet geprogrammeerd, dat komt later.
Ik wil eerst dit programma deel testen voor ik aan het I2C ga werken.

Zie flowchart

(https://images.beneluxspoor.net/bnls/motorsturingarduinouno.jpeg) (https://images.beneluxspoor.net/bnls/motorsturingarduinouno.jpeg)

Het bovenstaande flowchart geeft de bediening weer van de motorsturing met een Arduino Uno.

Deze bediening kan alleen via de usb poort en je kunt nu ook weer kiezen voor een Terminal of een Visual Basic weergave bediening.

Het motorstuur programma is, voor nu nog, als een apart programma geprogrammeerd, maar moet later wel ingebouwd worden in het hoofd programma

Ik werk niet met een traploze regeling maar met langzaam, halve snelheid en volle snelheid zowel vooruit als achteruit, stoppen, mogelijk maak ik meer stappen maar voorlopig nog niet, ik ben nog niet heel erg thuis in het Arduino programma om complexe programma's te schrijven, vandaar dat ik eenvoudige programma's maak, in het begin om het verder te kunnen uitwerken.

Door het in aparte delen te programmeren blijft de structuur en de overzichtelijkheid beter behouden zodat er fouten makkelijker uit gehaald kunnen worden.

Er zijn verschillende motorshields verkrijgbaar, ik hen gekozen voor de L298 variant, deze kost via internet ongeveer euro  2,53.

(https://images.beneluxspoor.net/bnls/motorshieldL298.jpg) (https://images.beneluxspoor.net/bnls/motorshieldL298.jpg)

Deze motordriver kan 2A per motor continu aansturen, echter zal een N-spoor locomotief niet meer dan 750mA tot 1A trekken, gemiddeld gezien.

Dan hou ik geen rekening met eventuele verlichte wagons, ik heb er niet zoveel, dat gaat dan zeker goed.

Onderstaande is een screenshot van de teminal bediening.

(https://images.beneluxspoor.net/bnls/motorterminal.jpg) (https://images.beneluxspoor.net/bnls/motorterminal.jpg)

Onderstaande is een screenshot van het Visual Basic bediening.

(https://images.beneluxspoor.net/bnls/VBmotorsturing.jpg) (https://images.beneluxspoor.net/bnls/VBmotorsturing.jpg)

Het Visual Basic programma moet hier den daar nog aangepast worden, aan het Arduino programma, het geheel werk min of meer als een grafische schil over een terminal bediening  (theoretisch dan), uiteindelijk moet dit programma in het hoofdprogramma ingebouwd worden.

Voor het programmeren en testen is het makkelijker om dit eerst als een los programma te maken.

Ook de grafische schil moet nog aangepast worden en er moeten nog een aantal functies ingebouwd worden.

Mochten er mensen zijn die de broncode van het Arduino programma en/of het Visual-basic programma willen, stuur dan even een pb-tje,  word een beetje groot om het op het forum te zetten (als het wel kan hoor ik het wel).

Op/of aanmerkingen verbeteringen laat het mij weten, kan ik er nog meer bij leren ;D met betrekking tot het programmeren  ;D ;)

Mvg Paul  ;D



Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: charp op 01 april 2014, 23:26:08
Duidelijk,....ik dacht zelf ook al dat er van die grafische schil nog geen klont deugt  ;D.


Peter (die vastliep in het voorwoord bij "Programmeren voor Dummies)
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Papierbouwer op 02 april 2014, 00:12:56
Ik zou voor de snelheid voor en achteruit een slider gebruiken die voor alle bij te gebruiken valt zodat je niet vooruit en achteruit tegelijkertijd aan kan zetten.

Verstuurd vanaf mijn A210 met Tapatalk

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Karst Drenth op 02 april 2014, 00:54:27
Tip Paul:

Als je de PWM's van de Arduino gebruikt, kun je met 'analogWrite' en een waarde van 0 - 255 een bijna traploze snelheidsregeling maken ;)
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 02 april 2014, 23:24:47
Hoi,

@ Peter

Bedankt voor je reactie.

Citaat
Peter (die vastliep in het voorwoord bij "Programmeren voor Dummies)

Nog een keer lezen een optie  ;) ;D

@ Papierbouwer

Bedankt voor je reactie

Bedankt voor je input, heb de slider meteen veranderd. (y)
De slider nulpunt staat nu in het midden naar links bewegen is achteruit en rechts bewegen is vooruit.

@ Karst

Bedankt voor je reactie.

Ik was er inmiddels achter, als ik de waarde in analogWrite verander veranderd ook de snelheid, maar bedankt voor de tip. (y)

Op dit moment gebruik ik drie standen (maakt het programmeren van het geheel wat eenvoudiger, ook rijden mijn locomotieven niet zo goed dat je een bijna traploze snelheidsregeling kan maken.

De gemiddelde waarde van analogWrite om de lok te laten rijden is 90 tot 100 dan komt de loc pas in beweging, lager hoor ik alleen gebrom maar komt de loc niet vooruit.

Hoe ik traploze snelheidsregeling moet programmeren weet ik nog niet, moet dat nog gaan uitzoeken ::)

Ik heb de grafische schil opnieuw ontworpen, ik vind het nu duidelijker om de bedienings-elementen te zien.

(https://images.beneluxspoor.net/bnls/arduinomodelbaansturing.jpg) (https://images.beneluxspoor.net/bnls/arduinomodelbaansturing.jpg)

Ik heb gisteren 4 motordrivers L298  besteld.
Op mijn volgende bestellijst staat nog een Arduino Mega en een tiental ldr's die ik tussen mijn railsen wil plaatsen om een trein te kunnen detecteren(als proef of dat een goede detectie methode is), ik wil het ook gaan testen met reed contacten en met stroom detectie, ik hou van experimenteren  ;D

Mvg Paul  ;D



Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: De Stoker op 03 april 2014, 12:57:46
Mooi draadje, goede uitleg waar je mee bezig bent, Ga je volgen ik heb geïnvesteerd in een PIC maar de "basis gedachte" is wel gelijk. Ik heb best wel veel interesse in het programmeren dus ben erg benieuw. Misschien stap ik ook nog wel over op een Arduino maar voorlopig eerst andere zaken te doen (kinder kamer inrichten) dus er zal er van bouwen en dergelijke voorlopig wel niet veel terecht komen. Maar meelezen wil wel, succes met de ontwikkeling
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 03 april 2014, 15:24:56
Moet je niet ergens in oktober iets hebben werken?

Groet,

Gerard van der Sel.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 03 april 2014, 21:59:43
Hoi

@Tukker

Bedankt voor je reactie en voor je link naar je website.

Ik ben op je website geweest, en heb je Arduino programma's bekeken, en heb de
Rijsnelheid en richting met behulp van een L293D en arduino
gedownload.

Ik zie dat je deze speciaal voor de Arduino mega hebt geschreven, ik ga het aanpassen aan de Arduino Uno (die gebruik ik, voor de snelheidsregeling van de treinen)  ik heb er even mee geëxperimenteerd (Arduino mega), wat instellingen veranderd en er een I2C lcd display routine er in geprogrammeerd.

Ik wil dit programma verder gaan gebruiken en ook aanpassen voor eigen gebruik.

De L293 chip heb ik vervangen voor een L298 dubbele motordriver, deze heeft een maximale stroom van 2A per motor continu.

Voor N locomotief met verlichte rijtuigen zal dat voldoende moeten zijn.

@De Stoker

Bedankt voor je reactie.

Dank je, ik zal mijn best blijven doen om het duidelijk te blijven.

In grote lijnen kun je de Arduino code relatief makkelijk vertalen naar een pic code (Pic Basic, oid), ook is de code, denk ik goed te vertalen via een terminal verbinding of Visual Basic naar een constructie voor de pic processor.

Andere programmeer talen voor de pc ken ik niet.

@ Gerard

Dat klopt, maar ook voor de Bnls n-spoor modulebaan wil ik een arduino modelbaan sturing maken (alleen eigen baan, niet de doorgaande sporen).

[off topic]
Ik heb moeite om de doorgaande sporen goed te leggen op de bak overgangen.
Volgende week neem ik de modulebak mee naar de modelspoor club om er daar met mensen die dit vaker gedaan hebben de doorgaande sporen te leggen en de modulebak verder af te bouwen.
[on topic]

@allen

Voor de mensen die geïnteresseerd zijn zal ik de Arduino code voor de Arduino modelbaan sturing op het forum zetten.

Let op! Verwacht geen hoge programeercode maar simpele programeercode.
De code in nog lang niet compleet en zeker niet compact geprogrammeerd en er zullen vast nog fouten in zitten.

Je kunt naar eigen idee het programma aanpassen.

Het idee achter dit programma is om via een terminal of een Visual Basic programma de modelbaan te sturen.
Het werk alleen nog via handbediening met een automatische bediening ben ik nog bezig.

De programma code.

/* Modelbaan sturing met een Arduino Mega processorboard.
    station en schaduwstation sturing modelbaan.
   
    Programma ontwikkeld door Paul Smits.
    Deze software mag vrij aangepast worden alleen als er een bron vermelding in de kop staat
   
    Deze sofrware word gebruikt om met een Arduino Mega een modelspoorbaan aan te sturen,
    dit is de eerste versie van de software.
   
    Dit programma is copyright by Paul Smits.
   */
 
 #include <Wire.h>
 //#include <AFMotor.h>
 #include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
 
 char incomingByte;
 // char BZ = "Bezet";                  // String Bezet
 //char VR = Vrij;                      // String Vrij
 //char RD = Rechtdoor;                 // wissel rechtdoor
 //char AF = Afbuigend;                 // wissel afbuigend
 
 // initialisatie poort defenieties
 
 const int Stijd = 10 * 1000;  // Stoptijd stopblok
 const int Wtijd = 10 * 1000;  // Wachttijd wachtblok
 //const int Noodstop = 1;       // Noodstop actief hoog
 //const int Sda = 20;           // I2C bus serial data
 // const int Scl = 21;           // I2C bus serial clock
 
 // initialisatie noodstop
 
 //const int LED = 27;      // Stoppen Arduino Mega modelspoor sturing.
 const int LED1 = 24;     // Vrijgave Arduino Mega modelspoor sturing.
 const int LEDV = 25;    // Noodstop geactiveerd
//const int LEDN = 31;    // Noodstop Opgeheven

// initialisatie poorten blokken


 const int Blok1 = 41;   // Inkomende spoor
 const int Blok2 = 42;   // Uitgaande spoor
 const int Blok3 = 43;   // Schaduwstation spoor 1
 const int Blok4 = 44;   // Schaduwstation spoor 2
 const int Blok5 = 45;   // Stationspoor spoor 1
 const int Blok6 = 46;   // Stationspoor spoor 2
 const int Blok7 = 47;   // Wachtspoor
 const int Blok8 = 48;   // Goederenspoor
 const int Blok9 =  49;   // Wisselblok 1
 const int Blok10 = 50;  // Wisselblok 2

// initialisatie poorten voor wissel sturing

 const int Wis1 = 29;  // wissel 1
 const int Wis2 = 30;  // wissel 2
 const int Wis3 = 31;  // wissel 3
 const int Wis4 = 32;  // wissel 4
 const int Wis5 = 33;  // wissel 5
 const int Wis6 = 34;  // wissel 6
 const int Wis7 = 35;  // wissel 7
 const int Wis8 = 36;  // wissel 8
 const int Wis9 = 37;  // wissel 9
 const int Wis10 = 38; // wissel 10
 const int Wis11 = 39; // wissel 11
 const int Wis12 = 40; // wissel 12

 void setup(){
 
   Serial.begin(9600);
   Serial.println(" Arduino modelbaan sturing.");
   Serial.println(" Station / schaduwstation sturing");
   lcd.begin(16,2);         // initialize the lcd for 16 chars 2 lines and turn on backlight
   lcd.backlight(); // finish with backlight on 
   
    lcd.setCursor(2,0); //Start at character 0 on line 0
    lcd.print("Arduino Mega");
    lcd.setCursor(0,1);
    lcd.print("modelbaan sturing");
 
  // Zet de poorten bloksturing als output
   
   pinMode(Blok1, OUTPUT);  // Inkomende spoor
   pinMode(Blok2, OUTPUT);  // Uitgaande spoor
   pinMode(Blok3, OUTPUT);  // schaduwstation spoor 1
   pinMode(Blok4, OUTPUT);  // schaduwstation spoor 2
   pinMode(Blok5, OUTPUT);  // Stationspoor spoor 1
   pinMode(Blok6, OUTPUT);  // Stationspoor spoor 2
   pinMode(Blok7, OUTPUT);  // Wachtspoor
   pinMode(Blok8, OUTPUT);  // Goederenspoor
   
   // Poorten wissel sturing (test modes)
   
   pinMode(Wis1, OUTPUT);   // Wissel 1
   pinMode(Wis2, OUTPUT);   // Wissel 2
   pinMode(Wis3, OUTPUT);   // Wissel 3
   pinMode(Wis4, OUTPUT);   // Wissel 4
   pinMode(Wis5, OUTPUT);   // Wissel 5
   pinMode(Wis6, OUTPUT);   // Wissel 6
   pinMode(Wis7, OUTPUT);   // Wissel 7
   pinMode(Wis8, OUTPUT);   // Wissel 8
   pinMode(Wis9, OUTPUT);   // Wissel 9
   pinMode(Wis10, OUTPUT);  // Wissel 10
   pinMode(Wis11, OUTPUT);  // Wissel 11
   pinMode(Wis12, OUTPUT);  // Wissel 12 
 }

   void loop()
   {
       // Print a message to the LCD.
     
    if (Serial.available() > 0) {  // kijk of de seriele verbinding beschikbaar is.
        incomingByte = Serial.read(); // Lees een 'byte'.
   
   // Vrijgave of stop comando, Arduino Mega modelspoor sturing.
   
    if(incomingByte == 'V') {
        digitalWrite(LED1,LOW);  // Stop led uit.
       //digitalWrite(LED, HIGH); // Vrijgave Arduino Mega modelspoor sturing.
        Serial.println("Vrijgave Arduino Mega modelspoor sturing");
        lcd.setCursor(0,1);
        lcd.println("Vrijgave sturing"); 
       }
       
    if(incomingByte =='v'){
        //digitalWrite (LED, LOW);  // Vrijgave led uit.
        digitalWrite(LED1, HIGH); // Stoppen Arduino Mega modelspoor sturing.
        Serial.println("Stoppen Arduino Mega modelspoor sturing");
        lcd.setCursor(0,1);
        lcd.println("Stoppen  sturing");
      }
    // Bloksturing Arduino Mega   
       
    if(incomingByte == 'a') {
        digitalWrite(Blok1, HIGH); // inkomend spoor vrij
        Serial.println("Inkomend spoor : Vrij");
        lcd.setCursor(0,1);
        lcd.println("Inkomend    Vrij");
       }
    if(incomingByte == 'A'){
        digitalWrite(Blok1, LOW); // Inkomend spoor bezet
        Serial.println("Inkomend spoor : Bezet");
        lcd.setCursor(0,1);
        lcd.println("Inkomend   Bezet");
       }
   
    if(incomingByte == 'b') {
       digitalWrite(Blok2, HIGH); // Uitgaande spoor vrij
       Serial.println("Uitgaande spoor : Vrij");
       lcd.setCursor(0,1);
        lcd.println("Uitgaande   Vrij");
      }
   
    if(incomingByte == 'B'){
        digitalWrite(Blok2, LOW); // Uitgaande spoor bezet
        Serial.println("Uitgaande spoor : Bezet");
        lcd.setCursor(0,1);
        lcd.println("Uitgaande  Bezet");
       }
   
    if(incomingByte == 'c') {
        digitalWrite(Blok3, HIGH); // Schaduw station spoor 1 vrij
        Serial.println("Schaduw station spoor 1  : Vrij");
        lcd.setCursor(0,1);
        lcd.println("Ss spoor 1  Vrij");
      }
       
    if(incomingByte == 'C'){
        digitalWrite(Blok3, LOW); // Schaduw station spoor 1 bezet
        Serial.println("Schaduw station spoor 1  : Bezet");
        lcd.setCursor(0,1);
        lcd.println("Ss spoor 1 Bezet");
       }

    if(incomingByte == 'd') {
        digitalWrite(Blok4, HIGH); // Schaduw station spoor 2 vrij
        Serial.println("Schaduw station spoor 2 : Vrij");
        lcd.setCursor(0,1);
        lcd.println("Ss spoor 2  Vrij");
      }
       
    if(incomingByte == 'D'){
       digitalWrite(Blok4, LOW); // Schaduw station spoor 2 bezet
       Serial.println("Schaduw station spoor 2 : Bezet");
       lcd.setCursor(0,1);
       lcd.println("Ss spoor 2 Bezet");
      }
     
    if(incomingByte == 'e') {
        digitalWrite(Blok5, HIGH); // Station spoor 1 vrij
        Serial.println("Station spoor 1 : Vrij");
        lcd.setCursor(0,1);
        lcd.println("S spoor 1   Vrij");
      }
     
   if(incomingByte == 'E'){
       digitalWrite(Blok5, LOW); // Station spoor 1 bezet
       Serial.println("Station spoor 1 : Bezet");
        lcd.setCursor(0,1);
        lcd.println("S spoor 1  Bezet");
      }
   
    if(incomingByte == 'f') {
        digitalWrite(Blok6, HIGH); // Station spoor 2 vrij
        Serial.println("Station spoor 2 : Vrij");
        lcd.setCursor(0,1);
        lcd.println("S spoor 2   Vrij");
       }
   
   if(incomingByte == 'F'){
       digitalWrite(Blok6, LOW); // Station spoor 2 bezet
       Serial.println("Station spoor 2 : Bezet");
       lcd.setCursor(0,1);
       lcd.println("S spoor 2  Bezet");
      }
   
   if(incomingByte == 'g') {
       digitalWrite(Blok7, HIGH); // Wacht spoor vrij
       Serial.println("Wacht spoor : Vrij");
        lcd.setCursor(0,1);
        lcd.println("Wachtspoor  Vrij");
     }
       
   if(incomingByte == 'G'){
       digitalWrite(Blok7, LOW); // Wacht spoor bezet
       Serial.println("Wacht spoor : Bezet");
       lcd.setCursor(0,1);
       lcd.println("Wachtspoor Bezet");
     }

   if(incomingByte == 'h') {
       digitalWrite(Blok8, HIGH); // Goederen spoor vrij
       Serial.println("Goederen spoor : Vrij");
       lcd.setCursor(0,1);
       lcd.println("G spoor    Bezet");
     }
    if(incomingByte == 'H'){
        digitalWrite(Blok8, LOW); // Goederen spoor bezet
        Serial.println("Goederen spoor : Bezet");
         lcd.setCursor(0,1);
        lcd.println("G spoor   Vrij");
       }
       
     // Wisselsturing Arduino Mega
     
    if(incomingByte == '1') {
        digitalWrite(Wis1, HIGH); // wissel 1 afbuigend
        Serial.println("Wissel 1 : Afbuigend");
       }
    if(incomingByte == '!'){
        digitalWrite(Wis1, LOW); // Wissel 1 rechtdoor
        Serial.println("Wissel 1 : Rechtdoor");
       }
   
    if(incomingByte == '2') {
       digitalWrite(Wis2, HIGH); // Wissel 2 afbuigend
       Serial.println("Wissel 2 : Afbuigend");
      }
   
    if(incomingByte == '@'){
        digitalWrite(Wis2, LOW); // Wissel 2 rechtdoor
        Serial.println("Wissel 2 : Rechtdoor");
       }
   
    if(incomingByte == '3') {
        digitalWrite(Wis3, HIGH); // Wissel 3 afbuigend
        Serial.println("Wissel 3  : Afbuigend");
      }
       
    if(incomingByte == '#'){
        digitalWrite(Wis3, LOW); // Wissel 3 rechtdoor
        Serial.println("Wissel 3 : Rechtdoor");
       }
 if(incomingByte == '4') {
        digitalWrite(Wis4, HIGH); // wissel 4 afbuigend
        Serial.println("Wissel 4 : Afbuigend");
       }
    if(incomingByte == '$'){
        digitalWrite(Wis4, LOW); // Wissel 4 rechtdoor
        Serial.println("Wissel 4 : Rechtdoor");
       }
   
    if(incomingByte == '5') {
       digitalWrite(Wis5, HIGH); // Wissel 5 afbuigend
       Serial.println("Wissel 5 : Afbuigend");
      }
   
    if(incomingByte == '%'){
        digitalWrite(Wis5, LOW); // Wissel 5 rechtdoor
        Serial.println("Wissel 5 : Rechtdoor");
       }
   
    if(incomingByte == '6') {
        digitalWrite(Wis6, HIGH); // Wissel 6 afbuigend
        Serial.println("Wissel 6  : Afbuigend");
      }
       
    if(incomingByte == '^'){
        digitalWrite(Wis6, LOW); // Wissel 6 rechtdoor
        Serial.println("Wissel 6 : Rechtdoor");
       }
 if(incomingByte == '7') {
        digitalWrite(Wis7, HIGH); // wissel 7 afbuigend
        Serial.println("wissel 7 : Afbuigend");
       }
    if(incomingByte == '&'){
        digitalWrite(Wis7, LOW); // Wissel 7 rechtdoor
        Serial.println("Wissel 7 : Rechtdoor");
       }
   
    if(incomingByte == '8') {
       digitalWrite(Wis8, HIGH); // Wissel 8 afbuigend
       Serial.println("Wissel 8 : Afbuigend");
      }
   
    if(incomingByte == '*'){
        digitalWrite(Wis8, LOW); // Wissel 8 rechtdoor
        Serial.println("Wissel 8 : Rechtdoor");
       }
   
    if(incomingByte == '9') {
        digitalWrite(Wis9, HIGH); // Wissel 9 afbuigend
        Serial.println("Wissel 9  : Afbuigend");
      }
       
    if(incomingByte == '('){
        digitalWrite(Wis9, LOW); // Wissel 3 rechtdoor
        Serial.println("Wissel 9 : Rechtdoor");
       }
       
     if(incomingByte == '0') {
        digitalWrite(Wis10, HIGH); // Wissel 10 afbuigend
        Serial.println("Wissel 10  : Afbuigend");
      }
       
    if(incomingByte == ')'){
        digitalWrite(Wis10, LOW); // Wissel 3 rechtdoor
        Serial.println("Wissel 10 : Rechtdoor");
       }
       
   // Noodstop of vrijgave Arduino Mega modelspoor sturing.
   
   if(incomingByte == 'N') {
       digitalWrite(LEDV, HIGH);
       Serial.println("Noodstop alle treinen stoppen !");
       lcd.setCursor(0,1);
       lcd.println("Noodstop in     ");
      } 
     
  if(incomingByte == 'n') {
      digitalWrite(LEDV, LOW);
      Serial.println("Noodstop alle treinen opgeheven !");
      lcd.setCursor(0,1);
      lcd.println("Noodstop vrij   ");
     }     
  }
 

Als er er mensen zijn, die de Visual Basic code willen zien hoor ik het wel, dan zet ik deze code ook op het forum in dit topic.

Mvg Paul  ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: tuurtje op 03 april 2014, 22:58:58
Hoi Paul

Bedankt voor de code, hier ga ik over een tijdje eens lekker mee stoeien,
En de VB code heb ik ook wel interesse in

Groetjes

Arthur
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 03 april 2014, 23:14:22
Hoi,

@Arthur

Bedankt voor de reactie en succes met de code.

Hier is de Visual Basic code  (Visual basic 2010 express editie)
Het formulier moet je zelf maken ik heb daar geen code van.

Ik weet ook even niet hoe ik het "form1" op het forum zet, een aantal reacties terug zie je een screenshot van dit formulier.

Mochten er vragen zijn hoor ik het wel.

Visual Basic code:

Imports System.IO
Imports System.IO.Ports
Imports System.Threading

Public Class Form1

    Shared _continue As Boolean
    Shared _serialPort As SerialPort

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        SerialPort1.Close()
        SerialPort1.PortName = "com7" 'change com port to match your Arduino port
        SerialPort1.BaudRate = 9600
        SerialPort1.DataBits = 8
        SerialPort1.Parity = Parity.None
        SerialPort1.StopBits = StopBits.One
        SerialPort1.Handshake = Handshake.None
        SerialPort1.Encoding = System.Text.Encoding.Default 'very important!

    End Sub

    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)

        'This sub gets called automatically when the com port recieves some data
        'Pause while all data is read
        'Move recieved data into the buffer

        If SerialPort1.IsOpen = True Then
            Read()
        End If

    End Sub

    Private Sub Read()

        If SerialPort1.IsOpen Then
            Dim data As String = SerialPort1.ReadLine()
            TextBox1.Text = data
        End If

    End Sub

    Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged

        blok1On.Visible = True
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("a")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged

        blok1On.Visible = False
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("A")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton3.CheckedChanged

        blok2On.Visible = True
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("b")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton4_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton4.CheckedChanged

        blok2On.Visible = False
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("B")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton5_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton5.CheckedChanged

        blok3On.Visible = True
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("c")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton6_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton6.CheckedChanged

        blok3On.Visible = False
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("C")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton7_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton7.CheckedChanged

        blok4On.Visible = True
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("d")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton8_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton8.CheckedChanged

        blok4On.Visible = False
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("D")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton9_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton12.CheckedChanged

        blok5On.Visible = True
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("e")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton10_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton13.CheckedChanged

        blok5On.Visible = False
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("E")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton11_CheckedChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton10.CheckedChanged

        blok6On.Visible = True
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("f")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton12_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton11.CheckedChanged

        blok6On.Visible = False
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("F")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton14_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton14.CheckedChanged

        blok7On.Visible = True
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("g")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton15_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton15.CheckedChanged

        blok7On.Visible = False
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("G")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton16_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton16.CheckedChanged

        blok8On.Visible = True
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("h")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton17_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton17.CheckedChanged

        blok8On.Visible = False
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("H")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Close()
    End Sub

    Private Sub RadioButton20_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton20.CheckedChanged

        wis1On.Visible = True
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("!")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton19_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton19.CheckedChanged

        wis1On.Visible = False
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("1")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton18_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton18.CheckedChanged

    End Sub

    Private Sub RadioButton21_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton21.CheckedChanged

        wis7On.Visible = True
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("&")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub RadioButton22_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton22.CheckedChanged

        wis7On.Visible = False
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("7")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()
    End Sub

   
    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
        SerialPort1.ReadByte()
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

        stopOn.Visible = True
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("N")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click

        stopOn.Visible = True
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("v")

        If SerialPort1.IsOpen = True Then
            Read()

        End If

        SerialPort1.Close()

    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

        stopOn.Visible = False
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("V")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub

    Private Sub Button2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        stopOn.Visible = False
        SerialPort1.Open()
        SerialPort1.DiscardInBuffer()
        SerialPort1.Write("n")

        If SerialPort1.IsOpen = True Then
            Read()
        End If

        SerialPort1.Close()

    End Sub


   
End Class

Mvg Paul  ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 04 april 2014, 12:42:18
Paul,

Formulieren bestaan uit meerdere files. Iedere file opzig is in tekst formaat, dus kan gewoon gecopieerd worden. Voor een formulier dus uit de directorie alle bestanden die met de formnaam beginnen selecteren en plaatsen.
Een vraag/opmerking: Waarom heb je alle controls niet hernoemd dat werkt makelijker.
BV. ipv button21 gebruik je noodstop

Groet,

Gerard avn der Sel.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 04 april 2014, 18:43:45
Gerard,

Ik zal eens kijken of het lukt.

Ik heb de controls nog geen definitieve naam gegeven omdat het programma nog in ontwikkeling is, en de controls nog wel eens veranderen.

In de definitieve versie worden de controls wel benoemd.

Ik heb nu ook een traploze snelheids regeling beschikbaar dankzij Tukker, ik ga deze regeling iets aanpassen, er word een I2C lcd display sturing ingebouwd, en een seriële communicatie, in het Arduino analoge modelbaan sturing programma.

Vanavond ga ik de laatste draden van de eerste module aansluiten zodat de baan gebruikt kan worden om het Arduino analoge modelbaan sturing te gaan testen.

Mvg Paul  ;D




Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 13 april 2014, 20:32:10
Hoi

[off topic]

Het staat hier even stil hier, mijn computer is gecrasht en ik ben al mijn documenten, schema's foto's enz kwijt, ook windows werkt niet meer, helaas heb ik al een paar jaar geen backup gemaakt  ::) (dvd writer kapot)  ondertussen heb ik Linux op de computer gezet.
Ik kan nu in ieder geval computeren en het internet weer op.

Ik heb ondertussen de programma's die  ik gebruik kunnen vinden in een linux uitvoering, Arduino, Fritzing, Processing en een alternatief programmeer taal die lijkt op Visual Basic (linux - gambas3), ik moet me deze programmeertaal mester maken.

Ik begin ondertussen een beetje thuis te raken in Linux (werk anders dan windows).

[on topic]

Ik heb in de Arduino nu een programma zitten om de trein mee te sturen, ik zal kijken of ik vanavond nog een filmpje  kan maken van de werking van deze sturing.

Mvg Paul  ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 28 april 2014, 20:39:02
Hoi,

Het is niet gelukt om een bruikbaar filmpje te maken, als ik niet film gaat het goed, zodra ik ga filmen gaat het iedere keer fout. ???

Door het testen van de motorsturing (bloksturing) ben ik er achter gekomen dat het baanplan wat ik had ontworpen had, niet goed werkt.
In het ontwerp zitten te veel wissels (12  stuks), op de wissels lopen de locomotieven vast, dat gebeurd eigenlijk altijd als de loc optrekt of afremt in de buurt van de wissels, de loc's rijden dan nog te zacht om over de wissels te komen, met name de bochtwissels hebben dat probleem.

Met het berekenen van het aantal poorten dat je nodig hebt om de module te sturen, worden het wel erg veel poorten. ???

Om 12 wissels te sturen heb ik 2x12 =  24 poorten nodig, dat zijn best veel poorten, omdat de wissels via een rijweg databank (rijweg sturing)  gestuurd worden heb je zo veel poorten nodig.
Als je de wissel per paar stuurt heb je minder poorten nodig 2x6 = 12 poorten, alleen heb je dan minder rijwegen ter beschikking.

Voor de bloksturing heb je per sturing 6 poorten nodig  IN1, IN2, ENa en IN3, IN4, ENb = 6 poorten per motorsturing waarvan er al twee een pwm poort nodig hebben, voor deze module heb ik 5 motorsturingen nodig = 10 blokken (zowel linksom als rechts om) totaal 5x6  = 30 poorten voor de bloksturing waarvan 10 pwm poorten.

Voor het sturen van de seinen (bloksein) heb je per blok 2 poorten nodig, op deze module komen 10 blokken, voor de seinsturing heb je dan 2x10 = 20 poorten  nodig.
Als je de seinen gaat sturen via 2 kanten trein linksom en trein rechtsom heb je dan 4x10 = 40 poorten nodig of je moet de seinen anti-parallel aansluiten dan kan je met 20 poorten het geheel sturen.

Voor het detecteren van een blok bezet heb je 20 reed-contacten nodig dat zijn dan 2x10 = 20 poorten,  per rij richting heb je twee reed-contacten nodig.

Om deze module te sturen mat een arduino heb je dus :


De Arduino mega heeft 55 digitale poorten om deze module te sturen heb je minimaal 2 Arduino mega's nodig, afgezien van de complexe elektronica en het complexe programmeer werk, word de sturing veel te complex en onoverzichtelijk.  ::)

We gaan de sturing opnieuw ontwerpen zodanig dat ik per module maar een Arduino mega/uno nodig heb.

Ik ga het sporenplan vereenvoudigen minder wissels en minder blokken, als ik het sporenplan bekijk kan ik al minimaal 4 wissels en minimaal 4 blokken weglaten.

Mvg Paul  ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: HansQ op 29 april 2014, 14:57:46
...heb je wel es van multiplexen gehoord? Het is sowieso niet handig als je wissels tegelijk om te zetten, qua voeding is het beter dat sequentieel te doen. Om 30 wissels aan te sturen heb je dan slechts 6 uitgangen nodig (2^6 = 64 minus 1 voor "neutraal" dus genoeg voor 30 wissels met 2 toestanden).
Hetzelfde geldt voor blokdetectie. De ad-hoc standaard is S88, daar zijn veel goedkope oplossingen voor te vinden, ook zelfbouw. Voor S88 heb je data+clock+reset dus 3 in/uitgangen nodig...
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 29 april 2014, 20:00:23
Hoi, Hans

Bedankt voor je reactie.

Ik heb wel es ;) van multiplexen gehoord en ben er enigszins mee bekent, ik heb er echter nog niet mee gewerkt komt nog wel een keer.

Ik zou de wissels niet in een keer laten omgaan, dan had ik het wel met een relais gedaan, in het arduino programma zit een kleine vertraging van 0,5 sec per wissel om de rijweg te schakelen.

De blok detectie word door reed-contacten gedaan, als de trein over het reed-contact rijd gaat er een timer lopen die naar een aantal seconden, de sectie stroomloos maakt en het bloksein op rood zet,  nadat de trein over het reed-contact rijd van het volgende blok word het voorgaande blok via een timer het bloksein op groen gezet en het blok weer van spanning voorzien.

Of dat mogelijk is via de S88 weet ik niet,  ik dacht dat  S88 een speciaal protocol voor de dcc sturing was, mijn baan word volledig analoog gestuurd (heb geen digitale locs, nu ja ::) twee locomotieven met selectrix decoders " n-spoor" , staan te koop of te ruil, evenals mijn selextrix componenten.)

Wat een ad-hoc is weet ik niet kan er niets van vinden op internet. ::)

Mvg Paul  ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Klaas Zondervan op 29 april 2014, 23:15:41
ik dacht dat  S88 een speciaal protocol voor de dcc sturing was,
s88 is onafhankelijk van het systeem. Het is "gewoon" een schuifregister waarmee de bezetmeldingen worden opgehaald.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 04 mei 2014, 22:35:32
Hoi,

@klaas

Bedankt voor je reactie  (y)

Dat weet ik ook weer, ga uitzoeken of ik S88 kan gebruiken met de Arduino analoge modelbaan sturing.

@Allen

Nadat ik tot de conclusie ben gekomen dat mijn eerste ontwerp nodeloos ingewikkeld was, om 1 module te sturen had ik twee arduino mega's nodig, dit moet simpeler kunnen, ik ben weer opnieuw begonnen met het ontwerpen en ben tot een nieuw ontwerp gekomen , gebaseerd op het oude ontwerp.
Het sporenplan word gewijzigd, daar zaten te veel wissels in 12 stuks dat is verlaagt naar 8 stuks, en het aantal blokken is verlaagt van 10 blokken naar  6 blokken en de snelheid regeling is verlaagt van 10 stuks naar 2 stuks.

In het nieuwe sporenplan(1e module modelspoorbaan) word gebruik gemaakt  van twee stroomkringen vandaar dat het aantal is verlaagt naar 2 snelheid regelingen.
De twee stroomkringen zijn de hoofdbaan en zijlijn, worden wel aan elkaar gekoppeld maar volledig gescheiden door een wachtspoor.
Dit is mijn idee of het zo word als ik denk weet ik niet.

De flowchart van het nieuwe ontwerp.

(https://images.beneluxspoor.net/bnls/AamsPlanB.jpeg) (https://images.beneluxspoor.net/bnls/AamsPlanB.jpeg)

Aan de hand van deze flowchart heb ik de oude sturing aangepast aan het nieuwe ontwerp.

(https://images.beneluxspoor.net/bnls/arduinosturing.jpg) (https://images.beneluxspoor.net/bnls/arduinosturing.jpg)

Het ontwerp:

Links boven zit de Arduino Uno master met een Arduino-shield erop waar aan de onderkant draden zijn gesoldeerd voor de sturingen deze witte draden gaan naar een strookje gaatjes board waar ze op gesoldeerd zijn, aan de andere kant worden de draden van de relais en motorsturing gesoldeerd.

Rechts en midden boven zitten de relais van de bloksturing daar onder zit het relais van de noodstop rechts daarvan zit de motorsturing.
De schakelcontacten van de relais worden naar de kroonsteen onderaan de sturing gebracht.

Om de diverse componenten te kunnen blijven gebruiken voor test doeleinden heb ik onder de print draadjes gesoldeerd.

Dit ontwerp ga ik uittesten op een proefbaantje die ik ga maken

Deze sturing is voor de BNLS N-Spoor modulebaan en voor nu voor test doeleinden.

Voor mijn modelbaan thuis ga ik een Arduino Mega als master gebruiken en een Arduino Uno als slave.

Helaas kan ik Anyrails niet meer gebruiken om sporenplannen te tekenen omdat ik geen Windows meer op mijn computer heb staan.

Dat was het weer, volgende keer meer.

Mvg Paul  ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Bart Sanders op 10 mei 2014, 12:46:44
Hallo!

Citaat
Waarom wil ik analoog blijven rijden

Ik heb een twintigtal analoge locomotieven die ook nog zo'n tien a twintig jaar.......

Precies, ik denk er zelf net zo over. Ik heb in dit forum een draadje rond de besturing van een modelbaan o.b.v. een PC-XT uit de jaren tabak. En er komt een ATmega8 besturing van een Fleischmann 1780 draaischijf uit de tijd dat het woord microprocessor nog lang niet bestond. Maar, e.e.a. werkt wel perfect met dit soort moderne besturingen.

En, zoals je schrijft, de kosten blijven heel erg laag. Schitterende locs krijg je als gloednieuwe winkeldochter ruim onder de € 100,- en ze werken met PWM en een goede software besturing praktisch net zo realistisch als peperdure decoder bestuurde locs.

Op dit moment is de modelbaan na de testbaan van het vorig jaar in een mooi werkende staat. Ik ga een videootje ervan maken en dat zet ik in dit forum. Het werkt allemaal schitterend.

Dus, veel succes met je Aduino besturing, ik blijf het volgen!

Groet,

Bart
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 23 juni 2014, 00:12:00
Hoi, mensen.

Doordat mijn vader ongeneselijk ziek is, heb ik al een tijd niets meer gedaan aan de modelspoor hobby.

Om mijn gedachten te verzetten ben ik weer met de Arduino analoge modelbaan sturing bezig geweest.

Omdat al mijn ontwerpen te complex waren heb ik een totaal nieuw ontwerp gemaakt, die een stuk simpeler is.

Het werk als volgt , dit ontwerp is gebaseerd (voor nu op twee blokken per Arduino Uno) als ik het blok handmatig vrij geef kan de trein vertrekken, het commando voor het vrijgeven van het blok en het vertrekken van de trein gaat via een terminal programma.
Als ik de trein een vertrek commando geef en ik heb het blok nog niet vrij gegeven zal de trein ook niet vertrekken.
Ik moet eerst een blok vrij commando geven en daarna pas het vertrek commando voor de trein geven, omdat het programma nog in een test fase zit is de optrek en rem vertraging stapsgewijs : Low speed, half speed en full speed. 
Voor test doeleinden heb ik twee elektromotoren van 5 volt gebruikt.

De communicatie en sturing met de Arduino gaat met een rs232 verbinding en de aflezing van de opdrachten is te zien op een I2C lcd display.

Het stroom diagram van de sturing.

(https://images.beneluxspoor.net/bnls/Arduinobloksturing.jpeg) (https://images.beneluxspoor.net/bnls/Arduinobloksturing.jpeg)
De foto van de sturing, gebouwd op een sigarenkistje  ::), Nee, ik rook niet ;D , blijf nu beter liggen zonder dat de sturing alle kanten op schuift.

(https://images.beneluxspoor.net/bnls/IMG_20140617_233954.jpg) (https://images.beneluxspoor.net/bnls/IMG_20140617_233954.jpg)

Het bijbehorende programma zal ik in een volgende post zetten.

De Arduino is een prima platform om bekent te worden met microcontroller sturingen voor de modelspoor toepassingen.

Mvg Paul Smits



Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: De Stoker op 26 juni 2014, 08:32:51
Sterkte met je vader.

Ik zit zelf ook te denken over te stappen van PIC naar Arduino, maar die twee el. motors zijn die voor testen of hebben ze een andere funtie?
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 29 juni 2014, 22:38:12
hoi

Bedankt!

De Arduino is een makkelijke manier om microcontrollers te leren gebruiken.
Ik heb zelf pic processor gebruikt maar vond de atmel processoren prettiger werken ook was er voor de atmel processor (een arduino is een atmel microprocessor type atmega328 met een arduino bootloader)

Op het internet kon ik veel meer projecten met programma's en duidelijke uitleg vinden , voor een pic processor waren er minder projecten te vinden met uitleg , en programma's.

Voor de Arduino zijn er zeer veel toepassingen, onderdelen en shields te vinden op internet.

Voor de kosten hoef je het niet te laten een Arduino Uno kost ongeveer 7 a 10 euro en de verzendkosten zijn gratis,
en een protoshield kost tussen de 2 en de 7 euro.

Bekijk deze links maar eens en zoek op arduino op deze sites

Http://www.banggood.com (http://Http://www.banggood.com)
http://www.dx.com (http://www.dx.com)

De motoren gebruik ik om te testen of dit ontwerp goed is,  deze motoren zijn 5 volt en kunnen rechtstreeks via de usb poort gevoed worden, zodra ik er 12 volt op zet hoef ik allen maar een jumper te verwijderen zodat de voeding van de usb-poort los word gekoppelt van de motorsturing.

Als je de foto bekijkt zie je rechts de Arduino met protoshield zitten, links daarvan zit de motor sturing, en links van de motorsturing zitten de relais voor de blokken in en uit te schakelen, midden onder zit een lcd display.

Het test programma ziet er als volg uit.


#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

#define I2C_ADDR    0x27  // Define I2C Address where the PCF8574A is
#define BACKLIGHT_PIN     3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7

//typedef struct {
//unsigned int Start: 1; / / Using only one bit if possible
//unsigned int Counter: / / and 'counter that is incremented with millis ()
//unsigned int Preset; / / Is set to choose the period of the timer
//unsigned int Done: 1; / / Result when the timer counter and '> = preset
//timer};

//extern Timer timer [N_timers];

int n = 1;

LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

 char incomingByte;
 
//motor A connected between OUT1 and OUT2
//motor B connected between OUT3 and OUT4

//Motor A
int PWMA = 3; //Speed control
int AIN1 = 9; //Direction
int AIN2 = 8; //Direction

//Motor B
int PWMB = 5; //Speed control
int BIN1 = 11; //Direction
int BIN2 = 12; //Direction

// Relais

int Rel1 = 6;
int Rel2 = 7;

// constants won't change. Used here to
// set pin numbers:
const int ledPin =  13;      // the number of the LED pin

// Variables will change:
int ledState = LOW;             // ledState used to set the LED

long previousMillis = 0;        // will store last time LED was updated
long previousMillis1 = 0;       
long previousMillis2 = 0;

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.

long interval = 500;           // interval at which to blink (milliseconds)
long Blok = 10000;        // interval at which to blink (milliseconds)
long Wacht = 5000;        // interval at which to blink (milliseconds)

void setup(){
     
     lcd.begin (16,2);
 
    // Switch on the backlight

    lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
    lcd.setBacklight(HIGH);
    lcd.home ();                   // go home
 
    // Print a message to the LCD.
   
    lcd.setCursor(2,0); //Start at character 2 on line 0
    lcd.print("Arduino Uno");
    lcd.setCursor(1,1);
    lcd.print("L298  M-Sturing");
   
   
  Serial.begin(9600);
 
  Serial.println("Arduino test programma : Motorsturingen en blok meldingen");
  Serial.println();
  Serial.println("Stuur comando's");
  Serial.println();
  Serial.println("1 = Blok 1 vrijgeven            5 = Blok 2 vrijgeven");
  Serial.println("2 = Blok 1 bezet melden         6 = Blok 2 bezet melden");
  Serial.println("3 = Motor B starten             7 = Motor A starten");
  Serial.println("4 = Motor B stoppen             8 = Motor A stoppen");
  Serial.println();
  Serial.println("9 = Motoren A en B stoppen en blok 1 en 2 bezet melden");
  Serial.println();
  Serial.print(">");
 
  //Set all the pins we need to output pins
  // pinMode(STBY, OUTPUT);

  pinMode(PWMA, OUTPUT);
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);

  pinMode(PWMB, OUTPUT);
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);
 
  pinMode(2, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(ledPin, OUTPUT);
}

void loop (){
 
  // Controlle led om te zien of het programma nog werkt.
 
   unsigned long currentMillis = millis();
   
   if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
 
  if (Serial.available()) {
   
    //read serial as a character
    //char ser = Serial.read();
   
     if (Serial.available() > 0) {  // kijk of de seriele verbinding beschikbaar is.
        incomingByte = Serial.read(); // Lees een 'byte'.
     }
     
    // Begin Case 1: Blok1 vrij
   
      if(incomingByte == '1') {
       
        Serial.println("Case 1: Blok 1 : Vrij");
        digitalWrite(Rel2, HIGH);
     
        tekst();
       
     // Einde Case 1: Blok1 vrij   
       
      }
   
    // Begin Case 2: Blok 1 bezet 
     
      if(incomingByte == '2') {
       
        Serial.println("Case 2: Blok 1 : Bezet");
        digitalWrite(Rel2, LOW);
     
        tekst();
       
    // Einde Case 2: Blok 1 Bezet   
       
      }
   
    // Begin Case 3: Motor B on
   
      if(incomingByte == '3') {
       
        Serial.println("motor B: Low speed");
        move(0, 64, 1); //motor B, full speed, left
       
        low();
        wacht();
       
        Serial.println("motor B: half speed");
        move(0, 128, 1); //motor B, half speed, left
       
        half();
        wacht();
       
         Serial.println("motor B: full speed");
        move(0, 255, 1); //motor B, low speed, left
       
        full();
       
        Serial.println("Case 3: Motor B draait op full speed totdat er een stop comando komt.");
       
        //stop();
        tekst();
       
     // Einde Case 3: Motor B on
     
      }
       // Begin Case 4: Motor B off
       
      if(incomingByte == '4') {
       
          Serial.println("motor B: Full speed");
        move(0, 255, 1); //motor B, full speed
       
        full();
        wacht();
       
        Serial.println("motor B: Half speed");
        move(0, 128, 1); //motor B, half speed
       
        half();
        wacht();
       
         Serial.println("motor B:  Low speed");
        move(0, 64, 1); //motor B, low speed
       
        low();
        wacht();
       
        Serial.println("motor B: Stop");
        move(0, 0, 0); //motor B, stop
       
        Serial.println("Case 4: Motor B staat stil omdat er een stop comando gegeven is.");
       
        tekst();
       
        // Einde Case 4: Motor B off
     
      }
     
      // Begin Case 5 : Blok 2 On
     
        if(incomingByte =='5'){ 
       
        Serial.println("Case 5: Blok 2 : Vrij");
        digitalWrite(Rel1, HIGH);
       
        tekst();
       
        // Einde Case 5 : Blok On
       
      }
   
     // Begin Case 6: Blok 2 Off
     
      if(incomingByte == '6') {
       
        Serial.println("Case 6: Blok 2 : Bezet");
        digitalWrite(Rel1, LOW);
       
        tekst();
     
      }
           
    // Begin Case 7: Motor A On
   
      if(incomingByte == '7') {
       
        Serial.println("motor A: low speed");
        move(1, 64, 1); //motor A, full speed, left
       
        low();
        wacht();
       
        Serial.println("motor A: half speed");
        move(1, 128, 1); //motor A, half speed, left
       
        half();
        wacht();
       
         Serial.println("motor A: full speed");
        move(1, 255, 1); //motor A, low speed, left
       
        full();
       
        Serial.println("Case 7: Motor A draait op full speed totdat er een stop comando komt.");
       
        tekst();
       
     // Einde Case 7: Motor A on
     
      }
       // Begin Case 8: Motor A Off
       
      if(incomingByte == '8') {
       
          Serial.println("motor A: Full speed");
        move(1, 255, 1); //motor A, full speed
       
        full();
        wacht();
       
        Serial.println("motor A: Half speed");
        move(1, 128, 1); //motor A, half speed
       
        half();
        wacht();
       
         Serial.println("motor A:  Low speed");
        move(1, 64, 1); //motor A, low speed
       
        low();  // sub-routine low
        wacht();// sub-routine wacht
       
        Serial.println("motor A: Stop");
        move(1, 0, 0); //motor A, stop
       
        Serial.println("Case 8: Motor A staat stil omdat er een stop comando gegeven is.");
       
        tekst();
      }
       // Einde Case 8: Motor B off
   
       // Begin Case 9 : Noodstop
       
      if(incomingByte == '9') {
       
        Serial.println("Case 9 Noodstop :Motoren A+B stop en blok 1+2 bezet");
         
         stop();
         digitalWrite(Rel1, LOW);
         Serial.println("Blok 1: Bezet");
         digitalWrite(Rel2, LOW);
         Serial.println("Blok 2: Bezet");
         
          lcd.home ();                   // go home
          lcd.setCursor(0,1);
          lcd.print("Noodstop gemaakt");
         
         tekst();
      }
        // Einde Case 9 : Noodstop
     
  }
}
void move(int motor, int speed, int direction){

  //Move specific motor at speed and direction
  //motor: 0 for B 1 for A
  //speed: 0 is off, and 255 is full speed
  //direction: 0 clockwise, 1 counter-clockwise

  //digitalWrite(STBY, HIGH); //disable standby

  boolean inPin1 = LOW;
  boolean inPin2 = HIGH;

  if(direction == 1){
    inPin1 = HIGH;
    inPin2 = LOW;
  }

  if(motor == 1){
    digitalWrite(AIN1, inPin1);
    digitalWrite(AIN2, inPin2);
    analogWrite(PWMA, speed);
  }
  else{
    digitalWrite(BIN1, inPin1);
    digitalWrite(BIN2, inPin2);
    analogWrite(PWMB, speed);
  }
}

void stop(){

  //Motor A en B stoppen
 
  move(0, 0, 0);// motor A stop
  move(1, 0, 0);// motor B stop
 
}

void wacht(){
       
     unsigned long currentMillis1 = millis();
   
     long wacht = 7500;        // Wacht 7.5 Seconden
     
   if(currentMillis1 - previousMillis1 > wacht) {
      previousMillis1 = currentMillis1;
   
   }
   
    lcd.home ();                   // go home
    lcd.setCursor(0,1);
    //lcd.print("Wacht 5 seconden");
 
    Serial.println("Wacht 5 seconden");
   
    delay(5000);
   }

void blok(){
   
   
    unsigned long currentMillis2 = millis();
   
    long blok = 7500;        // Wacht 10 Seconden
 
    if(currentMillis2 - previousMillis2 > blok) {
     previousMillis2 = currentMillis2; 
   }
   
    lcd.home ();                   // go home
    lcd.setCursor(0,1);
    lcd.print("Wacht :Blok vrij");
   
    Serial.println("Wacht tot blok vrij is.");
    delay(10000);
   }

void tekst(){
   
    lcd.home ();                   // go home
    lcd.setCursor(0,1);
    lcd.print(">");
   
    Serial.print(">");
 
}

void low(){
 
 
    lcd.home ();                   // go home
    lcd.setCursor(0,1);
    lcd.print("   Speed low    ");
}

void half(){

    lcd.home ();                   // go home
    lcd.setCursor(0,1);
    lcd.print("   Speed half   ");
    }
   
void full(){

    lcd.home ();                   // go home
    lcd.setCursor(0,1);
    lcd.print("   Speed full   "); 
}

Vragen over het Arduino programma, stel ze.

Mocht er interesse zijn wil ik deze code proberen uit te leggen.

Mvg Paul Smits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: tuurtje op 29 juni 2014, 22:54:56
Hi Paul,

Heel veel sterkte met je vader. Dat zijn inderdaad de dagelijkse zaken van het leven die voorgaan.
Stel ging zaken uit waar je later over denkt van had ik maar...

Maar ik heb zeker interesse in de uitleg van de code

Groetjes

Arthur
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: De Stoker op 30 juni 2014, 08:49:53
Hallo Paul,

Dank voor de mooie uitleg, ook ik ben zeker geintereseerd in de verdere uitleg. De reden die je geeft voor de overstap zijn ook mijn overwegingen. Alleen al hier op het forum zijn een aantal mensen die mooie dingen hebben gedaan met zo'n Arduino.
Helaas staat alleen de zomervakantie voor de deur en breng een hoop tijd op de camping door en moet nog eens kijken of ik de komende maanden tijd heb om me er in te verdiepen maar de belangstelling is er zeker

Alleen is mijn insteek niet het besturen van de baan zelf, ik rij digitaal tegenwoordig, maar het aansturen van ....* op de baan.

*) dit kan van alles zijn.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: dimo1_dimo1 op 30 juni 2014, 09:56:08
Paul,
duidelijke code, zit alleen nog een schoonheidsfoutje in:
  if (Serial.available()) {
   
    //read serial as a character
    //char ser = Serial.read();
   
     if (Serial.available() > 0) {  // kijk of de seriele verbinding beschikbaar is.
        incomingByte = Serial.read(); // Lees een 'byte'.
     }
De methode Serial.available() geeft het aantal beschikbare bytes (of characters) terug die gelezen kunnen worden, daar komt de waarde 0 tot x uit..
if is true op alles wat hoger is als 0 dus als serial.available groter is als 0 kom je in die if.
vervolgens staat verderop dus een if die altijd true zal zijn op dat punt, die if kan dus weg ;)
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 30 juni 2014, 13:05:17
Hoi Paul,

Je bent leuk bezig! Zou ik je toch nog een paar tips mogen geven? Het is geen kritiek, maar meer om je code leesbaarder te houden / fouten te voorkomen enz.

Je bent nogal inconsequent met hoofdlettergebruik. Je schrijft bijvoorbeeld "Blok" maar ook "ledState" en "interval". Wat je kiest is aan jou maar voor de leesbaarheid is het wel handig een soort systeem te hebben. Wat vaak gebruikt wordt is dat je een variabele altijd laat beginnen met een kleine letter en een hoofdletter gebruikt voor het nieuwe woord in de variabele. Zoals je dus gedaan hebt met "ledState" en dus "blok". Een define wordt vervolgens volledig in CAPS geschreven, kan je aan de code zien dat je daar niet een waarde aan kan toekennen in de code. Je zou hetzelfde kunnen doen voor const variabele, die kan je immers ook niet wijzigen. (Of je laat een const wel beginnen met een hoofdletter bijvoorbeeld.) Wat je kiest is aan jou maar alles volgens hetzelfde systeem houdt het leesbaar en voorkomt fouten met hoofdletters.

Verder is hoe je pinnen toe wijst aan een naam nogal verschillend. De ene keer doe je dat met een define, volgende keer met een constante en dan weer met een variabele. Aangezien je ze altijd vast gebruikt is het goed om geen variabele te gebruiken, je past ze immers (on the run) niet aan. Aangezien Arduino een const verkiest boven een define (http://arduino.cc/en/Reference/Define) is dat de manier. Dus alle pinnen toewijzen met een const int  Rel1 = 6. Ik zou dan ook de define regels voor je LCD aanpassen naar const. (Overigens kan je een pin vrij maken voor de enable pin van je LCD gewoon aan de 5V te hangen ipv aan een Arduino pin.)

Voor de leesbaarheid kan je wat kopjes invoegen en de dingen iets meer groeperen. Dus een kopje "Pin toewijzing" en daar alle const neerzetten voor de pintoewijzingen. Nu heb je een blokje pintoewijzingen, dan weer een algemene variabele dan weer een pin toewijzing enz. Het zoekt nu wat lastig als je dat wilt aanpassen. Zelf vind ik dit een duidelijke manier voor kopjes:
/***** Global vars ***********************************************/Of zoals het in veel Arduino libraries gedaan wordt
/******************************************************************************
 * Definitions
 ******************************************************************************/

Dat brengt me naar instellingen of definitions. In de functie wacht heb je staan"long wacht = 7500". Dit is een instelling, je past hem in de functie zelf nooit aan. Je zou dit boven in je code (bijvoorbeeld onder het kopje definitions) kunnen declareren. Daar kan je het makkelijk aanpassen als je langer of korter wilt wachten zonder de hele code door te lezen. Ook is het iets dat niet wijzigt on the run, je kan er een const van maken, scheelt RAM en is iets sneller. Ook is een long wel erg groot voor het getal 7500, een int voldoet, zeker als je hem unsigned maakt (tot waarde 65.535). Dus iets als boven in je code "const unsigned int WachtTrein = 7500"

currentMillis en previousMillis. Je hebt nu ook versies met een 1. Allereerst, een foutje in de code, in de functie wacht staat  "unsigned long currentMillis 1 = millis();", met een spatie tussen het woord en de 1, dit zal dus een fout geven. Ook is het niet nodig om er een 1 aan toe te voegen, je kunt gewoon currentMillis gebruiken. De andere currentmillis is namelijk geen global variable dus zal in de functie wacht helemaal niet bestaan. previousMillis daarentegen wel. Maar een naam als priviousMillis1 zegt niet zo veel. Ik zou dus dingen gebruiken als "previousMillisWacht" en "previousMillisLed". Duidelijkere naam en je hoeft niet te denken, "was wacht nu "previousMillis1" of "previousMillis2"?

In de functie blok doe je wat met millis maar eigenlijk niet... Je hebt staan:
    unsigned long currentMillis2 = millis();
   
    long blok = 7500;        // Wacht 10 Seconden
 
    if(currentMillis2 - previousMillis2 > blok) {
        previousMillis2 = currentMillis2; 
    }
Je checkt op of een bepaalde tijd om is en zo ja, sla je deze op, maar dat is ook echt het enige wat je nu doet. Er hangt verder geen enkele actie aan.

Waarom gebruik je in je code nog delay? Deze functie houdt de hele flow van je programma op, er kan tijdens een delay niets anders gebeuren (afgezien van een interrupt). De constructie met current en previous millis is veel beter, het programma blijft gewoon door gaan.

Ook voor de leesbaarheid, probeer een tab te gebruiken ipv een spatie om in te springen bij dingen als een if statement.

In je loop schijf je mooi van een case. Alleen gebruik je hier geen case maar een hoop if. Nu is dit niet fout maar dit zou juist DE plaats zijn waar je een case (http://arduino.cc/en/Reference/SwitchCase) zou kunnen toepassen. Natuurlijk is dit niet verplicht en voldoet de if ook prima. Ik zou dan alleen wel alle if's vanaf case 2 vervangen in een else if. Op deze manier zal de Arduino stoppen met checken op de volgende cases zodra hij een kloppende heeft gevonden. Immers, als incommingByte als 2 is geweest kan hij niet ook 3, 4, 5 of 6 geweest zijn. Waarom zou je hier dan nog op checken? Met een else if voorkom je dit. Zodra er een kloppende (else) if gevonden is worden de rest van de else if's overgeslagen.

Nog één ding waar je op moet letter met gebruik van millis. Deze functie is niet eindig. Volgens de reference duurt het ongeveer 50 dagen voor de millis een overflow doet. Nu verwacht ik wel dat je in de tussentijd het systeem een keer uit gezet hebt maar het is toch wijs om in je achterhoofd te houden. Dingen als "if(currentMillis1 - previousMillis1 > wacht)" zullen dan opeens niet meer werken omdat millis weer gereset is naar 0 en dus wel een hele tijd kleiner is dan previous. Ipv lastige constructies om hier rekening meer te houden in de if check zou je kunnen kijken of het systeem al lang loopt (bijvoorbeeld langer dan 45 dagen) en een melding laten weergeven dat het wel eens tijd wordt om het systeem een reset te geven. Ook valt mij op dat je voor currentMillis wel netjes een unsigned long gebruikt maar dit voor previous niet doet. Millis geeft een unsigned long terug. Met een signed (de standaard als je er geen unsigned voor zet) heb je maar een half zo groot positief bereik als dat je met een unsigned hebt. Dus na 25 dagen kom je op deze manier al in de problemen. Alle variabele voor millis waardes zouden dus unsigned moeten zijn.

Het printen van tekst, of eigenlijk het onthouden van tekst, kost een Arduino veel geheugen. Nu gebruik je veel dezelfde stukken tekst. "motor B: Low speed" en "motor B: half speed" bestaat voor een groot deel uit dezelfde tekst. Deze twee teksten worden nu als twee losse strings in de Arduino opgeslagen en kosten zo 18 + 19 = 37 tekens (=bytes). Als je iets doet als
const char StringMotorB[] = "motor B: ";
const char StringHalf[] = "half";
const char StringLow[] = "low";
const char StringSpeed[] = " speed";

void printMotorLowSpeed(){
    Serial.print(StringMotorB);
    Serial.print(StringLow);
    Serial.println(StringSpeed);
}

void printMotorHalfSpeed(){
    Serial.print(StringMotorB);
    Serial.print(StringHalf);
    Serial.println(StringSpeed);
}
Op deze manier gebruik je 9 + 4 + 3 + 6 = 19 bytes en laat je deze ook nog een staan in flashmemory ipv ze ram in te laten nemen. (Laatste kun je ook al opvangen door de F() function.) Je zou dit in een handige functie kunnen stoppen maar is voor voor jou om te besluiten en te maken :p Ook zou je Motor en B nog los kunnen doen, handig als je veel motoren (of blokken enz) krijgt.



Dan nog een voetnote van mij, dit alles is geen negatieve kritiek! ;) Snap dat het zo over kan komen omdat het nogal een lap tekst is geworden. Ik vind het leuk om te zien dat iemand zo fijn bezig is met nieuwe dingen bekijken en dingen te maken. Het is allemaal bedoelt om van te leren en vooral om te zorgen dat je geen onverklaarbare fouten krijgt in je code. Niets is zo vervelend als een hele avond debuggen door een stomme fout, ik spreek uit ervaring  ::)

Veel succes verder!

Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 10 juli 2014, 22:50:59
Hoi,

Het heeft even geduurd voor ik de kans had om het programma te verbeteren, alle suggesties voor verbetering zijn zeer welkom.

Het eerste programma bestond uit een aantal losse programma delen die ik op het internet vond, vandaar dat het programma er enigszins rommelig er uit zag, ik heb het ondertussen aangepast, het programma kan er hier en daar er nog wat rommelig uit zien. 

Ik heb alleen een probleem, een wacht cyclus programmeren met het millis() comando werk op de een of andere manier niet.

De eerste millis() comando  in de void loop(){  werk wel(led op poort 13 word aangestuurd door een korte puls) maar de rest werk niet.  ??? ???
Iemand enig idee, ook andere ideeën en oplossingen zijn welkom.

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

/***** Global vars ***********************************************/


#define BACKLIGHT_PIN     3


LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // adressering lcd display

char incomingByte;

 /******************************************************************************
 * Definitions
 ******************************************************************************
 *motor A is aangesloten op OUT1 en OUT2 van de motorsturing
 *motor B is aangesloten op OUT3 en OUT4 van de motorsturing
 ******************************************************************************/

const char StringMotorA[] = "motor A: ";
const char StringMotorB[] = "motor B: ";
const char StringFull[] = "full";
const char StringHalf[] = "half";
const char StringLow[] = "low";
const char StringSpeed[] = " speed";

// constants won't change. Used here to
// set pin numbers:

const int ledPin =  13; // Pin nummer LedPin
const int blok1Pin = 6; // Pin nummer Blok 1
const int blok2Pin = 7; // Pin nummer Blok 2

const unsigned int Interval = 500;
const unsigned int WachtTrein = 7500;
const unsigned int BlokVrij = 10000;

// Variables will change:
 
//Motor A

int PWMA = 3; //Speed control
int AIN1 = 9; //Direction
int AIN2 = 8; //Direction

//Motor B

int PWMB = 5; //Speed control
int BIN1 = 11; //Direction
int BIN2 = 12; //Direction

int ledState = LOW;             // ledState used to set the LED
int wachtState = LOW;
int blokState = LOW;

long previousMillis = 0;        // will store last time LED was updated
long previousMillisWacht = 0;       
long previousMillisBlok = 0;

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.

//long interval = 500;           // interval at which to blink (milliseconds)

void setup(){
     
     lcd.begin (16,2); // Een 16 characters en twee regels display comando
   //lcd.begin (20,4); // Voor een 20 characters en vier regelelig display.
    // Switch on the backlight

    lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
    lcd.setBacklight(HIGH);
    lcd.home ();                   // go home
 
    // Print a message to the LCD.
   
    lcd.setCursor(2,0); //Start at character 2 on line 0
    lcd.print("Arduino Uno");
    lcd.setCursor(1,1);
    lcd.print("L298  M-Sturing");
     
  Serial.begin(9600);
  // Deze tekst is alleen op een terminal programma te zien of met het serial monitor van het arduino programma.
  Serial.println("Arduino test programma : Motorsturingen en blok meldingen");
  Serial.println();
  Serial.println("Stuur comando's");
  Serial.println();
  Serial.println("1 = Blok 1 vrijgeven            5 = Blok 2 vrijgeven");
  Serial.println("2 = Blok 1 bezet melden         6 = Blok 2 bezet melden");
  Serial.println("3 = Motor B starten             7 = Motor A starten");
  Serial.println("4 = Motor B stoppen             8 = Motor A stoppen");
  Serial.println();
  Serial.println("9 = Motoren A en B stoppen en blok 1 en 2 bezet melden");
  Serial.println();
  Serial.print(">");
 
  //Set all the pins we need to output pins
  // pinMode(STBY, OUTPUT);

  pinMode(PWMA, OUTPUT);
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);

  pinMode(PWMB, OUTPUT);
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);
 
  pinMode(2, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(ledPin, OUTPUT);
}

void loop (){
 
  // Controlle led om te zien of het programma nog werkt.
 
   unsigned long currentMillis = millis();
   
   if(currentMillis - previousMillis > Interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
   
  }
 
  if (Serial.available()) {
   
    //read serial as a character
    //char ser = Serial.read();
   
     if (Serial.available() > 0) {  // kijk of de seriele verbinding beschikbaar is.
        incomingByte = Serial.read(); // Lees een 'byte'.
     }
     
    // Begin Taak 1: Blok1 vrij
   
      if(incomingByte == '1') {
       
        Serial.println("Taak 1: Blok 1 : Vrij");
        digitalWrite(blok2Pin, HIGH);
     
        tekst();
       
     // Einde Taak 1: Blok1 vrij   
       
      }
   
    // Begin Taak 2: Blok 1 bezet 
     
      if(incomingByte == '2') {
       
        Serial.println("Taak 2: Blok 1 : Bezet");
        digitalWrite(blok2Pin, LOW);
     
        tekst();
       
    // Einde Taak 2: Blok 1 Bezet   
       
      }
   
    // Begin Taak 3: Motor B on
   
      if(incomingByte == '3') {
       
        Serial.println("motor B: Low speed");
        move(0, 64, 1); //motor B, full speed, left
       
        low();
        wacht();
       
        Serial.println("motor B: half speed");
        move(0, 128, 1); //motor B, half speed, left
       
        half();
        wacht();
       
         Serial.println("motor B: full speed");
        move(0, 255, 1); //motor B, low speed, left
       
        full();
       
        Serial.println("Taak 3: Motor B draait op full speed totdat er een stop comando komt.");
       
        //stop();
        tekst();
       
     // Einde Taak 3: Motor B on
     
      }
       // Begin Taak 4: Motor B off
       
      if(incomingByte == '4') {
       
          Serial.println("motor B: Full speed");
        move(0, 255, 1); //motor B, full speed
       
        full();
        wacht();
       
        Serial.println("motor B: Half speed");
        move(0, 128, 1); //motor B, half speed
       
        half();
        wacht();
       
         Serial.println("motor B:  Low speed");
        move(0, 64, 1); //motor B, low speed
       
        low();
        wacht();
       
        Serial.println("motor B: Stop");
        move(0, 0, 0); //motor B, stop
       
        Serial.println("Taak 4: Motor B staat stil omdat er een stop comando gegeven is.");
       
        tekst();
       
        // Einde Taak 4: Motor B off
     
      }
     
      // Begin Taak 5 : Blok 2 On
     
        if(incomingByte =='5'){ 
       
        Serial.println("Taak 5: Blok 2 Vrij");
        digitalWrite(blok1Pin, HIGH);
       
        tekst();
       
        // Einde Taak 5 : Blok On
       
      }
   
     // Begin Taak 6: Blok 2 Off
     
      if(incomingByte == '6') {
       
        Serial.println("Taak 6: Blok 2 Bezet");
        digitalWrite(blok1Pin, LOW);
       
        tekst();
       
      // Einde Taak 6: Blok 2 bezet
     
      }
           
    // Begin Taak 7: Motor A On
   
      if(incomingByte == '7') {
       
        Serial.println("motor A: low speed");
        move(1, 64, 1); //motor A, full speed, left
       
        low();
        wacht();
       
        Serial.println("motor A: half speed");
        move(1, 128, 1); //motor A, half speed, left
       
        half();
        wacht();
       
         Serial.println("motor A: full speed");
        move(1, 255, 1); //motor A, low speed, left
       
        full();
       
        Serial.println("Taak 7: Motor A draait op full speed totdat er een stop comando komt.");
       
        tekst();
       
     // Einde Taak 7: Motor A on
     
      }
       // Begin Taak 8: Motor A Off
       
      if(incomingByte == '8') {
       
          Serial.println("motor A: Full speed");
        move(1, 255, 1); //motor A, full speed
       
        full();
        wacht();
       
        Serial.println("motor A: Half speed");
        move(1, 128, 1); //motor A, half speed
       
        half();
        wacht();
       
         Serial.println("motor A:  Low speed");
        move(1, 64, 1); //motor A, low speed
       
        low();  // sub-routine low
        wacht();// sub-routine wacht
       
        Serial.println("motor A: Stop");
        move(1, 0, 0); //motor A, stop
       
        Serial.println("Taak 8: Motor A staat stil omdat er een stop comando gegeven is.");
       
        tekst();
      }
       // Einde Taak 8: Motor B off
   
       // Begin Taak 9 : Noodstop
       
      if(incomingByte == '9') {
       
        Serial.println("Taak 9 Noodstop :Motoren A+B stop en blok 1+2 bezet");
         
         stop();
         digitalWrite(blok1Pin, LOW);
         Serial.println("Blok 1: Bezet");
         digitalWrite(blok2Pin, LOW);
         Serial.println("Blok 2: Bezet");
         
          lcd.home ();                   // Home postitie cursor
          lcd.setCursor(0,1);
          lcd.print("Noodstop gemaakt");
         
         tekst();
      }
        // Einde Taak 9 : Noodstop
     
  }
}
void move(int motor, int speed, int direction){

  //Move specific motor at speed and direction
  //motor: 0 for B 1 for A
  //speed: 0 is off, and 255 is full speed
  //direction: 0 clockwise, 1 counter-clockwise

  //digitalWrite(STBY, HIGH); //disable standby

  boolean inPin1 = LOW;
  boolean inPin2 = HIGH;

  if(direction == 1){
    inPin1 = HIGH;
    inPin2 = LOW;
  }

  if(motor == 1){
    digitalWrite(AIN1, inPin1);
    digitalWrite(AIN2, inPin2);
    analogWrite(PWMA, speed);
  }
  else{
    digitalWrite(BIN1, inPin1);
    digitalWrite(BIN2, inPin2);
    analogWrite(PWMB, speed);
  }
}

void stop(){

  //Motor A en B stoppen
 
  move(0, 0, 0);// motor A stop
  move(1, 0, 0);// motor B stop
 
}

void wacht(){
       
     unsigned long currentMillis = millis();
   
    // long wacht = 7500;        // Wacht 7.5 Seconden
     
   if(currentMillis - previousMillisWacht > WachtTrein) {
      previousMillisWacht = currentMillis;
   
   }
   if (wachtState == LOW)
      wachtState = HIGH;
    else
      wachtState = LOW;
     
    lcd.home ();                   // go home
    lcd.setCursor(0,1);
    //lcd.print("Wacht 5 seconden");
 
    Serial.println("Wacht 5 seconden");
   
   }

void blok(){
   
    unsigned long currentMillis = millis();
   
    if(currentMillis - previousMillisBlok > BlokVrij) {
     previousMillisBlok = currentMillis; 
   }
   if (blokState == LOW)
      blokState = HIGH;
    else
      blokState = LOW;
     
    lcd.home ();                   // go home
    lcd.setCursor(0,1);
    lcd.print("Wacht :Blok vrij");
   
    Serial.println("Wacht tot blok vrij is.");
    digitalWrite(blok1Pin, LOW);
   }

void tekst(){
   
    lcd.home ();                   // go home
    lcd.setCursor(0,1);
    lcd.print(">");
   
    Serial.print(">");
 
}

void low(){
 
 
    lcd.home ();                   // go home
    lcd.setCursor(0,1);
    lcd.print("   Speed low    ");
}

void half(){

    lcd.home ();                   // go home
    lcd.setCursor(0,1);
    lcd.print("   Speed half   ");
    }
   
void full(){

    lcd.home ();                   // go home
    lcd.setCursor(0,1);
    lcd.print("   Speed full   "); 
}
     

Het programma werk als volgt :

De bediening van de treinbaan gaat via de serial monitor van het Arduino programma  of via een terminal programma, via de serial monitor/ terminal geef je een commando, deze commando's staan op het scherm.

Je kan in het vrije blok een trein laten in rijden en stoppen ,de trein komt het vrije blok binnen rijden en kan dan het blok bezet melden en na een x-aantal seconden komt de trein tot stilstand.(automatische mode nog niet ingebouwd)

Als eerst geef je het blok vrij.
                                                          commando 1:  blok 1 vrij
                                                          commando 5: blok 2 vrij

Dan kan je toestemming geven zodat de trein vertrekt.

                                                            commando 7: trein 1 kan vertrekken.
                                                            commando 3: trein 2 kan vertrekken.

Het is nu nog zo dat beide treinen tegelijk kunnen vertrekken als je beide blokken vrij geeft, dit is nu nog niet beveiligd, moet er nog worden ingebouwd (suggesties zijn welkom).

Trein laten stoppen (werk nog niet goed, de af rem tijd werk nog niet goed)

                                                            commando 4:  blok 1  trein 1 laten afremmen om te stoppen.
                                                            commando 8:  blok 2  trein 2 laten afremmen om te stoppen.
                                                           
Blok bezet melden  (werk nog niet goed, de wachttijd werk nog niet goed)

                                                             commando 2:  blok 1  bezet melden en trein laten wachten tot vertrek.
                                                             commando 6:  blok 2 bezet melden en trein latten wachten tot vertrek.

Algehele noodstop                         
                                                            commando 9: blok 1 en 2 bezet melden en trein 1 en 2 laten stoppen.

Deze opzet is alleen nog handbediening een automatische bediening word later ingebouwd (uitgebreide versie) , eerst dit gedeelte van het programma goed werkend krijgen.

Wat wil ik er op termijn nog bij bouwen:

- Blok bezet melding via reed-contacten.
- De seinen via dit programma tegelijk met de commando's laten werken. (bezet- rood en vrij- groen, worden alleen blokseinen gebruikt ook zichtbaar op het bedienings- paneel)
- Het programma ook via een bedienings- paneel kunnen bedienen.

Specificaties van het Arduino analoge modelbaan sturing :

* Test versie Arduino uno (atmega 328p) 16 digital i/o en 6 analoog IN waarvan twee analoog IN gebruikt worden voor I2C.

   1x   Motorsturing L298
   1x  Relais board 2 voudig
   1x  Relaisboard enkelvoudig
   1x   I2C lcd display 16x2

* Uitgebreide versie Arduino Atmega (2560)   53 i/o en 16 analoog in en aparte I2C

   4x Motorsturing L298 ( 8 blokken)
   2x Relaisboard 4 voudig of 1x 8 voudig relaisboard.
   1x Relaisboard enkelvoudig
   1x I2C lcd display 20x4
   1x Bluetooth verbinding met computer.
   2x Poort expander voor bedienings- paneel

Aan de uitgebreide versie ga ik pas beginnen als het programma in de test versie goed is.
De meeste onderdelen van de uitgebreide versie heb ik in mijn bezit (verzamelwoede ::) )

Mvg Paul  :)
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: dimo1_dimo1 op 10 juli 2014, 23:14:26
Volgens mij is het probleem dat je wacht functie nu niet meer blocked waardoor de rest van de code nog steeds wordt uitgevoerd..
Kan zijn dat ik het niet hoef heb gezien want heb vluchtig gekeken
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 14 juli 2014, 16:15:16
Je probleem met je Millis zit er in dat inderdaad je programma doorloopt. Maar dat is nu juist de bedoeling, je wilt niet dat de Arduino de 5 seconde wacht uit zijn neus loopt te vreten zoals gebeurd bij een delay(). Je functie wacht() is dan ook net correct. Wat je wilt doen is net als bij de led toggle de hele tijd checken of het aantal millis al voorbij is.

Dus om een wacht op te roepen doe je iets als
void wacht(int time){
previousMillisWacht = millis(); //Wacht vanaf dit moment
wachtState = HIGH; //Zet een flag dat we inderdaad aan het wachten zijn
wachtTrein = time; //dit hoeft niet maar zo is het mogelijk variabele tijden te wachten, zo lang willen we wachten
)

In je loop roep je nu de hele tijd een check op om te kijken of je wachten en zo ja ben je klaar met wachten? Dat ziet er dan uit als
void wachtCheck(){\
//Alleen bekijken als we wachten, anders kunnen we gelijk door
if(wachtState == HIGH){
//We wachten tot er echt wat gedaan moet worden
if(millis() - previousMillisWacht > wachtTrein) {
wachtState = LOW; //Laat zien dat we niet meer wachten
/*
Doe hier alles wat je wilt doen als je klaar bent met wachten
Bla
bla
bla
*/
}
}
}

Let wel op, per actie waar je op wilt wachten heb je dus een functie nodig. Dus wil je kunnen wachten op blok en en op blok 2 heb je deze functies twee keer nodig met ieder dus een previousMillisWacht en wachtTrein.

Omdat je al aardig begint te zien dat je nu dingen dubbel begint te doen (namelijk voor blok 1 en voor blok 2) zou je kunnen gaan kijken om dingen in classe te gaan schrijven. Dit is DE kracht van C++. Je kan dan een classe (= blauwdruk) van een blok maken. Vervolgens maak je voor elk blok dat je hebt een instantie van die blauwdruk met de juiste pinnen en settings.

Of, als dat nog even één stap te ver is (of je geen C++ wilt/kan gebruiken (ik schrijf zelf veel in C waar een classe niet mogelijk is)) kan je gebruik maken van array's voor dingen en functies maken waarin je aan geeft om welk blok het gaat. Een voorbeeld zou het wachten zijn. Je hebt denk ik maar één wacht functie per blok nodig. Waar je dan per blok op wacht is aan jou. Je zou de wacht functie schaalbaar kunnen maken door het volgende te doen:

Variable declaratie:
#DEFINE NRBLOKKEN 2 //Aantal blokken, nu dus maar twee
previousMillisWacht[NRBLOKKEN];
wachtState[NRBLOKKEN];
wachtTrein[NRBLOKKEN];

wacht()
void wacht(int blok, int time){
previousMillisWacht[blok] = millis(); //Wacht vanaf dit moment
wachtState[blok] = HIGH; //Zet een flag dat we inderdaad aan het wachten zijn
wachtTrein[blok] = time; //dit hoeft niet maar zo is het mogelijk variabele tijden te wachten
)

wachtCheck() (dit dus in je main loop)
void wachtCheck(){
//Nu moeten we dit gaan door voor alle blokken
for(unsigned int i = 0; x < NRBLOKKEN; i++){

//Alleen bekijken als we wachten, anders kunnen we gelijk door
if(wachtState[i] == HIGH){
//We wachten tot er echt wat gedaan moet worden
if(millis() - previousMillisWacht[i] > wachtTrein[i]) {
wachtState[i] = LOW; //Stop met wachten
switch(i){
case(0):
/*
Doe hier alles wat je wilt doen als je klaar bent met wachten voor blok 0
(dat is dus het EERSTE blok, beginnen bij 0
Bla
bla
bla
*/
break;
case(1):
/*
Doe hier alles wat je wilt doen als je klaar bent met wachten voor blok 1
Bla
bla
bla
*/
break;
/*
case(x) enz voor meer blokken
*/
}
}
}
}
}

Omdat je in het begin alle wachtState LOW wilt hebben en dus alle alle entries in je array LOW wilt hebben maak je hier een functie van:
//Maakt alle wachtState LOW
void initWachtState(){
for(unsigned int i = 0; x < NRBLOKKEN; i++){
wachtState[i] = LOW;
}
}

Ipv
wachtState = LOW;doe je nu
initWachtState()
Zoals je kunt zien niet heel veel meer code maar is het op te schalen tot zo veel blokken als je wilt zonder dat je enorm veel code extra moet maken. Daar ligt de hele kracht van functies. Als je twee keer bijna hetzelfde aan het opschrijven bent moet je bedenken of je hier niet één functie van kunt maken.

Nog weer een kleine opmerking over tekst. Je gebruikt in je prints heel veel tekst. Maar ook heel veel spaties! Dit neemt erg veel ruimte in op je Arduino. Ik kan nu even niet zien hoe vol je Arduino zit (heb niet de LCD I2C lib staan) maar de ruimte op een Arduino in eindig. Nu kom je er nog wel mee weg maar in de toekomst kan dit nog wel eens een probleem vormen.

Ook zou ik als ik jou was nog beter kijken naar hoe je opmaak van je code is. Gebruik een TAB om in te springen in je code, geen spatie. En vooral, spring consequent in. Laat ALLES wat binnen een if/fucntie/else/for/enz valt inspringen, ook commentaar. Maar ook, spring terug als iets eindigt. Een sluit } op dezelfde hoogte als de if/fucntie/else/for/enz die hem liet beginnen maakt snel duidelijk waar hij bij hoort (en of je er dus geen vergeet / teveel plaatst). Zo kan je sneller zien waar het bij hoort. Ik moest nu best zoeken waar iets begin en stopte enz.


Succes verder met puzzelen!

Timo

Disclaimer:  ;D
Ik hebt de code alleen zo geschreven en niet getest/gecompiled. Het moet dus worden gezien als pseudo code wat kan dienen als basis voor je eigen programma.

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 14 juli 2014, 22:34:30
Hoi, volgers

@Timo

Bedankt voor je input (y)

Met de uitleg die gegeven hebt kan ik weer verder puzzelen :P ;D
De code is nu nog in ontwerp/puzzel fase, als ik zover ben dat de code redelijk goed is ga ik de code in een nieuwe sketch schrijven en ga het zo structureel mogelijk doen inclusief het gebruik van de TAB-toets, maar zover ben ik nog niet.
Er word nog veel veranderd in de code, zodat het wat lastig word om alle spaties te gaan omzetten naar TAB's.

Ik zit nog te bedenken of ik 16 blokken of 8 blokken wil gaan sturen, voor het schrijven van de software zal dat niet veel uitmaken.
Zoals jullie weten of niet weten worden de blokken aangestuurd door een  relais en worden de blokken  vooralsnog handmatig getuurd later wil ik dit  zowel handmatig als automatisch doen.

De treinen worden met een L298 motorsturing gestuurd voor het sturen van 16 blokken heb ik dan 8 motor sturingen  van het type L298 nodig, zou ik 8 blokken maken heb ik maar 4 motorsturingen van het type L298 nodig.
De blokken kan ik waarschijnlijk via een shift register aansturen met drie stuur lijnen kan ik 8 relais sturen of dat goed werk moet ik nog gaan uitproberen.
Ik moet mijn gedachten er maar eens over laten gaan of ik 16 of 8 blokken ga maken.

Ook wil ik wissels gaan sturen zowel handmatig als automatisch, hiervoor wil ik een ic van het type uln2003A gebruiken die via een shift register word aangestuurd.
Dit projectje ga ik binnenkort mee beginnen (word vervolgd), ook deze sturing moet in het Arduino analoge modelbaan sturing worden ingebouwd.

Om dat alles in goede banen te leiden zal nog niet meevallen.

Voor de hoofdsturing word een Arduino Mega gebruikt, deze heeft 53 digilale I/O poorten.

Mvg Paul  :)

 
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 15 juli 2014, 10:18:07
Hoi Paul,

Ik zou je dan wel aanraden bij wijzigingen wel goed op het gebruik van de tab te letten. De leesbaarheid is juist in de ontwerpfase erg belangrijk. Je zou niet de eerste zijne die daardoor niet ziet dat een regel code wel binnen een if valt  :P Zo uit me hoofd ondersteund de Arduino IDE ook het tab'en van een blok. Dus een paar regels code selecteren en dan op tab drukken, het hele blok wordt dan netjes ingetabd. Door de shift tegelijk in te drukke met de tab doe je het omgekeerde, zo haal je van een blok de tab weg. Erg handige functie als je code heen en weer verplaatst  ;D

Toch is me nog niet duidelijk hoe je de blokken wilt aansturen. Ben je nu van plan de motordriver te gebruiken of nu relais? Beide lijkt me niet nodig...

De ULN2003 is prima voor wissels en seinen. En hoe je deze aanstuurt is aan jou. Arduino pin, shift register of port extender zal allemaal werken. Wel zou ik twee uitgangen van de ULN combineren tot 1 uitgang van 1A voor de wissels. 500mA kan wat krap zijne voor wissels. Zijne er al kant en klare shields met de ULN verkrijgbaar of ga je hiervoor zelf aan de slag met de soldeerbout?


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 20 juli 2014, 21:55:18
Hoi,

@Timo

Het is de bedoeling om de motordrivers en de relais beide te gebruiken, de relais zijn voor de stations/uitwijk sporen.
Deze sturing word alleen gebruikt als de baan in handbediening staat.

Als het niet duidelijk is.

De werking is als volgt :

De hoofdbaan heeft een eigen motordriver en is in twee blokken verdeeld  blok1 en blok 2, de stationssporen hebben een eigen motordriver blok 1a en blok 2a  deze blokken worden gestuurd door de relais, de treinen op de hoofdbaan kunnen doorrijden zonder dat het invloed  op de stationssporen heeft, daar deze afgeschakeld zijn door de relais, voor ik blok 1 kan oprijden moet ik de hoofdbaan in de juiste rij richting zetten voordat ik blok 1a kan verlaten, om eventuele kortsluiting te voorkomen gebruik ik deze blok relais.

Dit programma is specifiek voor handbediening , voor een automatische sturing moet ik nog veel uitzoeken.
Ik hoop dat het mogelijk is om in een programma zowel handbediening als automatische bediening te programmeren.

Zijn er routines om bij het starten van het Arduino programma te kiezen tussen twee functies binnen het programma, met behulp van een standaard tuimelschakelaar? ::)

Ik heb al een poging gewaagt maar het werk niet  ???

Omdat deze keuze maar een keer gemaakt hoeft gemaakt te worden heb ik de code voor de keuze in  void setup() gezet.

// test programma keuze hand auto
int keuzePin = 2;
int ledPin = 3;
int led1Pin = 4;
int keuze = 0;

void setup(){
 
 pinMode(2, INPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 
 Serial.begin(9600);
 Serial.print("Arduino uno test programma");
     
 keuze = digitalRead(keuzePin);
 
  if (keuze == LOW){
    //digitalWrite(ledPin,HIGH);
 
    automatisch();
}
     else
      if (keuze == HIGH){
     //digitalWrite(led1Pin,HIGH);
    }
    hand();   
}

void loop()
{
   
}
void automatisch(){
 
 Serial.println("Automatische gekozen");
 digitalWrite(led1Pin, LOW);
 digitalWrite(ledPin, HIGH);
 delay(2000);
}
void hand(){
  Serial.println("Handbediening gekozen");
  digitalWrite(led1Pin, HIGH);
  digitalWrite(ledPin, LOW);
}

Mvg Paul  :)
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: memen op 20 juli 2014, 23:13:56
'if (keuze == high)' kan weggelaten worden toch?

En volgens mij moet de '}' die nu voor 'hand()' staat, achter 'hand()' komen. Dus:

If(keuze == LOW)
     {
         automatisch();
      }
Else
      {
        hand();
       }

Kan zijn dat ik het fout heb hoor, ik ben nog maar net begonnen met c programmeren.

Groeten,

Rauke


Verstuurd van mijn GT-S7500 met Tapatalk
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 20 juli 2014, 23:16:03
Hoi,
@ Rauke

Bedankt voor je reactie  (y)
Ik ga het nog even testen of het werk zoals jij schrijft.
Bedank voor je tip het werk nu wel goed (y)

@Allen

Ik ben nog even verder gegaan met testen, ik heb nu het case statement gebruikt.
Het werk nu wel, alleen vraag ik mij af of het kwaad kan als ik een poort lang 'HIGH' hou met behulp van een tuimel schakelaar ::)

Dan heb ik meteen een volgende vraag ik gebruik case 0 en case 1 is het mogelijk dat ik in case 0 de broncode set van de automatische sturing en in case 1 de broncode van de hand bediening zet, zonder dat het elkaar in de weg zit?


// test programma keuze hand auto met behulp van het :  Switch(), case statement

int keuzePin = 2;
int ledPin = 3;
int led1Pin = 4;
int keuze = 0;

void setup(){
 
 pinMode(2, INPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 
 Serial.begin(9600);
 Serial.print("Arduino uno test programma");
     
}

void loop(){

    keuze = digitalRead(keuzePin);
 
  switch (keuze) {
   
    case 0:
   
    digitalWrite(led1Pin, HIGH);
    delay(2000);
    digitalWrite(led1Pin, LOW);
    Serial.println("Keuze staat op handbediening");
    break;
   
    case 1:
   
    digitalWrite(ledPin, HIGH);
    delay(2000);
    digitalWrite(ledPin, LOW);
    Serial.println("Keuze staat op automatisch");
    break;
  }   
}


Ik hoop dat er mensen zijn die mij een antwoord op mijn vragen kunnen geven ::)

Mvg Paul :)
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: dimo1_dimo1 op 21 juli 2014, 08:23:28
Ik zou een tuimelschakelaar aansluiten met twee pinnen, de een op de digitale poort, de andere naar ground..
Dan zet je in de code tijdens de set-up die pin hoog en kan je hem met de schakelaar laag trekken.. Dan hoef je namelijk geen weerstand te gebruiken..
Als je de pin hoog wil maken met een schakelaar zou je een 10k weerstand tussen de 5v en de schakelaar moeten doen om te voorkomen dat je de poort stuk maakt
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: memen op 21 juli 2014, 13:08:24
Als je de pin in de software hoog zet en je verbindt de pin vervolgens direct aan de ground, dan is je ic net zo goed stuk hoor.

Wat wel zou kunnen: als je tuimelschakelaar drie contacten heeft, kun je schakelen tussen +5V en GND. Zolang de pin als input staat, kan dat.

Je kunt ook nog kijken of je ic interne pull ups heeft die je in kunt schakelen.

Groeten,

Rauke

Verstuurd van mijn GT-S7500 met Tapatalk
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 21 juli 2014, 13:16:32
Volgens mij kan je zonder problemen een schakelaar aansluiten op een ingangspin.
Deze schakelaar komt tussen pin en ground. De ATMega (de chip op de Arduino) heeft ingebouwde pullup weerstanden die je middels de software kunt selecteren. Indien contact open staat is de pin, middels die ingebouwde pullup hoog. Is de schakelaar gesloten dan is de pin laag.

pinMode(pin, INPUT);           // set pin to input
digitalWrite(pin, HIGH);       // turn on pullup resistors


succes Frits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Tukker op 24 juli 2014, 21:19:46
Hoi Paul,

Ik sluit meestal de schakelaars aan op de arduino met weerstanden.
Hier staat wel een goede uitleg over schakelaars aan sluiten.

http://sheepdogguides.com/arduino/FA1inp1.htm (http://sheepdogguides.com/arduino/FA1inp1.htm)
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: HansQ op 25 juli 2014, 09:45:52
Citaat
   pinMode(pin, INPUT);           // set pin to input
   digitalWrite(pin, HIGH);       // turn on pullup resistors

Volgens mij kun je in plaats van bovenstaande ook gebruiken:
   pinMode(pin, INPUT_PULLUP); 

De interne pullups van een microcontroller zijn meestal nogal zwak (dus aan de hoge kant).
Bij storingsgevoelige omgevingen gebruik ik meestal een pullup weerstand van tussen de 1K en de 10K, die ik zo dicht mogelijk bij de ingang zet.
De waarde van de weerstand kies ik zo, dat er minimaal een paar mA gaat lopen, dus 10K vind ik bij 5V wat aan de hoge kant...
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 27 juli 2014, 12:05:32
Wat betreft je blokken, je maakt dus dat een deel van een blok uit te zetten is? Maar 1a zit wel achter de motordriver van blok 1? Je gebruikt ze dus alleen om opstelsporen uit te zetten, niet om om te polen neem ik aan. Is het voorzien van station sporen (met eventueel een relais voor spoor 1a en 1b achter elkaar) van eigen motor driver niet handiger dan ze op te nemen in de hoofdnaamruimte? Er kan immers maar 1 loc bestuurd worden per motor controller.

En voor de toekomst, blijft het zo'n simpele baan of moet het dan flink groter worden. Dit ivm dingen die wel of niet makkelijk schalen.

De andere hebben gelijk wat betreft een schakelaar. Deze een input laten schakelen naar GND en voorzien van pullup. Dit kan door intern de pullup aan te zetten, maar deze is zoals genoemd zwak, of door extern de input aan de 5v te verbinden met een weerstand, 1k ofzo. Input hoog houden kan geen kwaad, zolang je er in de code maar een input van maakt. Gelukkig is dit de standaard bij het opstarten.

Wat betreft code, het geven van een naam aan een pin is handig voor de leesbaarheid en zo hoef je de pin maar op een plaats te wijzigen. Doe dan ook iets als
// test programma keuze hand auto
const int KeuzePin = 2;
const int LedPin = 3;
const int Led1Pin = 4;

int keuze = 0;

void setup(){
 
 pinMode(KeuzePin, INPUT);
 pinMode(LedPin, OUTPUT);
 pinMode(Led1Pin, OUTPUT);
En voor je leesbaarheid en om onze sneller fouten te laten vinden, gebruik duidelijkere namen. Een naam als Led1Pin zegt niet zo veel.

Wat betreft het wisselen ben je er al wel grotendeels achter. Ik weet alleen niet waarom je alleen bij het opstarten wilt kunnen wisselen tussen handmatig en automatisch. On the fly is toch veel leuker?

Je kunt hier mooi een switch case constructie gebruiken. Alleen zou ik wel duidelijke namen aan dingen geven (magic word van duidelijk programmeren) en de code wel in een losse functie zetten. Je krijgt dan
// test programma keuze hand auto met behulp van het :  Switch(), case statement

//Leesbare namen voor de bedrijfsmodi
#DEFINE AUTO 1
#DEFINE HANDMATIG 0

const int KeuzePin = 2;
const int LedPin = 3;
const int Led1Pin = 4;
int modus = 0;

void setup(){
 
 pinMode(KeuzePin, INPUT);
 pinMode(LedPin, OUTPUT);
 pinMode(Led1Pin, OUTPUT);
 
 Serial.begin(9600);
 Serial.print("Arduino uno switch test programma");
     
}

void loop(){

    modus = digitalRead(keuzePin);
 
  switch (modus) {
   
    case HANDMATIG:
       handmatigLoop();
       break;
   
    case AUTO:
       autoLoop();
       break;
  }   
}
handmatigLoop() en autoLoop() zijn nu te gebruiken als dat je nu loop() gebruikt alleen afhankelijke van de schakelaar.

Misschien ten overvloede, in het uieindelijke programma geen delay() gebruiken om een led te laten knipperen. Dan kan de Arduino niets tegelijk doen.


Timo
Dit was even een reactie vanaf me telefoon op een vliegveld in oost Duitsland. Nu ga ik weer zweefvliegen, kijken of er nog thermiek is. Over een week weer thuis voor meer vragen.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 28 juli 2014, 21:25:06
Hoi , volgers

Hans, Tukker, Frits, Rauke, Dimo_Dimo, bedank voor jullie input  (y)

@Timo Bedankt voor je input  (y)

De motor driver die ik gebruik heeft per print twee motor sturingen , motordriver 1 stuurt de hoofdbaan( blok 1 ) en motor driver 1a( blok 1a ) stuurt de opstel/station/wacht sporen binnen blok 1, dit word door 1 motordriver met twee motoraansluitingen gedaan.

Voorbeeld :

(https://images.beneluxspoor.net/bnls/testobject_2.jpg) (https://images.beneluxspoor.net/bnls/testobject_2.jpg)

De te bouwen modulebaan( de modules zijn klaar, ik ben nog bezig met het baanplan) zal een rij lengte hebben van ongeveer 14 meter
Hoeveel blokken ik wil hebben weet ik nog niet, waarschijnlijk op de hoofdbaan 4 blokken en op de zijlijn 8 blokken.

Helaas werk je code niet, kan ook even niet uitvogelen waarom het niet werkt, ik heb al veel zelf getest maar het werkt niet, krijg
verschillende fout meldingen, dat geld ook als ik de namen anders benoem.

Ik denk dat het niet kan omdat de Arduino maar een programma in de void Loop(){  kan uitvoeren voor zover ik dat weet.

Een andere oplossing kan zijn twee Arduino's te pakken, de eerste voor de handbediening en de tweede voor automatisch bedrijf er moet dan nog een oplossing gezocht worden om te switchen tussen de handbediening en automatisch bedrijf.

Op pin 2 van de ene Arduino  zet ik een LOW  en op de ander een HIGH binnen het programma kijk ik wat voor signaal ik op pin 2 hebt als het een LOW is zal de andere Arduino een HIGH moeten genereren waardoor er een van de twee Arduino's niet word gebruikt.

Ik kan voor die functie een kleine microcontroller gebruiken (atiny) met een programma die de signalen stuurt. (mooier)
Of ik pak een ic met 4 AND poorten en een tuimel schakelaar. (kiss)

@Allen

Mochten jullie nog suggesties hebben hoor ik dat graag.

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Dirk J op 28 juli 2014, 21:48:37
Vraagje.
Stel, je rijdt met de wijzers van de klok mee. In blok 2 staat tussen de wissels een trein en daarnaast in blok 2A staat ook een trein. Nu wil je de trein uit 2A laten vertrekken terwijl die in 2 blijft staan. Kan dat? Zo nee, ben je daar tevreden mee?
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: dimo1_dimo1 op 28 juli 2014, 23:22:27
Als ik de code met de switch zo zie zou die moeten werken mits je de handmatigloop en autoloop aan maakt..
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 29 juli 2014, 09:35:28
Hoi Paul,

Ik kan de code zelf helaas ff niet testen op fouten. Zoals gezegd heb ik het op me telefoon geschreven en kan een foutje bevatten. Over een week ben ik weer in Nederland en kan ik de fout zoeken. Het zou iig moeten werken. In loop kan je doen wat je wilt, dus geen reden waarom het, mits geen fouten in de code, niet zou werken. Een tweede Arduino gebruiken, zeker met een extra attiny, is jagen op een mug met een bazoeka  ;D

Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 29 juli 2014, 18:54:53
Hoi volgers

dimo1_dimo1 bedankt voor je input  (y)

@Dirk J
 
???, ik snap je vraag niet helemaal,  ik zal het proberen te beantwoorden.

Ja dat kan als ik dat gedeelte isoleer van de rest van het blok ik zie daar het nut niet van in.

Ik zie alleen niet waarom dat nodig is, blok 1 is een doorgaande spoor, daar zal geen trein zomaar stoppen, alleen in noodsituatie, en als blok 2 eventueel bezet is maar dan kan de trein van blok 1a ook niet vertrekken,  blok 1a kan bv een stationsspoor dus zijn, als blok 1 of 2 vrij is kan de trein van blok 1a vertrekken.

Misschien is het je niet duidelijk maar het ovaaltje dat ik getekend heb is niet mijn modelbaan, het is bedoeld als uitleg hoe mijn blok systeem zal gaan werken.

Als het niet zou kunnen ben ik er tevreden mee.

@ Timo

De screenshot van de foutmeldingen, die ik krijg, en dan heb ik er al een paar opgelost.

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

Mvg Paul Smits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: dimo1_dimo1 op 29 juli 2014, 19:02:04
Heb je de methoden :
void handmatigloop()
{
}

void autoloop()
{
}

Wel aangemaakt?
Eventueel een serial.println() erin die duidelijk maakt wat de arduino doet
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 29 juli 2014, 19:04:44
Ah, die foutmelding is simpel. Je moet de functies natuurlijk wel declareren  ;D Je roept nu twee functies op die niet bestaan. Net als alle functies moet je deze wel declareren. Zet in je code dus ook
//Loop functie voor handmatig gebruik
void handmatigLoop(){
   //Hier alle code die je in loop wilt hebben in handmatig bedrijfsnaam
}
//Loop functie voor automatisch  gebruik
void autoLoop(){
   //Hier alle code die je in loop wilt hebben in automatisch bedrijfsnaam
}


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 29 juli 2014, 19:13:27
Hoi,

Die heb ik inderdaad aangemaakt, zal kijken of ik een andere screenshot kan maken.

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

En deze foutmeldingen krijg als ik ze in de void Loop(){} zet.

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

Mvg Paul Smits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: santerdam op 29 juli 2014, 19:47:17
Het is niet helemaal duidelijk te zien, maar heb je 'void loop(}' staan ipv 'void loop()' ?

Sander
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: dimo1_dimo1 op 29 juli 2014, 19:52:35
Er moet nog void voor je functie declaratie staan
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 29 juli 2014, 23:29:24
Hoi,  volgers

Timo, dimo1, Sander bedankt voor de input.  (y)

Ik werd er door dimo1 er op gewezen dat ik voor de functie handmatigloop  en autoloop
vergeten was om er void voor te zetten ::), ik krijg nu inderdaad geen foutmeldingen meer.

Ik ga morgen verder met het programma om er beide functies in proberen  te bouwen.

Mvg Paul Smits  :)

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 25 augustus 2014, 23:15:56
Hoi, Volgers

De vakantie is helaas weer voorbij :'( , en ik heb er ondertussen weer een week werk opzitten.

Ook het modelspoor seizoen is weer begonnen  ;D .

Ik ben weer begonnen met het verder programmeren van de Arduino analoge  modelbaan sturing, het gedeelte voor het automatisch rijden heb ik er bij geprogrammeerd, alleen moet ik nog de variabelen nog aanpassen, het is verder nog niet getest.

Ik ben bezig met het ontwerpen van de wissel sturingen met terugmelding en afschakelen van de baanspanning van het niet bereden baanvak.

Omdat ik niet veel vrije aansluitingen heb op de Arduino mega, heb ik besloten om relais te gaan gebruiken, ook het programma word er niet complexer van, als ik het commando geef om de wissel om te leggen worden gelijk een aantal schakelingen geschakeld. (signalering van de wisselstand, het omleggen van de wissel en het afschakelen van de baanspanning van het niet bereden spoor) .

De schakeling  bestaat uit drie relais 1x bi-polair relais en 2x een unpolair relais, ook heb ik een mogelijkheid er bij gebouwd om deze schakeling handmatig via het bedienings paneel te schakelen.
De terug melding van de wisselstanden word door de schakel contacten van het bi-polair relais gedaan evenals het afschakelen van de baanspaning van het niet bereden spoor.
De unpolair-relais  schakelt de wissel, dit duurt maximaal een halve seconde zodat de spoel van de wissel niet al te zwaar belast word, waardoor de spoel niet kan verbranden. (dat hoop ik teminste ::) )

Het schema heb ik uit de hand getekend en vervolgens er een foto van gemaakt, ik hoop dat het duidelijk is wat ik probeer te ontwerpen.

(https://images.beneluxspoor.net/bnls/IMG_20140825_220137.jpg) (https://images.beneluxspoor.net/bnls/IMG_20140825_220137.jpg)

Een zelfde soort schakeling wil ik gaan ontwerpen voor het sturen van de blokken, zodat ik het via de computer kan sturen of via het bedieningspaneel, er word dan een bloksein in het vorige blok gesteld op rood, zodat  de trein stopt en wacht tot het sein op groen word gesteld.

Dit was het weer voor deze keer.

Heb je nog op/aanmerkingen of verbeteringen hoor ik dat graag.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: tuurtje op 25 augustus 2014, 23:22:02
Hi Paul,

Wat een leuk universeel print is dat, zo kant en klaar te koop ?

Een kleine opmerking van significante betekenis. Je blusdiodes over de relais staan verkeerd om getekend.  ;)

Groetjes

Arthur
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 25 augustus 2014, 23:29:21
Hoi Arthur

Je hebt helemaal gelijk  ::) , gelukkig heb ik de blus diodes nog niet heb geplaatst.

Deze printjes zijn helaas niet meer te koop , deze printjes werden via het elektronica blad Elex te koop aangeboden.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: JaJo op 26 augustus 2014, 07:11:58
Ik heb ook een Arduino knutselaar in de familie. :o
Maar dan anders: https://www.youtube.com/watch?v=q2m1sGg5mKE#t=27
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 26 augustus 2014, 09:50:41
Als ik je schema goed zie dan krijg je een kortsluiting zodra je de transistoren open stuurt.
Je moet de transistor parallel aan je drukknoppen zetten als de bedoeling is het bistabiele realis aan te sturen met de Arduino.

Succes, Frits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: tuurtje op 26 augustus 2014, 11:30:33
Hi Paul,

Mede door de opmerking van Frits zit ik ook nog een goed te kijken nar het schema en zie dat de relais altijd aan getrokken zijn.
Ze zullen inderdaad even afvallen als een van de twee trasistoren open stuurt maar aangezien deze dan gelijk de volle 12 Volt te verwerken krijgen meteen de geest zullen geven. Dit doet me een beetje denken aan een schakeling uit een half geleider test van jaren geleden waar ze op deze manier zekeringen testen of deze nog goed waren  ;D ;D

Groetjes

Arthur
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 26 augustus 2014, 20:34:14
Ik heb je tekening opnieuw getekend en vereenvoudigd. Je kan de relais nu aansturen dmv de drukknop of door de Arduino via één van de transistoren.
Ik weet niet of dit de bedoeling is maar soms maken tekeningen meer duidelijk dan 1000 woorden......
(https://images.beneluxspoor.net/bnls/Clipboard01_46.jpg) (https://images.beneluxspoor.net/bnls/Clipboard01_46.jpg)
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: tuurtje op 26 augustus 2014, 22:07:04
Citaat
Ik weet niet of dit de bedoeling is

Hi Frits,

Dit ziet er inderdaad al beter uit, waarbij het inderdaad de vraag is of drukknoppen allen het bistabiele relais moet schakelen of ook een puls via het monostabiele relais moet genereren

Maar goed daar kan Paul wel antwoord op geven.

Groetjes

Arthur
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 26 augustus 2014, 23:04:02
Hoi volgers

@Arthur

Bedankt voor je input, ik heb het schema nog eens goed bekeken en kwam tot dezelfde conclusie ::) , dat alle relais aangetrokken zijn, voor een  bi-stabiel relais is dan niet echt gezond.

@Fritsprt

Bedank voor je input en het schema, ik was zelf al bezig met een herziene schema te maken.
Het is inderdaad de bedoeling om met zowel met de  Arduino, als via de drukknoppen op het bedieningspaneel te sturen.

Het herziene schema.

(https://images.beneluxspoor.net/bnls/IMG_20140826_225818.jpg) (https://images.beneluxspoor.net/bnls/IMG_20140826_225818.jpg)

Het volgende schema is van de bloksturing met lichtsein (bloksein)  en terugmelding naar het bedieningspaneel en afschakeling van de spanning van de sporen, van het vorige blok.

Dat was het weer voor vandaag.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: tuurtje op 26 augustus 2014, 23:13:34
Hi Paul,

In plaats van de 1N4007 kan je ook de 1N4148 nemen, scheelt je weer € 0,08 per diode

Correct me if i am wrong, het bistabiele relais is voor je seinbeeld en terug koppeling naar je bedieningspaneel.
De andere twee zijn voor je wissel ?

Groetjes

Arthur
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Klaas Zondervan op 26 augustus 2014, 23:21:57
Je transistors zitten aan de verkeerde kant. Ik neem aan dat ze vanuit de Arduino worden gestuurd met 5V t.o.v. GND. Zoals ze nu zitten komen ze nooit in verzadiging. Transistors moeten in deze situatie met de emitter aan GND.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 27 augustus 2014, 11:39:22
Gelukkig is Klaas zoals altijd scherp. Inderdaad, als je 12V relais gebruikt kan je op deze wijze de torren niet opensturen. Zo te zien op je foto heb je de relais al anders zou je kunnen overwegen om 5V relais te gebruiken. Om je bestaande 12V relais toe te passen heb ik twee tekeningen gemaakt. De eerste is het voorstel van Klaas om de transistor onder het relais te plaatsen. (ik heb voor het gemak maar één relais getekend). Een andere oplossing is gebruik maken van een optocoupler. Een oplossing die ik zelf bij voorkeur zou toepassen op een treinbaan met grote stromen, vonken enz. Arduimo's houden daar nl niet zo van.......
Succes weer.

(https://images.beneluxspoor.net/bnls/Arduino_opto.jpg) (https://images.beneluxspoor.net/bnls/Arduino_opto.jpg)
Frits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Klaas Zondervan op 27 augustus 2014, 11:46:20
Frits, bij je rechter schema heb ik ook twijfels. Er bestaan volgens mij niet veel opto's waarme je een relais rechtstreeks kan aansturen.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: HansQ op 27 augustus 2014, 13:42:43
...een PC817 (of PC847) kan 50 mA aansturen, dus dat gaat wel als je geen al te dikke relais neemt...
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Klaas Zondervan op 27 augustus 2014, 14:04:09
Volgens de datasheet ligt de current transfer ratio rond de 100% bij een uitgangsstroom van 50 mA. Dan moet je er dus ook 50 mA ingangsstroom in stoppen. Ik heb geen ervaring met de Arduino, maar is dat niet een beetje veel?
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 27 augustus 2014, 14:33:29
je moet de uitgangen van de Arduino niet met meer dan 40mA belasten. Ik weet uit ervaring dat je een relais prima met een optocoupler kan aansturen. De ingangsstroom kan je dan met gemak kleiner dan 10mA laten zijn terwijl de uitgang met gemak 50mA schakelt.
Het is de keus aan de starter van dit draadje hoe hij het wil gaan doen. Ik adviseer altijd optocouplers i.c.m. microcontrollers. En als de relais meer stroom vragen kan je ook een combi maken van een optocoupler en een transistor.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Klaas Zondervan op 27 augustus 2014, 15:10:34
De ingangsstroom kan je dan met gemak kleiner dan 10mA laten zijn terwijl de uitgang met gemak 50mA schakelt.
Maar dan moet de opto wel een CTR hebben van gegarandeerd 500%. Bij de PC817 kan die liggen tussen 50% en 600%. Je kan dus ook behoorlijk pech hebben als je een slechte treft.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 27 augustus 2014, 22:54:37
Hoi volgers

@Arthur

Bedankt voor je input.  (y)

Ik hoef deze diodes (1N4007) niet te kopen, heb er nog een stuk of 500 liggen.

Het bi-stabiele relais word gebruikt om op het bedieningspaneel, de stand van de wissel zichtbaar te maken( geel of groene led ) .
Het andere schakelcontact kan het onbereden spoor stroomloos te maken, of een andere functie, het belangrijkste is de terugmelding naar het bedieningspaneel.

@Fritsprt

Bedankt voor je input en schema, ik ga nu eerst maar eens een proefopstelling van de schakeling maken en het testen.

@Klaas

Bedankt voor je input  (y)

@Hans

Bedankt voor je input.  (y)

@Allen

Deze schakeling hoeft niet anders te doen dan via de Arduino of via het schakelpaneel een kort puls te geven om het bi-stabiele relais om te zetten voor een terugmelding van de wisselstand naar het bedieningspaneel,  en tegelijk met het andere relais een wissel om te zetten.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Klaas Zondervan op 27 augustus 2014, 23:14:57
Paul, heb je er nooit aan gedacht om de wisselstand terug te melden via het eindafschakelcontact?
Dan heb je de echte wisselstand. Met dat bi-stabiele relais heb je een afgeleide stand, maar bij een weigering van het wissel hoeft die niet gelijk te zijn.

Het principe van zo'n terugmelding staat op mijn website (http://people.zeelandnet.nl/zondervan/bonte%20verzameling.html)
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 28 augustus 2014, 18:14:24
Hoi

@Klaas

Bedankt voor je input.  (y)

Ik weet dat er wissels bestaan met een eind afschakel contact, helaas hebben Minitrix  wissels geen eind afschakel contact, ik ben dus gaan zoeken naar een andere oplossing voor de terugmelding naar het bedieningspaneel.

Mocht de wissel een keer weigeren(heb ik nog niet meegemaakt) vind ik dat geen probleem, op mijn modelbaan rijden niet veel treinen tegelijk.



Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 29 augustus 2014, 23:25:10
Hoi Paul,

Helaas heb ik geen tijd om alle vorderingen uit te pluizen. Volgt er nog code?  ;D Over het schema heb ik, net als velen  ;D,  wel een opmerking.

Ik zou zelf ook voor de schakeling gaan die de stroom sinkt (dus in de lijn naar ground zit zoals in je laatste tekening) ipv een opto. Een transistor koswt gewoon minder. Marrr....

Waarom gebruik je nog relais???!!! Een wissel is prima met gelijkspanning aan te sturen. Een darlington array zoals de ULN2003A. Per uitgang kunnen deze 500mA leveren (piek @ 600mA). Deze mag je parallel schakelen. Dus met twee een uitgang van 1A maken. Dit moet wel genoeg zijn voor een wissel. Ze kosten minder dan een kwartje en daarmee heb je 7 uitgangen. Dit is dus genoeg voor net geen twee wissels @ 1a. Met 4 chipjes kun je zo 7 wissel schakelen. Een drukknop parallel hieraan is ook geen probleem. Minder onderdelen, minder mechanisch ,goedkoper en je gebruikt een opto niet buiten zijn spec's. Als je de voeding van de wissels uit een andere voeding haalt dan de voeding van de Arduino maar ze alleen common ground (gemeenschappelijke ground) bij de ULN's geeft is het geen probleem. De Arduino blijft dan wel lopen.  ;D

Voor de relais om de baan mee af te schakelen zou ik vervolgens wel het current sink principe gebruiken. Gewoon een BC547 met een 1N4148. Overigens hebben die voor deze toepassing (blusdiode) ook de voorkeur boven de 1N4001. De 1N4148 is namelijk een high speed diode en kan dus sneller ingrijpen bij een piekspanning door de spoel. En ze kosten ook nog eens veeeeel minder  ;D

En misschien wel heel erg buitenom. Het is natuurlijk niet nodig één Arduino al het werk te laten doen. Je wilt ze toch al in netwerk gooien dus meerdere Arduino's gebruiken om wissels te schakelen is geen probleem. Kan je juist alle drukknoppen naar de Arduino Mega doen. Of juist hier ook een losse arduino voor pakken. Scheelt je al die (dure) bistabiele relais. Nadeel, code code code. Je zult dit wel weer in de code moeten opnemen. Extra voordeel, je kan de Arduino een schakelactie laten blokkeren uit veiligheidsoverweging. Bijvoorbeeld van een wissel die bereden wordt.

Heb je al meerdere Arduino's met elkaar laten praten?


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Klaas Zondervan op 30 augustus 2014, 00:17:34
De 1N4148 is namelijk een high speed diode en kan dus sneller ingrijpen bij een piekspanning door de spoel.
Hier is toch sprake van een misverstand. Als een stroomvoerende spoel wordt afgeschakeld, dan wil de opgeslagen magnetische energie de stroom in stand houden. Als er geen blusdiode aan zit, dan kan die stroom nergens naar toe, en zal een piekspanning veroorzaken. Maar een blusdiode zorgt er voor dat de stroom wel een pad vindt, en de spanning over de spoel wordt dan niet groter dan de drempelspanning van de diode. En die is voor de 1N4001 en de 1N4148 hetzelfde.
De 1N4148 is weliswaar sneller, maar dat speelt hier geen rol. Hij is nl. sneller bij de overgang van geleiden naar sperren, de z.g. reverse recovery time.
Maar in de functie als blusdiode gaat het om de overgang van sperren naar geleiden, en ik kan me niet voorstellen dat daar verschil in zit.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 30 augustus 2014, 02:37:26
Ah, tuurlijk  :-X Mijn fout, dat deel mag dus vergeten worden  ::) Bedankt voor het opfrissen Klaas  (y)


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 30 augustus 2014, 17:11:31
Hoi volgers

@klaas

Bedankt voor je input. (y)

@timo

Bedankt voor je input. (y)

Ik heb de laatste tijd even minder tijd om aan het programma te werken, ik heb ondertussen wel een versie klaar waar het automatische gedeelte is ingebouwd, maar bij het testen van het programma krijg ik nog veel foutmeldingen, standalone werk het wel, er zullen wel een aantal variabelen, constanten nog niet goed staan, word nog aan gewerkt.

Ik maak van relais gebruik omdat mij dat minder poorten kost.
Met gebruik van relais kost het mij maar twee poorten per wissel inclusief de terugmelding wisselstand en bezet melding van het bereden spoor naar het bedieningspaneel, als ik dat rechtstreeks door de Arduino zal doen kost het mij 5 poorten, 2 x wissel en twee leds (geel/groen) misschien met een stukje programma kan ik het met vier poortjes af, als ik 20 wissels( 20 wissels x 4 poorten 2x spoel en 1 keer led 1x bezetmelding ) past dus niet op 1 Arduino mega,  heb kost mij dat minimaal 2 Arduino mega voor alleen, de wissels te kunnen sturen met terugmelding wisselstand en bezetmelding bereden spoor.

Met een relais kost het veel minder poorten  van de arduino  (20 wissels = 40 poorten)  dan heb ik maar 1 Arduino mega nodig.

Ik denk dat het programma daardoor een stuk overzichtelijker blijft.

Voor de prijs van een relais hoef ik het niet te laten,  een bi-polair relais 12v kost euro 1,95 en een unipolair relais 12v kost  euro 0,70
Voor twintig wissels heb ik 20 bi-polair relais en 40 unpolaire wissels nodig.

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 30 augustus 2014, 21:46:33
Met een relais kost het veel minder poorten...
Nee hoor, zorg voor redelijke transistors (bijvoorbeeld dubbele ULN2003 ofzo, zitten ook mooi in een array => maakt simpele printen) en plaats ipv het monostabiel relais (jij noemt ze unpolaire) gelijk de wisselspoel. Zo spaar je al die 40 monostabiele relais uit. Is toch mooi 40 x 70 cent = 28 euro! Je bistabiele relais hou je gewoon parallel aan de wisselspoelen en je gebruikt maar twee pinnen per wissel.

Denk er met deze methode aan dat jij wel dat je met de arduino niet terug kunt lezen dat je hem met de hand bedient hebt. Dit kan prima werken maar de wisselstand "in het geheugen" van Arduino hoeft dus niet met de werkelijkheid overeen te komen. Iets wat je makkelijk kunt vergeten.

Waar je ook nog aan zou kunnen denken, je stuurt toch maar 1 wissel per keer, is om de wissels te gaan multiplexen. Door bijvoorbeeld alle rechtdoor en alle afbuigen aan elkaar te hangen aan de high side en dan de low side van iedere wissel via een transistor aan de arduino te hangen. Zo heb je 20 (wissels) + 2 (richting) = 22 pinnen nodig om alle wissels te sturen.  Wil je wissel 5 afbuigen dan stuur je de low side van wissel 5 samen met de afbuigen high side. Deel je zo in twee groepen zelfs maar 14 pinnen (10 wissels + 1 rechtdoor groep 1 + 1 rechtdoor groep 2 + 1 afbuigen groep 1 + 1 afbuigen groep 2 = 14). Wissel 12 rechtdoor wordt dan output 2 (voor wissel 2 en 12) aansturen en dan groep 2 rechtdoor aansturen. Over multiplexen (veelal met led's maar idee is hetzelfde) is genoeg op internet te vinden. Ik kan anders ook wel een schema maken, dan zal je zien dan het niet zo veel voor stelt als dat het nu lijkt.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 08 november 2014, 01:12:36
Hoi volgers

@Timo

Bedankt voor je input  (y)

@ allen

Nadat ik gehoord had dat mijn vader niet lang meer te leven had, ondertussen is mijn vader overleden,  heb ik een lange tijd geen interesse meer in modelspoor gehad, had andere dingen aan mijn hoofd.

Ik ben weer verder gegaan met mijn Arduino analoge modelbaan sturing.
Ik heb het na lang zoeken en programmeren de sturing werkend gekregen, hoewel het nog niet perfect is werkt het wel, via de seriele monitor in het Arduino programma of via putty kan ik commando's van de computer naar de Arduino sturen die weer de commando's naar de baan stuurt.

Op dit moment kan ik twee blokken en twee treinen sturen en een noodstop commando geven , er moeten op de analoge in poort van de Arduino nog een acht tal knoppen worden gemaakt om de baan zonder de seriele monitor of putty te bedienen.

Dat is tevens mijn volgende uitdaging om dat te realiseren en het programma daar op aan te passen.

De sturing moet nog wel verbeterd worden zoals de aansturing van de treinen in meer stappen nu 3 stappen later 6 stappen om op te trekken en om af te remmen.

Ook moet er nog een functie in om de treinen van richting te laten veranderen, zodat er twee kanten op gereden kan worden

Er moet nog een functie worden in gebouwd om elke locomotief zijn parameters move (locomotief, snelheid, richting) en locomotief type, dit wil ik doen via een seriele input functie, ik weet nog niet hoe ik dat moet programmeren, daar kom ik wel achter.

De parameters zien er als volgt uit : Br80, 0, 128, 1, deze gegevens wil ik zien op het lcd display.

Foto van de sturing .

(https://images.beneluxspoor.net/bnls/IMG_20141107_215839.jpg) (https://images.beneluxspoor.net/bnls/IMG_20141107_215839.jpg)

Filmpje van de Arduino analoge modelbaan sturing, het eerste test rondje.

http://youtu.be/mFR0suFjO38  (http://youtu.be/mFR0suFjO38)

Het programma:

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

/***** Global vars ***********************************************/


// Define I2C Address where the PCF8574A is
#define BACKLIGHT_PIN     3

LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // adressering lcd display

char incomingByte;

/******************************************************************************
 * Definitions
 ******************************************************************************
 *motor A is aangesloten op OUT1 en OUT2 van de motorsturing
 *motor B is aangesloten op OUT3 en OUT4 van de motorsturing
 ******************************************************************************/

const char StringMotorA[] = "motor A: ";
const char StringMotorB[] = "motor B: ";
const char StringFull[] = "full";
const char StringHalf[] = "half";
const char StringLow[] = "low";
const char StringSpeed[] = " speed";

// constants won't change. Used here to
// set pin numbers:

const int ledPin =  13; // Pin nummer LedPin
const int blok1Pin = 6; // Pin nummer Blok 1
const int blok2Pin = 7; // Pin nummer Blok 2

int Interval = 500;
//int wachtTrein = 3000;
//int BlokVrij = 10000; //automatische mode 10 seconden voor het blok vrij gegeven word.
int tijd = 2000;

// Variables will change:

//Motor A

int PWMA = 3; //Speed control
int AIN1 = 9; //Direction
int AIN2 = 8; //Direction

//Motor B

int PWMB = 5; //Speed control
int BIN1 = 11; //Direction
int BIN2 = 12; //Direction

int ledState = LOW;             // ledState used to set the LED
int wachtState = LOW;
int blokState = LOW;

long previousMillis = 0;        // will store last time LED was updated
//long previousMillisWacht = 0;       
//long previousMillisBlok = 0;

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.

//long interval = 500;           // interval at which to blink (milliseconds)

void setup(){

  lcd.begin (16,2);

  // Switch on the backlight

  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home ();                   // go home

  // Print a message to the LCD.

  lcd.setCursor(2,0); //Start at character 2 on line 0
  lcd.print("Arduino Uno");
  lcd.setCursor(1,1);
  lcd.print("L298  M-Sturing");

  Serial.begin(9600);

  Serial.println("Arduino test programma : Motorsturingen en blok meldingen");

  menu();

  // Set all the pins we need to output pins
  // pinMode(STBY, OUTPUT);

  pinMode(PWMA, OUTPUT);
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);

  pinMode(PWMB, OUTPUT);
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);

  pinMode(2, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(ledPin, OUTPUT);
}

void loop (){

  // Controlle led om te zien of het programma nog werkt.

  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis > Interval) {

    // save the last time you blinked the LED

    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:

    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:

    digitalWrite(ledPin, ledState);

  }

  if (Serial.available()) {

    //read serial as a character
    //char ser = Serial.read();

    if (Serial.available() > 0) {  // kijk of de seriele verbinding beschikbaar is.
      incomingByte = Serial.read(); // Lees een 'byte'.
    }

    // Begin Taak 1: Blok1 vrij

    if(incomingByte == '1') {
     
      lcd.home ();
      lcd.setCursor(0,1);
      lcd.print("Blok 1: vrijgave");
     
      Serial.println("Blok 1 : Vrij");
      digitalWrite(blok2Pin, HIGH);

      menu();
      prompt();   

    }

    // Einde Taak 1: Blok1 vrij 

    // Begin Taak 2: Blok 1 bezet 

      if(incomingByte == '2') {
     
       lcd.print("Blok 1: vrijgave");
       
      Serial.println("Blok 1 : Bezet");
      digitalWrite(blok2Pin, LOW);

      menu();
      prompt(); 

    }

    // Einde Taak 2: Blok 1 Bezet 

    // Begin Taak 3: Motor B aan

    if(incomingByte == '3') {
     
      lcd.home ();
      lcd.setCursor(1,1);
      lcd.print("   Speed low    ");
     
      Serial.println("Trein B: Low speed");
     
      move(1, 120, 1); //motor B, low speed, links
      schakeltijd();
     
      lcd.home ();
      lcd.setCursor(1,1);
      lcd.print("   Speed half   ");
     
      Serial.println("Trein B: Half speed");
     
      move(1, 150, 1); //motor B, half speed, links
      schakeltijd();
     
      lcd.home ();
      lcd.setCursor(1,1);
      lcd.print("   Speed full   ");
     
      Serial.println("Trein B: Full speed");
     
      move(1, 200, 1); //motor B, full speed, left
     
      Serial.println("Trein B rijd op full speed totdat er een stop comando komt.");

      menu();
      prompt();

    }

    // Einde Taak 3: Motor B on     

    // Begin Taak 4: Motor B off

    if(incomingByte == '4') {
     
     
      Serial.println("Trein B: Half speed");
     
      displ();
      lcd.print("   Speed half   ");

      move(1, 150, 1); //motor B, half speed, links
      schakeltijd();
     
      Serial.println("Trein B:  Low speed");
     
      displ();
      lcd.print("   Speed low   ");
     
      move(1, 120, 1); //motor B, low speed, links
      schakeltijd();
     
      Serial.println("Trein B: Stop");

      move(1, 0, 0); //motor B, stop

      Serial.println("Motor B staat stil omdat er een stop comando gegeven is.");

      displ();
      lcd.print("  trein stopt  ");
      schakeltijd();
      lcd.print(" Arduino trein ");
      menu();
      prompt();

    }
    // Einde Taak 4: Motor B off

    // Begin Taak 5 : Blok 2 On

    if(incomingByte =='5'){ 

      Serial.println("Blok 2 Vrij");
      digitalWrite(blok1Pin, HIGH);

      menu();
      prompt(); 

    }

    // Einde Taak 5 : Blok On

    // Begin Taak 6: Blok 2 Off

    if(incomingByte == '6') {

      Serial.println("Blok 2 Bezet");
      digitalWrite(blok1Pin, LOW);

      menu();
      prompt(); 

    }

    // Einde Taak 6: Blok 2 bezet

    // Begin Taak 7: Motor A On

    if(incomingByte == '7') {

      Serial.println("Trein A gaat vertrekken");
      Serial.println();
      Serial.println("Trein A: Low speed");
      lcd.print("   Speed low   ");
     
      move(0, 120, 1); //motor A, low speed, rechts
      schakeltijd();
     
      Serial.println("Trein A: Half speed");
      lcd.print("   Speed half   ");

      move(0, 150, 1); //motor A, half speed, rechts
      schakeltijd();
     
      Serial.println("Trein A: Full speed");
      lcd.print("   Speed full   ");

      move(0, 200, 1); //motor A, full speed, rechts

      Serial.println("Trein A rijd op full speed totdat er een stop comando komt.");

      menu();
      prompt();

    }

    // Einde Taak 7: Motor A on 

    // Begin Taak 8: Motor A Off

    if(incomingByte == '8') {

      Serial.println("Trein gaat stoppen");
      Serial.println("Trein A: Half speed");
      lcd.print("   Speed half   ");
     
      move(0, 170, 1); //motor A, half speed, rechts
      schakeltijd();
     
      Serial.println("Trein A:  Low speed");
      lcd.print("   Speed low   ");
     
      move(0, 120, 1); //motor A, low speed, rechts
      schakeltijd();
     
      Serial.println("Trein A: Stop");
      Serial.println("Trein A is gestopt omdat er een stop comando gegeven is.");
     
      move(0, 0, 0); //motor A, stop
     
      menu();
      prompt();

    }

    // Einde Taak 8: Motor B off

    // Begin Taak 9 : Noodstop

    if(incomingByte == '9') {

      Serial.println("Noodstop :Treinen A+B stop en blok 1+2 bezet");

      menu();
      noodstop();
      prompt();

      Serial.println("Trein 1 noodstop");
      Serial.println("Trein 2 noodstop");

      digitalWrite(blok1Pin, LOW);

      Serial.println("Blok 1: Bezet");

      digitalWrite(blok2Pin, LOW);

      Serial.println("Blok 2: Bezet");
     
      displ();
     
      lcd.print("Noodstop gemaakt");

      // Einde Taak 9 : Noodstop

    }
  }
}

void move(int motor, int speed, int direction){

  //Move specific motor at speed and direction
  //motor: 0 for B 1 for A
  //speed: 0 is off, and 255 is full speed
  //direction: 0 clockwise, 1 counter-clockwise

  boolean inPin1 = LOW;
  boolean inPin2 = HIGH;

  if(direction == 1){
    inPin1 = HIGH;
    inPin2 = LOW;

  }

  else{
    if(direction == 0) 
      inPin1 = LOW;
    inPin2 = HIGH;

  }

  if(motor == 1){
    digitalWrite(AIN1, inPin1);
    digitalWrite(AIN2, inPin2);
    analogWrite(PWMA, speed);

  }

  else{
    digitalWrite(BIN1, inPin1);
    digitalWrite(BIN2, inPin2);
    analogWrite(PWMB, speed);

  }
}

void noodstop(){

  //Motor A en B stoppen

  move(1, 0, 0);// motor A stop
  move(0, 0, 0);// motor B stop

}

void displ(){

  lcd.home ();                   // go home
  lcd.setCursor(1,1);
 
}

void schakeltijd(){

  delay(tijd);

}

void menu(){


  Serial.println();
  Serial.println("Stuur comando's");
  Serial.println();
  Serial.println("1 = Blok 1 vrijgeven            5 = Blok 2 vrijgeven");
  Serial.println("2 = Blok 1 bezet melden         6 = Blok 2 bezet melden");
  Serial.println("3 = Motor A starten             7 = Motor B starten");
  Serial.println("4 = Motor A stoppen             8 = Motor B stoppen");
  Serial.println("< = Motor linksom               > = Motor rechtsom");
  Serial.println();
  Serial.println("9 = Motoren A en B stoppen en blok 1 en 2 bezet melden");
  Serial.println();

}

void prompt(){

  Serial.println();
  Serial.println("Volgende comando >");
  Serial.println();

}

 


Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: tuurtje op 08 november 2014, 08:50:44
Beste Paul,

Mijn oprechte deelneming met het verlies van je vader.


m.vr.gr.

Arthur van Holst
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 17 november 2014, 13:07:21
Hoi volgers

@Arthur

Bedankt voor je medeleven.

@allen

Hoewel ik even niet actief op het forum en in mijn draadjes ben, ben ik wel verder gegaan met de sturing.

Het programma ben ik aan het aanpassen, het aantal blokken word uitgebreid naar 4 en word bediend door  een drukknop per blok, de motorsturing blijft hetzelfde , voorlopig blijft de sturing handbediend, het is al vrij ingewikkeld om een goed werkend programma te schrijven.

Er komt nog een uitbreiding bij namelijk een bleutooth verbinding met een tablet om daarmee de sturing te bedienen, de terminal bediening blijf gehandhaafd, zodat ik kan kiezen of ik de sturing kan bedienen met de computer of de tablet.

Ook zijn er plannen om eens wat meer te gaan doen met I2C om meerdere Arduino's met elkaar te verbinden, zodat de ene Arduino de blokken kan bedienen en de ander wissels en seinen.

Ik ben bezig om een kleine Arduino print (7x5 cm) te ontwerpen zodat ik de standaard Arduino voor andere projecten kan gebruiken.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 17 november 2014, 13:45:23
Paul, tenzij je het heel leuk vindt om printjes te ontwerpen en maken zou ik je aanraden om een Arduino pro mini of een nano te gebruiken voor je stationaire opstelling.
Elders op het forum is een draadje over gebruik van een pro mini. (Weet uit mijn hoofd de naam even niet)

Leuk draadje trouwens. Ik lees graag mee met je ervaringen.

Gr. Frits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 17 november 2014, 17:33:57
hoi, Frits

Bedankt voor je reactie

Ik vind het leuk om printjes te ontwerpen, maar het is meer voor de nette/storingvrije werking van mijn modelbaan sturing, aangezien het geheel analoog is is de kans op een kleine kortsluiting zeer aanwezig, als ik een pro of nano zou gebruiken moet ik het gehele pro of nano vervangen, op mijn eigen print gebruik ik een dip atmega 328, mocht daar een poort kapot gaan hoef ik alleen een andere atmega 328 er in te zetten.

Voor het gebruik heb je een print nodig om de pro of nano op te solderen, de ervaring leert dat de bedrading onder de print vaak storingen geeft naar de diverse connectoren op de print.

Mijn voorkeur gaat dan ook uit naar een arduino print.


 
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 17 november 2014, 20:46:16
Je kunt gewoon een print ontwerpen voor een pro mini in zijn geheel. Gewoon een rij pinheaders om hem in te drukken, zelfde als een Arduino Uno zijn shield verwacht. Met zoiets kleins als een pro mini net zo solide als een dip socket. En tuurlijk kan je een dip AVR gebruiken op je eigen print. Maar de prijs van een complete pro mini is al lager dan een losse AVR328. En dan krijg je de benodigde condensatoren en spanningregelaar cadeau! Dat was voor mij de reden om een print rondom de pro mini te ontwerpen.

En nogmaals I2C is alleen geschikt voor korte afstanden. Redelijk storingsgevoelig anders. Dus goed als je alle arduino's naast elkaar dumpt maar minder geschikt om modulair onder de baan te bouwen.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 17 november 2014, 23:45:47
Hoi Timo

Bedankt voor je input

Ik weet dat I2C alleen goed werkt op korte afstanden, maar het is ook niet de bedoeling om onder elke module een aparte sturing te zetten.
De modules worden op een plaats samengebracht en vandaar uit lopen er kabeltjes (geen losse draden) naar de wissels, seinen en andere componenten, elk kabeltje heeft een eigen codering zodat ik ze snel kan terug vinden in de documentatie.

Ik heb het niet op met de Arduino pro mini( ik heb daar nog geen ervaring mee, wel de specificaties bekeken),  er zit daar geen usb aansluiting op zodat ik hem iedere keer uit de print moet verwijderen om het programma evt. te updaten, wil ik de pro mini gebruiken voor de sturing met de computer / of smartphone ,zal ik daar een bluetooth seriele verbinding bij moet maken, en het lukt helaas niet om met bluetooth een programma te downloaden naar de pro mini.
 
Of ik een print ontwerp voor een dip avr328 of een pro maakt mij niet uit ontwerpen moet je het toch met dezelfde specificatie voor beide ontwerpen.

Het kunnen best vooroordelen zijn, maar zo zie ik het nu tenzij het tegendeel bewezen kan worden ;D

Vanavond op de clubavond heb ik de analoge modelbaan sturing , bedient met mijn smartphone, het werkte nog ook ;D
Helaas blijkt een bluetooth verbinding met de Arduino niet erg stabiel ::)
Als de verbindig wegvalt kan ik de treinbaan niet meer bedienen, moet er maar voor de zekerheid een hardwarematige noodstop bij maken. ;D

Het optrekken van de trein gaat best wel netjes zoals het programma nu is, helaas heb ik dat alleen kunnen bereiken door de delay functie te gebruiken, voor handbediening vind ik dat niet zo erg, maar wil ik automatische rijden zal ik daar toch een betere tijdvertraging moeten gebruiken.

Ik ben op dit moment bezig met het, her programmeren van de sturing van de grond af aan, om het programma beter leesbaar te maken, voor als er mensen zijn die er verder mee willen.

mvg Paul


Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 18 november 2014, 12:14:56
Hoi Paul,

Een losse AVR heeft ook geen USB. Die zal je er ook uit moeten halen om te programmeren. Overigens hoeft hij er niet uit, als je de boel goed ontwerpt kan het gewoon in circuit. Er zit op de pro mini gewoon een header voor op. Een pro mini is dus eigenlijk gewoon een losse Atmega alleen dan met alle randcomponenten er al op. En dat voor een lagere prijs dan een losse Atmega...

En dat goed ontwerpen geld voor alles, losse Atmege, Arduino Pro Mini, Arduino Uno, Arduino Mega enz. Ze gebruiken allemaal de UART (serieel) om het programma in de uC te krijgen. En als je deze ook voor iets anders gebruikt, zoals bluetooth, zal je er zeker van moeten zijn dat dit geen obstakel vormt tijdens het programmeren.

Zou wel goed bezig gaan met het onderzoeken hoe je een delay kunt gebruiken zonder de delay. Heb je misschien de code die je nu hebt? Dan kan ik je misschien op weg helpen. Snap ook als je zegt dat je eerst de boel leesbaarder wilt maken. Word ik alleen maar blij van  ;D


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: tuurtje op 18 november 2014, 12:20:39
Hi Allen,

Ik volg dit nog steeds met grote interesse  (y)
Alleen meen ik mij ter herinneren toen Philips de I2C bus ontwikkelde niet alleen voor de korte afstand was.
Dus ben zo vrij geweest om even te googlen.

http://www.nodo-domotica.nl/forum/viewtopic.php?f=4&t=1580 (http://www.nodo-domotica.nl/forum/viewtopic.php?f=4&t=1580)

Groetjes

Arthur
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 18 november 2014, 12:39:49
Dat het werkt zegt niet dat het goed is. I2C is bedoelt voor korte afstanden. Enkele meters max. Met buffers wel op te rekken maar blijft redelijk storingsgevoelig. Als iets 99% van de tijd blijft het erg vervelend dat het 1% van de tijd niet werkt. Met shielding enzo kan je al wat weg werken enzo. Maar zo uit de Arduino zelf is  I2C niet geschikt voor lange afstanden. Zie ook de Wiki (http://whttp://en.wikipedia.org/wiki/I%C2%B2C).

Ben voor afstanden daarom meer gecharmeerd van RS485. Maar als ze bij elkaar komen te zitten is dat allemaal niet nodig :)


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: tuurtje op 18 november 2014, 13:12:01
Hi Timo,

Helemaal mee eens, ik wil niet te ver afdwalen van het eigenlijke onderwerp.
Maar als ik soms de netwerk testen zie van een industrieel netwerk (profibus, RS485 layer) dan denk ik oei  of de bussnelheid omlaag of een beter kabel nemen.
En op die kabel (=koper) wordt nog wel eens te veel bezuinigd wat een betrouwbaar netwerk niet bevorderd.
Om nog maar te zwijgen over de shielding van de kabels. De kan je dagen over discussiëren.  ;D

Gelukkig van dat in onze eigen model wereld nog wel mee.

Groetjes

Arthur


Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 23 november 2014, 20:39:51
Hoi volgers

@ Timo en Arthur

Bedankt voor het meedenken.

@allen

Het I2C protocol is in de loop der jaren sterk verbeterd, we komen het overal tegen.
De tegenwoordige computer motherboarden zijn voorzien van het I2C om de sensoren te kunnen uitlezen naar het scherm,ook word het gebruikt door het motherboard om de diverse sensoren onboard te kunnen uitlezen.

Ik wil zeggen dat het huidige I2C voor 100% betrouwbaar is.
Voor mijn analoge modelbaan sturing maak ik ook gebruik  van I2C.

In de pen zit nog een wisselsturing en een seinsturing en evt nog een bloksturing die via I2C   
In grove lijnen heb ik de communicatie tussen de diverse Arduino's werkend maar nog niet in de vorm voor de analoge modelbaan sturing.

De master luistert naar de I2bus en de twee Arduino's melden zich met hun kenmerk (naam) ik kan met meer Arduino's in het systeem opnemen zonder dat ze elkaar in de weg zitten.
Ik moet er alleen voor zorgen dat elke Arduino een eigen adres heeft.

Analoge modelbaan sturing.

Ik ben weer heel wat avonden bezig geweest met de Arduino analoge modelbaan sturing, ik heb het programma flink zitten wijzigen.

De sturing in drie stappen heb ik vervangen voor een traploze regeling.
De functie void move heb ik veranderd in void sturing.
Er is nu een functie ingebouwd om linksom en rechtsom te kunnen rijden.
De functie trein 1 en trein 2 heb ik er uit gehaald, het is veranderd in trein linksom en trein rechtsom.

Doordat de regeling in drie stappen is verwijderd heb ik ook geen wachtlussen meer nodig, die code heb ik er ook uitgehaald.
Ook is de code opgeschoond zodat er geen overtollige programmeer code meer instaat.

Hoewel het programma nog lang niet compleet is werk het stuur gedeelte van de treinen goed, zowel in simulatie mode (een andere Arduino UNO) als in real mode gekoppeld aan mijn proefbaantje.

Ik wil er alleen op korte termijn wel een bleutooth communicatie er bij hebben, in een proef op stelling werkt het goed, en nog een voordeel het kost geen programmeercode om het te laten werken, je kan het direct aansluiten op de rx/tx poort van de Arduino en het werkt.
Helaas was de verbinding niet erg betrouwbaar, viel regelmatig weg, waardoor ik de Arduino niet kon bedienen, alleen een harde reset werk dan nog.

Ik ga er maar een hardwarematige oplossing voor een noodstop maken, om in geval van nood de baanspanning te kunnen uitschakelen.

Er zijn nog een aantal functies die ik in het programma wil gaan maken.

Een verbeterde bloksturing. (met behulp van reed contacten)
Bluetooth communicatie.
Een verbeterde terminal bediening.
Een grafische bediening met Gambas, is de visual basic programmeer omgeving van Linux.
Een I2C sturing waarbij de Arduino Leonardo als master gaat dienen.
De  Arduino Leonardo heeft de voorkeur omdat je daarmee een toetsenbord kan gebruiken voor het geven van commando's zonder een computer nodig te hebben (tenminste dat heb ik zo begrepen, mocht het anders zijn hoor ik dat graag.)

Ook staat er een wisselsturing via de Arduino en een sein sturing en evt een bloksturing(uitgebreid) nog op het verlanglijstje.

Hoewel het programma nog niet van de grond opnieuw is opgebouwd, ik heb het programma gewijzigd, sommige functies zijn nog niet of nauwelijks beschreven en er kan nog andere commentaar in staan die niet helemaal meer klopt, en het kan er wat rommelig uitzien.

Als ik tevreden ben met deze versie ga ik het programma opnieuw van de grond opbouwen.

Voor de mensen die gedesinteresseerd zijn zal ik het programma er bij zetten in dit topic.

/*  Arduino analoge modelbaan sturing.
   
   Auteur : Paul Smits
   
   Versie 4.6 (is nog in testfase)
   
   Nieuwe functie sturing(trein,snelheid,richting)
   Vervangt de functie move(motor,speed,direction)
   Zijn feitelijk dezelfde functie alleen omgezet naar de modelbaansturing.
   
   Het in stappen optrekken en afremmen is er uit gehaald.
   De trein trekt nu langzaam op of remt nu langzaam af zonder stappen.
   
   Deze software is vrij aanpasbaar en kan door iedereen gebruikt worden,
   voor zijn eigen modelbaan of eigen project.
   
   LET OP !:Het gebruik van het programma geschied op eigen risico.
*/

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h> // library voor 12c lcd display

/***** Global vars ***********************************************/

// Define I2C Address where the PCF8574A is
#define BACKLIGHT_PIN     3

LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // adressering lcd display

char incomingByte;

/******************************************************************************
 * Definitions
 ******************************************************************************
 *motor A is aangesloten op OUT1 en OUT2 van de motorsturing
 *motor B is aangesloten op OUT3 en OUT4 van de motorsturing
 ******************************************************************************/

// constants won't change. Used here to
// set pin numbers:

const int ledPin =  13; // Pin nummer LedPin
const int blok1Pin = 6; // Pin nummer Blok 1
const int blok2Pin = 7; // Pin nummer Blok 2

int Interval = 500;

// Variables will change:

//Motor A

int PWMA = 3; //Speed control
int AIN1 = 9; //Direction
int AIN2 = 8; //Direction

//Motor B

int PWMB = 5; //Speed control
int BIN1 = 11; //Direction
int BIN2 = 12; //Direction

int ledState = LOW;             // ledState used to set the LED

long previousMillis = 0;        // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.

void setup(){

  lcd.begin (16,2);

  // Switch on the backlight

  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home ();                   // go home

  // Print a message to the LCD.

  lcd.setCursor(2,0); //Start at character 2 on line 0
  lcd.print("Arduino Uno");
  lcd.setCursor(1,1);
  lcd.print("L298  M-Sturing");

  Serial.begin(9600);

  Serial.println("Arduino test programma : Motorsturingen en blok meldingen");

  menu();

  // Set all the pins we need to output pins
  // pinMode(STBY, OUTPUT);

  pinMode(PWMA, OUTPUT);
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);

  pinMode(PWMB, OUTPUT);
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);

  pinMode(2, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(ledPin, OUTPUT);
}

void loop (){

  // Controlle led om te zien of het programma nog werkt.

  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis > Interval) {

    // save the last time you blinked the LED

    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:

    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:

    digitalWrite(ledPin, ledState);

  }

    if (Serial.available()) {

    //read serial as a character
    //char ser = Serial.read();

    if (Serial.available() > 0) {  // kijk of de seriele verbinding beschikbaar is.
      incomingByte = Serial.read(); // Lees een 'byte'.
    }

    // Begin Taak 1: Blok1 vrij

    if(incomingByte == '1') {
     
      lcd.home ();
      lcd.setCursor(0,1);
      lcd.print("Blok 1: Vrijgave");
     
      Serial.println("Blok 1 : Vrij");
      digitalWrite(blok2Pin, HIGH);

      menu();
   
    }

    // Einde Taak 1: Blok1 vrij 

    // Begin Taak 2: Blok 1 bezet 

      if(incomingByte == '2') {
     
      lcd.home ();
      lcd.setCursor(1,1);
      lcd.print("Blok 1: Bezet  ");
       
      Serial.println("Blok 1: Bezet");
      digitalWrite(blok2Pin, LOW);

      menu();
     
    }

    // Einde Taak 2: Blok 1 Bezet 

    // Begin Taak 3: Motor B aan

    if(incomingByte == '3') {
     
      lcd.home ();
      lcd.setCursor(0,1);
      lcd.print("Trein 1: Rijdt  ");
         
      int value;
      for(value = 60 ; value <= 250; value++)
{
   
       sturing(1,value,1);
       delay(60);
}     
     
      Serial.println("Trein 1: Rijdt linksom");
      Serial.println("Trein 1: Rijd op maximale snelheid, totdat er een stop commando komt.");

      menu();
 
    }

    // Einde Taak 3: Motor B on     

    // Begin Taak 4: Motor B off

    if(incomingByte == '4') {
     
      lcd.home ();
      lcd.setCursor(0,1);
      lcd.print("Trein 1: Gestopt");
     
      int value;
     
      for(value = 250 ; value >= 0; value--)
{
      sturing(1, value, 1);
      delay(30);
     
}
     
      Serial.println("Trein 1: Linksom, is gestopt");
      Serial.println("Trein 1: Staat stil omdat er een stop commando gegeven is.");

      menu();
     
    }
    // Einde Taak 4: Motor B off

    // Begin Taak 5 : Blok 2 On

    if(incomingByte =='5'){ 
       
      lcd.home ();
      lcd.setCursor(0,1);
      lcd.print("Blok 2: Vrijgave");

      Serial.println("Blok 2: Vrij");
      digitalWrite(blok1Pin, HIGH);

      menu();
     
    }

    // Einde Taak 5 : Blok On

    // Begin Taak 6: Blok 2 Off

    if(incomingByte == '6') {
     
      lcd.home ();
      lcd.setCursor(0,1);
      lcd.print("Blok 2: Bezet   ");

      Serial.println("Blok 2: Bezet");
      digitalWrite(blok1Pin, LOW);

      menu();
     
    }

    // Einde Taak 6: Blok 2 bezet

    // Begin Taak 7: Motor A On

    if(incomingByte == '7') {

      int value;
      for(value = 60 ; value <= 250; value++)
{
   
       sturing(1,value,0);
       delay(60);
}           
      Serial.println("Trein 1 : Rijdt rechtsom");
      Serial.println("Trein 1 : Rijdt op maximale snelheid, totdat er een stop commando komt.");

      menu();
     
    }

    // Einde Taak 7: Motor A on 

    // Begin Taak 8: Motor A Off

    if(incomingByte == '8') {

      int value;
     
      for(value = 250 ; value >= 0; value--)
{
      sturing(1, value, 0);
      delay(30);
}
     
      Serial.println("Trein 1: Rechtom, gaat stoppen");
      Serial.println("Trein 1: Is gestopt omdat er een stop commando gegeven is.");

      menu();
     
    }

    // Einde Taak 8: Motor B off

    // Begin Taak 9 : Noodstop

    if(incomingByte == '9') {
     
      lcd.home ();
      lcd.setCursor(0,1);
      lcd.print("Noodstop trein");

      Serial.println("Noodstop :Treinen A+B stop en blok 1+2 bezet");

      menu();
     
      sturing(1, 0, 0);// Trein 1 stop
      Serial.println("Trein 1 noodstop");
     
      sturing(0, 0, 0);// Trein 2 stop
      Serial.println("Trein 2 noodstop");

      digitalWrite(blok1Pin, LOW);
      Serial.println("Blok 1: Bezet");

      digitalWrite(blok2Pin, LOW);
      Serial.println("Blok 2: Bezet");
         
      // Einde Taak 9 : Noodstop

    }
  }
}

void sturing(int trein, int snelheid, int richting){

  //Move specific motor at speed and direction
  //motor: 0 for B 1 for A
  //speed: 0 is off, and 255 is full speed
  //direction: 0 clockwise, 1 counter-clockwise

  boolean inPin1 = LOW;
  boolean inPin2 = HIGH;

  if(richting == 1){
    inPin1 = HIGH;
    inPin2 = LOW;

  }

  else{
    if(richting == 0) 
    inPin1 = LOW;
    inPin2 = HIGH;

  }

  if(trein == 1){
    digitalWrite(AIN1, inPin1);
    digitalWrite(AIN2, inPin2);
    analogWrite(PWMA, snelheid);

  }

  else{
    digitalWrite(BIN1, inPin1);
    digitalWrite(BIN2, inPin2);
    analogWrite(PWMB, snelheid);

  }
}


void menu(){


  Serial.println();
  Serial.println("Stuur comando's");
  Serial.println();
  Serial.println("1 = Blok 1 vrijgeven            5 = Blok 2 vrijgeven");
  Serial.println("2 = Blok 1 bezet melden         6 = Blok 2 bezet melden");
  Serial.println("3 = Trein linksom starten       7 = Trein rechtsom starten");
  Serial.println("4 = Trein linksom stoppen       8 = Trein rechtsom stoppen");
  Serial.println("9 = Trein noodstop");
  Serial.println();
  Serial.println("Volgende comando >");
  Serial.println();
}

Ik zal straks kijken of ik een filmpje kan maken van de trein die rijd met de Arduino analoge modelbaan sturing.

Voor op/aan/verbeter opmerking hou ik mijn aanbevolen.

Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: dimo1_dimo1 op 23 november 2014, 20:58:08
code even snel doorlopen.. de functie menu is denk ik eerder iets van drawMenu :)

Citaat
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
dit kan een stuk eenvoudiger.. het kan ook zo:
Citaat
ledState!=ledState;
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Peter van der Leek op 23 november 2014, 21:02:50
Ik zou het op ledState = !ledState houden.
Bovendien hangt jouw verkorte statement wel af van de daadwerkelijke waardes van HIGH en LOW. Jij gaat er van uit dat die TRUE en FALSE zijn.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: ROn30 op 23 november 2014, 21:15:07
Ik heb het niet op met de Arduino pro mini( ik heb daar nog geen ervaring mee, wel de specificaties bekeken),  er zit daar geen usb aansluiting op zodat ik hem iedere keer uit de print moet verwijderen om het programma evt. te updaten, wil ik de pro mini gebruiken voor de sturing met de computer / of smartphone ,zal ik daar een bluetooth seriele verbinding bij moet maken, en het lukt helaas niet om met bluetooth een programma te downloaden naar de pro mini.

Paul,

Mogelijk is de Nano V3 een goed alternatief? paar euro meer een 328 inclusief USB en kabeltje.
Ik gebruik de Nano als DCC command station.

DX.com (http://www.dx.com/p/arduino-nano-v3-0-81877#.VHI8EhF0y03)
miniinthebox.com (http://www.miniinthebox.com/nl/nano-v3-0-avr-atmega328-p-20au-module-board-usb-kabel-voor-arduino-blauw-zwart_p638909.html)

cmdrarduino (http://railstars.com/software/cmdrarduino/)



Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 23 november 2014, 23:49:40
Hoi volgers

@ROn30 , Peter, Dimo

Bedank voor jullie input.

@ROn30

Bedankt voor je tip.

De nano zou een mogelijkheid zijn maar ook de nano moet op een motherboard komen, er zal dan toch ook een print voor gemaakt moeten worden.

Mijn voorkeur ligt nog steeds bij het zelf ontwerpen van een arduino print.

@allen

Ik ben nog even verder gegaan met het programma, ik heb er nu een bluetooth verbinding met de arduino beschikbaar, en het werk.
Ik kan nu met mijn smartphone de Arduino analoge modelbaan sturing bedienen zonder dat deze aan de computer zit.

Zoals belooft heb ik een filmpje gemaakt van de sturing van de trein met de arduino analoge modelspoor sturing.

De kwalitijd van het filmpje is niet zo goed, maar het gaat om het idee.

Het filmpje http://youtu.be/KN-rbEq3ceE  (http://youtu.be/KN-rbEq3ceE)

Paul

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 24 november 2014, 16:33:11
Hoi Paul,

Je bent weer goed bezig! Mag ik na een snelle scan door de code toch weer wat opmerkingen geven?

Beginnende bij I2C. Je hoeft mij niet te overtuigen dat het een prima bus is. Je moet alleen wel aan de voorwaarde voldoen van de bus en dat is geen lange draden. Plaats je alle printen, zoals jij, bij elkaar is dat geen probleem. Ga je ze alleen verspreiden onder de tafel (iets dat me voor een echte baan handig lijkt) is het vragen om problemen.

Het eerste wat me opvalt is dat de code uitlijning niet altijd klopt. Dit is niet zo goed voor de meesbaarheid en je zal niet de eerste zijn die zich daardoor in de vingers snijdt. Zorg dus dat je bij een functie, if, else, en switch gebruikt maakt van een inspring en dat de sluit } op dezelfde hoogte staat als hetgeen waar de { bij hoort. Voorbeelden zijn te vinden bij alle incomming byte checks, daar staan de brackets van de for-loop gewoon tegen de kantlijn. Of op regel 137, het hele blok erna hoort ingesprongen te zijn omdat het onderdeel van de if is.

Om daar gelijk verder te gaan, je hebt daar twee checks voor serial.available, de tweede mag weg.

Ook valt me op dat je nu veel tekst naar de computer stuurt. Dit is wel leuk voor in een terminal maar het idee was toch om een programma te gebruiken? Tekst kost namelijk echt enorm veel ruimte vergeleken met de code. Het zou dus enorm schelen als je de tekste op de computer laat genereren en alleen een commando naar de PC stuurt.

En dan het grootste wat me opvalt, je hebt nog steeds niet af van je delay  ;D Voor eht optrekken en afremmen maak je daar nog gebruik van. In die tijd kan je dus geen andere taken doen, zelfs geen noodstop. Denk dat je hier dus nog wel vanaf zou moeten willen.

Bij sturing, in de comment heb je het over de var motor maar je gebruikt trein. Ik moet zeggen, ik zou de var motor logischer vinden. Ook heb je nu dat motor A = 1 en motor B = 0. Werkt wel, maar lijkt me niet meest logische...

In de setup doe je netjes pinmode geven. Maar er vallen nog twee dingen op. Waar zijn pin 2, 4, 6, 7 en 10 voor? Naamloze pinnen die je output maakt maar ik nergens in de code terug kan vinden. Ook zou ik je willen aanraden om de pinMode als eerste in de setup te doen. Een pin is standaard een output als de Arduino opstart. Deze pinnen zweven dus. Dit betekend ook dat de ingangen van je motordriver tijdens het opstarten misschien HIGH kunnen worden en je motor/trein laten rijden. Dus in de setup eerst de belangrijke dingen (pinMode), dan minder belangrijke dingen opzetten (lcd enzo) en dan pas beginnen met de minder belangrijke dingen als het printen van teksten.

En hoe is het kruipen? Blijft het mooi rijden op lage snelheden? Anders moet je nog maar in dit draadje (http://forum.beneluxspoor.net/index.php/topic,61692.0.html) om te kijken om hoe stilstand kleef te overwinnen.


Succes verder!

Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 25 november 2014, 00:09:38
Hoi volgers

@Timo

Bedankt voor je input.

Helaas was deze versie van het programma, de test versie en de commentaren waren nog niet aangepast.

De opmerking van het I2C was algemeen bedoeld.

Wat betreft de code er zitten inderdaad nog slordigheidjes in de code.
De delay(30) had ik er in gezet voor test doeleinden.

De terminal bediening heb ik nodig om er mee te kunnen werken.

Ik ben inderdaad nog bezig met het programma, ik heb geen Windows meer op de computer staan, ik heb tegenwoordig linux op de computer staan.

Ik kan niet meer in visual basic programmeren en moet derhalve met een linux visual programmeertaal  gaan werken, ik heb er ondertussen een gevonden die sterk lijkt op visual basic (gambas)

Ik ben er mee aan de slag gegaan met het onderstaande resultaat.
Voor de duidelijkheid dit is een aangepast programma, ik heb het niet zelf geschreven (ben ik te lui voor ;D  of word ook wel gezegd, ik ga het wiel niet opnieuw uitvinden.  ::) ), ik heb het alleen aan mijn eigen behoefde aangepast.

Er zal wel nog meer worden aangepast maar dat komt wel, voor nu werk het goed.

(https://images.beneluxspoor.net/bnls/Schermafdruk_1.jpg) (https://images.beneluxspoor.net/bnls/Schermafdruk_1.jpg)

Het heeft niet de mooiste interface maar het werkt wel, zoals je ziet is het menu in het Arduino programma verwijderd en word het menu in de interface getoond.

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 25 november 2014, 11:33:54
De delay(30) had ik er in gezet voor test doeleinden.
Maar het doet nu wel iets belangrijks, het rampen van de snelheid. Ik denk dat je het het makkelijkste op kunt lossen door twee speed functies te maken. Laten we zeggen speedSet(int motor, int speed) waarmee je de snelheid voor een spoor instelt (direction kan je achterwegen laten, achteruit is dan gewoon een negatieve waarde, vooruit max = 255, achteruit max = -255). En speedCheck(), een functie die je in de loop opneemt en die checkt wat de huidige snelheid is, wat de set snelheid is en of het tijd is om de snelheid te verhogen/verlagen (van beide motoren).

De terminal bediening heb ik nodig om er mee te kunnen werken.
Snap ik, maar probeer alleen korte data heen en weer te sturen. Zou hou je veel ruimte en tijd in de Arduino over. Op dit moment staat de Arduino zich nog stierlijk te vervelen maar dat zal anders zijn als je het programma uitbreid.

Ik ben inderdaad nog bezig met het programma, ik heb geen Windows meer op de computer staan, ik heb tegenwoordig linux op de computer staan.

Er zal wel nog meer worden aangepast maar dat komt wel, voor nu werk het goed.
Leuk begin  :) Ik zou alleen de baud rate opvoeren. De Arduino doet de UART toch met hardware en dan is de data alleen maar sneller bij de PC. 115200 baud zou geen probleem moeten zijn. Ook zou je als extra check parity aan kunnen zetten om foute overdrachten af te vangen. Je krijgt dan Serial.begin(115200, SERIAL_8E1) voor 115200 baud met even parity en 1 stop bit.

Zelf zou ik iets meer proberen een algemeen protocol te gaan maken. Voor nu, met twee blokken, is het nog te overzien, maar hoe wil je dit later doen? Ik zou iets doen als 'b01' versturen naar de PC betekend "blok 1 bezet". 'v12' voor 'blok 12 vrij'. 's02100' voor 'speed blok 2 op 100' enz.

Of helemaal afstappen van ASCII. Immers wordt er dan voor 's02100' 6 bytes verstuurd terwijl 3 ook genoeg was. Eén commando, één blok (byte tussen 0 en 255) en één voor snelheid. Toegeven, nog niets voor richting gedaan.

Maar goed, genoeg gezeur  ;D Je bent lekker bezig!


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 28 november 2014, 23:06:28
Hoi volgers

@Timo

Bedankt voor je input.

Pfft, mijn hersens gaan nu echt koken ;D

Hoi Timo

Je hebt het over het rampen, zou niet weten wat het is.

Delay(30)  heb ik gebruikt om het rijgedrag van de loc te bekijken, normaal staat delay op 10 milliseconden waardoor de trein iets sneller optrekt en afremt, deze delay word nog vervangen door een potmeter waarde waarmee ik de locomotieven kan fijn afregelen.
De potmeter waarde is in elk blok gelijk,  tenzij ik aan de potmeter draai dan zal de waarde van alle blokken wijzigen, tenminste dat is de bedoeling.

Het idee van twee snelheid-functie is mijn niet helemaal duidelijk !
Ik gebruik maar 1 motor(trein),  motor 2 word niet gebruikt vooralsnog, het is misschien wel zonde van de dubbele motorsturing maar ach die kosten niet zo veel  ;) 2,59 euro
De tweede motorpoort is bedoelt voor de hoofdbaan (dat komt later, heb nu alleen een klein proefbaantje om de sturing te testen).
Schakel ik blok 1 uit dan kan er nog gereden worden op blok 2.

[even er tussendoor]

Nog even een antwoord op je vraag :
Citaat
Waar zijn pin 2, 4, 6, 7 en 10 voor?
Pin 6 en 7 zijn gebruikt voor de blokken (blok 1 en 2).
Pin 2, 4, 10 zijn nu nog niet in gebruik maar worden voor nieuw te maken blokken gebruikt.

Even voor de duidelijkheid de blokken worden via een relais stroomloos gemaakt (het blijft een analoge bediening) de trein kan dan wel doorrijden via het hoofdspoor maar de uitwijk sporen(blokken) en station sporen(blokken) en schaduwstation sporen(blokken) worden stroomloos gemaakt, feitelijk gezien is deze sturing niet meer dan een digitaal bedieningspaneel. ;D ,alleen het optrekken en afremmen gaat automatisch.

Alleen op de hoofdbaan wil ik met automatische blokken gaan werken, maar dat komt later.

Als het digitale bedieningspaneel goed werk ga ik me pas bezig houden met automatische rijden van de treinen.

[einde even er tussendoor]

Het is ook nog steeds de bedoeling om het met een programma op de computer aan te sturen, heb ook al weer een nieuwe versie die met knoppen werkt, van de ASCII zal ik waarschijnlijk niet afstappen, in de Arduino moet het ook mogelijk zijn om complete strings te ontvangen en te verzenden via de seriële poort en daar mee commando's naar de Arduino te verzenden, dat moet ik nog verder uitzoeken hoe ik dat programmeer.

Dat heb ik al geprobeerd maar het werk niet ook met het Arduino-IDE de kan ik de snelheid niet hoger zetten op de een of andere manier werkt de communicatie dan niet, vandaar dat ik het standaard op 9600 baud heb staan.(Snelheid is ook niet alles  ;D).

De nieuwe interface:
(https://images.beneluxspoor.net/bnls/Schermafdruk_2.jpg) (https://images.beneluxspoor.net/bnls/Schermafdruk_2.jpg)

Ik zie nu dat er een foutje :o in de knoppen zit, word er in de volgende versie wel weer veranderd.

Alle opmerkingen, aanvullingen, verbeteringen en dergelijke zijn altijd welkom.

Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: dimo1_dimo1 op 29 november 2014, 10:27:55
In de Arduino ide kan je rechts onderin het seriële scherm de baudrate instellen.. Die heb ik nu standaard op 115200 staan anders heb je redelijk grote vertragingen in je programma zitten als je wat langere strings verzend via de uart
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 29 november 2014, 21:19:14
Je hebt het over het rampen, zou niet weten wat het is.
Ik bedoel hier het Engelse woord ramp, een helling. Dus in dit geval het opvoeren of afnemen van de snelheid (optrek en afremvertraging). Hiervoor wil je geen delay functie voor gebruiken, of dit nu 10us, 30us of variabel is. Sterker nog, je wil zelden de delay gebruiken. Je blokkeert hiermee het hele programma. In de tijd dat je in de delay zit kun je nergens op reageren. Lees het stuk op Arduino nog maar eens door, Blink without delay (http://arduino.cc/en/Tutorial/BlinkWithoutDelay).

Wat ik dan bedoelde met twee functies is het volgende. Je maakt één functie waarmee je op het gewenste moment in het programma de uiteindelijk gewenste snelheid vast legt. Deze functie riep je dan aan als er een commando via de computer, een schakelaar of hoe dan ook gegeven wordt. Maar op het moment dat je deze functie aanroept doe je nog niets met de motordriver. Deze functie noemde ik voor het gemak speedSet(), zegt duidelijk wat het doet.

Daarnaast maar je een functie die je op neemt in de loop. Deze wordt dus gewoon heel vaak aangeroepen. Deze functie laat je twee dingen checken. Is de huidige snelheid waarmee de loc rijdt anders dan de gewenste (eind) snelheid? (Die je dus opgeslagen hebt met speedSet().) Zo ja, is het al tijd om de snelheid op te hogen (of te verlagen voor remmen)? Zo ja, pas de snelheid van de motordriver aan en stel weer een vertraging in (welke je aanpasbaar kunt maken om sneller of langzamer op te trekken/vertragen). Zo nee, doe niets een ga door met de rest van het programma een wacht tot er weer gecontroleerd moet worden. Deze functie beschreef ik als speedCheck(). Op deze manier heb je geen delay nodig en kan je een stuk meer doen, oa reageren op en noodstop of het tussentijds wijzigen van de snelheid. Als het nog onduidelijk is zal ook wel (pseudo) code schrijven.

Heeft dus op zich niets te maken met de tweede motordriver. Dat is gewoon meer van hetzelfde. Maar ik zou het uiteindelijk in ieder geval zo doen dat een motor driver maar één loc aan moet sturen. Maar dit staat dus los van de twee genoemd functies.

Nog even een antwoord op je vraag :Pin 6 en 7 zijn gebruikt voor de blokken (blok 1 en 2).
Pin 2, 4, 10 zijn nu nog niet in gebruik maar worden voor nieuw te maken blokken gebruikt.
Okay, duidelijk. Blokken met relais aansturen is prima. Geef ze alleen een duidelijke naam in je code als je er mee gaat werken. ;)

van de ASCII zal ik waarschijnlijk niet afstappen
Is ook niet nodig, gaf alleen wat mogelijkheden aan. Ondanks dat het wel mogelijk is zou ik niet hele boeken uitwisselen tussen de PC en de Arduino. Dit kost erg veel ruimte en maakt je programma erg traag.

ook met het Arduino-IDE de kan ik de snelheid niet hoger zetten
Onder Windows wel eens gehad dat hij onder Windows (bij apparaatbeheer) de COM poort maar op een lagere snelheid stond. Hoe dit onder Linux zit weet ik even niet uit mee hoofd. Misschien al wel duidelijk, maar je moet zowel in de COM als in het programma (of dit nu je zelf geschreven programma is of een terminal) de juiste snelheid (en parity) instellen.


Succes verder!

Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 05 januari 2015, 16:58:43
Hoi volgers

Allereerst wil ik jullie een goed en gelukkig en vooral een goed modelspoor jaar 2015 toewensen.

Na een vakantie in mijn tweede vaderland Hongarije, ben ik weer opgeladen voor het komende jaar.

Ja nu is het de vraag wat ik verder ga doen, allereerst ga ik verder werken aan de Arduino analoge modelbaan sturing, er zijn nog genoeg zaken die verbetert kunnen worden.
Ik wil met de Arduino analoge modelbaan sturing ook wissels,seinen, rgb ledstrip dag/nacht ritme te simuleren en stroomdetectie gaan sturen, dat word nog een uitdaging om dat allemaal er in te bouwen.

De rgb led sturing via de Arduino had ik al veel eerder ontworpen, dat werk al, maar nu nog in het analoge modelbaan sturing bouwen

Als eerste ga ik overstappen op de Arduino Nano op een kleine Nano motherboard.
De Arduino uno is een mooi en goede platform om te ontwikkelen maar is wat lastig als vaste opstelling.

Ik ga vanaf nu gebruik maken van een Arduino Nano, de Nano heeft het voordeel dat het een kleine microcontroller met usb aansluiting is en makkelijk op een shield gezet kan worden, zie foto.
(https://images.beneluxspoor.net/bnls/SKU099717_5.jpg) (https://images.beneluxspoor.net/bnls/SKU099717_5.jpg)
plaatje geleend van de banggood sitie.

De aansluiting van de poorten word uitgevoerd door standaard connectoren, wat de flexibiliteit van de modelbaan sturing ten goede komt.
Zodoende hoef ik ook geen eigen print te ontwerpen dit koop je compleet en de prijs is een lachertje, shield+arduino nano nog geen 8 euro.

Ook wil ik een Adservo bouw-set gaan bestellen daarmee is het mogelijk om via een Arduino pro servo's te sturen, daar zie ik weer een mogelijkheid in om de twee arduino's via I2C te laten communiceren.

Het programma voor de sturing via de computer heb ik ook wat aangepast, zodat het wat makkelijker word om het geheel te sturen, zie plaatje.

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

Zoals het nu is geprogrammeerd is het niet mogelijk om twee commando's tegelijk te geven, naar elk commando gaat het naar de start positie terug, dat geld niet voor de noodstop die knop werk altijd.

mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 07 januari 2015, 21:44:11
Hoi Volgers

Ik ben gisteren en vandaag bezig geweest een wisselsturing voor twee wissels te ontwerpen.

Het eerste ontwerp is er, met dit ontwerp is het mogelijk om twee wissels te stellen, ik moet het nog testen en er nog een programma voor schrijven, in principe zou het zonder meer moeten werken, de transistor word hier als schakelaar gebruikt.

De Arduino moet een korte puls van ongeveer een 500 milliseconden of misschien 250 milliseconden geven per wisselspoel om de wissel om te leggen.

Ik Heb even een proefopstelling gemaakt met een andere ontwerp van mij (rgb ledstrip driver) en het daarmee getest.
Ik heb het even snel met wat leds geprobeerd en daarna met relais, het werk prima.

Het ontwerp is gemaakt met het programma fritzing, bij gebruikers van de Arduino een bekent programma.

De proef opstelling op een breadboard gebouwd (virtueel)

(https://images.beneluxspoor.net/bnls/Arduinowisselsturing1a_bb.jpg) (https://images.beneluxspoor.net/bnls/Arduinowisselsturing1a_bb.jpg)

Aan de hand van de proef opstelling van het breadboard een schema gemaakt.

(https://images.beneluxspoor.net/bnls/Arduinowisselsturing1a_schema.jpg) (https://images.beneluxspoor.net/bnls/Arduinowisselsturing1a_schema.jpg)

Aan de hand van het schema een print ontwerp gemaakt.

(https://images.beneluxspoor.net/bnls/Arduinowisselsturing1a_pcb.jpg) (https://images.beneluxspoor.net/bnls/Arduinowisselsturing1a_pcb.jpg)

De print meet 30 mm x 70 mm en is dubbelzijdig uitgevoerd en is geschikt voor twee wissels, als de transistor word vervangen voor een zwaardere type kun je er 4 of misschien wel zes wissels mee sturen, waardoor er een vast rijweg instelling mogelijk is.

In de proef opstelling heb ik transistor type 2N6386 (schakel vermogen 8A ) gebruik, deze is wat over gedimensioneerd maar voor de werking maakt dat niet uit, deze had ik nog liggen.

Als er toch nog evt. fouten in het ontwerp zitten hoor ik dat graag, meer ogen zien meer als twee ogen ;)

Voor de wisselsturing ga ik gebruik maken van de Arduino Nano met motherboard, deze Arduino is een stuk kleiner dan de Arduino Uno en dus beter toepasbaar voor de Arduino analoge modelbaan sturing.

mvg Paul.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: piksov op 07 januari 2015, 22:10:36
Hi Paul,

je bent goed bezig.

Ik doe 64 wissels via dcc op deze manier: http://www.piksov.com/index.php?id=wisseldecoder.php (http://www.piksov.com/index.php?id=wisseldecoder.php)

groet,
Guus
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 07 januari 2015, 22:49:14
Hallo Paul, Ik zou om het aansluiten eenvoudiger te maken de common, of voedingsaansluiting, of hoe je het ook wil noemen op de middelste aansluiting doen en op de linker en rechter kant dan de linker en rechterspoel aansluiten.

Gr. Frits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 08 januari 2015, 00:42:59
Hoi volgers

@ Guus

Bedankt voor je reactie, ik heb even gekeken via de link, ziet er ingewikkeld uit.
Ikzelf gebruik de Arduino voor alle sturingen op mijn eigen modelbaan.

@ Frits

Bedankt voor je reactie en je tip

Als ik de gezamenlijke in het midden zou zetten werd het wat moeilijk om de koperbanen dikker te maken die naar de wissel spoelen gaan, dat zou betekenen dat ik het hele print opnieuw moet gaan ontwerpen, ik wil het eerst zo proberen en in versie 2.0 zal ik deze tip zeker toepassen.

@Allen

Vanavond ben ik nog verder gegaan met het ontwerpen van een RGB-Led(strip) driver voor de Arduinio, deze Led(strip) driver wil ik op mijn modelbaan gaan toepassen voor het simuleren van het dag en nacht ritme.

Ik heb al eens eerder een led(strip) driver ontworpen, dit ontwerp van de led(strip) driver heb ik verbeterd en aangepast voor het gebruik van de Arduino.

Als eerste heb ik weer een ontwerp gemaakt op een breadboard(virtueel) ,via het programma Fritzing.

Het ontwerp.

(https://images.beneluxspoor.net/bnls/Arduinorgbdriver_bb.jpg) (https://images.beneluxspoor.net/bnls/Arduinorgbdriver_bb.jpg)

Aan de hand van het breadboard ontwerp heb ik een schema getekend.

Het schema

(https://images.beneluxspoor.net/bnls/Arduinorgbdriver_schema.jpg) (https://images.beneluxspoor.net/bnls/Arduinorgbdriver_schema.jpg)

Aan de hand van het schema heb ik een print ontwerp gemaakt.

Het print ontwerp.

(https://images.beneluxspoor.net/bnls/Arduinorgbdriver_pcb.jpg) (https://images.beneluxspoor.net/bnls/Arduinorgbdriver_pcb.jpg)
De maat van de print is 35 mm x 70 mm, en is dubbelzijdig uitgevoerd.

Ik heb het eerste ontwerp getest, en dat werk goed (heb er zelf nog ergens een filmpje van, interesse hoor ik het wel) omdat het nieuwe ontwerp gebaseerd is op het eerste ontwerp weet ik zeker dat dit gaat werken.

Morgen wil ik gaan kijken of ik een seinsturing (blok sein) via de Arduino kan ontwerpen, je kunt led's rechtstreeks sturen met de Arduino poorten
Ik wil echter meerdere led's parallel of in serie schakelen(sein en indicatie bedienings-paneel) vandaar dat ik de led's wil laten sturen door transistors, ook kunnen dan nog kleine gloeilampjes in de oude type seinen gestuurd worden.

Ook is er nog een mogelijkheid om een shift register (74hc595) te gaan gebruiken.

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 08 januari 2015, 00:53:36
Je hebt er een flink tempo in....:-)
Maak je de printjes zelf?
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 08 januari 2015, 02:30:28
Hoi Paul,

Je btn lekker bezig geweest! Ik wil je alleen niet teleur stellen maar heb toch wat (harde)opmerkingen.

Eerst, goed dat je bent gegaan voor NPN. PNP zou een slechte keuze geweest zijn. Dit gaat prima werken.

Maar... Alle diode aan de ingang kan je weglaten, waarom zitten ze daar?

Is dit niet (über super) zwaar overgedimensioneerd? En je hoeft geen darlington transistor te gebruiken op zich, een normale voldoet ook wel, zelfs met een hfe van maar 100 ofzo. En je zegt wel 8A max, maar bij 8A valt er 3V over de collector-emitter. 3 x 8 = 24 W ! Dat is echt een hele hoop om weg te stoken in een koellichaam. Maar goed, zo'n vaart zal het niet lopen, wie gaat er voor 8A wissels schakelen (continue, pulsen niet meegerekend).

Oo heb je 220ohm base weerstanden. Onder lage load heb je dan een base stroom van 10mA. Dat is toch niet al niets. Maar 8A ga je dan nooit redden. Op 8A is de base emitter spanning 4,5V. Vanaf een Arduino hou je maar een half volt over. Dat geeft dan een base stroom van 2,3mA. Dit terwijl er bij 8A een hfe van maar 100 is. Er is dus een base stroom nodig van 80mA! Dat gaat een Arduino zelf nog niet eens leveren. Maar goed, 8A, wie wil dat nu  ;D

Is een ontwerp rond de ULN2003 niet een veel makkelijke ontwerp? Kan 8x 500mA aan. Okay, dat is misschien wat krap. Maar vind hij vindt het prima om tot 4x 1A omgetoverd te worden (zelfs 2x 2A zou geen probleem moeten zijn). En 1A continue is meestal wel genoeg voor een wissel. (Is een veel gebruikte chip, ook in modelspoor.) Ze kosten werkelijk geen drol (16 cent per stuk) en zijn net zo makkelijk te gebruiken. Kan je met één chip 4 wissels doen! Je hebt niet eens weerstanden nodig ofzo. En als ik zo kijk is de 2N6386 nu niet echt goedkoop  ::)

Voor een LEdstrip zou ik voor iets anders gaan dan een ULN2803 omdat je al snel wat meer gebruikt. Ik zou dan gaan voor een MOSFET. Iets als een IRF530 ofzo. Kan je met gemak 10A+ mee schakelen. Ook weet ik niet waarmee je de onderste pin van j4 mee wilt aansluiten?


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 10 januari 2015, 01:32:30
Hoi volgers

Gisteren ben ik geopereerd aan mijn oor, vandaar dat ik weer een aantal ontwerpen heb gemaakt, omdat ik nog niet veel mag doen.

@ Frits

Bedankt voor je reactie.
De printjes laat ik, als ik ze ga gebruiken in China maken.

@ Timo

Bedankt voor je input.

De Transistor 2N6386 had ik toevallig nog liggen, en heb ze gebruikt in een test opstelling, wat verder goed werkt.
Ok, 8A is ook wel veel, en het was de bedoeling om er niet meer dan 1 a 2A er door te laten vloeien.
Het zal dus best wel werken, zonder problemen.

Welke formule gebruik jij om de transistoren te berekenen?

De diode had ik er voor de beveiliging van de Arduino port er tussen gezet, mocht er onverhoeds een rare stroom lopen was de port niet beschadigd.

De ULN2003 heeft maar 7 uitgangen,  ik denk dat je de ULN2803 bedoeld  ;)

Ik gebruik niet vaak ic's om stromen te schakelen daarvoor gebruik ik liever transtoren, die kunnen zonder aanpassingen stroom genoeg leveren.

Ok , ik heb geprobeerd om een wissel schakeling te maken met de ULN2805, wat is jou mening van deze schakeling, heb ik het goed uitgevoerd of niet, alvast bedank voor je hulp.

Het virtuele breadbord ontwerp.

 (https://images.beneluxspoor.net/bnls/wissel2803_bb.jpg) (https://images.beneluxspoor.net/bnls/wissel2803_bb.jpg)

Het schema

(https://images.beneluxspoor.net/bnls/wissel2803_sch.jpg) (https://images.beneluxspoor.net/bnls/wissel2803_sch.jpg)

Het print ontwerp

(https://images.beneluxspoor.net/bnls/wissel2803_pcb.jpg) (https://images.beneluxspoor.net/bnls/wissel2803_pcb.jpg)

Wat is jou mening, die hoor ik graag om er eventuele fouten er te kunnen uithalen.

@ allen

Vandaag heb ik de eerste ontwerpen van de wissel sturing en de rgb schakeling  verbetert, ik hoop dat er geen fouten inzitten, als er toch nog fouten inzitten hoor ik dat graag.

De wissel schakeling.

Het virtuele breadboard, van de wissel sturing

(https://images.beneluxspoor.net/bnls/Mosfet_wisselsturing_bb.jpg) (https://images.beneluxspoor.net/bnls/Mosfet_wisselsturing_bb.jpg)

Het schema.
Ik zie dat ik in het schema vergeten ben om de mosfet type te vermelden, T1, T2, T3, T4 mosfet IRF 510

(https://images.beneluxspoor.net/bnls/Mosfet_wisselsturing_schema.jpg) (https://images.beneluxspoor.net/bnls/Mosfet_wisselsturing_schema.jpg)

Het print ontwerp.

(https://images.beneluxspoor.net/bnls/Mosfet_wisselsturing_pcb.jpg) (https://images.beneluxspoor.net/bnls/Mosfet_wisselsturing_pcb.jpg)

Ook heb ik de rgb driver verbeterd, mochten er nog fouten in zitten hoor ik dat graag.

Het virtuele breadboard ontwerp.

(https://images.beneluxspoor.net/bnls/Arduin_rgbdriver_bb.jpg) (https://images.beneluxspoor.net/bnls/Arduin_rgbdriver_bb.jpg)

Het schema.

(https://images.beneluxspoor.net/bnls/Arduino_rgbsturing_schema.jpg) (https://images.beneluxspoor.net/bnls/Arduino_rgbsturing_schema.jpg)

Het print ontwerp.

(https://images.beneluxspoor.net/bnls/Arduino_rgbdriver_pcb.jpg) (https://images.beneluxspoor.net/bnls/Arduino_rgbdriver_pcb.jpg)

Ik wil nog een sein sturing ontwerpen (blok sein, rood-groen)

Ook wil ik een bezetmelder voor de Arduino analoge modelbaan sturing ontwerpen of via reet-contacten of via stroommeting, dat moet ik nog uitzoeken.

Om al de printen te controleren of de Arduino aanstaat of in storing staat moet ik nog een kleine schakeling ontwerpen waarmee ik port 13 kan gebruiken om veel leds te sturen.

Mvg Paul



Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Daan Neijenhuis op 10 januari 2015, 07:55:36
Beste Paul,

ULN2803 uitgangen parallel schakelen klinkt leuk, maar de Common pen kan maar 1.5A totaal voeren.
Daarnaast zijn er nog steeds spoelaandrijvingen die rustig meer dan 2A willen trekken (Peco, Minitrix; Fleischmann heb ik nog niet gemeten) en dan wil de "black smoke" graag ontsnappen uit het IC...
Dit uit eigen ervaring; ik heb tijdens RAIL2014 op de TramDemo voor de hcc!m een testprint zitten die tot twee keer toe met een zachte plof en laaghangende rook zijn ongenoegen uitte  ;)
Uiteindelijk met  8x BD679A een vervanger gemaakt; dit loopt nog steeds goed.

Er zijn uiteindelijk veel manieren om een wisseleindtrap te bouwen; die van mij is er één van. In een nieuw ontwerp zou ook ik naar FETs gaan, maar daar heb ik (nog) te weinig ervaring mee.

m.vr.gr.

Daan Neijenhuis
HCC!M-IG (http://www.hccm.nl)

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 10 januari 2015, 09:01:13
@Daan. Volgens het datablad is de stroom per uitgang 500mA. Parallel zou ik niet boven de 1A uitgaan. Hoewel de uitgangen intern voorzien zijn van transient suppression diodes denk ik dat de inductie stroom de oorzaak is van het overlijden van de 2803.  Normaal gesproken worden de wisselspoelen aangesloten  op 16V wisselspanning. Met de digitale technieken sluit je hem aan op gelijkspanning. De impedantie van de spoel wordt hierdoor heel laag, en de stroom dus hoger als bij wisselstroom. Het omgekeerde gebeurd echter ook zodra de spanning wordt weggenomen. Er ontstaat een zeer grote inductiestroom. Ik vermoed dat die er de oorzaak van is dat het ic sneuvelt. Ik zou op de uitgangen anti-parallel 'blus' diodes  opnemen zoals de 1N4007.

@Paul. Als je overweegt om de schakeling met de 2803 te maken zou ik dus de dioden toevoegen en net als je nu bij het transistorontwerp hebt gedaan per wissel een driepolige aansluiting, links, common, rechts. Daar heb je later bij het aansluiten en onvermijdelike storing zoeken profijt van.

Je bent handig met dat Fritzing zie ik. Ik heb het ooit eens gedownload om breadboard ontwerpen te maken, maar mis de handigheid. Ik zie nu pas dat jij er ook het schema mee maakt en het dubbelzijdige printontwerp. Misschien moet ik het maar weer eens proberen.
Succes weer. Frits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Daan Neijenhuis op 10 januari 2015, 16:55:29
Die vrijloopdiodes zitten ook in de ULN, daarvoor moet je pen 10 aan de voedingspanning hangen (pen 9 is de GND). Juist om inductiestromen "kort te sluiten". Misschien is een "lokale" blusdiode 1N4007 wel zo verstandig als de leidingen wat langer zijn.
Ik had mijn wisselspoelen nooit nagemeten; was gewoon vol goede moed begonnen. Ging ook goed, totdat een plof en wat geurstoffen ons van het tegendeel op de hoogte brachten ;D

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 10 januari 2015, 18:34:50
Hoi volgers

@ Daan Bedankt voor je informatie, ik denk dat ik het bij transistors hou.
    Mosfet transistor werken in principe het zelfde als een standaard transistor, alleen de namen van de aansluitingen heten anders.

@ Frits

Ik ben niet van plan om met de ULN2803 wissels te gaan sturen, zeker niet na het verhaal van Daan.
Ik hou het op Mosfet transistors die zijn daar prima voor geschikt.

Met de nieuwste versie van fritzing kun je zelfs Arduino programma's mee schrijven.

@allen

Ik heb nog een kleine wijziging in de wissel sturing gemaakt , ik heb er flyback (blus) diodes over de uitgang gezet.

Het virtuele breadboard

(https://images.beneluxspoor.net/bnls/Mosfet_wisselsturingv2_bb.jpg) (https://images.beneluxspoor.net/bnls/Mosfet_wisselsturingv2_bb.jpg)

Het schema

(https://images.beneluxspoor.net/bnls/Mosfet_wisselsturingv2_schema.jpg) (https://images.beneluxspoor.net/bnls/Mosfet_wisselsturingv2_schema.jpg)

Het printontwerp

(https://images.beneluxspoor.net/bnls/Mosfet_wisselsturingv2_pcb.jpg) (https://images.beneluxspoor.net/bnls/Mosfet_wisselsturingv2_pcb.jpg)

mvg Paul

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 11 januari 2015, 01:12:26
Hoi volgers

Na het ontwerpen van de diverse printen, ben ik me nu aan het buigen over de communicatie tussen de Arduino's

Ik zit aan twee protocollen te denken I2C of RS485  beide protocollen hebben voordelen.
I2c is het makkelijkst te bouwen, het ontwerp voor de RS485 driver is wat ingewikkelder.

Ik ga eerst even wat experimenteren met I2C  en later met RS485

Om twee of meer Arduino's via I2C te verbinden gebruik ik het ontwerp wat ik gemaakt en getest hebt.

(https://images.beneluxspoor.net/bnls/i2cmaster_slave_bb.jpg) (https://images.beneluxspoor.net/bnls/i2cmaster_slave_bb.jpg)

Een van de twee is als master geprogrammeerd en de ander als slave.

Het Master programma.

//i2c Master Code(UNO)
#include <Wire.h>

void setup()
{
  Wire.begin();
  delay(2000);
}
void loop()
{     
      Wire.beginTransmission(5);
      Wire.write('H');
      digitalWrite(8,HIGH);
      Wire.endTransmission();
     
      delay(3000);
     
      Wire.beginTransmission(5);
      Wire.write('L');
      digitalWrite(8,LOW);
      Wire.endTransmission();
     
      delay(3000);     
}
 


Het Slave Programma

//i2c Slave Code(UNO 2)
#include <Wire.h>

void setup()
{
  Wire.begin(5);
  Wire.onReceive(receiveEvent);
 
  pinMode(8,OUTPUT);
  digitalWrite(8,LOW);
}

void loop()
{
}

void receiveEvent(int howMany)
{
  while(Wire.available())
  {
    char c = Wire.read();
   
    if(c == 'H')
    {
      digitalWrite(8,HIGH);
    }
    else if(c == 'L')
    {
      digitalWrite(8,LOW);
    }
  }
}

Voor het gebruik van het RS 485 protocol zal je een iets ingewikkelder ontwerp moeten maken.

Het ontwerp is nog niet getest en ik heb er ook nog geen programma voor.
De max485 ic heb ik nog niet, vandaar dat dit ontwerp nog niet getest is, zou volgens de gegevens wel moeten werken? ::)

Het breadboard ontwerp van de RS 485 driver.

(https://images.beneluxspoor.net/bnls/RS485driver_bb.jpg) (https://images.beneluxspoor.net/bnls/RS485driver_bb.jpg)
Ik weet niet zeker of dit ontwerp juist is.

Voor op of aanmerkingen sta ik open.

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: -Anton- op 11 januari 2015, 14:11:10
leuk bezig, ik heb een opmerking  ;D
I2C is eigenlijk niet bedoeld voor lange afstanden, maar meer als bus op een print om de verschillende componenten met elkaar te verbinden.
RS485 is daar in tegen juist bedoeld voor verbindingen tussen apparaten op langere afstand.


Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Papierbouwer op 11 januari 2015, 14:50:19
Xpressnet is op RS485 gebaseerd, misschien valt dat wel te gebruiken.

Erik
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 11 januari 2015, 20:21:28
Hoi, volgers

@ Anton

Bedankt voor je reactie.
Het is mij inderdaad bekent dat het I2C een bus is en niet werkt over langere afstanden.

Het is de bedoeling om een aantal Arduino's via I2C te sturen je hebt dan 1 master en bv 3 slave's (Bloksturing, wisselsturing, seinsturing, enz.).

Voor de lange afstand tussen twee stuurposten zal het handig kunnen zijn als de twee sturingen met elkaar konden communiceren, vandaar dat ik ook een mogelijkheid wil hebben om te communiceren over de lange afstand (The master zullen beide een Arduino mega worden.)

Ik wil het verder nog eens goed uitzoeken hoe het een en het ander werkt.

@ Erik

Bedankt voor je reactie.

Ik heb even gekeken naar het xpressnet protocol , maar voor nu is mij dat net even te ingewikkeld.

@Allen

Ik heb vandaag nog even verder gegaan met I2C, Ik heb nu een zichtbare communicatie tussen de twee Arduino's via I2C

Ik heb er een kort filmpje van de werking gemaakt, de film is van slechte kwaliteit (heb geen goede filmcamera), dus met een oud fototoestel maar even gefilmd, als we onze camera weer gevonden hebben zal ik kijken of ik een betere filmpje kan maken.

Het filmpje
http://youtu.be/6HC4CYtD5ps

Ik moet nog veel uitzoeken maar het begin is er.

Sein sturing.

Ik ben vandaag bezig geweest om een Arduino seinsturing te ontwerpen, het ontwerp is geschikt voor 6 blok seinen ( Rood, Groen), met dit soort seinen word mijn modelspoor baan uitgevoerd.

Zoals gebruikelijk heb ik weer gebruikt gemaakt van het virtuele breadboad om de seinsturing te ontwerpen.

Het breadboard ontwerp.

(https://images.beneluxspoor.net/bnls/seinsturingv1_bb.jpg) (https://images.beneluxspoor.net/bnls/seinsturingv1_bb.jpg)

Het schema.

(https://images.beneluxspoor.net/bnls/seinsturingv1_schema.jpg) (https://images.beneluxspoor.net/bnls/seinsturingv1_schema.jpg)

Het printontwerp

(https://images.beneluxspoor.net/bnls/seinsturingv1_pcb.jpg) (https://images.beneluxspoor.net/bnls/seinsturingv1_pcb.jpg)

De werking van dit ontwerp is vrij simpel.

Door op bv. port 6 een HIGH te zetten zal de Groene led gaan branden, als je een LOW op port 6 zet, zal de rode led gaan branden, op deze manier kun je met 1 Arduino Uno 10 blokseinen sturen.

Mvg Paul Smits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 11 januari 2015, 21:30:15
Hallo Paul,

Zit even vlug naar het schema te kijken maar ik snap niet hoe de rode leds moeten gaan branden. Ik heb het idee dat je de transistoren verkeerd hebt getekend. Of is al te laat voor mij om helder te denken...... ???

gr. Frits

ps. Is het niet veel eenvoudiger om de twee leds incl weerstanden in serie te schakelen tussen +5V en 0V. En dan het knooppunt van anode en kathode aansluiten op de arduino........Weet niet of het werkt, zou ik ook moeten proberen.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: dimo1_dimo1 op 11 januari 2015, 22:20:48
ik zou alle leds achter een transistor hangen.. ik ben bang dat je als je de leds rechtstreeks vanaf de Arduino gaat voeden, je je Arduino snel opblaast bij gebruik van meerdere leds (volgens mij mag 1 led nog maar net aan de output hangen van de Arduino maar er is ook een max totaal output van de MCU die je goed in de gaten moet houden)
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 11 januari 2015, 22:38:07
Hallo Paul, even geprobeerd en het werkt. Gaat natuurlijk alleen op als je niet teveel stroom gaat gebruiken. Eén groene led en één rode led per uitgng werkt prima. Ga je er meer aansluiten dan is het zoals Auke zegt beter om wel transistoren te gebruiken.

succes, Frits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 11 januari 2015, 22:41:37
Hoi Volgers

@Frits

Bedankt voor je input, ik zal er eens goed naar kijken.

Ik heb even een testopstelling gemaakt, daar werkt het wel. ???
Ik moet maar eens goed kijken naar het schema om uit te zoeken waarom het schema niet klopt. :P

@ Auke

De Arduino (ATmega 328) kan best wel wat hebben op de I/O pinnen, je moet inderdaad niet overdrijven.

 max  -- DC Current per I/O Pin . . . . . . . . . . . . . . . . . . 40.0mA
 max  -- DC Current VCC and GND Pins . . . . . . . . . . 200.0mA

Even uit de datasheet overgenomen.


Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 11 januari 2015, 23:22:01
Hoi, volgers

IK heb even een proefopstelling van de seinsturing gemaakt om te kijken of mijn hersenspinsels wel kloppen.
Het werkt uitstekend, zie filmpje.

Filmpje.

http://youtu.be/wIwvIFs6c44

Het testprogramma.

/* Seinsturing test programma.

*/

int sein1 = 9;
int sein2 = 10;

void setup(){

  pinMode(sein1,OUTPUT);
  pinMode(sein2,OUTPUT);
 
  Serial.begin(9600);
  Serial.println("Arduino analoge modelbaan sturing : Sein beelden");
}
 
void loop(){

  digitalWrite(sein1, LOW);
  digitalWrite(sein2, HIGH);
 
  Serial.println("Blok2 vrij -> Blok1 bezet");
 
  delay(2000);
 
  digitalWrite(sein1, HIGH);
  digitalWrite(sein2, LOW);
 
  Serial.println("Blok1 vrij -> Blok2 bezet");
 
  delay(2000);
}
   

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 12 januari 2015, 00:01:08
Hoi Paul,

Ik had al veeeel eerder willen reageren. Nu staat er al zo veel tussen... Ik ga dus al lezend me reacties typen.

Okay, ik wilde chronologisch reageren maar laat ik eerst nog terugkomen op de ULN2803. Deze moet echt prima geschikt zijn voor wissels. Zeker als je twee uitgangen per wissel gebruikt. De OpenDCC decoder maakt er ook gebruik van en laten we eerlijk zijn, voor gros van de aandrijvingen is 1A meer dan genoeg. Wel moet je er op letten dat je dus de com aansluiting wel maakt om de free wheeling diodes. Naast de OpenDCC decoder maakt de LDT decoders er ook gebruik van de ULN chips. En denk (nooit open gemaakt, dus weet het echt niet zeker) dat een Digikeijs decoder ook wel eens ervan gebruik maakt. Per wissel twee transistoren tikt al wel snel aan anders.

Goed, nu weer terug naar de chronologische volgorde.  ;D Het schema met de MOSFET's en de ULN's lijkt me op zich prima. Alleen mis ik eigenlijk steeds een pin in de aansluiting naar de Arduino, de GND! Zeker omdat je printen met een barrel jack hebt getekend. Je zal niet de eerste zijn die rare verschijnselen krijgt doordat er geen common GND is. Nu kan je wel zeggen, ik voed de Arduino en de wissels uit dezelfde bron, maar ga je dat voor alles wissels doen? Is niet veel makkelijker één voeding te pakken voor alle Arduino's en een losse voor wissels? Zo blijft de voeding van de Arduino tenminste beetje schoon. En voor het blauwe ledje heb je dus geen 2 pinnen nodig, de kathode gaat gewoon aan de common GND.

En dan nog over je printjes op zich, ja ze gaan werken. Maar de layout is wel heel ruim opgezet, zonde van alle vrij ruimte. Ook heb je een dubbelzijdig ontwerp gemaakt. Ik snap dat het geen moer uitmaakt als je ze laat maken in China maar zoiets simpels krijg je denk ik ook nog wel op een zijde. Zou de print ook makkelijk zelf etsbaar maken.

ULN2803 uitgangen parallel schakelen klinkt leuk, maar de Common pen kan maar 1.5A totaal voeren.
Ik heb net weer erg me best gedaan en de datasheet doorgekeken maar kan dit niet vinden. Kan je me er op wijzen? Enige wat ik kan vinden is dat de chip in totaal 2,25W mag verstoken. Dit beperkt het wel aangezien je (per poort) een Vce hebt van 1,75V bij 500mA. Dit krijg je al bijna niet weg per poort. Maar dat is wel bijna de volle last en continue! Ik denk dat het voeding technisch ook erg verstandig is wissels na elkaar te schakelen. Op die manier hoeft de voeding niet idioot hoog, ga je niet over de power dissipation en ga je ook niet over de 1,5A. Alleen maar voordelen dus  8)

Busdiode over een MOSFET kan geen kwaad maar zoals je kunt zien zit er ook al iets in de IRF510 zelf. Ook zou ik er geen 1N4007 voor pakken, deze is te traag. Pak dan de aloude 1N4148, nog goedkoper ook. En dan weer, waarom MOSFET's? Deze zijn nog steeds een stuk duurder dan (BJT) transistors. En het is niet dat ze continue schakelen en dat de hitteproductie zo'n grote rol gaat spelen.

Toch weer its afwijken van de volgorde om elektronica bij elkaar te houden. De seinsturing. Ik moet zeggen, werkt wel maar lijkt me onnodig complex. Allereerst over hoe je de seinen aanstuurt. Als je zelf blokseinen maakt (en dus zelf de aansluiting kies) is het niet zo'n probleem. Maar hou er rekening mee dat de meeste commercieel verkrijgbare seinen een common anode hebben (en niet common kathode zoals jij hebt getekend. Maar ga je ze zelf maken is het geen probleem MAAR! Het kan dan VEEEEEEEEEL simpeler! Hang de groene led (+ weerstand) met de kathode aan de GND en de anode aan de Arduino pin. Hang nu de rode led (+weerstand) met de kathode aan de Arduino pin en met de anode aan de 5V. Maak je nu de pin HIGH brandt groen, maak je de pin LOW brandt rood, klaaaar. Geen transistors, niets  ;D

Wat betreft maximale stroom kan de Arduino best wel wat hebben. Maar 200mA klinkt veel maar dit zijn maar 10 ledjes (@20mA)! En dan mag je voor de rest niets voeden, zelfs niet een paar mA voor een transistor. En ik zie dat je een 100ohm weerstand voor de ledjes hebt, dit vind ik echt heel weinig. Je knalt dan zo'n 30mA door het ledje! En als je echt 200mA wilt gaan gebruiken uit de Arduino zorg dan voor een niet te hoge spanning naar de Arduino toe. Alle extra spanning moet door de voltage regulator opgestookt worden en die op de Arduino kan niet zo veel vermogen verstoken. Maar voeden met 5V is ook weer niet handig want dan zakt bij het minst of geringste de voedingsspanning onder de 5V.

Ik zit aan twee protocollen te denken I2C of RS485  beide protocollen hebben voordelen.
Dit zijn absoluut geen protocollen! Het zijn bussen. Het protocol moet jij verzinnen.

Als je twee Arduino's elektrisch wilt koppelen hang dan niet de 5V aan de Vin. Hang gewoon Vin aan Vin  ;) Laat je beide voltage regulators normaal hun werk doen. Zoals je nu hebt heeft de onderste Arduino de extra drop over de regulator te verwerken (de voedingsspanning zal dan ook lager zijn, +- 4,85V, als je de 5V lijn zal meten).

Je ontwerp van de RS485 lijkt ook wel te kloppen. Inderdaad iets meer hardware maar werkt mooi over afstand. Je weet overigens dat je ook gewoon TTL serail tussen de Arduino's kunt gebruiken?

Overigens denk ik dat je met één enkele Arduino al echt heel veel kunt doen. Je schrijft namelijk "verbinding tussen stuurposten". Dus je wilt per stuurpost een cluster aan Arduino's? Het kan wel maar ik denk dat een enkele Arduino met gemak een blok of 4 aan kan sturen. Enige beperking is misschien aantal pinnen voor seinsturing. Zou je shiftregisters voor kunnen gebruiken maar aan de andere kant, een pro mini kost ook geen drol  ::)


Goed, denk dat ik nu wel weer alles even langsgelopen ben  ::) Ik hoop dat je wat kunt met me lap tekst  ;)


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Karst Drenth op 12 januari 2015, 08:39:30
Citaat van: Timo
....En denk (nooit open gemaakt, dus weet het echt niet zeker) dat een Digikeijs decoder ook wel eens ervan gebruik maakt. Per wissel twee transistoren tikt al wel snel aan anders....

Nope, 5 Amp dual N-Channel MOSFETS in SOIC-8 ;) :P

Citaat van: Timo
... En ik zie dat je een 100ohm weerstand voor de ledjes hebt, dit vind ik echt heel weinig. Je knalt dan zo'n 30mA door het ledje!...

Zag ik ook... ik 'jaag' tegenwoordig nooit meer dan 2mA door een high-efficiency LEDje, meeeeeeer dan genoeg ;)

Grtzz,

Karst
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Peter Korsten op 12 januari 2015, 09:09:28
Nog even een vraagje je schreef dat je  libraries voor de Arduino kon schrijven, hoe doe je dat ::)
Om het Arduino programma wat overzichtelijk te houden wil ik graag het onderstaand stukje programma in libraries zetten, of werk dat niet ?
Er zullen wel meer "const int" en andere variablen er bij gezet worden als ik verder ben met dit project.

const int Stijd = 10 * 1000;  // Stoptijd stopblok
 const int Wtijd = 10 * 1000;  // Wachttijd wachtblok
 //const int Noodstop = 1;       // Noodstop actief hoog
 //const int Sda = 20;           // I2C bus serial data
 // const int Scl = 21;           // I2C bus serial clock
 
 // initialisatie noodstop
 
 const int LED = 52;      // Stoppen Arduino Mega modelspoor sturing.
 const int LED1 = 53;     // Vrijgave Arduino Mega modelspoor sturing.
 const int LEDN = 50;    // Noodstop geactiveerd
 const int LEDV = 51;    // Noodstop Opgeheven

// initialisatie poorten blokken


 const int Blok1 = 22;   // Inkomende spoor
 const int Blok2 = 23;   // Uitgaande spoor
 const int Blok3 = 24;   // Schaduwstation spoor 1
 const int Blok4 = 44;   // Schaduwstation spoor 2
 const int Blok5 = 26;   // Stationspoor spoor 1
 const int Blok6 = 27;   // Stationspoor spoor 2
 const int Blok7 = 28;   // Wachtspoor
 const int Blok8 = 29;   // Goederenspoor
 const int Blok9 =  5;   // Wisselblok 1
 const int Blok10 = 6;  // Wisselblok 2

// initialisatie poorten voor wissel sturing

 const int Wis1 = 30;  // wissel 1
 const int Wis2 = 31;  // wissel 2
 const int Wis3 = 32;  // wissel 3
 const int Wis4 = 33;  // wissel 4
 const int Wis5 = 34;  // wissel 5
 const int Wis6 = 35;  // wissel 6
 const int Wis7 = 36;  // wissel 7
 const int Wis8 = 37;  // wissel 8
 const int Wis9 = 38;  // wissel 9
 const int Wis10 = 39; // wissel 10
 const int Wis11 = 40; // wissel 11
 const int Wis12 = 41; // wissel 12

Zijn er programma's waarmee je libraries kunt schrijven.  ::)

Een library is niets anders dan herbruikbare code. Het bovenstaande is geen code, dat zijn slechts declaraties.

Het verschilt tussen verschillende ontwikkelingsplatforms, maar over het algemeen is ene library een stukje code dat je kunt linken aan andere code. Bijvoorbeeld, om een dialoogvenster op het scherm te zetten ("weet u zeker dat u de C-schijf wil formatteren?"), dat zet je in een library. Daar ga je niet iedere keer het venster tekenen met alle knoppen en tekst.

Voor je project zou je moeten kijken welke code hergebruikt zou kunnen worden. Ik heb niet het hele draadje doorgelezen, maar als je een master en een stuk of wat slaves hebt, neem ik aan dat die slaves allemaal hetzelfde werken. Als je een slave dan een bepaald iets wil laten uitvoeren door een opdracht op de bus te zetten, dan kun je dat één keer schrijven (in een library dus) en kun je het nummer van de slave als parameter meegeven.

Op die manier voorkom je dat je steeds dezelfde reeks opdrachten in je code hebt staan. Dat is namelijk niet goed voor onderhoudbaarheid van de code. Maar het moet dus wel code zijn die door verschillende onderdelen van je programma gebruikt kunnen worden. Als alles een monolithisch blok is, dan heeft een library ook niet zoveel zin. Dan zet je zoiets gewoon in een procedure/functie, het liefst in een apart bronbestand.

Overigens denk ik dat je een belangrijk voordeel van digitaal bent vergeten te benoemen: alles is al door andere mensen uitgevonden en getest. Jij zult alles zelf moeten doen en dat is geen sinecure. Aan de andere kant, als je er lol aan beleeft, waarom ook niet?

- Peter
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 12 januari 2015, 15:21:02
Thnx Karst voor de aanvulling  :) Iets meer beefy maar iig geen 10A+ losse torren.

@Paul, misschien eens een wisseltje meten? Weet niet wat voor aandrijvingen jij gebruikt. Blijkt het toch hoog misschien op zoek naar een andere minder beefy MOSFET? Misschien iets als de IRF7103?

Wat betreft librabies. Aan zich is een library alleen een stuk code wat je invoegt. Maar in jou geval heb je denk ik meer aan een libray met een classe. In een klasse breng je dan alles onder wat je vaker wilt gebruiken. Een blok is hier een mooi voorbeeld van. Dan kan je een classe maken voor een blok. Voor ieder blok maak je een instantie van het blok en je bent klaar. De classe bevat dan dingen als
blok.drive(int speed) voor het aansturen van de motordrivers (maar mss wil je deze los omdat niet ieder blok een motordriver krijgt, dan heb je meer aan blok.enable() en blok.disable() )
blok.occupied() Om blok bezet te maken en sein aan het begin op onveilig te zetten.
blok.free() Om blok vrij te geven en sein veilig te zetten

En buiten een library/classe om zou ik eens beginne met alles waar je er meer van hebt in een array te stoppen. Die hele waslijst met wisels is nu nogal onhandelbaar. En om iedere wissel om te zetten met een randvoorwaarde heb je nogal een berg ifjes (of een switch statement) nodig en dat is helemaal niet nodig. Gewoon
const byte turnouts[] = {30, 31, 32, 33, 34, enz };

void setTurnout(byte turnout, byte state){
   digitalWrite(turnouts[turnout], state);
}
Onderste is dan genoeg om elke wissel te zetten. Wel beetje eenvoudig gemaakt, doe nu net even of AAN en UIT een richting vormen voor een wissel. Komt omdat je maar één poort per wissel definieert...

Iets meer over libraries en hoe ze te maken binnen Arduino: Writing a Library for Arduino (http://arduino.cc/en/Hacking/LibraryTutorial)


Timo

En voor dingen waa

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 12 januari 2015, 23:07:07
Hoi, Volgers

@Timo 

Bedankt voor je input. (y)

Dat was een lap tekst om te lezen. ;D ,ik ben net zo erg  ;)

Ik maak gebruik van minitrix afneembare wissel spoelen, deze zouden volgens de fabrikant max 1A gebruiken, zijn ze wat ouder misschien 1.5 A.
Ik heb het zelf niet gemeten.

Ik heb wat gesurft om het een en het ander uit te zoeken over verschillende mosfet 's , er zijn mij twee types opgevallen die mij geschikt lijken (IRF 720 en IRF 820) de max stroom continu van de IRF 720 is 3.3 A en van de IRF 820  2.5 A, deze mosfet's  lijken mij geschikt voor mijn wissels.

Ik ga de ULN2803 niet gebruiken, liever iets meer geld kwijt aan onderdelen dan een wisselsturing die misschien te licht is.

De IRF 720, IRF 820 kosten ongeveer $0.50 per stuk in dat geval speel ik liever op save.

Citaat
En dan nog over je printjes op zich, ja ze gaan werken. Maar de layout is wel heel ruim opgezet, zonde van alle vrij ruimte. Ook heb je een dubbelzijdig ontwerp gemaakt. Ik snap dat het geen moer uitmaakt als je ze laat maken in China maar zoiets simpels krijg je denk ik ook nog wel op een zijde. Zou de print ook makkelijk zelf etsbaar maken.

Ik heb deze printjes juist  ruimer gemaakt, dat maak het solderen van de printjes een stuk makkelijker, ook als er een onderdeel kapot gaat is het makkelijk te vervangen.

Het lijkt tegenwoordig mode te zijn om de printen zo compact mogelijk te ontwerpen.  ???

Vroeger toen ik nog op school zat  8) werden printen die we ontwierpen ook al ruim van opzet gemaakt, dat doe ik nu nog. ;D

Ik ga thuis niet zitten kliederen met chemische stoffen om printjes te maken, de printjes in China laten maken is een stuk goedkoper( ik hoef geen aparte kamer met exotische apparaten, lichtbak, etsbak, spoelbak enz., te kopen) en een stuk schoner. ;D

Sorry, maar ik begrijp de code niet helemaal, als je nu het comando "digitalWrite(turnout, state)" , geeft zullen alle wissels toch omgaan, of zie ik dat verkeerd, ik heb ondertussen wel enige ervaring met de Arduino programmeertaal, maar dit begrijp ik even niet, heb je misschien wat psudo code voor mij om het wat duidelijker te maken hoe het werkt.  ::)

Het is mij ook niet helemaal duidelijk hoe ik een libray met een klasse moet maken, heb je misschien een klein voorbeeld voor mij, om het wat begrijpelijker te maken.  ::)

Ik maak  soms gebruik van bestaande code en pas die aan aan mijn eigen eisen, op deze manier heb ik de basisopzet van de modelbaan sturing ontworpen.

@Peter

Bedankt voor je input. (y)

Dat is een oude quote, ;D ,ondertussen heb ik een totaal ander programma gemaakt, dit programma werk voor nu naar behoren, het lag in de planning om ook deze functies in het programma te zetten.

Ik denk dat je het verhaal een beetje verkeerd hebt begrepen, het is absoluut niet de bedoeling om een nieuw digitaal systeem te ontwerpen, het is de bedoeling dat ik de Arduino ga gebruiken, om een Arduino blok gestuurde modelbaan te maken, die ik met de computer kan bedienen.

Al mijn locomotieven zijn analoog (ongeveer 30 stuks),

Dinamo is mij veel te duur, als ik zie wat het de treinenclub heeft gekost om de clubbaan om te bouwen naar Dinamo en de clubbaan is nog niet rij vaardig, laat dan maar.

@ Kartz

Bedank voor je input.  (y)

@ Allen

Na een partij ontwerpen gemaakt te hebben, kom ik tot de conclusie dat ik te ver ben doorgeschoten, het is allemaal te ingewikkeld  en het was ook niet de bedoeling om het onnodig ingewikkeld te maken, het moest een eenvoudige Arduino blok gestuurd systeem worden en geen nieuwe digitale sturing  ::).

Ik ben tot de conclusie gekomen dat het anders moet, dat wil niet zeggen dat ik er mee stop, ik vind het te leuk, maar het moet anders, dat wil zeggen naar het eerste idee dat ik had.

Wat nu, ik ga de sturing zoals die nu is opnieuw ontwerpen, dat wil zeggen terug naar het begin van de eerste ontwerpen.

Het wat ooit de bedoeling om per blok 1 Arduino te gebruiken, ik had toen al zoiets, dat het goed mogelijk moest zijn, om de functies van 1 blok met 1 Arduino te sturen, alleen wissels worden wat lastiger, daar zou een aparte Arduino voor nodig zijn.

Wat wil ik per blok sturen allereerst de rijrichting en snelheid, blok vrij/bezet melding, blokseinen, wissel (max 2 wissels parallel), verlichting (extra), ga uitzoeken of dat mogelijk is om met 1 Arduino te sturen.

Het stations gedeelte zou dan een Arduino mega moeten worden omdat er in de buurt van een station meerdere blokken zullen samenkomen.

Voor het stations gedeelte ga ik een Arduino mega gebruiken, dat is nu al zeker, voor de kleinere blokken ga ik een Arduino Nano met shield gebruiken, dit werkt makkelijker dan een standaard Arduino Uno, deze Arduino's zijn niet erg duur een complete set is al te koop voor 5 a 6 euro.

Het programma wat ik gemaakt heb blijf ik gebruiken en ga het verder verbeteren en uitbreiden.

Ook wil ik een dag/nacht simulatie maken met led strips, de elektronica daar voor is al zover klaar en het programma ook, ik ga voor de rgb driver de Arduino Pro mini gebruiken (heb ik al in mijn bezit).
De rgb driver is een onafhankelijk systeem en word niet gekoppeld aan de Arduino blok sturing.

De communicatie tussen de Arduino's is een andere uitdaging om te ontwerpen, er zijn namelijk meerdere opties, I2C -bus, RS485 -bus, de rx/tx -bus functie op de Arduino.

Het systeem moet ook makkelijk uitbreidbaar blijven.

De indeling van de Arduino, zoals ik in gedachte heb.

Port nr         Functie

  0               TX
  1               RX

  2               Blok 1
  3               Blok 2


  4               Sein kleur Rood
  5               Sein kleur Groen

  6               Wissel Rechtdoor
  7               Wissel Afbuigend

  8               Vrij
  9               Vrij

  10              ------------------------------
  11              Rij richting en snelheid
  12              -------------------------------

  13              Controle of het programma nog loopt

Op port 8 en 9 kan ik eventueel nog een extra bloksein aansluiten.

De Analoge porten worden nog even niet gebruikt, dat komt later als ik wat verder ben met het ontwerp.

Dat was het voor nu ;D

mvg Paul. :D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Peter Korsten op 13 januari 2015, 00:52:20
Het is mij ook niet helemaal duidelijk hoe ik een libray met een klasse moet maken, heb je misschien een klein voorbeeld voor mij, om het wat begrijpelijker te maken.  ::)

Een klasse is een soort "zwarte doos" in software. Het is een verzameling van data en code die bij elkaar horen. Wanneer je een klasse in het leven roept, is het een object. Dit alles bij elkaar heet objectgeoriënteerd programmeren.

Het is een zwarte doos omdat het jou als gebruiker van die klasse het je geen moer uitmaakt wat er zich binnenin die klasse afspeelt. Het enige waar je geïnteresseerd in bent zijn de procedures/functies ("methoden" geheten bij objectgeoriënteerd programmeren) en de variabelen ("leden" geheten) die die klasse aan je laat zien. Maar een klasse gebruikt ook interne variabelen en functies die voor niemand anders zichtbaar zijn: die heten privé.

In jouw geval zou een klasse een blok kunnen voorstellen, om maar een voorbeeld te noemen. Zo'n blok heeft een aantal eigenschappen, zoals de snelheid (aantal pulsen, voltage, dat idee), of er een trein aanwezig is (ja of nee) en meer van dat soort zaken.

In een digitaal systeem zou een klasse een loc kunnen voorstellen. Die heeft dan een snelheid, de status van de verlichting, of wat je dan maar ook kunt verzinnen dat bij die loc hoort.

Maar het moet wel bij elkaar horen. De baanverlichting hoort dus niet bij een loc. Maar seinbeelden horen weer wel bij een blok.

Dan heb je overerving. Een subklasse, afgeleid van een andere klasse, heeft alle zichtbare eigenschappen van die klasse, plus wat je er nog aan toevoegt. Stel je voor dat je een algemene klasse "elektrisch apparaat" hebt. Een eigenschap daarvan is hoeveel stroom het op dat moment gebruikt. Maar je hebt verschillende elektrische apparaten: lampen, wasmachines, koelkasten, etc. Voor een koelkast heeft het geen zin om te zeggen hoeveel toeren per minuut hij maakt (dat hoort immers bij de wasmachine), maar bij beide is wel de temperatuur van belang.

Dus dan zou koelkast een subklasse van elektrisch apparaat zijn en wasmachine een subklasse van koelkast. Immers, de koelkast voegt de temperatuur toe en de wasmachine ook nog eens het aantal toeren per minuut. Alleen is dat geen goed idee, want een wasmachine is niet een speciaal geval van een koelkast. Een koelkast moet je af en toe ontdooien; dat zul je bij een wasmachine niet zo gauw hoeven.

Wat je dan wel zou kunnen doen is om een nieuwe klasse te maken van "elektrisch apparaat met temperatuurinstelling" en zowel de koelkast en de wasmachine daarvan af te leiden.

Dan krijg je dit:
Klasse "elektrisch apparaat"
* void zetAan()
* void zetUit()
* int leesVerbruik()

Klasse "elektrisch apparaat met temperatuurinstelling": afgeleid van klasse "elektrisch apparaat"
* void stelTemperatuurIn( int temperatuur )
* int leesTemperatuur

Klasse "wasmachine": afgeleid van klasse "elektrisch apparaat met temperatuurinstelling"
* void stelAantalToerenIn( int aantalToeren )
* int leesAantalToeren()

Klasse "koelkast": afgeleid van klasse "elektrisch apparaat met temperatuurinstelling"
* void ontdooi()

Hiermee kun je ieder elektrisch apparaat aan- en uitzetten. Je kunt bij een elektrisch apparaat met temperatuurinstelling de temperatuur instellen (d'oh!), bij de wasmachine kun je het aantal toeren zowel instellen als uitlezen en een koelkast kun je ontdooien. Maar je kunt een wasmachine dus niet ontdooien en een bij algemeen elektrisch apparaat kun je niet de temperatuur instellen (het zou immers een televisie kunnen zijn).

Als dit ingewikkeld klinkt, dat klopt. Programmeren is allerminst simpel en objectgeoriënteerd programmeren vraagt een bepaalde manier van denken die heel anders is dan bij procedureel programmeren (wat je op dit moment doet).

Citaat
Ik denk dat je het verhaal een beetje verkeerd hebt begrepen, het is absoluut niet de bedoeling om een nieuw digitaal systeem te ontwerpen, het is de bedoeling dat ik de Arduino ga gebruiken, om een Arduino blok gestuurde modelbaan te maken, die ik met de computer kan bedienen.

Al mijn locomotieven zijn analoog (ongeveer 30 stuks),

Dinamo is mij veel te duur, als ik zie wat het de treinenclub heeft gekost om de clubbaan om te bouwen naar Dinamo en de clubbaan is nog niet rij vaardig, laat dan maar.

Nee hoor, ik had het prima begrepen. Mijn punt was dat een belangrijk voorbeeld van digitaal is dat het allemaal al is uitgevonden. Je vindt kant-en-klare schema's voor centrales, boosters, al dat soort gerei. Of je koopt meteen een eindproduct. Inderdaad zullen de initiële kosten al gauw boven de €1500 liggen (€750 om de locs digitaal te maken, €400 voor een centrale, nog een stel wisseldecoders en detectie erbij). Maar bij jouw systeem moet je alles helemaal zelf uitvinden, testen, fouten eruit halen en dat steeds opnieuw. Vooral de programmatuur zal niet meevallen: programmeren is niet simpel.

- Peter
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 13 januari 2015, 01:16:36
Hoi Peter

Bedankt voor je reactie.

Bedankt voor je voorbeeld, makkelijk is het niet maar ik denk dat ik er wel wat mee kan.

Ik weet dat programmeren niet makkelijk is, maar ik vind het wel een uitdaging, iedere stap die werk geeft mij de zin om een volgend probleem op te lossen.

Dat ik alles zelf moet uitdokteren vind ik leuk, het is ook niet de bedoeling om er een nieuw product op de markt te zetten.

Dit is voor mijn eigen modelbaan, het programma hoeft dan ook niet perfect te zijn en de sturing hoeft ook niet perfect te zijn, je moet het systeem zien als een analoge bedieningspaneel, maar dan via de computer.
Ik wil mijn modelbaan sturen via de computer maar het moet/hoeft niet automatische te zijn, zeg maar een terminal bediening voor de treinbaan.

Mvg Paul

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Peter Korsten op 13 januari 2015, 08:03:08
Dat scheelt al een boel. Het programma zal nog steeds niet vanzelfsprekend zijn, maar in ieder geval een heel stuk gemakkelijker dan wanneer je automatisch rijden zou willen hebben.

- Peter
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 13 januari 2015, 14:00:05
Ik heb wat gesurft om het een en het ander uit te zoeken over verschillende mosfet 's , er zijn mij twee types opgevallen die mij geschikt lijken (IRF 720 en IRF 820) de max stroom continu van de IRF 720 is 3.3 A en van de IRF 820  2.5 A, deze mosfet's  lijken mij geschikt voor mijn wissels.
Ik kan je vertellen, dat wordt aardig krap. Op het eerste gezicht lijken ze aardig geschikt maar kijk je beter kom je er achter dat het niet zo is. Laten we beginnen met de IRF720, deze heeft een Ron van 1,8ohm. Bij 1A stookt de transistor al 1,8W, bij 2A is dat al 7,2A! Omdat je de transistor niet continue aan hebt is dit niet zo'n probleem maar toch zonde. En een continue last schakelen met dezelfde print gaat alleen lukken met flinke koellichamen. Bij de IRF820 is de Ron alleen maar erger met 3,0ohm.

En dit is als de MOSFET volledig open geschakeld wordt. Hiervoor is de gate-source spanning van belang (VGS). In de datasheet staat dat deze minimaal tussen de de 2,0V en 4,0V moet zijn om de MOSFT open te schakelen. Nu levert de Arduino 5V dus zou je zeggen, geen probleem. Maar de opgegeven VGS is bij een stroom van 250uA! Scrollen we naar beneden zien we dat we met 5V net 1A kunnen schakelen (op kamertemperatuur). IRF820 doet het iets beter maar houdt ook niet over.

Beide MOSFETs hebben dus aardige nadelen. Ik zou toch nog even verder kijken als ik jou was. Is de eerder genoemde IRF7103 niets? Kan 3,0A aan, kost €0,25 (http://www.ebay.com/itm/50PCS-IRF7103TRPBF-IRF7103-7103-MOSFET-N-CH-50V-3A-8-SOIC-R9-/301168721448?pt=LH_DefaultDomain_0&hash=item461f0dfe28) (per twee kanalen, is dual channel), heeft een Ron van 0,130ohm en met een VGS van 5V is hij volledig aan voor 9A (pulsed). Hij is dan wel SMD maar op een geëtste printplaat met soldermask (hebben de printen uit China iig) is solderen echt een eitje.

Ik heb deze printjes juist  ruimer gemaakt, dat maak het solderen van de printjes een stuk makkelijker, ook als er een onderdeel kapot gaat is het makkelijk te vervangen.

Het lijkt tegenwoordig mode te zijn om de printen zo compact mogelijk te ontwerpen.  ???
Haha, klopt. Kleiner is nu eenmaal goedkoper! En dat vervangen is een beetje ruimte wel handig maar jij hebt zeeën! En voor vervangen is het vooral van belang dat je ruime gaten maakt. Een gat waar een component precies in past soldeert het makkelijkste maar desoldeert het lastigst, hoe veel ruimte je er ook omheen hebt.

Met wat ruimte over is niets mis maar zou ik wel een poging doen ze enkelzijdig te maken, moet makkelijk kunnen. Dat is toch altijd the holy grail bij het ontwerpen van printen  ;D Schuin gelijk alle bochten in de printsporen af. Heb je vooraf al beetje gekeken hoe duur het laten maken van de verschillende formaten is? Waar wil je ze laten maken?

Ik ga thuis niet zitten kliederen met chemische stoffen om printjes te maken, de printjes in China laten maken is een stuk goedkoper( ik hoef geen aparte kamer met exotische apparaten, lichtbak, etsbak, spoelbak enz., te kopen) en een stuk schoner. ;D
Tja, ik doe het zelf ook niet. Voor complexe printen is het het niet waard en je krijgt mooi soldermask en silkscreen enz. Maar voor simpele printjes als deze zou ik het nog wel eens willen gaan doen. (maar dan met een laserprinter, niet een lichtbak). Alleen nog niet van gekomen.

Sorry, maar ik begrijp de code niet helemaal
Schaam!!!  :-[ :-[ :-[ Er miste een belangrijk stuk in de code. Het had moeten zijn
const byte turnouts[] = {30, 31, 32, 33, 34, enz };

void setTurnout(byte turnout, byte state){
   digitalWrite(turnouts[turnout], state);
}
Is het nu logischer?

Het is mij ook niet helemaal duidelijk hoe ik een libray met een klasse moet maken, heb je misschien een klein voorbeeld voor mij, om het wat begrijpelijker te maken.  ::)
Yep, dat gaf ik aan het einde van de vorige post: Writing a Library for Arduino (http://arduino.cc/en/Hacking/LibraryTutorial)

Ik maak  soms gebruik van bestaande code en pas die aan aan mijn eigen eisen, op deze manier heb ik de basisopzet van de modelbaan sturing ontworpen.
Helemaal niet mis mee  :) Maar een vuistregel bij code is, als je heel vaak hetzelfde aan het typen bent doe je iets fout en is er een makkelijkere manier 8)

alleen wissels worden wat lastiger, daar zou een aparte Arduino voor nodig zijn.
Hoe bedoel je dit?

Wat wil ik per blok sturen allereerst de rijrichting en snelheid, blok vrij/bezet melding, blokseinen, wissel (max 2 wissels parallel), verlichting (extra), ga uitzoeken of dat mogelijk is om met 1 Arduino te sturen.
Doet een Arduino met twee vingers in zijn neus  ;D

voor de kleinere blokken ga ik een Arduino Nano met shield gebruiken
Denk, als je toch aan de slag gaat met printen maken, dat het mooiste is als je gewoon een print maakt. En waarom gebruik je hier een Nano en voor de RGB wel een mini?

De rgb driver is een onafhankelijk systeem en word niet gekoppeld aan de Arduino blok sturing.
Waarom? Voor hetzelfde geld hang je deze ook aan het netwerk en laat je de PC deze ook aansturen. Knopje wordt dag, knopje wordt nacht, klaar. Eventueel later uitgebreid met één (of meer) Arduino('s) voor straatverlichting enz.

De communicatie tussen de Arduino's is een andere uitdaging om te ontwerpen, er zijn namelijk meerdere opties, I2C -bus, RS485 -bus, de rx/tx -bus functie op de Arduino.
I2C voor korte afstanden en als je ze onder de baan wil spreiden zou ik voor RS485 gaan. Je zou zelfs de "Arduino aan de computer" kunnen schrappen (want echt, wat zal zijn taak zijn?) en de PC gewoon direct aan de RS485 bus hangen.

De indeling van de Arduino, zoals ik in gedachte heb.
Een blok moet makkelijk passen dus. Ga je toch elk blok voorzien van een motordriver?

En voor het bloksein, je hebt nog neit gezegd hoe je dat wilt doen. Je hebt nu twee poorten maar als je de seinen zelf maakt (dus niet koopt maar gewoon twee ledjes) heb je dus aan één pin genoeg.

Wat ik vooral nog mis, detectie! Of wil je niet dat er een soort bloksysteem is?

En heeft echt elk blok een wissel? Is het misschien niet handiger om een losse Arduino uit te rusten met meerdere drivers en deze gewoon de wissels laten doen?

Op een Uno/Nano/Pro Mini heb je 22 poorten. Voor motordriver gebruik je er 3, voor data 2, 1 voor LED. Zit je op 6 pinnen, heb je er nog 16 pinnen vrij. Voor ieder subblok (relais) heb je dan nog 1 pin nodig voor het relais, een pin voor een bloksein (één zijde) en nog een pin voor detectie. Kan je dus nog 16/3 = 5 subblokken kwijt op dezelfde Arduino! Heb je dus één Arduino voor 5 blokken welk dan op dezelfde motordriver zitten. En dan nog is de Arduino niet echt hard bezig  8)

Of, als je twee motordrivers op een Arduino hangt, heb je: 2 voor data, 1 voor led, en 2x3 voor twee motordrivers. Heb je nog 13 pinnen vrij. 13/3 = 4. Heb je dus één Arduino met twee motordrives/blokken met elk 2 subblokken. Met een bloksein en detectie per subblok. Lijkt me ook nog makkelijk te maken. Zeker omdat je een dual motordriver wilde gebruiken. (Toch? Ik twijfel maar zie hem zo snel niet  ::) )


Goed, weer heel verhaal  ;D Ik snap dat het hobby moet blijven en dat je alles nog eens overdenkt. Vandaar ook me lange verhaal, beter nu even wat langer nadenken dan straks de pest er over in hebben dat het niet gaat zoals je wilt en het project naar de prullenbak verwijzen. ;)


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 16 januari 2015, 01:46:48
Hoi volgers.

Ik ben bijna drie dagen bezig geweest met solderen, aan de proefbaantje, voor de Arduino Analoge Modelbaan Sturing, kortweg AAMS.

(https://images.beneluxspoor.net/bnls/GEDC0011a_1.jpg) (https://images.beneluxspoor.net/bnls/GEDC0011a_1.jpg)

Tussen de rails heb ik LDR's geplaatst als signalering of het spoor bezet is en op het kopspoortje een LDR en een reedcontact, er komen totaal 5 LDR's en 5 reed contacten op dit proefbaantje.

(https://images.beneluxspoor.net/bnls/GEDC0007a.jpg) (https://images.beneluxspoor.net/bnls/GEDC0007a.jpg)(https://images.beneluxspoor.net/bnls/GEDC0009a.jpg) (https://images.beneluxspoor.net/bnls/GEDC0009a.jpg)

Ook heb ik even twee nood seinen gemaakt om de AAMS te testen

(https://images.beneluxspoor.net/bnls/GEDC0004a.jpg) (https://images.beneluxspoor.net/bnls/GEDC0004a.jpg)(https://images.beneluxspoor.net/bnls/GEDC0003a.jpg) (https://images.beneluxspoor.net/bnls/GEDC0003a.jpg)

Onder het proefbaantje heb ik vier interfaces gemaakt.

2x een seinsturing een digitale / voeding interface en een analoge intertace, er moet nog een wissel sturing onder het proefbaante gezet worden, deze wil ik eerst testen voor ik hem plaats.

(https://images.beneluxspoor.net/bnls/GEDC0004.jpg) (https://images.beneluxspoor.net/bnls/GEDC0004.jpg)

Ik heb een begin gemaakt met de stuurkast.
In de stuur kast komt een Arduino Uno met sensor shield, interface print analoog/ digitaal/ voeding, een motor shield (L298) een tweevoudige relais kaart, en twee voedingen 5V, 12V en evt treintravo ( als ik zelf wil rijden ;) ).

Een gedeelte is klaar.

(https://images.beneluxspoor.net/bnls/GEDC0006.jpg) (https://images.beneluxspoor.net/bnls/GEDC0006.jpg)

Het is wel de bedoeling om dit Mini baantje (60 cm x 50 cm) te voorzien van scenery (kan nog een leuke uitdaging worden).

De schakelingen zijn op gaatjes-print gebouwd, ik had er nog een aantal van liggen.

Als mijn gedachten spinsels werken wil ik er printen voor gaan ontwerpen, deze worden dan in mijn modelbaan geplaatst.

Een zelfde systeem komt in mijn BNLS  N-Spoor modulebaan waar ik nog mee bezig ben.

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 17 januari 2015, 00:19:30
Hoi volgers

@Timo

Bedankt voor je input, ik heb jou reactie nog niet uitgebreid gelezen, maar dat doe ik zo spoedig mogelijk.

@Peter

Bedankt voor je reactie.

@Allen

Vandaag ben ik verder gegaan met het samen bouwen en testen van de interface's, alles werk in droge mode goed (pin 13 van de Arduino), er zat al een klein programma in.

Na nog wat soldeer werk zat alles in elkaar en kon er verder geëxperimenteerd worden.

Bij het testen van de analoge interface bleek deze verkeerd bedaard te hebben, tussen de baan en de stuurkast zitten 9 polige sub-D connectoren, tussen de analoge connector en de stuurkast zat de bedrading fout, dat heb ik veranderd.

Daarna nog een tijd bezig geweest met de sein-printen om ze goed af te regelen.

Ik heb een klein Arduino programma gemaakt om de drempel waarde van de LDR-sensoren te bepalen, deze waardes heb ik nodig om de verschillende LDR-sensoren te kunnen gebruiken met de AAMS.

Vanavond ben ik begonnen om het AAMS programma te schrijven.

Ik heb nog wat proef gereden met een trein, ik kwam er achter dat ik niet te snel over de LDR-sensoren moet rijden, het gaat overigens wel goed als ik op schaal snelheid rij, maar dat is ook de bedoeling. ;D

mvg Paul.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 18 januari 2015, 00:05:47
Hallo Paul,
Wat is de reden dat je LDR's gebruikt. Nadeel van de LDR is volgens mij dat deze "langzaam" van waarde verandert als de hoeveelheid opvallend licht verandert. Dat heb je al gemerkt als de locomotief te snel rijdt. Voordat de weerstandwaarde is veranderd is de trein er al overheen gereden. Een ander nadeel is dat de weerstand waarde afhankelijk is van het opvallende omgevingslicht. M.a.w. als het omgevingslicht vermindert dan zal de LDR aangeven dat er een trein passeert. Ik zou voor dat doel gewoon ir leds met ir transistoren gebruiken. Op de site van opendcc staat daarvan een mooi storingsvrij voorbeeld.
Verder is het weer leuk om je alternatieve treinbesturing te volgen.

Succes weer.

Frits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 18 januari 2015, 00:26:57
Hoi, Volgers

Ik zag dat dit topic al weer ruim 11000 bekeken is, allemaal heel erg bedankt daarvoor  (y) (y) (y), ik vind het leuk dat er toch zo veel belangstelling voor dit topic is.

Vandaag ben ik bezig geweest om de stuurkast samen te bouwen, ik zat nog te wachten op de Arduino Nano + shield , vanmorgen werd het pakketje bezorgt.

Ik ben overgestapt van de Arduino UNO naar de Arduino Nano omdat de Nano kleiner en flexibeler is.

Zoals gezegd ben ik verder gegaan met het bouwen en bedraden van de stuurkast.
In de stuurkast zitten twee Nano's, een L298 motorsturing, een blok Relais en een interface voor de koppeling naar de baan.

De onderlinge componenten zijn door middel van:  dupoint wires, met elkaar gekoppeld, dit werk een stuk makkelijker dan allemaal draden te moeten solderen, en het ziet er een stuk netter uit, de losse draden lopen door gootjes(ringbanden) heen.

Ik hen er even spanning op gezet en alles werk goed, het in nu alleen nog een kwestie van programmeren, dat is een flinke uitdaging, het programma zal niet klein zijn.

De stuurkast,

(https://images.beneluxspoor.net/bnls/GEDC00013.jpg) (https://images.beneluxspoor.net/bnls/GEDC00013.jpg)
(https://images.beneluxspoor.net/bnls/GEDC00016.jpg) (https://images.beneluxspoor.net/bnls/GEDC00016.jpg)

Morgen ga ik beginnen aan het AAMS programma, ik ga eerst een deel in de Arduino taal programmeren en er moet nog een programma in gambas (visual basic voor linux) gemaakt worden om het proefbaantje te kunnen sturen met de computer.

mvg Paul


Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 18 januari 2015, 00:56:49
Hoi Frits

Bedankt voor je input.

Ik vind het leuk om alternatieven uit te proberen, ik had nog van alles aan electronica onderdelen liggen, die ik voor dit project wil gaan gebruiken, vandaar mijn keuze voor een LDR en alle alternatieve oplossingen voor deze sturing, ik kan wel alles na-apen  ;) (vind ik echt geen probleem, het wiel is al eens uitgevonden  ;D ), ik wilde een budget oplossing om mijn modelbaan te automatiseren en ik vind het leuk om van alles uit te proberen.

De LDR-sensoren werken op het proefbaantje goed, je moet wel een drempelwaarde instellen om de LDR-sensor goed te laten werken, voor mijn bnls n-spoor module zal het omgevingslicht veel minder invloed hebben, doordat de module in een kijkkast zit met zijn eigen bijna constante verlichting.

Dat ik langzamer moet rijden met mijn locomotieven vind ik niet erg, kan ik meer genieten :) van een trein die door een mooi landschap rijd, en kleine stoom locomotief op TGV snelheid heb ik nog nooit zien rijden ;) ;D

Ik wil op mijn baan op bijna schaal snelheid rijden (niet alle locomotieven kunnen op schaalsnelheid rijden), de treinen zullen niet hard rijden, zodat de LDR-sensoren goed blijven werken.

Als ik zover ben zet ik wel een filmpje op het forum.

Ik wil zeker nog andere sensoren gaan testen op het proefbaantje, ik ben al bezig met reed-contacten.

We blijven zeker nog wel een tijdje experimenteren om een budget analoge modelbaan sturing te ontwerpen. 

Oja, deze sturing heb mij nog geen 50 Euro gekost en het levert mij een hoop hobby plezier op. ;) ;D

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 18 januari 2015, 23:00:39
Hoi, volgers

Hierbij een kort filmpje van een werkende  AAMS programma, het programma is nog lang niet af, maar het begin is er.
De loc rijd eerst snel als de loc een sein voorbij rijd gaat de loc langzamer rijden, en gaat weer sneller rijden voorbij het volgende sein.

De film kwaltijd is niet zo goed, maar het gaat om de sturing.
De seinen werken ook al is het niet zo goed te zien.

Het filmpje: https://www.youtube.com/watch?v=oJxiB2Qlw_w

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 01 februari 2015, 20:01:37
Hoi, Volgers

Het is alweer een tijdje geleden dat ik een update van de Arduino analoge modelbaan sturing heb geplaatst.
Dat wil niet zeggen dat ik er niet mee ben verder gegaan, ik heb ondertussen een Arduino programma geschreven, het is nog lang niet klaar en er moet nog veel geprogrammeerd worden, maar het basis programma werkt goed.

Het programma moet nog beter uitgewerkt worden, er staat nog teveel code in, ik laat het er in om verder te kunnen testen.

Het voorlopige programma:

/*
   Arduino analoge modelbaan stuuring.
   
   Auteur : Paul Smits
   
   Versie 1.0 (is nog in testfase)
   
   Nieuwe functie sturing(trein,snelheid,richting)
   Vervangt de functie move(motor,speed,direction)
   Zijn feitelijk dezelfde funcie alleen omgezet naar de modelbaansturing.
   
   Het in stappen optrekken en afremmen is er uit gehaald.
   De trein trekt nu langzaam op of remt nu langzaam af zonder stappen.
   
   Deze software is vrij aanpasbaar en kan door iedereen gebruikt worden,
   voor zijn eigen modelbaan of eigen project.
   
   LET OP !:Het gebruik van het programma geschied op eigen risico.
*/


  #include <Wire.h>
  #include <LCD.h>
  #include <LiquidCrystal_I2C.h> // library voor 12c lcd display

/***** Global vars ***********************************************/

// Define I2C Address where the PCF8574A is

  #define BACKLIGHT_PIN     3

  LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // adressering lcd display

  char incomingByte;


/******************************************************************************
 * Definitions
 ******************************************************************************
 *motor A is aangesloten op OUT1 en OUT2 van de motorsturing
 *motor B is aangesloten op OUT3 en OUT4 van de motorsturing
 ******************************************************************************/

  // Set pin numbers als constanten, deze waardes zullen niet veranderen.
 
  const int seinR1 = 2;   // sein 1 Rood = stop blok 1
  const int seinG1 = 3;   // sein 1 Groen = vrijgave blok 1
  const int seinG2 = 5;   // sein 2 Rood = stop blok 2
  const int seinR2 = 4;   // sein 2 Groen = vrijgave blok 2
 
  const int wisselR = 6;  // Wissel stand Rechtdoor
  const int wisselA = 7;  // Wissel stand Afbuigend
  const int AIN1 = 8;    // Richting Rechtom
  const int AIN2 = 9;    // Richting Linksom
  const int PWMA = 10;    // Snelheids regeling trein
  const int blok1 = 11;    // Blok 1
  const int blok2 = 12;    // Blok 2
  const int ledPin = 13;  // Controlle of het programma nog loopt.
 
  // Analoge porten toewijzen.
 
  const int ldrBlok1  = A0; // Detectie Blok1
  const int ldrBlok1s = A1; // Detectie Blok1 sectie 1
  const int ldrBlok2  = A2; // Detectie Blok 2
  const int ldrBlok2s = A3; // Detectie Blok 2 sectie 1
 
  int ledState = LOW;
  int seinR1State = LOW;
  int seinG1State = HIGH;
  int seinR2State = LOW;
  int seinG2State = HIGH;
  int blok1State = HIGH;
  int blok2State = HIGH;
  int wisselRState = HIGH;
  int wisselAState = HIGH;
 
  int Interval = 500; // Tijd vertraging van 0.5 seconden
  // Drempelwaarde van de LDR-sensors moeten induvueel ingesteld worden.
  int Drempelwaarde  = 300;
  int Drempelwaarde1 = 150;
  int Drempelwaarde2 = 300;
  int Drempelwaarde3 = 150;
 
  long previousMillis = 0;
 
 void setup()
 {
   pinMode(seinR1,OUTPUT);
   pinMode(seinG1,OUTPUT);
   pinMode(seinR2,OUTPUT);
   pinMode(seinG2,OUTPUT);
   pinMode(blok1,OUTPUT);
   pinMode(blok2,OUTPUT);
   pinMode(wisselR,OUTPUT);
   pinMode(wisselA,OUTPUT);
   pinMode(PWMA,OUTPUT);
   pinMode(AIN1,OUTPUT);
   pinMode(AIN2,OUTPUT);
   pinMode(ledPin,OUTPUT);
   // Beginstand porten defineren
   
   digitalWrite(seinR1,HIGH);
   digitalWrite(seinG2,HIGH);
   digitalWrite(seinG1,LOW);
   digitalWrite(seinR2,LOW);
   digitalWrite(wisselR,HIGH);
   digitalWrite(wisselA,HIGH);
   digitalWrite(blok1,HIGH);
   digitalWrite(blok2,HIGH);
   
   lcd.begin (16,2);
   
  // Zet de backlight aan.

  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home (); // go home

  // Print a message to the LCD.

  lcd.setCursor(2,0); //Start at character 2 on line 0
  lcd.print("Arduino Nano");
  lcd.setCursor(1,1);
  lcd.print("AAMS V1.0");

  Serial.begin(9600);
  Wire.begin();
  Serial.println("Arduino Nano test programma : Motorsturing, bloksturing, seinsturing");
 }
 void loop()
{
  // Controlle led om te zien of het programma nog werkt.

  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > Interval) {

    // save the last time you blinked the LED

    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:

     ledState = !ledState;

    // set the LED with the ledState of the variable:

    digitalWrite(ledPin,ledState);

    }
     
    if (Serial.available() > 0) {  // kijk of de seriele verbinding beschikbaar is.
      incomingByte = Serial.read(); // Lees een 'byte'.
    }
   if(incomingByte == '1') {
     
     Wire.beginTransmission(5);
     Wire.write('H');
     Wire.endTransmission();
     
     int ldrBlok1Waarde  = analogRead(ldrBlok1);
     int ldrBlok1sWaarde = analogRead(ldrBlok1s);
     int ldrBlok2Waarde  = analogRead(ldrBlok2);
     int ldrBlok2sWaarde = analogRead(ldrBlok2s);
     
      digitalWrite(blok2, LOW);
      Serial.println("Blok 2 : Vrij");
   
     
   if   (ldrBlok1Waarde < Drempelwaarde){
        digitalWrite(seinR1,LOW);
        digitalWrite(seinG1,HIGH);
        digitalWrite(seinR2,HIGH);
        digitalWrite(seinG2,LOW);
        sturing(1,150,1);
       }
 
   if  (ldrBlok2Waarde < Drempelwaarde){
        digitalWrite(seinR1,HIGH);
        digitalWrite(seinG1,LOW);
        digitalWrite(seinR2,LOW);
        digitalWrite(seinG2,HIGH);
        sturing(1,125,1);     
      }
   }
    if(incomingByte == '2') {
         
     int ldrBlok1Waarde  = analogRead(ldrBlok1);
     int ldrBlok1sWaarde = analogRead(ldrBlok1s);
     int ldrBlok2Waarde  = analogRead(ldrBlok2);
     int ldrBlok2sWaarde = analogRead(ldrBlok2s);
     
     digitalWrite(blok2, LOW);
     
     if  (ldrBlok1Waarde < Drempelwaarde){
       blok(1,1);
       sturing(1,150,1);   
       }
     if (ldrBlok2Waarde < Drempelwaarde){
       blok(0,1);
       sturing(1,125,1);
     } 
       
   }
   if(incomingByte == '0') {
     
     Wire.beginTransmission(5);
     Wire.write('L');
     Wire.endTransmission();
     
     sturing(1,0,1);
     
      digitalWrite(blok2, HIGH);
     
      digitalWrite(seinR1,LOW);
      digitalWrite(seinG1,HIGH);
      digitalWrite(seinR2,HIGH);
      digitalWrite(seinG2,LOW);
   }   
} // einde loop


void sturing(int trein, int snelheid, int richting){
 
  // Zet de parameters van de functie sturing(trein, snelheid, richting)
  // Trein 1: linksom en Trein 2 output B op het motorshield
  // Snelheid: 0 is stop, 255 is maximale snelheid
  // Richting: 0 Rechtsom, 1 Linksom
 
  boolean inPin1 = LOW;
  boolean inPin2 = HIGH;

  if(richting == 1){
    inPin1 = HIGH;
    inPin2 = LOW;

  }

  else{
    if(richting == 0) 
    inPin1 = LOW;
    inPin2 = HIGH;

  }

  if(trein == 1){
    digitalWrite(AIN1, inPin1);
    digitalWrite(AIN2, inPin2);
    analogWrite(PWMA, snelheid);

  }

  //else{
    //digitalWrite(BIN1, inPin1);
    //digitalWrite(BIN2, inPin2);
   // analogWrite(PWMB, snelheid);

 // }
}
 void blok(int sein, int blokState){
   
   boolean sPin1 = LOW;
   boolean sPin2 = HIGH;
   boolean bPin1 = LOW;
   boolean bPin2 = HIGH;
   
   if (sein == 1){
     
     digitalWrite(seinR1,sPin1);
     digitalWrite(seinG1,sPin2);
     digitalWrite(seinR2,sPin2);
     digitalWrite(seinG2,sPin1);
   }
   
   //else{
     
     //digitalWrite(seinR1,sPin2);
     //digitalWrite(seinG1,sPin1);
     //digitalWrite(seinR2,sPin2);
     //digitalWrite(seinG2,sPin1);
   //}
   
   if (sein == 0){
     
     digitalWrite(seinR1,sPin2);
     digitalWrite(seinG1,sPin1);
     digitalWrite(seinR2,sPin2);
     digitalWrite(seinG2,sPin1);
   }
   
   //else{
     //digitalWrite(seinR1,sPin1);
     //digitalWrite(seinG1,sPin2);
     //digitalWrite(seinR2,sPin2);
     //digitalWrite(seinG2,sPin1);
  // }
   
   if (blokState == 1){
     digitalWrite(blok1,bPin2);
     digitalWrite(blok2,bPin1);
     Serial.println("Blok 1: vrij --> Blok 2 bezet");
    }
   //else {
     //digitalWrite(blok1,bPin1);
     //digitalWrite(blok2,bPin2);
    // Serial.println("Blok 1: bezet --> Blok 2: vrij");
   //}
   if (blokState == 0){
     digitalWrite(blok1,bPin1);
     digitalWrite(blok2,bPin2);
     Serial.println("Blok 1: bezet --> Blok 2: vrij");
   }
   
   //else {
     //digitalWrite(blok1,bPin1);
     //digitalWrite(blok2,bPin2);
    // Serial.println("Blok 1: bezet --> Blok 2: vrij");
   //}   
 } 
 

Ik zal proberen nog een aantal schema's van de diverse componenten in dit topic te zetten.

De Schema's

Seinsturing:

(https://images.beneluxspoor.net/bnls/AAMS_seinsturing_schema.jpg) (https://images.beneluxspoor.net/bnls/AAMS_seinsturing_schema.jpg)

De Seinsturing heb ik reeds gebouwd en dat werk, ik wil nog uittesten of ik de seinsturing van twee seinbeelden kan sturen met 1 i/o port, zie schema 2

Wisselsturing:

(https://images.beneluxspoor.net/bnls/AAMS_wisselsturing_schema.jpg) (https://images.beneluxspoor.net/bnls/AAMS_wisselsturing_schema.jpg)

Ik wacht op de bestelde onderdelen om de wisselsturing te gaan bouwen.

Bezetmelding:

(https://images.beneluxspoor.net/bnls/AAMSbezetmelding_schema.jpg) (https://images.beneluxspoor.net/bnls/AAMSbezetmelding_schema.jpg)
T1 is een BC 557

Ik wacht op de bestelde onderdelen om de bezetmelding te gaan bouwen.

Onder de test baan zit nog een analoge interface, dat schema moet ik nog maken, en in de kast zit nog een interface ook dat schema moet ik nog maken.

Zoals altijd hou ik mij aanbevolen voor verbeteringen en/of aanmerkingen van het AAMS programma, of de hardware  :) ;D

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 02 februari 2015, 09:23:00
LEDs van je seinen even omdraaien. Zo doen ze het echt niet.

Gerard van der Sel..
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 02 februari 2015, 15:16:24
Hoi Paul,

Ik ga weer eens reageren  ;D

Wat ik me als eerste vooral afvraag, hoe ga je de boel voeden? Je tekent wel steeds 12V lijnen, 5V lijnen enz. Maar zijn dit allemaal losse voedingen? En wat ga je allemaal hoe voeden? Heb je
- één voeding Arduino's (liefst 7v+)
- één voeding voor rijden
- één voeding voor wissels
- één voeding voor seinen
Of zijn er dingen gecombineerd? En waar voedt je de relais uit?

Vraag komt vooral omdat je steeds wel tekent van, deze lijnen gaan naar de Arduino. Maar GND zit daar nooit bij...

Wisselsturing
Voor de wisselsturing, toch afgestapt van MOSFETs? Je zou de gate weerstand nog wat kunnen verkleinen. Met 1k limiteer je jezelf tot 1,8A voor de spoelen. (VBE van 2,5V, blijft er 2,5V over voor 1k. 2,5V / 1k x 750 = +-1,8A.) Zeker in de piek kan een wissel wel meer vragen waardoor de spanning wat traag op kan lopen.

Seinsturing
Je moet inderdaad de LEDjes omdraaien. En waarom stuur je ze op twee verschillende manieren aan? Ook, als je per Arduino maar twee seinen aanstuurt, kan je het ook prima direct uit de Arduino voeden. (En juist de slurpende relais uit een losse voeding.) Zo heb je geen transistors nodig en per sein maar 1 pin.

Bezetmelding
Mooie basis bezetmelder. Je zou eventueel nog een weerstandje over de diodes kunnen zetten. Wordt eigenlijk altijd gedaan omdat op deze manier de melder wel heel erg gevoelig is. En ik zou een Ctje plaatsen over R2 zodat je bezetmelder niet staat te klapperen op je PWM signaal. En hij is nu natuurlijk maar in één rijrichting te gebruiken... Is dat de bedoeling? Lijkt me niet zo praktisch.

Code
Het maken van een library is nog niet gelukt? Dit lijkt mij de boel echt veel eenvoudiger te maken namelijk. Zoals gezegd, als je vaak bijna hetzelfde aan het opschrijven bent is er een makkelijkere methode.

Eerste wat me opvalt is dat je nogal slordig de code wel en niet hebt laten inspringen. Dit is niet zo bevorderlijk voor de leesbaarheid en maak je makkelijk fouten. Dus doe jezelf een lol en probeer dit netter te doen. Arduino helpt je hier al erg hard mee! Dus inspringen na een { en de sluitende } op gelijke hoogte als de functie waar de openende bracket bij hoort.

En nog een ding wat gebruikelijk is bij Arduino en de leesbaarheid ten goede komt, een const begint met een hoofdletter en een niet const begint juist niet met een hoofdletter. Dus:
const int DitIsDusEenConst;
int ditIsGeenConst;
Dit zodat je aan de naam kunt zien of je hem nu kunt beschrijven of niet.

Daarna ben je redelijk goed aan de slag gegaan met millis(). Maar, previousMillis moet een unsigned long zijn om gekke problemen te voorkomen. Iets wat je later wel doet met
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > Interval) {
Het wegschrijven van millis() naar een var is hier overigens een beetje nutteloos. Je kan gewoon
  if(millis() - previousMillis > Interval) {
Huidige millis() wegschrijven is alleen nuttig als je op meerdere intervals gaat controleren en je zeker wilt zijn dat het check moment voor alle intervallen gelijk is.

Ook declareer je een hele rij met states. Deze gebruik je vervolgens nergens. Is ook niet nodig aangezien je dat gewoon terug kunt lezen. Om een LED te togglen kan je gewoon schrijven digitalWrite(LedPin, digitalRead(LedPin));

In de hele if-tree voor het binnenkomende byte (wat geen byte is maar een char....) kan je de boel iets meer vrij maken door else if te gebruiken. Als er dan een regel gevonden wordt waaraan de binnenkomende char gelijk aan is dan stopt hij met checken van de rest. Nogal zinloos om, nadat je hebt vastgesteld en hebt gehandeld alsof het een "1" is, dan nog te checken of het een twee is.

In de functie blok() maak je eerst een rij met bools aan om ze daarna alleen maar in te vullen in digitalWrite. Maakt het niet echt leesbaar. Wat is het idee er achter?

Om de afhandeling wat soepeler te maken zou ik ook de baud rate van serial opvoeren.

Library
Om een beetje aan te geven wat het idee is van een library in dit geval heb ik een kleine opzet gemaakt van een blok.
AamBlok.h
/*
AamBlok.h v1 - Library to iets
Created by Timo Engelgeer (Septillion), February 2, 2015
*/

#ifndef AamBlok_h
#define AamBlok_h

#include "Arduino.h"

#define AAM_GROEN 1
#define AAM_ROOD 0

class AamBlok{
public:
AamBlok(byte pinBlok, byte pinSein, byte pinLdr, byte pinLdrS, int ldrDrempel);
void bezet();
void vrij();
void sein(byte state);
bool checkBezet();
bool isBezet();
void checkStop();
void update();

protected:
bool bezetState;

byte pinBlok;
byte pinSein;
byte pinLdr;
byte pinLdrS;

int drempel;

};

#endif

AamBlok.cpp
/*
AamBlok.h v1 - Library to iets
Created by Timo Engelgeer (Septillion), February 2, 2015
*/

/*
Blaa, dit doet iets :p
*/

#include "Arduino.h"
#include "AamBlok.h"

AamBlok::AamBlok(byte pinBlok, byte pinSein, byte pinLdr, byte pinLdrS, int ldrDrempel){
this->pinBlok = pinBlok;
this->pinSein = pinSein;
this->pinLdr = pinLdr;
this->pinLdrS = pinLdrS;
this->drempel = drempel;

pinMode(this->pinBlok, OUTPUT);
pinMode(this->pinSein, OUTPUT);
pinMode(this->pinLdr, INPUT);
pinMode(this->pinLdrS, INPUT);

digitalWrite(this->pinBlok, HIGH);
digitalWrite(this->pinSein, HIGH);
}

//maak blok bezet
void AamBlok::bezet(){
this->bezetState = true;
}

//maak blok vrij
void AamBlok::vrij(){
this->bezetState = false;
}

//zet sein op rood of groen.
void AamBlok::sein(byte state){
digitalWrite(pinSein, state);
}

//Check of LDR een trein ziet en pas bezet aan. return bezet.
bool AamBlok::checkBezet(){
if(analogRead(this->pinLdr) < this->drempel){
this->bezetState = true;
}
else{
this->bezetState = false;
}

return this->bezetState;
}

//return is blok is bezet
bool AamBlok::isBezet(){
return this->bezetState;
}

void AamBlok::checkStop(){
if(analogRead(this->pinLdrS) < this->drempel && digitalRead(this->pinSein) == AAM_ROOD){
digitalWrite(this->pinBlok, LOW);
}
}

void AamBlok::update(){
this->checkBezet();
this->checkStop();
}

In de basis gebruik je dat dus als:
#include <AamBlok.h>

//AamBlok(pinBlok, pinSein, pinLdr, pinLdrS, drempelwaarde)
AamBlok blok1 = AamBlok(0, 1, A0, A1, 300);
AamBlok blok2 = AamBlok(2, 3, A2, A3, 300);

void setup(){
   
}


void loop(){
    blok1.sein(AAM_ROOD);
}

Succes er weer mee!


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 02 februari 2015, 23:45:48
Hoi, volgers

@Gerard

Bedankt voor je reactie, de seinsturing is op je juiste manier gebouwd, moet ook niet laat op de avond schema's gaan tekenen ::) ;D

@Timo

Bedankt voor je input.

De boel word gevoed met :

12V via treintrafo naar Motorshield (daarmee kan ik de snelheid van de treinen beter bijregelen.) als de verschillende locomotieven verschillende snelheden hebben (het is een analoge treinsturing), later word dat geregeld met een potmeter op de analogeport.

De voeding van de wissel spoelen komt ook van de treintrafo, later word er een vaste voeding voor de wissel spoelen gemaakt.

Een 5V voeding voor zowel de seinsturing en de Arduino Nano en de relais,  5Volt en 1.5 Ampere.

De gate weerstand verlaagt naar 820 Ohm, dat is ongeveer 2,5 Ampere, ik denk dat het wel voldoende is om de wissels te sturen, worden max 2 wissels per keer gestuurd.

De ledjes op de seinsturing die ik gebouwd heb werken wel, alleen verkeerd in het schema gezet. ::)

De seinen worden met  1 van de twee schakelingen gestuurd, ik moet nog even testen wat makkelijker is, ik heb een kleine voorkeur voor iedere led een eigen i/o port, het testen zal dat uitwijzen.

De transistors zitten er expres tussen om wat meer led's te kunnen voeden Sein, bedienings-paneel en op de print zelf.

Wat moet de weerstandswaarde over de diodes ongeveer zijn en hoe groot moet de condensator over de weerstand R2 zijn, ik heb daar nog geen ervaring mee.

Er word voorlopig maar in 1 richting gereden (om het wat makkelijk te houden), de modelbaan word gebouwd volgens het hondebot principe.
Ik ben nog wel bezig om een sturing te ontwerpen voor een pendelbaan, dat is pas voor later.

Nee dat klopt, hoe het komt dat de code niet goed inspringt weet ik niet  ??? , het Arduino programma maak er zelf een rommeltje van, na iedere programma regel geef ik een enter, zodat de regel naar mijn idee op de juiste manier inspringt.

Bedank voor het opzetje om een library te schrijven, en een korte beschrijving hoe ik het moet aanroepen,
ik ga er zo snel mogelijk mee aan de slag.

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 03 februari 2015, 21:19:00
Hoi Paul,

Voeding
Omdat je voor de wissels en het rijden een losse trafo gebruikt mis ik eigenlijk in je ontwerpt de verbinding van de verschillende voedingen. Zou kunnen dat je deze bij de trafo uitvoert en gewoon een GND leiding maakt. Maar bedenk wel dat deze dan echt dik moet zijn. Alle stroom door de kabel veroorzaakt dan spanningsval voor alle lijnen. Zeker als je de Arduino uit 5V voedt heb je niet zo veel marge om spanning kwijt te raken.

Seinen
Kan gebeuren  ;D Ik moest ook drie keer kijken wat GND was. Maar echt nodig zijn transistors niet. Hoeveel LEDjes komen er nu aan één Arduino? Max 4 seinen? Waarvan altijd max één LED aan staat. En je tekent zelf in je schema 680ohm dus dat maakt nog een 5mA per LED. Kom je uit op maar 20mA voor de LEDjes. Dit kan je dan ook wel uit de Arduino zelf voeden, scheelt weer schakelingen. En je kan gewoon 1 pin per sein gebruiken  ;D (Ga ik in de library opzet ook vanuit.)

En als je toch transistor wilt gebruiken, waarom ben je dan niet gewoon voor dezelfde opzet gegaan als bij de wissels? Dus een NPN transistor naar GND? Dit is ook de manier waarop alle moderne decoders het doen en hoe seinen dus gemaakt zijn nu. Lijkt me dus een pluspunt. Ook kan je dan gewoon de voeding van de seinen wisselen als je kant en klaar seinen wilt gebruiken en dus 12V nodig hebt. Iets dat nu niet kan.

Detectie
Zeg dat je een minimale stroom van 2mA wilt hebben. Over iedere diode valt bij lage belasting misschien een halve volt. Dus spanningsval over de weerstand moet 1V zijn bij 2mA. 1V / 2mA = 500ohm. Maar aangezien de transistor al eerder met geleiden zal beginnen zal er wat minder stroom nodig zijn maar het is een richtlijn. Bij geen last is de basis van de transistor nu in ieder geval dichtgetrokken.

De condensator kan je ook wel berekenen maar is iets lastiger maar kunnen het een beetje afschatten. Spanningsval over de LED is typ. 1,3V. Een C over R2 laad zich op tot 12V. De spanning van R3 is dus 12 - 1,3 = 10,7V. Verwaarlozen dat de spanning over de LED verandert met de stroom en dat er nog een 100k zit kunnen we het benaderen met V = Vstart * e-t * 1/(RC) waarbij R = R3 = 1k. Stel dat we zeggen dat er minimaal 1mA door de LED moet blijven lopen om bezet te melden en de PWM frequentie is 100Hz (maakt 10ms periode). Minimale voltage is dan 1mA x 1k = 1V. Bouw je de formule voor de spanning om naar C krijg je (en dit netjes weergeven is een forum niet zo goed in) C = -t / (ln( V/Vstart ) * R). Invullen geeft - 10ms / (ln(1/12) * 1k) = 4uF.

De waarde is een richtwaarde, ik heb verschillende aannames gedaan, oa minimale stroom voor de LED en eigenlijk een duty cycle van 0% enzo. Dus ik verwacht dat de waarde aan de grote kant is. Maar dus iets in de orde grote van 1uF. 4uF kan ook en verwacht ik niet dat hij er merkbaar traag van wordt ofzo.

En voor het ompolen, mm, ik weet zo 123 daar geen mooie oplossing voor... Zou ik echt moeten gaan tekenen... Maar als altijd in één richting gereden wordt is het makkelijk.

Code
Voor het inspringen, Arduino doet het inderdaad zelf. Maar ik heb er ook wel eens ruzie mee als ik dingen aanpas. Vooral als je zelf een keer de backspace gebruikt. Arduino pas het alleen aan als je echt enter drukt of } gebruikt maar zal het niet later corrigeren als je het anders doet.

Wat betreft library, snap je nu het principe? Iets wat ik er nog niet ingebakken heb is zeg maar een blok nummer in het algemene systeem. Dus uniek op alle Arduino's). Dit zou op zich communicatie tussen alle blokken makkelijk maken. En om het makkelijk schaalbaar te houden zou je ook de blokken anders in de sketch kunnen zetten namelijk als array.

#include <AamBlok.h>

//AamBlok(pinBlok, pinSein, pinLdr, pinLdrS, drempelwaarde)
AamBlok blokken[] = {AamBlok(0, 1, A0, A1, 300), AamBlok(2, 3, A2, A3, 300)};

#define NR_BLOKKEN sizeof(blokken)/sizeof(blokken[0])  //Geeft aantal blokken

void setup(){
   
}

void loop(){
    blokken[1].sein(AAM_ROOD); //Zet sein tweede blok op rood
   
    blokken[0].sein(!blokken[1].isBezet()); //Maakt sein van 1e blok rood als 2e blok bezet is.

    //alle blokken langs lopen
    for(byte i = 0; i < NR_BLOKKEN; i++){
        blokken[i].update();
    }
}
Zoals je ziet kan je dan makkelijk iets bij alle blokken doen zonder dat je deze dus zelf allemaal moet nalopen. Of je er nu 2 of 5 hebt  ;D Library is nog erg basic maar denk dat het op zich goed uit te breiden is :)


Timo[/code]
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 03 februari 2015, 21:38:12
Om het programma overzichtelijker te maken kan je in de Arduino IDE in het tabblad Extra op Automatische opmaak klikken (Cntr+T)

(https://images.beneluxspoor.net/bnls/2015_02_03_212906.jpg) (https://images.beneluxspoor.net/bnls/2015_02_03_212906.jpg)

gr. Frits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 15 februari 2015, 22:55:50
Hoi Volgers

@Timo

Bedankt voor de input.
Helaas heb ik nog even geen tijd gehad om aan de library te werken.

Hoewel er in de schema's niet een directe verbinding getekend is, is deze gnd er wel in het schema aangegeven als +5v GND deze gaan naar de Arduino, de sturing voor de wissels wil ik galvanische gescheiden houden van de Arduino, de snelheids regeling van de motorschield is wel via de GND gekoppeld met de Arduino.

@Frits

Bedankt voor de input.

@allen

Ik heb het de laatste tijd druk gehad met andere zaken , werk, verbouwen, zodat ik even geen tijd heb gehad om verder met AAMS te gaan.

Vandaag had ik weer even tijd om er mee verder te gaan.

Ik heb een IR blok detectie gemaakt, dit alleen nog in een proef opstelling, ik moet het nog verder perfectioneren, zowel de sturing als het programma.

Het schema:
(https://images.beneluxspoor.net/bnls/IR_schema_1.jpg) (https://images.beneluxspoor.net/bnls/IR_schema_1.jpg)

De proefopstelling:
(https://images.beneluxspoor.net/bnls/IMG1650_exemplaar_1.jpg) (https://images.beneluxspoor.net/bnls/IMG1650_exemplaar_1.jpg)

Het arduino programma:

/* IR blok bezet melder voor de AAMS sturing 
   Dit is de eerste versie van deze sturing,
   moet nog in het AAMS programma worden gebouwd.
*/

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h> // library voor 12c lcd display

#define BACKLIGHT_PIN     3

  LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // adressering lcd display

const int IRblok1 = A0;
const int IRblok2 = A1;

const int rood =  4;
const int geel =  3;
const int groen = 2;

int drempelWaarde1 = 750;
int drempelWaarde2 = 500;
int drempelWaarde3 = 250;

void setup(){
 
  lcd.begin (20,4);
 
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home (); // go home

  // Print a message to the LCD.

  lcd.setCursor(3,0); //Start at character 2 on line 0
  lcd.print("Arduino UNO R3");
  lcd.setCursor(6,1);
  lcd.print("AAMS V1.0");
 
  pinMode(rood,OUTPUT);
  pinMode(geel,OUTPUT);
  pinMode(groen,OUTPUT);
 
  Serial.begin(9600);
 
}
void loop(){
     
  int irblok1Waarde = analogRead(IRblok1);
 
   if (irblok1Waarde < drempelWaarde1){
      digitalWrite(groen,LOW);
   }
    else {
      digitalWrite(groen,HIGH);
    }
 
  if (irblok1Waarde < drempelWaarde2){
    digitalWrite(geel,LOW);
    }
  else {
    digitalWrite(geel,HIGH);
    }
  if (irblok1Waarde < drempelWaarde3){
    digitalWrite(rood,LOW);
  }
  else {
    digitalWrite(rood,HIGH);
  }
     Serial.print(irblok1Waarde);
     lcd.setCursor(3,2);
     lcd.print(irblok1Waarde);
}

Het programma is weliswaar nog niet klaar en moet nog verwerkt worden in het AAMS programma, in de proefopstelling werkt het goed, de benadering van de IR blok bezet melder word zichtbaar gemaakt door drie leds, hoe dichterbij de IR hoe meer leds er gaan branden.

Ik heb een uitnodiging van een treinen club om mijn AAMS te demonstreren en uitleg te geven hoe het werkt, op de club avond.  ;D

Mvg Paul  :)
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Peter Korsten op 16 februari 2015, 07:50:34
Ik zit even naar je code te kijken. Heb je er nu drie leds aanhangen, of een driekleurenled? In dat laatste geval zou je nog eens naar de laatste if-statements moeten kijken.

- Peter
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 16 februari 2015, 11:16:59
Hoi Paul,

Altijd leuk spelen met verschillende manieren. Ben je alleen niet bang dat omgevingslicht een te grote rol gaat spelen? Om niet te veel aan te passen zou je er voor kunnen kiezen om alle IR ledjes te schakelen door de Arduino. Zo kan je ze af en toe (1 keer per seconde ofzo :p) uit zetten en zo een meting doen van het omgevingslicht.

Overigens zou ik als ik zou was echt eens naar een library kijken. Denk namelijk dat het je zo veel dubbel werk scheelt!

Hoewel er in de schema's niet een directe verbinding getekend is, is deze gnd er wel in het schema aangegeven als +5v GND deze gaan naar de Arduino

Okay, omdat je zo in uiteindelijke printen ook nooit tekent ;)

de sturing voor de wissels wil ik galvanische gescheiden houden van de Arduino, de snelheids regeling van de motorschield is wel via de GND gekoppeld met de Arduino.
Okay, dan moet je dus nog een ander schema hiervoor maken. Met de huidige MOSFET / BJT schakelingen is dit niet het geval. Maar waarom wil je dit?

@Frits Ik dacht altijd dat je daarmee het automatisch plaatsen van tab's aan of uit zetten, niet dat je de huidige code er netjes mee maakt  :-[ Vandaar nooit op geklikt  ;D Weer wat geleerd.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 17 februari 2015, 21:54:29
Hoi volgers
 
@Peter

Bedankt voor je input.

Ik gebruik drie aparte ledjes, deze ledjes worden alleen gebruikt voor test doeleinden, in de AAMS worden ze niet gebruikt.

Ik bouw vaak een kleine test schakeling en kleine test programma's om de diverse componenten te testen, als het goed werkt zet ik het stukje code pas in het AAMS programma, led's zijn perfecte componenten voor test doeleinden.

@Timo

Bedankt voor je input.

Ik heb er nog geen tijd voor gehad om naar de library te kijken, ik moet daar eens goed voor gaan zitten.
Als ik het 's avonds probeer, dan bak ik er niets van. ::)

De IR reciever word via de analoge input door de Arduino uitgelezen, dat levert een drempelwaarde op.

Voor omgevingslicht ben ik niet bang , IR detectors hebben niet veel last van omgevingslicht, misschien als er veel TL-licht in de buurt is kan dat van enig invloed zijn, ik gebruik daarom ook, voor de sensoren de analoge porten, zodat ik een drempelwaarde kan instellen.

De IR detectors die ik gebruik, zijn reflectie sensoren, het bereik van de sensoren zal niet veel meer zijn dan 5 cm.

Op mijn testbaantje heb ik ldr's gebruikt die zijn veel gevoeliger voor omgevingslicht, maar het werk best wel goed zolang het omgevingslicht niet te veel veranderd.

Om geen componenten kapot te maken wil ik het voorlopig galvanische gescheiden houden, heb al een Arduino en een wissel spoel
kapot gemaakt.

Als het goed werkt word het gekoppeld aan de Arduino van de AAMS sturing.

Mvg Paul  :)
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 19 maart 2015, 21:27:47
Hoi Volgers.

Na een tijd niets gedaan te hebben met AAMS , en een vakantie naar ons tweede vaderland Hongarije, ga ik me weer bezig houden met het AAMS, zowel met het programma als met het verder testen van de AAMS.

De tweede schakeling / programma is de  Arduino Analoge Pendelbaan Sturing of kortweg AAPS, de hardware door mijn bedacht en ontwikkeld, op basis van een Arduino Uno, uiteindelijk word de Arduino Uno vervangen door een Arduino Nano.

De software is niet door mij ontwikkeld maar door iemand anders (naam staat in de header van het programma), ik heb het programma aangepast voor eigen gebruik,.

Voor de detectie van de trein ga ik drie verschillend sensoren gebruiken, reed-relais, drukknoppen (hand bediening) en IR reflectie sensoren, de reed-relais en de drukknoppen  worden parallel over elkaar gezet.

Het test programma is verre van af maar werkt verrassend goed.

De AAPS proef opstelling, van links naar rechts, reed-relais ,drukknoppen ,Arduino Uno en motordriver, de motordriver is aan een standaard trein trafo aangesloten, dit is om de max snelheid van de trein te kunnen regelen, als er een locomotief te snel of te langzaam rijd.

(https://images.beneluxspoor.net/bnls/IMG1652.jpg) (https://images.beneluxspoor.net/bnls/IMG1652.jpg)

Het programma :

/*
HMC pendelautomaat met een Arduino
 Haagse Modelbouw Club 2014
 
 Aangepast door Paul Smits
 oginele versie door Alfred Hol
 
 */

// Keuze in- en uitgangen Arduino
int pwmA = 10;
int aIn1 = 9;
int aIn2 = 8;
int irSensor1 = 2; //digital in pin waarop Sensor1 wordt aangesloten
int irSensor2 = 3; //digital in pin waarop Sensor2 wordt aangesloten

//digitale pin waarop Sensor2 wordt aangesloten

// Beginwaarden rijrichting en snelheid

int pwmAval = 0;
int progStep = 1;
int waitTime = 10000;   // wachttijd op eindpunten in milliseconden
int ASCSPD = 30;        // versnellingscurve (totale tijd van versnellen in milliseconden is waarde ASCSPD x 256)
int DSCSPD = 20;        // vertragingscurve (totale tijd van vertragen in milliseconden is waarde DSCSPD x 256)

void setup() {

  // Instellen in- en uitgangen Arduino

  pinMode(pwmA, OUTPUT);
  pinMode(aIn1, OUTPUT);
  pinMode(aIn2, OUTPUT);

  pinMode(irSensor1, INPUT);
  pinMode(irSensor2, INPUT);

  //analogWrite(pwmA, pwmAval);

  // open seriele poort tbv logging
  Serial.begin(9600);
  Serial.println("Start log:");
  Serial.println("Pendelautomaat voor de Arduino");
  Serial.println("Haagse Modelbouw Club 2014");
  Serial.println(" ");
}

void loop() {
  //na het dooorlopen van alle acht programmastappen weer beginnen bij stap 1
  if (progStep == 9) {
    progStep = 1;
  } //na het dooorlopen van alle acht programmastappen weer beginnen bij stap 1

    //uitlezen sensoren
  Serial.print("wacht op sensor ");
  Serial.print("1 ");
  Serial.println(digitalRead(irSensor1));
  Serial.print("2 ");
  Serial.println(digitalRead(irSensor2));
  if (progStep == 2) {
    if (digitalRead(irSensor2) == 1) {
      progStep = 3;
    };
  };
  if (progStep == 6) {
    if (digitalRead(irSensor1) == 1) {
      progStep = 7;
    };
  };

  // naar specieke actie die hoort bij programmastatus
  while (progStep == 1) {
    versnellen();
  }
  while (progStep == 3) {
    vertragen();
  }
  while (progStep == 4) {
    wachtenompolen();
  }
  while (progStep == 5) {
    versnellen();
  }
  while (progStep == 7) {
    vertragen();
  }
  while (progStep == 8) {
    wachtenompolen();
  }
}

void versnellen () {
  Serial.print("Programmastap ");
  Serial.println(progStep);

  Serial.print(" accelereren in ");
  Serial.print(255*ASCSPD/1000);
  Serial.println( " seconden");

  for(int pwmAval=60; pwmAval <= 255; pwmAval++){

    analogWrite(pwmA,pwmAval);

    delay(ASCSPD);
    Serial.println(pwmAval);

  }
  Serial.println(" maximale snelheid bereikt ");
  Serial.println("");

  progStep =progStep+ 1;
  Serial.print("Programmastap ");
  Serial.println(progStep);
  Serial.print(" wacht op input op sensor ");
  if (progStep == 2) {
    Serial.println("2");
  };
  if (progStep == 6) {
    Serial.println("1");
  };
  Serial.println("");
}

void vertragen () {
  Serial.print("Programmastap ");
  Serial.println(progStep);

  Serial.print(" afremmen in ");
  Serial.print(255*DSCSPD/1000);
  Serial.println( " seconden");

  for (int pwmAval=255; pwmAval > 0; pwmAval--){

    analogWrite(pwmA,pwmAval);

    delay(DSCSPD);
    Serial.println(pwmAval);

  }
  Serial.println(" trein staat stil ");
  Serial.println("");
  progStep =progStep+ 1;
}

void wachtenompolen (){
  Serial.print("Programmastap ");
  Serial.println(progStep);

  Serial.print("  Wachttijd tot ompolen: ");
  Serial.print((waitTime)/1000);
  Serial.println(" seconden");

  delay(waitTime);
  if (progStep == 4) {
    //digitalWrite(aIn1, HIGH);
    //digitalWrite(aIn2, LOW);
    sturing(1,0,1);
  };
  if (progStep == 8) {
    //digitalWrite(aIn1, LOW);
    //digitalWrite(aIn2, HIGH);
    sturing(1,0,0);
  };
  Serial.println("  Ompolen ");
  Serial.println("");
  progStep =progStep+ 1;
}

void sturing(int trein, int snelheid, int richting){

  // Zet de parameters van de functie sturing(trein, snelheid, richting)
  // Trein 1: linksom en Trein 2 output B op het motorshield
  // Snelheid: 0 is stop, 255 is maximale snelheid
  // Richting: 0 Rechtsom, 1 Linksom

  boolean inPin1 = LOW;
  boolean inPin2 = HIGH;

  if(richting == 1){
    inPin1 = HIGH;
    inPin2 = LOW;

  }

  else{
    if(richting == 0) 
      inPin1 = LOW;
      inPin2 = HIGH;

  }

  if(trein == 1){
    digitalWrite(aIn1, inPin1);
    digitalWrite(aIn2, inPin2);
    analogWrite(pwmA, snelheid);

  }

  /* else{
   digitalWrite(BIN1, inPin1);
   digitalWrite(BIN2, inPin2);
   analogWrite(PWMB, snelheid);
   
   }*/
}

Verder heb ik twee printen in elkaar gesoldeerd, sein sturing en wissel sturing, voor de IR reflectie sensor is het niet noodzakelijk om een schakeling er voor te gebruiken.

Sein sturing:

(https://images.beneluxspoor.net/bnls/IMG1654.jpg) (https://images.beneluxspoor.net/bnls/IMG1654.jpg)

Wissel sturing  (nog niet helemaal klaar mis nog 4 blusdiodes) maar goed genoeg om het droog te testen (leds):

(https://images.beneluxspoor.net/bnls/IMG1655.jpg) (https://images.beneluxspoor.net/bnls/IMG1655.jpg)

Dat was het weer voor deze keer.

Zoals altijd sta ik open voor opmerkingen en of aanmerkingen. ;)

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 19 maart 2015, 21:50:20
Hallo Paul,
Ik heb geen aanmerkingen. Wel een opmerking. Ik lees je draadje altijd met plezier. Je bent echt een heerlijke hobbyist. Het is mooi om te zien dat je je eigen weg gaat en leuke schakelingen maakt. Ga zo door! Ik blijf je volgen.

Succes Frits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 24 maart 2015, 23:03:24
Hoi volgers,

Na het bedenken en uit voeren van een aantal schakelingen voor AAMS, heb ik nog een schakeling voor mijn modelbaan te ontwerpen nl een automatische keerlus sturing met een Arduino, dit is nog een flinke uitdaging.

Ik wil geen kortsluit-methode gebruiken,  ben er niet echt happig op, op je modelbaan wil je geen kortsluiting hebben,hoe klein en kort de sluiting ook is.
 
De sturing moet ik zelf ontwerpen, ook dat is nog een uitdaging,  reed contacten kan ik niet gebruiken (ik heb daarvoor kleine magneetjes nodig [ maximaal 1 mm dik x rond 3 mm ] die kan ik niet echt vinden) .
Ik wil gebruik maken van reflectie sensoren, dit soort sensoren zijn niet gevoelig voor licht, als er veel TL-lampen hangen kan dat van enig invloed zijn op de werking maar dat kan je beperken door de drempelwaarde instelbaar te maken.

Hoe zou de sturing moeten werken :

(https://images.beneluxspoor.net/bnls/keerlus_17.jpg) (https://images.beneluxspoor.net/bnls/keerlus_17.jpg)

De trein komt via de pendelbaan naar de inrij sectie, W1 moet in de afbuig stand staan , de trein rijd de doorrij sectie in, Als de W1 in de afbuig stand staat moet de trein stoppen in de ompool-sectie, omdat het sein op rood staat dan word de baanspanning om-gepoold , als de wissel in rechtdoor stand staat moet de trein door rijden over het ompool-sectie, als er word om-gepoold moet W1 in de rechtdoor stand gezet worden en moet sein S2 op rood staan en S1 moet op groen staan (S1 en S2 worden  antiparallel geschakeld)

Zo moet het ongeveer gaan werken, doordat de keerlus word gevoed door een diodebrug kan de trein automatisch ompoolen in de keerlus, alleen de pendelbaan moet dan nog worden omgepoold vandaar dat er een ompool-sectie is getekend in de keerlus.
Uiteindelijk wil ik dat het automatische gebeurd.

Ik wil ook een mogelijkheid hebben om de baan met de hand te bedienen alleen de wissels seinen enz. , de keerlus word als eerste geschikt gemaakt voor hand en automatische bediening.

Voor de keerlus sturing wil ik een Arduino Uno met sensor shield gaan gebruiken.

De electronica vaar de sturing bestaat uit de volgende componenten :


Zoals gebruikelijk ga ik de test schakeling maken op een breadboard, als het goed werkt ga ik de schakeling op een print solderen.

Word vervolgd

Mvg Paul




 
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 25 maart 2015, 22:39:27
Hallo Paul,

Mocht je het wel met reedcontacten willen doen, die magneetjes koop je oa hier. (http://www.ebay.com/itm/100PCS-3mm-x-1mm-N35-Rare-Earth-Neodymium-Super-Strong-Magnets-/181698716141?pt=LH_DefaultDomain_0&hash=item2a4e1661ed)

groet Frits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 28 maart 2015, 16:16:41
Hallo Paul,

Ik heb ook al eens over een keerlus schakeling met een arduino en IR-lichtreflector sensors nagedacht en volgens mij kan het nog veel simpeler. Zelf heb ik al geexperimenteerd met IR-lichtreflectors. Ik gebruikte echter wel gemoduleerd licht om verstoringen van omgevingslicht te vermijden en dat werkt uitstekend. Ik meen dat ik het voorbeeld daarvan al eens eerder in dit draadje heb genoemd. Het kan echter ook zonder de IR led te moduleren zolang en maar niet teveel omgevingslicht op de IR-transistor valt.

(https://images.beneluxspoor.net/bnls/Keerlus_8.jpg) (https://images.beneluxspoor.net/bnls/Keerlus_8.jpg)

Het grote verschil tussen een keerlus in een DCC omgeving en een analoge DC omgeving is dat het voor een DCC locomotief niet uit maakt hoe de polariteit is. De rijrichting van de loc wordt immers bepaald door het digitale signaal. Bij DCC wordt daarom vrijwel altijd de spanning in de lus omgepoold. Bij analoog moet je juist niet de lus, maar de rails die van en naar de lus leidt ompolen.

Het plaatje is getekend voor DCC maar dat maakt voor de werking niets uit als je je maar aan bovenstaande houdt. Stel een trein rijdt van sectie A, via wissel W die rechtdoor(r) staat naar sectie B. De trein zal de lichtsensors 1 en 2 activeren. Zodra de trein volledig in sectie B is zullen de sensors 1 en 2 laag worden (geen reflectie, geen trein). Zodra de trein nu over sensor 3 rijdt moet de arduino het wissel omgooien (a) en moet sectie A omgepoold worden door het relais (Rel). De trein vervolgt dan zijn weg in sectie A.

Omdat je e.e.a. gaat aansturen met een Arduino kan je e.e.a. softwarematig nog betrouwbaarder maken. Stel dat je trein te lang is voor de lus dan zullen de sensoren 2 en 3 tegelijk geactiveerd zijn. Door deze toestand af te vragen kan je in dat geval de baanspanning afschakelen zodat de trein niet tegen zijn eigen achterkant aanrijdt. Daarnaast is het raadzaam om het uitschakelen van de reflector te vertragen, zodat de sensor niet tussen twee wagons aangeeft dat er geen trein meer is. Wil je dat risico helemaal voorkomen dan zou je ook nog twee reflectors op 3 cm afstand van elkaar kunnen zetten en zodra één van de twee actief is staat er blijkbaar een trein boven de reflector.

Mijn schakeling heeft dus slechts 1 Arduino, 1 normaal relais (dubbelpolig om) en 2 reflectorsensors nodig (en wat transistoren om de Arduino het relais en de wissel aan te laten sturen). Het kan niet eenvoudiger. En nu maar hopen dat we hier niet een simpele keerlusschakeling discussie krijgen hoewel positieve input altijd op prijs gesteld wordt.

Succes Frits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 29 maart 2015, 21:02:11
Hoi volgers,

@Frits

Bedankt voor je input.

Voor zover ik weet zijn IR-reflectie sensoren niet gevoelig voor omgevingslicht , alleen als er veel TL-lampen in de buurt zijn kan dat van enig invloed zijn.

Ik gebruik voor de keerlus schakeling twee unpolaire relais en twee bipolaire relais.

De unpoliare relais schakelen de wissel spoelen en de bipolaire voor de terugmelding naar het bediening paneel.

De tweede bipolaire relais is voor de ompoling van de baanspanning, tenminste dat was mijn eerste idee, echter werkt dat niet met de Arduino omdat ik een motorshield gebruikt, zal ik met een commando de rijrichting moeten veranderen, ik moet het meer gaan zoeken in een hardware / softwarematige oplossing.

Het ontwerp wat je er bij heb gemaakt werkt helaas niet, echter de plaatsing van de sensoren neem ik zeker mee in het ontwerp.
De Wissel van de keerlus word wel door twee normale relais en een bipoliare relais voor de terug melding naar het bedieningspaneel.
Voor de ompool-functie moet ik nog het een en het ander uitzoeken.

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 29 maart 2015, 21:08:19
Hallo Paul,

Citaat
Het ontwerp wat je er bij heb gemaakt werkt helaas niet

Wat is de reden dat het niet werkt? Theoretich zou dit volgens mij moeten werken maar ik moet toegeven dat ik het nog niet gemaakt heb.

gr. Frits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 29 maart 2015, 21:31:17
Hoi Frits,

Mijn motorshield werkt met pwm sturing, om de trein van richting te laten veranderen moet ik op de Arduino twee porten gebruiken om de motorsturing om te polen.

Het commando wat ik daar voor moet geven kan zijn:  inPin1,LOW en inPin2,HIGH voor rechtsom en inPin1,HIGH en inPin2,LOW voor linksom.

Ik weet ook niet of ik met een diodebrug een pwm signaal kan omkeren binnen de keerlus.

Misschien moet ik maar een een testopstelling maken om het te testen.

Mvg Paul


Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 31 maart 2015, 13:32:38
Je hardware is dus nu vooral "veel" omdat je bipolaire relais gebruikt en relais voor de wissels. Voor de wissels is het al eerder aan bod geweest, dit is jou keuze. Maar voor de terug melding, is dat echt zo belangrijk? Je kan de Arduino ook een terugmelding laten doen over de wisselstand. Enige is dat de Arduino bij het opstarten de wisselstand niet kent. Maar dit kan je oplossen door naar een standaard stand te gaan (en de wissel even te bekrachtigen). Dat de Arduino de wisselstand kent is toch al nodig.

Omdat je een H-brug gebruikt kan je inderdaad deze al gebruiken om de boel om te poolen. Diodes kunnen prima gebruikt worden voor de keerlus. Maar waarom voed je niet de hele lus gewoon met diodes? Op deze manier beperk je de lengte van de trein in de lus nogal.

Dus samengevat:
- Trein komt aan bij de eerste melder van de lus (en de lus is vrij)
- Wissel wordt in de juiste stand gezet om de lus in te rijden (of die nu afbuigen of recht door is maakt niet uit, is gewoon kwestie van eigen keuze)
- Trein rijdt lus in en wordt gevoed door diodes
- Voor de wissel wordt de tweede melder actief
- Wissel gaat om en Arduino stuur ledje op paneel aan voor melding
- Rijrichting wordt aangepast (merk je niet van door de diodes)
- Trein verlaat dus lus
- Arduino wacht tot de eerste melder weer vrij komt (van de trein die de lus verlaat) en is klaar voor de volgende keer

Op deze manier heb je nodig:
- Twee keer detectie (IR of magneet of anders)
- wisselsturing (of dit nu op basis is van relais of MOSFET maakt niet uit)
- Handje vol ledjes

Extra beveiliging is inderdaad in te bouwen zoals Frits aan gaf (stoppen als tweede melder actief wordt voor de eerste melder inactief is geworden => trein te lang). En pas inactief na "grote" pauze in licht (voor als de IR tussen rijtuigen in kijkt). Deze pauze kan snelheid afhankelijk zijn (en bijvoorbeeld de state bevriezen als de trein stil staat => kan de Arduino niet denken dat de boel vrij moet komen als de trein toevallig met de IR tussen twee rijtuigen stil wordt gezet).

Overigens lijkt me dat IR sensoren juist gevoelig zijn voor omgevingslicht van zonlicht en gloei/halogeen verlichting. (Warmte gaat gepaard met IR.) TL werkt op basis van UV en zal dus al minder storen.

De diodes in de lus hebben als nadeel dat er een spanningsval over is (en de trein dus langzamer gaat). Dit is op te lossen door de lus te voorzien van eigen motordriver/H-brug. Op deze manier (samen met extra melder) zou je dus lus ook geschikt kunnen maken voor berijden in twee richtingen. Voor het prijsverschil hoef je het bijna niet te laten.... PWM pin van de sectie voor de keerlus en de keerlus zelf mogen dezelfde zijn (snelheid is gelijk, alleen richting niet).


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 31 maart 2015, 20:07:35
Hallo Paul en Timo,

Citaat
Diodes kunnen prima gebruikt worden voor de keerlus

Ik probeer te begrijpen wat jullie met die diodes willen doen. Het enige dat ik kan bedenken is dat je die als een brugschakeling in de locomotief zet zodat de locomotief polariteit ongevoelig wordt zodat de locomotief altijd rechtdoor rijdt, ongeacht de polariteit van de rails. In dat geval kan je niet meer achteruit rijden. Dat zal niet de bedoeling zijn dus ik denk dat jullie iets anders bedoelen. Ik zie de uitleg met belangstelling tegemoet.

groet Frits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 31 maart 2015, 20:13:38
Het betreft hier gewoon analoge sturing. Dus de lus verbinden via een diodebrug met de sectie ervoor. Op deze manier kan de trein, ongeacht de polariteit (dus rijrichting) van de sectie ervoor, maar in één richting door de lus. Zo kan je ongemerkt de baan ompolen zonder dat de loc in de lus er iets van merkt of stopt.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 31 maart 2015, 20:20:46
Helder, ik vermoedde al dat jullie iets anders bedoelden. Dank.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: janw op 05 april 2015, 15:33:01
Paul --ik probeer je te bereiken via email en een persoonlijk bericht maar ik krijg geen reactie. Kun je contact opnemen? [--met excuus voor het gebruik van het draadje hiervoor]

jan
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 05 april 2015, 20:44:53
Hoi Jan

Geen probleem ik heb ondertussen een mail gestuurd.

mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: janw op 06 april 2015, 12:12:23
Komende dinsdag 7 april (morgen dus) geeft Paul een presentatie over Arduino-sturing voor de Haagse Modelbouw Club, in de clubruimte aan de Tarwekamp 3 in Den Haag. Belangstellenden kunnen zich aanmelden (via pb aan mij of telefoon van de secretaris 06 4638 5912).
Aanvang 20:00.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 17 april 2015, 23:12:28
Hoi Volgers,

Iedereen bedankt voor de input.  (y)

Ik heb al weer een tijdje niets op het forum gezet, dat wil niet zeggen dat in niets gedaan hebt.
Ik ben ondertussen aan het proberen om een library voor de arduino te schrijven, helaas krijg ik het nog niet voor elkaar ???

De foutmeldingen vliegen om mijn oren :P

Cpp file: Aams.cpp
/*
Aams.h v1 - Library voor Arduino Analoge Modelbaan Sturing
Met dank aan Timo Engelgeer (Septillion) voor de eerste opzet
*/

/*
Blaa, dit doet iets :p
*/

#include "Arduino.h"
#include "Aams.h"

Aams::Aams(byte pinBlok, byte pinSein, byte pinLdr, byte pinLdrS, int ldrDrempel){

this->pinBlok = pinBlok;
this->pinSein = pinSein;
this->pinLdr = pinLdr;
this->pinLdrS = pinLdrS;
this->drempel = drempel;

pinMode(this->pinBlok, OUTPUT);
pinMode(this->pinSein, OUTPUT);
pinMode(this->pinLdr, INPUT);
pinMode(this->pinLdrS, INPUT);

digitalWrite(this->pinBlok, HIGH);
digitalWrite(this->pinSein, HIGH);

}

Sturing::Sturing(byte pinPWMA, byte pinAin1, byte pinAin2, byte pinPWMB, byte pinBin1, byte pinBin2){

this-> pinPWMA  = pinPWMA; // Arduino pin 5~
this-> pinAin1  = pinAin1; // Arduino pin 6
this-> pinAin2  = pinAin2; // Arduino pin 7
this-> pinPWMB  = pinPWMB; // Arduino pin 9~
this-> pinBin1  = pinBin1; // Arduino pin 10
this-> pinBin2  = pinBin2; // Arduino pin 11

pinMode(this->pinPWMA, OUTPUT);
pinMode(this->pinAin1, OUTPUT);
pinMode(this->pinAin2, OUTPUT);
pinMode(this->pinPWMB, OUTPUT);
pinMode(this->pinBin1, OUTPUT);
pinMode(this->pinBin2, OUTPUT);
}
void Sturing::Sturing(byte Trein, byte Snelheid, byte Richting){
 
  // Zet de parameters van de functie sturing(trein, snelheid, richting)
  // Trein 1: linksom en Trein 2 output B op het motorshield
  // Snelheid: 0 is stop, 255 is maximale snelheid
  // Richting: 0 Rechtsom, 1 Linksom
 
  bool inPin1 = LOW;
  bool inPin2 = HIGH;

  if(Richting == 1){
    inPin1 = HIGH;
    inPin2 = LOW;

  }

  else{
    if(Richting == 0) 
    inPin1 = LOW;
    inPin2 = HIGH;

  }

  if(Trein == 1){
    digitalWrite(AIN1, inPin1);
    digitalWrite(AIN2, inPin2);
    analogWrite(PWMA, snelheid);

  }

  else{
    digitalWrite(BIN1, inPin1);
    digitalWrite(BIN2, inPin2);
    analogWrite(PWMB, snelheid);

  }
}
//maak blok bezet
void Aams::bezet(){
this->bezetState = true;
}

//maak blok vrij
void Aams::vrij(){
this->bezetState = false;
}

//zet sein op rood of groen.
void Aams::sein(byte state){
digitalWrite(pinSein, state);
}

//Check of LDR een trein ziet en pas bezet aan. return bezet.
bool Aams::checkBezet(){
if(analogRead(this->pinLdr) < this->drempel){
this->bezetState = true;
}
else{
this->bezetState = false;
}

return this->bezetState;
}

//return is blok is bezet
bool Aams::isBezet(){
return this->bezetState;
}

void Aams::checkStop(){
if(analogRead(this->pinLdrS) < this->drempel && digitalRead(this->pinSein) == AAM_ROOD){
digitalWrite(this->pinBlok, LOW);
}
}

void Aams::update(){
this->checkBezet();
this->checkStop();
}

header file: Aams.h

/*
Aams.h v1 - Library to iets
Created by Timo Engelgeer (Septillion), February 2, 2015
*/

#ifndef Aams_h
#define Aams_h

#include "Arduino.h"

#define AAM_GROEN 1
#define AAM_ROOD 0

class Aams {
public:
Aams(byte pinBlok, byte pinSein, byte pinLdr, byte pinLdrS, int ldrDrempel);

void bezet();
void vrij();
void sein(byte state);
bool checkBezet();
bool isBezet();
void checkStop();
void update();

     protected:
bool bezetState;

byte pinBlok;
byte pinSein;
byte pinLdr;
byte pinLdrS;

int drempel;

};

class Sturing {
public:
Sturing(byte pinPWMA, byte pinAin1, byte pinAin2, byte pinPWMB, byte pinBin1, byte pinBin2);


void Trein(byte);
void Richting(byte);
void Snelheid(byte);


     protected:
bool inPin1;
                bool inPin2;
byte pinPWMA;
byte pinAin1;
byte pinAin2;
byte pinPWMB;
byte pinBin1;
byte pinBin2;
};




#endif

Waar gaat het fout ::)
Mochten er mensen zijn die me kunnen helpen hoor ik het graag.

mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Peter Korsten op 17 april 2015, 23:36:49
Het zou wel handig zijn om de foutmeldingen erbij te vermelden.

Los daarvan, hier
  else{
    if(Richting == 0)
    inPin1 = LOW;
    inPin2 = HIGH;

  }
heb je een paar accolades vergeten. Of beter, de accolade achter de else zou achter de if moeten.

- Peter
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: dimo1_dimo1 op 17 april 2015, 23:46:50
Je hebt twee keer een constructor sturing, maar daar is in de header file niets van te zien..  Verder mis ik de methodes trein,  richting en snelheid.. Ook zou ik de klasses niet bij elkaar in zetten, maar in losse bestanden zetten..
De aams constructor ldrDrempel,  maar even later gebruik je drempel.. Die bestaat daar dus niet..

Een lijst met fouten zou inderdaad ook wel handig zijn ;D anders moet iedereen het gaan kopiëren en proberen te compileren
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: willem22 op 18 april 2015, 00:43:32
Het zou wel handig zijn om de foutmeldingen erbij te vermelden.

Los daarvan, hier
  else{
    if(Richting == 0)
    inPin1 = LOW;
    inPin2 = HIGH;

  }
heb je een paar accolades vergeten. Of beter, de accolade achter de else zou achter de if moeten.

- Peter
nu bij deze mag je wel wat duidelijker zijn.

illem.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 18 april 2015, 01:02:20
Hoi volgers,

Ik kan de foutmeldingen niet kopiëren,

Meeste fouten die de compiler geeft : Ain1 was not declared in this scope, digitalWrite (Ain1,inPin2);  enz.
                                                            Snelheid was not declared in this scope, digitalWrite(PwmA, Snelheid)

Aams.h :

/*
Aams.h v1 - Library to iets
Created by Timo Engelgeer (Septillion), February 2, 2015
*/

#ifndef Aams_h
#define Aams_h

#include "Arduino.h"

#define AAM_GROEN 1
#define AAM_ROOD 0

class Aams {
public:
Aams(byte pinBlok, byte pinSein, byte pinLdr, byte pinLdrS, int ldrDrempel);

void bezet();
void vrij();
void sein(byte state);
bool checkBezet();
bool isBezet();
void checkStop();
void update();

     protected:
bool bezetState;

byte pinBlok;
byte pinSein;
byte pinLdr;
byte pinLdrS;

int drempel;

};

class Sturing {
public:
Sturing(byte pinPwmA, byte pinAin1, byte pinAin2, byte pinPwmB, byte pinBin1, byte pinBin2);

void Start(int Trein, int Snelheid, int Richting);
int Value = 0;

     protected:
bool inPin1;
                bool inPin2;
byte pinPwmA;
byte pinAin1;
byte pinAin2;
byte pinPwmB;
byte pinBin1;
byte pinBin2;
};




#endif

Aams.cpp :

/*
Aams.h v1 - Library voor Arduino Analoge Modelbaan Sturing
Met dank aan Timo Engelgeer (Septillion) voor de eerste opzet
*/

/*
Blaa, dit doet iets :p
*/

#include "Arduino.h"
#include "Aams.h"

Aams::Aams(byte pinBlok, byte pinSein, byte pinLdr, byte pinLdrS, int ldrDrempel){

this->pinBlok = pinBlok;
this->pinSein = pinSein;
this->pinLdr = pinLdr;
this->pinLdrS = pinLdrS;
this->drempel = drempel;

pinMode(this->pinBlok, OUTPUT);
pinMode(this->pinSein, OUTPUT);
pinMode(this->pinLdr, INPUT);
pinMode(this->pinLdrS, INPUT);

digitalWrite(this->pinBlok, HIGH);
digitalWrite(this->pinSein, HIGH);

}

Sturing::Sturing(byte pinPWMA, byte pinAin1, byte pinAin2, byte pinPWMB, byte pinBin1, byte pinBin2){

this-> pinPwmA  = pinPwmA; // Arduino pin 5~
this-> pinAin1  = pinAin1; // Arduino pin 6
this-> pinAin2  = pinAin2; // Arduino pin 7
this-> pinPwmB  = pinPwmB; // Arduino pin 9~
this-> pinBin1  = pinBin1; // Arduino pin 10
this-> pinBin2  = pinBin2; // Arduino pin 11

pinMode(this->pinPwmA, OUTPUT);
pinMode(this->pinAin1, OUTPUT);
pinMode(this->pinAin2, OUTPUT);
pinMode(this->pinPwmB, OUTPUT);
pinMode(this->pinBin1, OUTPUT);
pinMode(this->pinBin2, OUTPUT);
}
void Sturing::Start(int Trein, int Snelheid, int Richting){
 
  // Zet de parameters van de functie sturing(trein, snelheid, richting)
  // Trein 1: linksom en Trein 2 output B op het motorshield
  // Snelheid: 0 is stop, 255 is maximale snelheid
  // Richting: 0 Rechtsom, 1 Linksom

 
 
  Value = Snelheid;
 
  bool inPin1 = LOW;
  bool inPin2 = HIGH;

  if(Richting == 1){
    inPin1 = HIGH;
    inPin2 = LOW;

  }

  else{
    if(Richting == 0) 
    inPin1 = LOW;
    inPin2 = HIGH;

  }

  if(Trein == 1){
    digitalWrite(Ain1, inPin1);
    digitalWrite(Ain2, inPin2);
    analogWrite(PwmA, Snelheid);

  }

  else{
    digitalWrite(Bin1, inPin1);
    digitalWrite(Bin2, inPin2);
    analogWrite(PwmB, Snelheid);

  }
}
//maak blok bezet
void Aams::bezet(){
this->bezetState = true;
}

//maak blok vrij
void Aams::vrij(){
this->bezetState = false;
}

//zet sein op rood of groen.
void Aams::sein(byte state){
digitalWrite(pinSein, state);
}

//Check of LDR een trein ziet en pas bezet aan. return bezet.
bool Aams::checkBezet(){
if(analogRead(this->pinLdr) < this->drempel){
this->bezetState = true;
}
else{
this->bezetState = false;
}

return this->bezetState;
}

//return is blok is bezet
bool Aams::isBezet(){
return this->bezetState;
}

void Aams::checkStop(){
if(analogRead(this->pinLdrS) < this->drempel && digitalRead(this->pinSein) == AAM_ROOD){
digitalWrite(this->pinBlok, LOW);
}
}

void Aams::update(){
this->checkBezet();
this->checkStop();
}

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: dimo1_dimo1 op 18 april 2015, 08:09:40
De variabele heet pinAin1 en je bent this vergeten..
De fout over de snelheid kan ik zo niet opsporen  :(
Wat Peter korsten aanheeft: de else met accolade gevolgd door een if zonder accolade geeft problemen..  Waarschijnlijk moet het een else if worden en moet dus de accolade die nu achter else staat achter de if worden gezet:
else if(Richting==0){
    inPin1 = LOW;
    inPin2 = HIGH;
}
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 20 april 2015, 00:13:56
Hoi volgers,

Van het weekend weer verder gegaan met een library voor het AAMS programma.
Na veel moeite heb ik de fouten uit de library gehaald, het programma word zonder fouten gecompileerd, en het werkt voor een gedeelte goed, maar er zitten nog fouten in de programmering van de library.

Het gedeelte voor de trein sturing werk wel, helaas maar een motor port, en de wissel sturing werk niet.

commando sturing.trein werk maar met een port  en niet helemaal goed ??? ???
commando sturing.wissel werkt niet  ??? ???

Het Programma :
#include <Start.h>

Start sturing (2, 3, 4, 5, 6, 7, 10, 11);

void setup(){

  Serial.begin(9600);
  Serial.println("Arduino Analoge Modelbaan sturing, test programma");
}

void loop(){
  //    Wissel( nummer, stand) stand = 0 = Rechtdoor 1 = Afbuigend
  sturing.wissel(1,0);
  delay(100);
  sturing.wissel(1,1);

  int value;

  for(int value = 0; value <= 250; value++){
    //        Trein (uitgang, richting, snelheid) uitgang 0 = poort A, 1 = poort B, richting 0 = linksom, 1 = rechtsom
    sturing.trein(1,1,value);
    delay(20);
    Serial.print(value);
  }

  for(int value = 250; value >= 0; value--){
    //        Trein (uitgang, richting, snelheid) uitgang 0 = poort A, 1 = poort B, richting 0 = linksom, 1 = rechtsom
    sturing.trein(1,0,value);
    delay(20);
  }

}

header file Start.h:
/*
Start.h v1 - Library voor Arduino Analoge Modelbaan Sturing of kortweg AAMS.
Writen by Paul Smits
*/

/*
Blaa, dit doet iets :p
*/

#ifndef Start_h
#define Start_h

#include "Arduino.h"

class Start {
public:
Start(byte pinPwmA, byte pinAin1, byte pinAin2, byte pinPwmB, byte pinBin1, byte pinBin2, byte pinWisR, byte pinWisA);

void trein(byte uitgang, byte richting, int snelheid);
void wissel(int nummer, byte stand);

int value;

private:

bool inPin1;
                bool inPin2;

byte pinPwmA;
byte pinAin1;
byte pinAin2;
byte pinPwmB;
byte pinBin1;
byte pinBin2;
byte pinWisR;
byte pinWisA;

int inPinwisL;
  int inPinwisH;
};

#endif

De c++ file :
/*
Start.cpp v1 - Library voor Arduino Analoge Modelbaan Sturing of kortweg AAMS.
Writen by Paul Smits
*/

/*
Blaa, dit doet iets :p
*/


#include "Start.h"


Start::Start(byte pinPwmA, byte pinAin1, byte pinAin2, byte pinPwmB, byte pinBin1, byte pinBin2, byte pinWisR, byte pinWisA){

this-> pinPwmA = pinPwmA; // Arduino pin 3~
this-> pinAin1 = pinAin1; // Arduino pin 2
this-> pinAin2 = pinAin2; // Arduino pin 4
this-> pinPwmB = pinPwmB; // Arduino pin 6~
this-> pinBin1 = pinBin1; // Arduino pin 5
this-> pinBin2 = pinBin2; // Arduino pin 7
this-> pinWisR = pinWisR; // Arduino pin 11
this-> pinWisA = pinWisA; // Arduino pin 12

pinMode(this-> pinPwmA, OUTPUT);
pinMode(this-> pinAin1, OUTPUT);
pinMode(this-> pinAin2, OUTPUT);
pinMode(this-> pinPwmB, OUTPUT);
pinMode(this-> pinBin1, OUTPUT);
pinMode(this-> pinBin2, OUTPUT);
pinMode(this-> pinWisR, OUTPUT);
pinMode(this-> pinWisA, OUTPUT);
}
void Start::trein(byte uitgang, byte richting, int snelheid)
{

  bool inPin1 = LOW;
  bool inPin2 = HIGH;

 if(richting == 0){
    inPin1 = HIGH;
    inPin2 = LOW;

  }


  else if(richting == 1){ 
    inPin1 = LOW;
    inPin2 = HIGH;
}
  if(uitgang == 0){

   digitalWrite(this-> pinAin1, inPin1);
   digitalWrite(this-> pinAin2, inPin2);
   analogWrite(this->  pinPwmA, snelheid);
   }
 
  else if(uitgang == 1){

    digitalWrite(this-> pinBin1, inPin1);
    digitalWrite(this-> pinBin2, inPin2);
    analogWrite(this->  pinPwmB, snelheid);
    }


 
}
void Start::wissel(int nummer, byte stand)

       if(nummer ==0){
          nummer = 1;
}
else if (nummer == 1){
           nummer =0;
}
if(stand == 0){
       
digitalWrite(this-> pinWisR,inPinwisH);
delay(5000);
digitalWrite(this-> pinWisR,inPinwisL);
}

if(stand ==1){
digitalWrite(this-> pinWisA,inPinwisH);
delay(500);
digitalWrite(this-> pinWisA,inPinwisL);
}

}

Het programma en de library zijn voorzien van test code ;D

Mijn vraag:  wat doe ik niet goed of welke code ontbreekt in de library ?

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Peter Korsten op 20 april 2015, 08:07:27
In zo'n geval moet je gaan debuggen. Ik ken de Arduino verder niet, maar kun je tekst naar een debug-poort sturen of zo? Dan zou je ieder statement dat een pin aanstuurt kunnen voorzien van een bijbehorende tekst en dan zie je vanzelf wat er wel en wat er niet gebeurt.

Naar de code zelf kijken is bijna onbegonnen werk, als je niet de hele ontwikkelomgeving en hardware hebt.

- Peter
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 20 april 2015, 09:55:01
Voor debug: LED op de ardiuno maken en deze bij iedere stap aan en uit doen. Kijken of deze regelmatig knippert. Als dat niet gaat. Programma reduceren tot een stap, bv alleen motor sturing. DIt helemaal foutloos maken door stap voor stap te kijken wat er gebeurt.
Er is nog een derde optie, althans in Visual Studio voor Arduino, stap voor stap alles uitvoeren en zelf de inputs geven en de outputs controleren. Kan een paar dagen duren  ;D

Groet,

Gerard van der Sel.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 20 april 2015, 18:15:09
De Arduino IDE beschikt over een serial monitor. De Arduino kan tekstopdrachten naar de monitor sturen die dan zichtbaar gemaakt worden. Met de opdracht "Serial.print"of "Serial.println" kan je dus teksten en waarden lezen. Door deze opdrachten op slimme plekken in het programma te plaatsen kan je zien of een opdracht correct wordt uitgevoerd en ook kan gecontroleerd worden of de waarden van variabelen juist zijn. Het verschil tussen Serial.print en Serial.println is het feit dat bij Serial.println er een niewe regel volgt. E.e.a. kan de leesbaarheid bevorderen.

gr. Frits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Peter Korsten op 20 april 2015, 22:15:18
En afhankelijk van je terminal-emulatie kan het ook zo zijn dat er pas na een nieuwe regel (line feed, LF) de regel ook daadwerkelijk zichtbaar wordt.

- Peter
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 20 april 2015, 22:50:39
Hoi Volgers,

@Peter, Gerard, Frits bedankt voor jullie input.

Ik heb de library nog een goed bekeken en zag twee integers staan die ik verplaatst heb van de header file naar de ccp file, en het programma doet het. :D

Debugen vond ik toch even te veel van het goede, de library files zijn goed met compileren van het programma kreeg ik geen foutmeldingen, het bleek dat ik twee integers in de verkeerde file stonden.

Nu alleen nog even uitzoeken waarom de tweede motor port het nog niet doet, daar kom ik vast wel achter. ;D

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: dimo1_dimo1 op 20 april 2015, 23:02:10
PwmA is toegewezen aan pin 2. Dit is bij de uno geen pwm pin.. Je comments in de library geeft aan dat Pwma pin 3 moet zijn..  Zit daar het probleem misschien?
Die twee variabelen waren inpinwish en inpinwisl?
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Peter Korsten op 21 april 2015, 08:32:51
Debugen vond ik toch even te veel van het goede, de library files zijn goed met compileren van het programma kreeg ik geen foutmeldingen, het bleek dat ik twee integers in de verkeerde file stonden.

Het is kinderlijk eenvoudig een programma te schrijven dat goed compileert en absoluut niet werkt. Ik zou debuggen in mijn achterhoofd houden als ik jou was, het kan je veel tijd en ergernis besparen.

- Peter
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 22 april 2015, 14:58:13
Hoi Paul,

Je bent aardig op weg :) Maar ik zou je toch wat tips willen geven.

Laat ik dan wel even beginnen met zeggen dat ik het leuk vind te zien hoe iemand bezig is (y) Alles wat ik zeg is alleen bedoelt om te helpen bij het bouwen van een makkelijk uitbreidbaar systeem volgens jou eisen :)

Ik zou wat beter nadenken over na naam van je library/classe. Start is wel een hele generieke naam en aangezien er in de hele library structuur van Arduino maar één keer de naam mag voorkomen is een fout snel gemaakt.

Om het voor jezelf makkelijk te maken zou ik ook wat beter opletten wanneer je de code in laat springen. Voor de werking doet het er niet toe maar je maakt zo makkelijk fouten.

Maar waar je denk ik de meeste baat bij hebt om een goed werkende library te schrijven (of meerdere). Is goed te bedenken welke onderdelen je wilt hebben. Het hele idee van een library is dat je alles groepeert wat je vaker wilt gebruiken en dus makkelijk meerdere keren kunt gebruiken. In dit geval lijkt mij het bijvoorbeeld logisch om bijvoorbeeld een blok als eerder bouwsteen te nemen. En dat te bedenken, wat heeft ieder blok nodig?

Wat het misschien nog wat lastig maakt is dat je niet ieder blok voorziet van een eigen motordriver maar via een relais meerdere blokken uit één motordriver voedt. Om dit duidelijk te maken maak ik even onderscheid tussen blok en sectie:
een blok => Deel van het spoor waar 1 loc in kan, geschakeld door relais
een sectie => Deel van het spoor bestaande uit meerdere blokken. Alle blokken van de sectie hangen achter een motordriver.

Dit is toch het idee van je systeem? En wat wil je dan aanhouden, dat er één rijdende trein per sectie is? (Dus dat er niet twee treinen achter dezelfde motordriver hangen?)

Goed, dan zou ik sectie en blok als bouwstenen nemen dus daar libraries voor maken.
Wat heeft iedere sectie?
- Eén motordriver
- Meerdere blokken (wat is de max?)

Wat heeft ieder blok?
- Eén stuur relais
- Eén sein (uitgaande van één richting)
- Detectie, hoeveel? Wat voor? (Als je nog meerdere soorten wilt gebruiken zou je dit ook af kunnen splitsen naar meerdere classe, één per detectie methode. Zo kan je ze uitwisselen)

Op deze manier kan je van sectie naar sectie rijden en binnen de sectie dingen doen met de losse blokken.

Voornaamste verschil met jou opzet is dus het echt opsplitsen van de onderdelen. Nu heb je eigenlijk alles wat je wilt gebruiken gewoon in één library gestopt. Maar dit schaalt zo niet makkelijk.

Wissels heb ik nog even niet genoemd. Jij hebt ze steeds namen genomen met een sectie maar heeft iedere sectie precies een wissel? Ik zou daarom de sturing voor een wissel ook opnemen in een losse classe/library. Op deze manier kan je gewoon het aantal wissels dat je nodig hebt implementeren.


Okay, waar het dus eigenlijk op neer komt, probeer niet eens precies voor dit plan passende library te maken maar probeer alle onderdelen op te delen. Denk dus aan meerdere libraries. Dit zal het uitbreiden naar een baan de boel flink vergemakkelijken. De indeling die ik hier noem is maar een voorbeeld afgeleid van hoe jij de baan aan wilt sturen.

En eigenlijk dezelfde tip als eerder, probeer af te komen van delays  ;) (En denk er niet aan om floats te gebruiken  ;D )


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 22 april 2015, 23:23:23
Hoi volgers,

@Timo, Peter, Auke, bedankt voor de input.

Na lang zoeken en veel testen heb ik mijn eigen library goed werkend gekregen, het doet precies wat ik in gedachte had.
Ik kan nu de sturing gaan testen en uitbreiden naar meer functies in de library.

Ik heb nu twee functies,  sturing.trein en sturing.wissel er moet nog een functie sturing.blok, sturing.keerlus, sturing.stroomdetectie, sturing.rgb (dag nacht simulatie) en sturing.verlichting., bijkomen.

Ik ben ondertussen de hoofdzaak vergeten,  :P zoals ik het in gedachte had, de computer als terminal voor de modelbaan, ik ben ondertussen bezig een automatische baansturing te ontwerpen. ::)

Ik ga weer verder met het eerste idee en ga zeker wat experimenteren met de Arduino om een automatische modelbaan sturing te ontwerpen.

De functies die ik genoemd heb ga ik nog verder uitwerken en me concentreren op de handbediening via de computer en later ga ik me bezig houden om een automatische modelbaan sturing te maken.

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Peter Korsten op 23 april 2015, 08:41:19
Na lang zoeken en veel testen heb ik mijn eigen library goed werkend gekregen, het doet precies wat ik in gedachte had.
Ik kan nu de sturing gaan testen en uitbreiden naar meer functies in de library.

Dit is een beetje mosterd na de maaltijd, maar je kunt dus een testprogramma schrijven dat één voor één alle functies van je library probeert. Dan kun je zeker zijn dat alles precies werkt zoals je wil. In de software-wereld worden dit "unit tests" genoemd.

Voor zover je dit niet al gedaan had, natuurlijk.

- Peter
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 23 april 2015, 11:28:08
Ik heb nu twee functies,  sturing.trein en sturing.wissel er moet nog een functie sturing.blok, sturing.keerlus, sturing.stroomdetectie, sturing.rgb (dag nacht simulatie) en sturing.verlichting., bijkomen.

En dat zou ik dus juist opsplitsen. Het idee van een library (en object georiënteerd programmeren) is juist dat je alles in behapbare blokken hakt. Anders had je echt geen library hoeven schrijven hoor  ::) Het is dan wel allemaal sturing maar in eerste instantie heeft de dag nacht simulatie niets met het rijden te maken. Ook blijf je op die manier steeds de library aanpassen aan specifieke wensen (omdat er bijvoorbeeld een stuk strip bij komt ofzo). Ook is het geheel dan nogal complex.

Splits het op in:
- Blok
- Sectie
- Detectie (per detectie soort een library)
- RGB(controller)
- Verlichting(controller)
- Wissel(controller)

Op deze manier is ieder ding op zichzelf simpel en maak je gewoon een extra instantie als je een extra blok of sectie hebt.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 23 april 2015, 22:22:31
Hoi Volgers,

@Peter, bedankt voor de input.

Ik heb het per functie in de library gebouwd en getest als de functie werkte, ga in naar een volgende functie.

@Timo

Er begint rook uit mijn oren te komen ;) ;D

Ik snap nog niet helemaal waarom ik verschillende library's  moet maken, ik kan me niet voorstellen dat het daardoor  gemakkelijker word, in alle library's moet je dan weer verwijzingen maken naar andere library's.

Dat lijkt mij veel ingewikkelder dan 1 enkele library's met alle functie's  er in.

Waarom zou je voor een blok sturing  de library's moeten opsplitsen in Blok,Sectie,detectie en per detectie een andere library ,dat lijkt mij niet echt handig

Het is naar mijn inzien veel handiger om in de blok functie alle parameters te zetten, het main programma lijkt mij dan duidelijker als er zo min mogelijk commando's/functie gebruikt te hoeven worden.

In de main code lijkt het mijn handiger  als je bv : sturing.blok(bloknr,seinstand,sensor,sectie,drempelwaarde) programmeert,
dan dat je bv : sturing.blok()
                       sturing.sein()
                       sturing.sensor()
                       sturing.sectie()
                       sturing.drempelwaarde() enz. programmeert.

En dat geld ook voor de andere library denk ik.

Het heeft niets met eigenwijsheid te maken, ben nog een leek op dat gebied, snap het nog niet helemaal.

Ik wilde een library hebben waarin ik met 1 commano alle delen en functies op de modelbaan kan aansturen, het is nog steeds de bedoeling om met een terminal de modelbaan aan te sturen, ondertussen probeer ik een automatische modelbaan sturing te maken ;D

Misschien kun je me het wat duidelijker  proberen uit te leggen wat het voordeel is van meerdere kleine library's ten opzichte van een grote library. :P

Ik vind het wel gemakkelijk als ik een commando heb voor mijn modelbaan sturing bv sturing.comando()
Als dat mogelijk is met meerdere library's dan wil ik het graag weten.

@allen

Vanavond nog een 4 voudige I2C interface gemaakt.

Mvg Paul

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 23 april 2015, 23:00:56
Grootste reden, schaalbaarheid. Stel dat je nu je library maakt voor twee blokken (je slaat alle pinnen van de onderdelen van een blokken op enzo). Maar nu wil je er toch 3. Je array's in je library zijn  maar 2 groot dus moet je de library aanpassen.

Maar maak je een library voor één blok kan je daar prima meerdere instaties van maken. Stel dat je een library aamBlok maakt waar alles voor één blok in past. Wil je nu 2 blokken doe je in je main gewoon
AamBlok blokken[2];

Wil je er 5:
AamBlok blokken[5];

Wil je iets doen met het eerste blok (blok 0) doe je gewoon:
blokken[0].checkVrij(); (of een andere functie in je classe).

Je kan de classes weer aan elkaar hangen in je main. De classes aan zich zijn allemaal erg makkelijk. Hoe je ze aan elkaar hangt kan nog wel verschillen en je komt al wel snel bij pointers uit. Maar uiteindelijk hou je (na de setup) een mooie begrijpbare main over :)

Voor detectie zou ik een classe maken waarbij je aan geeft welke soort detectie er gebruikt moet worden. Daarna kan je gewoon steeds checken of er een melding is.
AamDetectie detecties[5];
detecties[0].begin(LDR, A5, 100); //Voor bijvoorbeeld LDR op pin A5 met drempel 100
detecties[1].begin(REED, 5);

en hang je ze aan de blokken
for(byte i = 0; 1 < (sizeof(blokken)/sizeof(blokken[1])); i++){
  blokken.attachDetectie(&detecties);
}

Zijn maar wat van de opties die je hebt als je het los doet. Doe je het niet los is het het eigenlijk niet waard een library te maken, had je het ook gewoon in de main code kunnen zetten.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Peter Korsten op 23 april 2015, 23:28:13
Ho even, maak het nou niet ingewikkelder dan het is. En libraries en klassen hebben weinig met elkaar te maken. Sowieso betwijfel ik of dit in C++ wordt geschreven.

Een library hoort over één onderwerp te gaan. Stel dat je een library schrijft om een database aan te spreken, dan wil je daar niet code in plaatsen om netwerkverbindingen te maken. Dat zijn twee heel uiteenlopende zaken en die horen daarom in verschillende libraries thuis.

Nu zul je zeggen: "Maar ik doe niets met databases of netwerkverbindingen." En dat klopt inderdaad, maar je doet wel verschillende dingen. Waar het vooral om gaat is dat je dingen zoveel mogelijk scheidt.

Ik kom hier morgen op terug, nu te moe.

- Peter
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 24 april 2015, 00:01:20
Hoi volgers,

@Timo

Bedankt voor je input. (y)

Begin het nu te snappen denk ik :D

Wat je bedoeld is eigenlijk : als ik in een library bv sturing.comando() meerdere wissels wil ga sturen moet ik in een algemene library sturing 10 keer dezelfde instructie geven alleen met iedere keer een hoger wissel nummer.

Maak ik een library wissels aan kan ik in het main programma door middel van een teller er onbeperkt aantal wissels mee aansturen (theoretisch gezien) zonder dat de library vol loopt met programmeer code.  :)

Begrijp ik het goed, hoe library's werken, of snap ik het nog niet helemaal. ::)


@Peter

Bedankt voor je input  (y)
Ik ben benieuwt of ik morgen weer wat wijzer word met betrekking tot het programmeren van library's.

Voor zover ik het weet is de Arduino programmeertaal afgeleid van C++/C en kan volgens mij C++ librarys 's lezen, maar ik weet het niet zeker.

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Peter Korsten op 24 april 2015, 08:37:42
Wat je nu beschrijft zijn functies. Een functie (ook procedure genoemd in sommige programmeertalen als het geen waarde oplevert) is een stukje code dat je verschillende keren kunt aanroepen, zodat je niet steeds dezelfde statements hoeft uit te voeren.

Een functie kan ook parameters hebben. Stel bijvoorbeeld dat je wissel nummer 1 omzet door een bit naar pin 16 te schrijven. Wissel 2 zit op pin 17, wissel 3 op pin 18, enzovoorts.

Als je dan een wisselstraat wil instellen, dan zou je dat als volgt kunnen doen:
schrijfBit( 16, 1 );
schrijfBit( 17, 1 );
schrijfBit( 18, 1 );
schrijfBit( 19, 1 );

Maar dat is niet zo handig. Handiger is om zoiets te schrijven:
void zetWissel( int nummer )
{
    schrijfBit( 15 + nummer, 1 );
}

en even later:

int i;
for( i = 1; i <= 4; i++ )
    zetWissel( i );

(Daar zit meteen een probleem: wat als je -1 als nummer meegeeft als parameter aan zetWissel? Daar moet je ook rekening mee houden.)

Maar dat is dus een functie en geen library. Een library is in feite niets anders dan een verzameling functies, of als je objectgeoriënteerd programmeert, een verzameling klassen, ieder met hun eigen variabelen en functies (of 'methoden' zoals je dat noemen bij objectgeoriënteerd).

Waarom zou je dan een library bouwen? Wel, zoals ik al zei, om zaken thematisch te scheiden. Als je aan code voor je seinen gaat werken, wil je liever niet aan de code voor je wissels komen. Je komt alleen aan die code die je daadwerkelijk wil wijzigen. Als je alles op een grote hoop gooit, is het veel gemakkelijker om het overzicht kwijt te raken en fouten te maken.

Je hebt dus de volgende elementen:

Punt 3 kun je overslaan als je maar één programma schrijft en die code nergens anders voor gaat gebruiken. In dit geval kan dat dus best het geval zijn.

Wat echt belangrijk is, is om de koppeling tussen modules zo minimaal mogelijk te houden. Dat wil dus zeggen dat je functies thematisch scheidt in bronbestanden en dat je globale variabelen (die door het hele programma beschikbaar zijn) zoveel mogelijk vermijdt. Idealiter moet ieder bronbestand apart kunnen compileren en alleen afhankelijk zijn van bepaalde functies in andere bestanden of van het systeem.

- Peter
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 24 april 2015, 14:03:56
Hoi Peter,

Je hebt op zich gelijk dat een library en een classe niet hetzelfde zijn. Alleen is het eigenlijk binnen Arduino zo dat dit altijd het geval is. Vandaar dat ik ze in dit geval ook zo makkelijk door elkaar gebruik.

Verder kan ik het alleen maar met Peter eens zijn, splits de dingen die niets met elkaar te maken hebben. Een wissel en en blok hebben in de basis niets met elkaar te maken.

Verder is het schrijven van een libraries met classe makkelijk voor de schaalbaarheid. Als je één library zou schrijven voor alle blokken, hoe groot maak je dan de variabele voor welke pinnen bij welk blok horen? Het is embedded code dus je kan wel een array gebruiken maar tijdens het compilen moet de grote bekend zijn. Je zou natuurlijk kunnen zeggen, "dan ga ik gewoon aan de grote kant zitten en ga ik voor 20" maar dat is wel zonde van het geheugen als je maar 3 blokken maakt. Maak je een classe voor één blok kan je daar gewoon voor ieder blok een instantie van maken.

Kijk maar eens naar de servo library, per servo die je wilt besturen maak je gewoon een instantie aan van servo.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Peter Korsten op 24 april 2015, 15:27:50
Tja, mijn achtergrond is momenteel Java, dus voor mij is een bronbestand gelijk aan een klasse en een library is een verzameling klassen.

'Momenteel Java' omdat ik ook ervaring heb met shell scripts, C, C++, Perl, PHP, Pascal, Modula-2, BASIC, Z80 assembly, 8088 assembly, 68000 assembly, Awk, Expect en nog een paar die ik nu vergeet. :)

- Peter
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 13 mei 2015, 23:56:45
Hoi Volgers,

@Timo

Bedankt voor je input?

@Peter

Bedankt voor je input?

@ allen

Hoewel er al weer een tijdje geen update is geweest, heb ik niet stil gezeten.
Ik ben druk bezig geweest met proberen, om een Arduino library te schrijven voor een functie.

Het is de eerste keer dat ik het probeer (geheel van de grond opgebouwd, voorheen paste ik library's aan, aan mijn eigen eisen.)

De library heet : AamsTrein.h en AamsTrein.cpp

AamsTrein.h

/*
AamsTrein.h v1 - Library voor Arduino Analoge Modelbaan Sturing of kortweg AAMS.
Writen by Paul Smits
*/

/*
Deze library stuurt de motordriver L298 voor de Arduino Analoge Modelbaan sturing.
*/

#ifndef AamsTrein_h
#define AamsTrein_h

#include "Arduino.h"

class AamsTrein {
public:
AamsTrein(byte pinPwmA, byte pinAin1, byte pinAin2, byte pinPwmB, byte pinBin1, byte pinBin2);

int value;

void start(byte train, byte direction);
void stop(byte train);
                void vertrek(byte train, byte direction);
void remmen(byte train, byte direction);
void noodstop(byte train, int speed);
void richting(byte direction);
void snelheid(byte speed);
void on(byte train);

private:

bool inPin1;
bool inPin2;

byte pinPwmA;
byte pinAin1;
byte pinAin2;
byte pinPwmB;
byte pinBin1;
byte pinBin2;

};

#endif

En Hier de

AamsTrein.cpp

/*
AamsTrein.cpp v1 - Library voor Arduino Analoge Modelbaan Sturing of kortweg AAMS.
Writen by Paul Smits


/*
Deze library is, voor het sturen van de verschillende treinen.
*/


#include "AamsTrein.h"


AamsTrein::AamsTrein(byte pinPwmA, byte pinAin1, byte pinAin2, byte pinPwmB, byte pinBin1, byte pinBin2){

this-> pinPwmA = pinPwmA; // Arduino pin 3~
this-> pinAin1 = pinAin1; // Arduino pin 2
this-> pinAin2 = pinAin2; // Arduino pin 4
this-> pinPwmB = pinPwmB; // Arduino pin 6~
this-> pinBin1 = pinBin1; // Arduino pin 5
this-> pinBin2 = pinBin2; // Arduino pin 7

pinMode(this-> pinPwmA, OUTPUT);
pinMode(this-> pinAin1, OUTPUT);
pinMode(this-> pinAin2, OUTPUT);
pinMode(this-> pinPwmB, OUTPUT);
pinMode(this-> pinBin1, OUTPUT);
pinMode(this-> pinBin2, OUTPUT);

}

void AamsTrein::start(byte train, byte direction)
{

  bool inPin1 = LOW;
  bool inPin2 = HIGH;

  if(train == 0)
   {
    digitalWrite(this-> pinAin1, inPin1);
    digitalWrite(this-> pinAin2, inPin2);
    analogWrite(this->  pinPwmA, 120);
   }

  if(train == 1)
   {
    digitalWrite(this-> pinBin1, inPin1);
    digitalWrite(this-> pinBin2, inPin2);
    analogWrite(this->  pinPwmB, 120);
   }

  if(direction == 0)
   {
    inPin1 = HIGH;
    inPin2 = LOW;
   }

  if(direction == 1)
   { 
    inPin1 = LOW;
    inPin2 = HIGH;
   }
}

void AamsTrein::stop(byte train)
{

  if(train == 0)
   {
     analogWrite(this-> pinPwmA, 0);
   }

  if(train == 1)
   {
     analogWrite(this-> pinPwmB, 0);
   }
}
void AamsTrein::vertrek(byte train, byte direction)
{
  bool inPin1 = LOW;
  bool inPin2 = HIGH;
  int value;

  if(direction == 0)
   {
    inPin1 = HIGH;
    inPin2 = LOW;
   }

  if(direction == 1)
   { 
    inPin1 = LOW;
    inPin2 = HIGH;
   }

  if(train == 0)
   {
    digitalWrite(this-> pinAin1, inPin1);
    digitalWrite(this-> pinAin2, inPin2);
   
      for(value = 60 ; value <= 250; value++)
{
analogWrite(this->  pinPwmA, value);
}
   }

  if(train == 1)
   {
    digitalWrite(this-> pinBin1, inPin1);
    digitalWrite(this-> pinBin2, inPin2);

for(value = 60 ; value <= 250; value++)
{
  analogWrite(this->  pinPwmB, value);
}
   }
}

void AamsTrein::remmen(byte train, byte direction)
{
  bool inPin1 = LOW;
  bool inPin2 = HIGH;
  int value;

  if(direction == 0)
   {
    inPin1 = HIGH;
    inPin2 = LOW;
   }

  if(direction == 1)
   { 
    inPin1 = LOW;
    inPin2 = HIGH;
   }

  if(train == 0)
   {
    digitalWrite(this-> pinAin1, inPin1);
    digitalWrite(this-> pinAin2, inPin2);
   
      for(value = 250 ; value >= 50; value--)
{
analogWrite(this->  pinPwmA, value);
}
   }

  if(train == 1)
   {
    digitalWrite(this-> pinBin1, inPin1);
    digitalWrite(this-> pinBin2, inPin2);

for(value = 250 ; value >= 50; value--)
{
  analogWrite(this->  pinPwmB, value);
}
    }
}

void AamsTrein::snelheid(byte speed)
   {
//Er word nog aan functie snelheid gewerkt! (deze functie is bedoeld voor Handbediening)
   }

void AamsTrein::richting(byte direction)
   {
// Er word nog aan functie richting gewerkt! (deze functie is bedoeld voor Handbediening)
   }

void AamsTrein::on(byte train)
   {
// Er word nog aan functie on gewerkt! (deze functie is bedoeld voor Handbediening)
   }
void AamsTrein::noodstop(byte train, int speed)
   {
// Er word nog aan functie noodstop gewerkt! (deze functie is bedoeld voor Handbediening)
   }

De volgende functies heb ik in de library gebouwd :

start, stop, vertrek, remmen voor automatische bediening.
en voor handbediening : noodstop, richting, snelheid, on (moet nog een andere naan bedenken)

Ik heb de functies uitgeprobeerd in het Arduino programma, voor zo ver ik het kan zien worden de functies geaccepteerd, ik heb het nog niet in de praktijk geprobeerd, maar dat komt morgen, ik ga het testen met leds werkt dat goed ga ik het met de L298 shield verder testen.

Mochten er nog onvolkomenheden en/of fouten, of op/aanmerkingen zijn hoor ik dat graag.

mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 14 mei 2015, 22:52:13
Hoi volgers,

Zoals ik gisteren schreef heb ik vandaag de AamsTrein library getest, helaas werkte deze niet of niet goed :o, met name het pwm gedeelte van de library, dat was even balen. ???

De trein trekt langzaam op en na een tijdje moet de trein langzaam afremmen, dit word door het pwm sturing geregeld en juist dat gedeelte van de code werkte niet ::).

De simple code (komt uit de library) :

  if(train == 0){
 
    int value;
   
    for(value = 0 ; value <= 250; value++){

    digitalWrite(this-> pinAin1, inPin1);
    digitalWrite(this-> pinAin2, inPin2);
   
  analogWrite(this->  pinPwmA, value);

}
 }
Dit is een klein gedeelte van de library code.

Je zou denken dat het werk maar het werk toch niet.

Om er zeker van te zijn dat de code in de library goed was heb ik deze code rechtstreeks in de Arduino IDE gezet, en vervolgens getest en wat denk je, het werkte ook daar niet   :P ::),  dat is even balen.  ???

Verroest wat doe ik verkeerd, na wat switchen met de Accolades en andere code werkte het nog steeds niet.

Ineens had ik een idee misschien liep het programma te snel voor een goede pwm regeling, ik heb er een kleine vertraging in gebouwd, en zie het werkte YESSSSSSS! (y), de pwm regeling werkte nu wel goed, het was nu alleen nog uitzoeken hoe klein de vertraging moest wezen.

Wat mij ook opviel met de pwm sturing is, dat de vertraging van het optrekken groter moet zijn, dan de vertraging van het afremmen. ::), het zal wel een Arduino enigenaardigheidje zijn :-X  ;D

Het werkende stukje code:
  if(train == 0){
 
    int value;
   
    for(value = 0 ; value <= 250; value++){

    digitalWrite(this-> pinAin1, inPin1);
    digitalWrite(this-> pinAin2, inPin2);
   
  analogWrite(this->  pinPwmA, value);
  delay(60);
}
 }

Ik heb het op verschillend manieren geprobeerd om het voor elkaar te krijgen maar het werkt alleen met het comando delay(vertraging)

Het was mij niet bekent dat je een kleine vertraging moet inbouwen om de pwm regeling goed te laten regelen. 

De bovenstaande code komt uit de library en zal, zoals het nu als code staat ook niet werken, het was als voorbeeld bedoeld.

Ik moet alleen nog drie functies maken voor de hand/terminal bediening.

De AamsTrein.cpp library :

/*
AamsTrein.cpp v1 - Library voor Arduino Analoge Modelbaan Sturing of kortweg AAMS.
Writen by Paul Smits


/*
Deze library is, voor het sturen van de verschillende treinen.
*/


#include "AamsTrein.h"


AamsTrein::AamsTrein(byte pinPwmA, byte pinAin1, byte pinAin2, byte pinPwmB, byte pinBin1, byte pinBin2){

this-> pinPwmA = pinPwmA; // Arduino pin 3~
this-> pinAin1 = pinAin1; // Arduino pin 2
this-> pinAin2 = pinAin2; // Arduino pin 4
this-> pinPwmB = pinPwmB; // Arduino pin 6~
this-> pinBin1 = pinBin1; // Arduino pin 5
this-> pinBin2 = pinBin2; // Arduino pin 7

pinMode(this-> pinPwmA, OUTPUT);
pinMode(this-> pinAin1, OUTPUT);
pinMode(this-> pinAin2, OUTPUT);
pinMode(this-> pinPwmB, OUTPUT);
pinMode(this-> pinBin1, OUTPUT);
pinMode(this-> pinBin2, OUTPUT);

}

void AamsTrein::start(byte train, byte direction)
{

  bool inPin1 = LOW;
  bool inPin2 = HIGH;

  if(train == 0)
   {
    digitalWrite(this-> pinAin1, inPin1);
    digitalWrite(this-> pinAin2, inPin2);
    analogWrite(this->  pinPwmA, 120);
    delay(25);
   }

  else if(train == 1)
   {
    digitalWrite(this-> pinBin1, inPin1);
    digitalWrite(this-> pinBin2, inPin2);
    analogWrite(this->  pinPwmB, 120);
    delay(25);
   }

  if(direction == 0)
   {
    inPin1 = HIGH;
    inPin2 = LOW;
   }

  else if(direction == 1)
   { 
    inPin1 = LOW;
    inPin2 = HIGH;
   }
}

void AamsTrein::stop(byte train)
{

  if(train == 0)
   {
     analogWrite(this-> pinPwmA, 0);
   }

  else if(train == 1)
   {
     analogWrite(this-> pinPwmB, 0);
   }
}
void AamsTrein::vertrek(byte train, byte direction)
{
  bool inPin1 = LOW;
  bool inPin2 = HIGH;

 
  if(direction == 0)
   {
    inPin1 = HIGH;
    inPin2 = LOW;
   }

  else if(direction == 1)
   { 
    inPin1 = LOW;
    inPin2 = HIGH;
   }

  if(train == 0){
 
    int value;
   
    for(value = 0 ; value <= 250; value++){

    digitalWrite(this-> pinAin1, inPin1);
    digitalWrite(this-> pinAin2, inPin2);
   
  analogWrite(this->  pinPwmA, value);
  delay(60);
}
 }

  else if(train == 1){
 
   int value;
   
   for(value = 0 ; value <= 250; value++){

    digitalWrite(this-> pinBin1, inPin1);
    digitalWrite(this-> pinBin2, inPin2);

  analogWrite(this->  pinPwmB, value);
  delay(60);
 
}
 }
}

void AamsTrein::remmen(byte train, byte direction){

  bool inPin1 = LOW;
  bool inPin2 = HIGH;
  int value;

  if(direction == 0)
   {
    inPin1 = HIGH;
    inPin2 = LOW;
   }

  else if(direction == 1)
   { 
    inPin1 = LOW;
    inPin2 = HIGH;
   }

  if(train == 0){
   
     for(value = 250 ; value >= 0; value--){

   digitalWrite(this-> pinAin1, inPin1);
   digitalWrite(this-> pinAin2, inPin2);
     
  analogWrite(this->  pinPwmA, value);
  delay(25);
 
}
 }

  else if(train == 1){
 
  for(value = 250 ; value >= 0; value--){

    digitalWrite(this-> pinBin1, inPin1);
    digitalWrite(this-> pinBin2, inPin2);

  analogWrite(this->  pinPwmB, value);
  delay(25);
 
}
 }
}

void AamsTrein::snelheid(byte speed)
   {
//Er word nog aan functie snelheid gewerkt! (deze functie is bedoeld voor Handbediening)
   }

void AamsTrein::richting(byte direction)
   {
// Er word nog aan functie richting gewerkt! (deze functie is bedoeld voor Handbediening)
   }

void AamsTrein::on(byte train)
   {
// Er word nog aan functie on gewerkt! (deze functie is bedoeld voor Handbediening)
   }
void AamsTrein::noodstop(int speed)
   {
// Er word nog aan functie noodstop gewerkt!
if (speed == 0){

   analogWrite(this->  pinPwmA, 0);
   analogWrite(this->  pinPwmB, 0);
   }
}

Hardware

De Aams sturing is ondertussen uitgebreid met een I2C interface en I2C LCD display.
Beide Arduino Nano's zijn met elkaar verbonden via I2C en kunnen met elkaar communiceren.

Er gaat nog een derde en een vierde Arduino Nano bij komen om wissels om te zetten en om twee keerlussen te kunnen sturen.

Ook nog in de planing een I2C tijd/datum module met weergave op het LCD Display.

De ruimte in de stuurkast word nu wel erg krap :P, dat word een grotere behuizing bouwen. ::)

(https://images.beneluxspoor.net/bnls/IMGP5316.jpg) (https://images.beneluxspoor.net/bnls/IMGP5316.jpg)

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: spock op 15 mei 2015, 12:29:14
Hoi Paul,

Ik ben sinds een paar maanden ook bezig met Arduino en zie toch aardig wat overeenkomsten met jou vorderingen.

Ik heb niet het hele draadje gelezen, maar als jij meerdere treinen wilt laten lopen dan ben ik bang dat je toch tegen een limiet aan gaat lopen.

Het gebruik van de functie delay is ten zeerste af te raden. In het voorbeeld (voor het op tellen) werd een delay van 60ms gebruikt in een loop van 250. Dit is 15 seconden. Ik weet dat het een voorbeeld is, maar al breng je het terug naar 1 seconde (per blok), dan is het nog lang.

Ik heb een modelauto 4-wegkruising besturingsprogramma geschreven (20 input sensoren en 4 servo's als output) en daar is nergens een delay gebruikt.

De structuur van het programma wordt daardoor wel anders (en ingewikkelder/interressanter).
Het progamma wordt dan een loop van:  lees sensoren, bereken de aktie, voer aktie uit. Het idee is dat je de vertragingen gaat doen mbv tijdmeting mbv de functie millis().
Je zet PMW signaal, onthoud de tijd en gaat verder. Bij de volgende keer dat je langs komt kijk je of de tijdverstreken is en zet dan de PMW naar de volgende waarde, enz.

Voorbeeld met millis():

http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Hierdoor kun je later makkelijk nog een paar blokken er bij zetten, de Arduino is er krachtig genoeg voor om dit af te handelen.

MVG spock

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 15 mei 2015, 14:31:24
Hoi volgers,

@ spock

Bedankt voor je input.

Citaat
Het gebruik van de functie delay is ten zeerste af te raden. In het voorbeeld (voor het op tellen) werd een delay van 60ms gebruikt in een loop van 250. Dit is 15 seconden. Ik weet dat het een voorbeeld is, maar al breng je het terug naar 1 seconde (per blok), dan is het nog lang.

Ik weet even niet wat het een en het ander met elkaar te maken hebt, de teller lus word gebruikt om de locomotief langzaam te laten optrekken of langzaam te latten stoppen, de vertraging zorgt er voor dat de teller lus ook als teller lus werkt.

Met het millis lukt dat niet (kan komen omdat mijn kennis van de Arduino nog niet zo groot is, en de voorbeelden die gegeven zijn, werken op de een of andere manier niet.)

Als ik het delay() comando niet gebruik rijd de locomotief meteen op volle snelheid, er moet dus een kleine vertraging ingebouwd worden om dat te voorkomen de waarde 60 heb ik gebruikt om de pwm regeling te kunnen testen met LED's , deze waarde moet ik nog bepalen om een gemiddelde optrek/af-rem vertraging in te stellen, het zal ongeveer op de 30-40 ms uitkomen.

Voor zo ver mijn kennis reikt word alleen de teller lus aangeroepen als dat nodig is.

Daarbij komt nog dat een vertraging op mijn te bouwen baan niet veel uitmaakt, omdat er niet meer treinen kunnen rijden als er blokken zijn (klop al niet helemaal).
Heb ik 10 blokken kan ik er maar 5 treinen op laten rijden,  in mijn planning gaan er max 5 tegelijk rijden en ik denk dat ik dat al niet eens haal, een vertraging in het Arduino programma zal niet veel invloed op het trein verloop hebben.

Voornamelijk word de Arduino gebruikt met terminal bediening om het trein verloop te regelen.

Misschien dat er op een gedeelte van de baan automatische gereden word, ik denk dat vertragingen in het Arduino programma niet veel invloed heeft op het rijden van de verschillende treinen.

Wat ook meespeelt is dat deze baan 100% analoog blijft, maar wel met computer bediening.

Als ik het verkeerd denk hoor ik dat graag. ::)

Voor de duidelijkheid,  deze Arduino Analoge Modelbaan Sturing is voor mijn baan thuis gemaakt en niet voor  commercieele  toepassingen, mochten er mensen zijn die deze code willen gebruiken is dat geen probleem, wees welkom.  (y)

Op mijn, te bouwen baan komen waarschijnlijk 2 keerlussen, de aansturing van de keerlussen wil ik gaan doen met de Arduino, mijn volgende library word dan ook een keerlus library,  deze sturing wil ik ook weer opnemen in mijn AAMS programma, voor de sturing ga ik gebruik maken van een Arduino Nano die weer via i2C word gestuurd.

Dit word weer een flinke uitdaging om het voor elkaar te krijgen , ach ja het is tenslotte een hobby  ;D

Voor het baanplan zie mijn draadje "Laubenstein" link beneden ;D

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Robert E op 15 mei 2015, 14:46:34
Ipv delay kun je misschien  beter een soft timer module gebruiken zoals bijvoorbeeld deze

http://www.freetronics.com.au/blogs/news/6864767-arduino-softtimer-the-new-timer-manager-arduino-library#.VVXpiJO2pUE

Enige nadeel is dat men de loop ook in die module heeft gedaan, dat is eruit halen en de timer aanroep die daar staat in je eigen loop zetten. Geloof dat er ook geen stop in zat en nog eentje die er niet in zat en makkelijk is.... Kwestie van toevoegen...

Mvg,

Robert
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: spock op 15 mei 2015, 15:33:55
Hoi Paul,

De opmerking over het gebruik van delay was als een algemene opmerking bedoeld vwb een wat groter Arduino programmering project, niet alleen specifiek dit geval.

Wat ik probeerde aan te geven is dat als je die millis() methode toepast je meerdere akties tegelijk kunt uitvoeren.

In jou geval:

Stel: je wilt 3 treinen van je bord laten starten. Dan druk je op de eerste lok (dan moet je wachten totdat deze op de gewenste snelheid is) en kun je daarna pas de tweede lok starten. In de voorgestelde methode kunnen meerdere loks tegelijkertijd gestart worden. Het is echter een moeilijkere implentatie, dat geef ik toe.

Die millis() methode werkt wel (ervaringsdeskundige), maar als je dit pricipe toepast dan veranderd het hele principe (en code) van je programma.
In de huidige methode wordt 1 taak eerst compleet afgehandeld voordat taak 2 wordt afgehandeld. In de voorgestelde methode wordt er afwisselend aan delen van taak 1 en 2  gewerkt.

Zoals ik al aangaf had ik niet het hele draadje gelezen  ::). Ik had namelijk het idee dat er misschien  blokmeldingen gemist of te laat gezien zouden worden (lekker Nederlands).

Met vriendelijke groet, spock









Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 15 mei 2015, 16:31:20
Als ik het verkeerd denk hoor ik dat graag. ::)
Bij deze dan  ;D De delay zorgt er (onnodig) voor dat je hele Arduino hangt. In die tijd (die het eigenlijk uit zijn neus staat te vreten) reageert hij nergens meer op. Ook niet meer op bijvoorbeeld een noodstop! Als ik jou was zou ik toch echt de BlonkWithoutDelay eens een keer aan de gang krijgen. Dit is in mijn ogen echt wel een basis begrip dat je onder de knie moet hebben wil je meer gaan doen met de Arduino.

En inderdaad, een Arduino (of elke microcontroller) is heel snel. Tot 250 tellen kost hem (voor ons idee) dus geen tijd. Vertraging is inderdaad nodig maar met delay is niet de "juiste" manier.

Library is verder leuk opgezet. Alleen... Splits die boel nu eens  ;D ;D ;D Je denk steeds in te grote blokken. Het feit dat er 2 motordrivers op één print zitten betekend niet dat je deze in één library moet onderbrengen. Beide motordrivers zijn los van elkaar aan te sturen. Als je nu ook in code kijkt zie je dat je heel veel dingen er nu dubbel in hebt staan, een keer per driver kant. Het mooie van een library zou in dit geval juist zijn dat je hier geen last van hebt!


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: woutermelis op 15 mei 2015, 17:08:15
Wauw! Wat een project. Probeer het al een tijdje met bewondering te volgen en te snappen. Gaat mijn pet nog te boven. Leuk dat we drie weken geleden een project voor V5 leerlingen met arduino's zijn gestart. Ik ben met 2 maten bezig om een stoplicht situatie na te maken, dat valt toch wat in het niets bij dit project! Puik werk!
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 15 mei 2015, 17:12:20
Verkijk je daar niet op Wouter, een verkeerslicht kan heeeeeeeeel ingewikkeld gemaakt worden  ;)


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 15 mei 2015, 18:02:42
@Paul, Ik hoop niet dat je het erg vindt maar ik heb je library weer een beetje herschreven  ::) Aangezien de cavia van mijn vriendin mijn USB verlengkabeltje door heeft geknaagd heb ik het nog niet kunnen testen ::) Ga ik nu maar even solderen. Compilen doet het iig gewoon (Arduino IDE 1.6.3)

Maar in de basis geeft het een idee wat ik bedoel. Ik heb zo veel mogelijk de functies gebruikt die jij ook had. Een paar waarvan ik niet snapte wat je er mee wilde of overbodig waren zijn vervallen. Paar andere zijn erbij gekomen. Ik heb de delay vervangen door de millis() optie. Ipv direction gebruikt het een speed die positief is voor vooruit en negatief voor achteruit. Dit maakt de code net iets makkelijker.

AamsTrein.h
/*
AamsTrein.cpp v2 - Library voor Arduino Analoge Modelbaan Sturing of kortweg AAMS.
Writen by Paul Smits
Edit by Timo Engelgeer ;)
*/

/*
Deze library stuurt de motordriver L298 voor de Arduino Analoge Modelbaan sturing.
*/

#ifndef AamsTrein_h
#define AamsTrein_h

#include "Arduino.h"

class AamsTrein {
public:
AamsTrein(byte pinPwm, byte pinIn1, byte pinIn2);

void snelheid(int speed);
int getSnelheid();
void update();
void setVertraging(unsigned int vertraging);
unsigned int getVertraging();
void noodstop();
void start(byte direction);
void stop();

protected:

void setSnelheid(int speed);

int setSpeed; //Snelheid die we willen gaan rijden
int curSpeed; //Snelheid waarop de PWM werkelijk is ingesteld.
unsigned int vertraging;
unsigned long millisLast;

byte pinPwm;
byte pinIn1;
byte pinIn2;


};

#endif

AamsTrein.cpp
/*
AamsTrein.cpp v2 - Library voor Arduino Analoge Modelbaan Sturing of kortweg AAMS.
Writen by Paul Smits
Edit by Timo Engelgeer ;)


/*
Deze library is, voor het sturen van de verschillende treinen.
*/


#include "AamsTrein.h"


AamsTrein::AamsTrein(byte pinPwm, byte pinIn1, byte pinIn2){
//Save the pins to use
this->pinPwm = pinPwm;
this->pinIn1 = pinIn1;
this->pinIn2 = pinIn2;

//Make them output
pinMode(this->pinPwm, OUTPUT);
pinMode(this->pinIn1, OUTPUT);
pinMode(this->pinIn2, OUTPUT);

vertraging = 0; //Standaard geen vertraging

}

void AamsTrein::snelheid(int speed){
//Snelheid begrenzen tot max 255 in beide richtingen
if(speed > 255){
speed = 255;
}
else if(speed < -255){
speed = -255;
}

setSpeed = speed;

if(vertraging == 0){
this->setSnelheid(setSpeed);
}
}

//Geeft de ingestelde snelheid
int AamsTrein::getSnelheid(){
return this->setSpeed;
}


//Protected functie, niet van buiten de classe te benaderen.
//Stelt werkelijk de hardware in op de juiste snelheid
void AamsTrein::setSnelheid(int speed){
if(curSpeed != speed){
curSpeed = speed;

if(speed < 0){
digitalWrite(this->pinIn1, HIGH);
digitalWrite(this->pinIn2, LOW);
analogWrite(this-> pinPwm, -speed);
}
else{
digitalWrite(this->pinIn1, LOW);
digitalWrite(this->pinIn2, HIGH);
analogWrite(this-> pinPwm, speed);
}
}
}

//Checkt of de snelheid aangepast moet worden (optrekken/afremmen) en doet dit
//Aanroepen in de loop
void AamsTrein::update(){
//Kijken of het tijd is om een update te doen
if(millis() - this->millisLast > this->vertraging) {
this->millisLast = millis(); //opslaan dat we nu een update doen

if(setSpeed > curSpeed){ //moeten dus sneller
this->setSnelheid(curSpeed + 1);
}
else if(setSpeed < curSpeed){ //moeten langzamer
this->setSnelheid(curSpeed - 1);
}
}
}

//Stelt de vertraging tussen het aanpassen van de snelheid in (in ms)
void AamsTrein::setVertraging(unsigned int vertraging){
this->vertraging = vertraging;
}


//Geeft de ingestelde vertraging
unsigned int AamsTrein::getVertraging(){
return this->vertraging;
}

//Triggert de noodstop
void AamsTrein::noodstop(){
//Door beide in-pinnen laag te maken en de PWM pin hoog is er een "Fast Motor Stop"
digitalWrite(this->pinIn1, LOW);
digitalWrite(this->pinIn2, LOW);
digitalWrite(this->pinPwm, HIGH);

//En even de snelheden updaten
setSpeed = 0;
curSpeed = 0;
}

// Volgende functies erin gehouden omdat deze er waren

//Gewoon starten met snelheid 120 met mogelijkheid om richting op te geven
//Houdt rekening met de ingestelde vertraging
void AamsTrein::start(byte direction){
if(direction){
this->snelheid(120);
}
else{
this->snelheid(-120);
}
}

//Stop de treinen
//Houdt rekening met ingestelde vertraging
void AamsTrein::stop(){
this->snelheid(0);
}

Voorbeeld hoe je deze code gebruikt met beide motordrivers waarbij de eerste driver achteruit naar snelheid 200 optrekt:
#include <AamsTrein.h>

#define AANTAL_BLOKKEN 2

AamsTrein treinen[AANTAL_BLOKKEN] = {
  {3, 2, 4},    //Eerste motordriver
  {6, 5, 7}     //Tweede motordriver
};

void setup() {
  //Geef de eerste driver een 60ms vertraging tussen iedere snelheidsstap
  treinen[0].setVertraging(60);

  //Geeft tweede motordriver dezelfde vertraging als de eerste
  treinen[1].setVertraging( treinen[0].getVertraging() );

}

void loop() {
  //Dit blok moet altijd in je loop staan (=vaak aangeroepen worden)
  //om te zorgen dat de blokken de juiste snelheid hebben
  //Gebruik GEEN delay in de loop, dit zal de optrek/afrem vertraging in de war schoppen
  for (byte i = 0; i < AANTAL_BLOKKEN; i++) {
    treinen[i].update();
  }
 
  //trek op naar "-200" (achteruit dus)
  treinen[0].snelheid(-200);
 
}

Ik hoop dat dit een beetje een beeld geeft wat ik eerder al bedoelde en iets geeft waarmee je verder kan :) Denk het wel want heb zo veel mogelijk de functies die jij voor ogen had aangehouden :)



Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 15 mei 2015, 19:28:10
Hoi volgers,

@Timo

Bedankt voor je input en library.

De functies die nog niet geprogrammeerd zijn, waren speciaal bedoeld voor de Terminal bediening van de Arduino.

Ik heb echter ::) nog een vraagje je definieert het volgende 
Citaat
#define AANTAL_BLOKKEN 2
is dit een functie binnen de Arduino ide of kan ik het als volgt definiëren
Citaat
#define AANTAL_TREINEN 2
ik hou graag dezelfde definitie van de library aan.

De library werk ook in de praktijk, dat heb ik net even getest. (y)

Laat de Cavia van je vriendin zelf het usb kabeltje repareren ;D ;D ;D ;D

Deze libray geeft mij voldoende informatie om verder te gaan met het maken van verschillende library's voor mijn AAMS sturing.


@ Robert, Wouter, spock

Bedankt voor jullie reactie.

mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 15 mei 2015, 19:54:39
Hoi Paul,

Wat ik al zei, doel van de functies was me niet helemaal duidelijk. Vandaar dat ik ze niet had overgenomen. Misschien dat je ze verder toe kunt lichten wat het idee er achter was? Want volgens mij heb je buiten deze functies geen extra functies nodig om de boel aan te sturen via terminal. Afgezien van de optrek/afremvertraging zit er 0 automatie in. Dus mijn vraag, wat was je doel specifiek met die functies in vergelijking met wat je af had/ik gemaakt had?

Een define is precies wat het zegt, het definieert iets. De compiler doet eigenlijk een zoeken en vervangen actie voor elke define voor hij met het echte compilen begint. Je gebruikt een define zo (of zie Arduino (http://www.arduino.cc/en/Reference/Define)):
#define HIER_EEN_NAAM [wat het echt moet zijn]
Het "HIER_EEN_NAAM" mag alles zijn wat jij wilt. Wordt normaal in hoofdletters gedaan om aan te geven dat het een define is.
Vervolgens wordt overal waar je in je sketch "HIER_EEN_NAAM" gebruikt vervangen door "[wat het echt moet zijn]".
In het voorbeeld had ik het even snel "AANTAL_BLOKKEN" genoemd maar je hebt gelijk dat "AANTAL_TREINEN" of "AANTAL_DRIVERS" beter is. Gaat er vooral om dat het aangeeft hoeveel verschillende instaties van AamsTrein je hebt (en dat overal gebruikt waar ik "AANTAL_BLOKKEN" schreef of war je wilt weten hoeveel blokken je hebt).

Maar het hele was vooral te laten zien dat ipv een library die beide motordrivers aan stuurt je makkelijker twee instanties (in een array, treinen[0] en treinen[1]) kunt maken die ieder één driver doen. Zie het als twee instanties van een bestuurder maken die beide een auto besturen ipv een complexere instantie die twee auto's tegelijk kan besturen  ;D


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 15 mei 2015, 20:21:28
Hoi Timo

Deze functie's heb ik nodig om in het Gambas programma strings naar de seriele poort stuur bv. trein 1, snelheid 100, richting rechtsom of iets dergelijks, door de Arduino te laten sturen.

Deze functie heb ik ook nodig om bv wissels dan wel wisselstraten aan te sturen bv. wissel1, rechtdoor,   wissel 2, rechtdoor,  wissel 3, afbuigend enz.

Als ik dat met de ascii code's moet doen ben ik snel door mijn ascii codes heen.

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 15 mei 2015, 21:16:13
Dat kan toch prima met deze library? De vertaalslag van ascii strings naar de actie lijkt me niet iets voor de AamsTrein library maar voor de sketch er om heen. Die kan dan ook bepalen of "trein 1" werkelijk op deze Arduino zit of dat het door een andere afgehandeld moet worden. De library neemt precies de taak op zich van de naam, die stuurt de trein aan. Je moet niet alles in een (of één) library willen stoppen. Het is juist makkelijk voor "iets waar je er meer van hebt" (in dit geval motordrivers/treinen) aan te sturen zonder enorme bergen code dubbel te schrijven.

Als ik dat met de ascii code's moet doen ben ik snel door mijn ascii codes heen.
Nee hoor. Het hoeft geen uniek ascii karakter te zijn voor elke optie. Je zou iedere trein kunnen aansturen door een bericht als:
0x54 0x01 0x80 0x64
Voor bijvoorbeeld trein 1 snelheid -100 (achteruit).

0x54 is in ascii een T, hiermee geef je aan dat het om een trein gaat.
0x01 is in decimaal gewoon 1
0x80 is in bitjes 1000000, om aan te geven dat het om een negatief getal gaat)
0x64 is in decimaal 100

0x80 0x64 geeft -100 als je dat in een (Arduino) int schuift.
  int speed;
  speed = 0x80;  //Plaats linker deel erin
  speed <<= 8;   //Schuif erin (naar links)
  speed &= 0x54; //Voer rest toe

Voor wissels kan je iets gelijks doen. Stuur bijvoorbeeld
0x57 0x0A ("W" "10" => wissel 10 recht)
of:
0x77 0x0A ("w" "10" => wissel 10 afbuigen)

Dit zijn heel wat minder bytes :)

Overigens wil dat niet zeggen dat jou idee van string based berichten niet werken. In tegendeel. Alleen het verwerken van een string is best lastig voor een Arduino. Als je de string "trein 1, snelheid 100, richting rechtsom" dan stuur je 20 bytes over. Ook moet de Arduino ALLE 20 bytes testen tegen de stings in de Arduino. En dat is alleen als je maar één test doet in de Arduino (if(stringIn == "trein 1, snelheid 100, richting rechtsom"){).

Ik zeg dus niet dat het een must is maar het is minder data versturen (= sneller) en een heeeeeel stuk makkelijker voor de Arduino om te lezen (en kan het snel door met waar het nog meer mee bezig was). En het is zelfs eigenlijk makkelijker programmeren. (Sorry, kon het niet laten een voorbeeldje te schrijven. Zeg maar als je het vervelend vindt.)
//Zijn maar random voorbeeld getallen/adressen
#define AANTAL_TREINEN 2
#define AANTAL_WISSELS 4
const byte TreinAdres 0;
const byte WisselAdres 8;

void loop() {
  if(bytesIn[0] == "T"){ //begint het met een T?
    if(bytesIn[1] >= TreinAdres && bytesIn[1] < (TreinAdres + AANTAL_TREINEN){
      //Dit adres zit op deze Arduino   
     
      //Selecteer juiste trein
      //Maak van de twee bytes een int
      //Zet snelheid
      treinen[bytesIn[1] - TreinAdres].snelheid( byteToInt(bytesIn[2], bytesIn[3]) );
    }
  }
  else if(bytesIn[0] == "w" || bytesIn[0] == "W"){ //begint het met een w of W?
    if(bytesIn[1] >= WisselAdres && bytesIn[1] < (WisselAdres + AANTAL_WISSELS){
      if(bytesIn[0] == "W"){
        wissels[bytesIn[1] - WisselAdres].rechtdoor();
      }
      else{
        wissels[bytesIn[1] - WisselAdres].afbuigen();
      }
    }
  }
}

int byteToInt(byte msb, byte lsb){
  int out;
  out = 0x80;  //Plaats linker deel erin
  out <<= 8;   //Schuif erin (naar links)
  out &= 0x54; //Voer rest toe
 
  return out;
}
Geen 100% code, maar bytesIn is wat de module op serial of I2C of weet ik wat binnen heeft gekregen.



Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 17 mei 2015, 23:17:31
Hoi Volgers,

@Timo

Bedankt voor je Input.

Citaat
(Sorry, kon het niet laten een voorbeeldje te schrijven. Zeg maar als je het vervelend vindt.)
Dat vind ik absoluut niet vervelend, mijn kennis van de de Arduino programmeertaal is nog niet ruim te noemen.
Ik begin er meer inzicht in te krijgen, van de programmeer voorbeelden kan ik veel leren.

@Allen

De wisselsturing.

De wissels ga ik sturen door middel van relais , dat heeft als voordeel dat ik een complete galvanische scheiding hebt met de Arduino en de voeding van de  wissels.

De terugmelding naar mijn bediening-paneel is voor mij  belangrijk, omdat mijn baan vrij groot is ongeveer 280 cm x 220 cm x 240 cm  met een breedte van  60 cm en is in een U-vorm gebouwd waardoor het bijna onmogelijk word om de wissels in de gaten te houden, Ik kan er ook wel de poorten van de Arduino voor gebruiken, maar dat vind ik eigenlijk een beetje zonde.

De gebouwde wisselsturing.
(https://images.beneluxspoor.net/bnls/IMG1676a.jpg) (https://images.beneluxspoor.net/bnls/IMG1676a.jpg)

Beschrijving wisselsturing:

Via de connector links zet ik de 5V en de Gnd (twee linker pinnen) op de print, de twee rechter pinnen zijn voor de sturing via de Arduino of rechtstreeks via een drukknopje en of reed-contact.

De wissels die ik gebruik (minitrix)  hebben geen terugmelding en geen eind afschakeling, ik kan dus maar een korte puls op de pinnen zetten ongeveer 200 ms tot 250 ms om de relais te bekrachtigen echter heb ik dan geen feedback terug van de wisselstand, nu kan ik dat ook wel sturen via de Arduino poorten, zoals ik dat al eerder opmerkte vind ik dat zonde.

Om dat op te lossen maak ik gebruik van een bi-polair relais (de witte relais) deze relais hebben maar een korte puls nodig om te schakelen en blijven dan in die stand staan totdat er op de andere spoel weer een korte puls binnenkomt, daardoor zal de stand van het relais veranderen, van deze eigenschap maak ik gebruik om de terugmelding naar het bedienings-paneel voor de wisselstand, zichtbaar te maken.

Via de Arduino kan dat ook wel, alleen weet je de wisselstand niet als de Arduino is uitgezet of gereset is,  je moet dan eerst alle wissels een voor een omzetten om de juiste wisselstand te hebben, bij een bi-polair relais staat de stand altijd vast tenzij je de wissel hebt omgezet via de schakel relais (de twee zwarte relais).

Deze wisselsturing is ook geschikt om het met drukknopjes en/of sensoren te bedienen zonder tussenkomst van de Arduino, wat het een flexibele wisselsturing maakt.

De werking van de wisselsturing.

De stuursignaal komt via een van de twee rechter pinnen binnen, dit stuursignaal gaat via een weerstand naar de transistor en stuurt twee transistoren open de ene transistor (achter de zwarte relais) stuurt het schakelrelais aan en de andere transistor (vooraan op de print) stuurt het bi-polair relais(witte relais) aan, dit relais blijft dan in deze stand staan terwijl de stuurrelais (zwarte relais)  afvalt.
Via de schakelcontacten van het bi-polair(witte relais) kan ik nu de stand van de wissel zien op mijn bedienings-paneel.     

Het stuursignaal kan via de Arduino gegeven worden of via een drukknop of via een reed-contact, echter niet tegelijk, dat is met diodes wel op te lossen, maar dat vind ik op dit moment nog niet belangrijk.

De schakeling is getest en werk bijzonder goed, het is altijd weer de vraag of je schakeling wel of niet werkt ;D

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: lok1614 op 18 mei 2015, 09:43:26
Leuk Project.

Zelf ben ik bezig met een soort gelijksysteem voor mijn fallercarsysteem.
Middels attiny85 modules die via een RS485 bus met elkaar kunnen praaten, als programeertaal gebruik ik ook arduino.
Ik gebruik een soortgelijk idee als wat Timo beschrijft, een aantal ascii codes achterelkaar zoals #1MWL wat zoiets inhoud als #, let op er komt een bericht, 1 het is voor node 1, M het komt van de master, W een wisselcommando en L hij moet naar links.
Toen ik bezig was met een stoplicht module kwam ik er ook achter dat een delay niet de oplossing was, tijdens de wacht cyclus kon hij geen berichten meer ontvangen, dit opgelost met een timerinterrupt.
En geloof me Paul ik ben ook geen programmeur, maar youtube kan zo erg je vriend zijn in dit soort gevallen  ;D .

Het meest trots ben ik op de module die een soort barcode uitleest onder de auto en zo straks vaste busroutes kan maken https://youtu.be/e8LsRgYtqVc voor een filmpje

Blijf draadje vol interessen volgen igg...

Gr Peter
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 18 mei 2015, 13:54:02
Dat vind ik absoluut niet vervelend, mijn kennis van de de Arduino programmeertaal is nog niet ruim te noemen.
Ik begin er meer inzicht in te krijgen, van de programmeer voorbeelden kan ik veel leren.
Gelukkig ;D Ik blijf het namelijk super leuk vinden om de vorderingen hier te lezen en hoop dat ik dan met de voorbeelden kan bijdragen.

Drie mini opmerkingen over de wisselsturing  ;D Ik zou de volgende keer 1N4148 diodes pakken. Deze zijn goedkoper en ook nog eens meer geschikt (veel sneller). Ook zou ik nog even een pull-up weerstand opnemen in de lijnen die de transistoren aansturen. Als de ingang zweeft (niet aangesloten of Arduino heeft de pin nog als input) kan de transistor half in geleiding komen (wisselspoelen worden beide bekrachtigd, transistor wordt warm). En kon je niet af met twee transistoren? Dus één transistor beide relais laten schakelen.

@Peter, ben je ook van plan dat ergens te gaan documenteren?


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: lok1614 op 18 mei 2015, 14:53:19
Timo,

Was wel van plan een en ander op mijn nog te bouwen site te gaan plaatsen, weet niet of dit forum daar de plek voor is, zowel dan misschien in de FCS sectie.
Is in iedergeval geen geheim :-)

Gr Peter
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 18 mei 2015, 16:13:13
Hoi volgers,

@ peter

Bedankt voor je input.
Ik heb wel eens filmpjes over het programmeren van de Arduino op Youtube bekeken, de meeste filmpjes die interessant zijn, zijn in het Engels of het Italiaans, daarbij ben ik slecht horend en versta er meestal niets van ??? , het volume omhoog draaien is ook niet de oplossing.

@Timo

Van dit type diode (1N4007) heb ik er nog een stuk of 400 liggen (gratis gekregen ;D) , eigenlijk dacht ik dat de 1N4148 te licht was om als blusdiode ingezet te worden (Weer wat geleerd ;D).

Bedankt voor de tip, voor het gebruik van een pull-up weerstand, zal ik in het volgende bouwproject (keerlus sturing) meenemen.

Ik heb geprobeerd om beide relais met 1 transistor te aansturen maar het bi-polaire relais kwam niet goed mee (soms wel/soms niet) vandaar de keuze voor twee transistoren type BC547B misschien de volgende keer een iets zwaardere type gebruiken en de weerstand aan de basis verlagen.

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 18 mei 2015, 16:29:54
@Peter,
je reactie maakt me nieuwsgierig. Mijn treinenhobby heb ik weer opgepakt nadat ik de Faller auto's een paar jaar geleden zag rijden. Ik heb inmiddels mijn eerste standmodel omgebouwd en van een dccar decoder voorzien. Ik heb nu alleen nog maar een testbaantje maar als de verbouwing van mijn huis klaar is wil ik een baan met auto's en treinen gaan maken. Daarbij gebruikmakend van Arduino's. Vandaar dat ik dit leuke draadje ook trouw volg.

Ik heb je filmpje bekeken en ben razend nieuwsgierig naar de manier hoe je dit gemaakt hebt. Wellicht een goed idee om een draadje te starten in de rubriek: Carsystem. Dan vervuilen we het draadje van Paul niet.

@Paul. Ga zo door. Ik reageer weinig maar lees trouw mee.

Gr. Frits

Verstuurd vanaf mijn HTC One X met Tapatalk

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 19 mei 2015, 18:41:33
Als je ze gekregen hebt is het een ander verhaal :D Maar de stroom die gaat lopen is maar zeer kort en ook niet enorm hoog. 1N4148 doet het dus prima :)


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 21 mei 2015, 23:13:50
Hoi volgers,

@Peter, Timo, Frits

Bedankt voor de input.

De Keerlus schakeling met een Arduino:

Op mijn modelbaan komen twee keerlussen, deze wil ik volledig automatische gestuurd hebben, daarvoor wil ik de Arduino Nano gebruiken.

Om een overzicht te krijgen hoe ik het wil gaan bouwen heb ik eerst een flowchart gemaakt en daar de functies in gezet zodat ik een overzicht heb van hoe de sturing in elkaar zit.

De Flowchart:

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

Deze flowchart geeft mij met het schrijven van het programma voor de Arduino inzicht welke poorten in voor wat gebruikt.

Deze keerlus schakeling bestaat uit 4 hoofdonderdelen nl., Arduino Nano, Motordriver L298, Wissel sturing en een sensor interface, op de Arduino en L298 motordriver na, wil ik de andere functies op een experiment-print (koperbanen)  bouwen.

Het schema van de wisselsturing:

(https://images.beneluxspoor.net/bnls/wisselsturing.jpg) (https://images.beneluxspoor.net/bnls/wisselsturing.jpg)

Deze wisselsturing word toegepast voor de wissel in de keerlus sturing, de sensor interface moet ik nog maken/ontwerpen.

Voor het Arduino programma heb ik een schematische tekening van de keerlus voorzien van evt. variablen die ik kan gebruiken voor het Arduino programma.

De schematische weergave van de keerlus:

(https://images.beneluxspoor.net/bnls/keerlus_18.jpg) (https://images.beneluxspoor.net/bnls/keerlus_18.jpg)

Ik moet alleen nog een schema maken voor de sensor interface, maar dat komt morgen.

Ik sta altijd open voor tips/opmerkingen van deze sturing.

Mvg Paul  :D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Peter Korsten op 22 mei 2015, 08:34:31
Dat is geen flowchart (of in UML-termen, een activiteitendiagram) maar eerder een componentendiagram. Een flowchart geeft de voortgang (flow) van de programma weer.

- Peter
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 22 mei 2015, 08:43:13
Wat het wel weergeeft is een goed library indeling:
- sensor
- sein
- uitgang blok
- wat losse dingen
Dus dat is ook wat.

Groet,

Gerard van der Sel.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 22 mei 2015, 17:33:46
Paul, ik schaam mij diep  :-X Ik heb de vorige keer gezegd dat je een pull-up moest toevoegen maar dit moet natuurlijk een pull-down zijn! Bij een float aan de ingang gaat een uitgang nu juist schakelen ipv uit te blijven. Me versproken omdat een pull-up zo gebruikelijk is bij een Arduino  omdat deze er intern in zit. Maar aangezien je schakeling active high is (heeft 5V nodig om te werken) wil je hem dus juist low trekken, pull-down dus.

Verder nog wat vragen over de lus. Is deze lus echt zo groot dat je er nog een extra blok in wilt hebben? Kan het mis hebben maar blok W lijkt me niet heel groot.

Voor de seinen, wil je nog volgens een bepaald land gaan rijden of hou je het alleen bij rood-groen seinen? Overigens zou je ook nog een PWM poort kunnen gebruiken om een dim functie te kunnen maken voor de seinen. Gewoon alle seinen via 1 NPN die je PWM't naar GND. Of je het wil is aan jou :p

En dan de componentenlijst tegen het schema... Op de componentenlijst zie ik 5 sensors, in het schema zie ik er maar 4. In het schema zie in 3 seinen, bij de componenten zie ik er maar 2. En in het schema zie ik 3 blokken en bij de componenten ook maar 2. Hoe wil je dit dus gaan doen? Wat wil je wat laten doen?

Heb je verder al eens met de PWM frequentie gespeeld om treinen beter te laten rijden? (Ik weet niet meer of dat dit topic was...) Maar in ieder geval, nu heb je pinnen 3 en 6 gekozen voor de PWM van de motordriver. Dit kan wel maar dan heb je wel twee verschillende frequenties. Pin3 zit namelijk aan timer2 en heeft een frequentie van 490Hz. Maar pin6 hangt aan timer 0 en heeft een frequentie van 977Hz. Om treinen anders kunnen reageren op andere frequenties zou ik deze hetzelfde houden.

Goed, nu gaat even een hele uiteenzetting komen over wat dan te gebruiken. Wat het nu echt moet worden moet je zelf kiezen en zal je denk ik het beste met testen kunnen kiezen.

Optie 1, beide op timer 0
Pin 5 en 6
Zoals gezegd is timer 0 977Hz. Als ik ga kijken naar Weistra regelaar (http://encyclopedie.beneluxspoor.net/index.php/Snelheidsregelaar_met_pulsbreedtemodulatie) is dit wel een hele hoge frequentie. Aan de andere kant, moderne decoders werken vaak op een frequentie van 32kHz, dit is nog echt wel een stuk hoger en werken ook prima. Maar het grote nadeel van timer 0 is dat deze ook millis() voor zijn rekening neemt. Ga je dus met deze timer rommelen dan klopt millis() niet meer.

Optie 2, beide op timer 1
Pin 9 en 10
Timer loopt op 490Hz, is al wat lager. Nadeel van deze timer (zou kunnen zijn) dat deze gebruikt wordt door de Servo library. Voordeel van deze timer is, hij is 16-bit. Zelfs als je voor een eigen gekozen frequentie gaat is het makkelijk nog steeds 8-bit sturing te houden. Zelf een frequentie instellen kan je doen door de prescaler te veranderen maar dan is je keuze nog steeds beperkt (http://playground.arduino.cc/Main/TimerPWMCheatsheet). Je kan ook aanpassen tot waar de timer moet tellen (de top waarde) waardoor de timer sneller gaat lopen alleen moet de PWM waarde dan wel kleiner dan deze waarde zijn. Voordeel van 16-bit timer is dat je wat extra head room hebt, als je hem 256 keer zo snel laat gaan heb je nog steeds 8-bit over.  Of dit nodig is (eigen frequentie kiezen) is aan jou. Hoe dit moet is een kwestie van Google, weet ik ook niet uit me hoofd  :P Is in ieder geval dus wel wat meer de Atmega in duiken.

Optie 3, beide op timer 2
Pin 3 en 11
Eigenlijk zelfde verhaal als optie 2 alleen is deze timer maar 8-bit. Deze wordt gebruikt door de tone-library maar dat vormt denk ik nooit een probleem  ;D

Optie 4, verspreiden over timer 1 en 2
Omdat je twee motordrivers hebt zou je ze kunnen spreiden. Voordeel hiervan is dat je, net als de Weistra regelaar, de frequentie kan veranderen met de snelheid. Zou je ze op dezelfde timer zetten en één trein moet snel en één moet langzaam, welke frequentie kies je dan? Door ze op twee drivers te zetten is dit wel los aan te passen.

Optie 5, op een timer + software PWM
Zoiets heb ik in het verleden gedaan. Op een timer heeft het voordeel dat je voor beide maar 1 timer gebruikt en eventueel zelf een frequentie kunt kiezen. Maar je kan natuurlijk ook voor de standaard frequentie gaan. (Ik had toen +-32kHz, zoals een decoder, gekozen.) Omdat op lage snelheden een loc wat last heeft van kleef (het niet op gang willen komen) werkt dat beter met een lage frequentie. (De Weistra regelaar begint op 20Hz.) Maar de grap van lage frequenties is dat deze voor een Arduino heeeeeeeeeeeeel langzaam zijn en dus ook prima in software kunnen. Om op gang te komen stuurde ik dus de uitgang met een lage frequentie en lage duty cycle ook even vol aan. "Nadeel" is dat je dus een software laag hebt moeten lopen maar als je het doet zoals met de optrek en aftrek vertraging in de library die ik eerder stuurde is dat geen probleem. Je hebt dan toch al een update functie. Een voorbeeld hiervan kan je onderaan vinden.

Zoals je ziet nogal wat mogelijkheden die misschien het overdenken wel waard zijn :) Dit alles voor het mooiste rijgedrag.


Timo




Voorbeeld van update() die ook een software PWM doet op lage snelheden. Nieuwe variabele is unsigned long lastBump en bool bumpFlag. setSnelheid() is ook aangepast om het makkelijker te houden. Instellingen zijn:
const byte MaxBumpSpeed = [iets]; //Snelheid tot waar er een bump gegeven moet worden
const byte BumpInterval = [iets]; //Aantal ms tussen de bumps -> 50ms voor 20Hz bijvoorbeeld
const byte BumpDuration = [iets]; //Aantal ms van de bump -> 2ms voor 4% @ 20Hz (50ms)

Natuurlijk is dit maar een voorbeeld, kan zo fancy mogelijk gemaakt worden als je zelf wil (bijvoorbeeld bumpInterval en bumpDuration laten afhangen van de snelheid). Update van de library in zijn geheel is hier te vinden (https://drive.google.com/file/d/0B0VTMBMOLEBdbFJDalp4b0NUVUE/view?usp=sharing).
//Checkt of de snelheid aangepast moet worden (optrekken/afremmen) en doet dit
//Aanroepen in de loop
void AamsTrein::update(){
//Kijken of het tijd is om een update te doen
if(millis() - this->millisLast > this->vertraging) {
this->millisLast = millis(); //opslaan dat we nu een update doen

if(setSpeed > curSpeed){ //moeten dus sneller
this->curSpeed += 1;
}
else if(setSpeed < curSpeed){ //moeten langzamer
this->curSpeed -= 1;
}
}

//Als er een bup gaande is
if(this->bumpFlag){
//Bump afgelopen, terug naar normaal
if(millis() - this->lastBump >  BumpDuration){
this->setSnelheid(); //Zet de snelheid weer op curSpeed
this->bumpFlag = false;
}
}
//Er is geen bump gaande
else{
//Check of snelheid laag genoeg is dat er een bump (software PWM) nodig is tegen kleef
//en tijd is voor nieuwe bump
if(abs(this->curSpeed) < this->MaxBumpSpeed && this->curSpeed != 0 && (millis() - this->lastBump) > BumpInterval){
this->lastBump = millis();
this->setSnelheid((this->curSpeed < 0 ? -255 : 255)); //Zet snelheid op 255, zelfde richting als curSpeed
this->bumpFlag = true;
}
else{
this->setSnelheid();
}
}
}
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 22 juli 2015, 00:08:44
Hoi volgers

@Timo

Bedankt voor je hulp met het schrijven van een library

@Allen

Er word al een tijd geen updates meer geplaatst in dit draadje, dit komt omdat ik de AAMS op de proefbaan goed werkend heb, ik kan de sturing niet uitgebreider testen voordat mijn modelbaan klaar is (railsen leggen)  de modelbaan is een stuk groter als mijn proefbaantje.

Ook ben ik bezig om met het programma Itrain te leren werken, ik heb twee digitale locomotieven (Selectrix) ik vind het zonde om deze locomotieven niet te gebruiken.
Ik heb een flink aantal selectrix sturingen liggen die ik graag zou willen gebruiken.

Een digitale sturing heeft zeker een voordeel ten opzichte van analoog, (oa, onafhankelijk rijden met meer locomotieven op de baan)

Zins kort is er ook een draadje op het forum "Arduino en Selectrix" , dit heeft zeker mijn interesse omdat een gedeelte van mijn baan digitaal word gestuurd (Selectrix)  en een gedeelte Analoog (AAMS).

Het zou mooi zijn als ik met de computer ook het analoge gedeelte (AAMS) van de baan kan sturen via Itrain, de locomotieven blijven analoog gestuurd maar de rest kan dan met Selectrix gestuurd worden.

Ik wil dit verder gaan uitwerken door het ontwikkelen van Selectrix sturingen met de Arduino, ik hoop een boel op te steken via het draadje "Arduino en Selectrix" de eerste opzet heb ik in dat draadje gezet, een wissel sturing gebaseerd op de Selectrix functiedecoder.

Hoewel de software nog ontwikkeld moet worden kan ik deze sturing wel al testen en een prototype, te bouwen om de werking te testen.

Het schema

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

Mvg Paul  :)
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 23 juli 2015, 14:12:36
Het schema zal perfect werken alleen moet je op een ding letten. Als je de MOSFETs transistors niet aanstuurt (en dat is ook als de Arduino er dus niet aan zit of de Arduino de pin nog als input heeft/uit staat) ze gaan zweven. Ze kunnen dan zelf open gaan of deels open enz. Met warme MOSFETs transistors en wisselspoelen tot gevolg. Ik zou dus nog even een pulldown aan de Arduino stuurpoorten maken. Deze zorgen er dan voor dat de MOSFETs transistors dicht blijven. Zeker omdat de Arduino zijn voeding ergens anders van krijgt (SX-bus) kan het dus gebeuren dat je de spanning voor de wissels al aan hebt maar de SX-bus nog niet. Dan zweven je gates basis namelijk.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 23 juli 2015, 14:28:17
Timo,

SX-bus voeding is er meteen (230V ac --> trafo -> bruggelijkrichter -> SX-bus). Bij een Arduino zul je rekening moeten houden met de wachttijd van de bootloader. Dus zoals jij al zegt een pulldown bij de basis van de BD675 is zeker gewenst.

Groet,

Gerard van der Sel.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 23 juli 2015, 14:44:53
Daarom! Maar ik doelde er ook vooral op de de wissels niet uit dezelfde voeding komt als de SX-bus. Ook al is de voeding van de SX-bus straight forward is het nog steeds mogelijk deze niet ingeplugd te hebben als de voeding van de wissels al aan staat.

De tijd van de bootloader is bij de huidige Uno bij power on niet zo lang (slaat dan bootloader over na de power on check). Maar inderdaad, het is niet gelijk dus een pulldown zou deze beide problemen oplossen. 10k of 100k zou het al moeten doen.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 02 augustus 2015, 18:40:54
Hoi volgers

Ik heb even geen tijd gehad om een update te maken.

@Gerard en Timo

Bedankt voor jullie input.
Ik was er als eerder op gewezen dat er beter pulldown weerstanden gebruikt kunnen worden.  :-[


Ik heb de Selectrix Functie decoder 66821 bekeken en aan de hand van de koperbanen een schema gemaakt.

Een niet volledig schema van de functie decoder, ik mis nog een aansluiting op de SX-Bus (SX-Bus heeft 5 aansluitingen, er zijn er vier uitgezocht) en nog een paar aansluitingen bij de processor.

Al met al geeft het een goed beeld hoe de Selectrix functie-decoder gemaakt en ontworpen is.

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

De SX-bus word intern niet gekoppeld met de uitgangen van de functie decoder.
De uitgangen worden via een gelijkrichter op de print ( 1 en 2) verbonden.

De SX-bus word Alleen gebruikt voor de processor(80C48C)  in de Functie decoder, er is geen koppeling met de outputs 3 tm 14 met de SX-bus, dit loop via een eigen voeding (1 en 2).

Het schema van 1 van de uitgangen.

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

Er zijn nog wel een aantal Selectrix componenten die ik wil uitzoeken, hoe het werkt.

Mvg Paul  ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 03 augustus 2015, 21:06:00
De SX-bus wordt Alleen gebruikt voor de processor(80C48C)  in de Functie decoder, er is geen koppeling met de outputs 3 tm 14 met de SX-bus, dit loop via een eigen voeding (1 en 2).

Ik denk dat je daarmee bedoelt, alleen de microcontroller wordt gevoed uit de SX-bus. Voeding van de wissels geschiet via een eigen voeding (met gelijkrichter).

Wat de koppeling is er wel degelijk! Intern is de GND van de microcontroller (en dus de SX-bus) en de GND waarnaar de wissels schakelen dezelfde. Er is geen elektrische isolatie (door middel van een optocoupler ofzo) daartussen.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 03 augustus 2015, 23:20:29
Hoi Timo

Bedankt voor je input.

Voor zo ver ik het heb kunnen zien, zit er geen verbinding tussen de Gnd van de  SX-bus en de Gnd van de outputs 3 t/m 14, ik zal er nog eens naar kijken.
In het schema is de Gnd door gezet naar de outputs 3 t/m 13.

Word nog verder uitgezocht.

Mvg Paul :)
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 04 augustus 2015, 14:06:12
Ik denk dat je je schema nog eens moet nakijken. Nu zit de +5V (VCC) aan de emitters van alle transistoren. Deze krijg je zo nooit open.
Bovendien zitten de ontkoppelcondensatoren heel ongebruikelijk aan de +5V (VCC).

Groet,

Gerard van der Sel.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 04 augustus 2015, 17:26:48
Gerard, je kijkt fout  ;) Links boven loopt de lijn van alle emitters naar P26 en P17 maar niet niet aan Vcc (loopt er alleen over heen). Nu moet ik ook zeggen, het is ook lastig te zien. Dat is de reden dat er voor de GND lijn (en vaak ook voor andere power lijnen) alleen gebruik gemaakt van symbolen zodat je niet alle GND lijnen hoeft te tekenen.

@Paul, door Gerards aanwijzing heb ik wel een fout gezien. De hele reden dat jij denk dat ze gescheiden zijn van elkaar.  :P Het lijkt me sterk dat alle emitters van de transistors alleen naar P26 en P27 lopen. Ik durf te wedden dat ze namelijk gewoon aan GND liggen. Dit wordt extra versterkt door het feit dat de ontkoppelcondensatoren van het kirstal ook met deze lijn verbonden zijn. Deze zitten eigenlijk altijd naar GND. Dus ik zou het nog eens doormeten  ;D


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 04 augustus 2015, 23:56:30
Hoi volgers,


@Timo, Gerard

Bedankt voor je input

Timo

 Je hebt helemaal gelijk  ::) ,de gnd van de sx-bus en de output zijn met elkaar verbonden :P :-\ (tiny koperbaan)

Ik heb het schema in tweeën gedeeld voor de overzichtelijkheid, ik ben nog bezig met het processor gedeelte, de output gedeelte is wel klaar.

Schema : Selectrix funktie-decoder 66821 deel 2

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

De Blus diodes heb ik nog niet erbij getekend, volgende revisie.

Mvg Paul Smits

 
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 05 augustus 2015, 00:17:47
Hehe  ;D Ik zou alleen even de labels aanpassen. Nu hebben alle torren het label "Page 1" en dat zal gelezen worden als dat al die pinnen aan elkaar zitten (zowel door mensen als de software). Beter is dus hier nuttige namen voor te pakken (iets als OUT1_1, OUT1_2, OUT2_1 enz). Zelfde voor GND maar daarvoor gok ik dat de software al een standaard label heeft (met mooi het GND symbool ;) ). En veel mensen (ik ook) hebben de voorkeur om de GND lijnen zoveel mogelijk omlaag te tekenen. Iets dat de onderste rij torren nu niet heeft. Maakt het namelijk erg makkelijk om het schema te lezen (samen met GND symbool).

Waar zit je nog mee voor uC deel? Weet niet wat de rest van de DIP-switches doen maar gok dat deze ook gewoon naar de uC lopen.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 06 augustus 2015, 22:08:04
Hoi Volgers,

@Timo

Bedankt voor de input.

Ik heb geluisterd naar schoolmeester Timo ;D  ;) en het schema van de stuurtorren heb ik aangepast en de blusdiodes geplaatst.

Schema Deel 1:

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

Schema Deel 2:

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

Ik heb de Selectrix functie-decoder printplaat naar een schema omgezet, er kunnen nog kleine foutjes in zitten, ik denk echter dat dit schema de juist is.

Het ging mijn meer om te laten zien dat Selectrix uitbreidingen simpel te maken zijn tegen de helft of meer van de kosten van de originele Selectrix decoder of andere Selectrix onderdelen.

Ik wil dit schema verder gaan uitwerken om het geschikt te maken voor de Arduino processorboard en de Selectrix bus.

Een van de schakelingen die ik wil ontwerpen is een analoge motorsturing gestuurd door Selectrix, dit als aanvulling op het AAMS sturing.
Het zal wel veel voeten in de aarde hebben, maar ja, ::) het is een hobby het hoeft niet gisteren af te zijn. ;)

Het lijkt mij wel handig als ik mijn complete modelspoor baan kan sturen met ITrain of Rocrail, dus ook het AAMS systeem, voor er opmerkingen geplaatst worden dat dat systeem al bestaat (Dinamo), echter Dinamo werk niet samen met Selectrix, ik wil blijven rijden met Selectrix.

Voor de duidelijk niveau 0 is de digitale baan met een dubbel of enkel spoor naar niveau 1 kopstation,  niveau 1,2,3 is de analoge baan gestuurd via AAMS.

Het volgende projectje is om de bezetmelder print om te zetten naar schema.

Mvg Paul  ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 07 augustus 2015, 08:57:59
Paul,

Kijk eens in mijn bouwdraadje. Vooral de foto's van onder de baan. Alle elektronica daar is zelfbouw. Ik knutsel al met de SX_bus sinds vorige eeuw. Er staat een listing van een SX-bus interface op mijn website (www.vandersel.nl (http://www.vandersel.nl) of wereldbolletje lnks). Het schema van de interface is niet correct. Als ik de stippen volg, dan zit D hard vast aan de +5V. Overigens benieuw naar de waarde van de weerstenden.

Groet,

Gerard van der Sel.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 05 september 2015, 01:38:19
Hoi, volgers.

De vakantie/zomer seizoen is helaas weer voorbij, dat geeft mij weer de gelegenheid om aan de AAMS verder te werken,
ik wil nog een handsturing voor het AAMS systeem ontwerpen waarmee ik treinen kan bedienen met de hand door middel van het AAMS systeem.

Ik moet dat nog verder uitzoeken, de voortgang hou ik bij in dit draadje.
Ook met het selectrix gedeelte wil ik verder gaan.

@ Gerard

De D zit niet aan de +5V maar op de +12V.
K1 is de aansluiting van de 12V~ van de trein trafo.

Als het goed is staan de diodes goed, de selectrix functie-decoder schakelt de wissel-spoel via de +12V

R1 tot en met R8 = 2200 ohm (Weerstanden aan de basis van de transistor)

R1 en R2 = 10K ohm (In schema deel 1)

Mvg Paul

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 18 oktober 2015, 20:20:29
Hoi volgers,

Na een geruime tijd weer even mijn topic updaten.

Ik ben na een lange stop, weer bezig geweest met AAMS.

Ik kom vaak niet toe aan een update, ook ben ik met teveel dingen bezig (hobby modelspoor) waardoor ik het overzicht verlies en meerdere projecten tegelijk proberen te ontwerpen, denk aan selectrix, AAMS enz., ik moet mij dan weer eens stil zetten zodat ik me weer kan focussen op hetgeen waar ik origineel mee bezig ben.

Ik stop daarom ook met het selectrix en andere niet AAMS projecten en wil me volledig focussen op AAMS.

De eerste AAMS sturing is complex geworden zowel softwarematig als hardwarematig, het werk prima maar het moet eenvoudiger kunnen dacht ik.

Ik ben een nieuwe sturing gaan ontwerpen, softwarematig eenvoudiger(geen library's en een overzichtelijk programma) en elektro technisch eenvoudiger(simpele elektronica, en meer functies).
Ik ben helemaal opnieuw begonnen met het ontwerp, het leek mij een betere keuze dan het eerste ontwerp te versimpelen.

De nieuwe sturing is elektronisch simpele maar wel met meer mogelijkheden.

De functies:

1. Twee blokken.
2. Twee seinen.
3. Een wissel.
4. Een loc sturing (pwm)
5. I2C met lcd display en communicatie via I2C.
6. 4 analoge poorten beschikbaar (uno)  of 6 analoge poorten (nano).


De twee blokken kunnen afzonderlijk gestuurd worden of, als blok 1 bezet is, is blok 2 vrij.
Afhankelijk van de keuze van het blok relais kun je de sein beelden via de relais sturen en kun je de vier seinpoorten voor iets anders gebruiken bv. twee wissels, of vier extra blokken.
Het is daardoor een flexibele sturing geworden.

Door vier onafhankelijke gestuurde leds kunnen er meerdere seinbeelden getoond worden ,Blok sein x2, inrijsein 1x, uitrijsein 1x, bloksein met voor sein 1x enz.

Door de keuze van transistoren kunnen de wissels als paar gestuurd worden of een enkele wissel gestuurd worden. (kop spoor)

De sturing is op een breadboard gebouwd, daardoor kan ik deze sturing goed testen en aanpassen.

De gebouwde sturing.

(https://images.beneluxspoor.net/bnls/IMG_20151010_184559.jpg) (https://images.beneluxspoor.net/bnls/IMG_20151010_184559.jpg)(https://images.beneluxspoor.net/bnls/IMG_20151009_175123.jpg) (https://images.beneluxspoor.net/bnls/IMG_20151009_175123.jpg)

Totale overzicht van de sturing.

(https://images.beneluxspoor.net/bnls/IMG_20151018_163522.jpg) (https://images.beneluxspoor.net/bnls/IMG_20151018_163522.jpg)

Het arduino programma.

/*
 * Arduino analoge modelbaan stuuring.
 * Nieuwe versie Bloksturingarduino v0.1
 *
 * Writen by Paul Smits
*/

#include <Wire.h>              // library voor I2C
#include <LCD.h>               // library voor een standaard LCD display.
#include <LiquidCrystal_I2C.h> // library voor 12c LCD display

/***** Global vars ***********************************************/
// Define I2C Address where the PCF8574A is

#define BACKLIGHT_PIN     3 // zet de backlight pen op 3

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7); // adressering lcd display

char incomingByte;       // Slaat een waarde op in incomingByte

/******************************************************************************
 * Definities
 ******************************************************************************
 * Blok A en C is aangesloten op OUT1 en OUT2 van de motorsturing
 * Blok B en D is aangesloten op OUT3 en OUT4 van de motorsturing
 ******************************************************************************/
// constants zullen niet veranderen.

// Geef de output pinnen een naam.

const int ledPin =  13; // Pin nummer LedPin
const int blok1Pin = 8; // Pin nummer Blok 1
const int blok2Pin = 12; // Pin nummer Blok 2
const int sein1rPin = 4; // sein 2 Rood
const int sein1gPin = 5; // sein 2 Groen
const int sein2rPin = 2; // sein 1 rood
const int sein2gPin = 3; // sein 1 Groen
const int wissel1rPin = 6; // Wissel 1 Rechtdoor
const int wissel1aPin = 7; // Wissel 1 Afbuigend

int Interval = 500; // Tijdvertraging ter controlle of het programma nog loopt.

//Trein 1

int PWMA = 9;  // Snelheids regeling trein 1
int AIN1 = 10; // Rechtsom trein 1
int AIN2 = 11; // Linksom trein 1

int r = 0;

boolean ledState = LOW;

long previousMillis = 0; // slaat de laatste stand van de LED op.

void setup() {

  lcd.begin (16, 2);  // stelt de lcd driver in op 16 characters en twee regels.
  // lcd.begin(20,4); // Stelt de lcd driver in op 20 characters en vier regels.

  // set de backlight van het lcd display aan.

  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home (); // Ga naar de boventse regel en het eerste character.

  // Zet het onderstaande tekst op het lcd display

  lcd.setCursor(2, 0); // zet de cursor op het eerste character op de eerste regel
  lcd.print("Arduino Uno");
  lcd.setCursor(1, 1);
  lcd.print("L298  M-Sturing");

  pinMode(PWMA, OUTPUT);
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);

  pinMode(blok1Pin, OUTPUT);
  pinMode(blok2Pin, OUTPUT);
  pinMode(sein1rPin, OUTPUT);
  pinMode(sein1gPin, OUTPUT);
  pinMode(sein2rPin, OUTPUT);
  pinMode(sein2gPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(wissel1rPin, OUTPUT);
  pinMode(wissel1aPin, OUTPUT);
  pinMode(ledPin, OUTPUT);

  Serial.begin(9600); // Open een serial verbinding op 9600 baud.

  baanvak(0, 1); // Meld alle blokken bezet bij het starten.

  menu();
}
void loop() {

  // Controlle led om te zien of het programma nog werkt.

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis > Interval) {

    // Sla de laatste stand van de Led waneer die nog knipperde

    previousMillis = currentMillis;

    // Als de Led uit is zet de Led aan en vice-versa:

    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    digitalWrite(ledPin, ledState); // Afhankelijk van de ledState is de Led aan of uit.

  }

  if (Serial.available() > 0) {  // Kijk of de seriele verbinding beschikbaar is.
    int incomingByte = Serial.read(); // Lees een 'byte'.

    switch (incomingByte) {

      case 'A': // Blok 1 vrijgave

        Serial.println("Blok 1 : Vrij");

        // Parameters : baanvak( blok, status) status, 0 vrij, 1 bezet.

        baanvak(1, 0);

        lcd.home ();
        lcd.setCursor(0, 0);
        lcd.print("Blok 1: Vrij");

        menu();

        break;

      case 'a':  // Blok 1 bezet melding

        Serial.println("Blok 1 : Bezet");

        baanvak(1, 1);

        lcd.home ();
        lcd.setCursor(0, 1);
        lcd.print("Blok 1: Bezet");

        menu();

        break;

      case 'b': // Blok 2 bezet melding.

        Serial.println("Blok 2: Bezet");

        // Parameters : baanvak(blok, status)

        baanvak(2, 1); // Blok 2 is bezet melding.

        lcd.home ();
        lcd.setCursor(0, 1);
        lcd.print("Blok 2: Bezet");

        menu();

        break;

      case 'B':// Blok 2 vrijgave

        Serial.println("Blok 2: vrij");

        baanvak(2, 0); // Blok 2 is vrij gegeven

        lcd.home ();
        lcd.setCursor(0, 1);
        lcd.print("Blok 2: vrij");

        menu();

        break;

      case '|': // Wissel word rechtdoor gesteld.

        wissel(1, 0);

        lcd.home ();
        lcd.setCursor(0, 1);
        lcd.print("Wissel 1 : Rechtdoor");

        menu();

        break;

      case '/': // Wissel word afbuigend gesteld.

        wissel(1, 1);

        lcd.home ();
        lcd.setCursor(0, 1);
        lcd.print("Wissel 1 : Afbuigend");

        menu();

        break;

      case '1': // Optrekken trein.

        Serial.println("Locomotief trekt op.");

        if (r == 0) {

          int cw = 1; // Richting locomotief is linksom optrekken.

          for (int t = 10; t <= 200; t++) {
            delay(40);

            locomotief (1, t, cw);

          }
        }

        else {

          if (r == 1) {

            int cw = 0; // Richting locomotief is rechtsom optrekken.

            for (int t = 10; t <= 200; t++) {
              delay(40);

              locomotief (1, t, cw);
            }
          }
        }

        menu();

        break;

      case '0': // Afremmen trein.

        Serial.println(" Locomotief remt af.");

        if (r == 0) {

          int cw = 1; // Richting locomotief is linksom afremmen.

          for (int t = 200; t >= 10; t--) {
            delay(20);

            locomotief (1, t, cw);
          }
        }

        else {

          if (r == 1) {

            int cw = 0; // Richting locomotief is rechtsom afremmen.

            for (int t = 200; t >= 10; t--) {
              delay(20);

              locomotief (1, t, cw);
            }
          }
        }

        menu();

        break;

      case'<': // De rijrichting van de locomotief is linksom

        r =  1;

        Serial.println("Rijrichting linksom.");

        break;

      case'>': // De rijrichting van de locomotief is rechtsom.

        r =  0;

        Serial.println("Rijrichting rechtsom.");

        break;

      case '9': //Trein linksom en rechtom noodstop.

        locomotief (1, 0, 0);
        locomotief (1, 0, 1);

        Serial.println("Noodstop geactiveerd");

        menu();

        break;

      case '#':

        baanvak(0, 0);

        menu();

        break;

      case '*':

        baanvak(0, 1);

        menu();

        break;
    }
  }
}

void menu() {

  Serial.println();
  Serial.println("Arduino analoge modelbaan sturing: Motorsturingen en blok meldingen");
  Serial.println();
  Serial.println("Stuur comando's");
  Serial.println();
  Serial.println("A = Blok 1 vrijgeven       a = Blok 1 bezet melden");
  Serial.println("B = Blok 2 vrijgeven       b = Blok 2 bezet melden");
  Serial.println("< = Trein linksom          > = Trein rechtsom");
  Serial.println("1 = Trein 1 starten        0 = Trein 1 stoppen");
  Serial.println("| = Wissel 1 rechtdoor     / = Wissel 1 Afbuigend");
  Serial.println();
  Serial.println("9 = Noodstop");
  Serial.println();

}

void locomotief(int loc, int snelheid, int richting) {

  // Zet de parameters van de functie locomotief (loc, snelheid, richting)
  // Loc: 1 output A op het motorshield
  // Snelheid: 0 is stop, 250 is maximale snelheid
  // Richting: 0 Rechtsom, 1 Linksom

  boolean inPin1 = LOW;
  boolean inPin2 = HIGH;

  if (richting == 1) {
    inPin1 = HIGH;
    inPin2 = LOW;

  }

  else {

    if (richting == 0) {
      inPin1 = LOW;
      inPin2 = HIGH;

    }
  }

  if (loc == 1) {

    digitalWrite(AIN1, inPin1);
    digitalWrite(AIN2, inPin2);
    analogWrite(PWMA, snelheid);

  }
}
void baanvak(int blok, int status) {
 
  // Zet de parameters van de functie baanvak (blok, status)
  // Blok: 1 waarde blok kan van 1 tot zoveel blokken nodig zijn worden gebruikt.
  // Voor elk blok moet een routine schrijven.
  // Status: 0 vrij, 1 bezet.
 

  if (blok == 1) {

    if (status == 1) {

      digitalWrite(blok1Pin, LOW);

      digitalWrite(sein1rPin, LOW);
      digitalWrite(sein1gPin, HIGH);

    }
  }

  if (blok == 1) {
    if (status == 0) {

      digitalWrite(blok1Pin, HIGH);

      digitalWrite(sein1rPin, HIGH);
      digitalWrite(sein1gPin, LOW);

    }
  }

  if (blok == 2) {

    if (status == 1) {

      digitalWrite(blok2Pin, LOW);

      digitalWrite(sein2rPin, LOW);
      digitalWrite(sein2gPin, HIGH);

    }
  }
  if (blok == 2) {
    if (status == 0) {

      digitalWrite(blok2Pin, HIGH);

      digitalWrite(sein2rPin, HIGH);
      digitalWrite(sein2gPin, LOW);

    }
  }

  if (blok == 0) {

    if (status == 1) {

      digitalWrite(blok2Pin, LOW);
      digitalWrite(blok1Pin, LOW);

      digitalWrite(sein1rPin, LOW);
      digitalWrite(sein2rPin, LOW);

      digitalWrite(sein1gPin, HIGH);
      digitalWrite(sein2gPin, HIGH);
    }
  }

  if (blok == 0) {

    if (status == 0) {

      digitalWrite(blok2Pin, HIGH);
      digitalWrite(blok1Pin, HIGH);

      digitalWrite(sein1rPin, LOW);
      digitalWrite(sein2rPin, LOW);

      digitalWrite(sein1gPin, HIGH);
      digitalWrite(sein2gPin, HIGH);
    }
  }
}

void wissel(int wnummer, int wrichting) {

  // Zet de parameters van de functie wissel (wnummer, wrichting)
  // wnummer   : 1, deze waarde bevat het nummer van de wissel
  // wrichting : 0, deze waarde geeft de richting van de wissel, 1 rechtdoor, 0 afbuigend
  // Let op !, deze parameters moetten voor elke wissel worden ingesteld, de wissels worden in paar gesteld.
  // De wissels kunnen ook per wissel gesteld worden, de programeercode hoeft daar niet voor aangepast worden.
 
  if (wnummer == 1) {

  }

  if (wrichting == 0) {

    Serial.println("wissel 1 rechtdoor");

    digitalWrite(wissel1rPin, HIGH);
    delay(750);
    digitalWrite(wissel1rPin, LOW);
  }

  if (wnummer == 1) {

  }
  if (wrichting == 1) {

    Serial.println("Wissel 1 afbuigend");

    digitalWrite(wissel1aPin, HIGH);
    delay(750);
    digitalWrite(wissel1aPin, LOW);
  }
}
 

Scherm afdruk test programma, werk verder goed.

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

Uiteindelijk word de baan gestuurd door een gambas programma (een soort visual basic programmeertaal)

Scherm afdruk gambas programma in ontikkeling.

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

Wat moet er nog bij gebouwd worden.

1.: I2C  communicatie tussen de verschillende blok sturingen.
2.: Bezet meldingen via de analogepoort.
3.: Wissel sturing voor zware belasting (schaduw station meerdere wissels tegelijk sturen)
4.: Bluetooth communicatie tussen pc en sturing
5. Barebone Arduinio, geen programma's uploaden wel communicatie tussen Arduino en pc.

Aan het schema van de sturing en de barebone Arduino word nog gewerkt.

Mvg Paul ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: T.Spat op 18 oktober 2015, 22:51:49
Leerzaam draadje (y)

Heb sinds kort ook een Arduino in mijn bezit, aangespoord door wat techeuten
bij mijn vrijwilligerswerk ;D Even nieuwe materie, wel interessant.

Het fenomeen van 10000 projecten tegeijk beginnen.... zeer bekend :P
*kijkt naar chaos om mij heen ;D*

Die prikbordjes zijn idd erg fijne dingetjes voor snel een bult aansluitingen maken,
ben zelf geen held met solderen, dus errug handig :)

Mvg,

Tis
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 18 oktober 2015, 23:02:44
Hoi Tis

Bedankt voor je reactie

Ik denk dat het bezig zijn met meerdere projecten mens eigen is ::), daarom moet je jezelf even stil zetten en de focus op het eerste project zetten. :P

Leuk om te horen dat je met een Arduino aan het experimenteren gaat, het is geen ingewikkelde materie, en er is genoeg over te vinden op het internet.

Wat wil je eigenlijk gaan ontwerpen, als ik dat vragen mag ;)

mvg Paul  ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 19 oktober 2015, 14:43:30
Hoi Paul,

Ziet er weer leuk uit, vooral ook het programma! Ga je deze code ook nog openbaar maken? Je zou er over kunnen denken om GitHub te gebruiken. Dat is het ook niet zo lastig om steeds een up to date versie online te zetten.

Mag ik toch weer met een kritische blik op je post ingaan?  :-X Dit wordt dan weer een lange post en ik bedoel het echt goed! (y) Je bent goed bezig maar het is zo zonde om werk voor niets te doen. Dus echt bedoelt als tips! Ik hoop wel dat je ze een voor een even na zou willen lopen (en misschien reageren).

Eerst op je punten:
1.: I2C  communicatie tussen de verschillende blok sturingen.
Nu je een display aan de module hangt is dat wel wat lastiger. Of krijgt niet elke module een display? Staat me iets van bij dat je graag had dat je één Adruino tussen PC en rest wilde die ook als interface zou dienen. Dan kan het wel makkelijk. Maar dan zou ik nu al beginnen met de boel op te splitsen. Hoe meer je er nu bij maakt hoe lastiger...

3.: Wissel sturing voor zware belasting (schaduw station meerdere wissels tegelijk sturen)
Gelijk ook terug komende op je foto's, hoe stuur je nu de wissels? Via de relais? En zie ik dat goed, schakel je de relais gelijk door de Arduino? Zo ja, welke relais zijn het? (Zoveel vermogen kan de Arduino niet leveren op een pin.) En ik lijk geen back EMF diodes te zien...

4.: Bluetooth communicatie tussen pc en sturing
Mag ik vragen waarom je dit zou willen?

5. Barebone Arduinio, geen programma's uploaden wel communicatie tussen Arduino en pc.
Wat bedoel je met barebone? Als je bedoelt een losse ATmega chip zou ik zeggen, pak een Arduino Pro Mini. Voor het geld van een Arduino Pro Mini kan ik het zelf aan losse onderdelen echt niet maken. Losse chip kost +-€1,30 en een complete Arduino Pro Mini €1,50...

Een programma zal je altijd op moeten zetten...

Nu over de code. Zoals ik al aan gaf zou ik nu al beginnen met iedere module als node ta gaan zien in een I2C netwerk. Als je dit later moet aanpassen ben je echt meer tijd kwijt dan dit nu al te doen.

Voor de pin definities is het inderdaad nuttig om ze als const te definiëren. Maar je mag ze ook als byte definiëren, scheelt weer ruimte :)

Je namen zijn (meestal) wel duidelijk maar je zou jezelf helpen door meer met de naam standaard mee te gaan. Dus const wel laten beginnen met hoofdletters (LedPin, Blok1Pin) om aan te geven, kan ik niet wijzigen. En juist normale variabele niet (zoals je nu wel hebt gedaan met Interval, ookal zou je die waarschijnlijk eerder als const willen definiëren  ;D)

Maar variable namen als PWMA, AIN1, previousMillis en r zijn nogal vaag (en de eerste gaan ook niet mee in de naam standaard). Voor de motorcontroller zou ik dan veranderen in
const byte PinPwmA = 9;
const byte PinAin1 = 10;
const byte PinAin2 = 11;

De previousMillis is voor eht knipperen van de led, om dat gelijk duidelijk te maken doe ik dat ledMillis noemen. Omdat eht interval maar 500 is zou je ook ruimte kunnen besparen door het als unsigned int ledMillis te definiëren. Doordat je er nu een long, en geen unsigned ling, van hebt gemaakt heb je namelijk nu een error in je programma geschreven ;)

Variabele r zegt niets, noem deze gewoon richting. Of, aangezien het maar twee states kent zou een duidelijke zijn om er bool richtingLinks van te maken. Nu maak je namelijk r ook 1 (dus true) als je linksom bedoelt. Er gewoon richting van maken zou ik dan niet doen, je weet dan niet gelijk wat de true en false ervan betekend. Door er richtingLinks van te maken wel ;)

Doorgaand daarop zou in de functie locomotief (wat ik niet echt de lading van de functie vind dekken overigens, zou ik eerder setLocSpeed van maken) zou het kunnen worden setLocSpeed(byte loc, byte snelheid, bool richtingLinks) worden. Je werkt op een microcontroller, het kiezen van het juiste type variabele is nodig, je hebt niet oneindig ruimte. Byte en bool zijn hier groot genoeg.

Eigenlijk geld dat ook voor baanvak (setBaanvakStatus ?). baanvak(byte blok, bool status);

En daar kom ik dan tegen
// Voor elk blok moet een routine schrijven.
Mm, als je dat soort dingen op schrijf moet je je gaan bedenken of dat niet makkelijker kan. En dat kan super eenvouding! Gebruik arrays  ;D Als je voor alles waar je er meer dan één van hebt een array aan maakt wordt het leven echt een stuk eenvoudiger. Dus SeinPinR[], SeinPinG[] en BlokPin enz. Hele functie (tot oneindig aantal blokken) is dan:
void setBaanvakStatus(byte blok, bool status) {
 
  // Zet de parameters van de functie baanvak (blok, status)
  // Blok: 1 waarde blok kan van 1 tot zoveel blokken nodig zijn worden gebruikt.
  // Status: 0 vrij, 1 bezet.
 
  //voor alle blokken
  if(blok == 0){
 
  for(byte i = 0; i < sizeof(BlokPin); i++){
digitalWrite(BlokPin[i], !status); //zet blok goed

//zet zein goed
digitalWrite(SeinPinR[i], status);
digitalWrite(SeinPinG[i], !status);
  }
  }
  //specifiek blok
  else{
digitalWrite(BlokPin[blok - 1], !status); //zet blok goed

//zet zein goed
digitalWrite(SeinPinR[blok - 1], status);
digitalWrite(SeinPinG[blok - 1], !status);
  }
}

Zelfde voor eigenlijk alle andere functies. Als je dan ook nog
#define VRIJ 0
#define BEZET 1

Aanmaakt krijg je duidelijke code als setBaanvakStatus(1, VRIJ); waarvan je, zelfs als je je niet verdiept hebt in de code, gelijk kunt zeggen wat het doet ;)

De grote lappen tekst wil je tussen F() zetten. Dit scheelt heeeeeeel veel geheugen. Dus Serial.println(F("Arduino analoge modelbaan sturing: Motorsturingen en blok meldingen")); enz

In de switch doe je nogal dubbel. Eigenlijk eindig je elke case met menu() (printMenu() zou duidelijker zijn. Again, beter duidelijke naam dan paar tekens minder typen ;) ) Ik zou deze dus gewoon onder de switch zetten :)

Nu we toch bij de switch zijn, zo met letters voor elk blok ga je wel hard door je mogelijkheden heen. Zou het niet makkelijker zijn om steeds 2 bytes van de PC naar de Arduino te sturen. Waarbij eerste aangeeft wat voor type commando het is en het tweede voor wat het nodig is? Bijvoorbeeld  b 1 om blok 1 vrij te zetten en B 5 om blok 5 bezet te maken?

De switch voor alle blokken zou dan zo simpel zijn als
switch(commando){
case 'b': //blok vrij
Serial.print(F("Blok: "));
Serial.print(nummer);
Serial.println(F(" : Vrij"));

//update het baanvak
setBaanvakStatus(nummer, VRIJ);

lcd.home ();
lcd.setCursor(0, 1);
lcd.print(F("Blok "));
lcd.print(nummer);
lcd.print(F(": Vrij"));

break;
case 'B': //blok vrij
Serial.print(F("Blok: "));
Serial.print(nummer);
Serial.println(F(" : Bezet"));

//update het baanvak
setBaanvakStatus(nummer, BEZET);

lcd.home ();
lcd.setCursor(0, 1);
lcd.print(F("Blok "));
lcd.print(nummer);
lcd.print(F(": Bezet"));

break;
En tada, klaar voor 255 blokken... ;)

Dit
for (int t = 10; t <= 200; t++) {
            delay(40);

            locomotief (1, t, cw);

          }
Kan je nog van een koude kermis thuis laten komen als je meer dan 1 trein tegelijk wilt laten rijden. Dat kan nu namelijk niet... Met delay reageert de Arduino even nergens op, dus ook niet op een noodstop bijvoorbeeld. Ook kan je geen twee treinen tegelijk laten optrekken enz. Maar goed, misschien staat dit nog op de planning? Is namelijk niet de eerste keer dat ik het je laat weten  ;D

Zelfde voor de wissels
  if (wrichting == 0) {

    Serial.println("wissel 1 rechtdoor");

    digitalWrite(wissel1rPin, HIGH);
    delay(750);
    digitalWrite(wissel1rPin, LOW);
Je wil de delay gewoon nooit gebruiken...

Voor de wissels heb ik in mijn hoofd wel iets moois zitten maar krijg het zo snel niet op papier  ::) Aangezien het misschien ook handig is niet meer dan 1 wissel tegelijk aan te sturen zat ik te denken om een buffer van om te zetten wissels te maken en die dan af te lopen. En dan op te splitsen in een setWissel() en een updateWissel() functie waarbij de eerste ze alleen toevoegt aan de buffer en de laatste netjes met een millis() timer ze een voor een langs loopt....

Maar goed, als er niet onwijs veel wissels zijn kan je ook een millis per wissel doen:
unsigned int wisselMillis[sizeof(WisselAfbuigenPin)]; //Wanneer is de bekrachtiging begonnen?
bool wisselActive[sizeof(WisselAfbuigenPin)]; //Is de wissel nu bekrachtigd?

const unsigned int WisselInterval = 750; //Tijd in ms om wissel te bekrachtigen. Lijkt me al best lang

void setWissel(byte nummer, bool afbuigen){
digitalWrite(WisselRechtPin[nummer], !afbuigen);
digitalWrite(WisselAfbuigenPin[nummer], afbuigen);

wisselActive[nummer] = true;
wisselMillis[nummer] = millis();
}

void updateWissel(){
unsigned int currentMillis = millis();

for(byte i = 0; i < sizeof(WisselAfbuigenPin); i++){
if(wisselActive[i]){
if(currentMillis - wisselMillis[i] >= WisselInterval){
digitalWrite(WisselRechtPin[i], LOW);
digitalWrite(WisselAfbuigenPin[i], LOW);
wisselActive[i] = false;
}
}
}
}

Waarbij je dus updateWissel() in je loop moet aanroepen.

En om alles flot te houden, zet je baut rate gewoon lekker hoog ;) 115200 zou prima moeten werken.


Okay, weer mijn excuses voor zoveel kritiek  ::) Maar ik probeer het hiermee echt makkelijker te maken voor jou! En mja, dit schrijven heeft me ook meer dan een uur gekost.... Dus ik hoop dat je het wel nuttig vindt  8)


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 19 oktober 2015, 19:00:13
Hoi Timo

Bedankt voor je input, ik waardeer dat ten zeerste.

Even een korte reactie, is vanavond clubavond, morgen zal ik een uitgebreide reactie geven.

I2C

Dat klopt, dat is nog steeds de bedoeling, volgens mij geeft het geen problemen om een lcd en/of andere i2C tegelijk te gebruiken.
Er komt maar een lcd in het systeem.

Een master voor het system en de rest zijn slave units.

De code voor de master zal er ongeveer zo uitzien.

//i2c Master Code(UNO SMD)

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h> // library voor 12c lcd display

#define BACKLIGHT_PIN     3

LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // adressering lcd display

void setup()
{
    pinMode(8,OUTPUT);
    pinMode(9,OUTPUT);
 
  Serial.begin(9600);
  Serial.println("Arduino test programma : I2C communicatie");
  Wire.begin();
  delay(1000);
}
void loop()
{     
      Wire.beginTransmission(5);
      Wire.write('H');
      Serial.println("zend een H naar de Slave");
      digitalWrite(8,HIGH);
      digitalWrite(9,LOW);
      Wire.endTransmission();
     
      delay(2000);
     
      Wire.beginTransmission(5);
      Wire.write('L');
      Serial.println("zend een L naar de Slave");
      digitalWrite(8,LOW);
      digitalWrite(9,HIGH);
      Wire.endTransmission();
     
      delay(2000);     
}

De code voor de slave zal er ongeveer zo uitzien.
/i2c Slave Code(UNO 2)

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h> // library voor 12c lcd display

#define BACKLIGHT_PIN     3

LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // adressering lcd display

void setup()
{
  Wire.begin(5);
  Wire.onReceive(receiveEvent);
 
  pinMode(13,OUTPUT);
 
  digitalWrite(13,LOW);
 

void loop()
{
}

void receiveEvent(int howMany)
{
  while(Wire.available())
  {
    char c = Wire.read();
   
    if(c == 'H')
    {
      digitalWrite(13,HIGH);
     
    }
    else if(c == 'L')
    {
      digitalWrite(13,LOW);
     
    }
  }
}


Relais.

De relais kunnen rechtstreeks zonder flyback diode aan een Arduino poort gehangen worden, of dat verstandig is weet ik niet ::), ik denk het eigenlijk niet, ik heb het al een paar keer gedaan ::), niet expres, maar de poorten zijn nog heel. :)

In deze opstelling zit er een kleine transistor(bc547) voor het relais, ik ben inderdaad een flyback diode vergeten te plaatsen, de poorten doen het in ieder geval nog steeds. ::) :P

Voor grote schakel vermogens wil ik een solidstate relais gebruiken.

Het is met dit ontwerp wel de bedoeling om de wissels per paar te stellen.

Voor de wisselsturing  gebruik ik transistoren van het type BD681, BD136 enz.

Bluetooth.

Om een flexibel systeem te maken wil ik Bluetooth gebruiken( het blijft een terminal sturing met de pc, laptop, tablet, smartphone) voornamelijk word de pc ervoor gebruikt.

Barbone Arduino

Dat houd in een atmega 328 chip en crystal, voeding op een printplaat, no more, no less.
Aan een Arduino pro mini heb ik even niet aan gedacht, bedankt voor je input, barebone arduino is in dat geval inderdaad niet nodig.

Morgenavond geef ik op de rest een reactie, ik ben blij dat je me wil helpen, alvast bedankt daarvoor. (y)

Zowel de hardware en de software zijn een proefopstelling om het een en het ander te kunnen uittesten, zonder ingewikkelde programma's en elektronica, alles is op deze manier snel te realiseren en aan te passen.

Mvg Paul ;D

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 20 oktober 2015, 10:06:50
Hoi Paul,

Ook even snel antwoord van mij dan.

De relais zouden misschien wel direct aan de Arduino kunnen als ze weinig stroom nodig hebben. Kan type niet lezen dus kan het niet opzoeken. De fly back diode is alleen wel echt een must (tenzij deze al ingebouwd zit maar dat is zelfde zo). Bij het afschakelen ontstaat er even een hoge spanning over de spoel en die voer je nu af via de input clamping diodes van de ATmega. Daar zijn ze alleen niet echt op gebouwd dus daar wil je niet op vertrouwen. Bij gebruik van een transistor is het ook aan te raden omdat je de transistor ook erg op de proef stelt zo.

I2C met één display aan de master is geen probleem. Ik zat meer te denken, het is wel een probleem als je aan een slave ook een display wilt hangen. Dat kan niet zo makkelijk. Dit omdat het display al een slave is en alleen aangestuurd kan worden door een I2C master. Zou je dit willen zou je naar een multi master opstelling moeten gaan en gat lijkt me in dit geval echt te node-loos  ingewikkeld.... (Node  ;D sorry voor de woordgrap)

Maar ik zou als ik jou was nu al beginnen met het opsplitsen van master en slave programma. Het is extra werk om dat later pas te doen. Ook al bouw je nu eerst een systeem met maar één slave.

Bluetooth, mja, voor de tablet misschien handig. Maar ik persoonlijk (en dat kan je natuurlijk zelf anders willen) zou het pas later inbouwen, eerst het Serial voor elkaar krijgen. Het moet ook goed te doen zijn later in te bouwen omdat je alleen de master hoeft aan te passen. En volgens mij laten de meeste Bluetooth modules zich al redelijk makkelijk als serial bridge banaderen dus dat is dan makkelijk.

Barebone, dan had ik het inderdaad goed ingeschat. En ja, voor het bedrag van een Arduino Pro Mini kan ik het zelf echt niet meer barebone opbouwen. Vandaar dat ik graag gewoon een print maak waarop je een Arduino Pro Mini kan prikken.

En tja, voor het snel realiseren is het handig om de code iets flexibeler te maken. het scheelt immers veel tijd als je niet hele blokken code moet toevoegen voor iedere wissel enz die je toe wilt voegen...  ;D


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 20 oktober 2015, 23:41:53
Hoi Timo,

Het lukte vanavond niet om nog uitgebreid te reageren op je post.

Ik ben vanavond bezig geweest met het opruimen van mijn ontwikkel/hobby plekje, er slingerde wat Arduino's uno, nano's, mega div. shields steekboardjes, doorverbind draadjes, elektronika onderdelen enz, ::)  je begrijp het al ik ben er langer mee bezig geweest om uit te zoeken dan ik dacht. :P

Even het volgende:

De treinsturing waar ik nu mee bezig ben, is niet meer dan een terminal besturing van de modelbaan, er komen niet meer functies bij per Arduino, het is nu meer ontwikkeld als een Blokkaart met locomotief sturing per blok, als extra kun je er bv wissels mee schakelen, daar wil ik een aparte sturing voor maken.

Dit ontwerp is bedoeld om bv. bij een uitwijk spoor ingezet te worden compleet met seinen, of een klein station, door het aanpassen van de functies kun je de configuratie van deze blokmodule veranderen.

Er zal dan ook niet meer dan 1 trein per blok rijden, bv. blok 1 vrij trein stopt op spoor 1, blok 1 word bezet gemeld en spanningsloos gemaakt, op spoor 2 kan de doorgaande trein gewoon doorrijden,of de trein van links of recht komt maakt dan niet uit, vandaar de relais in het ontwerp.

De twee seinen heb ik bewust als 4 aparte sturingen uitgevoerd zodat ik de seinen apart kan bedienen of via het blok sturen.

Het ontwerp is in de basis, gebaseerd op het van Mekeren bloksysteem, en heeft misschien ook wel wat weg van Dinamo.

Dit moet dan ook een Arduino blok-gestuurde modelbaan-sturing  worden.

Het Programma per Arduino (pro) uno,  is niet erg uitgebreid, een klein programma is voldoende.

Wat wel van belang is dat ikzelf de richting van de trein kan kiezen, hiervoor gebruik ik dus de case functie case'<' ,case'>'
Het is de bedoeling dat ik, voor ik de trein een vertrek comando geeft,  ik eerst de richting moet aangeven.

Kort samen gevat , dit ontwerp is voor een blok-gestuurde Arduino modelbaan-sturing.

Morgen (hoop ik ::) ) een verdere reactie op jou post te geven.

Mvg Paul  ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 21 oktober 2015, 00:11:58
Haak ik gelijk weer in :D

Ik ken het helemaal. Hier slingeren ook altijd te veel projecten en onderdelen op me bureau. Breadboards met soms 3 verschillende niet met elkaar te maken hebbende testopstellingen, meerdere USB Serials, meerdere Pro Mini's, servo's, displays, DCDC converters, PIC programmer, D-sub connectoren, nieuwe voorraad weerstanden, Senseo condensatoren, Z80 en halve project printen is het op dit moment  ;D

Maar goed, verder met dit project  :P Ik snap wat je nu wilt doen. En ik snap dat je een soort blokkaart wilt maken. (Zal eht verder dus ook maar blokkaart noemen voor de duidelijkheid.) Maar dat haalt geen van mijn punten neer  ;D Je hebt nu veel dingen dubbel in de code die je makkelijker had kunnen doen. En dan is het ook nog schaalbaar, of je het nu nodig hebt of niet.

En even voor de duidelijkheid, wat noem jij een blok? Is dat alles wat achter een motordriver zit? Of juist elke relais deel (waarbij er dus 2 relais per motordriver hangen)?

De motordriver die je gebruikt heeft toch eigenlijk 2 drivers in zich? Is het dan niet zonde om steeds maar de helft te gebruiken? Is het dan niet handiger een Blokkaart te maken die 2 blokken aan kan sturen? Dinamo heeft toch ook kaarten voor meer dan 1 blok? Het denken zit immers in het terminal deel. De Arduino en de motordriver voeren domweg taken uit die ze krijgen. En een Pro Mini of uno is meeeeer dan krachtig genoeg om alles voor 2 motordrivers, 4 relais enzo te doen.

als extra kun je er bv wissels mee schakelen, daar wil ik een aparte sturing voor maken.
Wat bedoel je daarmee? Wil je losse wisselkaarten maken? Of wil je dat als onderdeel van de blokkaart? Of wil je soms 1 of soms 2 en soms 3 wissels met één blokkaart kunnen schakelen?

De twee seinen heb ik bewust als 4 aparte sturingen uitgevoerd zodat ik de seinen apart kan bedienen of via het blok sturen.
Dat is toch prima? Of vat je uit mijn tekst iets anders op?

Wat wel van belang is dat ikzelf de richting van de trein kan kiezen, hiervoor gebruik ik dus de case functie case'<' ,case'>'
Het is de bedoeling dat ik, voor ik de trein een vertrek comando geeft,  ik eerst de richting moet aangeven.
Dat snap ik. Maar hoe ga je dat dan doen als je straks meerdere blokken hebt? Waarom niet de snelheid als signed getal zien? Dus positief voor vooruit en negatief voor achteruit? Dan kan je snelheid en richting gewoon in één commando geven!

Waar ik je overigens niet meer over gehoord heb (en wel van belang gaat zijn), hoe ben je van plan de motor sturing van de verschillende Arduino's te synchroniseren? Zonder dat ga je tegen versnellingen aanlopen op blok overgangen.
Synchronisatie

En wat ik zeg, veel tips (zoals goeie variabele namen en functie namen) helpen je om beter begrijpbare code te maken. Niet alleen voor mij/ons maar vooral ook voor toekomst jij. Als jij over 2 jaar de code opent, weet jij dan nog waar variabele r voor staat? Of waarvoor de previousMillis gebruikt werd? Ik zelf zou dan een maand later al niet meer weten! Een variabele als richtingLink zie je gelijk aan wat je er mee bedoelt. En ook als het true of false is weet je gelijk de uitkomst. Terwijl als je het richting noemt en je krijgt er true(of 1 ) uit moet je maar weer opzoeken of 1 nu links of rechtsom is... Zelfde geld voor ledMillis, hieraan zie je gelijk dat je er een tijd voor de led mee bij houdt.

En het is leuk dat je nu a en A voor blok 1 gebruikt en b/B voor blok twee enz. Maar het geeft je een hoop werk dit steeds toe te moeten voegen aan de switch enz. En wat doe je als je bij blok 26 bent aangekomen? Je code aanpassen voor dingen als aa en BB is een hoop werk tegen die tijd. Terwijl het niet nodig is  ;)


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 28 oktober 2015, 23:40:00
Hoi Volgers,

Ik heb me bezig gehouden met het programmeren van de Master, slave1, slave2 I2C sturing van de blokkaarten.

De programma's zijn nog in een test fase (sterker nog, niet getest)   

Voor de meedenkers  (alvast bedankt) de twee programma's arduino master en arduino slave

Arduino master

//I2C Master Code(Arduino Nano)

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h> // library voor 12c lcd display

#define BACKLIGHT_PIN     3

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7); // adressering lcd display

const byte SlavePin1 = 2;
const byte SlavePin2 = 3;
const byte SlavePin3 = 4;
const byte SlavePin4 = 5;
const byte MasterSendPin = 6;
const byte MasterRecivePin = 7;
const byte ControllePin = 13;

int Interval = 500; // Tijdvertraging ter controlle of het programma nog loopt.

boolean LedState = LOW;

unsigned long LedMillis = 0; // slaat de laatste stand van de LED op.

char I2CByte; // Slaat een waarde op in I2CByte

void setup()
{

  lcd.begin(20, 4); // Stelt de lcd driver in op 20 characters en vier regels.

  // set de backlight van het lcd display aan.
  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home (); // Ga naar de boventse regel en het eerste character.

  pinMode(SlavePin1, OUTPUT);
  pinMode(SlavePin2, OUTPUT);
  pinMode(SlavePin3, OUTPUT);
  pinMode(SlavePin4, OUTPUT);
  pinMode(MasterSendPin, OUTPUT);
  pinMode(MasterRecivePin, OUTPUT);
  pinMode(ControllePin, OUTPUT);

  Serial.begin(9600);
  Serial.println("Arduino test programma : I2C communicatie");

  lcd.home ();
  lcd.setCursor(0, 1);
  lcd.println("Arduino Bloksturing");

  Wire.begin();
  delay(1000);
}
void loop()
{

  // Controlle led om te zien of het programma nog werkt.

  unsigned long currentMillis = millis();

  if (currentMillis - LedMillis > Interval) {

    // Sla de laatste stand van de Led waneer die nog knipperde

    LedMillis = currentMillis;

    // Als de Led uit is zet de Led aan en vice-versa:

    if (LedState == LOW)
      LedState = HIGH;
    else
      LedState = LOW;

    digitalWrite(ControllePin, LedState); // Afhankelijk van de ledState is de Led aan of uit.

  }

  if (Serial.available() > 0) {  // Kijk of de seriele verbinding beschikbaar is.

    int I2CByte = Serial.read(); // Lees een 'byte'.

    switch (I2CByte) {

      case'A': // Blok 1 Vrij

        Wire.beginTransmission(2);
        Wire.write('A'); // Stuur een A naar slave 2, Blok1, HIGH
        Serial.println("Stuur een A naar de Slave 2");
        digitalWrite(MasterSendPin, HIGH);

        Wire.endTransmission();

        delay(20);

        Printmenu();

        break;

      case'a': // Blok 1 Bezet

        Wire.beginTransmission(2);
        Wire.write('a'); // Stuur een a naar slave 2, Blok1,LOW
        Serial.println("Stuur een a naar de Slave 2");
        digitalWrite(MasterSendPin, HIGH);

        Wire.endTransmission();

        delay(20);

        break;
      case'B': // Blok 2 Vrij

        Wire.beginTransmission(2);
        Wire.write('B'); // Stuur een B naar slave 2, Blok2, HIGH
        Serial.println("Stuur een B naar de Slave 2");
        digitalWrite(MasterSendPin, HIGH);

        Wire.endTransmission();

        delay(20);

        Printmenu();

        break;

      case'b': // Blok 2 Bezet

        Wire.beginTransmission(2);
        Wire.write('b'); // Stuur een b naar slave 2, Blok2,LOW
        Serial.println("Stuur een b naar de Slave 2");
        digitalWrite(MasterSendPin, HIGH);

        Wire.endTransmission();

        delay(20);

        Printmenu();

        break;

      case'C': // Blok 3 Vrij

        Wire.beginTransmission(3);
        Wire.write('C'); // Stuur een C naar slave 3, Blok3,HIGH
        Serial.println("Stuur een C naar de Slave 3");
        digitalWrite(MasterSendPin, HIGH);

        Wire.endTransmission();

        delay(20);

        Printmenu();

        break;

      case'c': // Blok 3 Bezet

        Wire.beginTransmission(3);
        Wire.write('c'); // Stuur een c naar slave 3, Blok3,LOW
        Serial.println("Stuur een c naar de Slave 3");
        digitalWrite(MasterSendPin, HIGH);

        Wire.endTransmission();

        delay(20);

        Printmenu();

        break;

      case'D': // Blok 4 Vrij

        Wire.beginTransmission(3);
        Wire.write('D'); // Stuur een D naar slave 3, Blok4,HIGH
        Serial.println("Stuur een D naar de Slave 3");
        digitalWrite(MasterSendPin, HIGH);

        Wire.endTransmission();

        delay(20);

        Printmenu();

        break;

      case'd': // Blok 4 Bezet

        Wire.beginTransmission(3);
        Wire.write('d'); // Stuur een d naar slave 3, Blok4,LOW
        Serial.println("Stuur een d naar de Slave 3");
        digitalWrite(MasterSendPin, HIGH);

        Wire.endTransmission();

        delay(20);

        Printmenu();

        break;

    }
  }
}
void Printmenu() {

  Serial.println();
  Serial.println(F("Arduino analoge modelbaan sturing: Motorsturingen en blok meldingen"));
  Serial.println();
  Serial.println(F("Stuur comando's"));
  Serial.println();
  Serial.println(F("A = Blok 1 vrijgeven       a = Blok 1 bezet melden"));
  Serial.println(F("B = Blok 2 vrijgeven       b = Blok 2 bezet melden"));
  Serial.println(F("C = Blok 3 vrijgeven       c = Blok 3 bezet melden"));
  Serial.println(F("D = Blok 4 vrijgeven       d = Blok 4 bezet melden"));
  Serial.println(F("< = Trein linksom          > = Trein rechtsom"));
  Serial.println(F("1 = Trein 1 starten        0 = Trein 1 stoppen"));
  Serial.println(F("| = Wissel 1 rechtdoor     / = Wissel 1 Afbuigend"));
  Serial.println();
  Serial.println(F("9 = Noodstop"));
  Serial.println();

}

Arduino slave

//i2c Slave Code(NANO slave 2)

#include <Wire.h>

//char I2CByte;       // Slaat een waarde op in incomingByte

/******************************************************************************
 * Definities
 ******************************************************************************
 * Blok A en C is aangesloten op OUT1 en OUT2 van de motorsturing
 * Blok B en D is aangesloten op OUT3 en OUT4 van de motorsturing
 ******************************************************************************/
// constants zullen niet veranderen.

// Geef de output pinnen een naam.

const byte LedPin =  13; // Pin nummer LedPin
const byte blok1Pin = 8; // Pin nummer Blok 1
const byte blok2Pin = 12; // Pin nummer Blok 2
const byte sein1rPin = 4; // sein 2 Rood
const byte sein1gPin = 5; // sein 2 Groen
const byte sein2rPin = 2; // sein 1 rood
const byte sein2gPin = 3; // sein 1 Groen
const byte wissel1rPin = 6; // Wissel 1 Rechtdoor
const byte wissel1aPin = 7; // Wissel 1 Afbuigend

int Interval = 500; // Tijdvertraging ter controlle of het programma nog loopt.

//Trein 1

const byte PinPwmA = 9;  // Snelheids regeling trein 1
const byte PinAin1 = 10; // Rechtsom trein 1
const byte PinAin2 = 11; // Linksom trein 1

boolean Cw =  false;  // clockwise
boolean Ccw = false; // counter clockwise

boolean ledState = LOW;

unsigned long ledMillis = 0; // slaat de laatste stand van de LED op.

void setup()
{
  Wire.begin(2);
  // Stelt de comminicatie met de master in.
 
  Wire.onReceive(receiveBlok1);
  Wire.onReceive(receiveBlok2);
  Wire.onReceive(receiveWissel1r);
  Wire.onReceive(receiveWissel1a);
  Wire.onReceive(receiveVooruit);
  Wire.onReceive(receiveAchteruit);
  Wire.onReceive(receiveOptrekken);
  Wire.onReceive(receiveAfremmen);
 
}
void loop()
{
  // Controlle led om te zien of het programma nog werkt.

  unsigned long currentMillis = millis();

  if (currentMillis - ledMillis > Interval) {

    // Sla de laatste stand van de Led waneer die nog knipperde

    ledMillis = currentMillis;

    // Als de Led uit is zet de Led aan en vice-versa:

    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    digitalWrite(LedPin, ledState); // Afhankelijk van de ledState is de Led aan of uit.

  }
}
void receiveBlok1(int howMany)
{
  while (Wire.available())
  {
    char I2CByte = Wire.read();

    if (I2CByte == 'A')
    {

      baanvak(1, 0);

    }
    else if ( I2CByte == 'a')
    {

      baanvak(1, 1);

    }
  }
}
void receiveBlok2(int howMany) {
 
  while (Wire.available())
  {
    char I2CByte = Wire.read();

    if (I2CByte == 'B')
    {

      baanvak(2, 0);

    }
    else if ( I2CByte == 'b')
    {

      baanvak(2, 1);

    }
  }
}

void receiveWissel1r(int howMany) {
 
}
void receiveWissel1a(int HowMany) {
 
}
void receiveVooruit(int HowMany) {
 
}
void receiveAchteruit(int howMany) {
 
}
void receiveOptrekken(int howMany) {
 
}
void receiveAfremmen(int howMany) {
 
}

void locomotief(int loc, int snelheid, int richting) {

  // Zet de parameters van de functie locomotief (loc, snelheid, richting)
  // Loc: 1 output A op het motorshield
  // Snelheid: 0 is stop, 250 is maximale snelheid
  // Richting: 0 Rechtsom, 1 Linksom

  boolean inPin1 = LOW;
  boolean inPin2 = HIGH;

  if (richting == 1) {
    inPin1 = HIGH;
    inPin2 = LOW;

  }

  else {

    if (richting == 0) {
      inPin1 = LOW;
      inPin2 = HIGH;

    }
  }

  if (loc == 1) {

    digitalWrite(PinAin1, inPin1);
    digitalWrite(PinAin2, inPin2);
    analogWrite(PinPwmA, snelheid);

  }
}
void baanvak(int blok, int status) {

  // Zet de parameters van de functie baanvak (blok, status)
  // Blok: 1 waarde blok kan van 1 tot zoveel blokken nodig zijn worden gebruikt.
  // Voor elk blok moet een routine schrijven.
  // Status: 0 vrij, 1 bezet.


  if (blok == 1) {

    if (status == 1) {

      digitalWrite(blok1Pin, LOW);

      digitalWrite(sein1rPin, LOW);
      digitalWrite(sein1gPin, HIGH);

    }
  }

  if (blok == 1) {
    if (status == 0) {

      digitalWrite(blok1Pin, HIGH);

      digitalWrite(sein1rPin, HIGH);
      digitalWrite(sein1gPin, LOW);

    }
  }

  if (blok == 2) {

    if (status == 1) {

      digitalWrite(blok2Pin, LOW);

      digitalWrite(sein2rPin, LOW);
      digitalWrite(sein2gPin, HIGH);

    }
  }
  if (blok == 2) {
    if (status == 0) {

      digitalWrite(blok2Pin, HIGH);

      digitalWrite(sein2rPin, HIGH);
      digitalWrite(sein2gPin, LOW);

    }
  }

  if (blok == 0) {

    if (status == 1) {

      digitalWrite(blok2Pin, LOW);
      digitalWrite(blok1Pin, LOW);

      digitalWrite(sein1rPin, LOW);
      digitalWrite(sein2rPin, LOW);

      digitalWrite(sein1gPin, HIGH);
      digitalWrite(sein2gPin, HIGH);
    }
  }

  if (blok == 0) {

    if (status == 0) {

      digitalWrite(blok2Pin, HIGH);
      digitalWrite(blok1Pin, HIGH);

      digitalWrite(sein1rPin, LOW);
      digitalWrite(sein2rPin, LOW);

      digitalWrite(sein1gPin, HIGH);
      digitalWrite(sein2gPin, HIGH);
    }
  }
}

void wissel(int wnummer, int wrichting) {

  // Zet de parameters van de functie wissel (wnummer, wrichting)
  // wnummer   : 1, deze waarde bevat het nummer van de wissel
  // wrichting : 0, deze waarde geeft de richting van de wissel, 1 rechtdoor, 0 afbuigend
  // Let op !, deze parameters moetten voor elke wissel worden ingesteld, de wissels worden in paar gesteld.
  // De wissels kunnen ook per wissel gesteld worden, de programeercode hoeft daar niet voor aangepast worden.

  if (wnummer == 1) {

  }

  if (wrichting == 0) {

    digitalWrite(wissel1rPin, HIGH);
    delay(500);
    digitalWrite(wissel1rPin, LOW);
  }

  if (wnummer == 1) {

  }
  if (wrichting == 1) {

    digitalWrite(wissel1aPin, HIGH);
    delay(500);
    digitalWrite(wissel1aPin, LOW);
  }
}

Mvg Paul Smits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 31 oktober 2015, 15:49:10
Hoi volgers,

Ik ben al weer een tijdje bezig met I2C tussen meerder Arduino's om dat voor elkaar te krijgen.

Het is eindelijk gelukt :) om een I2C communicatie voor elkaar te krijgen, ik heb al heel wat programmaatjes er voor
geschreven maar deze werkt allemaal niet.

Ik ben nu in staat om twee blokschakelingen via I2C te sturen, op elke slave zit dezelfde code alleen de mededelingen zijn aangepast en het slave nummer is anders, de master is eigenlijk een interface tussen de computer en de slave units, de slave units sturen de poorten aan.

De programmeer code is nog in ontwikkel stadium, deze code moet ik nog gaan aanpassen naar de uiteindelijke versie,
ik programmeer eerst een werkende versie en van de werkende versie wil ik dan uiteindelijk een gestructureerd programma maken

Het master programma is nu nog geprogrammeerd met een " if functie" voor de communicatie met de slave units,
ik wil daar uiteindelijk een case functie voor gaan gebruiken, alle mededelingen en menu structuur zal door de master voor zijn rekening worden genomen.

Per Arduino Blokkaart heb ik:

* 8 poorten voor de sturingen van wissels seinen of blokken of een combinatie ervan.
* 3 poorten voor motorsturing.
* Communicatie poort (serial 0 en 1) deze poorten kan ik in principe gewoon gebruiken, de slave units communiceren via I2C
* I2C poort (a4 en a5)
* 4 Analoge poorten (uno) of 6 analoge poorten (nano).
* Poort 13 word gebruikt om de communicatie tussen de Master unit en slave unit zichtbaar te maken.

Op deze manier kan ik de programmeercode van alle slave units relatief eenvoudig houden.

Foto, opstelling Arduino analoge modelbaan sturing.

(https://images.beneluxspoor.net/bnls/IMGP5386.jpg) (https://images.beneluxspoor.net/bnls/IMGP5386.jpg)
(https://images.beneluxspoor.net/bnls/IMGP5382.jpg) (https://images.beneluxspoor.net/bnls/IMGP5382.jpg)

De master code:

// I2C Mastercode (NANO)
#include<Wire.h>

void setup()
{
  Serial.begin(9600);
  //Serial.println("Arduino i2c sturing tussen twee of meer arduino's");
  Wire.begin();
 
  //Printmenu();
}
void loop()
{
  if (Serial.available());
  {
    char c = Serial.read();
    if (c == 'A')
    {
      Wire.beginTransmission(5); // Adres eerste slave unit
      Wire.write('A');
      Wire.endTransmission();
      Serial.println("Blok 1 Vrij geven.");
     
      Printmenu();
    }
    if (c == 'a')
    {
      Wire.beginTransmission(5);
      Wire.write('a');
      Wire.endTransmission();
      Serial.println("Blok 1 Bezet melden.");
    }
    if (c == 'B')
    {
      Wire.beginTransmission(5);
      Wire.write('B');
      Wire.endTransmission();
      Serial.println("Blok 2 Vrij geven.");
    }
    if (c == 'b')
    {
      Wire.beginTransmission(5);
      Wire.write('b');
      Wire.endTransmission();
      Serial.println("Blok 2 Bezet melden.");
    }
    if (c == '|')
    {
      Wire.beginTransmission(5);
      Wire.write('|');
      Wire.endTransmission();
      Serial.println("Wissel 1 Rechtdoor.");
    }
    if (c == '/')
    {
      Wire.beginTransmission(5);
      Wire.write('/');
      Wire.endTransmission();
      Serial.println("Wissel 1 Afbuigend");
    }
     if (c == 'C')
    {
      Wire.beginTransmission(6); // Adres tweede slave unit.
      Wire.write('C');
      Wire.endTransmission();
      Serial.println("Blok 3 Vrij geven.");
    }
    if (c == 'c')
    {
      Wire.beginTransmission(6);
      Wire.write('c');
      Wire.endTransmission();
      Serial.println("Blok 3 Bezet melden.");
    }
    if (c == 'D')
    {
      Wire.beginTransmission(6);
      Wire.write('D');
      Wire.endTransmission();
      Serial.println("Blok 4 Vrij geven.");
    }
    if (c == 'd')
    {
      Wire.beginTransmission(6);
      Wire.write('d');
      Wire.endTransmission();
      Serial.println("Blok 4 Bezet melden.");
    }
  }
}
void Printmenu() {

  Serial.println();
  Serial.println(F("Arduino analoge modelbaan sturing: Motorsturingen en blok meldingen"));
  Serial.println();
  Serial.println(F("Stuur comando's"));
  Serial.println();
  Serial.println(F("A = Blok 1 vrijgeven       a = Blok 1 bezet melden"));
  Serial.println(F("B = Blok 2 vrijgeven       b = Blok 2 bezet melden"));
  Serial.println(F("C = Blok 3 vrijgeven       c = Blok 3 bezet melden"));
  Serial.println(F("D = Blok 4 vrijgeven       d = Blok 4 bezet melden"));
  Serial.println(F("< = Trein linksom          > = Trein rechtsom"));
  Serial.println(F("1 = Trein 1 starten        0 = Trein 1 stoppen"));
  Serial.println(F("| = Wissel 1 rechtdoor     / = Wissel 1 Afbuigend"));
  Serial.println();
  Serial.println(F("9 = Noodstop"));
  Serial.println();

}

De slave code:

// I2C Slave code (NANO)
#include <Wire.h>

void setup()
{
  Wire.begin(5);
  Wire.onReceive(receiveEvent);
 
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);

}
void loop()
{
}
void receiveEvent(int howMany)
{
  while (Wire.available())
  {
    char c = Wire.read();
    if (c == 'A')
    {
      digitalWrite(8, HIGH); // BloK 1 Vrij geven.
    }
    if (c == 'a')
    {
      digitalWrite(8, LOW); // Blok 1 Bezet melden.
    }
    if (c == 'B')
    {
      digitalWrite(12, HIGH); // Blok 2 Vrij geven.
    }
    if (c == 'b')
    {
      digitalWrite(12, LOW); // Blok 2 bezet melden.
    }
    if (c == '|')
    {
      // Wissel 1 Rechtdoor.
      digitalWrite(6, HIGH);
      delay(750); // bekrachtigings- tijd wisselspoel.
      digitalWrite(6, LOW);

    }
    if (c == '/')
    {
       // Wissel 1 Afbuigend.
      digitalWrite(7, HIGH);
      delay(750); // bekrachtigings- tijd wisselspoel.
      digitalWrite(7, LOW);

    }
  }
}

De communicatie tussen de computer en de Master unit gaat via een bluetooth verbinding, ik vind dat makkelijker om de master unit dan niet vastzit aan de computer maar dat er wel communicatie is, tussen de pc en de master unit.

@Timo

Even nog terug komen op jou opmerkingen, ik vind het fantastisch dat je met/voor mij meedenkt.

Citaat
Nu je een display aan de module hangt is dat wel wat lastiger. Of krijgt niet elke module een display? Staat me iets van bij dat je graag had dat je één Adruino tussen PC en rest wilde die ook als interface zou dienen. Dan kan het wel makkelijk. Maar dan zou ik nu al beginnen met de boel op te splitsen. Hoe meer je er nu bij maakt hoe lastiger...

Alleen op de master komt een I2C lcd display.

Citaat
Gelijk ook terug komende op je foto's, hoe stuur je nu de wissels? Via de relais? En zie ik dat goed, schakel je de relais gelijk door de Arduino? Zo ja, welke relais zijn het? (Zoveel vermogen kan de Arduino niet leveren op een pin.) En ik lijk geen back EMF diodes te zien...
 

De wissels worden gestuurd door vermogenstransistor.(BD 135)
De relais worden aangestuurd door kleine transistors. (BC547)
Dat klopt vergeten te plaatsen, alsnog gedaan. ::)

Het klopt dat de motorsturingen die ik gebruik twee uitgangen voor motoren hebben.
Ik gebruik "out a" voor blokkaart 1 en "out b" voor blokkaart 2

Over de synchronisatie van de motor sturingen, heb ik nog niet over nagedacht. :P

De suggesties voor het programma ga ik zeker proberen te gebruiken. (y)
Ik moet nog veel leren met betrekking tot het programmeren, ik doe het dan ook met kleine stapjes.

Timo, nogmaals bedankt voor je input en ik hoop dat je me in het verdere ontwikkeling van het programma, steeds wil voorzien van suggesties.

Mvg Paul

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 01 november 2015, 16:00:19
Kijk, dat begint ergens op te lijken.

Alleen waarom ben je opeens compleet afgestapt van variabele? Komt de leesbaarheid van de code niet echt ten goede. Zeker als je er meer code bij gaat maken.

Ook zou ik de code van de slave zo maken dat het makkelijk is om het adres aan te passen. Je zou kunnen overwegen dit naar het EEPROM te schrijven. Dan hoef je niet voor elke slave iets aan te passen voor het programmeren.

En dan echt de volgende stap, je wil af van die delay's  ::) Daarmee ga je je anders hard mee in de vingers snijden later ;)

Ook denk ik dat je nu wilt gaan proberen de communicatie tussen master en PC anders te maken. Voor nu is het leuk dat je een case statement hebt daarvoor maar het maakt het wel echt veeeeeeeeeeeel ingewikkelder dan nodig. Maw, veeeeeeel meer werk dan nodig ;)


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 01 november 2015, 17:56:45
Hoi volgers

Ik heb gisteravond  de code aangepast en de master en beide slave's aangepast tot een hopelijk een meer leesbare code.

Alle functies zijn er nog niet er in gebouwd, dat moet zo spoedig mogelijk gedaan worden.

Listing Master :

//I2C Master Code(Arduino Nano)

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h> // library voor 12c lcd display

#define BACKLIGHT_PIN     3

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7); // adressering lcd display

const byte SlavePin1 = 2;
const byte SlavePin2 = 3;
const byte SlavePin3 = 4;
const byte SlavePin4 = 5;
const byte MasterSendPin = 6;
const byte MasterRecivePin = 7;
const byte ControllePin = 13;
char Slave;
char I2CByte; // Slaat een waarde op in I2CByte

void setup()
{

  lcd.begin(20, 4); // Stelt de lcd driver in op 20 characters en vier regels.

  // set de backlight van het lcd display aan.
  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home (); // Ga naar de boventse regel en het eerste character.

  pinMode(SlavePin1, OUTPUT);
  pinMode(SlavePin2, OUTPUT);
  pinMode(SlavePin3, OUTPUT);
  pinMode(SlavePin4, OUTPUT);
  pinMode(MasterSendPin, OUTPUT);
  pinMode(MasterRecivePin, OUTPUT);
  pinMode(ControllePin, OUTPUT);

  Serial.begin(9600);
 
  Printmenu();

  Wire.begin();

  lcd.home ();
  lcd.setCursor(0, 1);
  lcd.println("Arduino Bloksturing");
}
void loop()
{
  Wire.requestFrom(5, 1);   // request
  //Wire.requestFrom(6, 1);

  if (Wire.available()) { // slave may send less than requested
   
    char Slave = Wire.read(); // receive a byte as character
   
    if (Slave == 5)
    {
      digitalWrite(SlavePin1, HIGH);
      digitalWrite(MasterSendPin, HIGH);
    }
    else
    {
     
      digitalWrite(SlavePin1, LOW);
      digitalWrite(MasterSendPin, HIGH);     
    }
     
    //if (Slave == '6')
    //{
   
     // digitalWrite(SlavePin2, HIGH);
     // digitalWrite(MasterSendPin, HIGH);
    //}
    //else
    //{
   
      //digitalWrite(SlavePin2, LOW);
      //digitalWrite(MasterSendPin, HIGH);     
    //}
  }
 
  if (Serial.available()) { // Kijk of de seriele verbinding beschikbaar is.

    char I2CByte = Serial.read(); // Lees een 'byte'.

    switch (I2CByte) {

      case'A': // Blok 1 Vrij

        Wire.beginTransmission(5);
        Wire.write('A'); // Stuur een A naar slave 2, Blok1, HIGH
        Wire.endTransmission();

        Serial.println("Blok 1 Vrij");
        digitalWrite(MasterSendPin, LOW);
        digitalWrite(SlavePin1, LOW);

        Printmenu();

        break;

      case'a': // Blok 1 Bezet

        Wire.beginTransmission(5);
        Wire.write('a'); // Stuur een a naar slave 2, Blok1,LOW
        Wire.endTransmission();

        Serial.println("Blok 1 Bezet");
        digitalWrite(MasterSendPin, LOW);
        digitalWrite(SlavePin1, LOW);

        Printmenu();

        break;

      case'B': // Blok 2 Vrij

        Wire.beginTransmission(5);
        Wire.write('B'); // Stuur een B naar slave 2, Blok2, HIGH
        Wire.endTransmission();

        Serial.println("Blok 2 Vrij");
        digitalWrite(MasterSendPin, LOW);
        digitalWrite(SlavePin1, LOW);

        Printmenu();

        break;

      case'b': // Blok 2 Bezet

        Wire.beginTransmission(5);
        Wire.write('b'); // Stuur een b naar slave 2, Blok2,LOW
        Wire.endTransmission();

        Serial.println("Blok 2 Bezet");
        digitalWrite(MasterSendPin, LOW);
        digitalWrite(SlavePin1, LOW);

        Printmenu();

        break;

      case'C': // Blok 3 Vrij

        Wire.beginTransmission(6);
        Wire.write('C'); // Stuur een C naar slave 3, Blok3,HIGH
        Wire.endTransmission();

        Serial.println("Blok 3 Vrij");
        digitalWrite(MasterSendPin, LOW);
        digitalWrite(SlavePin2, LOW);

        Printmenu();

        break;

      case'c': // Blok 3 Bezet

        Wire.beginTransmission(6);
        Wire.write('c'); // Stuur een c naar slave 3, Blok3,LOW
        Wire.endTransmission();

        Serial.println("Blok 3 Bezet");
        digitalWrite(MasterSendPin, LOW);
        digitalWrite(SlavePin2, LOW);

        Printmenu();

        break;

      case'D': // Blok 4 Vrij

        Wire.beginTransmission(6);
        Wire.write('D'); // Stuur een D naar slave 3, Blok4,HIGH
        Wire.endTransmission();

        Serial.println("Blok 4 vrij");
        digitalWrite(MasterSendPin, LOW);
        digitalWrite(SlavePin2, LOW);

        Printmenu();

        break;

      case'd': // Blok 4 Bezet

        Wire.beginTransmission(6);
        Wire.write('d'); // Stuur een d naar slave 3, Blok4,LOW
        Wire.endTransmission();

        Serial.println("Blok 4 Bezet.");
        digitalWrite(MasterSendPin, LOW);
        digitalWrite(SlavePin2, LOW);

        Printmenu();

        break;

      case'|': // wissel 1 rechtdoor

        Wire.beginTransmission(5);
        Wire.write('|');
        Wire.endTransmission();

        Serial.println("Wissel 1 Rechtdoor.");
        digitalWrite(MasterSendPin, LOW);
        digitalWrite(SlavePin1, LOW);

        Printmenu();

        break;

      case'/': // wissel 1 afbuigend

        Wire.beginTransmission(5);
        Wire.write('/');
        Wire.endTransmission();

        Serial.println("Wissel 1 Afbuigend.");
        digitalWrite(MasterSendPin, LOW);
        digitalWrite(SlavePin1, LOW);

        Printmenu();

        break;
    }
  }
}

void Printmenu() {

  Serial.println();
  Serial.println(F("Arduino analoge modelbaan sturing: Motorsturingen en blok meldingen"));
  Serial.println();
  Serial.println(F("Stuur comando's"));
  Serial.println();
  Serial.println(F("A = Blok 1 vrijgeven       a = Blok 1 bezet melden"));
  Serial.println(F("B = Blok 2 vrijgeven       b = Blok 2 bezet melden"));
  Serial.println(F("C = Blok 3 vrijgeven       c = Blok 3 bezet melden"));
  Serial.println(F("D = Blok 4 vrijgeven       d = Blok 4 bezet melden"));
  Serial.println(F("< = Trein linksom          > = Trein rechtsom"));
  Serial.println(F("1 = Trein 1 starten        0 = Trein 1 stoppen"));
  Serial.println(F("| = Wissel 1 rechtdoor     / = Wissel 1 Afbuigend"));
  Serial.println();
  Serial.println(F("9 = Noodstop"));
  Serial.println();

}
 

Listing Slave 5 :

// I2C Slave code (NANO)
#include <Wire.h>

char I2CByte;

const byte Blok1Pin = 8;  // Blok 1
const byte Blok2Pin = 12; // Blok 2
const byte Sein1rPin = 4; // Sein 1 rood
const byte Sein1gPin = 5; // Sein 1 groen
const byte Sein2rPin = 2; // Sein 2 rood
const byte Sein2gPin = 3; // Sein 2 groen
const byte Wissel1rPin = 6; // Wissel 1 rechtdoor
const byte Wissel1aPin = 7; // Wissel 1 afbuigend
const byte PinPwm = 9; // Snelheids regeling pwm
const byte PinIn1 = 10; // Trein cw
const byte PinIn2 = 11; // Trein ccw

boolean Cw = false;
boolean Ccw = false;

void setup()
{

  pinMode(Wissel1rPin, OUTPUT);
  pinMode(Wissel1aPin, OUTPUT);
  pinMode(Blok1Pin, OUTPUT);
  pinMode(Blok2Pin, OUTPUT);
  pinMode(Sein1rPin, OUTPUT);
  pinMode(Sein1gPin, OUTPUT);
  pinMode(Sein2rPin, OUTPUT);
  pinMode(Sein2gPin, OUTPUT);
  pinMode(PinPwm, OUTPUT);
  pinMode(PinIn1, OUTPUT);
  pinMode(PinIn2, OUTPUT);
  pinMode(13, OUTPUT);

  digitalWrite(13, LOW);

  Wire.begin(5); // Stelt de communicatie met de master in.
  Wire.onReceive(receiveEvent); // Iets ontvangen van de Master.
  Wire.onRequest(requestEvent); // Stuur een 5 naar de Master.

}
void loop()
{
}
void receiveEvent(int howMany)
{
  while (Wire.available())
  {
    char I2CByte = Wire.read();

    if (I2CByte == 'A')
    {
      digitalWrite(Blok1Pin, HIGH); // BloK 1 Vrij geven.
    }
    if (I2CByte == 'a')
    {
      digitalWrite(Blok1Pin, LOW); // Blok 1 Bezet melden.
    }
    if (I2CByte == 'B')
    {
      digitalWrite(Blok2Pin, HIGH); // Blok 2 Vrij geven.
    }
    if (I2CByte == 'b')
    {
      digitalWrite(Blok2Pin, LOW); // Blok 2 bezet melden.
    }
    if (I2CByte == '|')
    {
      // Wissel 1 Rechtdoor.
      digitalWrite(Wissel1rPin, HIGH);
      delay(750); // bekrachtigings tijd wisselspoel.
      digitalWrite(Wissel1rPin, LOW);

    }
    if (I2CByte == '/')
    {
      // Wissel 1 Afbuigend.
      digitalWrite(Wissel1aPin, HIGH);
      delay(750); // bekrachtigings tijd wisselspoel.
      digitalWrite(Wissel1aPin, LOW);

    }
  }
}
void requestEvent() {
  Wire.write(5); // Stuur een 5 naar de Master.
}

@ Timo
Bedankt voor je input.  (y)

Ik heb gisteravond de raw code gepost, ik was nog bezig om de goede code met goede variable namen te maken, om snel test code te programmeren gebruik ik geen variable namen, ik hoef dan ook op dat moment niet aan variable namen te denken, meestal zet ik de raw code niet op het forum ::) ,soms vergeet ik een variable te hernoemen zodat het wel in de code zichtbaar is.

De slave hoeft geen ander adres te krijgen,  eenmaal geprogrammeerd, zal het adres van de slave niet meer veranderen, het kan dat het programma in de slave nog wat aangepast word maar geenszins het adres.

De delay's in de slave vind ik persoonlijk niet erg, de noodstop werkt altijd (Hardware matig)

De vertraging van de wissels zijn niet veel groter dan een halve seconde, ze staan nu op 750 maar dat heb ik gedaan om de wissel aansturing te zien (leds die gaan branden), als de trein optrekt ga ik geen wissels stellen, ook op dat gebied vind ik een kleine vertraging in de vorm van een delay, bij het optrekken en afremmen van de trein geen probleem, per blokkaart heb je maar 1 motorsturing.

Ik wil niet eigenwijs zijn  ::) ;D al lijkt wel, maar tot nu toe snap ik nog niets van de millis commando en hoe ik dat moet programmeren, voor de master lijkt het mij wel een goed idee om van de delay's in het programma af te komen, er staan nu nog geen delay's in de code van de master.

Ik vind het case commando een makkelijke manier van het opzetten van een commando structuur, ik zou ook zo gauw niet weten hoe ik het anders kan doen. ???

Misschien als ik goede en duidelijke voorbeelden op het internet kan vinden, in het Nederlands, mijn Engels is niet zo goed, ik kan het wel lezen maar met veel moeite. :P

Op mijn modelbaan komen voor nu, geen 26 blokken, kan altijd nog veranderen, vandaar dat ik de letters van het alfabet gebruik voor het sturen van de blokken.

Voor het sturen van wissels moet ik nog eens bekijken hoe ik dat goed kan oplossen.

Ook voor het synchroniseren van de motorsturingen moet ik nog een oplossing vinden.

Al met al hoop ik, dat ik wat vragen heb kunnen beantwoorden en hoe ik het zie, ik hoop dat je me nog steeds van voorbeeld code te willen voorzien, ik kan er altijd wat van leren.(Misschien een uitleg van het Millis commando in het Nederlands) :-X ;)

Mvg Paul  ;D

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Reinout van Rees op 01 november 2015, 21:38:20
Naar wat ik heb gelezen.... heeft het de voorkeur in de hoofd "loop()" geen delays te zetten, want gedurende de delays kan de arduino nergens op reageren. Geen input, geen i2c spul, niks.

Voor alles dat regelmatig iets moet doen moet je een eigen functie maken die je vanuit de loop aanroept. Die functie moet dan in een variabele kijken of het alweer tijd is om iets te doen. Van te voren moet je dan ergens de huidige tijd in milliseconden (=millis()) opslaan, verhoogd met de waarde die je anders in de delay() gestopt zou hebben.

Ondertussen loopt je hoofd loop() als een gek alles af te zoeken naar iets om te doen. En reageert dus netjes op commando's die binnenkomen.

Probleem: je moet je programma iets anders opzetten en iets beter structureren. Voordeel: je hoofd loop wordt niet steeds platgelegd.

(Dit is wat ik uit de documentatie begrijp. Ik moet zelf m'n eerste millis() commando nog schrijven. In mijn geval wordt het waarschijnlijk micros() omdat ik met m'n servo die extra nauwkeurigheid nodig denk te hebben :) ).

Reinout
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 02 november 2015, 20:38:33
[oeps, iets te vroeg, nog bezig  ::) Klaar!]

@Reinout,

Ik weet niet wat je probeert te doen met servo's maar die kan je standaard (out of the box) al gewoon aansturen. Tenzij je een goede reden hebt lijkt mij micros() niet nodig...

Ik vind het eigenlijk heel slecht dat er in alle Arduino voorbeelden zo veel met delay() gedaan wordt. In het begin lijkt het leuk maar als snel zal je er last van hebben. Voor hele simpele programma's of kleine testjes kan het handig zijn maar buiten dat wil je er eigenlijk vanaf. Ik zou dan ook graag zien dat nadat je "Hoofdstuk 1, Blink program" hebt gehad je gelijk door gaat naar "Hoofdstuk 2, delay() is slecht!". Probeer jij in je programma straks maar eens twee treinen tegelijk te laten optrekken. Of een wissel schakelen terwijl je aan het optrekken bent. En je noodstop mag dan wel hardwarematig werken, software matig is hij op deze manier nutteloos. Überhaupt je stop kan op deze manier zelfs makkelijk te laat aankomen. Als je bijvoorbeeld de loc wilt laten stoppen door een bezetmelding dan ga je er wel vanuit dat de loc gelijk stil staat en niet 20cm verder, toch? En je zegt wel dat je geen wissel gaat schakelen als de trein op trekt enz. Maar waarom zou je hezelf zo beperken? Dit maakt de computer kant alleen maar lastiger...

Ik heb gisteravond de raw code gepost, ik was nog bezig om de goede code met goede variable namen te maken, om snel test code te programmeren gebruik ik geen variable namen, ik hoef dan ook op dat moment niet aan variable namen te denken.
Dat is eigenlijk best wel gek. Variabele namen zijn juist bedacht omdat die makkelijker zijn dan de pinnamen... En als je het pinnummer makkelijker vindt dan de pinnaam gebruik je misschien niet de juiste naam... Niet om betweterig te doen ofzo maar ik denk dat het makkelijker is om gelijk vanaf het begin gewoon namen te gebruiken. Vind het ook makkelijker om jou Paul te noemen dan 8883 (je forum id (http://forum.beneluxspoor.net/index.php?action=profile;u=8883) ;) ).

En nu we het over pinnamen hebben, wat is de taak van SlavePinx ?

De slave hoeft geen ander adres te krijgen,  eenmaal geprogrammeerd, zal het adres van de slave niet meer veranderen, het kan dat het programma in de slave nog wat aangepast word maar geenszins het adres.
Ik snap dat een slave tijdens normaal gebruik geen ander adres hoeft te krijgen. Maar wat als je later (als je al 10+ slave modules hebt) opeens toch nog een aanpassing maakt aan de software? Ga je dan:
- Eerste module aan PC
- Adres in de code aanpassen
- Module programmeren
- Volgende module aan de PC
- Weer adres aanpassen
- Programmeren
- enz?

Zo blijf je bezig... Maar als je het adres in EEPROM op slaat hoef je dat later met herprogrammeren niet aan te passen. Ondanks dat je dan de software aanpast blijft dat bewaard! Hoe je nog maar
- Module aan PC
- Programmeren
- Volgende module aan PC
- Programmeren
- Enz

Kan dan veel tijd schelen. Hoe je een adres dan werkelijk een adres geeft is aan jou. Kan je bijvoorbeeld met eerste keer programmeren doen bijvoorbeeld.
#include <EEPROM.h>

byte moduleAdres = 2; //Dit adres zal worden opgeslagen in EEPROM als dit de eerste keer programmeren is of als je FORCEER_NIEUW_ADRES defined (adres 255 niet teogestaan)

//#define FORCEER_NIEUW_ADRES //Uncomment als je de module geforceerd een nieuw adres wilt geven.

const byte AdresEE = 0; //Adres van het eeprom waar het module adres staat opgeslagen

void setup(){
  #ifdef FORCEER_NIEUW_ADRES
    //We passen adres aan. Alleen als deze niet al juist is.
    if(EEPROM.read(AdresEE) != moduleAdres){
      EEPROM.write(AdresEE, moduleAdres);
    }
  #else
    //Is adres niet ingesteld? Nooit ingesteld heeft een waarde van 255 ofwel 0xFF
    if(EEPROM.read(AdresEE) == 0xFF){
      EEPROM.write(AdresEE, moduleAdres);
    }
    else{
      moduleAdres = EEPROM.read(AdresEE); //haal adres uit EEPROM
    }
  #endif
 
}

void loop(){
  //gebruik hier het moduleAdres
}
De eerste keer moet je de variabele moduleAdres zelf de gewenste waarde geven. Deze komt dan in EEPROM. Pas je nu het programma aan en wil je het weer uploaden naar de Arduino zal het module adres gewoon uit EEPROM gehaald worden. Wat je op dat moment hebt staan achter moduleAdres maakt niet uit. Je kunt dus gerust alle modules updaten terwijl je daar hetzelfde adres hebt staan, het wordt niet aangepast. Tenzij je #define FORCEER_NIEUW_ADRES gebruikt.

Misschien een uitleg van het Millis commando in het Nederlands) :-X ;)
Goed, komt hij dan he. Misschien wat kort maar dit is een veel gebruikt voorbeeld.

De Arduino kan maar één ding tegelijk, eigenlijk net als wij. En als je delay() gebruikt is het enige wat de Arduino op dat moment doet dus stomweg wachten... Laten we dat nu eens toepassen op ons en wel op het maken van een broodje ei met bacon.

Je begint met het toasten van het brood. Dit stop je in de toaster en je zet de timer (de delay(1000)) op 1 minuut. Vervolgens ga je wachten tot de minuut om is. Dan haal je het brood uit de toaster.

Nu ga je het spek bakken. Je legt het in de pan en zet een timer voor 2 minuten (delay(2000)). Weer ga je wachten tot de bacon klaar is. Hierna haal je het uit de pan.

En als laatste moeten natuurlijk de eieren nog. Deze doe je in de pan en zet de timer voor 3 minuten (delay(3000)).

Zijn de eieren ook klaar dan kan je de eieren op de toast doen en dan de bacon erop leggen.

Maar dit is gelukkig niet zoals wij nomaal een eitje bakken  ;D Zou wel beetje nutteloss zijn om de hele tijd naar die eierwekker te staren... Wat wij normaal zouden doen is meer als:

- Beginnen met de eitjes, deze duren het langst. Doet ze in de pan en je kijkt naar de klok.
- Je pakt alvast de bacon maar kijkt zo nu en dan op de klok
- Is een minuut om leg je de bacon ook in de pan en kijkt weer op de klok
- Ondertussen pak je het brood en kijkt zo nu en dan op de klok
- Is weer een minuut om dan doe je het broodrooster naar beneden. Ook nu kijk je weer hoe laat het is.
- Nu kan je een bordje pakken en je kijkt weer zo nu en dan naar de klok.
- Je ziet dat er weer een minuut om is. Nu weet je dat alles kaar is. Je maakt je broodje ei met bacon :)

Je hebt ondertussen steeds tijd voor andere dingen. Zolang je maar met regelmaat op de klok kijkt om te kijken hoe laat het NU is en je vergelijkt het met de tijd dat je met een actie begon. Maar je hebt zelf nu tijd om de deur open te doen als er wordt aangebeld (Serial data komt binnen?) of de brandblusser te pakken als het brandalarm aan gaat (noodstop).

Zelfde kan je doen op een Arduino. Alleen heet de klok millis(). Deze geeft alleen niet de tijd maar het aantal milliseconde sinds je de Arduino aan gezet hebt. Maar dit is niet zo heel anders dan een klok, die geeft immers aan hoeveel uur er gepasseerd is sinds middernacht ;)

Stel nu dat we in code iedere minuut iets willen doen. Dan wordt dat ik code:
unsigned long vorigeMillis = 0; //Wanneer is de laatste keer dat we iets gedaan hebben?
const unsigned int Interval = 60 * 1000; //Om de hoeveel tijd (met welk interval) willen we de taak doen?

void loop(){
  //We kijken hoe laat het is,
  //we halen hier vanaf hoe laat het de vorige keer was
  //en kijken of dit al langer dan interval geleden is
  if(millis() - vorigeMillis >= interval){
    //sla de tijd van nu op als laatste keer dat we iets gedaan hebben
    vorigeMillis = millis();
   
    //doe hier wat je eens per minuut wilde doen
  }
}

Of stel nu dat je een ledje voor 10 minuten wilt laten branden nadat je een knopje hebt ingedrukt. Je wilt niet 10 minuten wachten en dan helemaal niets anders doen...

In code zou dat er als volt uit zien. Ik gebruik de Bounce2 library om het knopje af te handelen, veeeeeeeel makkelijer.
#include <Bounce2.h>

unsigned long ledjeAanMillis = 0; //De tijd dat we het ledje aan gezet hebben
const unsigned long LedjeAanTijd = 10 * 60 * 1000; //Voor 10 minuten aan

const byte LedjePin = 13; //Pin waar het ledje aan hangt
const byte KnopjePin = 9; //Pin waar het knopje aan hangt (naar GND)

Bounce knopje; //Het object (door de library) van het knopje

void setup(){
  pinMode(LedjePin, OUTPUT); //We willen het ledje laten branden dus een output
  knopje.attach(LedjePin, INPUT_PULLUP); //Geven aan aan welke pi het knopje zit en dat voor deze pin de pull up aan moet
}

void loop(){
  ledjeUpdate();  //Controleren of we het ledje aan of uit moeten zetten
 
  /*
  En hier kan nog veel meer gebeuren
 
  interessanteFunctie();
  nogIets();
 
  ditKanOokwelGebeuren(true);
 
  enz
  */
}

void ledjeUpdate(){
  //Beginnen we met kijken of het knopje is ingedrukt want ja, dan moet het ledje aan
  knopje.update(); //Lees het knopje
 
  //Is het knopje ingedrukt?
  if(knopje.fell()){
    digitalWrite(LedjePin, HIGH); //zet het ledje aan
    ledjeAanMillis = millis();  //sla op wanneer je it gedaan hebt
  }
 
  //nu we dat gedaan hebben, is het misschien tijd om het ledje uit te zetten? Moet hij wel aan staan natuurlijk!
 
  //Staat ledje aan? (Ja, je kan gewoon een digitalRead op een output doen, geen probleem :) )
  if(digitalRead(LedjePin)){
    //Ledje is dus aan, maar moet hij al uit?
    if(millis() - ledjeAanMillis >= LedjeAanTijd){
      digitalWrite(LedPin, LOW);
    }
  }
}

Let er wel op dat je altijd de check doet als:
if( tijdNu/millis() - vorigeTijd >= interval)
Dus vorige tijd aftrekken van tijd nu. En dan controleren of deze groter dan of gelijk is aan het interval. Niet alleen gelijk. Wij laten immers het ei ook niet aanbranden als we er achter komen dat we iets te laat op de klok keken. Dan halen wij het ei ook alsnog uit de pan  ;D

Is het zo al wat duidelijker?

Voor het serial data tussen PC en master gedoe (en dit kan je dan eigenlijk ook gebruiken op de slaves...) zal ik later nog ff iets maken. Dit was al genoeg werk om nu even uit te schrijven. Maar ik dacht dat ik er al eens een opzetje (misschien alleen tekst) voor gemaakt had.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Reinout van Rees op 02 november 2015, 21:52:38
@Reinout,

Ik weet niet wat je probeert te doen met servo's maar die kan je standaard (out of the box) al gewoon aansturen. Tenzij je een goede reden hebt lijkt mij micro() niet nodig...

In jouw uitleg gebruik je millis() om de timing mee te doen, ik doe dat met micros(), dus een factor 1000 nauwkeuriger. Aansturing van servo's doe ik inderdaad met de out-of-the-box standaard servo library. Had jij met "micro()" i.p.v. "micros()" iets anders in gedachte ofzo? Ik doe in ieder geval geen handmatige PWM ofzo :)

Reden voor micro's: als ik uitga van een servo die ik met writeMicroseconds() aanstuur heb ik max 1000 stapjes. Dan zou een millis() timer met z'n 1000 tijdstappen per seconde perfect zijn voor een servo die ik egaal in 1 seconde om wil zetten. Maar 1.2 seconde of 0.75 seconde is dan lastig/irritant. Met micros() kan ik nauwkeuriger werken.

Of zie ik iets enorm over het hoofd? (Ik sluit niet uit dat ik beter moet opletten met int/unsigned int/unsigned long enzo en het mixen ervan, want ook met micros() vind ik mijn servo niet 100% soepel lopen met m'n tweede testprogrammaatje).

Om spraakverwarring te voorkomen: huidige versie testprogrammaatje (https://github.com/reinout/reinout-arduino/blob/c9317486dde26d35a97f45114650fa99cc285572/current-test-program/servo_via_timer.ino), alleen één slag van min naar max van de servo.

Reinout
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 02 november 2015, 22:40:12
Oeps, typo. Moest gewoon micros() zijn.

Of zie ik iets enorm over het hoofd?
Yep, het feit dat de interne regelloop van een servo absoluut die nauwkeurigheid niet heeft. Het is alsof je een TGV wilt aansturen op 0,0000001km/h. Compleet nutteloos dus  ;) Een standard SG90 servo doet er bijvoorbeeld al 360ms over om van 0 naar 180 graden te draaien als je hem van het ene op het andere moment van 1ms puls naar 2ms puls stuurt. Ook wordt maar eens in de +-20ms een puls van de Arduino (of elke andere controller) naar de servo gestuurd. Dit is dus maar 50 keer per seconde! Jij kan dan wel mooi elke 500us je positie aanpassen maar dat is compleet nutteloos. De servo ziet nog steeds maar elke 20ms een nieuwe waarde.

En hoe sneller je de servo van A naar B wilt krijgen juist met hoe minder tussenstappen je af kunt. Wil je in 1 seconde van 0 naar 180 zullen wij het al prima als vloeiende beweging zien als je dit is 10 stappen van 18 graden doet.

Maw, leuk dat je de Arduino dus zo hard bezig houdt maar je schiet er niets mee op  ;D ::)


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: ThijsN op 03 november 2015, 07:14:54


@Timo: Mooie voorbeelden. Delay() is inderdaad niet zo geschikt voor complexe code met verschillende parrallele taken.
Volgens mij is er nog een klein foutje in je voorbeeld geslopen.

Je zegt
Citaat
Stel nu dat we in code iedere minuut iets willen doen. Dan wordt dat ik code:
 unsigned long vorigeMillis = 0; //Wanneer is de laatste keer dat we iets gedaan hebben?
const unsigned int Interval = 1000; //Om de hoeveel tijd (met welk interval) willen we de taak doen?

Volgens mij betekent dit dat de code elke seconde uitgevoerd wordt, en niet elke minuut. 1000ms is immers 1sec, en niet 60sec.

Hetzelfde geldt natuurlijk voor het andere voorbeeld:10 sec ipv 10 minuten.

Of begrijp ik het verkeerd.

Groet,

Thijs
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Reinout van Rees op 03 november 2015, 09:10:07
Timo: kijk, dat soort zaken heb ik inderdaad over het hoofd gezien. Ik wist niet dat de servo maar eens per 20ms wordt geupdated. Dan is mieren in de marge met microseconden flink nutteloos, klopt  ;D  Ok, is er ergens een webpagina waar dit soort zaken genoemd worden? Daar kan ik nog flink wat van leren, dan.

20ms per stapje. Oh, dan snap ik nu ook waarom ik het nog wat schokkerig vind. Met 180 graden in 360 ms zit je op een halve graat per ms wat de servo haalt. Per 20 ms interval haalt een servo dan 10 graden.

Als ik de servo in een seconde rustig 60 graden wil laten verplaatsen voor een seinarm kom je op een gewenste beweging van 0.06 graad per ms. En dus 1.8 graad per 20ms.

Conclusie is dan dat in die 20 seconde de servo in ongeveer 3ms naar de juiste plek gaat en 17 ms blijft staan en dan weer verder gaat.

Ah! Dat verklaart wel het licht trillerige gedrag. Kennelijk valt dat in de praktijk nauwelijks op? Of worden het gedrag beter met duurdere servo's? Lijkt me dat je vooral met het 20ms interval blijft zitten.

Reinout
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 03 november 2015, 09:20:41
Reinout,

Je benadert de servo verkeerd. Om de servo te verdraaien van 0o naar 180o moet de puls, die iedere 20 ms herhaalt wordt, verandert worden van 1 ms naar 2 ms. 50 keer per seconde kan je de stand van een servo aanpassen. Hoeveel je de puls verandert is aan jouw, maar je hebt 1000 usec. voor 180o. Laat der servo eens iedere 20msec. een stapje maken en kijk hoe hij dan draait. Vergroot vervolgens de stappen en kijk hoe dat draait.
Maar blijf bij de basis: x stap(pen) per 20 msec.

Groet,

Gerard van der Sel.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Reinout van Rees op 03 november 2015, 10:27:40
Ik geef met m'n huidige "micros()" oplossing de arduino veel rekenwerk te doen en vertel de servo library te vaak wat z'n optimale stand op dat moment is. Klopt. Maar ik ga er wel van uit dat de servo library dan zelf degene is die elke 20ms de laatste actuele waarde doorgeeft.

In andere woorden: misschien heb ik te gedetailleerd 4 keer binnen 20ms een nieuwe waarde gegeven, maar als de servo volgens zijn eigen 20ms timer een waarde wil wegschrijven, gebruikt hij dan de laatste waarde?

Als ik maar één maal per 20ms één waarde aan de servo zou geven zou dat dus soepeler gaan? Vanavond ga ik ermee testen.

Reinout
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 03 november 2015, 11:04:20
Of begrijp ik het verkeerd.
Oeps, nee, je begrijpt het prima! ;D Heb de code in de voorbeelden aangepast met een factor 60   ::)

@Reinout, een snelle zoekopdracht naar servo puls (https://www.google.nl/search?q=servo&safe=off&biw=1680&bih=941&source=lnms&tbm=isch&sa=X&ved=0CAYQ_AUoAWoVChMI26DGjvvzyAIVxb4UCh276Q2c#safe=off&tbm=isch&q=servo+pulse&imgrc=_) levert al wat mooie voorbeelden op. 20ms is eigenlijk de standaard maar de meeste servo's kunnen ook wel iets sneller de volgende puls krijgen. Maar hoe snel hangt af van de servo. De Servo library in Arduino doet het in ieder geval elke 20ms. (Of om precies te zijn, iedere 20ms OF de som van alle pulsewifth van alle attached servo's. Net welk langer is maar meestal zal dat 20ms zijn.)

Maar ik ga er wel van uit dat de servo library dan zelf degene is die elke 20ms de laatste actuele waarde doorgeeft.
Dat klopt. Je schrijft nu gewoon vaak naar een variabele en de servo lib lees/gebruikt deze maar eens per 20ms. Die 20ms komt van een timer interrupt.

Als ik maar één maal per 20ms één waarde aan de servo zou geven zou dat dus soepeler gaan?
Nee, zou hetzelfde moeten gaan. Immers stuurt de servo library de servo nog steeds naar de zelfde posities elke 20ms. Maar je geeft de Arduino een stuk minder te doen. Met stapjes in de us range is het best wel lastig om twee of meer servo's tegelijk te laten bewegen. Het uitvoeren van de taak (updaten van de servo) begint namelijk al aardig in de range van je interval te lopen.

Maar goed, zelf vind ik de servo's wel soepel genoeg aan te sturen. op de adServo update ik de servo elke 20ms (of veelvoud daarvan voor hele trage bewegingen). Als je de boel gekoppeld hebt via veerstaal enz valt het denk ik al minder op. (En grote kans dat de speling in de stangen groter is dan de stapgrote van de servo.) Als ik kijk naar huidige servo decoders (en die sturen het immers op dezelfde manier aan) zie ik geen geschok in de bewegingen. Wel wil je het liefst de boel (wissel, sein etc) zo verbinden dat de servo de grootst mogelijke uitslag moet maken voor de gewenste beweging (zo klein mogelijke arm).

Wil je het geschok nog verminderen zou je voor een tragere servo kunnen gaan. Helaas is dat wel gelijk een stuk meer zoeken / meer betalen. Servo's worden juist gebouwd om snel te zijn omdat dat voor de gebruikelijke toepassingen (RC modellen enzo) juist wenselijk is. Zelf gebruik ik nu SG92 servo's. Deze zijn digitaal (geen gejitter) en hebben een snelheid van 100ms per 60 graden ofwel 300ms voor full swing.

Wat nog een optie zou kunnen zijn voor tragere servo's is door deze op een lagere voedingsspanning te zetten. Meeste servo's vinden dat geen probleem. Zijn ze misschien iets minder krachtig maar dat is waarschijnlijk niet erg. Ik zou dan wel een weerstand (100k+) in de signaal lijn tussen servo en Arduino opnemen zodat de servo zich niet gaat proberen te voeden vanuit de (hogere spanning van de) signaal lijn.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 03 november 2015, 20:10:55
Hoi Volgers

Ben gisteravond nog even bezig geweest met de AAMS sturing via I2C

De sturing werk naar behoren, via de I2C kan ik nu 4 blokken ,twee wissels,  vier seinen sturen, de motor regelingen werken ondertussen ook, nog niet voor 100% maar ik werk veder aan een oplossing.

Om verdere verwarring te voorkomen , noem ik het geen master of slave meer, maar AAMS centrale, AAMS blokkaart, AAMS Wisselkaart,(Wisselkaart moet ik nog maken testversie),enz.

AAMS blok kaart programma.

// I2C AAMS Blokkaart code (NANO)
#include <Wire.h>

char I2CByte;

const byte Blok1Pin = 8;  // Blok 1
const byte Blok2Pin = 12; // Blok 2
const byte Sein1rPin = 4; // Sein 1 rood
const byte Sein1gPin = 5; // Sein 1 groen
const byte Sein2rPin = 2; // Sein 2 rood
const byte Sein2gPin = 3; // Sein 2 groen
const byte Wissel1rPin = 6; // Wissel 1 rechtdoor
const byte Wissel1aPin = 7; // Wissel 1 afbuigend
const byte PinPwm = 9; // Snelheids regeling pwm
const byte PinIn1 = 10; // Trein cw
const byte PinIn2 = 11; // Trein ccw

boolean CwRichting = 0;
boolean CcwRichting = 1;

void setup()
{

  pinMode(Wissel1rPin, OUTPUT);
  pinMode(Wissel1aPin, OUTPUT);
  pinMode(Blok1Pin, OUTPUT);
  pinMode(Blok2Pin, OUTPUT);
  pinMode(Sein1rPin, OUTPUT);
  pinMode(Sein1gPin, OUTPUT);
  pinMode(Sein2rPin, OUTPUT);
  pinMode(Sein2gPin, OUTPUT);
  pinMode(PinPwm, OUTPUT);
  pinMode(PinIn1, OUTPUT);
  pinMode(PinIn2, OUTPUT);
  pinMode(13, OUTPUT);

  digitalWrite(13, LOW);

  Wire.begin(5); // Stelt de communicatie met de master in.
  Wire.onReceive(receiveEvent); // Iets ontvangen van de Master. // <<<<<<<<<
  Wire.onRequest(requestEvent); // Stuur een 5 naar de Master.
 
  setBaanvakStatus(0,1);
}
void loop()
{ //  De loop word niet gebruikt, in plaats daarvan word een Event gebruikt.
}
void receiveEvent(int howMany)
{
  while (Wire.available())
  {
    char I2CByte = Wire.read();

    if (I2CByte == 'A')
    {

      setBaanvakStatus(1, 0); // BloK 1 Vrij geven.

    }
    if (I2CByte == 'a')
    {

      setBaanvakStatus(1, 1); // Blok 1 Bezet melden.

    }
    if (I2CByte == 'B')
    {

      setBaanvakStatus(2, 0); // Blok 2 Vrij geven.

    }
    if (I2CByte == 'b')
    {

      setBaanvakStatus(2, 1); // Blok 2 bezet melden.

    }
    if (I2CByte == '|')
    {

      setWissel(1, 0); // Wissel 1 Rechtdoor.

    }
    if (I2CByte == '/')
    {

      setWissel(1, 1); // Wissel 1 Afbuigend.

    }
 
    // snelheds regeling voor de baanspanning Pwm

    if (I2CByte == '0') {

      if (CwRichting == 0) {

        for (int t = 200; t >= 10; t--) {

          delay(600);
     
          setLocSpeed(1, t, CwRichting);
        }
      }
        if (CwRichting == 1) {

          for (int t = 200; t >= 10; t--) {

            delay(600);

            setLocSpeed(1, t, !CwRichting);
          }
        }
    }
   
    if (I2CByte == '1') {

      if (CwRichting == 0) {

        for (int t = 10; t <= 200; t++) {

          delay(750);

          setLocSpeed(1, t, CwRichting);

        }
      }
     
      if (CwRichting == 1) {

        for (int t = 10; t <= 200; t++) {

          delay(750);

          setLocSpeed(1, t, !CwRichting);

        }
      }
    }
  }
}

  void requestEvent() {

    Wire.write(5); // Stuur een 5 naar de Master.
  }

  void setLocSpeed(byte loc, byte Snelheid, bool Richting) {

    boolean inPin1 = LOW;
    boolean inPin2 = HIGH;

    if (Richting == 1) {

      inPin1 = LOW;
      inPin2 = HIGH;
    }
    else {

      if (Richting == 0) {

        inPin1 = HIGH;
        inPin2 = LOW;
      }
    }

    if (loc == 1) {

      digitalWrite(PinIn1, inPin1);
      digitalWrite(PinIn2, inPin2);
      analogWrite(PinPwm, Snelheid);
    }
  } // Einde functie setLocSpeed

  void setBaanvakStatus(byte Blok, bool Status) {

    if (Blok == 1) {

      if (Status == 1) {

        digitalWrite(Blok1Pin, LOW); // Blok 1 Bezet.

        // Zet de seinen goed
        digitalWrite(Sein1rPin, HIGH);
        digitalWrite(Sein1gPin, LOW);

      }
    }

    if (Blok == 1) {

      if (Status == 0) {

        digitalWrite(Blok1Pin, HIGH); // Blok 1 Vrij.

        // Zet de seinen goed
        digitalWrite(Sein1rPin, LOW);
        digitalWrite(Sein1gPin, HIGH);
      }
    }
    if (Blok == 2) {

      if (Status == 1) {

        digitalWrite(Blok2Pin, LOW); // Blok 2 Bezet.

        // Zet de seinen goed
        digitalWrite(Sein2rPin, HIGH);
        digitalWrite(Sein2gPin, LOW);

      }
    }
    if (Blok == 2) {

      if (Status == 0) {

        digitalWrite(Blok2Pin, HIGH); // Blok 2 Vrij.

        // Zet de seinen goed
        digitalWrite(Sein2rPin, LOW);
        digitalWrite(Sein2gPin, HIGH);
      }
    }
    if (Blok == 0) {

      if (Status == 1) {

        digitalWrite(Blok1Pin, LOW);
        digitalWrite(Blok2Pin, LOW);

        // Zet de seinen goed
        digitalWrite(Sein1rPin, LOW);
        digitalWrite(Sein1gPin, HIGH);

        digitalWrite(Sein2rPin, LOW);
        digitalWrite(Sein2gPin, HIGH);
      }
    }
    if (Blok == 0) {

      if (Status == 0) {

        digitalWrite(Blok1Pin, HIGH);
        digitalWrite(Blok2Pin, HIGH);

        // Zet de seinen goed
        digitalWrite(Sein1rPin, LOW);
        digitalWrite(Sein1gPin, HIGH);

        digitalWrite(Sein2rPin, LOW);
        digitalWrite(Sein2gPin, HIGH);
      }
    }
  } // einde functie setBaanvakStatus

  void setWissel(byte Wnummer, bool Wrichting) {

    if (Wnummer == 1) {

      if (Wrichting == 0) {

        digitalWrite(Wissel1rPin, HIGH);
        delay(750); // Normaal staat de waarde op 500)
        digitalWrite(Wissel1rPin, LOW);
      }
    }

    if (Wnummer == 1) {

      if (Wrichting == 1) {

        digitalWrite(Wissel1aPin, HIGH);
        delay(750); // Normaal staat de waarde op 500)
        digitalWrite(Wissel1aPin, LOW);
      }
    }
  } // einde functie setWissel

@Timo

Bedankt voor je input  (y)

Het millis commando begreep ik al een beetje (controle led), waar ik niet kan achterbomen is  hoe ik meerdere millis commando's in een loop kan  programmeren , Wissel, Optrekken/afremmen enz. ::)

Citaat
En nu we het over pin namen hebben, wat is de taak van SlavePinx ?

SlavePinx word gebruikt om de communicatie tussen AAMS blokkaart(x)  en  AAMS centrale zichtbaar te maken, bij elk commando wat ik naar de AAMS Blokkaart stuur zal de AAMS Blokkaart een ontvangstbevestiging terug sturen naar de AAMS centrale.

Citaat
Ik snap dat een slave tijdens normaal gebruik geen ander adres hoeft te krijgen. Maar wat als je later (als je al 10+ slave modules hebt) opeens toch nog een aanpassing maakt aan de software? Ga je dan:

Als ik het goed heb kan ik 127 slave units met de I2C  gebruiken.
Als ik de software van de AAMS Blokkaart aanpas hoef ik het adres niet te veranderen, komt er een AAMS Blokkaart bij met een nieuw adres, het enigste waar ik een nieuw adres bij moet zetten is in de AAMS centrale.

- Module aan PC
- Programmeren
- Volgende module aan PC
- Programmeren
- Enz

Zoals het bovenstaande lijstje werkt de AAMS sturing via I2C ook , usb stekker in de nano doen, programmeren, volgende nano enz.

Onderstaand word de AAMS Blokkaart aangeroepen.

Wire.begin(5); // Stelt de communicatie met de AAMS centrale in.
  Wire.onReceive(receiveEvent); // Iets ontvangen van de AAMS centrale.
  Wire.onRequest(requestEvent); // Stuur een Adres(5) naar de AAMS centrale en maak dat zichtbaar door een LED.
 


void requestEvent() {

    Wire.write(5); // Stuur een adres(5) naar de AAMS centrale.
  }

De AAMS Blokkaart word vanuit de AAMS Centrale aangestuurd via een  Wire.onReceive(receiveEvent)

Deze routine word in de setup aangeroepen.
De loop routine word ook niet direct gebruikt.

 
  setBaanvakStatus(0,0);
}
void loop()
{
}
void receiveEvent(int howMany)
{

Voor zo ver ik weet kan de millis commando alleen in de loop gebruikt worden, als ik het verkeert heb hoor ik dat wel. ::)

Wat ik begrepen heb van het receiveEvent commando is:

Dat de AAMS Centrale een commando stuurt er in de AAMS Blokkaart een Event word aangeroepen bv. setBaanvakStatus(1,0) deze uitvoert en direct een ander commando kan worden uitgevoerd voordat de vorige commando klaar is.

Het lijkt er sterk op dat een delay(200)  zonder dat de Arduino moet wachten tot de delay(200) is afgelopen andere commando's kan uitvoeren, ik ga dit nog verder testen voordat ik de conclusie trek dat een delay() geen vertragende invloed heeft op de Arduino in een receiveEvent structuur.

Als ik het verkeert begrijp hoor ik dat wel. ::)

Citaat
Voor het serial data tussen PC en master gedoe (en dit kan je dan eigenlijk ook gebruiken op de slaves...)

Ik snap deze opmerking niet helemaal ::) :P

De gedachte achter deze sturing is om met de computer de AAMS Centrale aan te sturen en de centrale neemt de communicatie tussen de diverse AAMS kaarten voor zijn rekening, de AAMS Blokkaarten, Wisselkaarten, enz  werken vervolgens als zelfstandige sturingen die dan bepaalde data (bezet melding) terugsturen naar de AAMS Centrale die deze data weer naar computer stuurt.

Ook wil ik deze sturing kunnen gebruiken met een terminal programma al dan niet via usb(serieel) of via bluetooth.
De seriële communicatie en bluetooth communicatie kan ik met deze sturing gebruiken.

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

Mocht ik jou post verkeert begrepen hebben hoor ik dat graag.
Nogmaals bedankt voor je hulp.

Mvg Paul  ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 04 november 2015, 20:23:26
Hoi Paul,

Okay, ik ga er weer even voor zitten. Veel opmerkingen en vragen dus mag ik ook weer veel tekst en code maken  ;D Ben toch eens benieuwd wanneer het forum gaat roepen dat een post van mij te lang is :p

Welke verwarring bedoelde je? Of bedoel je omdat je verschillende "slaves" wilt maken?

En ga je dan de wissel functie weer van de blokkaart af halen?

Millis is niet zo lastig. Het is overigens niet waar dat je dit alleen in de loop zou kunnen gebruiken. Wat doe je als je een eitje wilt koken en tegelijk de broodjes wilt afbakken? Juist, je zet twee timers (of onthoudt twee tijden). In programma is dat niet anders. Je moet dus meerdere variabele hebben die de verschillende tijden bijhouden.

Hier een voorbeeldje. Dit laat twee ledjes knipperen met twee verschillende intervals. Maar ook nog een met een ander interval voor aan dan voor uit. En nog een derde die aan gaat voor 30 seconden na het indrukken van een knop (en dit lijkt dus al op een wissel ;) )
#include <Bounce2.h>

const byte LedPins[] = {13, 12}; //Pinnen voor de knipper ledjes (even lang aan als uit)
const byte FlasherPin = 10; //Pin voor de flasher, andere aan dan uit tijd
const byte KnopjePin = 9; //Pin voor het drukknopjes (tussen de pin en GND)
const byte TimedLedPin = 8; //Pin voor het ledje wat je an kunt doen met het knopje

const unsigned int LedIntervals[] = {500, 1200}; //aan/uit interval voor led1, led 2 enz
const unsigned int FlasherIntervals[] = {1900, 100}; //1900ms uit, 100ms aan
const unsigned int TimedLedInterval = 30000; //uit na zoveel ms

Bounce knopje;

void setup(){
  //Alle pins met ledjes moeten natuurlijk output zijn
  for(byte i = 0; i < sizeof(LedPins); i++){
    pinMode(LedPins[i], OUTPUT);
  }
 
  pinMode(FlasherPin, OUTPUT); //Flasher ook output
  pinMode(TimedLedPin, OUTPUT);//en deze ook
 
  knopje.attach(KnopjePin, INPUT_PULLUP); //Verbind de pin met het object en zet pull up aan
 
}

void loop(){
  updateLed(0); //Een ledje laten knipperen
  updateLed(1); //En nog één!
 
  updateFlasher(); //En nu nog eentje laten met verschillende aan en uit tijden
 
  timedLedUpdate(); //En nog een ledje (maar zou net zo goed een wissel kunnen zijn ;) ), aan met knop, vanzelf uit
}

//Laat ledjes knipperen. Even lang aan als uit. Werkt voor hoevel ledjes je in LedPins en LedIntervals definieert
void updateLed(byte ledNummer){
  static unsigned long vorigeMillis[sizeof(LedPins)]; //om de laatste keer te onthouden (wanneer keek ik op de klok?)
 
  //Controleer of interval om is. MOET op deze manier
  if(millis() - vorigeMillis[ledNummer] >= LedIntervals[ledNummer]){
    vorigeMillis[ledNummer] = millis(); //sla op dat we weer iets doen
   
    digitalToggle(LedPins[ledNummer]); //Wissel led (HIGH <-> LOW)
  }
}

//functie om een pin te wisselen (LOW <-> HIGH)
void digitalToggle(byte pin){
  digitalWrite(pin, !digitalRead(pin));
}

void updateFlasher(){
  static unsigned long vorigeMillis = 0; //Laate keer iets gedaan, ondertussen bekende variabele ;)
 
  //Checken of het interval om is. We gebruiken een interval voor uit (FlasherIntervals[0]) en een voor aan FlasherIntervals[1]
  //Door dus digitalRead() te bruiken komt hier al 0 of 1 uit al naar gelang of de flasher aan of uit is
  if(millis() - vorigeMillis >= FlasherIntervals[digitalRead(FlasherPin)]){
    vorigeMillis = millis();  //Sla op dat we eits doen
   
    digitalToggle(FlasherPin); //wissel led(HIGH <-> LOW)
  }
}


//Timed ledje, gaat aan met knopje en weer uit na een ingestelde tijd
void timedLedUpdate(){
  static unsigned long ledjeAanMillis = 0;
 
  //Beginnen we met kijken of het knopje is ingedrukt want ja, dan moet het ledje aan
  knopje.update(); //Lees het knopje
 
  //Is het knopje ingedrukt?
  if(knopje.fell() ){
    digitalWrite(TimedLedPin, HIGH); //zet het ledje aan
    ledjeAanMillis = millis();  //sla op wanneer je it gedaan hebt
  }
 
  //nu we dat gedaan hebben, is het misschien tijd om het ledje uit te zetten? Moet hij wel aan staan natuurlijk!
 
  //Staat ledje aan? (Ja, je kan gewoon een digitalRead op een output doen, geen probleem :) )
  if(digitalRead(TimedLedPin)){
    //Ledje is dus aan, maar moet hij al uit?
    if(millis() - ledjeAanMillis >= TimedLedInterval){
      digitalWrite(TimedLedPin, LOW);
    }
  }
}

Ik heb er ook voor gekozen alle "vorigeMillis" variabele onder te brengen in de functie zelf. Ze zijn steeds alleen daar nodig dus is het zinloos ze global te maken. Variabele steeds zo dicht mogelijk declareren waar ze nodig zijn. Omdat ze wel onthouden moeten blijven tussen de verschillende aanroepen van de functies zijn ze static.

Nog een kleine aanvulling. inteerup

SlavePinx zijn duur puur om het voor jou inzichtelijk te maken? Denk ook hier eens aan een array. Meer dezelfde dingen (meerdere SlavePin) kunnen makkelijker in een array. Scheelt je veel code typen ;) Zelfde voor je sein en wissel pinnen.

Let er overigens op dat je variabele in de functie declaraties geen constanten zijn. De hoofdletters zijn daar dus ongewenst.
Niet void setWissel(byte Wnummer, bool Wrichting)
Maar void setWissel(byte wNummer, bool wRichting)
Maar je doet dit eigenlijk steeds in elke functie declaratie. Het zou wel gewoon werken maar die hoofdletter is er eigenlijk voor jou als geheugensteun dat het een constante is en dat je deze niet niet zou kunnen aanpassen.

Ook heb je in de blokkaart:
void setWissel(byte Wnummer, bool Wrichting) {

  if (Wnummer == 1) {

    if (Wrichting == 0) {

      digitalWrite(Wissel1rPin, HIGH);
      delay(750); // Normaal staat de waarde op 500)
      digitalWrite(Wissel1rPin, LOW);
    }
  }

  if (Wnummer == 1) {

    if (Wrichting == 1) {

      digitalWrite(Wissel1aPin, HIGH);
      delay(750); // Normaal staat de waarde op 500)
      digitalWrite(Wissel1aPin, LOW);
    }
  }
} // einde functie setWissel
De check Wrichting == 1 is nogal overbodig. Als het niet 0 is zoals al gecontroleerd dan moet wel 1 zijn ;) De tweede Wnummer == 1 is ook niet nodig.
Dus:
void setWissel(byte Wnummer, bool Wrichting) {

  if (Wnummer == 1) {

    if (Wrichting == 0) {

      digitalWrite(Wissel1rPin, HIGH);
      delay(750); // Normaal staat de waarde op 500) <--------------- Dit is dus typisch iets om een const variabele voor aan te maken!
      digitalWrite(Wissel1rPin, LOW);
    }
    else{

      digitalWrite(Wissel1aPin, HIGH);
      delay(750); // Normaal staat de waarde op 500)
      digitalWrite(Wissel1aPin, LOW);
    }
  }
} // einde functie setWissel
En nu nog zonder delay  ;D

En eigenlijk doe je zo'n zelfde redundant ding met je CwRichting en CcwRichting. Het is nogal dubbel werk om beide bij te houden. Zou hetzelfde zijn als je op gaat schrijven dat het waar is dat je je glas leeg hebt gedronken en ook opschrijft dat het niet waar is dat je je glas niet hebt opgedronken. Je kan af met 1 variable, bijvoorbeeld cwRichting. Ook hier zonder grote C omdat het geen const is.

In je centrale maak je de globals char Slave en char I2CByte aan. Buiten dat ze geen const zijn dus kleine letter (en weer, die hoofdletter zou juist een geheugensteun voor JOU moeten zijn ;) ) gebruik je ze ook maar in één functie en hoeft het tussen de verschillende runs van die functie (loop() in dit geval) ook niet onthouden te worden. Je kan ze dus beter maken in de fucntie zelf (loop() ). En voor voor beide doe je dit ook! In loop staat namelijk bijvoorbeeld:
char Slave = Wire.read(); // receive a byte as character
Hiermee maak je gewoon een lokale variabele Slave aan. In je code heb je dus twee verschillende variabele die beide Slave heten maar verschillende waardes hebben! Alleen wordt bij het aanroepen steeds eerst gekeken of een variabele lokaal gevonden kan worden, zo niet wordt global gekeken.

Hieronder een voorbeeld om dat duidelijk te maken.
int myVar = 1;

void setup(){
  Serial.begin(115200);
}

void loop(){
  int myVar = 50;
 
  Serial.println(myVar); //print de lokale variabele
  Serial.println(::myVar); //print de global variabele (geef je aan met de :: )
  delay(1000);
}
Dit zal elke seconde
50
1
printen in de serail monitor. Het zijn dus echt twee variabele!

Als ik het goed heb kan ik 127 slave units met de I2C  gebruiken.
Klopt, het adres van een I2C is 7 bits lang en 0 mag niet gebuikt worden => houd je 127 over. Let wel dat je LCD hier dus ook al een adres van inpikt.

En dan door op de adressen. Je hebt
Wire.begin(5); // Stelt de communicatie met de AAMS centrale in.
Waarom is dit niet een variabele? Want later wil je die 5 weer gebruiken.

En dan waar je hem later gebruikt, je stuurt het terug aan de centrale. Maar dit zou niet perse het adres hoeven zijn. Aangezien je de request al aan het juiste adres. Iedere vorm van ACK zou dus okay zijn. En misschien is het commando terug koppelen wel de beste ACK zijn, dan pas weet je het 100% zeker. ;)

En dan over het programmeren. Als jij al 10 blokkaarten hebt en je past toch de code aan (uitbreiding of misschien bugfix) dan zal je nu steeds het I2C adress van alle modules moeten aanpassen. De handeling wordt dan:
- Module aan PC
- Juiste adres instellen in de code
- Programmeren
- Volgende module aan PC
- Juiste adres instellen in de code
- Programmeren
- Enz

Met het stukje code wat ik gaf hoe je dat alleen de eerste keer te doen. Daarna staat het adres "vast" in het EEPROM en zal dus bewaard blijven. Het adres in de code doet er dan niet meer toe (tenzij je met #define FORCEER_NIEUW_ADRES aangeeft dat je een nieuw adres wilt geven) en hoef je deze dus bij het herprogrammeren niet steeds aan te passen voor elke module die je aankoppelt. Je kan gewoon steeds gelijk op "Upload" klikken zonder ook maar iets in de code te wijzigen, adres komt toch wel uit EEPROM. Maakt het leven weer wat makkelijker.

Het lijkt er sterk op dat een delay(200)  zonder dat de Arduino moet wachten tot de delay(200) is afgelopen andere commando's kan uitvoeren,
Ik zie even niet welke delay je bedoelt (zie geen delay(200) ). Maar ja, de library zal je volgende commando wel afvangen (heeft niet voor niet een buffer van 32 bytes) maar zal deze pas uitvoeren als de delay over is.

Sterker nog, de onReceive en onRequest zijn interrupt functies. Deze zullen de normale functies inderdaad direct onderbreken om de taken uit te voeren. Dus ook een delay in de loop (of andere functies die vanuit de loop worden aangeroepen). Maar ze zullen elkaar of zichzelf niet onderbreken. De volgende onReceive kan pas beginnen als de huidige is afgelopen. Dus staat daar een delay in dan wordt die gewoon afgewacht.

En nog sterker, de Wire library zal de I2C bus pas vrijgeven als de hele functie voor onRequest of onRecive is afgerond. Heb je daar dus een delay staan wordt de I2C lijn al die tijd bezet gehouden  :-\ En dat is zelfs zo erg dat de master/centrale die met een Wire.write() of Wire.requestFrom() daar zal blijven wachten omdat de Wire.write() en Wire.requestFrom() pas stoppen als de I2C slave de bus weer vrij geven! Je delay dendert dus zelfs door naar de master/centrale  ::) ::) ::)

Hieruit kan je twee dingen leren:
1) Die delays zijn echt ongewenst  8)
2) De Wire llibrary laat beetje te wensen over (maar goed, is verder wel mee te werken)
3) Je wilt interrupts zo snel mogelijk afhandelen en weer door. Beter zou dus zijn om bij Wire.onReceive () het daar verstuurde commando op te slaan, een flag (bool nieuwCommando) te zetten om aan te geven dat je een nieuw commando hebt en dan gelijk de onReceive() te verlaten. Vervolgens kijk je in de loop() steeds of je een nieuw commando hebt ontvangen, zo ja, lees je het commando en voer je de juiste taak uit.

Nu gaf je aan dat Engels een beetje een probleem is maar hierbij toch twee linkjes. Misschien zijn ze dan wat lastig te lezen maar geven wel weg waar het om draait. Google Translate kan denk ik al een heel eind helpen.

Over het laatste stuk over de communicatie tussen PC en centrale (eigenlijk dus het protocol) kom ik later nog op terug. Dit gaat denk ik makkelijker als ik hier ook een stukje code als voorbeeld/opzet voor maak. Maar ik heb al genoeg code en tekst geschreven (meer dan een uur verder) dus ik plaats eerst dit eens. Misschien dat ik vanavond of morgen dat nog kan doen.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 05 november 2015, 23:32:22
Hoi volgers,

Ik ben verder gaan zoeken naar een goede manier om een Serial communicatie wat makkelijker te maken.

Ik heb het volgend programma gemaakt, de vraag is gaat dit werken, een droge test met LEDS werkt goed,
afgezien van het feit de de poorten actief hoog zijn, terwijl ik de poorten actief laag wil hebben,
zet ik de poorten in de setup op LOW dan werk het geheel niet. ??? :P


Programmeer code :

byte BlokPin[] = {11, 10, 9, 8};
byte State;
//int current;

void setup() {
 
  pinMode(BlokPin[0], OUTPUT);
  pinMode(BlokPin[1], OUTPUT);
  pinMode(BlokPin[2], OUTPUT);
  pinMode(BlokPin[3], OUTPUT);
 
 
  Serial.begin(9600);
}

void loop() {

  if (Serial.available() > 0) {
   
    if (Serial.peek() == 'A') {
      Serial.read();
      State = Serial.parseInt();
      Serial.read();
      digitalWrite(BlokPin[0], State);
    }
    if (Serial.peek() == 'B') {
      Serial.read();
      State = Serial.parseInt();
      digitalWrite(BlokPin[1], State);
    }
    if (Serial.peek() == 'C') {
      Serial.read();
      State = Serial.parseInt();
      digitalWrite(BlokPin[2], State);
    }
    if (Serial.peek() == 'D') {
     
      Serial.read();
      State = Serial.parseInt();
      digitalWrite(BlokPin[3], State);
     
    }
    while (Serial.available() > 0 ) {
      Serial.read();
    }
  }
}

@Timo

Bedankt voor je input!  (y)

Ik heb nog een heel klein vraagje Kan ik de code van de millis ook in een Event routine gebruiken, zoals ik die in de Blokkaarten gebruik. ::)
De bovenstaande code (stiekem afgekeken en aangepast :-X ;D), is dat een goede stap in de juiste richting ,
of zoek ik het in een verkeerde hoek? ::) ,of maak ik het mij zelf weer moeilijk ::) :P

Ik hoor het wel, commentaar/meedenken  is altijd welkom. ;D

Mvg Paul  :D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 10 november 2015, 11:26:16
Hoi Paul,

millis() kan je werkelijk overal toepassen. Alleen zorg wel dat je event routines voor wire kort zijn. Misschien zou ik ze zelf niet eens gebruiken maar het gewoon met Wire.available() controleren.

Het is een stap in de goede richting! Alleen dat gedoe met parseInt() is nogal omslachtig. Beste is gewoon te stoppen met het versturen van getallen als ASCII op de computer. Maar stuur gewoon één byte. Een byte heeft van zichzelf al 256 mogelijkheden. Terwijl als je het met ASCII doet je 3 bytes aan het versturen bent (met maar 10 mogelijke waardes) en vervolgens doe je op de Arduino weer alle moeite er een byte van te maken. Dus ik weet niet hoe de code van het programma er uit ziet maar het kan nooit lastig zijn die aan te passen tot het zenden van een byte.

Je krijgt dan iets als
byte BlokPins[] = {11, 10, 9, 8};

void setup() {
 
  for(byte i = 0; i < sizeof(BlokPins); i++){
    pinMode(BlokPins[i], OUTPUT);
  }
 
  Serial.begin(9600); //tijd voor 115200?
}

void loop() {
  checkIngekomenSerial();
 
}

void checkIngekomenSerial(){
  // Ga dan uit dat de serial commando's eruit zien als
  // [commando letter] [adres]
  // Waarbij ieder [] één byte is. Dus geen adressen in ASCII zenden ;)
  if (Serial.available() >= 2) {   
    switch(Serial.read()){
      case 'W':
        //Schakel een wissel recht
        //Ga even uit dat de functie schakeWissel(wisselnummer, richting) bestaat
        schakelWissel(Serial.read(), RECHT);
        break;
      //schakel een wissel afbuigend
      case 'w':
        schakelWissel(Serial.read(), AFBUIGEN);
        break;
      //Maak blok vrij
      case 'b':
        setBlok(Serial.read(), VRIJ);
        break;
      case 'B':
        setBlok(Serial.read(), BEZET);
        break;
    }
  }
}

Zie je ook gelijk dat een for loopje lekker makkelijk is om alle pinnen van een array goed te zetten ;)

Verder zat ik te denken. Op zich is er geen noodzaak om netjes op nummerende adressen te hebben voor wissels, blokken enz. Waarom stuur je vanuit de PC niet gewoon een I2C adres en een "device adres" (nummer hoeveel op de blokkaart). Dus
[commando letter] [module/I2C adres] [device adres]
Alles tussen de [] is steeds één byte.

Voorbeeld om wissel 1 op module 28 recht te zetten zou dan zijn:
[W] [28] [1]

Nadeel is dat je twee adressen op moet slaan in je programma... Voordeel is wel dat je flexibel bent met hoeveel wissels er aan één module hangen.

Andere optie zou zijn om een vast bereik te bedenken, bijvoorbeeld 8 wissels per module. Wissel 140 is dan automatisch module 140 / 8 = 17 en wissel 140 % 8 = 4.

In ieder geval, code zou dan iets kunnen zijn als
byte BlokPins[] = {11, 10, 9, 8};

const unsigned int SerialInterval = 200;

void setup() {
 
  for(byte i = 0; i < sizeof(BlokPins); i++){
    pinMode(BlokPins[i], OUTPUT);
  }
 
  Serial.begin(9600); //tijd voor 115200?
}

void loop() {
  checkIngekomenSerial();
 
}

void checkIngekomenSerial(){
  static unsigned int lastCommandMillis = 0;
  unsigned int nowMillis = millis();
 
  // Ga dan uit dat de serial commando's eruit zien als
  // [commando letter] [module adres] [device adres]
  // Waarbij ieder [] één byte is. Dus geen adressen in ASCII zenden ;)
 
  //Kijk of er een commando is binnen gekomen
  if(Serial.available() >= 3){
    //Okay, 3 byte dus een commando, update de tijd dat er een geldig commando was
    lastCommandMillis = millis();
   
    //Eerst commando van 3 bytes even opslaan
    for(byte i = 0; i < 3; i++){
      laatsteCommando[i] = Serial.read();
    }
   
    //Nu over I2C versturen
    Wire.beginTransmission(laatsteCommando[1]); //bevat het adres
    Wire.write(laatsteCommando[0]); //type commando
    Wire.write(laatsteCommando[2]); //device adres
    Wire.endTransmission();         //En de bus sluiten
  }
 
  //Is het anders tijd voor het legen van de buffer?
  //Gebeurd als er SerialInterval lang geen geldig commando is ontvangen
  else if(Serial.available() && (nowMillis - lastCommandMillis >= SerialInterval){
    while(Serial.available()){
      Serial.read();
    }
  }
 
  //Om te zorgen dat de buffer niet geleegd word als we na een lange tijd weer beginnen met het zenden van een commando
  //updaten we de tijd ook als de buffer gewoon leeg is. Kan ook gezien worden als geldig
  //commando voor do niets ;)
  else if(!Serial.available()){
    lastCommandMillis = millis();
  }
}

Dit stuurt dan ook alle binnengekomen data door naar de juiste slave en slaat het ook nog lokaal op voor gebruik op de master.

Ook zit er een voorbeeldje in om de buffer van serial te legen als er te lang geen commando is ontvangen bijvoorbeeld omdat het PC programma herstart is enz. Omdat ik daar nu een waarde van 200ms heb gebruikt is het wel noodzaak dat checkIngekomenSerial vaker dan eens elke 200ms gedaan wordt. Met andere woorden, geen delay ;)

Maw, keuzes. Hoe wil jij de nummering van de modules / wissels / blokken / seinen enz gaan doen?


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 03 januari 2016, 00:55:07
Hoi Volgers,

Allereerst wens ik jullie en goed en mooi 2016 toe. (y)

@Timo, bedank voor je input

Ik krijg het onderstaand programma niet werkend.

Als ik bv W1 invoer gebeurd er niets, ik heb de code uitgebreid met de twee functie's zoals je in het voorbeeld heb gezet, wat doe ik fout ???.

Het voorbeeld programma :

Citaat
byte BlokPins[] = {11, 10, 9, 8};

void setup() {
 
  for(byte i = 0; i < sizeof(BlokPins); i++){
    pinMode(BlokPins, OUTPUT);
  }
 
  Serial.begin(9600); //tijd voor 115200?
}

void loop() {
  checkIngekomenSerial();
 
}

void checkIngekomenSerial(){
  // Ga dan uit dat de serial commando's eruit zien als
  // [commando letter] [adres]
  // Waarbij ieder [] één byte is. Dus geen adressen in ASCII zenden ;)
  if (Serial.available() >= 2) {   
    switch(Serial.read()){
      case 'W':
        //Schakel een wissel recht
        //Ga even uit dat de functie schakeWissel(wisselnummer, richting) bestaat
        schakelWissel(Serial.read(), RECHT);
        break;
      //schakel een wissel afbuigend
      case 'w':
        schakelWissel(Serial.read(), AFBUIGEN);
        break;
      //Maak blok vrij
      case 'b':
        setBlok(Serial.read(), VRIJ);
        break;
      case 'B':
        setBlok(Serial.read(), BEZET);
        break;
    }
  }
}
 

Ik hoop dat je me daar nog eens mee wil helpen,  alle hulp welkom.

@Allen

Het is alweer een tijd geleden dat ik wat in mijn draadje hebt gezet.
Ik ben nog steeds bezig met mijn AAMS sturing, er zijn al diverse projecten in dit topic gezet met betrekking tot het AAMS systeem.(zie dit draadje)

Het laatste project was om meerdere Arduino nano's met elkaar te communiceren via I2C, het werkte goed en de communicatie tussen de Arduino nano's ging verrassend simpel, het nadeel van die constructie was dat naarmate er meer Arduino nano's bij werden gemaakt  werd het op een gegeven moment onoverzichtelijk.

(https://images.beneluxspoor.net/bnls/IMG_20151114_093249.jpg) (https://images.beneluxspoor.net/bnls/IMG_20151114_093249.jpg)

Ik ben weer even gaan zoeken in mijn onderdelen kwam ik in een verloren hoekje ::) een AT MEGA 2650 met een L293 motorshield,  wat losse relais en wat sensor printjes tegen en een 2x16 LCD, ik kreeg meteen het idee dat ik daar wel eens een Modelbaan sturing "AAMS" mee kon maken, zo gedacht zo gedaan :P

Het voordeel van een mega 2650 is de overvloed aan i/o pins.

16 analog in.
53 digital in/out
4 hardwarematig Seriële poorten Rx/Tx

Het L293 motorshield bevat vier sturingen voor een dc motor met een max van 600 mA per motor uitgang, dat is voldoende om een n-spoor loc te laten rijden

3x een IR sensor ,twee gebruikt.

Daar kan ik wel wat mee, om een eenvoudige AAMS sturing mee te maken.

Het eerste resultaat.

(https://images.beneluxspoor.net/bnls/IMG_20151230_231635.jpg) (https://images.beneluxspoor.net/bnls/IMG_20151230_231635.jpg)

Het motorshield l293 maakt gebruik van adafruit motorshield library, deze library heb ik aangepast voor mijn eigen sturing, deze library in nog niet voledig aangepast maar zoveel dat ik er een AAMS sturing mee kan maken.
Op de foto zijn de IR Sensoren nog niet aangesloten.

Ik heb ondertussen een redelijk goede sturing, alleen moet ik nog wat sleutelen aan het optrekken van de trein, ook aan de sensoren moet nog wel wat gesleuteld worden.

De sensoren werken nu als volgt : als beide sensoren een lagere waarde hebben dan 60 zal de trein stoppen en de seinen op rood springen, zolang de sensoren een hogere waarde meten dan 230 zal de trein blijven rijden.

Een filmpje van deze werkende sturing https://youtu.be/XLGttOrHeEY
 
Mocht er nog interesse in mijn "Hobby" programma zijn hoor ik dat wel en zal het op het forum zetten.

Mvg Paul  ;D


 
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 03 januari 2016, 16:14:27
Hoi Paul,

Allereerst de beste wensen! Leuk om te zien dat het ook in 2016 weer door gaat ;)

Misschien kan je je code op PastBin (http://pastebin.com/) zetten? Voor grote lappen code wat overzichtelijker, mede omdat je Syntax Highlighting (C++) aan kunt zetten.

Zelf nog even naar de code gekeken. (Overigens, let er op dat je code op eht forum in [code ] tags zet en niet in [quote ] tags. Zie je wat er nu gebeurd is?  ;) ) Je moet wel bedenken dat het steeds een soort pseudo code is en alleen de basis weergeeft en je de rest nog aan moet vullen. Ik heb het even aangevuld tot werkende code. De functies die ik gemaakt hebt stuurt het alleen terug naar de computer.

PastBin (http://pastebin.com/UF2n2gRd)
byte BlokPins[] = {11, 10, 9, 8};

#define RECHT     0
#define AFBUIGEN  1
#define VRIJ      0
#define BEZET     1

void setup() {
 
  for(byte i = 0; i < sizeof(BlokPins); i++){
    pinMode(BlokPins[i], OUTPUT);
  }
 
  Serial.begin(115200); //tijd voor 115200?
}

void loop() {
  checkIngekomenSerial();
 
}

void checkIngekomenSerial(){
  // Ga dan uit dat de serial commando's eruit zien als
  // [commando letter] [adres]
  // Waarbij ieder [] één byte is. Dus geen adressen in ASCII zenden ;)
  if (Serial.available() >= 2) {   
    switch(Serial.read()){
      case 'W':
        //Schakel een wissel recht
        //Ga even uit dat de functie schakeWissel(wisselnummer, richting) bestaat
        schakelWissel(Serial.read(), RECHT);
        break;
      //schakel een wissel afbuigend
      case 'w':
        schakelWissel(Serial.read(), AFBUIGEN);
        break;
      //Maak blok vrij
      case 'b':
        setBlok(Serial.read(), VRIJ);
        break;
      case 'B':
        setBlok(Serial.read(), BEZET);
        break;
    }
  }
}


void schakelWissel(byte address, bool state){
  Serial.print("Wissel ");
  Serial.print(address);
  if(state){
    Serial.println(" afbuigen");
  }
  else{
    Serial.println(" recht");
  }
}

void setBlok(byte address, bool state){
  Serial.print("Blok ");
  Serial.print(address);
  if(state){
    Serial.println(" bezet");
  }
  else{
    Serial.println(" vrij");
  }
}

Dit werkt prima. Open ik Serial Monitor en type ik W1[enter] krijg ik netjes terug "Wissel 49 recht". Dat het 49 is ipv één komt omdat de Serial Monitor altijd alles stuurt in ASCII, ook de getallen. Het teken '1' heeft de byte waarde 49. Jij stuurt je boodschappen niet met Serial Monitor maar met je programma dus kan jij makkelijk het wel als byte over sturen. Gebruik ik CoolTerm of RealTerm dan kan ik wel netjes [W][1] als twee losse bytes sturen en krijg ik netjes "Wissel 1 recht"

Als je meer code publiceert (zowel de Arduino als de PC) zou ik het er wel netjes in kunnen schrijven. In dit voorbeeld is er bijvoorbeeld geen fout afhandeling ofzo. Iets wat ik in het voorbeeld erna wel (hoewel basic) heb toegevoegd.

En om het netjes te krijgen zou het helpen als je een aantal dingen op een printje zou solderen :) Heb je minder DuPond draadjes nodig enzo.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 09 januari 2016, 21:15:28
Hoi volgers,

@Timo

Bedankt voor je input.

Helaas krijg ik deze routine niet werkend, ik zie de gegevens wel op het scherm verschijnen.
Maar een schakel opdracht word er niet gegeven ,althans maar gedeeltelijk, zie voorbeeld code.
Geef ik nu w2 in gaat het ledje branden, deze is hetzelfde als w1 poort 11, ASCII code geeft het wel goed aan.

Ik heb verschillende programmeercode gebruikt maar het lukt mij niet om de juiste ledjes (lees wissels) aan te sturen, het programma stuurt constant dezelfde led (lees wissel) aan.

Ik zal wel wat over het hoofd zien ::)

byte BlokPins[] = {11, 10, 9, 8};//worden voor testen gebruikt voor blok en wissels

#define Recht     0
#define Afbuigen  1
#define Vrij      0
#define Bezet     1
//char MyString;
void setup() {

  for (byte i = 0; i < sizeof(BlokPins); i++) {
    pinMode(BlokPins[i], OUTPUT);
  }

  Serial.begin(115200); //tijd voor 115200?
}

void loop() {
  checkIngekomenSerial();

}

void checkIngekomenSerial() {
  // Ga dan uit dat de serial commando's eruit zien als
  // [commando letter] [adres]
  // Waarbij ieder [] één byte is. Dus geen adressen in ASCII zenden ;)

  //while (Serial.available() >= 2) {
  if (Serial.available() >= 2) {

    //char MyString = Serial.read();

    //if(MyString == 'W1') {
    // setWissel(MyString, Recht);
    // }
    // if(MyString == 'w1'){
    //    setWissel(MyString, Afbuigen);
    // }
    //}
    switch (Serial.read()) {
      //switch (MyString) {


      //schakel een wissel recht
      case 'W':
        //case 'W1':

        setWissel(Serial.read(), Recht);
        //setWissel(MyString, Recht);

        break;

      //schakel een wissel afbuigend
      case 'w':
        //case 'w1':
        setWissel(Serial.read(), Afbuigen);
        //setWissel(MyString, Afbuigen);

        break;

      //Maak blok vrij
      case 'b':
        setBlok(Serial.read(), Vrij);

        break;

      case 'B':
        setBlok(Serial.read(), Bezet);

        break;
    }
  }
}


void setWissel(byte address, bool state) {

  //char MyString = Serial.read();
  //for(byte i = 0; i< sizeof(BlokPins); i++){ // ik gebruik BlokPins ook voor de wissels om makkelijk te testen.
 

  Serial.print("Wissel ");
  Serial.print(address);
  if (state) {
    Serial.println(" Afbuigen");

    digitalWrite(Serial.read(), state);
    //digitalWrite(MyString, state);
    //digitalWrite(address,state);// Deze werkt niet
  }
  else {
    Serial.println(" Rechtdoor");

    digitalWrite(Serial.read(), state);
    //digitalWrite(MyString, state);
    //digitalWrite(address,state);// Deze werkt niet
  }
}
//}

void setBlok(byte address, bool state) {

  Serial.print("Blok ");
  Serial.print(address);
  if (state) {
    Serial.println(" bezet");
  }
  else {
    Serial.println(" vrij");
  }
}
 

ik had de programmeercode expres tussen
Citaat
;D
gezet, het was alweer een tijd geleden dat jij dit geschreven had, wisten we waar het over ging. ;D

Ik heb de programmeercode van het AAMS programma voor de at Mega 2650 op PastBin gezet.
http://pastebin.com/3grW2GGb (http://pastebin.com/3grW2GGb)

Let op! Deze code is alleen geschikt voor de at Mega 2650

Als alle componenten goed werken soldeer ik het op een printplaatje.

De led's worden aangestuurd door een ULN2803A driver ic. (kan ik evt ook seinen kopen met gloeilampjes)

Mvg Paul  ;D


Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 11 januari 2016, 14:51:36
Hoi Paul,

Je probleem zit hem in twee dingen. Allereerst handelt checkSerial() lekker centraal alle seriële data. Maw, dat hoef je in setWissel() niet meer te doen, daar heb je alle info die je nodig hebt, state en het adress.

Zie deze code:
const byte BlokPins[] = {11, 10, 9, 8};//worden voor testen gebruikt voor blok en wissels
const byte WisselPins[][2] = {{13, 14}, {15, 16}}; //wissel pinnen

#define Recht     0
#define Afbuigen  1
#define Vrij      0
#define Bezet     1

void setup() {

  for (byte i = 0; i < sizeof(BlokPins); i++) {
    pinMode(BlokPins[i], OUTPUT);
  }
 
  for(byte i = 0; i < sizeof(WisselPins); i++){
    pinMode(WisselPins[i][Recht], OUTPUT);
    pinMode(WisselPins[i][Afbuigen], OUTPUT);
  }

  Serial.begin(115200); //tijd voor 115200?
}

void loop() {
  checkIngekomenSerial();

}

void checkIngekomenSerial() {
  // Ga dan uit dat de serial commando's eruit zien als
  // [commando letter] [adres]
  // Waarbij ieder [] één byte is. Dus geen adressen in ASCII zenden ;)
 
  if (Serial.available() >= 2) {
    switch (Serial.read()) {

      //schakel een wissel recht
      case 'W':
        //case 'W1':
        setWissel(Serial.read(), Recht);
       
        break;

      //schakel een wissel afbuigend
      case 'w':
        //case 'w1':
        setWissel(Serial.read(), Afbuigen);
       
        break;

      //Maak blok vrij
      case 'b':
        setBlok(Serial.read(), Vrij);

        break;

      case 'B':
        setBlok(Serial.read(), Bezet);

        break;
    }
  }
}


void setWissel(byte address, bool state) {
  /*
  Hier doe je niets meer met serial. Alle gegeven die je nodig hebt zijn al uit serial gehaald
  en als parameter meegegeven aan deze functie.
  */
  //Even compenseren voor ASCII. Werkt alleen voor 1 t/m 9.
  //GEEN oplossing dus. Beter en simpeler om een echte byte te sturen maar dat doet de serial monitor niet
  address -= '1';
 
  Serial.print("Wissel ");
  Serial.print(address);
 
  if (state) {
    Serial.println(" Afbuigen");

    digitalWrite(WisselPins[address][0], state);
  }
  else {
    Serial.println(" Rechtdoor");

    digitalWrite(WisselPins[address][0], state);
  }
}


void setBlok(byte address, bool state) {

  Serial.print("Blok ");
  Serial.print(address);
  if (state) {
    Serial.println(" bezet");
  }
  else {
    Serial.println(" vrij");
  }
}
Dit geeft al een beetje aan hoe je dus de data kunt gebruiken. Hiermee kun je dus met "w1" en "W1" het ledje op pin 13 aan en uit zetten. (En met 2 die op pin 15.)

Maar dan kom je bij probleem twee, een wissel heeft twee uitgangen die een puls moeten krijgen. Niet zoals nu een commando voor aan en een commando voor uit. Je zou domweg een delay() kunnen gebruiken maar hier wil je nu juist vanaf  ;) Je zal dus een methode moeten schrijven om dat te laten gebeuren.

Ook is de manier van serial data ontvangen nog niet heel robuust. oa blijft een los gestuurde byte (misschien stopte je het programma na 1 byte) in het geheugen staan. Hoe dit op te lossen had ik al laten zien.

Hierbij een implementatie van de meer robuuste serial afhandeling en een manier hoe non-blocking (dus zonder delay) de wissels aan te sturen met een ringbuffer. Voordeel van de ringbuffer is dat het daarmee eenvoudig is het zo te maken dat steeds maar één wissel is bekrachtigd. Ook heb je nu maar één timer nodig hiervoor. En doordat steeds maar één wissel, of sterker nog, één spoel tegelijk is aangestuurd kan je ook nooit per ongeluk beide spoelen van één wissel bekrachtigen.

Nadeel is natuurlijk dat de buffer vol kan raken (maar goed, zo kan de serial buffer). In het voorbeeld heb ik een buffer van 8 wissels gemaakt en de schakeltijd op 200ms gezet. Je moet dus meer dan 8 wissels in 200ms aansturen wil de buffer vol raken.

De code is te vinden op PastBin (http://pastebin.com/LW6L6uA5)

Nog een kleine toevoeging. Ik doe nu (overigens schakelbaar met de macro DEBUG_SERIAL_MONITOR) het adres compenseren met '1'. Op deze manier kan je het testen in Serial Monitor door gewoon de ASCII string W1 te sturen. Hoewel dit werkt voor testen is dit geen oplossing. Het werkt alleen maar tot wissel 9 omdat in ASCII 10 overgestuurd wordt als twee bytes. Beter is dus om vanuit de software echt een byte te sturen als adres en niet het adres als ASCII.

Overigens nog een opmerking over de Mega code. Maak het jezelf nu eens makkelijk!  ;D ;D ;D ;D ;D Stop met het gebruik van pinnummers in je code. Gebruik een logische naam en gebruik die. Makkelijker te onthouden en daarna ook op één centrale plek aan te passen.

Want het is dat je hier:
      digitalWrite(22, 1); // Blok 1 Bezet
      digitalWrite(23, 0); // Blok 2 Vrij
      digitalWrite(24, 0); // Blok 3 Vrij
      digitalWrite(25, 0); // Blok 4 Vrij
      digitalWrite(26, 0); // Blok 5 Vrij
      digitalWrite(27, 0); // Blok 6 Vrij
      digitalWrite(28, 0); // Blok 7 Vrij
      digitalWrite(29, 1); // Blok 8 Bezet
Commentaar bij hebt gezet maar anders had ik geen flauw idee wat je deed. Terwijl
//Maak juiste blokken bezet, rest vrij
for(byte i = 0; i < sizeof(BlokPins); i++){
  if(i == 0 || i == 7){
    digitalWrite(BlokPins[i], Bezet);
  }
  else{
    digitalWrite(BlokPins[i], Vrij);
  }
}
of met minder code  ;)
//Maak juiste blokken bezet, rest vrij
for(byte i = 0; i < sizeof(BlokPins); i++){
  digitalWrite(BlokPins[i], (i == 0 || i == 7));
}
al duidelijk is met één regel commentaar. En ik vermijd hier om de bloknummers te noemen in het commentaar. Zou ik deze namelijk later wijzigen heb ik makkelijk code en commentaar die iets anders vertellen. Dit terwijl al makkelijk uit de code af te leiden is welke blokken vrij/bezet moeten zijn. Overigens doet deze code niet wat de print naar serial doet vermoeden  ::)

Daarnaast maak je het jezelf ook makkelijker door ditIsEenVariabele te gebruiken en DitIsEenConstanteVariabele (dus beginnende met een hoofdletter) voor const gedefinieerde te reserveren. Zo geeft de naam weg of je het kunt wijzigen of niet. Wat je doet is absoluut niet fout hoor, maar het is gewoon een programmeersteuntje die het (als je het gewend bent) makkelijker maakt.  ;)

Goed, dat was weer een hele lap tekst maar hopelijk maakt het veel duidelijk en heb je er wat aan.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Te 2/2 op 11 januari 2016, 16:18:35
Ik volg dit draadje al een tijdje. Als ik het goed begrijp ben je nu aan je derde arduino hardware poging begonnen, de nano, die voordelen heeft boven de twee eerder geteste boards.

Als analoog rijder (zonder verstand van arduino, maar wel met IT-achtergrond) ben ik aan de andere kant begonnen. Domweg met relais-blokbesturing met een binaire boomstructuur als basisaanpak. Daarbij beschouw ik een trein als een pointer naar een dubbelgelinkte lijst van relais. Iemand raadde me aan om eens naar Arduino te kijken als een mogelijkheid om de hardware niet alleen te laten doen wat moet, maar ook om daar software matig grip op te houden.

Vandaar mijn interesse in dit project. Ik ben nieuwsgierig naar jouw aanpak. Al weet ik nog niet zeker of ik dit zelf ook zo zou willen doen. En ik probeer iets op te steken over de omgang van arduino met relais. Er zijn van die insteekkaartjes met 8 of 16 relais, uno's? Stel je hebt 16 bordjes met 8 relais, hoeveel io-pins ben je dan daaraan kwijt?
Ik begrijp uit de reacties van o.a. Timo dat je zaken veel efficiënter kunt benutten dan 2 pins per relais, dat je soms beter geen relais kunt gebruiken, ... Ik ben benieuwd.
Er moet ook een reden zijn om meerdere relais op een uno te monteren, en daar moet ook profijt uit zijn te slaan. Maar hoe? Ze maken ze, dus zal er wel een handleiding voor zijn.
 
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 11 januari 2016, 16:46:05
Hoi Jan Willem,

Die standaard relais bordjes die je kan kopen op eBay hebben gewoon 1 pin per relais nodig. Ik heb ze nog niet gezien met een bi-stabiel relais. Dus 16 bordjes met 8 relais maakt gewoon 8 x 16 = 128 pinnen nodig. Nu zou je IO expention's kunnen gebruiken zoals de PCF8574 (http://www.ebay.nl/itm/131555938449?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT). (Volgens mij is dat ook die gebruikt wordt in veel 16x4 LCD drivers...) Maarja, aan de andere kant kost zo'n ding net zo veel als een Arduino Pro Mini  ;D En dan krijg je meer dan 8 pinnen erbij. Dus ik zou denk ik zelf eerder voor een mooi modulair systeem gaan met meerdere Pro Mini's in veel gevallen.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Reinout van Rees op 11 januari 2016, 19:28:37
Arduino's koppelen: dat ben ik van plan. Ik zit nog met één vraag wat dat betreft: kan je arduino's rechtstreeks koppelen? Dus: digitale pin OUT van de ene rechtstreeks aansluiten op een digitale pin IN van een andere?

Of moet er ter bescherming een weerstand tussen?

De "IN" pin wilde ik in pull-up modus instellen. En op die manier van de ene arduino naar de andere doorgeven of een wissel wel/niet omgezet mag worden, bijvoorbeeld. Of dat het volgens de dag/nacht simulatie donker genoeg is om de straatlantaarns aan te doen.

Reinout
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 11 januari 2016, 21:15:20
Ze kunnen rustig direct aan elkaar, geen probleem. Pullup niet eens nodig maar kan absoluut geen kwaad. Alleen zou ze niet mijlen ver uit elkaar plaatsen (lees, naast elkaar hangen).

Maar ipv gewone IO kan je makkelijker zoals Paul deed/doet de I2C bus pakken. (Again, alleen als ze naast elkaar zitten.) Op deze manier kan je gewoon data over sturen. Ben je wat flexibeler dan de hoog laag status van een pin. En je kan dezelfde twee I2C lijnen gebruiken om met meer dan één Arduino te praten (officieel tot 127). Wil je ze verder uit elkaar hangen zou ik kijken naar iets als RS485 ofzo.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 11 januari 2016, 21:29:15
Hoi Volgers,

@Timo

Bedankt voor je input,  en bedankt voor je code op pastbin.
Met zoveel opmerkingen en beschrijvingen achter de code kom ik daar een heel stuk verder mee, mijn Engels is niet zo erg goed (1 jaar Engels op school gehad :P)  top Bedankt (y).

Helaas heb ik de verkeerde code naar pastbin geupload, Dit is de eerste code die ik schrijf om te bepalen op welke poorten ik wissels, seinen, blokken wil zetten, ik vind het makkelijker werken om de poortnummers te gebruiken, ik weet dan voor mijzelf welke blokken, seinen, wissels ik aanstuur.

Werkt mijn gedachten kronkel dan zet ik de nummers om in namen, ik zie door de bomen het bos niet meer door alle tekst,de code word voller en voller met tekst.
voor mij is het makkelijker om in de code zo min mogelijk tekst te gebruiken als ik in de code  digitalWrite (28,1)  zet weet ik meteen wat er gebeurd als ik digitalWrite (Sein1Pin,Bezet) raak ik op een gegeven moment  het overzicht kwijt  ( Dyslexie ,leesblind) vandaar.

Als ik de code "digitalWrite (28,1) enz."  op die manier op het forum zet snappen de mensen  de code niet , ik zet het dan om meer leesbare code, soms gaat dat fout ::).

Dat is ook de reden dat ik mijn eigen benamingen gebruik voor het benoemen van constanten/variabelen enz, op die manier hou ik het overzicht van de code als ik er mee bezig ben.

Hopelijk is het je duidelijk, waarom de code niet volgens de "regels"  van het programmeren is geschreven, voor mij is het makkelijker om de code te schrijven en ontwikkelen in poortnummers zodat de code leesbaar blijft.

Zie dit niet als commentaar maar als uitleg waarom ik zo programmeer, ik vind het geweldig dat je me helpt met programmeercode tips enz.

@ Jan Willem

Het klopt wat Timo schrijft , alleen zou ik geen pro mini's gebruiken deze processor boardjes hebben geen usb aansluiting, je zult een usb-adapter erbij moeten kopen, ik gebruik zelf de Arduino nano (deze is niet veel duurder dan een pro mini), dit boardje heeft iets meer i/o 8 Analog in (pro mini 6)  en 13 digital out/in en heeft standaard een usb aansluiting.

De relais boardjes zijn er in verschillend uitvoeringen als shield met 4 relais , of als 1,2,4,8,16 voudige  uitvoering en daar zijn ook nog verschillende uitvoeringen van "actief hoog" of  "actief laag"  gestuurd, het verschil zit in de schakeltrap met of zonder Optocoupler.

Foto: Relais board zonder Optocoupler.

(https://images.beneluxspoor.net/bnls/IMG_20160111_223446.jpg) (https://images.beneluxspoor.net/bnls/IMG_20160111_223446.jpg)

Foto: Relais board met Optocoupler.

(https://images.beneluxspoor.net/bnls/IMG_20160111_223525.jpg) (https://images.beneluxspoor.net/bnls/IMG_20160111_223525.jpg)


Een andere manier van schakelen doe je met transistoren of vermogens transistoren in plaats van relais.

Foto:  Transistor sturing, voor rgb led strip.

(https://images.beneluxspoor.net/bnls/IMG_20160111_221448.jpg) (https://images.beneluxspoor.net/bnls/IMG_20160111_221448.jpg)

Een andere manier is het gebruik van solid-state relais, heb daar nog geen ervaring mee.

Helaas heb ik daar geen foto van.

Je kunt ook een Optocoupler gebruiken om te schakelen.(Zie foto 4 voudige relais board.)

Ik ben nog bezig met een keerlus schakeling voor mijn baan ,daarvoor ga ik twee bi-polaire relais gebruiken, in dat geval kost dat vier uitgangen van de Arduino en moet het geheel op een shield of losse print gebouwd worden.

Ik hoop dat je aan deze informatie wat hebt.

@Reinout

Je kunt de Arduino's zoals Timo aangeeft koppelen, alleen het nut daarvan ontgaat mij, beter is het om I2C bus of de RS-485 bus te pakken.

Je kunt ook de Rx/Tx van de Arduino gebruiken om met verschillende Arduino's te communiceren Rx Arduino 1 op Tx arduino 2 en Tx Arduino 1 op Rx Arduino 2, in dat geval kun je beter de AT Mega 2650 gebruiken deze heeft vier hardwarematige RX/TX poorten waardoor het makkelijker is om Arduino's te koppelen.

Wat de I2C betreft, kun je zonder problemen 1 a 2 mtr. kabel tussen de units gebruiken UTP kabel dan werk het nog goed, deze informatie heb ik van het internet gehaald via Youtube, daar staat een filmpje van deze oplossing. Ben allen de link naar het filmpje kwijt.

 I2C sturing van twee Arduino's rechts zit de interface voor 6 Arduino's en een I2c Lcd display, wil je meer gebruiken moet je op de SCL, SDA lijn een weerstand van 4700 ohm naar de +5 leggen (bij mij werkte deze waarde goed, op de datasheet staat een weerstand van 10Kohm getekent.

Foto: I2c tussen twee Arduino's

(https://images.beneluxspoor.net/bnls/IMG_20160111_214109.jpg) (https://images.beneluxspoor.net/bnls/IMG_20160111_214109.jpg)

Foto:  Interface zonder weerstanden

(https://images.beneluxspoor.net/bnls/IMG_20160111_214214.jpg) (https://images.beneluxspoor.net/bnls/IMG_20160111_214214.jpg)

Ik hoop dat je wat aan deze informatie hebt.

Mvg Paul  ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Te 2/2 op 12 januari 2016, 15:11:44
Ik hoop dat je een versie-beheermethode hebt. Zo niet, dan wordt het bijhouden van alle script versies op termijn een ramp. Ik zou ze minimaal handmatig standaard bovenaan nummeren. In mijn tijd als C-programmeur waren daarvoor allerlei handige open source programma's.

ga ik twee bi-polaire relais gebruiken, in dat geval kost dat vier uitgangen

Dat maakt me duidelijk hoe het werkt. Voor rijden/niet-rijden gebruik je de monostabiele relais, voor wissels bistabiele relais. De monostabiele zitten op prefab kaartjes, de bistabiele niet.
Je signalering (reedcontact) verbruikt ingangen, het signaal gaat naar de arduino, en die stuurt (via script) de relais aan. Dus stel je vervangt het reedcontact door een lichtsluis, dan gaat het signaal (of signalen) van die lichtsluis ook naar de aduino. M.a.w. de arduino vormt een extra tussenlaag binnen de bestaande schakelingen, tussen input en output?

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Reinout van Rees op 12 januari 2016, 15:29:55
Koppelen van arduino's: communicatie van de arduino van het toekomstige bedieningspaneel met de arduino, 2 meter verderop, die aan het inrijsein vastzit. Default inrijsein-stand is rood, dus er hoeft alleen een draadje "geel" en "groen" naar toe (afgezien van een massa).

Dus om daar nou een rs485 voor te regelen met evenveel draadjes... Leek me niet zo nuttig. IC2 leek me met 2m te ver weg.

Maar zo'n bus lijkt me ergens wel lekker, vooral de rs485 klonk me wel goed in de oren.

Aan de andere kant zitten er bidirectionele zaken in. Bedieningsplaneel/aansturing wil commando's aan de inrijseinen geven. In de buurt van een inrijsein komt een infraroodpoortje dat ik OF met een lange draad direct aan wil sluiten (huidige plan) of via een plaatselijke arduino kan laten beheren. Maar die zou dan weer naar het bedieningspaneel willen sturen. Enz. Ik moet hier nog over brainstormen.

Reinout
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 12 januari 2016, 15:44:40
@reinout,

Tijd voor een SX-bus  ;D

Groet,

Gerard van der Sel.

PS: SLX852
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 12 januari 2016, 15:57:30
Werkt mijn gedachten kronkel dan zet ik de nummers om in namen, ik zie door de bomen het bos niet meer door alle tekst,de code word voller en voller met tekst.
voor mij is het makkelijker om in de code zo min mogelijk tekst te gebruiken als ik in de code  digitalWrite (28,1)  zet weet ik meteen wat er gebeurd als ik digitalWrite (Sein1Pin,Bezet) raak ik op een gegeven moment  het overzicht kwijt  ( Dyslexie ,leesblind) vandaar.
Okay, vandaar. Ook al is het denk ik ook een vorm van gewenning. Mijn vriendin is ook zo dyslectisch als een deur maar variabele namen vindt ze duidelijker dan nummer. Wat enorm kan helpen is geen namen kiezen die op elkaar lijken. (volgendeWisselInvoer en volgendeWisselUitvoer is dan niet handig  ;D)

Het klopt wat Timo schrijft , alleen zou ik geen pro mini's gebruiken deze processor boardjes hebben geen usb aansluiting, je zult een usb-adapter erbij moeten kopen, ik gebruik zelf de Arduino nano (deze is niet veel duurder dan een pro mini), dit boardje heeft iets meer i/o 8 Analog in (pro mini 6)  en 13 digital out/in en heeft standaard een usb aansluiting.
Ze schelen nog steeds een factor 2 hoor  ;) ;D Voor testen ben ik het wel met je eens dat de Nano dan erg gemakkelijk is. Maar als iets vorm gekregen heeft kan je ook een Pro Mini pakken. Eigenlijk hebben zo'n beetje alle Pro Mini's alle aansluitingen van een Nano. Alleen A6 en A7 wil nog wel eens ontbreken. (Waarbij je op moet letten, A7 is analoog in only)) En het feit dat de Pro Mini kleiner is kan in een permanente opstelling vaak een net iets compactere print opleveren :) Dus ik gebruik ze lekker door elkaar.

De relais boardjes zijn er in verschillend uitvoeringen als shield met 4 relais , of als 1,2,4,8,16 voudige  uitvoering en daar zijn ook nog verschillende uitvoeringen van "actief hoog" of  "actief laag"  gestuurd, het verschil zit in de schakeltrap met of zonder Optocoupler.
Naar mijn idee zijn de boardjes met opto coupler redelijk zinloos. Tenzij je echt een reden hebt om het relais los te voeden is die met transistor net zo makkelijk.

Een andere manier is het gebruik van solid-state relais, heb daar nog geen ervaring mee.
Die zijn zo goed als nutteloos op de modelbaan omdat ze alleen geschikt zijn voor AC.

Ik ben nog bezig met een keerlus schakeling voor mijn baan ,daarvoor ga ik twee bi-polaire relais gebruiken, in dat geval kost dat vier uitgangen van de Arduino en moet het geheel op een shield of losse print gebouwd worden.
Is dat voor de Arduino gestuurde baan? En waarom wil je met twee relais werken? En waarom bi-stabiel? Misschien heb je er een goeie reden voor hoor  :) Maar ik mis het, zeker in het licht van de Arduino baan, nog even.

Je kunt ook de Rx/Tx van de Arduino gebruiken om met verschillende Arduino's te communiceren Rx Arduino 1 op Tx arduino 2 en Tx Arduino 1 op Rx Arduino 2, in dat geval kun je beter de AT Mega 2650 gebruiken deze heeft vier hardwarematige RX/TX poorten waardoor het makkelijker is om Arduino's te koppelen.
Om alleen daarvoor de Mega te gebruiken is misschien wat overkill. Op 1 serial bus kunnen makkelijk meerdere arduino's hangen. Als je alleen één master hebt die naar meerdere slaves moet zenden knoop je simpelweg alle RX van de slaves aan de TX van de master. Wil je ook terug kunnen sturen dan een pull up weerstand aan de RX van de master. En elke slave via een diode verbinden (kathode naar slave). Maar ook dit is vooral voor korte afstand.

Wat de I2C betreft, kun je zonder problemen 1 a 2 mtr. kabel tussen de units gebruiken UTP kabel dan werk het nog goed, deze informatie heb ik van het internet gehaald via Youtube, daar staat een filmpje van deze oplossing. Ben allen de link naar het filmpje kwijt.
I2C lengte is sterk afhankelijk van de kabel en de pull ups die gebruikt worden. 1 a 2 meter zou ik echt als max zien. Eigenlijk zou ik zelf onder de modelspoorbaan (= storinggevoelige omgeving) niet verder gaan dan 1 meter.

Andere te gebruiken optie is nog SPI. Stuk sneller dan de I2C maar again, voor korte afstanden. Met wat lengte blijft RS485 in mijn ogen de meest robuuste oplossing en makkelijk en goedkoop te implementeren.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Te 2/2 op 12 januari 2016, 16:42:30
SLX852, daaraan hangt inderdaad een ander prijskaartje.

Maar om nog even in te breken op dit draadje. Paul is bezig om de methoden uit te testen die in- en uitvoer regelen. Ik zelf denk vooralsnog meer op abstract niveau.

Een treinbaan bestaat in mijn droom uit blokken.  En een blok is een tamelijk abstracte struct, noem het class. Een blok heeft eigenschappen en methoden, en een groot aantal afgeleide structuren, speciale blokken: eenrichtingsverkeer-blok, tweerichtingsverkeer-blok
wisselstraat, dubbele wisselstraat, wisselstraatrijweg, lokparkeerplaats, kopmaak-blok, ontkoppelplaats-blok, overweg-blok, schaduwstation-blokken.
In C zou je dan een struct maken, en structs nesten, in C++ zou je een class maken met afgeleide classes. Dat zou er zo uit kunnen zien, in pseudotaal:

struct(class) blok {
eigenschappen:
rijrichting (links of rechts)
rijrichtingafhankelijke stopplaats (links of rechts),
start/stop toestand
melder(reedcontact) per rijrichting,
seinbeeld (toestand)
verwijzing naar vorige,volgende blok

methoden:
rijden-stoppen
melding geven of negeren
melding volgende,melding vorige
}

En in mijn geval komt er dan nog iets bij voor railtype (2 of 3 rail). En ik zou dan geen reedcontact gebruiken maar een lichtsluis met twee pulsen (begin en eind), whatever.

Als ik nu ga kijken naar dit draadje, dan zouden de eigenschappen worden opgeslagen in flashmemory (in plaats van nu bij mij in bistabiele relais), de meldingen worden afgegeven aan de arduino, en de concrete acties (rijden-stoppen, seinbeelden, ontkoppelen, rijrichting wijzigen, wissels omgooien e.d.) zouden worden uitgevoerd vanuit monostabiele relais, aangestuurd vanuit de arduino. Dat scheelt bekabeling, en dus risico op lastig opspoorbare storingen.

Dus als het Paul lukt om en de melding-verwerking, en de concrete acties voor elkaar te krijgen, dan wordt het zinvol om te kijken naar de abstracte invulling. Tegelijkertijd zie ik de bui al hangen.
Bij de opstart van het systeem moet een dynamisch gelinkte lijst in het geheugen worden geladen, en dat kan lang duren. Bij een grote baan (laten we zeggen een paar honderd meter rails, tafelsegmenten, e.d.) zul je met meerdere arduino's moeten werken die wifi of anders met elkaar communiceren (omdat de bedrading anders te lang wordt). Dus moet je modulair denken, vanaf het begin.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 12 januari 2016, 20:33:57
Hoi Volgers,

@Jan Willem

Citaat
Dat maakt me duidelijk hoe het werkt. Voor rijden/niet-rijden gebruik je de monostabiele relais, voor wissels bistabiele relais. De monostabiele zitten op prefab kaartjes, de bistabiele niet.
Je signalering (reedcontact) verbruikt ingangen, het signaal gaat naar de arduino, en die stuurt (via script) de relais aan. Dus stel je vervangt het reedcontact door een lichtsluis, dan gaat het signaal (of signalen) van die lichtsluis ook naar de aduino. M.a.w. de arduino vormt een extra tussenlaag binnen de bestaande schakelingen, tussen input en output?
 

Dit klopt voor een gedeelte niet, Het bistabiele relais word in de keerlus gebruikt om de baanspanning om te polen zodat de treinen zonder te hoeven stoppen door kunnen rijden de baan op.

Wissels kun je evt. met een monostabiele relais omzetten (korte puls door de Arduino) per wissel heb je dan twee monostabile relais nodig.

Beter is het om de wissels te schakelen met vermogens transistoren.
De blokken worden door monostabiele relais gestuurd dat kost een relais per blok.

De signalering van de blokken kan door : reed-relais, ldr, ir lichtsluis, ir reflectie sensoren of via stroom detectie  er zijn vast meer componenten te gebruiken voor signalering.

De sensoren (lees signalering) worden door mijn systeem via de analogepoort gelezen, zodoende hou ik meer digitale I/O over.

Voor rijden/niet rijden van de locomotief gebruik je motordrivers, deze regelen het optrekken/ afremmen of stoppen van de trein, tenzij je voor elk blok een eigen motordriver gebruikt, dan kun je de blokrelais weglaten, anders heb je de blokrelais nodig om bepaalde blokken spanningsloos te maken.

Als je een reed-relais vervangt voor een lr lichtsluis zal je ook het Arduino programma moeten veranderen, tenzij je digitale ingangen gebruikt dan hoeft dat niet, ik gebruik de analogepoort voor het uitlezen van de sensoren.

De Arduino regelt zelf de sturing van de baan met behulp van sensoren en motordrivers  zelfstandig of als blok gestuurd systeem, in beide gevallen zorgt het programma voor de uitvoering van de sturing.

De sturing die ik probeer te bouwen, moet een blok gestuurd systeem worden.

@Timo

Citaat
Ze schelen nog steeds een factor 2 hoor   ;) ;D

Dat valt erg mee, voor een Arduino pro mini betaal ik euro 2,56 en voor een Arduino nano betaal ik euro 2,80.

Citaat
Is dat voor de Arduino gestuurde baan? En waarom wil je met twee relais werken? En waarom bi-stabiel? Misschien heb je er een goeie reden voor hoor  :) Maar ik mis het, zeker in het licht van de Arduino baan.

Ik gebruik de biploaire relais om de baanspanning voor een gedeelte van de baan om te polen, zodat de trein zonder stoppen door de keerlus kan rijden.
De tweede relais is voor het bedienings-paneel om de toestand van de keerlus/baan weergeven.
Er zit in de schakeling nog twee extra  monostabiele relais om de wissel om te zetten (later ga ik die vervangen door vermogens transistoren) om te testen werk deze opstelling prima en had deze schakeling nog gebouwd liggen.

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 13 januari 2016, 09:29:44
SLX852, daaraan hangt inderdaad een ander prijskaartje.
SLX852 is inderdaad een andere catagorie, maar een Arduino als SX-bus master zou met 6 weerstanden een afstand van een meter of 10 kunnen overbruggen in modeltreinland. Helaas is de software voor de Arduino nog niet openbaar.

Groet,

Gerard van der Sel.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 13 januari 2016, 12:09:24
Beter is het om de wissels te schakelen met vermogens transistoren.
De blokken worden door monostabiele relais gestuurd dat kost een relais per blok.
Mee eens  (y) Transistors zijn goedkoop, makkelijk en niet mechanisch. Voor een blok is een standaard monostabiele prima.

De signalering van de blokken kan door : reed-relais, ldr, ir lichtsluis, ir reflectie sensoren of via stroom detectie  er zijn vast meer componenten te gebruiken voor signalering.
De mogelijkheden zijn inderdaad eindeloos en de meeste methodes resulteren gewoon in een puls dus zijn gewoon dwars door elkaar te gebruiken.

De sensoren (lees signalering) worden door mijn systeem via de analogepoort gelezen, zodoende hou ik meer digitale I/O over.
Dat is een drogreden Paul  ;) Alle analoge poorten (met uitzondering van A7) zijn prima gewoon als digitale poort te gebruiken! Ze hebben alleen als extra functie dat ze analoog kunnen lezen.

Voor rijden/niet rijden van de locomotief gebruik je motordrivers, deze regelen het optrekken/ afremmen of stoppen van de trein, tenzij je voor elk blok een eigen motordriver gebruikt, dan kun je de blokrelais weglaten, anders heb je de blokrelais nodig om bepaalde blokken spanningsloos te maken.
Prima te combineren inderdaad  (y) Maar zullen we voor het gemak eens termen afspreken om onderscheid te maken? Voorstel, blokken voor alles achter een motordriver en subblok voor alles achter een relais? Is namelijk al een paar keer verwarrend geweest in dit draadje  ;D

De Arduino regelt zelf de sturing van de baan met behulp van sensoren en motordrivers  zelfstandig of als blok gestuurd systeem, in beide gevallen zorgt het programma voor de uitvoering van de sturing.
Hoe ingewikkeld je de sturing maakt bepaal je dus zelf (en zit eigenlijk de meeste uitdaging).  ;D

Dat valt erg mee, voor een Arduino pro mini betaal ik euro 2,56 en voor een Arduino nano betaal ik euro 2,80.
Dan heb je dure Pro Mini's  ;D Ik koop ze voor €1,25 (http://www.aliexpress.com/item/Pro-Mini-Module-Atmega328-5V-16M-For-Arduino-Compatible-With-Nano/2021666535.html?ws_ab_test=searchweb201556_9,searchweb201644_2_10001_10002_10005_10006_10003_10004_62,searchweb201560_8,searchweb1451318400_6150)... Niet om het gebruik van de Nano af te kraken maar puur om aan te geven dat ze echt nog goedkoper zijn. En dan kun je denken "ach, wat scheelt dat nu?". Maar als Roco dat ook had gedacht kostte de z21 wel iets meer  ;D

En een mooie startersset: hierrr (http://www.aliexpress.com/item/Free-Shipping-USB2-0-To-TTL-6Pin-CH340G-Converter-Pro-Mini-Atmega328-5V-16M-For-Arduino/1922492918.html?ws_ab_test=searchweb201556_9,searchweb201644_2_10001_10002_10005_10006_10003_10004_62,searchweb201560_8,searchweb1451318400_6150).

Ik gebruik de biploaire relais om de baanspanning voor een gedeelte van de baan om te polen, zodat de trein zonder stoppen door de keerlus kan rijden.
De tweede relais is voor het bedienings-paneel om de toestand van de keerlus/baan weergeven.
Duidelijk.  :) Maar weet dat een bistabiel relais in een Arduino blok gestuurde baan wel een beetje zinloos is... Als je gewoon zorgt dat de lus een eigen motordriver heeft ben je ook klaar  ;)


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Te 2/2 op 13 januari 2016, 14:15:13
Ik begrijp nog niet alles, maar ik lees me in. Daar is dit een goed draadje voor.

In mijn visie is een keerlus een soort blok (met afgeleide eigenschappen en methoden). Dat betekent dat ik dit type blok van een methode zou voorzien om de rijrichting om te schakelen van een naastliggend (volgend) blok. Ik denk dan aan de Z-schalting (http://k.f.geering.info/modellbahn/technik/grundlagen.htm#zeinfach) (in dit geval twee stroombronnen via een bistabiele keuze), en dat omgezet naar een boolean in de software die de gemaakte keuze vast legt. Het monostabiele blokrelais tapt daarvan af.

In een arduino aanpak, begrijp ik nu, zou ik dat principe los moeten laten, want de motordriver vervangt het blok-relais. Dus moet ik meer weten over het functioneren van zo'n motordriver.
Hoe werkt dat, waarvan betrekt dat ding de stroom en is die broombron op deze manier manipuleerbaar?

Ik vraag me dat af, omdat in mijn old-school analoge relais-gestuurde aanpak ook geschakeld wordt tussen 2-rail en 3-rail, volgens het zelfde principe als rijrichting. Een trein kopieert de toestand (railtype, evt. rijrichting) van het huidige naar het volgende blok zonder dat ik (of mijn paneel) hoef te weten wat voor trein dat is (railtype),  wat de rijrichting is, en dus ook wat het volgende blok is. Als ik dat wel wil weten, is een enkel ledje extra hier of daar genoeg.

Nu weet ik ook wel dat relais overkill zijn, met flipflops (transistors) kan het ook, goedkoper, sneller, beter. Alleen raak je dan de toestanden (state-of-affairs) kwijt als je de stroom uit zet, en dat wil ik niet. Dus ik wil de gebeurtenissen (events) vast kunnen leggen bij stroomuitval. Old-school aanpak: bipolair; arduino op disk (flash of niet), als lijsten.
Daarom zou ik in C, C++, VB (mij een biet) blokken zo coderen dat met een minimum aan ballast (een cijferreeks of string) alle toestanden (eigenschappen) en methoden per blok opgeslagen kunnen worden. Bij modulaire aanpak zou elk blok dus ook een blok-uid, blok-type-id, een module-id, een netwerk-id, en twee boundary-id's hebben, software-matig.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 13 januari 2016, 15:16:05
Klopt geheel. Dit staat in de struct of de class (properties). De functionaliteit van het blok is vastgelegd in methoden.

Een motordriver (bv L293) zijn in principe 4 transistoren, waarvan er altijd minimaal twee in sper staan. De overige twee kun je pulseren (pulsbreedte modulatie) of permanent open zetten. Alle 4 in sper is 0 volt op de rails, trein staat stil. Je rijdt vooruit met het ene tweetal, en achteruit met het andere tweetal. Bij een keerlus rij (analoog) naar de keerlus met paar A. In de keerlus is ook paar A actief. Bij het verlaten wordt in het oorspronkelijke inrij blok paar B actief. Hierdoor rijdt de trein gewoon door.

Groet,

Gerard van der Sel.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Te 2/2 op 13 januari 2016, 18:05:20
Na een nuttige leesmiddag,
http://www.thebox.myzen.co.uk/Workshop/Introduction.html
http://arduino-info.wikispaces.com/DC-Motors
http://arduino-info.wikispaces.com/DC-Motors-2 (push pull output)
https://www.pololu.com/product/2502/
https://www.pololu.com/docs/0J49 (motor shield guide)
https://learn.adafruit.com/downloads/pdf/adafruit-arduino-lesson-13-dc-motors.pdf
http://luckylarry.co.uk/arduino-projects/control-a-dc-motor-with-arduino-and-l293d-chip/
http://communityofrobots.com/tutorial/kawal/how-drive-dc-motor-using-l293d-arduino
http://tronixlabs.com/news/tutorial-l298n-dual-motor-controller-module-2a-and-arduino
http://elabz.com/brushless-dc-motor-with-arduino/

begrijp ik dat Gerard het heel compact, en juist, heeft uitgelegd. Ondertussen heb ik me gelijk maar eens verdiept in Arduino compatibele lichtsluizen, want als ik ze toch zelf moet maken kan ik ook wel wat geschikte specs meenemen.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 13 januari 2016, 19:09:30
Lekker bezig geweest Jan Willem!

In mijn visie is een keerlus een soort blok (met afgeleide eigenschappen en methoden). Dat betekent dat ik dit type blok van een methode zou voorzien om de rijrichting om te schakelen van een naastliggend (volgend) blok.
Daarmee is het toch eigenlijk niet anders dan een normaal blok  ;)

En hoe je de boel dirigeert is aan jou. Is een blok verantwoordelijk om het volgende blok aan te spreken (en moet dus ook weten hoe wissels liggen enz) of maak je een blok een dom ding die alleen subblokken aanstuurt en laat je het hele aansturen aan een externe "controle" classe over?

In een arduino aanpak, begrijp ik nu, zou ik dat principe los moeten laten, want de motordriver vervangt het blok-relais.
Als je mee gaat in mijn eerdere blok en subblok structuur, ja. Maar je zou dus, om motor controllers te besparen, dus meerdere subblokken achter één driver kunnen hangen. Bijvoorbeeld handig voor stationsporen of lange opstelsporen enzo. Maar idee is dan wel dat er maar één trein rijdt per driver. Rest mag natuurlijk wel stilstaan in een subblok maar voor rijden zit je met het probleem dat treinen nogal verschillende snelheden hebben bij verschillende spanning enzo. Zitten ze op één driver kan je ze niet meer individueel regelen.

Daarom zou ik in C, C++, VB (mij een biet) blokken zo coderen dat met een minimum aan ballast (een cijferreeks of string) alle toestanden (eigenschappen) en methoden per blok opgeslagen kunnen worden.
Ook daar ben je natuurlijk vrij. Maar waar wil je dit opslaan? Op een centrale plaats (bijvoorbeeld PC, (Raspberry) Pi of centrale Arduino (met SD-kaart ofzo)? Of wil je dit op de Arduino doen die het blok beheert?

In EEPROM van de Arduino is wel mogelijk maar dan zou ik wel een soort afsluit routine maken want EEPROM heeft geen eeuwig leven. Op een PC of Pi zou het natuurlijk wel continue kunnen maar dan moet je deze data wel steeds versturen (via een bus of postduif ofzo  ;D ) Moet je dus wel rekening mee houden als je dat deel ontwerpt.

Ondertussen heb ik me gelijk maar eens verdiept in Arduino compatibele lichtsluizen, want als ik ze toch zelf moet maken kan ik ook wel wat geschikte specs meenemen.
Schema wat ik ook vond (op gewezen door Frits) is dit schema met de LM567 (http://forum.beneluxspoor.net/index.php/topic,64858.msg3221572204.html#msg3221572204). Andere optie is met de IS471F (http://www.floodland.nl/aim/info_lichtsluis_1.htm) maar deze is iets duurder, wel simpeler. Beide moduleren de IR led waardoor ze geen last hebben van lampen en zonlicht.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Te 2/2 op 13 januari 2016, 22:05:32
De link met de LM567 werkt niet.
Je andere link is de http://www.floodland.nl/aim/info_lichtsluis_1.htm

Daar zet ik deze links tegen af. Zelfde principe:
http://www.moba-tipps.de/lichtschranke.pdf
http://www.christian-luetgens.de/eisenbahn/elektronik/ls1/Lichtschranke_1.htm
http://www.christian-luetgens.de/eisenbahn/elektronik/ls2/Lichtschranke_2.htm

Waar het om gaat: de receiver is een transistor die gaat geleiden vanaf een bepaalde
grenswaarde. Als er geen voorwerp zit tussen zender en ontvanger, geleidt de transistor niet.
Zolang er een voorwerp zit tussen zender en ontvanger, en de grenswaarde is bereikt, dan gaat het (monostabiele) relais aan.
En dat wit ik niet.

Wat ik wel wil is dat vanaf de drempelwaarde omhoog gefilterd wordt door een bouwsteen die alleen voor de duur van de stijging signaal doorgeeft aan het relais,en alleen gedurende de daling naar de drempel signaal door geeft aan een tweede (monostabiel) relais.
Dat kan met een dual monostable multivibrator, zoals de CD4098 of latere versies daarvan. Zo'n TTL (of CMOS variant) bouwsteen filtert op de flanken, en geeft alleen de flanksignalen door, niet het tussenliggende gebied, en geeft dus twee korte pulsen, aan het begin en aan het eind van de sessie. Het beginsignaal is nodig om het volgende blok van de juiste rij-eigenschappen te voorzien, het eindsignaal geeft het vorige blok vrij. En voor zover ik weet, bestaat zo'n soort lichtsluis nog niet, en zal ik 'm zelf moeten bouwen. Floodland 's oplossing is dus niet de mijne, maar geeft wel een goed voorbeeld om mijn aanpak in te bouwen.
Ik zou alleen geneigd zijn 5 volt technologie te nemen (goedkoper) en te voeden vanuit een AT-voeding.

Terug naar de motor-driver. Stel je hebt 30 treinen die kunnen rijden op 20 standaard blokken, plus een aantal afgeleide bloktype blokken. Heb je dan 30 motordrivers nodig?
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 13 januari 2016, 23:38:16
De link met de LM567 werkt niet.
Probeer nog eens. Link werkt hier prima (op twee andere apparaten dan gepost) dus denk dat Benelux Rail gewoon de hik had.

En dat wit ik niet.

Wat ik wel wil is dat...
Uhm, wat denk je allemaal moeilijk!  ;D Dat kan je toch gewoon allemaal bekijken op de Arduino? Hoog actief, laag actief, zo aan te passen. Iets doen als bezet wordt, makkie. enz Als je een microcontroller gebruikt is dat allemaal maar software.

Terug naar de motor-driver. Stel je hebt 30 treinen die kunnen rijden op 20 standaard blokken, plus een aantal afgeleide bloktype blokken. Heb je dan 30 motordrivers nodig?
Je hebt minimaal zoveel motor drivers nodig als dat je individueel de snelheid van rijdende wilt kunnen instellen. Dus als je met 10 treinen wilt rijden en de rest staat stil kan je op papier af met 10 motorcontrollers. Maar goed, dan zijn alle blokken altijd bezet, dus je hebt meer marge nodig. Beter is te bedenken dat je (om iedere trein individueel te sturen) net zo veel motorcontrollers nodig hebt als dat je secties waar 1 trein tegelijk ik moet kunnen rijden.

Maar goed, motor drivers zijn eigenlijk best goedkoop. Niet zo veel duurder dan relais breakouts. De meeste hebben drie pinnen nodig maar again, een Arduino kost ook maar 1,30... Als je twee of drie blokken met één Arduino kan doen is dat op zich prima lijkt me...


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Te 2/2 op 14 januari 2016, 01:08:15
@Paul, bedankt voor het mogen inbreken in je draadje.

@Timo:
Uhm, wat denk je allemaal moeilijk!  ;D Dat kan je toch gewoon allemaal bekijken op de Arduino?

OK, ik leer weer wat bij. Die dubbele puls is nodig in mijn old-school relais aanpak, en is dat misschien of zeker niet in de arduino-aanpak (vanwege de ingebouwde timer, neem ik aan). 

De motordriver kun je apart voeden als de motor meer stroom vraagt dan de arduino intern kan leveren. Handig bij 12-16 vDC rijstroom.

Manier voor 2-3 rail aanpak per blok. Met arduino enerzijds software, anderzijds omleiding van de uitvoer van motordriver naar de spoorstaven van een blok of blokreeks via een extra relais (mono of bi naar keuze). Mmmm, blokreeks, een lijst in een lijst. Moet ik onthouden. Kan ik wel iets mee in Java of C++.

De permanente opslag van gegevens is kennelijk wel een probleem om nog even in te duiken.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 14 januari 2016, 11:02:18
(vanwege de ingebouwde timer, neem ik aan). 
Niet zo zeer door de timer. Maar je kan states opslaan en daarmee dus een soort monostabiele / flipfop nabootsen.

Je polled steeds de lichtsluis ingang. En is de state gelijk aan de vorige keer, doe je niets en sla je alleen de state op. Is hij ongelijk (zowel hoog geworden als laag geworden zijn natuurlijk te bepalen) dan kan je de actie uitvoeren. En dit is nu precies wat een microcontroller zo flexibel maakt. Je kan delen hardware inruilen voor software ;)

De motordriver kun je apart voeden als de motor meer stroom vraagt dan de arduino intern kan leveren.
Yep, (de meeste) motordrivers hebben een ingang voor de logische signalen voor de sturing en een ingang voor de spanning om voor de uitgang te gebruiken. Laatste mag dan gewoon 18V zijn.

Handig bij 12-16 vDC rijstroom.
Zullen we dat vanaf nu maar rijspanning noemen  ;) Bij modelspoor is het makkelijker om met spanningssturing te werken dan met stroomsturing.

Manier voor 2-3 rail aanpak per blok. Met arduino enerzijds software, anderzijds omleiding van de uitvoer van motordriver naar de spoorstaven van een blok of blokreeks via een extra relais (mono of bi naar keuze).
Dat is natuurlijk een redelijk makkelijke aanvulling. Gewoon een relais per blok (dus hoeft niet per subblok) toevoegen. Een monostabiele lijkt me prima. Kost minder pinnen dus wel zo makkelijk / goedkoop. Zou ik wel 3-rail aan het NC hangen omdat dat de fail save positie is.

De permanente opslag van gegevens is kennelijk wel een probleem om nog even in te duiken.
Niet zo zeer een probleem, alles is mogelijk. Je moet alleen bedenken hoe je het wilt doen ;)


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Te 2/2 op 14 januari 2016, 12:55:12
Niet zo zeer een probleem, alles is mogelijk. Je moet alleen bedenken hoe je het wilt doen ;)

Alles is mogelijk zolang je de beperkingen niet kent. Onbegrensde mogelijkheden passen nog niet in mijn denkraam. Dus denk ik parallel aan wat er wel is.

Zou ik wel 3-rail aan het NC hangen omdat dat de fail save positie is.
Dat is een doordenkertje.

Ondertussen ben ik benieuwd of Paul met zijn keerlus aanpak uitkomt bij zoiets als
http://www.floodland.nl/aim/info_arduino_keerlus_1.htm , of dat het iets  totaal anders wordt.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 14 januari 2016, 22:19:58
Die keerlus oplossing zou niet heel handig zijn. Die is voor een digitale baan. Waarbij het niet uit maakt voor de richting welke polaritiet het signaal heeft. Deze wordt dan ook omgedraaid in de lus terwijl de trein in de lus is. Maar bij analoog kan je niet zomaar de polariteit om draaien. Dus voor analoog is het het makkelijkste om een losse motordriver voor de lus te pakken en als de trein volledig in de lus zit de spanning buiten de lus (dus eerst volgende blok) om te draaien. In dat opzicht is het blok niet anders dan andere blokken en de trein stuurt vooraf gewoon rijrichting en snelheid naar het volgende blok alleen houdt dat nu vanzelf in dat je de spanning ompoolt.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Te 2/2 op 14 januari 2016, 22:56:51
Deze wordt dan ook omgedraaid in de lus terwijl de trein in de lus is. Maar bij analoog kan je niet zomaar de polariteit om draaien.
Misschien heb ik de mogelijkheden overschat. Ik meende dat, door dit ding anders aan te sluiten dan op de tekening en in de uitleg staat, het relais de stroom kan ompolen buiten de lus in plaats van erbinnen. Ervan uit gaand dat het principe (dus wat het ding doet) gelijk blijft.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 15 januari 2016, 10:07:19
Je hebt de mogelijkheden niet overschat. Wat jij wilt zou zeker kunnen, maar of dat nu het handigst is. Laat de keerlusschakelingen aan de digitaslisten en de analoge rijders hebben hun eigen oplossing.

Groet,

Gerard van der Sel.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Te 2/2 op 15 januari 2016, 14:47:43
Zelf beschik ik over goedkope bistabiele (2xom) en monostabiele (4xom) relais van minder dan € 1,- per stuk (die Chinezen toch!), en vergelijk ik dat met de kosten van zo'n floodland-torentje arduino's, dan ziet dat eruit als een kanon op een mug afvuren. Er moet dus ook een goedkopere arduino aanpak mogelijk zijn, zelfs als dat 4 pinnen kost.

De stapel hardware bij floodland lijkt inderdaad tamelijk overdone, als je het vergelijkt met deze analoge oplossing van F. Geering (http://k.f.geering.info/modellbahn/technik/kehrschleife.htm). En zelfs die kan goedkoper als je andere aannames doet.

De kracht van het idee van Felix Geering zit in de observatie dat de wisselstand en de rijrichting samenhangen. Daarin lijkt zijn idee afgeleid van dat van de werking van een zelfdenkend wissel, met wat verschillen. http://encyclopedie.beneluxspoor.net/index.php/Zelfdenkend_wissel.

Het tweede aspect van de analoge keerlus (daar zonder oplossing) staat in de encyclopedie (http://) bij het de aansluiting van de bovenleiding. Er staat niet bij dat je die uiteraard ook moet isoleren, net als de spoorstaven.

Het derde aspect wordt nergens genoemd: het voortraject van de lus (inrit-uitrit).
Je kunt de inrit-uitrit beschouwen als onderdeel van een enkel keerlus-blok. Immers, zodra de inrit bezet, kan er geen tweede trein meer in. De bezetmelding van een railsegment  bepaalt dan of iets een blok is. In 1 blok kan maximaal 1 trein rijden. Dat lijkt triviaal, maar leidt tot een andere aanpak. De rijrichting van in- en uitrit bepaalt de wisselstand, in combinatie met de rijrichting van de trein in de keerlus.

Voor ik nou verkeerd begrepen word: ik pleit niet voor een simpeler algoritme, maar voor een duidelijker analyse. Wat zou je willen realiseren met een analoge arduino-aanpak voor een keerlus: een bepaald soort keerlus, of meerdere soorten keerlussen:
 

Wat moet zo'n module kunnen? Bij old-school analoog rijden met relais is het ad hoc en vooral niet modulair oplossen van situaties gangbaar. Maar als je streeft naar meer abstractie (object georiënteerd), dan hebben al deze situaties een gezamenlijke situatie met elkaar gemeen, en dat is de oplossing van Felix Geering.

Er zijn natuurlijk talloze oplossingen verzonnen voor blokgestuurd rijden. Een van de vele is van Felix Geering (http://k.f.geering.info/modellbahn/technik/streckenblock.htm). Ik maak daar geen gebruik van. Maar wat ik er wel uit geleerd heb, is dat reedcontacten als sensor hun beperking hebben, met name bij trek-duw combinaties. Als je zo'n fijne Sprinter op je NS-baan hebt, of een SBB-variant, dan wil je kop kunnen maken op een station. Dat werkt vergelijkbaar aan een keerlus in je baan, maar toch anders. Bij keerlussen zit de magneet altijd op dezelfde plaats. Bij kopstations zit de magneet van een pendeltrein soms in de kop, soms in de staart. Of je moet met 2 magneten werken (in kop, en staart). En daarom vind ik analoog een lichtschacht eenduidiger dan een reedcontact.

En als ik dat nou weer terug vertaal naar de arduino aanpak
sensors, motordrivers aangestuurd door de software naar rijrichting en een shield om de wissel te bedienen. De motordrivers bedienen ook de functionele bovenleiding (die dus op dezelfde punten is geïsoleerd als de spoorstaven). Dat is de basis.

Wat te doen met alle extra's van de keerlus-varianten? Op het zelfde shield bijplaatsen?
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Te 2/2 op 16 januari 2016, 10:57:00
Zijn arduino shields stapelbaar?
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 16 januari 2016, 14:41:20
Allereerst ben ik het met Gerard eens, de module is vast ook anders te gebruiken maar of dat handig is...

Zelf beschik ik over goedkope bistabiele (2xom) en monostabiele (4xom) relais van minder dan € 1,- per stuk (die Chinezen toch!),
Dat je monostabiele voor een habbekrats kan krijgen in China wist ik maar ik ben nog nooit bi-stabiele tegen gekomen. Heb je een linkje?

en vergelijk ik dat met de kosten van zo'n floodland-torentje arduino's, dan ziet dat eruit als een kanon op een mug afvuren. Er moet dus ook een goedkopere arduino aanpak mogelijk zijn, zelfs als dat 4 pinnen kost.
Zo heel erg complex is die Floodland oplossing niet. Enige is dat hij 3 relais schakelt ipv 1 zodat je eventueel 3 keer stroomdetectie kunt aanleggen in de lus.. Twee relais zou je dus weg kunnen laten. Maar weer, dit is een oplossing voor een digitale baan. Maw, de lus wordt omgeschakeld ipv het volgende blok. Analoog dus niet nuttig.

De stapel hardware bij floodland lijkt inderdaad tamelijk overdone, als je het vergelijkt met deze analoge oplossing van F. Geering (http://k.f.geering.info/modellbahn/technik/kehrschleife.htm). En zelfs die kan goedkoper als je andere aannames doet.
Wat is al zei, eigenlijk zit er geen drol op die print. Enige reden dat hij zo groot is omdat hij de Arduino Uno shield maat heeft gebruikt. Zou je het doen met een Pro Mini of Nano kan je met een veel kleiner printje af waarvan ik zou zeggen, doen! Handig!

Het derde aspect wordt nergens genoemd: het voortraject van de lus (inrit-uitrit).
Je kunt de inrit-uitrit beschouwen als onderdeel van een enkel keerlus-blok. Immers, zodra de inrit bezet, kan er geen tweede trein meer in.
Maar net wat je wilt. Als je pal voor de lus een station ofzo hebt dan zou het best nog kunnen. Trein 1 komt door het station/inrit de lus in, wacht daar (waarschijnlijk uit het zicht want lussen liggen zelden in het zicht). Trein 2 (een treinstel) komt naar station en na even gewacht te hebben vertrekt deze weer in de richting waar hij vandaan kwam. Nu kan je trein 1 weer tevoorschijn toveren uit de lus.

Dit zou wel kunnen als je de inrit en lus op één motor driver zet maar het is gewoon zo veel makkelijker te realiseren door de lus en inrit op losse drivers te zetten. Dan is alle flexibiliteit gewoon een kwestie van software.

Wat moet zo'n module kunnen? Bij old-school analoog rijden met relais is het ad hoc en vooral niet modulair oplossen van situaties gangbaar. Maar als je streeft naar meer abstractie (object georiënteerd), dan hebben al deze situaties een gezamenlijke situatie met elkaar gemeen, en dat is de oplossing van Felix Geering.

Maar wat ik er wel uit geleerd heb, is dat reedcontacten als sensor hun beperking hebben, met name bij trek-duw combinaties.
Dat klopt. Eigenlijk heeft elke vorm van detectie voor en nadelen. Bij een reedcontact is het voordeel dat het goedkoop en simpel is maar je moet de trein voorzien van magneten. En inderdaad, het moment van magneet moet consistent zijn. Kan iets keren/achteruit rijden dan zal hij voorzien moeten worden van een magneet voor en achter (en een systeem wat daarvan niet door de war raakt). Stroomdetectie heeft als voordeel dat je er niets van ziet maar dat er altijd een verbruiker voorop moet zijn. Ook is dit wat lastiger op een analoge baan (want geen detectie mogelijk als je geen spanning op de rails zet). Lichtsluizen hebben als voordeel dat ze de trein zelf detecteren dus en niets extra's nodig is. Wel moet de beam dus door het pad van de trein schijnen dus lastiger te verstoppen. Vandaar dat analoog een IR reflectie populair is. Deze detecteert ook de trein (dus niets erop nodig) alleen kan tussen de rails gemaakt worden.

en een shield om de wissel te bedienen.
Ben zelf dus geen fan van shields. Zijn zo groot en lomp. Print waar je een Pro Mini op kan prikken is vaak kleiner, makkelijker en goedkoper.

De motordrivers bedienen ook de functionele bovenleiding.
Functionele bovenleiding zou ik niet aan beginnen, dat heeft geen enkele meerwaarde en alleen nadelen. Zo is de stroomafname slechter dan via de wielen en is een keerlus zo goed als onmogelijk. Immers, na het keren wil de loc de verkeerde spoorstaaf gebruiken om de motor te voeden. Zou je kunnen oplossen door ieder blok de bovenleiding weer schakelbaar te maken maarja, waar doe je het eigenlijk voor? Gewoon spanning van de rails afnemen is dan net zo makkelijk...

Wat te doen met alle extra's van de keerlus-varianten? Op het zelfde shield bijplaatsen?
Wat ik al zei, in een door Arduino gestuurd bloksysteem is een keerlus niet anders dan elk ander blok... De Arduino moet gewoon zorgen dat het volgende blok dezelfde snelheid en richting heeft waarmee de trein door kan rijden. Dat dit toevallig ook hetzelfde blok is waar hij uit kwam maar deze nu van rechts naar links (dus richting andersom) wilt berijden is eigenlijk bijzaak...

Dus, systematisch heb je dan als, if volgende blok is vrij, stuur richting en snelheid (en wat nog meer) door naar volgende blok. En in het geval van een keerlus is "if volgende blok vrij" toevallig hetzelfde als dat de trein volledig de lus in is gereden. En als je een manier hebt om altijd bij te houden hoe de instellingen van een  een blok moeten als je vanuit een ander blok komt is het klaar. Bijvoorbeeld:
Blok 1 => Blok 2: Vooruit
Blok 2 => Blok 1: Achteruit
enz

En als blok 2 de lus is gaat dat al vanzelf goed.

Enige waar je mee zit is nog de deadlock. Dus hoe je om gaat met een tweede trein die de lus in wil. Maar dat is eigenlijk niet anders dan elk stuk enkelsporig. Ook daar wil je niet dat er twee treinen uit tegenoversgestelde richting het enkelspoor op rijden. Maar goed, dan zit je eigenlijk al een niveau hoger.

Zijn arduino shields stapelbaar?
In de basis, ja. Maar het ligt wel aan het shield. Deze moet wel voorzien zijn van weer een header. Die van Floodland is dat niet. Een ook al is het stapelbaar zegt dat natuurlijk niets over het eventueel dubbel gebruiken van pinnen op de Arduino.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Te 2/2 op 17 januari 2016, 17:53:19
Functionele bovenleiding zou ik niet aan beginnen, dat heeft geen enkele meerwaarde en alleen nadelen. Zo is de stroomafname slechter dan via de wielen en is een keerlus zo goed als onmogelijk.

Onbekend maakt onbemind. Er is een reden waarom de stroomafname via de wielen minder betrouwbaar is, maar kennelijk kun je zelfs een Sommerfeldt bovenleiding prima functioneel gebruiken. Dat laatste wist ik zelf ook niet eerder.

Kijk eens hier (http://www.chrb.ch/) rond: of wat meer gericht hier (http://www.chrb.ch/faq/echte-oberleitung/) en daar (http://www.chrb.ch/faq/warum-selectrix/).

Dat is een baan van 2-rail rijders met bovenleiding en een selectrix digitaal systeem. Ooit meenden ze het beste van twee werelden te mixen: 2-rail en 3-rail, door alle loks zo om te bouwen dat de beide spoorstaven de ene pool en de bovenleiding de andere pool vormt. Het waren toen nog beginners voor wie een keerlus onmogelijk leek ( je zou haast denken 3-rail rijders bij aanvang).

Aan hun aanpak zit wel een keerzijde: diesel- en stoomloks kunnen ze nooit meer gebruiken. Zitten zij niet mee.

Hun aanpak bewijst dat je bij 2-rail de bovenleiding functioneel kunt gebruiken, zelfs digitaal. Er is dus een andere oorzaak voor om te stellen dat het "normaal" geen zin heeft. De stroomafname is niet slechter dan via de wielen, dat is een drogreden. Het probleem zit in de rails of in de stroomafname van die wielen op de rails zelf, en niet in de bovenleiding.

Net zo'n drogreden: dat je beter digitaal kunt rijden op c-rails dan op k-rails. Er zijn op k-rails meer contactproblemen dan op c-rails, en als je de oorzaak begrijpt, dan kun je ze oplossen. Zo kijk ik ook naar 2-rail.

Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 18 januari 2016, 10:14:37
Jan Willem,

Bovenleiding functioneel voegt niets toe. In het begin van mijn modelspoor carrière heb ik Trix Express gehad. Dit is een 3 rail systeem, waarbij de beide railstaven elektrisch gescheiden zijn. Hiermee is het mogelijk om als je met functionele bovenleiding rijdt met 3 treinen onafhankelijk van elkaar te rijden. Bij een keerlus heb je problemen, trein verkeeerd om op de baan => problemen. Zodra je met meer dan twee treinen gaat rijden (maakt niet uit analoog of digitaal) vervalt het nut van bovenleiding, doordat de logica om de juiste spanning op de juiste plaats te krijgen alleen maar complexer wordt. Met de komst van digitaal en de mogelijkheid om meer treinen via de rails te sturen is de noodzaak voor functionele bovenleiding verder verminderd.

Dit is mijn verklaring.

Groet,

Gerard van der Sel.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 18 januari 2016, 13:11:55
Hoi Jan Willem,

Ik heb absoluut niet gezegd dat het niet kan  ;) Maar als je al een vorm van meertreinenbedrijf aan het maken bent (of dit nu analoge blokken, Arduino sturing of digitaal met de computer is) voegt functionele bovenleiding niets toe behalve problemen uitdagingen. Contact aan de bovenleiding blijft een klein oppervlag en daarmee een groot single point of failure. Dus de stroomafname is wel degelijk slechter. En om de boel aan te sturen wordt alles alleen maar complexer zoals Gerard al aan gaf. En waarom? Je wil toch nog steeds maar één trein per blok? Ik ben het dus volledig met Gerard eens. En het is dus absoluut geen drogreden  ;)

En 3-rail rijders moeten zelf maar uitzoeken waar ze op rijden. ;D  ;) Vroeger nog wel veel mee gereden dus het kan best leuk zijn als je het hebt (ook M-rail) maar ik vind 3-rail gewoon niet mooi. Maar als je ergens een voorraad van hebt kan je er prima mee uit de voeten.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 18 januari 2016, 23:06:53
Hoi volgers

@Timo, Gerard, Jan Willem
Bedankt voor jullie input

@Allen

In grote lijnen werkt het AAMS systeem, om het goed te kunnen testen ga ik een kleine modelspoorbaan bouwen.

Dit baantje word ongeveer 120x60 cm maar word wel als module voor de grote baan gebouwd.
Deze module word ook voorzien van scenery.

Het Baanplan

(https://images.beneluxspoor.net/bnls/keerlusbaanvariant2b.jpg)

Het word een uitdaging om dit baantje met het AAMS systeem te gaan sturen.
Dit baantje heeft 
De totale baan word door 2 motordrivers aangestuurd, twee in de bochten en 1 in het schaduw station en 1 bij het station.

Het word er niet direct bijgebouwd in de loop van de tijd ga ik dat er bij bouwen.
Dit alles wil ik met 1 a 2 Arduino' s  mega 2650 gaan sturen.
 
AAMS Baan indeling
(https://images.beneluxspoor.net/bnls/keerlusbaanvariant2ba.jpg)

Het is al meteen duidelijk dat ik te weinig i/o lijnen hebt , dit wil ik gaan oplossen door een shiftregister te gaan gebruiken, een shift-register heeft maar drie poorten nodig om acht  uitgangen te maken, door de shift register te multiplexen  kun je meer uitgangen maken, zo kun je heel veel uitgangen maken met drie i/o poorten.

Wil ik 24 i/o hebben moet ik drie shift-registers multiplexen en aan de Arduino hangen, door in het Arduino programma een matrix van 0 en 1 en te maken kan ik de uitgangen sturen.

Voorbeeld seinen matrix (let op! geen programmeercode)

matrix {0,0,0,0,0,0,0,0}  alle seinen staan uit
           {1,0,1,0,1,0,1,0} Blok 1 t/m 4 seinen Rood.
           {0,1,01,0,1,0,1 } Blok 1 t/m 4 seinen Groen
           {1,0,0,1,1,0,1,0} Blok 1 rood, blok 2 Groen, blok 3 Rood, blok 4 Rood
enz.

Deze constructie kun je ook voor wissels gebruiken.

Het schema van het shiftregister:

(https://images.beneluxspoor.net/bnls/AAMSshiftregister_schema.jpg) (https://images.beneluxspoor.net/bnls/AAMSshiftregister_schema.jpg)

Het schema van de multiplex-shiftregister

(https://images.beneluxspoor.net/bnls/AAMSshiftregistermulti_schema.jpg) (https://images.beneluxspoor.net/bnls/AAMSshiftregistermulti_schema.jpg)

Omdat er max. 20 mA per uitgang van het shiftregister beschikbaar is kun je daar hoogstens een ledje mee aansturen om meer vermogen te hebben heb ik achter het shiftregister een uln2803 driver gezet zodat bv relais kan aansturen, voor wissels levert de uln2803 te weinig vermogen, daarvoor worden vermogens transistorren voor gebruikt.

Zie onderstande schema

(https://images.beneluxspoor.net/bnls/AAMS_wisselsturing_schema1.jpg) (https://images.beneluxspoor.net/bnls/AAMS_wisselsturing_schema1.jpg)

Ook moet ik nog sensor sturing ontwerpen, welke sensor ik er voor ga gebruiken moet ik nog even bekijken, ik beging met een LDR sensor, wil ook nog een IR reflectiesensor uitproberen en een IR-lichtsluis.

De LDR sensor werkte goed op mijn testbaantje, ik ga het schema nog verder uitbreiden om de gevoeligheid van de LDR sensor te kunnen instellen, maar dat moet ik nog even verder uitzoeken.
De LDR sensor zoals in het schema werkt goed.

Schema LDR sensor.

(https://images.beneluxspoor.net/bnls/AAMSldrsensor_schema_2.jpg) (https://images.beneluxspoor.net/bnls/AAMSldrsensor_schema_2.jpg)

Dat was het weer voor vandaag

Mvg Paul  ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Te 2/2 op 19 januari 2016, 01:44:23
Ben benieuwd naar je LDR test. Met 10 kOhm zou die schaduwen moeten waarnemen, dus geschikt zijn voor schemertoestanden. Ga je je schaduwstation verlichten of is het in het verborgen gedeelte ook gewoon licht genoeg?

Dat Shiftregister is een goede vondst. Doet me ook denken aan een verbeterde old-school diodenmatrix, een manier om signalen parallel binnen lasten komen, en toch serieel te verwerken.
Zo te zien is hij 8-bits. Handig als je uln2803 driver ook 8-bits is. En 16-bits zal wel toekomstmuziek zijn?

Ik begin me wel af te vragen of een gedeelte van m'n baan zich hier ook voor leent, het deel met wisselstraat tussen kopstation, lokdepot, en hoofdbaan. Als er iets analoog duur uitpakt dan is het wel het automatiseren van rijwegen (met of zonder seinbeelden) door een wisselstraat met pak 'm beet 10 wissels. Zo'n analoge aanpak gaat meestal ook gepaard met CDU's om voldoende spanning te hebben voor wissels die dan gelijktijdig moeten schakelen. Met een Arduino aanpak kan dat ook anders, vlak na elkaar, bijvoorbeeld.

Ik ben benieuwd.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 19 januari 2016, 11:30:16
Hoi Paul,

Leuk plan. Zo krijgt het geheel wat vorm.

Nog wat gehad/gesnapt aan/van de vorige voorbeeldcode?

De totale baan word door 2 motordrivers aangestuurd, twee in de bochten en 1 in het schaduw station en 1 bij het station.
Ah, ik dacht eerst, 2 lijkt me wat weinig. Maar je bedoelt dus 2 IC's met dus 4 H-bruggen. Begrijp ik je goed als ik zeg dat de indeling is:
Driver 1: b3 b4
Driver 2: b5 b6 b7 b8
Driver 3: b9 b10
Driver 4: b1 b2 b11 b12 b13 b14

Komt overigens gelijk weer om de hoek kijken dat we hier nog steeds geen eenduidige term voor hebben  ;)

Hier zie ik wel een beperking in rijmogelijkheden. Zo kan je dan niet het station uitrijden van spoor b11 en tegelijk het station inrijden op b2. Zelfde voor het schaduwstation. Ook kan je niet rangeren tegelijk met het station binnen rijden. En als je het later gaat uitbreiden (maar goed, dat is dus later) heb je hetzelfde probleem met het in/uit rijden van b1/b6.

Dit alles wil ik met 1 a 2 Arduino' s  mega 2650 gaan sturen.
Lijkt me prima mogelijk met 1 Mega. Wil je toch meer dan één uC (en dat zou het een stuk modulairder maken) zou ik zelf gaan voor een Pro Mini of Nano. Maar voor nu moet één Mega prima gaan. Maar als je het dus later wilt uitbreiden hoeft dat niet de makkelijkste weg te zijn....
 
Het is al meteen duidelijk dat ik te weinig i/o lijnen hebt , dit wil ik gaan oplossen door een shiftregister te gaan gebruiken, een shift-register heeft maar drie poorten nodig om acht  uitgangen te maken, door de shift register te multiplexen 
Daisy chaining is het woord wat je zoekt  ;) Multiplexen is weer wat anders. Dit zou eventueel ook kunnen (hierbij sluit je de latch van ieder shift register op een aparte pin op de Arduino aan) maar kost meer pinnen (maar zou programmeren wel makkelijker kunnen maken omdat je niet verplicht ieder register elke keer hoeft te schrijven).

Maar shift registers zijn een goeie keuze, ze zijn super goedkoop en makkelijk aan te sturen.

matrix {0,0,0,0,0,0,0,0}  alle seinen staan uit [knip]
Ja, en dat "matrix" kan gewoon een array van bytes zijn. Waarbij iedere byte een heel shift register is. Voor 3 shift registers dus genoeg aan een byte shiftRegisterData[3].

Het schema van het shiftregister:
Drie opmerkingen. Waarschijnlijk is een shift register zelf al meer dan krachtig genoeg voor seinen. 5mA geeft met moderne ledjes al meer licht dan je zou willen voor een sein... Dus gewoon rechtstreeks aan het shift register zou dus ook mogelijk zijn.

De COM van de ULN kan je inderdaad aan de 5V hangen maar dan kan je niets voeden met een hogere spanning van 5V. Als je de seinen dus met 12V wilt voeden gaat dit nu niet. Overigens kan het voor het aansturen van ledjes geen kwaad de COM niet aan te sluiten.

En als laatste (en belangrijkste), gebruik pinnen 51 en 52 voor de data en clock. Dit zijn de hardware SPI pinnen  (het protocol waarmee je de shift registers aan stuurt) van de Mega. Hierdoor is het voor de Mega echt geen werk meer om het aan te sturen. Want ja, als je van een hardware oplossing gebruik kan maken, waarom zou je dat niet doen? Om dan te schrijven naar de registers gebruik je dan niet shiftOut() maar de (ingebouwde) SPI-library (https://www.arduino.cc/en/Reference/SPI). 10Mhz als snelheid zou geen probleem moeten zijn en volgens mij wil je gewoon SPI_MODE0, die komt overeen met die van shiftOut().

Schema LDR sensor.
Dit gaat zeker niet werken  ;) Maar is denk ik gewoon teken foutje  ;D Alle analoge pinnen zien op deze manier allemaal alleen maar GND. Denk dat je het GND-punt en analogin-pint wilt omdraaien  8)

Als werken met een LDR op deze manier bevalt moet je er zeker mee door gaan maar bedenk dat een Mega maar 16 analog poorten heeft. Ook is dit relatief traag, zeker omdat de Mega eigenlijk maar 1 ADC heeft. Alle pinnen worden hier gewoon op gemultiplexed (echte multiplex  ;D ). En om alleen hiervoor een 2e Mega (of uno/Pro Mini/Nano) zou ik zelf zonde vinden.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 19 januari 2016, 11:37:57
Paul,

Waarom een schuifregister en niet gewoon I2C. Dezelfde beperkingen heb je nu met je schuifregister. Bovendien kun je met I2C ook externe inputs creeren.

Groet,

Gerard van der Sel.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 19 januari 2016, 22:18:21
Hoi volgers,

@Timo

Bedankt voor je input

Ik heb de voorbeeld code bekeken en getest, moet me nog in de programmeertaal gaan verdiepen. Ik ben meer een mens van doen en ervaren, dan van lezen. :P ::)

Ik heb het schema ondertussen aangepast, had de analoog in en gnd  omgewisseld in het schema (moet dat soort dingen ook niet
's avonds laat doen ::) :P)

Voor mij is een blok een combi van motorsturing, seinsturing, bezetmelders, moeten maar eens gaan brainstormen hoe we de verschillende functies gaan noemen, ideeën zijn welkom.

Ik gebruik de uln2803 driver voor het aansturen van seinen omdat er ook nog seinen te koop zijn met gloeilampjes (vaak goedkoper dan leds)

Ben er nog niet uit welke Arduino uitvoering wil gaan gebruiken, allemaal hebben ze wel voordelen en nadelen.

@ Jan Willem

Bedank voor je input

@ Gerard

Ik kies voor de shiftregisters omdat mij programmeer kennis nog niet heel erg groot is, shiftregisters zijn makkelijker te programmeren dan een I2C , daarbij spelen de kosten ook mee de 74HC595 koop ik per 20 voor net twee Euro.
Wat ik voor een I2C chip/module weet ik niet, voor zover ik weet zijn die stukken duurder dan de 74HC595.


Mvg Paul  ;D


 
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: gvandersel op 20 januari 2016, 12:20:06
Betreft I2C module: In china rond de 2 euro, gebouwd en klaar voor gebruik. Ik heb de spec van dat ic een keer opgezocht, maar is zowel voor input als output te gebruiken. Voor I2C kun je toch een library pakken? Dus programeren is feitelijk niets.
Om je 74LS595 aan te sluiten en aan de gang te krijgen zul je echt aan de gang moeten. Bitbanging (zoals ik met de SX-bus moest) of schuifregister gebruiken. Dan ISR inrichten en dan kun je je data pas heen en weer schuiven. Ik weet dat je een SX-bus in de buurt hebt. Waarom koppel je niet meerdere Arduino's met elkaar via de SX-bus en dan laten praten.

Groet,

Gerard van der Sel.

Even gegoogled op arduino i2c io levert dit op: http://playground.arduino.cc/Code/I2CPortExpander8574
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 20 januari 2016, 18:03:16
IO expanders zijn inderdaad niet zo heel duur maar ik vind ze eigenlijk nog best overpriced. Een Pro Mini als I2C IO expander gebruiken is eigenlijk goedkoper...  ;D (Staat op mijn verlanglijstje code voor te maken...) En voor het geld van 1 PCF8574T kan je 30 shift registers kopen. De 74HC595 is dan wel alleen output maar voor input kan je de tegenhanger, de 74HC165 pakken. En als je de hardware SPI gebruikt kan je met 4 pinnen zowel inputs als outputs tegelijk afhandelen zonder I2C overhead. En ja, misschien is met I2C iets makkelijker iedere pin zo out of the box in te stellen. Maar met één functie of library heb je zo alle inputs en outputs ingelezen/gezet in minder tijd dan één I2C transactie zou kosten. En aangezien Paul er seinen mee wil aansturen is het toch al makkelijker hier functies voor te schrijven en of die nu met de wire llibrary van doen hebben of de SPI library maakt niet zo veel uit. Dus in dit geval snap ik het wel  :)

@Paul, wat betreft de code, dat hands on snap ik wel :) Maar om het iets makkelijker te maken zou ik zeggen, kijk even naar de Ring buffer pagina (https://en.wikipedia.org/wiki/Circular_buffer) op Wikipedia. Het is wel de Engelse pagina maar ik denk dat vooral de animatie al heeeel veel duidelijk kan maken  ;)

Wat betreft namen dacht ik toen aan blokken (motor driver) en subblokken (detectie, sein, in/uit-schakel relais).


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 14 februari 2016, 21:44:31
Hoi volgers,

Heb eindelijk weer wat te melden.

Ik ben begonnen met de eerste module van mijn nieuwe modelspoor baan gestuurd door het AAMS systeem
(https://images.beneluxspoor.net/bnls/IMG_20160202_213503.jpg)

Dit is de laatste module keer/wacht van de modulebaan.

Ik ben aan het elektrische gedeelte van de baan begonnen.

(https://images.beneluxspoor.net/bnls/IMG_20160211_215027.jpg)
(https://images.beneluxspoor.net/bnls/IMG_20160212_185858.jpg)

Om een zo storingsvrije modulebaan te maken soldeer ik alle bedrading op gaatjesprint en leg de draden in een bindrug om geen loshangende bedrading te hebben.

(https://images.beneluxspoor.net/bnls/IMG_20160212_200509.jpg)

Er moet nog veel gesoldeerd worden om de baan te kunnen testen, ook moeten er nog verschillende sturingen gemaakt worden, als sensor ga ik LDR's gebruiken en IR benaderings- sensoren (In de berg, schaduwstation), dat werkte op het proefbaantje erg goed.

De seinen worden aan gestuurd door een 74hc595 shiftregister en de sensoren worden door de 74hc165 shiftregister gestuurd (alle ldr's worden via een digitale ingang gelezen, en de IR benadering sensoren via analoog in.)

Om de wissels te sturen wil ik gebruik maken van mosfet drivers, deze drivers kosten tussen de een en de twee Euro.
(https://images.beneluxspoor.net/bnls/s_l1600_2.jpg) (https://images.beneluxspoor.net/bnls/s_l1600_2.jpg)
(https://images.beneluxspoor.net/bnls/s_l1600_1_1.jpg) (https://images.beneluxspoor.net/bnls/s_l1600_1_1.jpg)
Plaatjes van Ebay.com geleend

Deze printjes zijn goed onder de baan te monteren, zonder dat deze printjes in de weg zitten.

@Gerard en Timo

Badankt voor jullie input.

Mvg Paul ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 14 februari 2016, 23:55:05
Hallo Paul,

Fijn dat je er weer bent met updates. Leuk draadje om te lezen.

succes, Frits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 18 februari 2016, 23:40:04
Hoi volgers,

Wisselsturing en ULN driver AAMS.

Ik heb een wisselsturing en 2 voudige wisselsturing in combinatie met een uln2803 driver om diverse zaken mee aan te sturen, er valt te denken aan ontkopelrails, servo's, seinsturingen voor gloeilampje enz. ,eigenlijk alles wat je kan aansturen met het AAMS systeem.

Deze printen zijn prototype's om mee te gaan testen, ik denk dat ik geen printontwerp voor deze schakelingen ga ontwerpen, deze schakelingen kunnen zonder probleem op stripe-board gebouwd worden (kan de Nederlandse vertaling ken ik van dit type protoboard niet vinden) groot zijn de schakelingen niet, misschien de componenten lay-out  aanpassen.

De blus diodes komen bij de spoelen van de wissels te zitten, of kan ik ze beter er op de print bij solderen?

Foto sturingen.

(https://images.beneluxspoor.net/bnls/IMG_20160218_212544.jpg) (https://images.beneluxspoor.net/bnls/IMG_20160218_212544.jpg)

Onder de Baan gemonteerd.

(https://images.beneluxspoor.net/bnls/IMG_20160218_213303.jpg) (https://images.beneluxspoor.net/bnls/IMG_20160218_213303.jpg)

AAMS systeem en blok sturingen.

Na veel test en onderzoek werk heb ik besloten om voor de Arduino Nano te kiezen, prijs technische de beste keuze,  om het AAMS systeem te gaan bouwen, ook word de indeling van de sturing veranderd naar een bloksturing, dwz. dat ik een Arduino Nano inzet per blok en de motordriver( tweevoudig ) verdeel over twee blokken, op deze manier kan ik de twee blokken synchroniseren zodat er geen sluiting kan ontstaan tussen de twee blokken, hoe ik dat ga doen met de rest van de blokken moet ik nog verder uitzoeken.

Arduino blok communicatie.

Ik moet nog uitzoeken hoe ik twee poorten met elkaar kan laten communiceren.

IK ben er al bezig mee geweest maar het lukt mij nog niet om het werkend te krijgen ???, zo moeilijk kan dat niet zijn, ik zal wel weer wat over het hoofd zien

Zie plaatje

(https://images.beneluxspoor.net/bnls/Untitled_Sketch_bb.jpg) (https://images.beneluxspoor.net/bnls/Untitled_Sketch_bb.jpg)

Het moet zo zijn als er een bezetmelding binnenkomt via de analoog in op blok 2, blok 1 bezet word gemeld.

Bedienings-paneel en Arduino.

In de pen zit nog een bedienings-paneel waarmee ik ook de AAMS sturing kan bedienen, dit wil ik gaan doen dmv or-poorten, dit project moet nog verder uitgewerkt worden.

Bindruggen

Ik ga een nieuwe voorraad bindruggen 8 mm halen om de bedrading onder de baan te kunnen ordenen.

AAMS Projecten in de pen.

Ik heb onderdelen bestelt om meer wisselsturingen te maken en een aantal onderdelen om een shiftregister input (74hc165) en een shiftregister output (74hc595) te gaan bouwen, deze shiftregisters worden op een print samen gebouwd (om 8 inputs en 8 outputs te maken heb ik dan maar vier poorten van de Arduino voor nodig), dit projectje moet nog verder uitgewerkt worden.

Alleen nog wachten tot de onderdelen binnenkomen.  ::)

Mvg Paul ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Servé op 19 februari 2016, 09:38:43
Misschien even de GND's met elkaar doorverbinden?
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 19 februari 2016, 09:43:55
Hoi, Serve

De gnd en de +5v zijn in de proefopstelling door gekoppeld.

Het lukt alleen niet om de Arduino de poorten te sturen, ik denk dat ik wat over het hooft zie in het programma.

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 20 februari 2016, 22:21:33
Hoi volgers,

Ik heb vandaag de bindruggen binnen gekregen, ik kan nu verder met het netjes maken van de bedrading onder de baan

Ik ben vandaag nog even bezig geweest met het ontwerpen van een Shiftregister input / output schakeling, deze heb ik op een
stripe-board ontworpen zodat ik kan zien hoe ik het moet gaan maken, ik ga voor deze schakeling geen print ontwerpen omdat het op een standaard stripe-board (10 x 5 cm)gebouwd word.

Schema (kan nog een foutje in zitten)

(https://images.beneluxspoor.net/bnls/arduinoshiftinputoutput_schema.jpg) (https://images.beneluxspoor.net/bnls/arduinoshiftinputoutput_schema.jpg)

Eerste ontwerp op stripe-board (kan nog een foutje in zitten)

(https://images.beneluxspoor.net/bnls/arduinoshiftinputoutput_bb.jpg) (https://images.beneluxspoor.net/bnls/arduinoshiftinputoutput_bb.jpg)

Het 74HC165 ic heb ik eerst moeten ontwerpen voor Fritzing, staat niet in de onderdelen lijst van Fritzing.

Fritzing is een prima programma om schema's en printontwerpen mee te maken.

Mvg Paul ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Te 2/2 op 24 februari 2016, 00:17:22
Ik ben wel een beetje benieuwd, want jouw draadje stimuleert me om anders te gaan kijken naar de analoge schakelingen uit het verleden. Ik zie althans winstpunten, al zie ik ook op tegen het voor mij nog wat onbekende terrein van deze hardware. Zo zie ik bijvoorbeeld dat ik bepaalde oplossingen niet kan bereiken met minder relais (dat blijven er evenveel), maar wel door ze anders te bedraden, en hun functie te verleggen. En daarin schuilt dan de grootste winst.

Ik blijf je volgen, op afstand.
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 14 maart 2016, 14:46:36
Hoi Paul,

Weer lekker bezig zie ik :D

De blus diodes komen bij de spoelen van de wissels te zitten, of kan ik ze beter er op de print bij solderen?
Waarom niet op de print? Alle ruimte en zit je niet te stoeien bij de spoel en heb je niet de mogelijkheid dat je ze vergeet.

Na veel test en onderzoek werk heb ik besloten om voor de Arduino Nano te kiezen, prijs technische de beste keuze,
Nano en Pro Mini zijn niet alleen prijsvriendelijker, ze zijn ook veel print vriendelijker.

  om het AAMS systeem te gaan bouwen, ook word de indeling van de sturing veranderd naar een bloksturing, dwz. dat ik een Arduino Nano inzet per blok en de motordriver( tweevoudig ) verdeel over twee blokken,
waarom dan niet überhaupt één Nano per twee blokken?

op deze manier kan ik de twee blokken synchroniseren zodat er geen sluiting kan ontstaan tussen de twee blokken,
Sluiting heb je (bij zelfde rijrichting) nooit. Het probleem met synchronisatie is dat de twee motor bruggen precies aan staan in elkaars uit gebied waardoor er dus langer spanning op de train staat met als gevolg harder gaan rijden.

Sluiting kan natuurlijk ook maar dat probleem is hetzelfde of ze nu wel of niet via dezelfde Arduino aangestuurd worden.

hoe ik dat ga doen met de rest van de blokken moet ik nog verder uitzoeken.
Denk wel dat dit iets waar je mee moet gaan beginnen wil je dit mooi oplossen. Het regelen van snelheid is namelijk wel iets waar je hele systeem op leunt en later slechter in te bakken is. Twee mogelijke oplossingen:

1) Een puls lijn. Bijvoorbeeld de master (zou logische keuze zijn) stuurt periodiek een puls over een vaste lijn naar alle Arduino's
2) Je past toch al data communicatie toe. Waarom zou de master deze boodschap niet als pakket kunnen versturen?

Maar hoe dan ook zou je er in moeten duiken hoe je de timer van PWM beïnvloed zodat deze redelijk gelijk lopen. Zoals ik zei, kortsluiting krijg je niet dus een kleine afwijking (minimaal snelheidsverschil) is niet zo erg. Maar het is niet iets wat door de Ardui9no IDE makkelijker gemaakt is dus je zult direct de timer moeten beïnvloeden.

IK ben er al bezig mee geweest maar het lukt mij nog niet om het werkend te krijgen ???, zo moeilijk kan dat niet zijn, ik zal wel weer wat over het hoofd zien
Afgezien van onverbonden GND's (in ieder geval op de tekening) zie ik nietsfout en zou het zo moeten werken. Alleen ook hier geldt, lange draden (10cm+) zijn een no-go. Dit zou je al wat kunnen rekken door filtering van het signaal en een externe pull up weerstand (of pull down, maar in ieder geval stuk sterker dan de interne pull up an de Arduino).

In de pen zit nog een bedienings-paneel waarmee ik ook de AAMS sturing kan bedienen, dit wil ik gaan doen dmv or-poorten, dit project moet nog verder uitgewerkt worden.
Mag ik vragen wat je precies van plan bent met die or-poorten? Klinkt mij niet heel specifiek bedieningspaneel.

Schema (kan nog een foutje in zitten)
Het schema is überhaupt al wat lastig leesbaar maar zie ook wat rare dingen.

Waarom gebruik je Q7' ipv Q7 om de HC165 uit te lezen?

Ik mis iets heeeeeeeel belangrijks! De ontkoppelcondensatoren. Zowel bij de HC165 als de HC5958 moet je zo dicht mogelijk bij Vcc een 100n keramische condensator plaatsen. En omdat de HC595 echt een last stuurt zou een zo een elco ook niet misstaan.

Je hebt nu de data lijnen aan elkaar gehangen en de "kortsluiting" ondervangen door een weerstand tussen de data lijnen. Dit zou wel moeten werken maar ben je in software dus de pin aan het wisselen tussen uitgang en ingang en doe je om en om input output. Een meer gebruikte optie is om de hardware matige SPI module van de Arduino te gebruiken. Hierbij koppel je juist de latch pinnen en clock pinnen maar voer je de dataIn en dataOut los naar de Arduino. Op deze manier lees je de HC165 tegelijk dat je de HC595 beschrijft en heb je geen weerstand nodig.

Code is dan in de trant van:
#include <SPI.h>

const byte LatchPin = 10;
//Volgende zijn vanzelf door hardware SPI
//Clock = 13
//dataInPin = 12
//dataOutPin = 11

byte dataIn;
byte dataOut;

void setup(){
  SPI.begin();  //configureer de SPI uitgangen
  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0)); //stel in
  pinMode(LatchPin, OUTPUT);
}

void loop(){
  updateShiftRegisters();
}

void updateShiftRegisters(){
  digitalWrite(LatchPin, HIGH); //Latch alle regsters
 
  //Gebruik SPI ahrdware.
  dataIn = SPI.transfer(dataOut);

  digitalWrite(LatchPin, LOW); //Reset voor volgende keer.
}

Het 74HC165 ic heb ik eerst moeten ontwerpen voor Fritzing, staat niet in de onderdelen lijst van Fritzing.
Vind je ook niet dat ze dat veeeeeeeel lastiger hebben gemaakt dan nodig zou moeten zijn? Het is verdorie makkelijker een footprint te maken in KiCad dan het is om een simpel DIP IC toe te voegen aan Fritzing...


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 14 maart 2016, 23:34:28
Hoi volgers,

@Timo

Bedankt voor je input.

vr1 :
Ik gebruik BD681 NPN Power Darlington transistor voor de aansturing van mijn wissels, als ik het goed in de datasheet heb gekeken zie ik tussen de C->E een blus diode zitten, vandaar dat ik in eerste instantie geen blusdiode heb zitten.
Voor mijn definitieve wissel sturing ga ik de BD139 power transistor gebruiken, daar worden wel blusdiodes op de print geplaatst.

vr2 :
Mee eens ;D

vr3 :
Het moet een flexibel bloksysteem worden, en als het nodig is kan ik het blok makkelijker uitbreiden.

vr4 en vr 5:

Daar ben ik nog mee bezig, om dat goed uit te zoeken  :D

vr6 :

Ik ga dat systeem niet gebruiken, ik blijf bij I2C voor de communicatie tussen de blokken.

vr7:

Het is de bedoeling om de baan zowel met de Arduino en het bedienings-paneel  te sturen en dat tegelijkertijd, ik wil de Arduino en de handbediening van elkaar scheiden, als per ongeluk, tegelijk de handbediening als de Arduino dezelfde wissel stuurt er geen rare dingen kunnen gebeuren. Overigens moet het een Xor gate zijn die ik daarvoor gebruik.

Zie Schema:


(https://images.beneluxspoor.net/bnls/Xor_schema.jpg) (https://images.beneluxspoor.net/bnls/Xor_schema.jpg)

vr 8:

Er zitten inderdaad nog kleine foutjes in het schema, word nog aan gewerkt.
De poorten worden op verschillende manieren afgebeeld in de verschillende datasheets.
Q7' is de uitgang naar de volgende shiftregister.


Ik ben al een tijdje niet aan het programmeren, omdat ik het AAMS systeem eerst wil ontwerpen en proef printen gebouwd wil hebben, deze printen kan ik namelijk ook zonder Arduino testen.
Als ik daar mee klaar ben, ga ik me buigen over het programmeer werk.
Ik ben met teveel verschillende dingen bezig, met betrekking tot het AAMS systeem bezig geweest, zodat ik het spoor even bijster was.

vr9:
Het viel achteraf wel mee, in plaats van het schema/ breadboard/ icon symbool met inktscape aan te passen, lees ik in de svg file in, in een tekst editor en pas daar de teksten aan, interesse ;D  dan zet ik de tekst versie van een svg file in dit draadje.

@Allen

Ik ben nu alweer een tijd bezig met het ontwerpen van het AAMS systeem, het programmeren heb ik op een laag pitje gezet, om me eerst te richten op het ontwerpen van de diverse schakelingen met betrekking tot het AAMS systeem.

De eerste gedachte om mijn treinbaan met de computer te sturen heb ik voor nu laten vallen, de AAMS sturing word nu ontworpen als bloksysteem, waarbij elke Arduino(NANO) een blok is.
Alleen kan ik nog wel de mededelingen die de Arduino stuurt naar de computer uitlezen als dat nodig is, in een later stadium wil ik evt de computer gaan gebruiken om het blok systeem te sturen.
Doordat ik met te veel dingen bezig was met betrekking tot het AAMS systeem, ben ik de weg en de samenhang uit het oog verloren.
Op dit moment hou ik me eerst bezig met de electronica en het verder ontwikkelen van het AAMS systeem.

Op deze manier blijft het draadje wat beter leesbaar en overzichtelijker, dus eerst de electronica ontwerpen en prototype printen maken, daarna testen (kan namelijk ook zonder Arduino) als ik daarmee klaar ben ga ik me pas weer bezig houden met programmeren.

Welke sturingen wil ik gaan maken ontwerpen :
Morgen zet de de schema's(inclusief de prototypes op stripeboard) die klaar zijn in dit draadje.

Mvg Paul  ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 15 maart 2016, 10:20:20
Hoi Paul,

Bedankt voor je antwoord. Moest wel veel scrollen om door je vraag verwijzingen. Daarvoor zijn quotes erg handig :)

Ik gebruik BD681 NPN Power Darlington transistor voor de aansturing van mijn wissels, als ik het goed in de datasheet heb gekeken zie ik tussen de C->E een blus diode zitten, vandaar dat ik in eerste instantie geen blusdiode heb zitten.
Daar mag dan inderdaad wel een diode zitten maar dit is geenszins een blusdiode! Daarvoor zit hij simpelweg op de verkeerde plaats. De blusdiode moet over de spoel staan. Dat houdt hier dus in dat hij tussen de C en de V+ (voedingsspanning) moet. De diode in de transistor doet hier niets.

Het moet een flexibel bloksysteem worden, en als het nodig is kan ik het blok makkelijker uitbreiden.
Dat kan ook prima als je twee blokken op één Arduino hebt. De Nano is meer dan krachtig genoeg om twee blokken volledig los van elkaar aan te sturen. Dan maakt het in gebruik niet uit dat ze op dezelfde Arduino draaien of niet.

Ik ga dat systeem niet gebruiken, ik blijf bij I2C voor de communicatie tussen de blokken.
Zou ik wel kijken om zwaardere I2C pull up weerstanden te gaan gebruiken.

Het is de bedoeling om de baan zowel met de Arduino en het bedienings-paneel  te sturen en dat tegelijkertijd, ik wil de Arduino en de handbediening van elkaar scheiden, als per ongeluk, tegelijk de handbediening als de Arduino dezelfde wissel stuurt er geen rare dingen kunnen gebeuren. Overigens moet het een Xor gate zijn die ik daarvoor gebruik.
Met alle respect maar hierbij zijn de XOR's echt nutteloos. Wil je ook de wissels bedienen met een schakelaar, sluit deze dan gewoon aan over je huidige wisseldriver. Bereik je precies hetzelfde. En in beide gevallen zorg je er niet voor dat handbediening automatisch blokkeert of andersom. En de lijnen van de schakelaars naar de XOR zijn ook enorm storing gevoelig door de hoge impedantie.

Dus wil je altijd de mogelijkheid voor handbediening, schakelaars gewoon over de stuurtransistor.
En wil je bij de mooie opzet van je project blijven zou ik ook een Arduino besturingspaneel maken. In de tussentijd kan je dan bovenstaande oplossing prima gebruiken.

Q7' is de uitgang naar de volgende shiftregister.
Maar Q7' is echt niet de uitgang naar het volgende shiftregister ;) Dat is Q7 (pin 9).

Ik ben al een tijdje niet aan het programmeren, omdat ik het AAMS systeem eerst wil ontwerpen en proef printen gebouwd wil hebben, deze printen kan ik namelijk ook zonder Arduino testen.
Als ik daar mee klaar ben, ga ik me buigen over het programmeer werk.
Ik ben met teveel verschillende dingen bezig, met betrekking tot het AAMS systeem bezig geweest, zodat ik het spoor even bijster was.
Eerst goed voor ogen hebben wat je wilt is de basis voor het maken van een passende oplossing.  (y) En subsystemen zijn al prima te testen los of eventueel al met de Arduino. Ook code, zolang je non-blocking code schrijft (zonder delay() ) is combineren van losse programmeeraspecten ook prima te doen.

Het viel achteraf wel mee, in plaats van het schema/ breadboard/ icon symbool met inktscape aan te passen, lees ik in de svg file in, in een tekst editor en pas daar de teksten aan, interesse ;D  dan zet ik de tekst versie van een svg file in dit draadje.
Dan heb je het achteraf nog moeilijk gedaan  ::) Na veel zoeken kwam ik er achter dat er voor DIP achtige dingen gewoon een kale DIP beschikbaar is die je kunt aanpassen en nummeren. Maar ook dat was best omslachtig. Vind het toch wel het slechtste punt van Fritzing  :(

Maar goed, weer lekker bezig :) Zelf ontbreekt het me helaas echt aan tijd :/


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Te 2/2 op 15 maart 2016, 18:46:17
vr3 :
Het moet een flexibel bloksysteem worden, en als het nodig is kan ik het blok makkelijker uitbreiden.
(...)
de AAMS sturing word nu ontworpen als bloksysteem, waarbij elke Arduino(NANO) een blok is.

Ik hobbel er nog wat achteraan.

Wat is voor jou een flexibel bloksysteem? En wat moet dat bloksysteem kunnen afhandelen?
Is het flexibeler als elk blok apart een schakeleenheid vormt, of is dat zo omdat een shield per NANO niet meer tegelijk kan afhandelen, of heeft dat er niets mee te maken?

Je stelt je voor dat je per 2 blokken motordrivers hebt, waarom niet 1 per blok?
Ik begrijp dat Timo voorstelt om de motordrivers per NANO (of pro mini) te rangschikken, en blokken per twee (of meer) per NANO onder te brengen. Dat is ongetwijfeld veel goedkoper.
Zouden er ook 6 blokken op een NANO kunnen? Wat vormt de inperking?

Ik mompel ook maar wat, maar ja, ik zit met 20-30 blokken, en wat daarmee te doen.
En een NANO per blok wordt dan ook weer begrotelijk (en hoe overzie je dat dan weer).

Als ik de schema's volg, dan rijg je de NANO's aan elkaar tot een soort netwerk. Daarbij is er eentje master, en de rest is slave.  Lijkt mij dat de master ook de bezetmeldingen verwerkt en de seinen kleurt, waardoor de slaafjes uitvoerend werk verrichten op blokniveau.
 
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 15 maart 2016, 20:06:01
Is het flexibeler als elk blok apart een schakeleenheid vormt, of is dat zo omdat een shield per NANO niet meer tegelijk kan afhandelen, of heeft dat er niets mee te maken?
Ik ben dan geen Paul en kan niet zijn exacte idee weergeven maar één Nano is meer dan krachtig genoeg om best wat blokken te doen. Maar dan heb je bijvoorbeeld ook te maken met alle bekabeling van al die blokken die naar één punt moet.

Je stelt je voor dat je per 2 blokken motordrivers hebt, waarom niet 1 per blok?
Ik begrijp dat Timo voorstelt om de motordrivers per NANO (of pro mini) te rangschikken, en blokken per twee (of meer) per NANO onder te brengen. Dat is ongetwijfeld veel goedkoper.
De gebruikte motordrivers (die inderdaad een prima oplossing zijn) hebben al twee kanalen. Je kan er dus al twee motoren mee aansturen. Vandaar dat het mij logisch lijkt me Arduino ook twee (of een meervoud, maar twee is mooi modulair) aan blokken te laten doen.

Zouden er ook 6 blokken op een NANO kunnen? Wat vormt de inperking?
Dat zou prima mogelijk zijn. De Arduino heeft standaard ook 6 PWM poorten dus dat komt goed uit. (Vergeet ik alleen even het feit dat je niet aan de frequentie van twee daarvan wilt zitten.) Alleen vormt alle IO die je nodig hebt dan ook al wel een enorme bottleneck. Twee blokken hebben nog beperkt aantal IO nodig waardoor je, eventueel met één of twee shiftregisters, wel klaar bent. Complexiteit neemt enorm toe terwijl een extra Nano eigenlijk niets kost.

Ik mompel ook maar wat, maar ja, ik zit met 20-30 blokken, en wat daarmee te doen.
En een NANO per blok wordt dan ook weer begrotelijk (en hoe overzie je dat dan weer).
Met €1,75 per Nano of €1,20 voor een Pro Mini is dat ook best te overzien.

30 blokken klinkt al als een redelijke baan. Bedenk wel dat de voorgestelde I2C niet geschikt is om afstanden mee te overbruggen ook al kom je er misschien mee weg als je stevige pull up's gebruikt.

Als ik de schema's volg, dan rijg je de NANO's aan elkaar tot een soort netwerk. Daarbij is er eentje master, en de rest is slave.  Lijkt mij dat de master ook de bezetmeldingen verwerkt en de seinen kleurt, waardoor de slaafjes uitvoerend werk verrichten op blokniveau.
Dat is maar net hoe je het wilt. Je zou er voor kunnen kiezen alle slimmigheid in de master te bakken maar dat is niet heel modulair. Je kan ook voor multi-master gaan waarbij iedere node iedere andere node kan aanspreken. Of je laat de slaves alles afhandelen en laat een master berichten tussen slaves verzenden als blokken iets moeten uitwisselen. Laatste twee lijken me een stuk modulairder.


Timo
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 19 maart 2016, 01:20:27
Hoi Volgers,

@Timo

 Bedank voor je andworden.

@TE2

Met een flexibel blok systeem bedoel ik, dat ik zonder al te veel gedoe er een blok kan tussen zetten, of het blok er bij zetten.

Citaat
Je stelt je voor dat je per 2 blokken motordrivers hebt, waarom niet 1 per blok?
Ik begrijp dat Timo voorstelt om de motordrivers per NANO (of pro mini) te rangschikken, en blokken per twee (of meer) per NANO onder te brengen.
Dat is ongetwijfeld veel goedkoper.Zouden er ook 6 blokken op een NANO kunnen? Wat vormt de inperking?

Dat heb je, denk ik verkeerd begrepen per blok gebruik ik 1 motodriver, de motodrivers die ik gebruik hebben 2 onafhankelijke sturingen op een print, vandaar dat ik 1 motordriver per blok gebruik.

Ik wil juist geen twee blokken op een Arduino NANO gebruiken vanwege de funkties die deze blokken moeten kunnen herbergen.

Een een overzicht van de in/uit gangen op een Arduino NANO

Arduino NANO

8x Analog in oa blokbezet melding (kan ook als digital in gebruikt worden)
13 digital i/o waarvan er twee nodig zijn voor de communicatie tussen de computer en Arduino

Mijn AAMS systeem gebruikt :

6x analog in voor bv. bezetmelding in een blok.
2x analog in voor I2C (word gebruikt voor communicatie tussen de verschillende blokken.)

2x digital voor seriële communicatie Arduino naar pc  (in een later stadium nodig voor sturing met pc)
3x digital voor 2 voudige output shiftregister.
3x digital voor 1 voudige input shiftregister. (door beide op dezelfde porten te zetten kan je nog 2 extra digitale poorten gebruiken)
3x digital voor motor driver (pwm uitgangen)
2x digital reserve. (bv wissel in blok die door de blok sturing word aangestuurd, of een extra bloksein enz.)

Er word ook nog een speciale Wissel sturing blok kaart gebruikt (Arduino NANO) (max 16 wissels met gebruik van een 4 voudige  output shiftregister)

Even simpel bekeken kun je met 1 Arduino NANO max 8 blokken gebruiken, als je 1 blokdetectie per Analog in gebruikt, je kunt max 2 motordriver per Arduino NANO gebruiken, 6x pwm uitgang! ::)

Er zal vast wel meer mogelijk zijn maar dat weet ik niet, het word er alleen maar ingewikkelder door ben ik bang, ik kies voor de simpele oplossing, 1 blok per 1 Arduino Nano. ;D

@Allen

Al een paar dagen bezig geweest om verschillende prototypes van de AAMS sturing te ontwikkelen en te bouwen, daarna kan ik deze prototypes gaan testen.

Als eerste.

AAMS Wisselsturing:

Dit prototype neemt het omzetten van de wissels voor zijn rekening, per print kun je twee wissels sturen.

Het prototype:


(https://images.beneluxspoor.net/bnls/AAMSwisselsturingV1_bb.jpg) (https://images.beneluxspoor.net/bnls/AAMSwisselsturingV1_bb.jpg)


Het schema:


 (https://images.beneluxspoor.net/bnls/AAMSwisselsturingBD139_schema.jpg) (https://images.beneluxspoor.net/bnls/AAMSwisselsturingBD139_schema.jpg)


Foto prototype:


(https://images.beneluxspoor.net/bnls/IMG_20160317_164249goed.jpg) (https://images.beneluxspoor.net/bnls/IMG_20160317_164249goed.jpg)


Het  input shift register

Op dit prototype kan ik diverse digitale sensoren aansluiten voor bv. detectie.

Het prototype:


(https://images.beneluxspoor.net/bnls/AAMS74HC165shiftregister_bb_1.jpg) (https://images.beneluxspoor.net/bnls/AAMS74HC165shiftregister_bb_1.jpg)


Het schema:


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


Foto prototype:


(https://images.beneluxspoor.net/bnls/IMG_20160317_164317goed_1.jpg) (https://images.beneluxspoor.net/bnls/IMG_20160317_164317goed_1.jpg)


De 2 voudige output shiftregister:

Met dit prototype kun je 16 uitgangen gebruiken voor het omzetten van wissels of voor weergave seinbeelden, of het sturen van relais enz.

Het prototype:


(https://images.beneluxspoor.net/bnls/shiftregister595dubbel_bb.jpg) (https://images.beneluxspoor.net/bnls/shiftregister595dubbel_bb.jpg)


Het schema:


(https://images.beneluxspoor.net/bnls/shiftregister595dubbel_schema.jpg) (https://images.beneluxspoor.net/bnls/shiftregister595dubbel_schema.jpg)


Foto prototype:


(https://images.beneluxspoor.net/bnls/IMG_20160317_164355goed.jpg) (https://images.beneluxspoor.net/bnls/IMG_20160317_164355goed.jpg)


De uln2803 driver.

Met dit prototype kun je zwaardere stromen sturen bv. ontkoppel rails, seinen met gloeilampjes enz.

Foto Prototype:


(https://images.beneluxspoor.net/bnls/IMG_20160317_164422goed.jpg) (https://images.beneluxspoor.net/bnls/IMG_20160317_164422goed.jpg)


LM311 analog to digital converter

Met dit prototype kun je de analoge sensoren gebruiken om in te lezen naar een digital in port, het wekt met verschillende sensoren.

Het prototype:


(https://images.beneluxspoor.net/bnls/Analoootodigitalsensorprint_bb.jpg) (https://images.beneluxspoor.net/bnls/Analoootodigitalsensorprint_bb.jpg)


Het Schema:


(https://images.beneluxspoor.net/bnls/Analoootodigitalsensorprint_schema.jpg) (https://images.beneluxspoor.net/bnls/Analoootodigitalsensorprint_schema.jpg)


Foto Prototype:


(https://images.beneluxspoor.net/bnls/IMG_20160318_223236.jpg) (https://images.beneluxspoor.net/bnls/IMG_20160318_223236.jpg)


Zoals je ziet is deze schakeling enkelvoudig gebouwd, er moet nog een tweede schakeling bijkomen, deze enkelvoudige prototype heb ik getest en het werk goed.

De Opstelling van de Arduino Nano's.

(https://images.beneluxspoor.net/bnls/IMG_20160318_232546.jpg) (https://images.beneluxspoor.net/bnls/IMG_20160318_232546.jpg)

De Arduino NANO's worden per 4 blokken en twee motordrivers samengebouwd.

Het eerste project om het AAMS systeem te testen, ben ik ondertussen aan het bouwen, op deze testbaan worden 4 blokken gebruikt en per blok worden er minimaal 4 sensoren per blok gebruikt, tevens is dit het eerste module van mijn nieuw te bouwen modulebaan, meer daarover in mijn bouwdraadje, zie onderaan de pagina.

Foto onderkant module:

(https://images.beneluxspoor.net/bnls/IMG_20160308_203630.jpg) (https://images.beneluxspoor.net/bnls/IMG_20160308_203630.jpg)

Zo, dat was het weer :P   voor deze keer, ik probeer dit draadje regelmatig te updaten  ;D

Mvg Paul ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 19 maart 2016, 15:08:48
Hoi volgers,

Even wat van mijn afschrijven :( . (Ik wil het andere topic niet vervuilen)

Ik las in een ander topic waar de poster een vraag stelt over optocuoplers, weer een zinloze discussie op gang kwam, dat vind ik erg jammer, je haalt het topic er mee onderuit.

Ik heb een gedeelte van de tekst verwijderd.

Het is vaak makkelijker om alles met logische poorten en relais te sturen dan met de Arduino.

Als voorbeeld neem ik even de schakeling "LM311 analog to digital converter" door de output van de print op een, laten we zeggen: Xor poort te zetten kunnen we al een via een transistor op de uitgang van de Xor poort een relais aansturen (even simpel gezien, het werk echter wel), het werkt zelfs al door een transistor type PNP op deze uitgang te zetten.

Even een klein voorbeeld:

Stel ik heb een ovaal met uitwijk spoor, op de "LM311 analog to digital converter" zitten twee LDR's elke LDR stuurt een uitgang aan, aan deze uitgang hang ik een Xor poort, als een trein over een LDR heen rijd word de uitgang hoog en stuurt een van de ingangen die op de Xor poort aan waardoor het relais aantrekt dan wel afvalt (afhankelijk van de uitvoering met of zonder optocoupler) waardoor de trein stopt de andere uitgang zal nu vrij gegeven worden waardoor de andere trein kan vertrekken.

LET OP! dit is even simpel gedacht, maar het werk wel, probeer het maar eens uit als je het niet geloofd. (je kunt het ook testen met twee elektromotoren, wel even een transistor type PNP gebruiken! ;) )
Citaat
Voor het schakelen van een relais heb je inderdaad een goeie voeding nodig. Maar ook genoeg ontkoppeling op de voeding. Een extra condensator kan helpen om de inschakelpuls op te vangen. Ook moet je nooit de on-board 5V regulator van de Arduino om andere dingen dan chips en een paar ledjes te voeden. Daarvoor is hij simpelweg te licht. Gebruik hiervoor een externe (DC-DC converter) regulator. 
Ikzelf heb 8 relais tegelijk gestuurd (Eerste testen met AAMS) ,de Arduino gaf geen krimp ook als ik alle 8 de relais tegelijk schakelde, het kan misschien wel van de Arduino uitvoering afhangen of het werk, ik heb de Arduino uitvoering gebruikt met de 28 pollig ATmega 328 in dil uitvoering, het kan zijn dat de Arduino's met de smd ATmega 328 chips dat niet kunnen.

(https://images.beneluxspoor.net/bnls/IMG_20160319_150233.jpg) (https://images.beneluxspoor.net/bnls/IMG_20160319_150233.jpg)


Zoals je op de foto ziet is de spanigsregelaar op de linker Arduino groter  dan de Arduino's aan de rechterkant, dat kan misschien verschil maken ::) , echter weet ik dat niet, het zou kunnen.

Het is natuurlijk wel verstandig om voor de schakelingen achter de poorten een eigen voeding te gebruiken, maar het is niet direct nodig.

Ik heb zelf ook relais printen gemaakt, type: actief hoog, dat werkt net zo goed als de uitvoering met optocouplers, de relais kaarten met optocouples zijn wat makkelijker verkrijgbaar dan die zonder optocouplers (ik kan niet bij Aliexpress bestellen, heb geen creditcard) het zou kunnen dat je daar nog exemplaren zonder optocoupler kun vinden.

Voor mijn AAMS systeem blijf ik voor een gedeelte afhankelijk van relais, dit om de stations sporen, kop/laad/los/opstel sporen te kunnen uitschakelen, het blijft een analooge sturing, digitale locomotieven kunnen er waarschijnlijk niet eens op rijden.

Voor mijn kleine schaduw station heb ik een 4 voudige relais sturing nodig, waarmee ik de schaduw sporen mee kan uitschakelen, deze ga ik zelf bouwen, er zijn natuurlijk ook 4 voudige relais kaarten verkrijgbaar, maar ik gebruik bij voorkeur voor deze toepasing bi-polaire relais, zodat ik een terug koppeling naar mijn bedienings-paneel heb, zonder poortjes van de Arduino te gebruiken.

Het AAMS systeem is gebaseerd op het van Meekeren blokkaarten systeem, alleen dan gestoeld op een Arduino.

Er worden nog timer printen gemaakt voor het sturen van de wissel, je kan dat met de Arduino doen, maar het lukt mij niet om het zonder het delay() commando, de voorbeelden die ik heb gehad van mede forum gebruikers (daarvoor dank) krijg ik op de een of andere manier niet werkend voor de wisselsturingen en wachttijden bij het station, dit frustreert mij zo dat ik voor een hardwarematige oplossing kies.

De oplossing die ik kies zal niet de beste zijn maar deze timer circuits werken wel.

Een ander idee waar ik mee bezig ben is het sturen van de baan met behulp van een IR-afstandsbediening, ik vind het leuk om wat andere zaken te sturen met IR zo ook mijn modelbaan, het is nu nog maar een idee, als het AAMS systeem werkt wil ik met IR sturing gaan experimenteren.

Voor het AAMS systeem moet in nog een Analoge interface bouwen en een digitale interface, de digitale interface heb ik nodig om de 4 Arduino's NANO, te kunnen verbinden met de baan, de Arduino NANO's zitten nu op een motherboard met sensor aansluitingen, de verbindingen naar mijn baan worden met losse draden uitgevoerd.

Voor de Arduino's Nano wil ik nog een motherboard maken met ingebouwde voeding 5V en 12V en de in/uitgangen uitvoeren met printkroonstenen of met losse draden, daar moet ik mijn gedachten nog even over laten gaan.

Alle componenten van de AAMS sturing wil ik op dezelfde manier maken, de prototypes hebben dat nog niet, deze zijn gemaakt om het AAMS systeem te testen op zijn werking, de definitieve uitvoering word op dezelfde manier uitgevoerd.

Ik zit nog te bedenken of ik van alle printen een printontwerp kan maken, dat is weer een nieuwe uitdaging in de ontwikkeling van het AAMS systeem, het is niet echt nodig ik kan deze schakelingen prima op een protoboard bouwen.

Ik wil wel eens bekijken of ik de Arduino NANO en alle componenten op 1 print kan bouwen, dit scheelt enorm veel ruimte in de stuurkast.

Binnen het AAMS systeem wil ik nog een pendelbaan sturing ontwerpen, gestoeld op het AAMS systeem, ook daar moet ik mijn gedachten over laten gaan.

Als extra component binnen Het AAMS systeem wil ik nog een multie voeding (5V, 9V, 12V) gaan bouwen.

Er is nog genoeg te ontwerpen en te bouwen, ik hou jullie op de hoogte.

Mvg Paul
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 19 maart 2016, 21:44:20
Hoi volgers,

In mijn vorige post had ik het over eem LM311 die ik gebruik als A/D conventer.

Citaat
Als voorbeeld neem ik even de schakeling "LM311 analog to digital converter" door de output van de print op een, laten we zeggen: Or of Xor poort te zetten kunnen we al een via een transistor op de uitgang van de Or of Xor poort een relais aansturen (even simpel gezien, het werk echter wel), het werkt zelfs al door een transistor type PNP op deze uitgang te zetten.

Citaat
LET OP! dit is even simpel gedacht, maar het werk wel, probeer het maar eens uit als je het niet geloofd. (je kunt het ook testen met twee elektromotoren, wel even een transistor type PNP gebruiken! )

Ondertussen in het vorige bericht aangepast. (PNP stond er nog niet bij) ;)

Ik heb even een testversie op een klein breadboardje gemaakt om dat te laten zien.

(https://images.beneluxspoor.net/bnls/IMG_20160319_162820.jpg) (https://images.beneluxspoor.net/bnls/IMG_20160319_162820.jpg)

Echter toen ik het wilde uittesten werkte het niet zoals ik dat had dacht, ik kon een standaard NPN transistor niet open sturen ??? , het werkt gewoon niet, nu sta ik met een mond vol tanden ;D  of toch niet  ;) , het vreemde was dat de Arduino het signaal wel goed oppakt en het ledje wat over de uitgang zit werk ook, maar met een NPN transistor werk het niet :P , wat nu, voor mijn AAMS systeem werk het wel maar standalone werkt het niet en de uitdaging was om het standalone te gebruiken, na wat gepuzzel heb ik de BC547 npn  vervangen voor een Bc557 pnp en zie het werk zoals ik zij.  ::) 

Waarom het dan wel werk ben ik nog niet achter, ik vermoed dat de output een negatieve waarde heeft waardoor een npn transistor niet werk maar een pnp transistor wel, het is voor mij gissen.

Weet iemand hier een antwoord op dan hou ik mij aanbevolen waarom het zo werkt.

Maak ik gebruik van bv een Quad 2-input AND gate en ik zet op de uitgang een npn transistor word deze wel open gestuurd.

Ik heb meteen een kort filmpje gemaakt en gelijk maar even op Youtube gezet https://youtu.be/awUtRI8XbSo (https://youtu.be/awUtRI8XbSo)  om te laten zien dat het standalone aangestuurd kan worden.

Ik gebruik in deze schakeling een PNP transistor van het type BC557 en stuur daar een relais mee aan die op zijn beurt de motor laat draaien als er genoeg licht op de LDR valt stopt met draaien.

Het ontwerp van de multi-voeding 5/9/12 v is ondertussen ook klaar.

Het prototype:


(https://images.beneluxspoor.net/bnls/multivoeding_bb.jpg) (https://images.beneluxspoor.net/bnls/multivoeding_bb.jpg)


Het schema:


(https://images.beneluxspoor.net/bnls/multivoeding_schema.jpg) (https://images.beneluxspoor.net/bnls/multivoeding_schema.jpg)

Ik zit nu nog te wachten op de bestelde onderdelen om hiervan een prototype te gaan bouwen.


Nu nog te ontwikkelen :

* I2C interface voor de AAMS sturing.
* Analog input interface voor baan sensoren.
* Output interface van Arduino NANO motherboard met sensor aansluitingen  naar aansluiting van losse draden op mijn modelbaan.
* Een Arduino motherboard met voedings aansluiting van 5v en 12v en de uitgangen uitgevoerd met printkroonsteen of losse draden.

In de toekomst wil ik alle onderdelen van de sturing op 1 printplaat hebben.

Mvg Paul  ;D
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Fritsprt op 20 maart 2016, 13:03:10
Hallo Paul,

Je bent weer lekker bezig.  (y) Wat mij opvalt is dat je je stripboards maakt alsof je op een breadboard werkt. Als ik je een tip mag geven verander dan de lengterichting van de sporen van vertikaal naar horizontaal. Het grote voordeel is minder (lange) draadbruggen en je kan gemeenschappelijke sporen gewoon door laten lopen zoals de plus en massa. Hoewel ik heel slecht ben in Fritzing (geen idee hoe ik een LM311 maak) heb ik de helft van je analoog digitaal omzetter opnieuw getekend omdat plaatjes meer zeggen dan 1000 woorden.

(http://i63.tinypic.com/2pu0qki.jpg)

Ik blijf je volgen,
Succes Frits
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: Timo op 21 maart 2016, 12:08:14
Hoi Paul,

Weer even een reactie van mijn kant  ;) Fijn om te zien hoe iemand lekker kan hobbyen. Maar toch wat opmerkingen, laat ik maar gewoon chronologisch beginnen.

Beginnende bij twee Arduino's per motor sturing. Natuurlijk is dit een keuze die volledig aan jou is. Maar het feit dat je nu twee Arduino's met één motor driver moet verbinden lijkt mij redelijk onhandig. De Arduino heeft met 16Mhz echt wel meer dan genoeg kracht om twee blokken aan te sturen, volledig los van elkaar.  En ja, je komt pinnen te kort. Maar dat kom je toch eigenlijk ook al voor één blok? Extra shift register hangt er zo bij.

Maar goed, wat ik al zei is de keuze natuurlijk aan jou. Maar weet dat de Arduino twee blokken ook nog steeds met twee vingers in zijn neus afhandelt. En het feit dat je nu twee Arduino's aan één motor driver moet verbinden lever je wel in op je modulaire opzet.

En nog even terug komen op synchronisatie, ook al maken beide Arduino's dan gebruik van één driver, je hebt dan gewoon een synchronisatie probleem. De twee uitgangen van de driver zijn volledig gescheiden.

8x Analog in oa blokbezet melding (kan ook als digital in gebruikt worden)
13 digital i/o waarvan er twee nodig zijn voor de communicatie tussen de computer en Arduino
De Arduino heeft 14 digitale i/o ;) En als je er geen computer aan hangt kan je pin0 en pin1 ook prima voor andere zaken gebruiken. Maar natuurlijk zijn ze wel erg handig tijdens het debuggen maar eventueel zou je ze daarna ook gewoon als extra uitgang kunnen gebruiken.

Je hebt inderdaad maar 8 analoog in. Let er overigens om dat A6 en A7 niet als digital te gebruiken zijn. Mocht 8 analoge inputs te weinig zijn kan je dit vrij makkelijk uitbreiden net als je met de digitale pinnen met een shift register hebt gedaan. Bij de analoge pinnen kan je hiervoor een multiplexer, kort weg mux, voor gebruiken. Dit is eigenlijk ook al wat er in de Arduino gebakken zit. Bijvoorbeeld de goedkope 74HC4051 (eBay: 10x (http://www.ebay.nl/itm/10PCS-SN74HC4051-74HC4051-IC-MUX-DEMUX-8X1-16DIP-NEW-GOOD-QUALITY-/351599367227?hash=item51dcf4943b), 50x (http://www.ebay.nl/itm/50PCS-SN74HC4051-74HC4051-IC-MUX-DEMUX-8X1-16DIP-NEW-GOOD-QUALITY-/291634384156?hash=item43e6c38d1c)). Met 3 digitale pinnen en 1 analoge heb je 8 extra 7 extra (aangezien het je er één kost) analoge gemaakt. Met 2 analoge (en 2 mux) en (nog steeds maar) 3 digitale pinnen heb je 16 extra 14 extra analoog.

De sturing van de wissels ziet er wel goed uit. Alleen twee opmerkingen
1) Je schema komt niet overeen met je breadboard  ;) ;D In je schema heb je de wisselspoelen getekend die dan in serie staan met de header/uitgang. Dit is natuurlijk niet het geval  ;)
2) De te schakelen stroom van de transistoren kent een beperking. Dit is voor de wisselspoelen waarschijnlijk geen probleem dus prima bruikbaar maar ik noem het toch even zodat je het in je achterhoofd kunt houden. De versterking van een transistor in verzadigde modus is ergens rond de 10x a 20x. Verzadigde modus houdt in dat VBE kleiner is dan VCE, met andere worden, de spanningsval en daarmee verlies over de transistor is klein en daarmee het verlies/de warmte in de transistor. Hier ligt dat dus ergens tussen 200mA en 400mA max. De spoelen zullen hier (in ieder geval kortstondig) wel overheen gaan maar doordat ze niet continue aan staan zal het absoluut geen probleem zijn.  (y) Hou dit alleen in je achterhoofd als je deze schakeling misschien voor andere dingen wilt gebruiken  ;)

Goeie keuze om de condensator onder het IC te plaatsen ipv zoals in de tekeningen.  (y) Zo direct aan het IC kan hij veel beter zijn werk doen dan zo ver af/in voedingsbussen zoals in de meeste tekeningen.

Je shift register schakeling is niet geschikt om je wisselsdriver mee aan te sturen. De serie weerstand van 1k samen met de base weerstand van 220ohm is echt te hoog om de transistor onder last goed open te sturen. Haal je dan de 1k weg is het natuurlijk geen probleem.

Overigens zie ik nu een fout in je 74HC595 diagram. Nu snap ik ook waar de eerste fout met Q7'vandaan kwam. Pin 9 van een 74HC595 is geenzins een Q7'. Accent betekend in de regel NOT/inverted. De naam Q7' is hier dan ook alleen maar verwarrend. Q7S (van serial) is een duidelijkere naam en kan geen verwarring scheppen met inverted zoals op de HC165. Ligt niet aan jou maar aan hoe sommige pakketen/mensen de data out pin noemen. Maar snap wel de verwarring met de HC165  ;D

In je comperator schakeling heb je Vee niet aangesloten. Dit is eigenlijk de voedingsspanningsrails voor de comperator, niet GND. De GND aansluiting is eigenlijk alleen voor de uitgang. Nu gaat het waarschijnlijk wel goed door interne clamp diodes maar netjes is het niet. Voor single rail (dus geen negatieve spanningen) sluit je Vee en GND samen aan.

Goed, vanaf hier gooi in de chronologie even van de baan. Eerst even wat antwoorden geven op wat vragen en wat extra info geven  :D We zijn hier om te helpen niet waar?  ;)

Een Arduino moederbord lijkt me geen verkeerd idee. Zeker als je hier dus ook alle randzaken zoals de shift registers, comperators en wissel drivers op bouwt. Is het je alleen te doen voor de schroefaansluitingen zou ik zeggen, kijk eens hiernaar (http://www.aliexpress.com/item/Free-shipping-NANO-3-0-controller-Terminal-Adapter-for-NANO-terminal-expansion-board-for-arduino-Nano/2051973410.html). Voor dat geld kan ik het zelf niet eens maken....

En om dan gelijk naar een ander punt te springen, AliExpress. Daar kan jij gewoon bestellen, nog makkelijker zelfs dan op eBay. ;) AliExpress ondersteund namelijk gewoon iDeal  ;D Niets credit card, gewoon net als bij een Nederlandse shop. Handig hè?

Ik weet even niet precies waar je probleem met je XOR en comperator schakeling ligt aangezien je geen schema hebt geplaatst. Maar ik denk dat het ligt aan het feit dat de LM311 alleen de uitgang laag kan trekken. De base van een NPN moet je juist optillen dus daar kan het probleem zitten. Dit zou je natuurlijk kunnen bereiken door een pull up toe te passen maar je hebt geen schema laten zien dus ik weet niet of je dat al deed. Overigens kan je een relais bordje al direct aansturen uit de XOR of LM311 (met pull up). Geen extra transistor nodig.

Ik ben het volledig met je eens dat je veel simpele dingen ook prima in discrete logica kunt uitvoeren. Iets als een pendelautomaat is in de basis erg eenvoudig. Maar discrete logica wordt al snel veel complexer als je het gaat uitbreiden met extra functies. Je hebt dan snel meer gates nodig dus meer draden dus meer soldeerwerk. En daar komt dan de microcontroller om de hoek kijken. Ja, de begin curve is steiler (code schrijven, extra componenten enz) maar de complexiteit is daarna redelijk vlak. Terwijl met discrete logica start alles heel vlak en makkelijk maar worden dingen wel exponentieel complexer als je dingen toe gaat voegen. Dus ja, voor simpele dingen is logica echt geweldig. Maar hou het dan wel simpel  ;D

De voedingsprint zal in de basis wel werken. Maar ik zou als ik jou was de condensatoren meer in het pad zetten dan er zo los (op een losse rij) naast te hangen. Zeker aan de uitgang maak je ze hiermee een stuk nuttiger. Bedenk ook dat lineaire regulators natuurlijk best veel power gaan verstoken. Je zou daarom kunnen overwegen naar DC-DC buck converters over te stappen. Deze kosten tegenwoordig nauwelijks meer dan een 78xx  ;D (afgelopen jaar hard onderuit gegaan).


Goed, en dan ga ik nu over naar het meer kritische deel van mijn post. Deze heb ik bewust even naar achter geschoven omdat ik allereerst mensen op het forum gewoon wil helpen. Al is het maar om te zeggen "Hé, heb je daaraan gedacht?". En het is engineer eigen om tegenvragen te stellen, zeker om zaken die je zelf anders zou doen. Maar zoals ik al zo vaak heb aangegeven, er zijn meerdere wegen die naar Rome leiden. En als je bereikt wat je wilt bereiken zijn er eigenlijk geen foute wegen/oplossingen. Maar vaak wel foute redenen (of het totaal ontbreken van redenen) om voor een oplossing te kiezen. En dit kan makkelijk zijn door het gebrek aan kennis. Maar daarvoor is het een forum, om dus eens te roepen, heb je daaraan gedacht enz. Maar heb je een goeie reden om iets op een manier te doen, prima, ga zo door. Maar veel mensen zien tegenvragen nogal makkelijk aan als kritiek en lezen "Dat doe je fout!". Niet alleen op een forum overigens  ;) Maar heb niet voor niets vaak genoeg proberen te benadrukken dat ik met je mee wil denken en het niet kwaad bedoel.  ;)

Daarom valt mij de reactie in post #328 (ironisch in een Arduino draadje) ook zo tegen van je Paul. Hierin ga je eigenlijk haaks in op wat ik in een ander draadje heb gezegd zonder dit aan mij persoonlijk te richten. Je zet me als het ware achter me rug om weg als leugenaar in plaats van dat je de discussie aan gaat. Dit kan ik niet zo waarderen... Als je het draadje niet wilt vervuilen kan je ook een nieuw draadje starten (of de mods vragen de specifieke discussie af te splitsen) of gewoon hier met naam en toenaam de discussie aan te gaan. Vandaar dat ik hier nog in ga op de genoemde punten als zijnde discussie en niet als zijnde hulp in je draadje.

Beginnende bij het heikele punt, het relaisbordje. Allereerst zeg ik natuurlijk niet dat je iets niet moet/mag gebruiken, dat is niet aan mij. Ik kan mensen het alleen met klem afraden en dat is ook precies wat ik met die opto relais bordjes doe. Zoals ik in het andere draadje ook al aan gaf, natuurlijk werken ze en valt er mee te doen wat je wilt. Maar ze zijn veel complexer dan nodig. Dat ze active low zijn is maar een kleinigheidje, daar kom je snel overheen. Maar dat je werkelijk de ingang hoog moet sturen, met een redelijke stroom, om ze uit te zetten maakt ze onhandig. Dit is wat ik omschreef als active float. Daarnaast moet je opeens zowel logic voedingsspanning als relais voedingsspanning aansluiten als je ze los wilt voeden waarbij de laatste via een extra header op het board. En dan zijn de voedingen nog niet eens galvisch gescheiden! Sinds dat de opto relaybordje opeens gemeen goed zijn geworden is het aantal vragen erover op forma minimaal vertienvoudigd. Dat geeft wel aan dat ze veel complexer zijn dan nodig.

Samenvattend, ja, je kan er een werkende oplossing mee maken. Maar ik raad ze met klem af wegens genoeg redenen.

Er word in hetzelfde draadje beweerd dat de Arduino te weinig vermogen levert, om de uitgangen met meerdere relais te belasten, dat klopt niet,
Sorry Paul om je uit je droom te helpen, dit klopt echt wel. En het heeft absoluut niets te maken met de gebruikte ATmega328 maar laat wel zien dat het je gebrek aan kennis is die hier praat. Natuurlijk hoef je niet overal het fijne van te weten, maar zomaar statements onderuit halen slaat dan natuurlijk nergens op. :-X

Of je de 5V van de Arduino kunt belasten hangt het meeste af van de manier waarop je de Arduino voedt. Het probleem zit hem namelijk in de voltage regulator. Dit zijn simpele lineaire regulators en verstoken het extra voltage dus gewoon op in warmte. De regulator zit op het origineel (en alle China clones die ik ken) alleen aan de printplaat voor koeling en kan hiermee niet zo veel warmte kwijt. De relais op die relais modules gebruiken 90mA per stuk (zonder de stroom in de transistor en eventuele opto en zonder in rush). Als je de Arduino voedt met 9V dan verstookt de regulator (alleen voor het relais) al (9V - 5V) x 90mA = 360mW. Zit er de gebruikelijke NCP1117ST50 in DPAK op dan heeft deze, mits deze op een groot stuk PCB zit (en dat is niet het geval bij de Arduino) een thermische weerstand van 67C/W. Dus in het ideale geval levert dit maar een temperatuurstijging van 360mW x 67C/W = 24C op (alleen voor het relais). Voor de op de Nano en veel clones aanwezige SOT-223 geldt een ideale thermische weerstand van 160C/W. In het ideale geval levert dus alleen de belasting van de relais al een temperatuurstijging van meer dan 360mW x 160C/W = 58C op! Sluit je het aan op 12V dan is de minimale temperatuurstijging door alleen het relais al meer dan 100C! Ja nadert dan al heel erg de maximale temperatuur voor de regulator.

Het feit dat jij er in een specifiek geval mee weg komt betekend niet dat het geen goed advies is. De regulator op de Arduino is echt niet krachtig. Wil je relais aansturen (zeker bij meer dan één/continue) gebruik dan een losse regulator. Pak een DC-DC converter en je hebt nagenoeg geen warmte.

Maar voed je alles via de USB (of het nu uit je PC is of via een USB lader) of via de 5V pin dan staat de regulator buiten spel. De voeding is dan nog maar de enige bepalende factor.

En dan kom ik nog even voor Menno op omdat ook hij hier doelwit is zonder dit te weten.
Ook werd er in dat topic geopperd dat je een Arduino gebruikt omdat je weinig kennis hebt van electronica.
[knip] alsof je de Arduino gebruikt omdat je minder verstand van electronica hebt, deze uitspraak slaat nergens op. :(
Paul, hier draai jij oorzaak en gevolg om waardoor het een drogreden is geworden. Wat Menno zeg dat de Arduino door veel mensen met minder verstand van Arduino wordt gebruikt is zeker waar. Daarvoor is de hele Arduino ook bedacht, om het laagdrempelig te maken. Maar dan mag je de stelling nog niet omdraaien, natuurlijk geeft het gebruik van Arduino niet aan dat je weinig verstand hebt van electronica. Maar een grote groep (en dat is de doelgroep) geldt dit natuurlijk wel voor. Zelf laat je ook af en toe zien dat je niet alle kennis van elektronica hebt  ;) Maar is dit erg, nee, tuurlijk niet! We doen het toch ook deels om iets te leren? Daarvoor is iets als een forum juist zo mooi! Maar is het dan handig om ongenuanceerd uitspraken van mensen (met meer kennis) onderuit te schoppen, nee, zeker niet.  ;)

En als laatste nog het punt over timers (of eigenlijk gewoon timing). Je zegt maar over te stappen op hardware pulsen omdat je er in software niet uit komt. Met alle respect Paul, maar als je niet uit het simpele "Blink without delay" principe komt weet ik niet of het project een kans van slagen heeft  ::) Ja, dit is misschien wat kort door de bocht. Maar zo heel lastig is het principe niet en het is DE basis om meer dan simpele taken (die je ook in discrete logica zou kunnen doen) te kunnen doen. Maar je moet het inderdaad net even beet hebben. Ik had alleen gedacht dat het na mijn Nederlandse vertaling wel zou lukken. En zo niet, had ik gewoon tegen vragen verwacht. Het hele principe is gewoon hetzelfde als klokkijken waardoor je meerdere dingen tegelijk kunt doen. Maar je moet niet gelijk proberen het in een complexe situatie toe te passen. Als ik jou was, en hier trek ik dus weer langzaam de meer adviserende/helpende jas aan zoals op een forum hoort, zou ik er gewoon eens mee gaan spelen. Bekijk de [rul=http://arduino.cc/en/Tutorial/BlinkWithoutDelay]Blink without delay[/url] pagina, haal hem door Google translate (https://translate.google.nl/translate?sl=en&tl=nl&js=y&prev=_t&hl=nl&ie=UTF-8&u=http%3A%2F%2Farduino.cc%2Fen%2FTutorial%2FBlinkWithoutDelay&edit-text=&act=url) en ga zonder verdere poes pas proberen daarmee te spelen. Of pak mijn ring buffer wissel code erbij (die je overigens zo in zou kunnen bakken...). Maar boven al, stel gewoon vragen als iets niet werkt zoals gedacht.


Goed, dit was een nog langere post dan normaal. In de basis vind ik het natuurlijk nog steeds erg leuk om je te kunnen helpen met je project. Maar als ik vaker aan gaf, als je het niet wilt moet je het zeggen. En als je iets niet snapt of ergens niet uit komt, vraag het dan ipv het te negeren. En het belangrijkste, haal geen mensen achter hun rug om onderuit ook al noem je ze niet! Ben je het ergens niet mee eens, ga dan gewoon de discussie aan, eventueel in een nieuw draadje.


Timo

PS Paul, dit betekend absoluut niet dat ik niet meer met je door één deur kan  ;)
Titel: Re: Arduino analoge(!) modelbaan sturing
Bericht door: smits66 op 21 maart 2016, 22:13:34
Hoi volgers,


@Timo, bedankt voor de input.


Het is absoluut niet mijn bedoeling geweest om mensen te beledigen, af te zeiken, of als leugenaar te bestempelen, mijn excuus daarvoor Ik heb het desbetreffende gedeelte van de post verwijderd.


@Frits, bedankt voor de input.


Bedankt voor de tip, daar ga ik zeker naar kijken.


De reden dat ik de koperbanen verticaal teken is, dat het stripeboard wat ik nu gebruik zo is uitgevoerd, als ik nieuwe srtipeboard ga bestellen zal ik er op letten of ze te koop zijn met koperbanen horizontaal.


Mvg Paul