Auteur Topic: Afstandsbediening met Arduino  (gelezen 8001 keer)

0 leden en 1 gast bekijken dit topic.

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Afstandsbediening met Arduino
« Gepost op: 2 februari 2018, 20:44:09 »
Ik loop al een tijdje met de gedachte om de rijstroom op mijn analoge modulebaan met een afstandsbediening te kunnen besturen. Voorlopig doe ik dat met een autoracebaan regelaar met een lange draad er aan, maar dat er iets anders ging komen, dat wist ik al... Nu had een collega van de week een tip voor een IR afstandsbediening bij Ben's Electronics die hij gebruikt in zijn brouwerij besturing. Dus maar eens wat spulletjes besteld, en samen met wat onderdelen die ik al had wordt hiermee het projectje gedaan:




Het idee is dat ik de rijstroom overal op de modulebaan kan aansluiten (waar maakt niet precies uit) en dat deze geregeld wordt met de Arduino. Hiervoor heb ik nodig (op de foto van linksboven naar rechtsonder):
6 Amp gelijkrichter, Elco, 1,5 Amp spanningsregelaar, Arduino nano, motorcontroller ("H-brug"). Een breadboard voor de proefopstelling, een IR sensor (die wordt geleverd bij de) IR afstandsbediening en wat breadboard draadjes.

De rijstroom wordt geregeld met Pulsbreedte modulatie (PWM), met twee van de 'analoge' uitput pinnen op de Arduino (een voor elke rijrichting). En die bestuur ik dan met de afstandsbediening.

Eerste stap is bepalen welke code elk knopje uitstuurt. Daarvoor eerst de IRremote bibliotheek gedownload en daarna deze sketch gebruikt:

-----------------------------------------------------------------
/*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */


#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("IR receiver started");
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(500);
}

-----------------------------------------------------------------


Met de uitvoer op de Seriele monitor kon ik uitvinden welke code bij elk knopje hoort. Daarna een decoder geschreven voor de IR spullenboel.

-----------------------------------------------------------------

/* YourDuino.com Example Software Sketch
Arduino remote control

/*-----( Import needed libraries )-----*/

#include "IRremote.h"

/*-----( Declare Constants )-----*/
int receiver = 11; // pin 1 of IR receiver to Arduino digital pin 11

/*-----( Declare objects )-----*/
IRrecv irrecv(receiver);           // create instance of 'irrecv'
decode_results results;            // create instance of 'decode_results'
/*-----( Declare Variables )-----*/


void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("IR receiver started"); 
 
}/*--(end setup )---*/


void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  if (irrecv.decode(&results)) // have we received an IR signal?

  {
//    Serial.println(results.value, HEX);  UN Comment to see raw values
    Serial.println(translateIR());
    delay(500); // Do not get immediate repeat
    irrecv.resume(); // receive the next value
  } 
}/* --(end main loop )-- */

/*-----( Declare User-written Functions )-----*/
String translateIR() // takes action based on IR code received

// returns KEYES Remote IR in string vormat

{
  String b = "";
  switch(results.value)

  {

    case 0xFFA25D: b="1"; break;
    case 0xFF629D: b="2"; break;
    case 0xFFE21D: b="3"; break;
    case 0xFF22DD: b="4"; break;
    case 0xFF02FD: b="5"; break;
    case 0xFFC23D: b="6"; break;
    case 0xFFE01F: b="7"; break;
    case 0xFFA857: b="8"; break;
    case 0xFF906F: b="9"; break;
    case 0xFF6897: b="*"; break;
    case 0xFF9867: b="0"; break;
    case 0xFFB04F: b="#"; break;
    case 0xFF18E7: b="^"; break;  //up
    case 0xFF10EF: b="<"; break;  //left
    case 0xFF38C7: b="OK"; break; //OK
    case 0xFF5AA5: b=">"; break;  //right
    case 0xFF4AB5: b="V"; break;  //down

  default:
    b = "Other button";

  }// End Case
 
  return b ;

} //END translateIR



/* ( THE END ) */


-----------------------------------------------------------------


In ieder geval werkt dit stukje al: elk knopje is gedecodeerd.




Het begin is er, de rest volgt...

Nu zit ik te denken dat ik alle modules naar de afstandsbediening kan laten 'luisteren' als ik elke Arduino met een IR sensor uitrust. Daarmee behoud ik de modulaire opzet met 'ter plekke' bediening, en kan ik toch vanaf overal verschillende dingen besturen met één afstandsbediening.
En als ik niet genoeg knopjes heb: het werkt met elke afstandsbediening (even geprobeerd met de afstandsbediening van de TV en de stereo). Deze zenden wel andere codes uit, maar dat is een kwestie van decoderen.

Maar dat is voor later. Eerst de rijstroom bediening maar eens in elkaar klussen.
Enige zorg is wel: hoe vind ik mijn afstandsbediening? Die dingen hebben nog wel eens de neiging zich te verstoppen.

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline mark mms

  • Super Modelspoorder
  • ******
  • Berichten: 1.224
  • Thanked: 26 times
  • Geslacht: Man
Re: Afstandsbediening met Arduino
« Reactie #1 Gepost op: 2 februari 2018, 21:33:15 »
Oké, over een uitdaging gesproken.  :o
Ik ben blij met een servo en ledjes aansturen. :-X

Dan zou de volgende stap een automatische besturing kunnen zijn.
Ik heb hier wel eens over nagedacht, maar voor mij nog een paar honderd stapjes te ver.

Ben benieuwd of het je lukt.
Veel succes.

Offline Pierre

  • Super Modelspoorder
  • ******
  • Berichten: 7.918
  • Thanked: 334 times
  • Geslacht: Man
  • Woonplaats: Den Haag (Loosduinen)
    • Haagse Modelbouw Club
Re: Afstandsbediening met Arduino
« Reactie #2 Gepost op: 2 februari 2018, 23:24:22 »
Wat mij betreft had je net zo goed een stukje in het Chinees kunnen schrijven Rob. Ik vind het bijzonder knap. Dat nou weer wel maar ... ik snap hier geen reet van.  :o :-\  Gaat heel ver boven mijn pet ... sorry.
Groet Pierre.

Ik rommel wat met treintjes en bouwwerkjes in H0 (H0e) en ook een klein beetje in N  .... Scratchbuilding, kitbashing en weathering.  ;D Lid van de http://haagsemodelbouwclub.nl/

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Afstandsbediening met Arduino
« Reactie #3 Gepost op: 3 februari 2018, 00:06:05 »
Pierre, het is misschien wat (te) technisch. Maar ik dacht: rijstroom instellen met een (infrarood) afstandsbediening, daar hebben misschien meer mensen interesse in.
Dus het chinees gewoon overslaan (of het hele topic), en eventueel weer aanhaken als het werkt....
Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Wim Corduwener

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 10.844
  • Thanked: 300 times
  • Geslacht: Man
  • Enschede (import)
    • Portfolio
Re: Afstandsbediening met Arduino
« Reactie #4 Gepost op: 3 februari 2018, 11:03:12 »
@Pierre je moet/hoeft ook niet alles willen begrijpen!


Het lijkt wel een beetje op de programmeertaal BASIC (Beginners All-purpose Symbolic Instruction Code).


Mijn allereerste computer. Dát waren nog eens tijden.
Trefwoorden:  Mac • Modulebouw • H0, H0e en 0e • Tijdperk III (1950-1960) • Nederlands (H0 en H0e) • Frans (1:45) • Gelijkstroom • Twee rails • Voorlopig nog even analoog • Scratchbuilding en Kitbutchering... en ik maak eigenlijk nooit wat af.

Meest recente projecten: Frans diorama 2.0 (Spoor 0e) en Verbouwing Magic Train (schaal 0e)

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Afstandsbediening met Arduino
« Reactie #5 Gepost op: 4 februari 2018, 18:13:57 »
Even een update.
Met de afstandsbediening kan ik in deze proefopstelling een motor bedienen.




De voeding is ingesteld op 10V. Voor de rijspanning gaat daar nog iets van af wegens de spanningsval over de elektronica, dus ik denk dat 8V ongeveer de maximale rijspanning wordt. Dat is later nog even uitproberen en makkelijk bij te regelen.
Ik kan nu het motortje in 2 richtingen laten draaien (te wisselen met de links en rechts knoppen) in negen snelheden (met de numerieke knoppen). De snelheden worden vloeiend verhoogd en verlaagd. Ook zit er al een rijrichtingswissel beveiliging op: Als de snelheid niet nul is bij het wisselen van de rijrichting, wordt eerst afgeremd tot de motor stil staat. En verder is de "OK" knop de noodstop geworden.

Maar waar ik al bang voor was: de zogenaamde "H-brug", waarmee de motorpolariteit en -spanning (nou ja, gemiddelde spanning) wordt geregeld, is veel te licht. Hij trekt dit kleine motortje al niet, laat staan een loc motor. De interne beveiliging schakelt al terug voor de motor volop draait. Dus er moet nog een zwaardere "H-brug" aangeschaft worden. Nu zijn er 2A exemplaren verkrijgbaar voor een paar euro, dus zo maar eens bestellen.

Maar tot zover gaat het goed. De sketch is nog wel wat rommelig, dus daar kan ik nog wat aan doen zolang de aanvullende goederen nog niet zijn geleverd.

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Afstandsbediening met Arduino
« Reactie #6 Gepost op: 5 februari 2018, 18:06:05 »
Toch nog even zitten neuzen naar de specificaties van de H-bruggen (motor controllers). Het blijkt dat ze 800 mA aan moeten kunnen (bij voldoende koeling). Nu zitten er 2 op een printje, dus ik dacht: als ik ze parallel inzet, dan moeten ze 1,6A aankunnen, en dat is ruim voldoende voor een loc (de trekken meestal 0,4 tot 0,6 A)

