modeltrein besturing

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

Re: modeltrein besturing

Berichtdoor nicoverduin » 10 Okt 2016, 12:03

De feedback van een servo zit ingebakken in de motor zelf. Dus moet je onthouden waar je naartoe gaat als je de servo uitstuurt.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Advertisement

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

Re: modeltrein besturing

Berichtdoor Koepel » 10 Okt 2016, 16:26

Of je vraagt een fabrikant om speciaal voor jou de feedback van de interne potmeter met een extra draadje naar buiten te brengen : https://www.adafruit.com/product/1404.
Maar als die stuk zou gaan, en Adafruit zou ze niet meer verkopen, dan valt je hele project in duigen.

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

Re: modeltrein besturing

Berichtdoor shooter » 10 Okt 2016, 18:02

Terugmelding van een wissel kan het beste met een microswitch, onder op de wissel. Bij een servo stuur je een tijdsignaal uit (positie) en ga je ervan uit dat de servo in de goede positie staat, dus de stand kun je uit je aansturing halen.
attach hoort in de setup en detach schakelt de servo niet uit alleen de aansturing dus de servo gaat vreemde dingen doen.
langzaam sturen van een servo kan zeker, maar dan heb je een functie nodig die telkens de servo een stapje laat zetten.
en zorg dat je een mooie slag maakt, desnoods met een mechanisch veertje. van 80 naar 100 is echt te weinig.
kijk eens naar een echte wisselmotor.
sommige hebben daarop zelfs spanningsschakelaars voor de rails, en feedback.

de wissels aansluiten op de rails en de beide afgaande takken naar je schakeltableau.
ook seinen zul je nodig hebben, dus zet die vast in je opzet.
paul deelen
shooter@home.nl

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

Re: modeltrein besturing

Berichtdoor maartentukker » 06 Nov 2016, 17:47

Ik ben al aardig opgeschoten en verder gegaan met blok signalisering, dit door reed sensor modules en een 12V relay module. De code volgt in een volgende post.
Nu heb ik nog wel een vraag over post. Bij het schakelen van de servo's gebruik ik delay. Dit wil ik echter vervangen door millis, hoe kan ik dit het beste doen?
Ik heb al verschillende topics gelezen, oa blink without delay, ook met meerdere leds met verschillende pulsen. Maar dit is geen blink en het zijn verschillende timers. Ik kom er nog niet uit....

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

Re: modeltrein besturing

Berichtdoor maartentukker » 06 Nov 2016, 17:49

De code voor het stroomloos schakelen van een stuk rails bij passeren van sensoren:


//
// Relais module met externe voeding 9V op JD-VCC en GRD
// Arduino aansturing relais 1 via pin 8, Arduino 5V voeding op VCC naast relais aansluitingen, GEEN GRD voor arduino sturing, dit loopt intern
//

const int block1[] = {6,7}; // koppel pin 6 aan sensor 1 (blok in) en 7 aan sensor 2 (blok uit)

int blockstate = 1; // variable voor sensor status

int relay1 = 8; // koppel relais 1 aan pin 8
int relay2 = 9; // koppel relais 2 aan pin 9

void setup (){

// tekst ter herkenning programma
Serial.begin(9600);
Serial.println("reed sensor met relais hold value");

pinMode (relay1, OUTPUT); // DO
pinMode (relay2, OUTPUT); // DO

for(int x=0; x<6; x++) { // set de sensoren als input
pinMode(block1[x], INPUT);
}
}
void loop (){

for(int x=0; x<6; x++){

blockstate = digitalRead(block1[x]);

if(blockstate == HIGH && block1[x] == 6) { // als sensor 1 geactiveerd, dan relay 1 getrokken (vorig blok spanningsloos), (NC contact)
digitalWrite(relay1, LOW);
}
if(blockstate == HIGH && block1[x] == 7) { // tot sensor 2 geactiveerd is, dan relay 1 open (weer spanning op vorig blok)
digitalWrite(relay1, HIGH);
}
}
}

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

Re: modeltrein besturing

Berichtdoor maartentukker » 06 Nov 2016, 21:21

Ik dacht aan de volgende aanpassing met millis()


// LDR data

// set pin numbers:
const int LDRPin[] = {2,3}; // the number of the LDR pins
const int ledPin1 = 4; // the number of ledPin block in
const int ledPin2 = 5; // the number of ledPin block out

// variables will change:
int LDRState = 1; // variable for reading the LDR status


// __________________________________________________________
// 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 previousMilliswrite = 0;
unsigned long previousMillisdetach = 0;

int delaywrite = 15;
int delaydetach = 1000;


//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");

// LDR setup

// initialize the LED pin as an output:
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
// initialize the pushbutton pin as an input:
for(int x=0; x<2; x++)
{
pinMode(LDRPin[x], INPUT);
}

// 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 loop(){

// read the state of the LDR value one by one (2 in total in this case):
for(int x=0; x<2; x++)
{
LDRState = digitalRead(LDRPin[x]);

// check if the LDR is activated.
// if it is, the LDRState is LOW.
if (LDRState == LOW && LDRPin[x] == 2) { // x == 2 means the first LDR in line at begin of block
// turn occupation LED on:
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
}
if (LDRState == LOW && LDRPin[x] == 3) { // x == 3 means the second LDR (at pin 3) in line at the end of block
// turn block free LED on:
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
}
}

// servo loop

// read the state of the buttons
openButtonState = digitalRead(openButtonPin);
closeButtonState = digitalRead(closeButtonPin);

unsigned long currentMillis = millis(); // get current time stamp, used for both if statements

// if button is pressed, turnover switches to straight
if (openButtonState == LOW && closeButtonState != LOW) {

myservo.attach(9); // attaches the servo control on pin 9 to the servo object
if((unsigned long)(currentMillis - previousMilliswrite) >= delaywrite){ // timer after attaching 15ms
myservo.write(100); // sets the servo position according to the scaled value
previousMilliswrite = currentMillis;
}
if((unsigned long)(currentMillis - previousMillisdetach) >= delaydetach){ // timer before detaching servo 1000ms
myservo.detach(); //de-energizes servo control
previousMillisdetach = currentMillis;
}
digitalWrite(straightled, HIGH); //indication led turnover straight pos
digitalWrite(turnled, LOW);

}
//if button is pressed turnover switches to bend
if (closeButtonState == LOW && openButtonState != LOW) {

myservo.attach(9); // attaches the servo on pin 9 to the servo object
if((unsigned long)(currentMillis - previousMilliswrite) >= delaywrite){
myservo.write(80);// sets the servo position according to the scaled value
previousMilliswrite = currentMillis;
}
if((unsigned long)(currentMillis - previousMillisdetach) >= delaydetach){ // waits for it to get to the position
myservo.detach(); //de-energizes servo
previousMillisdetach = currentMillis;
}
digitalWrite(turnled, HIGH); //indication led turnover bend pos
digitalWrite(straightled, LOW);

}

// print the servo position to the serial console
Serial.println(servoPos);
}

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

Re: modeltrein besturing

Berichtdoor Koepel » 06 Nov 2016, 22:02

Je kunt wel een waarde geven aan previousMillisdetach en previousMilliswrite, maar niemand weet dat de vertraging actief is.
Het is een eenmalige vertraging, dus het is niet nodig om die variabelen op te hogen.

Vergeet even de Arduino en code.
Stel je wilt iets doen op een later tijdstip.
Dan onthoud je de huidige tijd, en je plakt een memo bij de klok dat als de tijd een uur verder is, dat er dan iets moet gebeuren.
Zonder die indicatie van het memo, weet namelijk niemand of er op de klok gekeken moet worden. Zonder memo zou de klok 3 uur verder kunnen zijn. Moet het dan nog uitgevoerd worden of niet ?
Dus de memo geeft aan dat het actief is, en als het is uitgevoerd dan wordt de memo weggehaald.

Daarom gebruik ik altijd twee variabelen. Een unsigned long previousMilliswrite en een boolean writeDelayActive.

Daarna is het een kwestie van kijken of de writeDelayActive actief is, en alleen dan kijken of de tijd verstreken is.

Deze mag meteen bij het begin van de loop().
Code: Alles selecteren
  unsigned long currentMillis = millis(); // get current time stamp, used for both if statements


Maar nu heb ik toch wel een probleem. In je sketch zie ik vier keer een verkeerde afhandeling van de vertraging maar ik zie nergens wanneer die vertraging gestart wordt.

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

Re: modeltrein besturing

Berichtdoor shooter » 06 Nov 2016, 22:11

je doet teveel definities maken zoals current zet die in de setup en in de loop een update.
ook dat unsigned long is niet nodig
verder als een timer is afgelopen ga dan naar een functie waar je de rest in doet, zoals wissels en zo zetten.
dan blijft het overzichtelijk.
je zult ook even moeten herdenken want de timer lopen parallel, ipv delay die altijd achter elkaar loopt, dus je moet de volgende tijd pas zetten als de vorige actie klaar is.
paul deelen
shooter@home.nl

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

Re: modeltrein besturing

Berichtdoor maartentukker » 06 Nov 2016, 22:20

Oke... ik dacht dat elke memo op de plaats van delay moest en ze elkaar zo opvolgen...
Maar nu zet je ze al aan het begin. Hoe weet het programma dan waar ze van kracht moeten zijn?
Deze timers moeten later voor veel meer servo's gaan gelden binnen hetzelfde programma.

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

Re: modeltrein besturing

Berichtdoor maartentukker » 06 Nov 2016, 22:25

Ik ben vrij nieuw met progammeren, maar waarmee kan ik de timers dan in serie laten lopen?
Dus een start en eind geven op een specifieke plek in het programma?

VorigeVolgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 13 gasten