modeltrein besturing
Re: modeltrein besturing
shooter schreef:bij sommige moeten de functies eerst en dan pas de setup en loop.
Bij Arduino.cc IDE 1.6.12 zou dat niet meer nodig zijn. De Arduino pre-processor is een tijdje terug gewijzigd. Er was ook iets gewijzigd met de manier waarop include files en globale variabelen worden ge-pre-processed.
Advertisement
- maartentukker
- Berichten: 37
- Geregistreerd: 07 Okt 2016, 10:33
Re: modeltrein besturing
Ik heb de code aangepast en de LDR data weg gehaald voor het overzicht, volgens mij zou het nu goed moeten zijn maar krijg nu de volgende fout code:
ldr_en_servo_combinatie_millis_2.ino:80:7: error: 'closeButtonstate' was not declared in this scope
maar deze staat bij openButtonstate, deze geeft geen melding??????
Staan de voids zo in de juiste volgorde of moeten de benoemde voids binnen void() vallen?
// servo data
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// constants
int openButtonPin = 10;
int closeButtonPin = 11;
int servoPin = 9;
int straightled = 6;
int turnled = 7;
// millis for servo instead of delay
unsigned long previousMillis;
boolean servoDelayActive = false;
const unsigned long delaydetach = 1000; // mag ook een int zijn
//variables
int servoPos = 80; // the current server position. Change it to whatever position you want your claw to start out at.
int openButtonState = 0;
int closeButtonState = 0;
void setup() {
Serial.begin(9600);
Serial.print("ldr en servo combinatie millis");
// servo setup
// setup the input pins on the Arduino
pinMode(openButtonPin, INPUT);
pinMode(closeButtonPin, INPUT);
pinMode(straightled, OUTPUT);
pinMode(turnled, OUTPUT);
// create the servo object
myservo.attach(servoPin); // attaches the servo to the servo object
myservo.write(servoPos);
}
void ServoGoTo (int pin, int value)
{
myservo.attach(pin); // attaches the servo control on pin 9 to the servo object
delay (15);
myservo.write(value); // sets the servo position according to the scaled value
}
void ServoIdle ()
{
myservo.detach(); //de-energizes servo control
}
void loop() {
unsigned long currentMillis = millis(); // just one currentMillis for the whole loop ()
// read the state of the buttons
openButtonState = digitalRead(openButtonPin);
closeButtonState = digitalRead(closeButtonPin);
if (openButtonState == LOW) { //if button is pressed turnover switches to bend
ServoGoTo (9, 100);
previousMillis = millis(); // timestamp at this moment
servoDelayActive = true; // enable the delay
digitalWrite (straightled, LOW);
digitalWrite (turnled, HIGH);
}
if (closeButtonstate == LOW) {
ServoGoTo (9, 80);
previousMillis = millis();
servoDelayActive = true;
digitalWrite (straightled, HIGH);
digitalWrite (turnled, LOW);
}
if (servoDelayActive)
{
if (currentMillis - previousMillis >= delaydetach)
{
ServoIdle();
servoDelayActive = false;
}
}
}
ldr_en_servo_combinatie_millis_2.ino:80:7: error: 'closeButtonstate' was not declared in this scope
maar deze staat bij openButtonstate, deze geeft geen melding??????
Staan de voids zo in de juiste volgorde of moeten de benoemde voids binnen void() vallen?
// servo data
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// constants
int openButtonPin = 10;
int closeButtonPin = 11;
int servoPin = 9;
int straightled = 6;
int turnled = 7;
// millis for servo instead of delay
unsigned long previousMillis;
boolean servoDelayActive = false;
const unsigned long delaydetach = 1000; // mag ook een int zijn
//variables
int servoPos = 80; // the current server position. Change it to whatever position you want your claw to start out at.
int openButtonState = 0;
int closeButtonState = 0;
void setup() {
Serial.begin(9600);
Serial.print("ldr en servo combinatie millis");
// servo setup
// setup the input pins on the Arduino
pinMode(openButtonPin, INPUT);
pinMode(closeButtonPin, INPUT);
pinMode(straightled, OUTPUT);
pinMode(turnled, OUTPUT);
// create the servo object
myservo.attach(servoPin); // attaches the servo to the servo object
myservo.write(servoPos);
}
void ServoGoTo (int pin, int value)
{
myservo.attach(pin); // attaches the servo control on pin 9 to the servo object
delay (15);
myservo.write(value); // sets the servo position according to the scaled value
}
void ServoIdle ()
{
myservo.detach(); //de-energizes servo control
}
void loop() {
unsigned long currentMillis = millis(); // just one currentMillis for the whole loop ()
// read the state of the buttons
openButtonState = digitalRead(openButtonPin);
closeButtonState = digitalRead(closeButtonPin);
if (openButtonState == LOW) { //if button is pressed turnover switches to bend
ServoGoTo (9, 100);
previousMillis = millis(); // timestamp at this moment
servoDelayActive = true; // enable the delay
digitalWrite (straightled, LOW);
digitalWrite (turnled, HIGH);
}
if (closeButtonstate == LOW) {
ServoGoTo (9, 80);
previousMillis = millis();
servoDelayActive = true;
digitalWrite (straightled, HIGH);
digitalWrite (turnled, LOW);
}
if (servoDelayActive)
{
if (currentMillis - previousMillis >= delaydetach)
{
ServoIdle();
servoDelayActive = false;
}
}
}
Re: modeltrein besturing
s != S
typefoutje
maar wel even zelf zoeken hoor, (houd je scherp.
typefoutje
maar wel even zelf zoeken hoor, (houd je scherp.
paul deelen
shooter@home.nl
shooter@home.nl
- maartentukker
- Berichten: 37
- Geregistreerd: 07 Okt 2016, 10:33
Re: modeltrein besturing
Bedankt, op een gegeven moment zie je het niet meer!!!!!!!
Re: modeltrein besturing
Als je een sketch neer zet, zou je dan de knop "Code" of "Select a Syntax" (en dan C++) willen kiezen ? Dan kan ik zien of de indents en de text layout een beetje netjes is
Een consequente stijl en consequent gebruik van haakjes en inspringen en met een juiste indeling naar functionaliteit, dan vind ik belangrijker dan of de sketch wel of niet werkt
Een consequente stijl en consequent gebruik van haakjes en inspringen en met een juiste indeling naar functionaliteit, dan vind ik belangrijker dan of de sketch wel of niet werkt
- maartentukker
- Berichten: 37
- Geregistreerd: 07 Okt 2016, 10:33
Re: modeltrein besturing
De LEDS werken nu prima, maar de servo nog niet. Als ik het laatste stuk met de controle vergelijking weg laat werkt de servo wel, maar gaat dus niet naar de detach functie. Is deze functie nog wel in het programma doet de servo helemaal niks???????
De knoppen heb ik wat aangepast omdat het signaal anders niet goed was en de servo alleen bewoog bij indrukken knop tot je deze loslaat. Nu gaat de servo naar het eind, echter wel alleen zonder tijdscontrole met delaydetach....
Wordt deze op een of andere manier gelijk geactiveerd waardoor de servo altijd detached blijft?
// servo data
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// constants
int servoPin = 9;
int straightled = 6;
int turnled = 7;
const int button1[] = {10, 11};
// millis for servo instead of delay
unsigned long previousMillis = 0;
boolean servoDelayActive = false;
const unsigned long delaydetach = 1000; // mag ook een int zijn
int buttonstate = 1;
int servoPos = 80; // the current server position. Change it to whatever position you want your claw to start out at.
void setup() {
Serial.begin(9600);
Serial.print("ldr en servo combinatie millis 3");
// setup the input pins on the Arduino
pinMode(straightled, OUTPUT);
pinMode(turnled, OUTPUT);
for (int x = 0; x < 10; x++) {
pinMode (button1[x], INPUT);
}
// create the servo object
myservo.attach(servoPin); // attaches the servo to the servo object
myservo.write(servoPos);
}
void ServoGoTo (int pin, int value)
{
myservo.attach(pin); // attaches the servo control on pin 9 to the servo object
delay (15);
myservo.write(value); // sets the servo position according to the scaled value
}
void ServoIdle ()
{
myservo.detach(); //de-energizes servo control
}
void loop() {
unsigned long currentMillis = millis(); // just one currentMillis for the whole loop ()
for (int x = 0; x < 10; x++) {
buttonstate = digitalRead(button1[x]);
if (buttonstate == HIGH && button1[x] == 10)
{ //if button is pressed turnover switches to bend
ServoGoTo (9, 100);
previousMillis = millis(); // timestamp at this moment
servoDelayActive = true; // enable the delay
digitalWrite (straightled, LOW);
digitalWrite (turnled, HIGH);
}
if (buttonstate == HIGH && button1[x] == 11)
{
ServoGoTo (9, 80);
previousMillis = millis();
servoDelayActive = true;
digitalWrite (straightled, HIGH);
digitalWrite (turnled, LOW);
}
}
// Check if the delay is active and the time has finished.
if (servoDelayActive)
{
if (currentMillis - previousMillis >= delaydetach)
{
ServoIdle();
servoDelayActive = false; // disable this delay, we don't need it after this.
}
}
}
De knoppen heb ik wat aangepast omdat het signaal anders niet goed was en de servo alleen bewoog bij indrukken knop tot je deze loslaat. Nu gaat de servo naar het eind, echter wel alleen zonder tijdscontrole met delaydetach....
Wordt deze op een of andere manier gelijk geactiveerd waardoor de servo altijd detached blijft?
// servo data
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// constants
int servoPin = 9;
int straightled = 6;
int turnled = 7;
const int button1[] = {10, 11};
// millis for servo instead of delay
unsigned long previousMillis = 0;
boolean servoDelayActive = false;
const unsigned long delaydetach = 1000; // mag ook een int zijn
int buttonstate = 1;
int servoPos = 80; // the current server position. Change it to whatever position you want your claw to start out at.
void setup() {
Serial.begin(9600);
Serial.print("ldr en servo combinatie millis 3");
// setup the input pins on the Arduino
pinMode(straightled, OUTPUT);
pinMode(turnled, OUTPUT);
for (int x = 0; x < 10; x++) {
pinMode (button1[x], INPUT);
}
// create the servo object
myservo.attach(servoPin); // attaches the servo to the servo object
myservo.write(servoPos);
}
void ServoGoTo (int pin, int value)
{
myservo.attach(pin); // attaches the servo control on pin 9 to the servo object
delay (15);
myservo.write(value); // sets the servo position according to the scaled value
}
void ServoIdle ()
{
myservo.detach(); //de-energizes servo control
}
void loop() {
unsigned long currentMillis = millis(); // just one currentMillis for the whole loop ()
for (int x = 0; x < 10; x++) {
buttonstate = digitalRead(button1[x]);
if (buttonstate == HIGH && button1[x] == 10)
{ //if button is pressed turnover switches to bend
ServoGoTo (9, 100);
previousMillis = millis(); // timestamp at this moment
servoDelayActive = true; // enable the delay
digitalWrite (straightled, LOW);
digitalWrite (turnled, HIGH);
}
if (buttonstate == HIGH && button1[x] == 11)
{
ServoGoTo (9, 80);
previousMillis = millis();
servoDelayActive = true;
digitalWrite (straightled, HIGH);
digitalWrite (turnled, LOW);
}
}
// Check if the delay is active and the time has finished.
if (servoDelayActive)
{
if (currentMillis - previousMillis >= delaydetach)
{
ServoIdle();
servoDelayActive = false; // disable this delay, we don't need it after this.
}
}
}
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: modeltrein besturing
Koepel schreef:Als je een sketch neer zet, zou je dan de knop "Code" of "Select a Syntax" (en dan C++) willen kiezen ? Dan kan ik zien of de indents en de text layout een beetje netjes is
Een consequente stijl en consequent gebruik van haakjes en inspringen en met een juiste indeling naar functionaliteit, dan vind ik belangrijker dan of de sketch wel of niet werkt
De TS duidelijk nog niet
- maartentukker
- Berichten: 37
- Geregistreerd: 07 Okt 2016, 10:33
Re: modeltrein besturing
Jullie hebben gelijk, ik ben er nog niet super handig in, hopelijk is deze beter:
cpp code
cpp code
- Code: Alles selecteren
// servo data
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// constants
int servoPin = 9;
int straightled = 6;
int turnled = 7;
const int button1[] = {10, 11};
// millis for servo instead of delay
unsigned long previousMillis = 0;
boolean servoDelayActive = false;
const unsigned long delaydetach = 1000; // mag ook een int zijn
int buttonstate = 1;
int servoPos = 80; // the current server position. Change it to whatever position you want your claw to start out at.
void setup() {
Serial.begin(9600);
Serial.print("ldr en servo combinatie millis 4");
// setup the input pins on the Arduino
pinMode(straightled, OUTPUT);
pinMode(turnled, OUTPUT);
for (int x = 0; x < 10; x++) {
pinMode (button1[x], INPUT);
}
// create the servo object
myservo.attach(servoPin); // attaches the servo to the servo object
myservo.write(servoPos);
}
void ServoGoTo (int pin, int value)
{
myservo.attach(pin); // attaches the servo control on pin 9 to the servo object
delay (15);
myservo.write(value); // sets the servo position according to the scaled value
}
void ServoIdle ()
{
myservo.detach(); //de-energizes servo control
}
void loop() {
unsigned long currentMillis = millis(); // just one currentMillis for the whole loop ()
for (int x = 0; x < 10; x++) {
buttonstate = digitalRead(button1[x]);
if (buttonstate == HIGH && button1[x] == 10)
{ //if button is pressed turnover switches to bend
ServoGoTo (9, 100);
previousMillis = millis(); // timestamp at this moment
servoDelayActive = true; // enable the delay
digitalWrite (straightled, LOW);
digitalWrite (turnled, HIGH);
}
if (buttonstate == HIGH && button1[x] == 11)
{
ServoGoTo (9, 80);
previousMillis = millis();
servoDelayActive = true;
digitalWrite (straightled, HIGH);
digitalWrite (turnled, LOW);
}
}
// Check if the delay is active and the time has finished.
if (servoDelayActive)
{
if (currentMillis - previousMillis >= delaydetach)
{
ServoIdle();
servoDelayActive = false; // disable this delay, we don't need it after this.
}
}
}
Re: modeltrein besturing
Dit:
Dit
Helaas ziet de c++ compiler niet dat het niet mag, en je krijgt er geen foutmelding op.
Dus, even achterover leunen, en nagaan wat je wil. Er zijn twee knoppen, en die wil je allebei doen in een for-loop. Dan heb je een for-loop nodig die de twee elementen afloopt, en geen tien elementen waarvan er acht niet bestaan.
- Code: Alles selecteren
const int button1[] = {10, 11};
Dit
- Code: Alles selecteren
for (int x = 0; x < 10; x++) {
pinMode (button1[x], INPUT);
}
- Code: Alles selecteren
for (int x = 0; x < 10; x++) {
buttonstate = digitalRead(button1[x]);
Helaas ziet de c++ compiler niet dat het niet mag, en je krijgt er geen foutmelding op.
Dus, even achterover leunen, en nagaan wat je wil. Er zijn twee knoppen, en die wil je allebei doen in een for-loop. Dan heb je een for-loop nodig die de twee elementen afloopt, en geen tien elementen waarvan er acht niet bestaan.
- maartentukker
- Berichten: 37
- Geregistreerd: 07 Okt 2016, 10:33
Re: modeltrein besturing
Ik heb de code aangepast en werkt, maar wil ik het proberen met 1 drukknop. Dit betekent minder draden onder het emplacement een een eenvoudigere besturing hoop ik....
Nu heb ik de volgende code;
cpp code
Deze werkt goed met 1 servo, nu heb ik ook de servo op uitgang 3 getest, deze uitgang werkt, maar niet met de aansturing van servo 2??? Terwijl het programma hetzelfde is. Waarom slaat hij dit stukje van de loop over? Of iig lijkt het zo dat dit stukje niet meedoet omdat de drukknop en LED's ook niet reageren. Enig idee wat ik hier mis?
Nu heb ik de volgende code;
cpp code
#include <MegaServo.h>
MegaServo myservo;
// constant variables used to set servo angles, in degrees
const int recht = 80;
const int bocht = 110;
MegaServo servo1;
MegaServo servo2;
// constant variables holding the ids of the pins we are using
const int bocht_led1 = 24;
const int recht_led1 = 25;
const int button1 = 22;
const int bocht_led2 = 30;
const int recht_led2 = 31;
const int button2 = 28;
// servo movement step delay, in milliseconds
const int step_delay = 150;
// global variables to store servo position
int pos = recht; // current
int old_pos = pos; // previous
void setup()
{
Serial.begin(9600);
Serial.print("turnout control");
// set the mode for the digital pins in use
pinMode(button1, INPUT);
pinMode(recht_led1, OUTPUT);
pinMode(bocht_led1, OUTPUT);
pinMode(button2, INPUT);
pinMode(recht_led2, OUTPUT);
pinMode(bocht_led2, OUTPUT);
// setup the servo
myservo.write(pos); // set the initial servo position
// set initial led states
digitalWrite(recht_led1, HIGH);
digitalWrite(bocht_led1, LOW);
digitalWrite(recht_led2, HIGH);
digitalWrite(bocht_led2, LOW);
}
void ServoGoTo (int pin, int i)
{
myservo.attach(pin); // attaches the servo control on pin 9 to the servo object
delay (15);
myservo.write(i); // sets the servo position according to the scaled value
}
void ServoIdle ()
{
myservo.detach(); //de-energizes servo control
}
void loop()
{
// Servo 1 control
// start each iteration of the loop by reading the button
// if the button is pressed (reads HIGH), move the servo
int button_state1 = digitalRead(button1);
if (button_state1 == HIGH) {
// turn off the lit led
if (pos == recht) {
digitalWrite(recht_led1, LOW);
} else {
digitalWrite(bocht_led1, LOW);
}
old_pos = pos; // save the current position
// Toggle the position to the opposite value
pos = pos == recht ? bocht : recht;
// Move the servo to its new position
if (old_pos < pos) { // if the new angle is higher
// increment the servo position from oldpos to pos
for (int i = old_pos + 10; i <= pos; i++) {
ServoGoTo (2, i); // write the next position to the servo
delay(step_delay); // wait
}
ServoIdle();
} else { // otherwise the new angle is equal or lower
// decrement the servo position from oldpos to pos
for (int i = old_pos - 10; i >= pos; i--) {
ServoGoTo(2, i); // write the next position to the servo
delay(step_delay); // wait
}
ServoIdle();
}
// turn on the appropriate LED.
if (pos == recht) {
digitalWrite(recht_led1, HIGH);
} else {
digitalWrite(bocht_led1, HIGH);
}
// Servo 2 control
int button_state2 = digitalRead(button2);
if (button_state2 == HIGH) {
// turn off the lit led
if (pos == recht) {
digitalWrite(recht_led2, LOW);
} else {
digitalWrite(bocht_led2, LOW);
}
old_pos = pos; // save the current position
// Toggle the position to the opposite value
pos = pos == recht ? bocht : recht;
// Move the servo to its new position
if (old_pos < pos) { // if the new angle is higher
// increment the servo position from oldpos to pos
for (int i = old_pos + 10; i <= pos; i++) {
ServoGoTo (3, i); // write the next position to the servo
delay(step_delay); // wait
}
ServoIdle();
} else { // otherwise the new angle is equal or lower
// decrement the servo position from oldpos to pos
for (int i = old_pos - 10; i >= pos; i--) {
ServoGoTo(3, i); // write the next position to the servo
delay(step_delay); // wait
}
ServoIdle();
}
// turn on the appropriate LED.
if (pos == recht) {
digitalWrite(recht_led2, HIGH);
} else {
digitalWrite(bocht_led2, HIGH);
}
}
}// end of loop
}
Deze werkt goed met 1 servo, nu heb ik ook de servo op uitgang 3 getest, deze uitgang werkt, maar niet met de aansturing van servo 2??? Terwijl het programma hetzelfde is. Waarom slaat hij dit stukje van de loop over? Of iig lijkt het zo dat dit stukje niet meedoet omdat de drukknop en LED's ook niet reageren. Enig idee wat ik hier mis?
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 7 gasten