Dus een en ander maar eens met een stukje proefbaan uitgeprobeerd.




En het werkt zowaar!
Leermomentje: als je aan de andere kant van de (proef)baan gaat staan werken de links en rechts knopjes andersom...
En verder is er wat directe terugkoppeling nodig: omdat alles met vertraging werkt, kun je niet goed zien wat de laatste commando's van de afstandsbediening aan het doen zijn. Dat worden wat ledjes voor rijrichting en stop.
Maar dat wordt eerst nog even klussen.

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Afstandsbediening met Arduino
« Reactie #7 Gepost op: 7 februari 2018, 16:22:43 »
Het projectje afstandsbediening nadert zijn voltooiing. Dat kleine afstandsbedieninkje werkt wel, maar ik kreeg er wel een kromme duim van. Ook was de IR zender vrij zwak, waardoor ik erg goed op de IR ontvanger moest richten.
Dus vandaag een post-modern vormgegeven exemplaar opgedist uit de afstandsbedieningenbak van de kringloopwinkel. Een brok ergonomie voor slechts 1 euro.




Aan de Arduino besturingskant zijn 2 'richting' leds en een 'stop' led toegevoegd. Dat geeft aan wat er gebeurt. Directe terugkoppeling, zeg maar, omdat de trein (bewust) langzaam reageert (langzaam optrekken en afremmen) kun je anders niet zien of de commando's van de afstandsbediening zijn doorgekomen.

Voor ik weer 'Chinees' ga schrijven, eerst maar even een filmpje. Een demo over de werking van de afstandsbediening.



Het 'Chinees' (de Arduino sketch) zet ik eventueel in een apart bericht, als daar behoefte aan is.

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Pierre

  • Super Modelspoorder
  • ******
  • Berichten: 7.918
  • Thanked: 334 times
  • Geslacht: Man
  • Woonplaats: Den Haag (Loosduinen)
    • Haagse Modelbouw Club
Re: Afstandsbediening met Arduino
« Reactie #8 Gepost op: 7 februari 2018, 18:54:58 »
Sorry dat ik je deze vraag stel. Ik vind het ontzettend knap hoor Rob. Dat staat buiten kijf maar ... wat is nu het werkelijke verschil tussen op een knopje drukken (digitaal) of aan een knopje draaien (analoog) om je treintje voor of achteruit te laten gaan? Of je moet er heel veel plezier in hebben om te programmeren. Daar kan ik me dan wel iets bij voorstellen.
Groet Pierre.

Ik rommel wat met treintjes en bouwwerkjes in H0 (H0e) en ook een klein beetje in N  .... Scratchbuilding, kitbashing en weathering.  ;D Lid van de http://haagsemodelbouwclub.nl/

Offline henkiehenk

  • Verkeerleider
  • *****
  • Berichten: 403
  • Thanked: 10 times
  • Geslacht: Man
    • onze baan en materiaal
Re: Afstandsbediening met Arduino
« Reactie #9 Gepost op: 7 februari 2018, 19:40:58 »
gaat de loc niet vanzelf weer rijden als het sein veilig komt ,,moet je hem dan weer zelf aan sturen ??
supper gedaan trouwens ,,en tja verschillen ,,waarom ,,wat is de zin van het leven zeg maar ,,de uitdagingen voor mij dan  ;D
twee rail ,roco flieschmann ,
jaren 60 70 ,,fantasie baan naar vakantie belevenissen
Intellybox sound en omgeving geluiden op de baan
SHM Stoomtram Hoorn Medemblik medewerker werkplaats en chef trein
machinist bij de NS standplaats Alkmaar

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Afstandsbediening met Arduino
« Reactie #10 Gepost op: 7 februari 2018, 20:22:08 »
Hoi Pierre, Henk,

Goede vraag.
Sorry dat ik je deze vraag stel. Ik vind het ontzettend knap hoor Rob. Dat staat buiten kijf maar ... wat is nu het werkelijke verschil tussen op een knopje drukken (digitaal) of aan een knopje draaien (analoog) om je treintje voor of achteruit te laten gaan? Of je moet er heel veel plezier in hebben om te programmeren. Daar kan ik me dan wel iets bij voorstellen.

Mijn modulebaan is nogal lang en met de vaste baan erbij verdeeld over twee kamers. Ik loop dus nogal wat heen en weer, omdat elke module ook zijn eigen bediening heeft. Dus geen 'centrale' bediening, maar verdeeld langs het spoor. Dan is het wel makkelijk om op elke plek langs de baan de trein te kunnen besturen.

Mijn eerste rudimentaire afstandsbediening was deze (alleen snelheidsregeling, geen richtingverandering). Draad steeds in de knoop en toch heen en weer lopen om de andere kant op te rijden...




Of je moet er heel veel plezier in hebben om te programmeren. Daar kan ik me dan wel iets bij voorstellen.
En dat is ook zo. Ik hou er wel van om een beetje met techniek te rommelen. En programmeren gaat me ook redelijk af, dat doe ik al bijna 4 decennia (inderdaad: sinds de C64 in 1980)...

gaat de loc niet vanzelf weer rijden als het sein veilig komt ,,moet je hem dan weer zelf aan sturen ??
De seinen sturen geen trein aan. Dus ik moet zelf stoppen en weer wegrijden.

Kortom: een mix van interesse en noodzaak.

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Pierre

  • Super Modelspoorder
  • ******
  • Berichten: 7.918
  • Thanked: 334 times
  • Geslacht: Man
  • Woonplaats: Den Haag (Loosduinen)
    • Haagse Modelbouw Club
Re: Afstandsbediening met Arduino
« Reactie #11 Gepost op: 7 februari 2018, 20:42:01 »
Duidelijk Rob ... gewoon omdat het kan. ;D Veel plezier verder. ;)
Groet Pierre.

Ik rommel wat met treintjes en bouwwerkjes in H0 (H0e) en ook een klein beetje in N  .... Scratchbuilding, kitbashing en weathering.  ;D Lid van de http://haagsemodelbouwclub.nl/

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Afstandsbediening met Arduino
« Reactie #12 Gepost op: 7 februari 2018, 21:19:42 »
Dank je Pierre,

... gewoon omdat het kan.
Ueh... dat is een goede samenvatting   :)
Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Afstandsbediening met Arduino
« Reactie #13 Gepost op: 10 februari 2018, 18:34:05 »
Nog even een extra toelichting op de 'waarom' vraag, met plaatje.

De modulaire baan is langgerekt met verschillende "bedrijfs"locaties, elk met "ter plekke" bediening, dat wil zeggen dat het bedieningspaneel dicht bij de bedrijvigheid is. Dit maakt de module verbindingen niet alleen eenvoudig (weinig bedrading) en flexibel (modules kunnen ook in andere volgorde worden opgesteld), maar je kunt ook nog eens overal met je neus op de bedrijvigheid zitten.




Dus wat hebben we hier zoal:
  • Station "Klütz": draaischijf gebied. bediening van de draaischijf, ontkoppelaars en wissel in dit gebied
  • Station "Klütz": rangeer gebied. Bediening van de stroomtoevoer naar de sporen en wissels
  • Station "Klütz": in/uitrij gebied. Wissels in seinen
  • Bosbouw spooraansluiting: bediening van de wissel, ontkoppelaar en bokkraan.
  • Overweg en inreisein voor station Grauberg achter de muur
  • Vaste baan in de andere kamer
(oh, en dan ben ik de animaties van de kippetjes en de boerenknecht tussen 4 en 5 nog vergeten)

Naast het meelopen met de trein om alle locaties (modules) te bedienen, is het natuurlijk ook gewoon leuk om met je oog langs het spoor op verschillende plekken de treinen te zien langskomen.

Vandaar dus de afstandsbediening.

En die is ondertussen in de definitieve versie ingebouwd in een schroevendoosje van de bouwmarkt.




Dit doosje kan gewoon dicht: de infrarood stralen gaan er goed doorheen en ook mijn indicatie ledjes zijn goed genoeg te zien.
Nu alleen nog even op de goede plek (vast) zetten.

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Afstandsbediening met Arduino
« Reactie #14 Gepost op: 11 februari 2018, 15:44:34 »
De laatste stap in dit project: de overgang van rijstroom met trafo-bediening op de vaste baan naar afstandsbediening op de modulebaan (en omgekeerd) logisch te maken.
Nu had ik op mijn vaste baantje 2 trafo's en kon ik delen van de baan op de ene of op de andere trafo schakelen. Die 2e trafo gaat er uit en na wat extra draden getrokken te hebben kan ik nu op het station van de vaste baan, waar ook de aansluiting naar de module baan is, de rijstroom omschakelen van trafo naar afstandsbediening.

Even een foto verslag van een gangbare rit.

De trein komt uit het schaduwstation binnen op het station. Rijstroom wordt geregeld met de trafo.

.


Na binnenkomst, als de trein stilstaat, wordt de stroom op het stationsspoor omgeschakeld naar de afstand bediende rijstroom. Na het sluiten van de overweg en het veilig zetten van het uitrijsein wordt richting modulebaan gereden.

.


We lopen nu met de trein mee, en bedienen onderweg overweg en seinen als de trein langs komt.

.


Uiteindelijk rijdt de trein het eindstation binnen. Hier is ook de ontvanger van de afstandsbediening geïnstalleerd.

.


Ik moet zeggen, afgezien van een technisch leuk projectje, ben ik erg tevreden met het resultaat. Het werkt erg fijn om met de afstandsbediening in de hand de rest (overweg, seinen, wissels) langs de baan te kunnen bedienen. Dit maakt rijden een stuk rustgevender en overzichtelijker.

Dus mijn eerste idee om ook andere onderdelen op de baan met de afstandsbediening te besturen, is niet nodig gebleken.

Maar... zeg nooit "nooit".

