modeltrein besturing

algemene C code
Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: modeltrein besturing

Berichtdoor Koepel » 13 Nov 2016, 00:42

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

Berichten: 37
Geregistreerd: 07 Okt 2016, 10:33

Re: modeltrein besturing

Berichtdoor maartentukker » 13 Nov 2016, 12:32

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;
}
}
}

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: modeltrein besturing

Berichtdoor shooter » 13 Nov 2016, 14:15

s != S
typefoutje
maar wel even zelf zoeken hoor, (houd je scherp.
paul deelen
shooter@home.nl

Berichten: 37
Geregistreerd: 07 Okt 2016, 10:33

Re: modeltrein besturing

Berichtdoor maartentukker » 13 Nov 2016, 15:11

:lol: :lol: :lol:
Bedankt, op een gegeven moment zie je het niet meer!!!!!!!

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: modeltrein besturing

Berichtdoor Koepel » 13 Nov 2016, 15:33

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

Berichten: 37
Geregistreerd: 07 Okt 2016, 10:33

Re: modeltrein besturing

Berichtdoor maartentukker » 13 Nov 2016, 17:00

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.
}
}
}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: modeltrein besturing

Berichtdoor nicoverduin » 13 Nov 2016, 18:43

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

De TS duidelijk nog niet :mrgreen: :mrgreen:
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 37
Geregistreerd: 07 Okt 2016, 10:33

Re: modeltrein besturing

Berichtdoor maartentukker » 13 Nov 2016, 19:17

Jullie hebben gelijk, ik ben er nog niet super handig in, hopelijk is deze beter: :D :D :D

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.
    }
  }
}


Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: modeltrein besturing

Berichtdoor Koepel » 13 Nov 2016, 22:52

Dit:
Code: Alles selecteren
const int button1[] = {10, 11};
declareert een integer array van twee elementen, button1[0] wordt 10, en button1[1] wordt 11.

Dit
Code: Alles selecteren
for (int x = 0; x < 10; x++) {
    pinMode (button1[x], INPUT);
  }
en deze:
Code: Alles selecteren
for (int x = 0; x < 10; x++) {

    buttonstate = digitalRead(button1[x]);
gaan iets verder dan de twee elementen. De index [0] en [1] worden gedaan, maar daarna ook nog [2] tot en met [9]. Die bestaan dus niet. Er worden zomaar wat geheugenplaatsen gebruikt. Dan kan er van alles gebeuren.
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.

Berichten: 37
Geregistreerd: 07 Okt 2016, 10:33

Re: modeltrein besturing

Berichtdoor maartentukker » 20 Nov 2016, 16:15

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
#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?

VorigeVolgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast