train control project

Als U een gezamenlijk project wil starten of aan projecten van anderen mee wilt werken.
Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: train control project

Berichtdoor shooter » 11 Sep 2016, 19:20

readLDR hoeft er maar 1 keer te staan hoor, want het programma wordt telkens doorlopen, en het lijkt een heel eind goed te zijn denk ik.
paul deelen
shooter@home.nl

Advertisement

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

Re: train control project

Berichtdoor Kitemasters » 12 Sep 2016, 16:28

ben weer aan de knutsel :)

int sensLreading = analogRead; is aangepast naar int sensLreading = 0;


Je gebruikt een String object voor de state.
ja dit kan ook een integer zijn 0 voor ruststand 1 voor links enz, voornamelijk wordt als bezwaar gegeven dat een string veel geheugen gebruikt.
maar bij het schrijven bedacht ik dat cijfertjes wat verwarrend kan worden. en omdat ik een Mega gebruik, en het een vrij simpel klein programmaatje (dacht ik toen nog) zou worden. dacht ik
me deze vrijheid nog even te kunnen permitteren.

enum states was ik nog niet tegen gekomen maar ga het zeker opzoeken. ziet er goed uit, behalve dan JUST_DROPPED_OFF_THE_TABLE :o

In readLDR() twee keer analogRead() aanroepen lijkt me overbodig.

op het internationale forum werd dit aanbevolen. https://forum.arduino.cc/index.php?topic=420457.0
say you read A0 and is a 5 volts. and
then A1 and it is at 0.1 volts.
the buffer started at 5 and has to drain to 0.1

if you read
A1
A1

your first read of A1 will bring the buffer near to your reading.
the second time is will not have any of the values from the previous pin.

hoor graag of hier een grond van waarheid inzit, of dat het onzin is.

pin 3 heb ik nu een const gegeven, toen ik ermee bezig was in het begin merkte ik dat "speed" al door arduino code gebruikt wordt.
en omdat deze pin van de motor-shield is zal hij ook nooit anders worden. daarom dacht ik dat het net zo makkelijk was om 3 te typen.
wat ik me nu wel afvraag is dat ik de ledpins wel toewijs als "output". dat moet ik dat ook voor pin 3 doen? maar ik geef de ldr pins niet aan als input (komt dit door de analogread dat dat niet nodig is?)

@shooter
readLDR hoeft er maar 1 keer te staan hoor, want het programma wordt telkens doorlopen

