H0 Modelspoor Forum
Modelbaanbesturing => Digitale vraagbaak => Topic gestart 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
-
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
-
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
-
Rob bedankt. Ik zal binnenkort nogmaals gaan proberen. ???