H0 Modelspoor Forum

Modelbaanbesturing => Digitale vraagbaak => Topic gestart door: Rob op 4 mei 2017, 00:00:11

Titel: Besturing met Arduino
Bericht door: Rob op 4 mei 2017, 00:00:11
Naar aanleiding van de vraag van @mark mms over het besturen met Arduino hier een apart draadje daarover.

Mark, Een van de vragen die je had is: hoe kan ik na een druk op de knop even een programmatje aflopen.

Ik heb zoiets in gebruik voor mijn animaties op mijn boerderij module. De truuk is dat in de loop een soort schakelaar zit. als deze "uit"is, doet de loop niets anders dan kijken of de knop is ingedrukt. Als deze "aan" is loopt het programmaatje, en aan het einde van dat programmaatje wordt de schakelaar weer "uit" gezet.

In onderstaand voorbeeld is de schakelaar de variabele x. Deze wordt op "2"gezet na het indrukken van de knop. Vervolgens telt x terug naar 0. Zo lopen mijn animaties van de boerenknecht 3 keer. Daarna is het weer wachten op de knop die wordt ingedrukt.


void loop()
{
  while (x>0) {
    // trekken door de knecht in verschillende patronen
    trekPatroon1 ();
    delay(5000);
    trekPatroon2 ();
    delay(3500);
    trekPatroon3 ();
    delay(4500);
    x--;
  }
  if (readKnop(knoppin) ) {
    x = 2;
  }
}

"Readknop" is een functie om de knop uit te lezen. Die is voor de setup() gedefinieerd:

#define knoppin  A1      // input pin knop

int x = 1;               // start with one cycle on startup

// functie om knop uit te lezen en 'spikes' te negeren
boolean readKnop (int knop) {
  boolean knopvalue = false;
  if (digitalRead (knop) == LOW) {
    delay (150);
    if (digitalRead (knop) == LOW) {
      knopvalue = true;
    }
  }
  return knopvalue;
}

Misschien kun je hier iets mee. Als je wilt kan ik het hele programmatje wel posten.

Rob
Titel: Re: Besturing met Arduino
Bericht door: mark mms op 4 mei 2017, 16:08:12
Hallo Rob,

Als je wilt mag je het gehele programma posten.
Dan kan ik zien welke bibliotheek je hebt gebruikt en welke functies aan de pinnen hebt toegekend.

In ieder geval alvast bedankt.

Groet mark
Titel: Re: Besturing met Arduino
Bericht door: Rob op 4 mei 2017, 20:40:01
Hoi Mark,

Hier het hele programma.
Ik heb 2 relais aangesloten. Een daarvan zet de kippen (van Viessman) aan en uit. De andere is een autorelais waar direct een boerenknecht aan vast zit. Voor dit laatste relais gebruik in pulsbreedte modulatie (PWM) om het relais langzaam te kunnen aantrekken en afvallen. Daarmee is de beweging van de boerenknecht wat soepeler.

Dan heb ik 2 "input" pinnen. Een voor een drukknopje en een voor een reed relais. Die laatste geeft de mogelijkheid de animaties te starten met een voorbij rijdende trein (dat heb ik echter nog niet zo gesoldeerd).
Overigens gaat de animatie cyclus 2 keer rond (niet 3 keer, zoals ik gisteren gepost heb).

Hier gebruik ik geen speciale bibliotheken. Voor de aansturing van stappenmotoren (ander projecten), gebruik ik die wel.

Hierbij de "Sketch"
/* Boerderijbesturing
 * Gebruikt Arduino met 2 relais
 
 *
 */

#define kippenrelais 7   // kippen op deze pin
#define knechtrelais 6   // boerenknecht op deze pin. pin met PWM
#define ON    LOW        // relais aan = low pin
#define OFF   HIGH       // relais uit = high pin
#define knoppin  A1      // input pin knop
#define reedpin  A0      // input pin reed relais

int x = 1;               // begin met 1 cyclus bij reset/startup

// functie om knop uit te lezen en 'spikes' te negeren.
// De knop moet na 150 ms. nog steeds ingedrukt zijn.
boolean readKnop (int knop) {
  boolean knopvalue = false;
  if (digitalRead (knop) == LOW) {
    delay (150);
    if (digitalRead (knop) == LOW) {
      knopvalue = true;
    }
  }
  return knopvalue;
}


void trekKnecht (int t, int d) {
  int y = 130;   // pwm
  // voltage op relais spoel langzaam toe- en afnemen (met gebruik van pwm)
  // low = relais aan
  while (y > 30) {
    analogWrite (knechtrelais,y);
    delay (t);   
    y--;
  }
  delay (d); 
  y=70;
  while (y < 200) {
    analogWrite (knechtrelais,y);
    delay (t);   
    y++;
  }
  digitalWrite (knechtrelais,OFF);
}

// 3 patronen waarmee de knecht aan de koe staat te trekken
void trekPatroon1() {
  trekKnecht (7,20);
  delay(500);
  trekKnecht (2,20);
  delay(50);
  trekKnecht (3,40);
  delay(500);
  trekKnecht (10,70);
}

void trekPatroon2() {
  trekKnecht (3,20);
  delay(70);
  trekKnecht (2,20);
  delay(50);
  trekKnecht (3,40);
}

void trekPatroon3() {
  trekKnecht (15,5);
  delay(300);
  trekKnecht (10,20);
}

void setup()
{
// initialiseer sensor pinnen
  pinMode (knoppin,INPUT);
  pinMode (reedpin,INPUT);
  digitalWrite (knoppin,HIGH);
  digitalWrite (reedpin,HIGH);
 
// initialiseer relais pinnen
  pinMode (kippenrelais,OUTPUT);
  pinMode (knechtrelais,OUTPUT);
  digitalWrite (kippenrelais,OFF);
  digitalWrite (knechtrelais,OFF);
}

void loop()
{
  while (x>0) {
    digitalWrite (kippenrelais,ON); //kippen aan
    delay(1000);
    // trekken door de knecht in verschillende patronen
    trekPatroon1 ();
    delay(5000);
    trekPatroon2 ();
    delay(3500);
    trekPatroon3 ();
    delay(4500);
    x--;
  }
  digitalWrite (kippenrelais,OFF);
  if (readKnop(knoppin) ) {
    x = 2;
  }
}
Een indruk van hoe dat er uit ziet, staat op Youtube:


Succes ermee
Rob
Titel: Re: Besturing met Arduino
Bericht door: mark mms op 5 mei 2017, 20:50:00
Rob bedankt. Ik zal binnenkort nogmaals gaan proberen. ???