modeltrein besturing

algemene C code
Berichten: 37
Geregistreerd: 07 Okt 2016, 10:33

modeltrein besturing

Berichtdoor maartentukker » 07 Okt 2016, 10:42

Hallo allemaal,

Sinds enige tijd ben ik druk met arduino bezig om een modeltreinbaan deels te automatiseren. De basis set heb ik gedaan en verschillende aanpassingen gemaakt. Nu vond ik op het internet de volgende code:

ee the code below to see how this works.
cpp code
/* YourDuinoStarter Example: Automation Example:
This shows a way of organizing more complex automation software.
It works the same as "Lighting Control Example"
- Reads voltage on Analog Pin 0 and may display value
- Reads voltage on Analog Pin 1 and may display value
- Compares values and turns on light if it's darker than setting
- SEE the comments after "//" on each line below
- CONNECTIONS:
- Potentiometer from +5 to Ground, center to pin A0
- Photoresistor from +5V to pin A1, 10K from A1 to Gnd.
- Relay may be connected to Pin 13 (or other if "ledPin" is changed.)
- V1.04 02/11/13
Questions: terry@yourduino.com */

/*-----( Import needed libraries )-----*/
//none
/*-----( Declare Constants and Pin Numbers )-----*/
#define potPin A0 // In separate group of pins
#define photoPin A1 // In separate group of pins
#define ledPin 13 // The onboard LED
#define RelayPin 3 // Control an active-low relay
/*-----( Declare objects )-----*/
//none
/*-----( Declare Variables )-----*/
int potValue; // Hold the values read in
int photoValue;
boolean lightsOn; // Should Lights should be turned on?
boolean Debug_ShowValues; // Should values be sent to Serial Monitor?
// Boolean Values can be only "true" or "false"

void setup() /****** SETUP: RUNS ONCE ******/
{
pinMode(ledPin, OUTPUT);
pinMode(RelayPin, OUTPUT);
lightsOn = false; // Start with Lights off
Debug_ShowValues = false; // Do not show. Change this to test.
if (Debug_ShowValues == true)
{
Serial.begin(9600); //Start sending to "Serial Monitor"
Serial.println("YourDuinoStarter Example: Automation Example.");
}
}//--(end setup )---


void loop() /****** LOOP: RUNS CONSTANTLY ******/
{
ReadSensors(); // Each of these is a function defined below
MakeDecisions();
TakeActions();

delay(1000); // Wait 1 second
}//--(end main loop )---

/*-----( Declare User-written Functions )-----*/

void ReadSensors()
{
potValue = analogRead(potPin); //Read value
photoValue = analogRead(photoPin); //Read value
if (Debug_ShowValues == true)
{
Serial.print("POT VALUE = ");
Serial.print(potValue,DEC); // Print value
Serial.print(" PHOTORESISTOR VALUE = ");
Serial.println(photoValue,DEC); // Print value
}
}

/*---------------------------*/
void MakeDecisions()
{
if (photoValue < potValue)
{
lightsOn = true;
}
else
{
lightsOn = false;
}

}

/*---------------------------*/
void TakeActions()
{
if (lightsOn == true) // "==" means "compare Equal"
{
digitalWrite(ledPin, HIGH);
digitalWrite(RelayPin, LOW); // This relay is Active LOW!
}
else
{
digitalWrite(ledPin, LOW);
digitalWrite(RelayPin, HIGH);
}
}
//*********( THE END )***********

Deze wil ik deels gebruiken voor trein detectie, maar nu krijg ik een error bij compilatie. Nl dat de potValue niet gedefinieerd is? Ik kom er niet uit waar dat nu aan ligt, want deze staat toch bij de variables.
kunnen jullie mij mss hierbij helpen?

Alvast bedankt!

Advertisement

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

Re: modeltrein besturing

Berichtdoor Koepel » 07 Okt 2016, 12:57

Ik heb het in Arduino.cc IDE 1.6.12 gecompileerd voor een Arduino Uno, en dat gaat goed.