Project klaar, nu maar weer eens wat scenery gaan doen.

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Pierre

  • Super Modelspoorder
  • ******
  • Berichten: 7.918
  • Thanked: 334 times
  • Geslacht: Man
  • Woonplaats: Den Haag (Loosduinen)
    • Haagse Modelbouw Club
Re: Afstandsbediening met Arduino
« Reactie #15 Gepost op: 11 februari 2018, 17:16:34 »
Mooi gedaan Rob. Een hele uitzoekerij man. ;)
Groet Pierre.

Ik rommel wat met treintjes en bouwwerkjes in H0 (H0e) en ook een klein beetje in N  .... Scratchbuilding, kitbashing en weathering.  ;D Lid van de http://haagsemodelbouwclub.nl/

Offline mark mms

  • Super Modelspoorder
  • ******
  • Berichten: 1.224
  • Thanked: 26 times
  • Geslacht: Man
Re: Afstandsbediening met Arduino
« Reactie #16 Gepost op: 11 februari 2018, 17:24:30 »
/geweldig dat het is gelukt.

Kun je de sketch nog ergens posten?
Al is het maar om te kijken hoe het is gedaan.

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Afstandsbediening met Arduino
« Reactie #17 Gepost op: 11 februari 2018, 21:39:27 »
Dank mannen,

Mark, hierbij de sketch (sorry voor het "Chinees", Pierre).

/* AFSTANDSBEDIENING VOOR ELEKTRO MOTOR
 * Motor snelheids regeling met IR afstandsbediening
 *
 * functies op de afstands bediening:
 *   - numerieke toetsen (0-9): snelheid instelling
 *   - links/rechts:            draai- of rijrichting, snelheid verhogen
 *   - omhoog/omlaag:           snelheid omhoog / omlaag in kleine stappen
 *   - * toets:                 snelheids sprong zolang toets is ingedrukt
 *   - # toets:                 direct naar de laatst aangegeven snelheid
 *   - OK toets:                noodstop (snelheid direct naar 0)
 * Deze knoppenindeling geldt voor de 'Arduino compatible' KEYES afstandsbediening.
 * Overeenkomstige indeling kan worden gebruikt voor andere afstandsbedieningen.
 *
 * Een InfraRood ontvanger vangt de signalen van de afstandsbediening op.
 * Deze wordt gedecodeerd en omgezet naar een rijrichting en snelheid.
 * Snelheid wordt geleidelijk geregeld. Elk commando levert een 'gewenste' snelheid
 * en rijrichting op. Vervolgens wordt langzaam geaccelereerd of gedecelereerd.
 * Rijrichting wisselt alleen als de snelheid 0 is.
 *
 * Indicaties met 3 leds:
 * 2 richting leds: geven draai-of rijrichting aan.
 *   - continue brandend: rijrichting is ingesteld en snelheid is de gewenste snelheid
 *   - knipperen: andere gewenste snelheid en/of rijrichting. Verandering is bezig
 * 1 'stop' led:
 *   - continue brandend: motor staat stil (snelheid = 0}
 *   - knipperend: er wordt afgeremd tot stop {gewenste snelheid = 0)
 *   - uit: motor draait / rijdt
 *   
 *   De motorbesturing gebeurt over 2 'analoge' uitvoer pinnen. Hier wordt met
 *   pulsbreedte modulatie de (effectieve) uitgangsspanning geregeld.
 *   Elke richting heeft 1 pin waarmee de pulsbreedte tussen 0 (uit) en 255 (maximaal)
 *   wordt geregeld.
 *   Let op: deze mogen nooit gelijktijdig "aan" zijn, anders ontstaat kortsluiting!)
 *   
 *   Voor het ontvangen van het IR signaal is gebruik gemaakt van de IRremote bibliotheek
 */

#include <IRremote.h>

// ------------ Pin definities --------
#define receiver        7    // pin 1 van IR ontvanger naar Arduino digitale pin
#define richtingPin1   10    // pinnen voor vooruit en achteruit (PWM pinnen)
#define richtingPin2    9
#define ledVooruitPin   4    // pinnen voor vooruit/achteruit indicatie
#define ledAchteruitPin 2
#define ledStopPin      3    // pin voor stop

// ------------- IR objecten en variabelen -------
IRrecv irrecv(receiver);     // IR ontvanger object maken
decode_results results;
// IR variabelen
int IRcode = 0;              // code afgelezen uit IR ontvanger
String IRknop = "";          // de ingedrukte knop (of ingedrukt gehouden)

// -------------- Motor control definites en variabelen ------
#define lusVertraging   30           // delay in ms in de hoofdlus
#define acceleratieStap 0.025        // stappen waarin snelheid toe- of afneemt
#define aanloopPWM      80.0         // Pulsbreedte waarde (0-255) om aanloopweerstand motoren te overwinnen
#define sprongWaarde    2.5          // snelheids 'sprong', bijvoorbeeld om te koppelen bij rangeren

int richting = 0;                    // rijrichting
int gewensteRichting = 0;            // gewenste rijrichting (rijrichting schakelt pas om bij snelheid 0)
float snelheid = 0;                  // huidige snelheid
float gewensteSnelheid = 0;          // gewenste snelheid
float acceleratie = acceleratieStap;
float sprong = 0;                    // toename in snelheid bij indrukken 'spring' knop
int richtingPin[] {richtingPin1,richtingPin2}; // pinnen voor vooruit en achteruit (PWM pinnen)

// ------------- Variabelen voor de Led indicatoren -----------------
unsigned long prevms = 0;        // knipperen laatste keer aan/uit
unsigned long curms = millis();  // knipperen nu
const long blnkint = 250;        // knipper-interval
int ledPins[] {ledVooruitPin, ledAchteruitPin, ledStopPin} ;
int ledStatus[] {2,0,2};         // vooruit (aan), achteruit (uit), stop (aan).
int blnk = HIGH;


// -------------- Overige variabelen ------------------
int t=0;                         // algemene teller voor for... loops

//--------------- Setup na starten Arduino ---------------------
void setup()
{
   pinMode(LED_BUILTIN, OUTPUT);      // ingebouwde led op pin 13 uit
   digitalWrite(LED_BUILTIN, LOW);   
   
//  Serial.begin(9600);
  irrecv.enableIRIn(); // Start de IR ontvanger
  pinMode (richtingPin[0], OUTPUT);
  pinMode (richtingPin[1], OUTPUT);
  for (t=0; t<3; t++) {
    pinMode (ledPins[t],OUTPUT);
  }
}

// --------------- Hoofd lus Arduino ---------------------------
void loop() {
  sprong = 0;
  if (irrecv.decode(&results)) {
    IRcode = results.value;
    if (IRcode != 0xFFFFFFFF) {
      IRknop = VertaalIR(IRcode);
    }
    ZetGewensteSnelheidEnRichting (IRknop);
   
    irrecv.resume(); // Continue receiving
  }

// snelheid en richting aanpassen
  SnelheidAanpassen() ;
  if (snelheid == 0) {          //motor staat stil, dus eventuele richtingverandering doorvoeren
    richting = gewensteRichting ;
  }

// led indicators bijwerken
  ZetLedIndicators();
  for (t=0; t < 3; t++) {
    setLed(t,ledStatus[t]);
  }


// status printen 
/*
  Serial.print ("snelheid: ");
  Serial.print (snelheid + sprong);
  Serial.print (" // Gewenste snelheid: ");
  Serial.print (gewensteSnelheid);
  Serial.print (" - richting: ");
  Serial.println (richting);
 */
 
  delay(lusVertraging);

}
//---------------- Functions --------------------

// IR CODE VERTALING
// Vertaling van de IR codes naar knoppen c.q. acties
// input: integer met de ontvangen IR code
// output: string met code of actie
//         Numerieke toetsen geven het cijfer als string terug.
//         Alle niet-numerieke toetsen beginnen met "-1", zodat
//         deze makkelijk zijn te onderscheiden van de numerieke toetsen.

String VertaalIR(int code){       

  String b = "";
 
  switch(code) {
    // code vertaling KEYES afstandsbediening
    case 0xFFA25D: b="1"; break;
    case 0xFF629D: b="2"; break;
    case 0xFFE21D: b="3"; break;
    case 0xFF22DD: b="4"; break;
    case 0xFF02FD: b="5"; break;
    case 0xFFC23D: b="6"; break;
    case 0xFFE01F: b="7"; break;
    case 0xFFA857: b="8"; break;
    case 0xFF906F: b="9"; break;
    case 0xFF9867: b="0"; break;
    case 0xFF6897: b="-1*"; break;    //* = srong knop snelheidssprong (t.b.v. koppelen bij rangeren, bijvoorbeeld)
    case 0xFFB04F: b="-1#"; break;    //# = direct naar gewenste snelheid (geen acceleratie/deceleratie)
    case 0xFF18E7: b="-1^"; break;    //omhoog
    case 0xFF10EF: b="-1<"; break;    //links
    case 0xFF38C7: b="-1STOP"; break; //OK = noodstop
    case 0xFF5AA5: b="-1>"; break;    //rechts
    case 0xFF4AB5: b="-1V"; break;    //omlaag
    case 0xFFFFFFFF: b="-1R"; break;  //herhaal (repeat) laatste knop blijft ingedrukt

    // code vertaling SHARP GA074WJSA afstandbediening
    case 0x885B30D5: b="1"; break;
    case 0xE7E0CFB1: b="2"; break;
    case 0xA34F5A01: b="3"; break;
    case 0x22614D75: b="4"; break;
    case 0x96C5A8AB: b="5"; break;
    case 0x44ABD1FD: b="6"; break;
    case 0x1A5C4D:   b="7"; break;
    case 0x57A67691: b="8"; break;
    case 0x9543D7CF: b="9"; break;
    case 0xF4C976AB: b="0"; break;
    case 0x5CC96CE7: b="-1*"; break;    //kanaal wissel = sprong knop snelheidssprong (t.b.v. koppelen bij rangeren, bijvoorbeeld)
    case 0xCC00A5B7: b="-1#"; break;    //TV/VIDEO = direct naar gewenste snelheid (geen acceleratie/deceleratie)
    case 0x3E0C7005: b="-1^"; break;    //omhoog
    case 0xB10C7C8B: b="-1^"; break;    //channel up = ook omhoog
    case 0x503D6F71: b="-1V"; break;    //omlaag
    case 0x10921B67: b="-1V"; break;    //channel down = ook omlaag
    case 0x25D2E369: b="-1STOP"; break; //OK = noodstop
    case 0x6D5D1DB3: b="-1STOP"; break; //AAN/UIT = ook noodstop
    case 0xF43135:   b="-1>"; break;    //rechts
    case 0x4B12992B: b="-1>"; break;    //volume + = ook rechts
    case 0xA574865B: b="-1<"; break;    //links
    case 0x1BE8C80D: b="-1<"; break;    //volume - = ook links
  //  case 0xFFFFFFFF: b="-1R"; break;  //herhaal (repeat) laatste knop blijft ingedrukt

 
    // Hier is ruimte om eventueel codes van andere afstandbedieningen te vertalen
 
  default:
    b = "-2Onbekend";
  }// End Case
 
  return b ;
}
// ====