die loop is juist wat voor mij zo verwarrend is :lol: tis in ieder geval erg wennen.
ik had dat al geprobeerd maar je begint met 2 led`s die uit zijn, dan zet de eerste IF statement èèn led aan.
dus als je dan niet opnieuw de ldr "read" zal hij nog steeds denken dat ze uit zijn en dus direct ook de tweede en derde IF statements uitvoeren.
daarom voor iedere "IF" een meting.

ps
ik zie dat mijn laatste code ook kleurtjes heeft enzo, wellicht heeft een mod het aangepast?
wil graag weten hoe ik dit de volgende gelijk zo krijg?

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

Re: train control project

Berichtdoor Koepel » 13 Sep 2016, 00:42

Bij het knoppen boven het tekst veld staat "Code" voor [ code ] en "Select a Syntax" voor bijvoorbeeld [ code2=cpp ].

De [ code ] geeft een nette code zonder kleuren.
De [ code2=cpp ] geeft de kleuren, maar als een regel heel lang is, dan gaat de rechterkantlijn mis.

Een sample nemen, en die weggooien, vervolgens soms ook nog wachten (10ms of 20ms) en vervolgens de echte sample nemen, dat wordt inderdaad soms gebruikt. Bijvoorbeeld als de analogReference() wordt gebruikt, of misschien bij een hoogohmig circuit aan de analoge ingangen.
Dat geeft dan net een iets betere waarde.
Bij het meten van de eigen VCC voltage wordt de interne mux helemaal anders gezet. Met name bij de ATmega2560 had ik erg veel moeite om het goed te meten, en daarna alles weer goed terug zetten, zodat de analogRead() weer een goede waarde gaf. Dus daar heb ik veel delays en extra analogRead() gebruikt.

Wist je dat analogReference() niets doet ? De interne mux voor de analoge referentie wordt pas gewijzigd bij de eerstvolgende aanroep van analogRead(). Daarom is de eerste analogRead() na een analogReference() wel degelijk nuttig (het zet de interne mux goed).

Jouw circuit heeft de 10k weerstand, en verder niets bijzonders, dus volgens mij maakt het minder dan 1 bit uit, en zou het niet nodig zijn.

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

Re: train control project

Berichtdoor shooter » 13 Sep 2016, 10:06

tweemaal samplen, ja is geen onzin, maar is voor dit soort dingen niet nodig.

de loop gaat zo snel dat de ldr nog niet aan is als je een ledje aan zet hoor. dus even wachten,
jij hoeft dat niet want er zijn maar 2 stadia, of links of rechts en het duurt erg lang voordat de trein aan de andere kant is.
paul deelen
shooter@home.nl

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

Re: train control project

Berichtdoor Kitemasters » 15 Sep 2016, 11:25

nieuwe versie
cpp code
/*
Train control
Drive the train between two gates made of a LED and LDR.
*/

byte ledL = 4; //declare variable and value for led L pin
byte sensL = A4; //declare variable and value for ldr L pin
byte ledR = 5; //declare variable and value for led R pin
byte sensR = A5; //declare variable and value for ldr R pin
byte brake = 9; //declare variable and value for train brake pin
byte trainD = 12; //declare variable and value for train direction pin (High/Low)
byte trainS = 3; //declare variable and value for train speed pin (0 - 255)
byte cSens = A0; //declare variable and value for train Current Sensing pin (not used yet)

int Speed = 0; //declare variable and set value for Speed (0 to 255 for speed)
int maxSpeed = 200; //declare variable and set value for maximum speed (255 is ful speed)
int sensLreading = 0; //declare variable for left ldr reading value
int sensRreading = 0; //declare variable for right ldr reading value
int cSensreading = 0; //declare variable for train Current Sensing value (not used yet)
int accspeed = 40; //declare variable for acceleration speed
int decspeed = 2; //declare variable for deceleration speed
String state = String("Stands"); //declare variable and set value for state (keeps track of driving direction)

void setup() {
Serial.begin(9600); //open serial port for communication
pinMode(ledL, OUTPUT); //set pin 32 to output for left led
pinMode(ledR, OUTPUT); //set pin 34 to output for right led
pinMode(trainD, OUTPUT); //set pin 12 to output for train (direction)
pinMode(brake, OUTPUT); //set pin 9 to output for train (brake)
pinMode(trainS, OUTPUT); //set pin 3 to output for train (speed)
digitalWrite(brake, LOW); //Disengage the Brake
}

void loop() {

readSens();
printReport();

if (sensLreading > 200 && sensRreading > 200) { //if both ldr are high value, the program just started and nothing happend yet
digitalWrite(ledL, HIGH); //Turn left LED on
digitalWrite(trainD, LOW); //Establishes left direction of train
accelerate(); //accelerate the train
state = String("goLeft"); //set state (keeps track of driving direction)
}

readSens();
printReport();

if (sensLreading > 200 && state == "goLeft") { //if left ldr is high value and state is "goleft", the train reached left gate
digitalWrite(ledL, LOW); //Turn left LED off
digitalWrite(ledR, HIGH); //Turn right LED on
decelerate(); //decelerate the train
digitalWrite(trainD, HIGH); //reverse direction of the train
accelerate(); //accelerate the train
state = String("goRight"); //set state (keeps track of driving direction)
}

readSens();
printReport();

if (sensRreading > 200 && state == "goRight") { //if right ldr is high value and state is "goright", the train reached right gate
digitalWrite(ledR, LOW); //Turn right LED off
digitalWrite(ledL, HIGH); //Turn left LED on
decelerate(); //decelerate the train
digitalWrite(trainD, LOW); //reverse direction of the train
accelerate(); //accelerate the train
state = String("goLeft"); //set state (keeps track of driving direction)
}
}

//******** functions ********

void readSens() {

cSensreading = analogRead(cSens); //read current sensing of motor
cSensreading = analogRead(cSens); //read current sensing of motor
sensLreading = analogRead(sensL); //read left ldr (a high value means the light is off or blockt)
sensLreading = analogRead(sensL); //read left ldr (a high value means the light is off or blockt)
sensRreading = analogRead(sensR); //read right ldr (a high value means the light is off or blockt)
sensRreading = analogRead(sensR); //read right ldr (a high value means the light is off or blockt)
}

void printReport() {

Serial.println("Start Report;"); //print "Start Report;"
Serial.print("sensL = "); //print "sensL = "
Serial.println(sensLreading); //print sensL value (for debugging purposive)
Serial.print("sensR = "); //print "sensR = "
Serial.println(sensRreading); //print sensR value (for debugging purposive)
Serial.print("Speed = "); //print "speed = "
Serial.println(Speed); //print speed (for debugging purposive)
Serial.print("Current Sensing value = "); //print "Current Sensing value = "
Serial.println(cSensreading); //print Current Sensing value (for debugging purposive)
}

void accelerate() {

while (Speed < maxSpeed) { //loop to accelerate to maximum speed
readSens(); //read sensors
printReport(); //print report
analogWrite(trainS, Speed); //Sets the speed of the train (255 is ful speed)
Speed = Speed + 1; //add 1 to speed
delay(accspeed); //slow down the proces
}
}

void decelerate() {

while (Speed > 0) { //loop to decelerate to 0 speed
readSens(); //read sensors
printReport(); //print report
analogWrite(trainS, Speed); //Sets the speed of the train (255 is ful speed)
Speed = Speed - 20; //subtract 20 of speed
delay(decspeed); //slow down the proces
}
}


zoals te zien geprobeerd om wat functies te maken.

ik had het dubbel samplen weg gehaald maar toen wilde hij om de drie a vier keer aan de rechterkant de led niet uitzetten. wel werd de motor direct omgeschakeld.
dubbel samplen terug gezet maar nu rijdt hij 8 van de 10 keer het poortje straal voorbij de baan af :(

verder kwam ik er achter dat als de maxspeed hoger is. ook de remweg veel langer is. Op zich logisch maar als ik het begin met nu vergelijk lijkt het wel
of hij ook later begint met remmen na het passeren van het poortje.


Code: Alles selecteren
Speed = Speed - 20;                            //subtract 20 of speed


ook hier kom ik in problemen, speed mag nooit op negatief komen. maxspeed is nu 200 dus in 10 stappen van -20 op 0
maar maxspeed moet variabel zijn dus als hij 210 staat kom je uit op -10.

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

Re: train control project

Berichtdoor nicoverduin » 15 Sep 2016, 11:34

Doe je toch gewoon een testje er gelijk achter
cpp code
if (Speed < 0) {
Speed = 0;
}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: train control project

Berichtdoor Kitemasters » 15 Sep 2016, 15:33

Veels te simpel :lol: :lol:

werkt wel natuurlijk.

als ik "int maxspeed" door 10 deel bv (maxspeed = 146 / 10 = 14,6) gaat hij dit dan afronden
op een heel getal?.

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

Re: train control project

Berichtdoor nicoverduin » 15 Sep 2016, 19:12

Heb je hat al geprobeerd? En zo nee waarom niet?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: train control project

Berichtdoor Kitemasters » 17 Sep 2016, 14:39

nee

wilde m,n bordje/prog niet crashen

en dat is het mooie van kennis, je kunt het delen.

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

Re: train control project

Berichtdoor nicoverduin » 17 Sep 2016, 15:03

Bordje crashed niet en een beetje initiatief om zelf iets te proberen met een heeeeeeeeeeeeeeel simpel sketchje wordt ook nog eens gewaardeerd.....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

VorigeVolgende

Terug naar Gezamenlijke projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 8 gasten