Heb je misschien een nieuwe Arduino IDE op je computer gezet, terwijl er nog allerlei dingen van een oude zijn achtergebleven ?

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

Re: modeltrein besturing

Berichtdoor shooter » 07 Okt 2016, 17:36

kijk eens op regel 25 of daar niet toevallig een hoofdletter mist of een andere typfout.
Bij gevonden software is het altijd heel moeilijk om alles goed door te hebben.

dit voorbeeld is wel netjes gemaakt trouwens, maar je zult wel je eigen functions moeten gaan schrijven.

en als je een fout krijgt dan is het echt een kwestie van lezen en begrijpen wat er staat, maar vooral begrijp wat elke regel in het programma doet, en dus puzzelen.
niet erg hoor, daar leer je van.

Ik heb veel hulp van een cheatsheet.
paul deelen
shooter@home.nl

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

Re: modeltrein besturing

Berichtdoor maartentukker » 09 Okt 2016, 19:22

Bedankt, het is gelukt...

Maar nu ben ik verder gegaan en heb 2 sketches gecombineerd, 1 trein detectie met fotosensors, deze werkt heel goed zoals gepland. De andere is een drukknop servo sturing met instelbare uitslag waarden. Als ik deze bedien gaat de servo naar 170 graden toe en blijft daar staan, de tx led op de arduino brand erg lang??? en de servo blijft daar staan ondanks drukken op andere knop. volgens mij zou de sketch moeten werken, ik heb alles nagelopen en hij geeft ook geen foutmelding.
Als ik op de knoppen druk gaat tx wel branden, een tijd lang...
Heeft iemand een idee waarom deze servo zo reageerd?

Hier volgt de sketch:

// 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 openLimit = 0; // can be set to limit the claw to its "safe" opening limit
int closeLimit = 170; // can be set to limit the claw to its "safe" closing limit
int stepInterval = 1;

//variables
int servoPos = 90; // 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() {

// 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

// open the serial console
Serial.begin(9600);
Serial.println("Begin Claw testing");

// setup the input pins on the Arduino
pinMode(openButtonPin, INPUT);
pinMode(closeButtonPin, INPUT);

// create the servo object
myservo.attach(servoPin); // attaches the servo to the servo object
myservo.write(servoPos);
}