// SNELHEID AANPASSEN
// Deze functie berekent de nieuwe snelheid op basis van de
// ingestelde acceleratie. Daarna wordt de snelheid omgezet
// naar een pulsbreedte en op de juiste uitvoer pin gezet.

void SnelheidAanpassen() {
  if (abs(snelheid - gewensteSnelheid) <= acceleratieStap) {
    snelheid = gewensteSnelheid;
    acceleratie= 0;
  } else {
    snelheid += acceleratie;
  }
  if (snelheid > 0) {
    analogWrite(richtingPin[richting],(aanloopPWM + (255-aanloopPWM)/9 * (snelheid + sprong)));
  }
  else {
    analogWrite(richtingPin[richting],0);
  }
}
// ====

// ZET DE GEWENSTE SNELHEID EN RICHTING
// Functie zet de gewenste snelheid, gewenste richting en gewenste
// versnelling (of vertraging) op basis van de knoppen die zijn
// ingedrukt op de afstandsbediening.

void ZetGewensteSnelheidEnRichting (String laatsteKnop) {
  if (laatsteKnop.toFloat() >= 0) {    //numerieke toets
    gewensteSnelheid = laatsteKnop.toFloat();
    if (snelheid < gewensteSnelheid) { acceleratie = acceleratieStap; }
    if (snelheid > gewensteSnelheid) {acceleratie = - acceleratieStap; }
  }
  else {                               // niet een numerieke toets
    if (laatsteKnop == "-1STOP") {       // noodstop
      acceleratie = -snelheid;
      gewensteSnelheid = 0;
    }
    if (laatsteKnop == "-1>") {              // knop naar rechts
      if (richting == 1) {                   // omkering tijdens het rijden
        gewensteSnelheid = 0;                // eerst afremmen naar 0
        acceleratie = - acceleratieStap;
        gewensteRichting = 0;
        laatsteKnop ="";
      }
      else {                                 // rijrichting hetzelfde
        if (snelheid == gewensteSnelheid  && snelheid < 9 && richting == 0) {  // gewenste snelheid is bereikt en nog niet max
         gewensteSnelheid  += .5 ;             
         acceleratie = acceleratieStap;
        }
      }
    }
    if (laatsteKnop == "-1<") {              // knop naar links
      if (richting == 0) {                   // omkering tijdens het rijden
        gewensteSnelheid = 0;                // eerst afremmen naar 0
        acceleratie = - acceleratieStap;
        gewensteRichting = 1;
        laatsteKnop ="";
      }
      else {                                 // rijrichting hetzelfde
        if (snelheid == gewensteSnelheid  && snelheid < 9 && richting == 1 ) {  // gewenste snelheid is bereikt en nog niet max
         gewensteSnelheid += 0.5;             
         acceleratie = acceleratieStap;
        }
      }
    }
    if (laatsteKnop == "-1V") {
      if (snelheid == gewensteSnelheid  && snelheid > 0 ) {  // gewenste snelheid is bereikt en nog niet max
         gewensteSnelheid -= 0.25;             
         acceleratie = -acceleratieStap;
      }
    }
    if (laatsteKnop == "-1^") {
      if (snelheid == gewensteSnelheid  && snelheid < 9 ) {  // gewenste snelheid is bereikt en nog niet max
         gewensteSnelheid += 0.25;             
         acceleratie = acceleratieStap;
      }
    }
    if (laatsteKnop == "-1#") {
      snelheid = gewensteSnelheid;      // sla het accelereren/decelerern over: direct naar gewenste snelheid
    }
    if (laatsteKnop == "-1*" && snelheid < 9 - sprongWaarde) {
      sprong = sprongWaarde;            // zet "sprong" aan zolang deze toets is ingedrukt.
    }
  }
}

