Modelbaanbesturing > Digitale vraagbaak

Afstandsbediening met Arduino

(1/4) > >>

Rob:
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

mark mms:
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.

Pierre:
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.

Rob:
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

Wim Corduwener:
@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.

Navigatie

[0] Berichtenindex

[#] Volgende pagina

Naar de volledige versie