void loop(){

// LDR loop
// read the state of the LDR value:
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) {
// turn occupation LED on:
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
}
if (LDRState == LOW && LDRPin[x] == 3) {
// 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);

// if neither button is pushed or both buttons are pushed, do nothing
if ( openButtonState == closeButtonState ) {
return;
}

// if the open button is pushed, open the claw by stepInterval
if (openButtonState == HIGH) {
servoPos = servoPos - stepInterval;
}

// if the close button is pushed, close the claw by stepInterval
if (closeButtonState == HIGH) {
servoPos = servoPos + stepInterval;
}

// make sure we don't try to open the claw further than it can go
if (servoPos > openLimit) {
servoPos = openLimit;
}

// make sure we don't try to close the claw tighter than it can go
if (servoPos < closeLimit) {
servoPos = closeLimit;
}

// sets the servo position according to the new value
myservo.write(servoPos);

// waits for the servo to get there
delay(15);

// 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 » 09 Okt 2016, 20:03

Een servo motor en een Arduino die raar doet. Dan gaan de alarmbellen rinkelen :o

Een servo motor kan een piekstroom hebben van 500mA, op het moment dat die begint te draaien.
De 5V pin van een Arduino is niet sterk genoeg voor een servo motor.

Kun je de servo motor apart voeden ? Bijvoorbeeld met een adapter ?

Of er zit een foutje in je sketch.
Bijvoorbeeld dat je niet de grenzen goed afhandeld.
De openLimit is 0, en de closeLimit is 170.
Dus dit doe je precies andersom:
Code: Alles selecteren
// make sure we don't try to open the claw further than it can go
if (servoPos > openLimit) {
servoPos = openLimit;
}

// make sure we don't try to close the claw tighter than it can go
if (servoPos < closeLimit) {
servoPos = closeLimit;
}

Je wilt de waarde niet onder de nul laten gaan, dus ingrijpen als de waarde kleiner is dan 0. En bij closeLimit ook net andersom.

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

Re: modeltrein besturing

Berichtdoor shooter » 09 Okt 2016, 20:24

hoe heb je de drukknoppen aangesloten en hoe heb je de servo gedaan?
en koepel heeft gelijk het moet eigenlijk zijn < bij open en > bij close
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 31
Geregistreerd: 08 Sep 2016, 21:50

Re: modeltrein besturing

Berichtdoor Kitemasters » 10 Okt 2016, 02:03

ik draai nog niet zo lang mee maar je eerste probleem ben ik ook een paar keer
op gestuit en meestal kwam dit door een { } teveel of te weinig of een ; die ontbreekt.
en dat hoeft niet perse in de regel te zijn die hij als fout geeft.
maar zoals je al zij was dat probleem opgelost.

En met servo`s heb ik ook geen ervaring (anders dan dat ik ze radiografisch gebruikte)
dus aan mij heb je ook niks ;)

Maar aangezien ik met iets soortgelijks bezig was
viewtopic.php?f=21&t=1995
Ben ik wel nieuwsgierig naar je project.
kun je iets meer prijsgeven over wat je precies wil bereiken.

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

Re: modeltrein besturing

Berichtdoor maartentukker » 10 Okt 2016, 04:07

Bedankt voor jullie reacties, ik ga vanmiddag weer aan de slag en de voeding veranderen, alsmede de min max.

Mijn doel is om een deels geautomatiseerde modelspoor te maken. Waarbij de treinen op het hoofdspoor automatisch rijden, afremmen en stoppen, met alle bijbehorende signaleringen en beveiligingen. De wissels moeten automatisch, maar ook handmatig bediend worden en daarbij dus bepaalde delen stroomloos geschakeld worden.
Het rangeerspoor wordt handmatig bediend. Dit alles op n-schaal.
Ik ben eerst electronisch alles aan het uitpluizen alvorens met de bouw te beginnen om rekening te houden met de componenten die hierin verwerkt moeten worden.

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

Re: modeltrein besturing

Berichtdoor maartentukker » 10 Okt 2016, 04:11

Voor treindetectie ga ik ws van reed contacten gebruik maken ipv ldr. Maar deze had ik liggen en voldoen voor tests.

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

Re: modeltrein besturing

Berichtdoor maartentukker » 10 Okt 2016, 11:46

Ik heb de code veranderd naar een directe sturing voor de servo. Beide oplossingen werkte nog niet naar behoren.
De code is nu zo:
cpp code
// 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;

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

// 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



// open the serial console
Serial.begin(9600);
Serial.println("test");

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

// LDR loop
// read the state of the LDR value:
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) {
// turn occupation LED on:
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
}
if (LDRState == LOW && LDRPin[x] == 3) {
// 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);

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

myservo.attach(9); // attaches the servo on pin 9 to the servo object
delay(15);
myservo.write(100); // sets the servo position according to the scaled value
delay(1000); // waits for it to get to the position
myservo.detach(); //de-energizes servo
digitalWrite(straightled, HIGH); //indication led turnover straight pos
digitalWrite(turnled, LOW);

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

myservo.attach(9); // attaches the servo on pin 9 to the servo object
delay(15);
myservo.write(80); // sets the servo position according to the scaled value
delay(1000); // waits for it to get to the position
myservo.detach(); //de-energizede servo
digitalWrite(turnled, HIGH); //indication led turnover bend pos
digitalWrite(straightled, LOW);

}

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

De servo gaat nu vrij snel, maar de afstand om de wissel te schakelen is miniem. De extra leds geven de stand aan, tenminste de sturing van de stand. Ik wil de indicatie eigenlijk positie afhankelijk maken en niet uitsturings afhankelijk, dit om na te gaan of de wissel ook daadwerkelijk in die stand staat.
Ik denk iets met read(), maar zie nog niet precies hoe omdat de servo geen feedback geeft.

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 7 gasten