train control project
- Kitemasters
- Berichten: 31
- Geregistreerd: 08 Sep 2016, 21:50
train control project
hallo,
even voorstellen ik ben nieuw hier. en ook redelijk onervaren met arduino hoewel ik de laatste 3 a 4 weken al veel heb geleerd,
heb ik voor mijn project toch echt alle hulp nodig. gelijk van start dus maar.....
zoals veel mensen is mijn wens een leuke modelspoorbaan. dus een mooi baanplan bedacht, begin setje gekocht, tafel geknutselt enz.
probleem !!! het duurt natuurlijk nog tijden eer het spoor helemaal klaar is en ondertussen wil je toch op die twee meter die je hebt
heen en weer rijden. dat kan natuurlijk gewoon met je trafo maar als je even niet oplet rij je zo van de baan af en de vloer is toch een meter lager
en daar kunnen treintjes gek genoeg niet tegen. plan is dus een heen en weer automaatje, zoiets als dit dus;
https://www.youtube.com/watch?v=nY3DaJmARTQ
alle respect voor de maker maar als je iedere keer tegen een hekje knalt en de motor direct om-poolt zal dat de levensduur ook
niet echt bevorderen. en met een arduino mega + motorshield in de la moet er toch meer van te maken zijn dacht ik.
ik bedacht twee poortjes met een LED en een LDR. zodat als de trein erdoor rijdt het licht wordt geblokkeerd.
vervolgens dit aansluiten op arduino
en dan zou het mooi zijn als ik dit kon aansturen via een user interface dat er ongeveer zo uit kan zien.
op het engelstalig arduino forum had ik ook al een post gemaakt https://forum.arduino.cc/index.php?topic=420457.0 en met wat hulp
kwam ik tot de volgende code
Op zich werkt dit goed (al vergeet hij regelmatig de rechter led uit te zetten).
https://www.youtube.com/watch?v=_LtLtOMUkRY (het hupje heb ik er ook nog uit gekregen)
maar volgens de kenners rammelt deze code aan alle kanten. de while loops zouden de mainloop stoppen.
de delay`s doen hetzelfde en zo zou ik eigen functies moeten maken om dubbele code te vermijden.
ik heb de (blink without delay) methode met moeite door gelezen (snap het nog niet)
en ben wat gaan ombouwen maar loop er compleet mee vast.
alleen al omdat ik via een if statement bij de "accelerate" functie kom, gaat hij dit de tweede keer al overslaan omdat de if statement niet meer geldt.
kortom alle hulp is welkom.
voor de volledigheid nog de laatste code
even voorstellen ik ben nieuw hier. en ook redelijk onervaren met arduino hoewel ik de laatste 3 a 4 weken al veel heb geleerd,
heb ik voor mijn project toch echt alle hulp nodig. gelijk van start dus maar.....
zoals veel mensen is mijn wens een leuke modelspoorbaan. dus een mooi baanplan bedacht, begin setje gekocht, tafel geknutselt enz.
probleem !!! het duurt natuurlijk nog tijden eer het spoor helemaal klaar is en ondertussen wil je toch op die twee meter die je hebt
heen en weer rijden. dat kan natuurlijk gewoon met je trafo maar als je even niet oplet rij je zo van de baan af en de vloer is toch een meter lager
en daar kunnen treintjes gek genoeg niet tegen. plan is dus een heen en weer automaatje, zoiets als dit dus;
https://www.youtube.com/watch?v=nY3DaJmARTQ
alle respect voor de maker maar als je iedere keer tegen een hekje knalt en de motor direct om-poolt zal dat de levensduur ook
niet echt bevorderen. en met een arduino mega + motorshield in de la moet er toch meer van te maken zijn dacht ik.
ik bedacht twee poortjes met een LED en een LDR. zodat als de trein erdoor rijdt het licht wordt geblokkeerd.
vervolgens dit aansluiten op arduino
en dan zou het mooi zijn als ik dit kon aansturen via een user interface dat er ongeveer zo uit kan zien.
op het engelstalig arduino forum had ik ook al een post gemaakt https://forum.arduino.cc/index.php?topic=420457.0 en met wat hulp
kwam ik tot de volgende code
- Code: Alles selecteren
int ledL = 32;
int ledR = 34;
int sensL = A10;
int sensR = A11;
int train = 12;
int brake = 9;
int Speed = 0;
int maxSpeed = 150;
int sensLreading = analogRead;
int sensRreading = analogRead;
String state = String("Stands");
void setup() {
Serial.begin(9600);
pinMode(ledL, OUTPUT);
pinMode(ledR, OUTPUT);
pinMode(train, OUTPUT);
pinMode(brake, OUTPUT);
}
void loop() {
sensLreading = analogRead(sensL);
sensRreading = analogRead(sensL);
delay(20);
sensLreading = analogRead(sensR);
sensRreading = analogRead(sensR);
if (sensLreading > 200 && sensRreading > 200) {
digitalWrite(ledL, HIGH); //Turn left LED on
digitalWrite(train, LOW); //Establishes left direction of train
digitalWrite(brake, LOW); //Disengage the Brake
while (Speed < maxSpeed){
Serial.println(Speed); // print
analogWrite(3, Speed); //Sets the speed of the train (255 is ful speed)
Speed = Speed + 1;
delay(40);
}
state = String("goLeft"); //Sets "state"
}
sensLreading = analogRead(sensR);
sensRreading = analogRead(sensR);
delay(20);
sensLreading = analogRead(sensL);
sensRreading = analogRead(sensL);
if (sensLreading > 200 && state == "goLeft") {
digitalWrite(ledL, LOW); //Turn left LED off
digitalWrite(ledR, HIGH); //Turn right LED on
while (Speed > 0){
Serial.println(Speed); // print
analogWrite(3, Speed); //Sets the speed of the train to 0 (255 is ful speed)
Speed = Speed - 2;
delay(20);
}
while (Speed < maxSpeed){
Serial.println(Speed); // print
digitalWrite(train, HIGH); //Establishes backward direction of train
digitalWrite(9, LOW); //Disengage the Brake
analogWrite(3, Speed); //Sets the speed of the train (255 is ful speed)
Speed = Speed + 1;
delay(60);
}
state = String("goRight"); //Sets "state"
}
sensLreading = analogRead(sensL);
sensRreading = analogRead(sensR);
delay(20);
sensLreading = analogRead(sensL);
sensRreading = analogRead(sensR);
if (sensRreading > 200 && state == "goRight") {
digitalWrite(ledR, LOW); //Turn right LED off
digitalWrite(ledL, HIGH); //Turn left LED on
while (Speed > 0){
Serial.println(Speed); // print
analogWrite(3, Speed); //Sets the speed of the train to 0 (255 is ful speed)
Speed = Speed - 2;
delay(20);
}
while (Speed < maxSpeed){
Serial.println(Speed); // print
digitalWrite(train, LOW); //Establishes forward direction of train
digitalWrite(9, LOW); //Disengage the Brake
analogWrite(3, Speed); //Sets the speed of the train (255 is ful speed)
Speed = Speed + 1;
delay(60);
}
state = String("goLeft"); //Sets "state"
}
}
Op zich werkt dit goed (al vergeet hij regelmatig de rechter led uit te zetten).
https://www.youtube.com/watch?v=_LtLtOMUkRY (het hupje heb ik er ook nog uit gekregen)
maar volgens de kenners rammelt deze code aan alle kanten. de while loops zouden de mainloop stoppen.
de delay`s doen hetzelfde en zo zou ik eigen functies moeten maken om dubbele code te vermijden.
ik heb de (blink without delay) methode met moeite door gelezen (snap het nog niet)
en ben wat gaan ombouwen maar loop er compleet mee vast.
alleen al omdat ik via een if statement bij de "accelerate" functie kom, gaat hij dit de tweede keer al overslaan omdat de if statement niet meer geldt.
kortom alle hulp is welkom.
voor de volledigheid nog de laatste code
- Code: Alles selecteren
int accel = 150; // Speed to accelerate, lower numbers are faster
int decel = 60; //Speed to decelerate, lower numbers are faster
const int ledA = 32; //declare constand for led A pin
const int ledB = 34; //declare constand for led B pin
const int ldrA = A10; //declare constand for LDR A pin
const int ldrB = A11; //declare constand for LDR B pin
const int train = 12; //declare constand for train motor direction pin
const int brake = 9; //declare constand for train motor brake pin
const int cSens = A0; //declare constand for train Current Sensing pin
static unsigned long lastAccelTime = 0;
static unsigned long lastDecelTime = 0;
int Speed = 0; //declare variable and set value for speed
int maxSpeed = 150; //declare variable and set value for maximum speed
int ldrAreading = analogRead; //declare variable for LDR A value
int ldrBreading = analogRead; //declare variable for LDR B value
int cSensreading = analogRead; //declare variable for train Current Sensing value
String state = String("Stands"); //declare variable and set value for state
void setup() {
Serial.begin(9600);
pinMode(ledA, OUTPUT); //set pinmode ledA
pinMode(ledB, OUTPUT); //set pinmode ledB
pinMode(train, OUTPUT); //set pinmode train (direction)
pinMode(brake, OUTPUT); //set pinmode brake
}
void loop() {
Serial.println("start loop");
digitalWrite(brake, LOW); //Disengage the Brake
readLDR(); //read sensors
Serial.print("ldrA = ");
Serial.println(ldrAreading);
Serial.print("ldrB = ");
Serial.println(ldrBreading);
Serial.print("speed = ");
Serial.println(Speed);
if (ldrAreading > 200 && ldrBreading > 200) {
Serial.println("i am in first if statement");
digitalWrite(ledA, HIGH); //Turn left LED on
digitalWrite(train, LOW); //Establishes left direction of train
increaseSpeed();
state = String("goLeft"); //Sets "state"
}
// if (ldrAreading > 200 && state == "goLeft") {
// digitalWrite(ledA, LOW); //Turn left LED off
// digitalWrite(ledB, HIGH); //Turn right LED on
// Serial.println("second if statement");
// while (Speed > 0){
// Serial.println(Speed); // print
// analogWrite(3, Speed); //Sets the speed of the train to 0 (255 is ful speed)
// Speed = Speed - 2;
// delay(20);
// }
// while (Speed < maxSpeed){
// Serial.println(Speed); // print
// digitalWrite(train, HIGH); //Establishes backward direction of train
// digitalWrite(9, LOW); //Disengage the Brake
// analogWrite(3, Speed); //Sets the speed of the train (255 is ful speed)
// Speed = Speed + 1;
// delay(60);
// }
// state = String("goRight"); //Sets "state"
// }
// if (ldrBreading > 200 && state == "goRight") {
// digitalWrite(ledB, LOW); //Turn right LED off
// digitalWrite(ledA, HIGH); //Turn left LED on
// Serial.println("third if statement");
// while (Speed > 0){
// Serial.println(Speed); // print
// analogWrite(3, Speed); //Sets the speed of the train to 0 (255 is ful speed)
// Speed = Speed - 2;
// delay(20);
// }
// while (Speed < maxSpeed){
// Serial.println(Speed); // print
// digitalWrite(train, LOW); //Establishes forward direction of train
// digitalWrite(9, LOW); //Disengage the Brake
// analogWrite(3, Speed); //Sets the speed of the train (255 is ful speed)
// Speed = Speed + 1;
// delay(60);
// }
// state = String("goLeft"); //Sets "state"
// }
}
void readLDR(){
ldrAreading = analogRead(ldrA);
ldrAreading = analogRead(ldrA);
ldrBreading = analogRead(ldrB);
ldrBreading = analogRead(ldrB);
}
void increaseSpeed() {
unsigned long currentTime = millis();
Serial.println("im in void increase");
Serial.println(currentTime);
Serial.println(lastAccelTime);
if (currentTime - lastAccelTime > accel) {
lastAccelTime = currentTime;
if (Speed < maxSpeed) {
Speed = Speed + 1;
Serial.println("im in speedup loop");
analogWrite(3, Speed);
}
}
}
void decreaseSpeed() {
// if (currentTime - lastDecelTime > decel) {
// lastDecelTime = currentTime;
// if (Speed > 0) {
// Speed = Speed - 2;
// analogWrite(3, Speed);
// }
// }
}
Advertisement
Re: train control project
Ik vraag me af of het de goede methode is. Dat is toch erg gevoelig voor omgevingslicht ?
En ik heb geleerd dat een LDR langzaam is, en niet geschikt voor dit soort dingen. De reactietijd van een LDR is 10 to 100ms (ik gok maar wat, maar ik zit er niet ver naast).
Een afstandsbediening voor een TV werkt met IR licht dat gemoduleerd is. Met name die modulatie van zo'n 38 kHz zorgt er voor dat het werkt, zowel met veel als met weinig omgevingslicht.
Kun je misschien een IR afstandssensor (https://www.sparkfun.com/products/12728) gebruiken ? of met ultrasoon geluid ?
Of toch iets met een microswitch met hendel (engels: 'lever') ?
Een stootblok kun je zachter maken met wat foam. Ik gebruik graag EVA foam, dat snijdt gemakkelijk en is toch redelijk sterk. EVA foam is dat schuim waar speeltegels van gemaakt worden die als puzzelstukken in elkaar passen.
Ik beantwoord graag vragen over millis() en I2C, als ik maar begrijp wat je bedoeling is
En ik heb geleerd dat een LDR langzaam is, en niet geschikt voor dit soort dingen. De reactietijd van een LDR is 10 to 100ms (ik gok maar wat, maar ik zit er niet ver naast).
Een afstandsbediening voor een TV werkt met IR licht dat gemoduleerd is. Met name die modulatie van zo'n 38 kHz zorgt er voor dat het werkt, zowel met veel als met weinig omgevingslicht.
Kun je misschien een IR afstandssensor (https://www.sparkfun.com/products/12728) gebruiken ? of met ultrasoon geluid ?
Of toch iets met een microswitch met hendel (engels: 'lever') ?
Een stootblok kun je zachter maken met wat foam. Ik gebruik graag EVA foam, dat snijdt gemakkelijk en is toch redelijk sterk. EVA foam is dat schuim waar speeltegels van gemaakt worden die als puzzelstukken in elkaar passen.
Ik beantwoord graag vragen over millis() en I2C, als ik maar begrijp wat je bedoeling is
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: train control project
Er mankeert inderdaad nogal veel aan de code. Bijv in de functie waar je versnelt creer je ook de timer. Elke keer dat je die functie aanroept ben je die timer kwijt als deze klaar is. Die trein gaat nooit versnellen.
En als je niet snapt hoe blink without delay werkt is het een beetje zinloos om toch maar door te klooien en hopen dat het dan gaat werken.
Als je de tutorial niet snapt, waarom vraag je dat niet hier.
En als je niet snapt hoe blink without delay werkt is het een beetje zinloos om toch maar door te klooien en hopen dat het dan gaat werken.
Als je de tutorial niet snapt, waarom vraag je dat niet hier.
- Kitemasters
- Berichten: 31
- Geregistreerd: 08 Sep 2016, 21:50
Re: train control project
er zijn vast betere sensoren om dit te doen maar die had ik niet. en ik heb een hekel aan de winkel
nou dat niet maar ik heb ze getest en getest. en altijd is de waarde verandering groot genoeg om mee te werken.
ook zijn ze snel genoeg het treintje rijdt tenslotte ook niet met 180 voorbij. https://www.youtube.com/watch?v=7AsdMgpgfzs
De eerste code doet eigenlijk precies wat ik wil. maar zoals ik zei kreeg ik daar reactie op dat er teveel dubbele code in staat,
en dat de while loops en de delay`s de flow stoppen. en dat als iets meerdere malen terug komt je er beter een functie voor maakt.
hij heeft daar wel een punt als de while loop werkt kan ik op dat moment verder niks.
nou "maar door klooien" dit was eigenlijk poging Nr1 om een functie op te zetten voor accelerate en decelerate omdat die acties steeds terug komen en
ik inderdaad van de delay`s af moet. en "maar hopen dat het werkt" in de code staan een aantal serial.print regels zo wilde ik eens zien wat de code
nou precies doet. en zo had ik dus ook al ontdekt dat de counter niet kan werken omdat hij de functie eenmaal passeert en er verder niet meer terug komt.
ondertussen nog maar een "blink without delay" filmpje gekeken, en hier op het forum hulp gevraagd, plaatjes maken, filmpjes posten.
dat is alles bij elkaar toch meer dan "hopen" mag ik hopen.
nou dat niet maar ik heb ze getest en getest. en altijd is de waarde verandering groot genoeg om mee te werken.
ook zijn ze snel genoeg het treintje rijdt tenslotte ook niet met 180 voorbij. https://www.youtube.com/watch?v=7AsdMgpgfzs
De eerste code doet eigenlijk precies wat ik wil. maar zoals ik zei kreeg ik daar reactie op dat er teveel dubbele code in staat,
en dat de while loops en de delay`s de flow stoppen. en dat als iets meerdere malen terug komt je er beter een functie voor maakt.
hij heeft daar wel een punt als de while loop werkt kan ik op dat moment verder niks.
En als je niet snapt hoe blink without delay werkt is het een beetje zinloos om toch maar door te klooien en hopen dat het dan gaat werken.
nou "maar door klooien" dit was eigenlijk poging Nr1 om een functie op te zetten voor accelerate en decelerate omdat die acties steeds terug komen en
ik inderdaad van de delay`s af moet. en "maar hopen dat het werkt" in de code staan een aantal serial.print regels zo wilde ik eens zien wat de code
nou precies doet. en zo had ik dus ook al ontdekt dat de counter niet kan werken omdat hij de functie eenmaal passeert en er verder niet meer terug komt.
ondertussen nog maar een "blink without delay" filmpje gekeken, en hier op het forum hulp gevraagd, plaatjes maken, filmpjes posten.
dat is alles bij elkaar toch meer dan "hopen" mag ik hopen.
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: train control project
Een verhaal dat ik vanochtend op het internationale forum heb geplaatst gaat hier feitelijk net zo hard op. Dus ook hier:
Volgens mij is het tijd om eens een goed boek te lezen. Technieken werden al in de 70-er jaren toegepast en juist met microcontrollers weer hardstikke toepasbaar. En vooral GEEN tool gebruiken om dit mooi te maken. Gewoon een pak papier, potlood en een gummetje. Beste manier om het te leren.
Ff googelen op "structured programming with c++ pdf"
Verder.. Eh tja ik ben iemand die graag de zaak ff op scherp zet. Dan weet ik gelijk of ik er nog energie in moet steken....
Volgens mij is het tijd om eens een goed boek te lezen. Technieken werden al in de 70-er jaren toegepast en juist met microcontrollers weer hardstikke toepasbaar. En vooral GEEN tool gebruiken om dit mooi te maken. Gewoon een pak papier, potlood en een gummetje. Beste manier om het te leren.
Ff googelen op "structured programming with c++ pdf"
Verder.. Eh tja ik ben iemand die graag de zaak ff op scherp zet. Dan weet ik gelijk of ik er nog energie in moet steken....
Re: train control project
Een boek ? Dat is toch een bundeltje papieren met allemaal letters er in ? Ha ha ha. Sorry Nico.
Mijn voorkeur is 'learn along the way'. Al gaandeweg leer je het.
Een pdf-bestand van een boek gaat me na een paar seconden al vervelen. Tja, niet iedereen is hetzelfde
@Kitemasters, Dankjewel voor de videos, dat maakt het heel duidelijk
Ik ben het wel met nicoverduin eens, en ook ik heb helaas veel moeite om je code te lezen. Om duidelijke code te maken, zou ik het opnieuw willen schrijven.
Wat ik bedoel is dit:
Je code doet verschillende dingen. Ik zou de code willen indelen naar functionaliteit, op dit moment doet je code zo'n 4 verschillende dingen door elkaar heen.
De aansturing van de trein en de data input (van sensoren of van detectie poortjes) zou ik willen scheiden.
Dus dan krijg een deel van de code die informatie verzameld, en een tweede deel die keuzes maakt en de trein aanstuurt.
En dan het regelen van de snelheid ook apart van de rest.
De detectiepoortjes zou ik altijd aan zetten, en eventuele lichteffecten zou ik apart doen.
En meer commentaar toevoegen, want helaas begrijp ik niet wat er gebeurt in je code
Zeg maar wat je wilt, wij proberen wel te helpen
Mijn voorkeur is 'learn along the way'. Al gaandeweg leer je het.
Een pdf-bestand van een boek gaat me na een paar seconden al vervelen. Tja, niet iedereen is hetzelfde
@Kitemasters, Dankjewel voor de videos, dat maakt het heel duidelijk
Ik ben het wel met nicoverduin eens, en ook ik heb helaas veel moeite om je code te lezen. Om duidelijke code te maken, zou ik het opnieuw willen schrijven.
Wat ik bedoel is dit:
Je code doet verschillende dingen. Ik zou de code willen indelen naar functionaliteit, op dit moment doet je code zo'n 4 verschillende dingen door elkaar heen.
De aansturing van de trein en de data input (van sensoren of van detectie poortjes) zou ik willen scheiden.
Dus dan krijg een deel van de code die informatie verzameld, en een tweede deel die keuzes maakt en de trein aanstuurt.
En dan het regelen van de snelheid ook apart van de rest.
De detectiepoortjes zou ik altijd aan zetten, en eventuele lichteffecten zou ik apart doen.
En meer commentaar toevoegen, want helaas begrijp ik niet wat er gebeurt in je code
Zeg maar wat je wilt, wij proberen wel te helpen
Re: train control project
uiteraard eens met bovenstaande, de code rammelt heel erg.
veel dubbel en ik snap niet wat L en R met elkaar te maken hebben.
allereerst de detectie:
doe eerst gewoon recht dus als rechterpoortje dan richting naar links en niet omdraaien want de trein komt er nog een keer door.
zelfde voor linkerpoortje.
snelheid langzaam omhoog met een timer!
laatste rails beveiligen met een diode, dan stopt de trein altijd, en gaat door in de goede richting.
volgende stap is wellicht om de poortjes te laten pulsen om het omgevingslichtinvloed te verminderen, een TL is wat dat betreft een grote soorder.
Over de code, ik zou eigenlijk helemaal opnieuw beginnen en dan een paar functies aanmaken voor detectie en snelheid, en die telkens vanuit de loop aanroepen.
wel leuk dat je nu al voor kerstmis bezig bent.
veel dubbel en ik snap niet wat L en R met elkaar te maken hebben.
allereerst de detectie:
doe eerst gewoon recht dus als rechterpoortje dan richting naar links en niet omdraaien want de trein komt er nog een keer door.
zelfde voor linkerpoortje.
snelheid langzaam omhoog met een timer!
laatste rails beveiligen met een diode, dan stopt de trein altijd, en gaat door in de goede richting.
volgende stap is wellicht om de poortjes te laten pulsen om het omgevingslichtinvloed te verminderen, een TL is wat dat betreft een grote soorder.
Over de code, ik zou eigenlijk helemaal opnieuw beginnen en dan een paar functies aanmaken voor detectie en snelheid, en die telkens vanuit de loop aanroepen.
wel leuk dat je nu al voor kerstmis bezig bent.
paul deelen
shooter@home.nl
shooter@home.nl
- Kitemasters
- Berichten: 31
- Geregistreerd: 08 Sep 2016, 21:50
Re: train control project
sorry duurde even maar daar ben ik dan weer
het laatste boek dat ik las was "excel vba voor professionals" ik heb niet het hele boek uitgelezen maar zo`n 70%
omdat ik toen wel de kennis had om het programma te schrijven dat ik nodig had.
maar idd boeken zijn wel uit de tijd en saai :-0 YouTube filmpjes met knutsel voorbeelden en af en toe net het juiste
duwtje in een forum leert veel leuker en sneller is mijn idee.
het boek dat je aanraad is een cursus waar je ongeveer 12 maanden over zou moeten doen.
en let wel "at university level". dan gaan we de kerst al niet meer halen dus.
en dat laatste is misschien wel niet voor iedereen weggelegd.
volgens mij is het ook niet nodig drie sterren kok te zijn om een ei te bakken.
desalniettemin interessante kost, en zal er op zijn tijd wel delen van lezen.
goed mijn plan was om de code`s aan te vullen met commentaar en dan weer te uploaden. maar toen ik daarmee bezig was
zag ik al een aantal dingen die simpeler konden (dacht ik). ik besloot toen maar de code`s samen te voegen en de gedeeltes die wel werken
over te houden. toen ik dit gedaan had sloop er weer een bug in, dus weer wat stukken code terug gezet en wat prutsen.
walla...nieuwe code met comments.
cpp code
L en R hebben niets met elkaar te maken maar dat maakt het voor mij makkelijker om te zien wat het linker poortje is
en wat het rechter poortje. feitelijk bestaat er al geen links of rechts omdat het spoor rond loopt, maar vooruit achteruit maakt het
nog verwarrender draai het treintje om en het klopt niet meer. door L en R zie ik in ieder geval welke led bij welke ldr hoort.
het idee achter de poortjes is dat je een poortje zo een meter verder kan zetten en weer kan rijden, zonder prutsen aan de rails.
ik liet de led`s wisselen omdat de trein door het poortje heen rijdt en dus ook weer terug komt. die tweede pas zou een valse reading
kunnen geven. ik weet niet of dat helemaal waar is maar dat was in ieder geval mijn gedachte gang toen ik de code schreef.
het laatste boek dat ik las was "excel vba voor professionals" ik heb niet het hele boek uitgelezen maar zo`n 70%
omdat ik toen wel de kennis had om het programma te schrijven dat ik nodig had.
maar idd boeken zijn wel uit de tijd en saai :-0 YouTube filmpjes met knutsel voorbeelden en af en toe net het juiste
duwtje in een forum leert veel leuker en sneller is mijn idee.
het boek dat je aanraad is een cursus waar je ongeveer 12 maanden over zou moeten doen.
en let wel "at university level". dan gaan we de kerst al niet meer halen dus.
en dat laatste is misschien wel niet voor iedereen weggelegd.
volgens mij is het ook niet nodig drie sterren kok te zijn om een ei te bakken.
desalniettemin interessante kost, en zal er op zijn tijd wel delen van lezen.
goed mijn plan was om de code`s aan te vullen met commentaar en dan weer te uploaden. maar toen ik daarmee bezig was
zag ik al een aantal dingen die simpeler konden (dacht ik). ik besloot toen maar de code`s samen te voegen en de gedeeltes die wel werken
over te houden. toen ik dit gedaan had sloop er weer een bug in, dus weer wat stukken code terug gezet en wat prutsen.
walla...nieuwe code met comments.
cpp code
/*
Train control
Drive the train between two gates made of a LED and LDR.
*/
const int ledL = 4; //declare constand and set value for led L pin
const int sensL = A4; //declare constand and set value for ldr L pin
const int ledR = 5; //declare constand and set value for led R pin
const int sensR = A5; //declare constand and set value for ldr R pin
const int train = 12; //declare constand and set value for train pin (High/Low for direction)
const int brake = 9; //declare constand and set value for brake pin
const int cSens = A0; //declare constand 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 = 150; //declare variable and set value for maximum speed (255 is ful speed)
int sensLreading = analogRead; //declare variable for left ldr reading value
int sensRreading = analogRead; //declare variable for right ldr reading value
int cSensreading = analogRead; //declare variable for train Current Sensing value (not used yet)
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(train, OUTPUT); //set pin 12 to output for train (direction)
pinMode(brake, OUTPUT); //set pin 9 to output for train (brake)
//set pin 3 to output for train (speed) , in code i just use the pin number
}
void loop() {
readLDR();
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(train, LOW); //Establishes left direction of train
digitalWrite(brake, LOW); //Disengage the Brake
while (Speed < maxSpeed){ //loop to accelerate to maximum speed
Serial.println(Speed); //print speed (for debugging purposive)
analogWrite(3, Speed); //Sets the speed of the train (255 is ful speed)
Speed = Speed + 1; //add 1 to speed
delay(40); //slow down the proces
}
state = String("goLeft"); //set state (keeps track of driving direction)
}
readLDR();
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
while (Speed > 0){ //loop to decelerate to 0 speed
Serial.println(Speed); //print speed (for debugging purposive)
analogWrite(3, Speed); //Sets the speed of the train (255 is ful speed)
Speed = Speed - 2; //subtract 2 of speed
delay(20); //slow down the proces
}
digitalWrite(train, HIGH); //Establishes backward direction of train
while (Speed < maxSpeed){ //loop to accelerate to maximum speed
Serial.println(Speed); //print speed (for debugging purposive)
analogWrite(3, Speed); //Sets the speed of the train (255 is ful speed)
Speed = Speed + 1; //add 1 to speed
delay(60); //slow down the proces
}
state = String("goRight"); //set state (keeps track of driving direction)
}
readLDR();
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
while (Speed > 0){ //loop to decelerate to 0 speed
Serial.println(Speed); //print speed (for debugging purposive)
analogWrite(3, Speed); //Sets the speed of the train (255 is ful speed)
Speed = Speed - 2; //subtract 2 of speed
delay(20); //slow down the proces
}
digitalWrite(train, LOW); //Establishes forward direction of train
while (Speed < maxSpeed){ //loop to accelerate to maximum speed
Serial.println(Speed); //print speed (for debugging purposive)
analogWrite(3, Speed); //Sets the speed of the train (255 is ful speed)
Speed = Speed + 1; //add 1 to speed
delay(60); //slow down the proces
}
state = String("goLeft"); //Sets "state" //set state (keeps track of driving direction)
}
}
void readLDR(){
sensLreading = analogRead(sensL); //read left ldr (a high value means the light is off or blockt)
sensLreading = analogRead(sensL); //repeat for precision
sensRreading = analogRead(sensR); //read right ldr (a high value means the light is off or blockt)
sensRreading = analogRead(sensR); //repeat for precision
Serial.print("sensL = ");
Serial.println(sensLreading); //print sensL value (for debugging purposive)
Serial.print("sensR = ");
Serial.println(sensRreading); //print sensR value (for debugging purposive)
Serial.print("speed = ");
Serial.println(Speed); //print speed (for debugging purposive)
}
L en R hebben niets met elkaar te maken maar dat maakt het voor mij makkelijker om te zien wat het linker poortje is
en wat het rechter poortje. feitelijk bestaat er al geen links of rechts omdat het spoor rond loopt, maar vooruit achteruit maakt het
nog verwarrender draai het treintje om en het klopt niet meer. door L en R zie ik in ieder geval welke led bij welke ldr hoort.
het idee achter de poortjes is dat je een poortje zo een meter verder kan zetten en weer kan rijden, zonder prutsen aan de rails.
ik liet de led`s wisselen omdat de trein door het poortje heen rijdt en dus ook weer terug komt. die tweede pas zou een valse reading
kunnen geven. ik weet niet of dat helemaal waar is maar dat was in ieder geval mijn gedachte gang toen ik de code schreef.
Re: train control project
Een paar tips:
Deze regels:
Volgens sommigen kun je beter helemaal geen String object gebruiken in een eenvoudige microcontroller, zoals bij de Arduino Uno / Nano / Micro.
Je gebruikt een String object voor de state. Die 'state' kan natuurlijk ook integer zijn. Vaak is dan een paar defines of een 'enum' nodig om de verschillende waarden aan te geven. Een 'enum' is automatisch een 'int'.
Maar in plaats van een 'enum' kun je ook een paar defines maken.
In readLDR() twee keer analogRead() aanroepen lijkt me overbodig. De analogRead() is vrij langzaam.
Je meet of de waarde boven de 200 uit komt. Dan meet je dus niet een bepaalde verandering, maar je test op een bepaalde waarde. Ik zou toch liever de verandering meten.
Je definieert de pinnen, behalve pin 3. Die staat gewoon als getal in de code.
Het zit echt teveel in elkaar gedraaid. Als je er zelf over een paar jaar na kijkt, dan zie dat ook
Een nadeel daar van is onder andere de synchronisatie. Als het treintje naar links gaat terwijl de sketch verwacht dat hij naar rechts gaat, dan werkt het opeens niet meer.
Deze regels:
- Code: Alles selecteren
int sensLreading = analogRead; //declare variable for left ldr reading value
- Code: Alles selecteren
int sensLreading = 0; //declare variable for left ldr reading value
Volgens sommigen kun je beter helemaal geen String object gebruiken in een eenvoudige microcontroller, zoals bij de Arduino Uno / Nano / Micro.
Je gebruikt een String object voor de state. Die 'state' kan natuurlijk ook integer zijn. Vaak is dan een paar defines of een 'enum' nodig om de verschillende waarden aan te geven. Een 'enum' is automatisch een 'int'.
- Code: Alles selecteren
enum states
{
IDLE,
LEFT,
RIGHT,
JUST_DROPPED_OFF_THE_TABLE,
};
states state = IDLE;
Maar in plaats van een 'enum' kun je ook een paar defines maken.
In readLDR() twee keer analogRead() aanroepen lijkt me overbodig. De analogRead() is vrij langzaam.
Je meet of de waarde boven de 200 uit komt. Dan meet je dus niet een bepaalde verandering, maar je test op een bepaalde waarde. Ik zou toch liever de verandering meten.
Je definieert de pinnen, behalve pin 3. Die staat gewoon als getal in de code.
Het zit echt teveel in elkaar gedraaid. Als je er zelf over een paar jaar na kijkt, dan zie dat ook
Een nadeel daar van is onder andere de synchronisatie. Als het treintje naar links gaat terwijl de sketch verwacht dat hij naar rechts gaat, dan werkt het opeens niet meer.
Re: train control project
een kennis van mij heeft ook een hele uitgebreide baan gemaakt en gebruikt om de treinen te detecteren een reedrelais op de rail en een magneetje onder de trein
Terug naar Gezamenlijke projecten
Wie is er online?
Gebruikers in dit forum: Google [Bot] en 1 gast