// ====

// LED AAN, UIT OF KNIPPEREN
// input: led number (0-2)
//        func: 0 = uit, 1=knipper, 2 = aan
void setLed (int led, int func) {
  // knipperstatus bijwerken   
  curms = millis();
  if (curms - prevms >= blnkint) {
    prevms = curms;
    if (blnk == HIGH) {
      blnk = LOW;
    } else {
      blnk = HIGH;
    }
  }
  // leds uit, aan of knipperstatus
  if (func == 1) {           // dan knipperen
    digitalWrite(ledPins[led], blnk);
  }
 
  if (func == 0) {           // uit
    digitalWrite(ledPins[led], LOW);
  }
  if (func == 2) {           // aan
    digitalWrite(ledPins[led], HIGH);
  }
}
// ====

// ZET LED INDICATOREN
// zet juiste waarden op LED pinnen: indicatoren voor acties die bezig zijn
// (richting, snelheidsverandering en stop)
void ZetLedIndicators (){
  if (snelheid  == 0) {
    for (t = 0; t < 2 ; t++) {
      ledStatus [t] =0 ;         // richting Leds uit
    }
    ledStatus [2] = 2;           // stop led aan
    ledStatus [richting] = 2;     // juiste richting led aan
  }
  else {                       // motor draait
    if (gewensteSnelheid == 0) {
      ledStatus [2] = 1;         // stop led laten knipperen
    } else {
      ledStatus [2] = 0;
    }
    if (gewensteRichting != richting) { //richting verandering gewenst
      ledStatus [gewensteRichting] = 1;  // gewenste richting knipperen
    } 
    else {
      ledStatus [1-gewensteRichting] = 0; // andere richtingsled uit
      if (gewensteSnelheid != snelheid) { // snelheidsverandering bezig (en niet naar 0)
        ledStatus [gewensteRichting] = 1;
      }
      else {
        ledStatus [gewensteRichting] = 2;
      }
    }
  }
}


Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...

Offline Stoomlokkie

  • Perronmedewerker
  • **
  • Berichten: 58
  • Thanked: 1 times
Re: Afstandsbediening met Arduino
« Reactie #18 Gepost op: 14 januari 2019, 08:40:36 »
Leuk die zelfbouwprojecten. Heb zo ook een draaischijfdecoder gemaakt op basis van de Arduino. Gaat heel erg goed. Ben alleen niet zo handig met het computerprogramma die de Arduino bestuurt. Krijg het nooit geupload naar de Arduino toe. Waarschijnlijk door typefouten in de software. Dit ga ik wel volgen!

Offline Rob

  • Forumbeheerder
  • Super Modelspoorder
  • *****
  • Berichten: 2.743
  • Thanked: 161 times
  • Geslacht: Man
  • Rob zegt: denk aan morgen, doe vandaag.
Re: Afstandsbediening met Arduino
« Reactie #19 Gepost op: 14 januari 2019, 09:41:25 »
Hoi Stoomlokkie,

Leuk dat je ook met Arduino bezig bent.
Als het uploaden niet goed gaat, dan zijn de 4 meest voorkomende problemen:

1. fouten in het programma
2. verkeerde board gekozen
3. verkeerde processor gekozen
4. geen of verkeerde 'poort'.

De eerste kun je herkennen: een regel waar de fout is gedetecteerd wordt aangeduid in het programma. Het lastige is dat  dit de regel is waar de Arduiino IDE niet verder kan. Meestal is dit niet dezelfde regel als waar de werkelijke fout zit. Vergeet een punt-komma en de volgende regel is 'fout'. Een accolade teveel of te weinig en het kan vele regels verder fout gaan...

Maar als het programma goed is, moet je nog aangeven welke hardware je gebruikt. Daar gaan punten 2 en 3 over. Deze kies je in 'hulpmiddelen'.
Zo maakt het uit of je naar een Arduino Uno of Nano aan het uploaden bent. Je kunt niet naar een Nano uploaden alsje als board 'Aduino Uno'hebt geselcteerd, en omgekeerd werkt ook niet.
De boards worden met verschillende processor geleverd. Soms even proberen. Zo zijn sommige van mijn Chinese Nano boards alleen maar te gebruiken als ik processor "ATmega328P (old bootloader)" kies (punt 3)
En als laatste de COM 'poort'. Zodra je randapparatuur aansluit op je computer wordt er een 'poort' toegewezen. Deze moet je nog wel selecteren als je het board hebt aangesloten, anders kan de computer niet communiceren. De poort vind je ook onder 'hulpmiddelen'.

Ik hoop dat dit wat helpt.

Rob
Ergens in (West) Duitsland tussen 1960 en 1970 | gelijkstroom analoog, met geluid | kleine vaste baan en uitbreiding met modulebaan.
Nu vooral bezig met van alles en nog wat...