Veel vragen over Arduino sketch

Plaats reactie

Onderwerp starter
Onmogelijkhier
Berichten: 376
Lid geworden op: 05 jan 2021 20:06
Locatie: Omgeving Rotterdam mijn geboorte stad

Veel vragen over Arduino sketch

Bericht door Onmogelijkhier »

Ik heb een tijd terug ergens een sketch vandaan gehaald waarmee een trein automatisch kan rijden.
Nu heb ik de sketch proberen te lezen en dus ook mijn opmerkingen achter de diverse regels geplaatst, soms staat er nog een tekst in het engels dat is niet van mij.
Kan er iemand kijken of ik de werking van het programma goed begrijp?

Er zijn delen die ik niet begrijp hoe dit werkt, zie hieronder.
Voor mij staat er als i is gelijk aan i of i is kleiner dan 90 dan i ??? de ++ begrijp ik dus niet
for(i=i;i<=90;i++){//Increasing the speed of the train to 90.
motor_go();

Ook stopt de trein eigenlijk nooit op dezelfde plaats dit komt door van alles en nog wat.
Als ik hij stopt op de plaats van vertrek en ik hang er een andere wagon aan dan veranderd de stopplaats.
Dit is ook het geval als ik het stoppen goed heb en dan er mee stop, als ik dan de volgende dag verder ga stopt hij weer op een andere plek.

Veel vragen maar ik hoop dat iemand mij hiermee kan helpen.

Groeten Marcel

de sketch

// Trein automatisch laten rijden met optrekken afremmen en stoppen

int i=0; //Integer voor opslag van de snelheid van de lokomotief op een schaal van 0 to 255.
int a=1;// Hier stond 4 Integer voor opslag van vertraging tot stoppen van de trein (in seconden), varieert met de afstand tussen sensor en de stopplaats van de trein.
// Verhoog de waarde a als de trein stopt voor de vertrek positie en verlaag de waarde als hij de stoppositie voorbij rijd.

// volgende zet de wissel op rechtdoor
void switch_to_pass(){
digitalWrite(11,HIGH);// hier stond LOW
digitalWrite(12,LOW);// hier stond HIGH
delay(200);
digitalWrite(12,HIGH);// hier stond LOW
}

// volgende zet de wissel op afbuigen
void switch_to_main(){
digitalWrite(11,LOW);// hier stond HIGH
digitalWrite(12,HIGH);// hier stond LOW
delay(200);
digitalWrite(11,HIGH);// hier stond LOW
}

void motor_go(){
if(i>=1){ //als i groter is dan 1
analogWrite(10,0); //zet analoog 10 op 0(nul)
analogWrite(9,i); //zet analoog 9 op waarde van 1
}
if(i<=-1){ //als i kleiner is dan 1
analogWrite(9,0); //zet analoog 9 op 0(nul)
analogWrite(10,(i*-1)); //zet analoog 10 op 1 maal - 1
}
if(i==0){ //als i gelijk is aan 0(nul)
analogWrite(9,0); //zet analoog 9 op 0(nul)
analogWrite(10,0); //zet analoog 10 op 0(nul)
}
}
void setup() { // instellen van input en output per pin
pinMode(A0,INPUT); //sensor voor trein detectie
pinMode(9,OUTPUT); //motorsturing
pinMode(10,OUTPUT); //motorsturing
pinMode(11,OUTPUT); //wissel sturing
pinMode(12,OUTPUT); //wisselsturing

}

void loop() {

switch_to_pass(); //Schakelt wissel naar rechtdoor

for(i=0;i<=40;i++){//Increasing the speed of train to 40, at this speed the lights turn on but the train remains at rest.
motor_go();
delay(10); //vertraging van 10 milliseconden maar waarom
}

delay(2000);//vertraging van 2000 milliseconden dit is 2 seconden
for(i=i;i<=90;i++){//Increasing the speed of the train to 90.
motor_go();
delay(500);
}

delay(4000);//vertraging van 4000 milliseconden

for(i=i;i<=180;i++){//Increasing the speed of the train to 180.
motor_go();
delay(250);
}

delay(3000);// vertraging van 3000 milliseconden
for(i=i;i!=90;i--){//Decreasing the speed of the train back to 90.
motor_go();
delay(500);
}

delay(2000);// vertraging van 2000 milliseconden

while(digitalRead(A0)==LOW);//wacht tot de train langs de sensor gaat
delay(1000*a);//wacht tot de trein over de wissel rechtdoor gaat
for(i=i;i!=60;i--){//Reducing the speed of the train gradually.
motor_go();
delay(500);
}

for(i=i;i!=40;i--){//Reducing the speed of the train gradually, bringing it to a halt.
motor_go();
delay(250);
}

for(i=i;i!=0;i--){
motor_go();
delay(62);
}
delay(2000);// vertraging van 2000 milliseconden
/*


Groeten Marcel V
Gebruikersavatar

shoven
Berichten: 6092
Lid geworden op: 14 dec 2008 21:06
Locatie: Walcheren

Re: Veel vragen over Arduino sketch

Bericht door shoven »

Een eerste aanzet:

je schrijft
Onmogelijkhier schreef: 07 apr 2022 10:52 Ook stopt de trein eigenlijk nooit op dezelfde plaats dit komt door van alles en nog wat.
Als ik hij stopt op de plaats van vertrek en ik hang er een andere wagon aan dan veranderd de stopplaats.
Dit is ook het geval als ik het stoppen goed heb en dan er mee stop, als ik dan de volgende dag verder ga stopt hij weer op een andere plek.
Dit komt waarschijnlijk omdat je motor in de ene situatie warmer is dan in de andere en/of de loc zwaarder wordt belast doordat er wagons achter hangen. Omdat de code keihard stuurt op tijd, krijgt hij dus een X aantal msec stroom. Afhankelijk van of je motor warm is of niet en hoeveel last de loc te trekken heeft, komt hij dan ver of minder ver.

De code is echt vreselijk. Gebruik van globale variabelen, namen van variabelen zonder betekenis, geen gebruik van constanten en parameters etc.
Met het stukje

for(i=i;i<=90;i++){//Increasing the speed of the train to 90.
motor_go();
delay(500);
}


bedoelt de programmeur m.i. inderdaad dat de snelheid met tussenpozen van 500 msec wordt verhoogd naar 90. Die tussenpozen zitten erin om het geleidelijk te laten gaan en mogelijk ook om de loc niet te vaak een nieuwe spanning te geven (ik meen te begrijpen dat pin 9 en 10 met de analoge railstaven verbonden zijn?).
Je zou zoiets verwachten:

while( iCurrentTrainSpeed <= 90 )
{
motor_go( iCurrentTrainSpeed );
delay( cAccelerationDelayInterval );
iCurrentTrainSpeed++;
}


Deze code bevat verder de nodige kwetsbaarheden. Er is hard op tijd gecodeerd, dat houdt dus geen rekening met de positie van je trein. Gaandeweg wordt ergens gewacht op een signaal van de sensor via pin A0; als dat mislukt wacht het programma tot St Juttemis.
De aanpasbaarheid is ook lastig, veel grenzen etc staan er keihard in, je moet weten wat het getal (bijv. die grens van 40) betekent en als je er een vergeet zoek je je verloren.
Kortom, ik ben absoluut niet onder de indruk van de kwaliteit van de sketch, maar voor een 1e testje valt er misschien nog wat van te maken als het gefatsoeneerd wordt. Mogelijk kun je een extra sensor gebruiken waardoor e.e.a. wat accurater gaat werken. Ik weet niet wat voor wisselaansturing je hebt maar ik neem aan dat dat nu werkt?


Steven

Hier is mijn baan op het forum
Hier is mijn vorige baan op het forum
Hier is mijn voor-vorige baan op het forum
>>> Filmpjes van de baan
Gebruikersavatar

Momfer
Berichten: 536
Lid geworden op: 29 okt 2020 13:13
Locatie: Zwolle

Re: Veel vragen over Arduino sketch

Bericht door Momfer »

Ik ben het van harte eens met de analyse van Steven.

Leuk voor een testje, maar teveel mitsen en maren voor verder gebruik.

Wel leerzaam om te analyseren, dat dan weer wel :)

Groet,
RIco



Onderwerp starter
Onmogelijkhier
Berichten: 376
Lid geworden op: 05 jan 2021 20:06
Locatie: Omgeving Rotterdam mijn geboorte stad

Re: Veel vragen over Arduino sketch

Bericht door Onmogelijkhier »

shoven schreef: 07 apr 2022 12:20 Een eerste aanzet: (ik meen te begrijpen dat pin 9 en 10 met de analoge railstaven verbonden zijn?).
Je zou zoiets verwachten:

Deze code bevat verder de nodige kwetsbaarheden. Er is hard op tijd gecodeerd, dat houdt dus geen rekening met de positie van je trein. Gaandeweg wordt ergens gewacht op een signaal van de sensor via pin A0; als dat mislukt wacht het programma tot St Juttemis.
De aanpasbaarheid is ook lastig, veel grenzen etc staan er keihard in, je moet weten wat het getal (bijv. die grens van 40) betekent en als je er een vergeet zoek je je verloren.
Kortom, ik ben absoluut niet onder de indruk van de kwaliteit van de sketch, maar voor een 1e testje valt er misschien nog wat van te maken als het gefatsoeneerd wordt. Mogelijk kun je een extra sensor gebruiken waardoor e.e.a. wat accurater gaat werken. Ik weet niet wat voor wisselaansturing je hebt maar ik neem aan dat dat nu werkt?
pin 9 en 10 zijn verbonden met een L298N motorsturing
pin 11 en pin 12 sturen een relay board aan.

Maar klopt het wel een beetje dat het doet wat ik er achter heb gezet?

Marcel


Groeten Marcel V

Onderwerp starter
Onmogelijkhier
Berichten: 376
Lid geworden op: 05 jan 2021 20:06
Locatie: Omgeving Rotterdam mijn geboorte stad

Re: Veel vragen over Arduino sketch

Bericht door Onmogelijkhier »

Momfer schreef: 07 apr 2022 13:14 Ik ben het van harte eens met de analyse van Steven.

Leuk voor een testje, maar teveel mitsen en maren voor verder gebruik.

Wel leerzaam om te analyseren, dat dan weer wel :)

Groet,
RIco
Vandaar dus dat ik het maar niet goed werkend krijg.
Dan stop ik maar met deze sketch want dat gaat het dus niet worden.

Marcel


Groeten Marcel V
Gebruikersavatar

Momfer
Berichten: 536
Lid geworden op: 29 okt 2020 13:13
Locatie: Zwolle

Re: Veel vragen over Arduino sketch

Bericht door Momfer »

Ter leeringh ende vermaeck heb ik een deel van de code voorzien van uitleg. Met name de WHILE is voor mij onduidelijk hoe het zou moeten gaan werken op de baan, dus vanaf daar het ik het nagelaten om er comments bij te zetten.

Ik zou voor een praktijkopzet een andere schets zoeken en gebruiken!

Code: Selecteer alles

// SKETCH om een trein automatisch te laten rijden
// met optrekken afremmen en stoppen
//
// Hier worden de variabelen globaal (lees geldig voor de gehele sketch) gedefinieerd
// Normaal gesproken hoort een variabele binnen een bepaald gedeelte te worden gedefinieerd,
// De zogeheten "SCOPE"
// Daarnaast is het wenselijk en gebruikelijk om herkenbare namen te gebruiken voor variabelen
// dus Snelheid of iCurrentTrainSpeed ipv i
// en Acceleratie of cAccelerationDelayInterval ipv a

int i = 0; //Integer voor opslag van de snelheid van de lokomotief op een schaal van 0 to 255.
int a = 1; // Hier stond 4 Integer voor opslag van vertraging tot stoppen van de trein (in seconden), varieert met de afstand tussen sensor en de stopplaats van de trein.


// Wissel omschakelen naar passeerspoor

void switch_to_pass() {
  // Schakel Relais op PIN 11 Af/UIT
  digitalWrite(11, HIGH); // hier stond LOW

  // schakel Relais op pin 12 (doel: wisselspoel?)  met een puls van 200 milliseconde == 0,2 seconde
  digitalWrite(12, LOW); // hier stond HIGH
  delay(200);
  digitalWrite(12, HIGH); // hier stond LOW
}


// Wissel omschakelen naar hoofdlijn

void switch_to_main() {
  // Schakel Relais op PIN 12 AF/UIT
  digitalWrite(12, HIGH); // hier stond LOW

  // schakel Relais op pin 11 (doel: wisselspoel?)  met een puls van 200 milliseconde == 0,2 seconde
  digitalWrite(11, LOW); // hier stond HIGH
  delay(200);
  digitalWrite(11, HIGH); // hier stond LOW
}

// functie voor motorsturing
// i = PWM Waarde
// analogWrite() is aansturen van een pin met PWM waarde 0-255 (0==altijd uit - 255==altijd aan)

void motor_go() {

  // voor positieve waardes van i
  // wordt pin 10 laag
  // en pin 9 krijgt PWM waarde i
  // rijrichting >>>>>

  if (i >= 1) { //als i groter is dan 1
    analogWrite(10, 0); //zet analoog 10 op 0(nul)
    analogWrite(9, i); //zet analoog 9 op waarde van 1
  }

  // voor negatieve waarde van i
  // wordt pin 9 laag
  // en pin 10 krijgt PWM de positief gemaakte waarde van i
  // rijrichting <<<<<

  if (i <= -1) { //als i kleiner is dan 1
    analogWrite(9, 0); //zet analoog 9 op 0(nul)
    analogWrite(10, (i * -1)); //zet analoog 10 op 1 maal - 1
  }

  // Als i is 0
  // wordt pin 9 laag
  // en pin 10 laag
  // stilstand

  if (i == 0) { //als i gelijk is aan 0(nul)
    analogWrite(9, 0); //zet analoog 9 op 0(nul)
    analogWrite(10, 0); //zet analoog 10 op 0(nul)
  }
}


// in setup() worden eenmalige handelingen
// en definities bijeengebracht
// initialisatie van de relais zou hier eigenlijk
// uitgevoerd moeten worden

void setup() { // instellen van input en output per pin
  pinMode(A0, INPUT); //sensor voor trein detectie
  pinMode(9, OUTPUT); //motorsturing
  pinMode(10, OUTPUT); //motorsturing
  pinMode(11, OUTPUT); //wissel sturing
  pinMode(12, OUTPUT); //wisselsturing

}

// loop() wordt doorlopen uitgevoerd
// hier worden de repeterende handelingen
// in verwerkt

void loop() {

  // Schakel naar passeerspoor
  switch_to_pass(); 
  
  // optrekken van 0 naar 40  
  for (i = 0; i <= 40; i++) { 

    // roep de motorfunctie aan
    // dit werkt alleen omdat i globaal is gedefinieerd

    motor_go();

    // de delay bepaald hier hoe snel er van 0 naar 40 wordt gegaan.
     delay(10); //vertraging van 10 milliseconden maar waarom
  }


  // blijf 2 seconden met snelheid 40 rijden
  delay(2000);

  // versnellen van i(=40) naar 90
  for (i = i; i <= 90; i++) { 
 
    // roep de motorfunctie aan
    // dit werkt alleen omdat i globaal is gedefinieerd
    
    motor_go();
    
    // de delay bepaald hier hoe snel er van i(=40) naar 90 wordt gegaan. 
    // het bepaald de feitelijke versnelling
    delay(500);
  }


  //vertraging van 4000 milliseconden
  delay(4000);

  for (i = i; i <= 180; i++) { //Increasing the speed of the train to 180.
    motor_go();
    delay(250);
  }

  delay(3000);// vertraging van 3000 milliseconden
  for (i = i; i != 90; i--) { //Decreasing the speed of the train back to 90.
    motor_go();
    delay(500);
  }

  delay(2000);// vertraging van 2000 milliseconden

  
  // onwenselijk gebruik van while()
  // of ik begrijp de opzet van je sensor/baan gebruik niet
   
  while (digitalRead(A0) == LOW); //wacht tot de train langs de sensor gaat
    delay(1000 * a); //wacht tot de trein over de wissel rechtdoor gaat
    for (i = i; i != 60; i--) { //Reducing the speed of the train gradually.
      motor_go();
      delay(500);
  }

  for (i = i; i != 40; i--) { //Reducing the speed of the train gradually, bringing it to a halt.
    motor_go();
    delay(250);
  }

  for (i = i; i != 0; i--) {
    motor_go();
    delay(62);
  }
  delay(2000);// vertraging van 2000 milliseconden



Peter64
Berichten: 15
Lid geworden op: 27 mar 2022 20:38

Re: Veel vragen over Arduino sketch

Bericht door Peter64 »

Die "while" constructie hier is inderdaad merkwaardig, maar is zo te zien wel bedoeld om de wachten tot pin A0 naar HIGH gaat (of eigenlijk "niet LOW"). In principe behoort een while constructie er zo uit zien:

Code: Selecteer alles

while (condition) {
  // statement(s)
}
Het lijkt erop dat met de ";" in de schets aangegeven wordt dat er geen statements zijn, dus er gebeurt niets totdat niet meer aan de conditie "digitalRead(A0) == LOW" voldaan wordt. De code gaat zo snel mogelijk heel vaak die stand van pin A0 uitlezen. Maar wat anderen ook al genoemd hebben, het is echt heel slecht leesbare code, wat mij vooral stoort is de "i", die globaal is, en waarbij uit de naam totaal niet blijkt wat de betekenis is. Over het algemeen wordt "i" alleen gebruikt voor simpele tellertjes, terwijl het hier de motorsnelheid is.

Om verder te komen zou je het best eens in gewoon Nederlands kunnen opschrijven wat je wilt, gewoon in punten onder elkaar of eventueel in een schema ("flowchart"), en daarna proberen dit zelf of met behulp van hulp op het forum om te zetten in iets wat werkt. Maar het wordt wel lastig denk ik, vooral dat stoppen op de gewenste plek, omdat je inderdaad niet weet hoe hard de trein rijdt omdat dat afhankelijk is van allerlei factoren die je niet onder controle hebt.

@shoven suggereert het gebruik van een extra sensor, dat lijkt me wel een goed idee, dan kun je bijvoorbeeld gaan kijken hoe lang de trein er over doet om van de eerste bij de tweede sensor te komen. Dat weet je de echte snelheid, en middels wat experimenten zou je dan moeten gaan kijken hoe je de remfunctie afhankelijk van de gemeten snelheid moet maken. Je zou bijvoorbeeld de "delay" in de "motor_go" kunnen uitrekenen als functie van de gemeten snelheid. Een hoge snelheid betekent een korte delay, een lage snelheid een langere delay (ik ben nu gewoon wat hardop aan het denken)



Onderwerp starter
Onmogelijkhier
Berichten: 376
Lid geworden op: 05 jan 2021 20:06
Locatie: Omgeving Rotterdam mijn geboorte stad

Re: Veel vragen over Arduino sketch

Bericht door Onmogelijkhier »

Als ik er een sensor bij het kan ik die beter plaaten daar waar de trein moet stoppen en dan ook echt laten stoppen met deze sensor.
Dan kan de eerdere vervallen denk ik.


Groeten Marcel V

Peter64
Berichten: 15
Lid geworden op: 27 mar 2022 20:38

Re: Veel vragen over Arduino sketch

Bericht door Peter64 »

Als je tevreden bent met echt onmiddelijk stoppen, afgezien van een heel klein beetje inertia, dan wel ja. Dan zou je bijvoorbeeld dit kunnen doen (aannemende dat je dezelfde sketch wilt blijven gebruiken, alleen een beetje aangepast):

Code: Selecteer alles

while (digitalRead(A0) == LOW); // Wacht tot de train langs de sensor gaat
i=0;                            // Zet de gewenste snelheid
motor_go();                     // Stop de motor (omdat je i op 0 gezet hebt)
De trein zal dan met een flinke schok vrijwel onmiddelijk bij de sensor stoppen. Als je wilt dat je trein een beetje netjes afremt wordt het ingewikkelder.



Onderwerp starter
Onmogelijkhier
Berichten: 376
Lid geworden op: 05 jan 2021 20:06
Locatie: Omgeving Rotterdam mijn geboorte stad

Re: Veel vragen over Arduino sketch

Bericht door Onmogelijkhier »

Peter64 schreef: 08 apr 2022 08:58 Als je tevreden bent met echt onmiddelijk stoppen, afgezien van een heel klein beetje inertia, dan wel ja. Dan zou je bijvoorbeeld dit kunnen doen (aannemende dat je dezelfde sketch wilt blijven gebruiken, alleen een beetje aangepast):

Code: Selecteer alles

while (digitalRead(A0) == LOW); // Wacht tot de train langs de sensor gaat
i=0;                            // Zet de gewenste snelheid
motor_go();                     // Stop de motor (omdat je i op 0 gezet hebt)
De trein zal dan met een flinke schok vrijwel onmiddelijk bij de sensor stoppen. Als je wilt dat je trein een beetje netjes afremt wordt het ingewikkelder.
Ik dacht dat de trein al langzamer rijd als hij bij de sensor voor de while (digitalRead(A0) == LOW); komt.


Groeten Marcel V

Peter64
Berichten: 15
Lid geworden op: 27 mar 2022 20:38

Re: Veel vragen over Arduino sketch

Bericht door Peter64 »

Sorry, ik was even uitgegaan van een enkele sensor, dat zou misschien mooi werken voor in een schaduwstation. Met twee sensoren zou je iets kunnen maken waardoor vanaf de eerste sensor de trein alvast langzamer gaat rijden, maar nog wel blijft rijden. Bij de tweede sensor zet je hem dan botweg stil, dat zou wel een mooi compromis zijn tussen de onzekerheid in de originele sketch en de wat botte manier uit mijn oplossing. Ik denk dan zoiets:

Code: Selecteer alles

int minimumSnelheid = 10;              // Zet hier een de laagste waarde waarbij de trein nog wel rijdt
while (digitalRead(A0) == LOW);        // Wacht tot de train langs eerste sensor gaat

for (i = i; i > minimumSnelheid; i--)  // Rem af tot de minimum snelheid
{ 
    motor_go();
    delay(500);                        // Kies deze delay zodanig dat de trein altijd de minimumsnelheid bereikt heeft VOORDAT hij bij de tweede sensor is
}

while (digitalRead(A1) == LOW);        // Wacht tot de train langs de tweede sensor gaat
i=0;                                   // Zet de gewenste snelheid
motor_go();                            // Stop de motor (omdat je i op 0 gezet hebt)
Misschien zou dit ook wel werken, maar dit zou mis kunnen gaan als de trein gedurende de "delay" in de code de tweede sensor voorbij rijdt

Code: Selecteer alles

int minimumSnelheid = 10;             // Zet hier een de laagste waarde waarbij de trein nog wel rijdt
while (digitalRead(A0) == LOW);       // Wacht tot de train langs eerste sensor gaat

while (i > o)                         // Doe dit zolang de trein nog rijdt
{
    i = max(i-1, minimumspeed);       // Rem af, maar nooit onder de minimum snelheid
    if (digitalRead(A1) == HIGH) i=0; // Als je de tweede sensor detecteert, zet de snelheid op 0
    motor_go()
    delay(10);                        // beetje experimenteren om hier een juiste waarde te vinden
}


Gebruikersavatar

fenix
Berichten: 564
Lid geworden op: 04 apr 2019 14:26

Re: Veel vragen over Arduino sketch

Bericht door fenix »

of wellicht de beide sensoren aan pin 2 en 3 hangen met een interrupt routine die een millis() waarde naar een variabele stuurt. (die grap heb ik gebruikt bij een sluitertijd meter voor analoge foto toestellen).
Zo vermijdt je het gebruik van de delay functie (die de arduino blokkeert voor ongeveer alles zolang de delay nog niet klaar is.

Sowieso vind ik het apart om een Analoge input lijn te gebruiken voor een digitale uitlezing, tenzij er geen andere pinnen meer beschikbaar zijn. En dan nog heeft een arduino (in ieder geval de nano) ook een digitaal pinnummer voor een aantal analoge inputlijnen. Die ik zou gebruiken als het om een digitale uitlezing gaat.

ter referentie de sketch voor de sluitertijd meter:
Er staat vrijwel geen commentaar tussen de code, maar de variabele namen zijn wel redelijk 'logisch' voor wat ze vertegenwoordigen.
Tevens gebruik ik micros() om sluitertijden sneller dan 1/1000e seconde te kunnen meten. met millis() lukt dat net niet ;)
//firmware version:
const int firmware_major=1;
const int firmware_minor=5;

// algemene definities
#define LEDPIN 13
#define SENSORPIN 2

//lcd defenities
#include <LiquidCrystal.h>
LiquidCrystal lcd = LiquidCrystal(3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
const int numRows = 2;
const int numCols = 16;

//sluitertijd defenities
volatile unsigned long changetime;
volatile unsigned long timeopen;
volatile unsigned long timeclose;
unsigned long shutteropen;
float floatingdenominator;
unsigned int wholeseconds;
int shutterstatus;
float shuttertime;

void setup() {
pinMode(LEDPIN, OUTPUT);
pinMode(SENSORPIN, INPUT_PULLUP);
lcd.begin(numCols, numRows);
lcd.setCursor(0,0);
lcd.print("shutterspeed ");
lcd.print(firmware_major);
lcd.print(".");
lcd.print(firmware_minor);
lcd.setCursor(0,1);
lcd.print("by: Fenna Pel");
delay(2000);
attachInterrupt(digitalPinToInterrupt(SENSORPIN), shutter, CHANGE);
timeclose=0;
timeopen=0;

}

void loop(){
shutteropen = timeclose-timeopen;
wholeseconds = trunc (shutteropen/1000000.0);
shuttertime = shutteropen/1000000.0-wholeseconds;
floatingdenominator = (1/shuttertime);
lcd.setCursor(0,0);
lcd.print("shutterspeed: ");
lcd.setCursor(0,1);
if (wholeseconds >0) lcd.print(wholeseconds);
lcd.print(" 1/");
lcd.print(floatingdenominator);
lcd.print("s ");
}

void shutter(){
//record the time the change of state occurd
changetime=micros();

// read the state of the photo transistor:
// if the shutterstate is LOW, the shutter is open
shutterstatus = digitalRead(SENSORPIN);
if (shutterstatus == LOW) {
digitalWrite(LEDPIN, LOW);
timeclose=changetime;
}
else {
digitalWrite(LEDPIN, HIGH);
timeopen=changetime;
}

}
groetjes, Fenna



Onderwerp starter
Onmogelijkhier
Berichten: 376
Lid geworden op: 05 jan 2021 20:06
Locatie: Omgeving Rotterdam mijn geboorte stad

Re: Veel vragen over Arduino sketch

Bericht door Onmogelijkhier »

Na het toevoegen van de code van Peter64 en daarin nog een kleine verandering werkt het.
Code;
while (digitalRead(A0) == LOW); // Wacht tot de train langs de sensor gaat
i=0; // Zet de gewenste snelheid
motor_go(); // Stop de motor (omdat je i op 0 gezet hebt)

Waar nu nog LOW staat heb ik hier HIGH van gemaakt omdat de infrarood reflectie sensor dit verlangt.
Normaal werk ik met reed switch voor het schakelen in plaats IR sensor, deze nemen ruimte in en moet je camoufleren.
Met de reed switch werkte het niet.


Groeten Marcel V

Peter64
Berichten: 15
Lid geworden op: 27 mar 2022 20:38

Re: Veel vragen over Arduino sketch

Bericht door Peter64 »

Goedemorgen, mooi om te lezen dat je het voor elkaar hebt. Overigens is de tip van Fenna wel een hele goede, het gebruik van interrupts. Dat maakt alles wat meer flexibel. Het gebruik van delays werkt goed, maar zorgt er wel voor dat je Arduino op dat moment niets anders doet dan domweg wachten. Voor je huidige sketch lijkt me dat geen probleem. Maar als je je mogelijkhden later gaat uitbreiden, en er meerdere dingen tegelijk kunnen gaan gebeuren op de baan, dan wordt dat wel een beperking.



Onderwerp starter
Onmogelijkhier
Berichten: 376
Lid geworden op: 05 jan 2021 20:06
Locatie: Omgeving Rotterdam mijn geboorte stad

Re: Veel vragen over Arduino sketch

Bericht door Onmogelijkhier »

Het zou best kunnen dat interrupts beter zouden zijn maar ik kan dat zelf niet terugvinden in de door Fenna geplaatste code.
Ik verander dat dus niet eventjes zo, maar voorlopig werkt het en daar ging het om en ik kan deze code ook aardig lezen en begrijpen.
Wel heb ik Arduino voor Dummy's aangeschaft :D kan ik vast wel iets van leren.

Marcel


Groeten Marcel V

Onderwerp starter
Onmogelijkhier
Berichten: 376
Lid geworden op: 05 jan 2021 20:06
Locatie: Omgeving Rotterdam mijn geboorte stad

Re: Veel vragen over Arduino sketch

Bericht door Onmogelijkhier »

fenix schreef: 09 apr 2022 02:03 of wellicht de beide sensoren aan pin 2 en 3 hangen met een interrupt routine die een millis() waarde naar een variabele stuurt. (die grap heb ik gebruikt bij een sluitertijd meter voor analoge foto toestellen).
Zo vermijdt je het gebruik van de delay functie (die de arduino blokkeert voor ongeveer alles zolang de delay nog niet klaar is.

Sowieso vind ik het apart om een Analoge input lijn te gebruiken voor een digitale uitlezing, tenzij er geen andere pinnen meer beschikbaar zijn. En dan nog heeft een arduino (in ieder geval de nano) ook een digitaal pinnummer voor een aantal analoge inputlijnen. Die ik zou gebruiken als het om een digitale uitlezing gaat.

ter referentie de sketch voor de sluitertijd meter:
Er staat vrijwel geen commentaar tussen de code, maar de variabele namen zijn wel redelijk 'logisch' voor wat ze vertegenwoordigen.
Tevens gebruik ik micros() om sluitertijden sneller dan 1/1000e seconde te kunnen meten. met millis() lukt dat net niet ;)
//firmware version:
const int firmware_major=1;
const int firmware_minor=5;

// algemene definities
#define LEDPIN 13
#define SENSORPIN 2

//lcd defenities
#include <LiquidCrystal.h>
LiquidCrystal lcd = LiquidCrystal(3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
const int numRows = 2;
const int numCols = 16;

//sluitertijd defenities
volatile unsigned long changetime;
volatile unsigned long timeopen;
volatile unsigned long timeclose;
unsigned long shutteropen;
float floatingdenominator;
unsigned int wholeseconds;
int shutterstatus;
float shuttertime;

void setup() {
pinMode(LEDPIN, OUTPUT);
pinMode(SENSORPIN, INPUT_PULLUP);
lcd.begin(numCols, numRows);
lcd.setCursor(0,0);
lcd.print("shutterspeed ");
lcd.print(firmware_major);
lcd.print(".");
lcd.print(firmware_minor);
lcd.setCursor(0,1);
lcd.print("by: Fenna Pel");
delay(2000);
attachInterrupt(digitalPinToInterrupt(SENSORPIN), shutter, CHANGE);
timeclose=0;
timeopen=0;

}

void loop(){
shutteropen = timeclose-timeopen;
wholeseconds = trunc (shutteropen/1000000.0);
shuttertime = shutteropen/1000000.0-wholeseconds;
floatingdenominator = (1/shuttertime);
lcd.setCursor(0,0);
lcd.print("shutterspeed: ");
lcd.setCursor(0,1);
if (wholeseconds >0) lcd.print(wholeseconds);
lcd.print(" 1/");
lcd.print(floatingdenominator);
lcd.print("s ");
}

void shutter(){
//record the time the change of state occurd
changetime=micros();

// read the state of the photo transistor:
// if the shutterstate is LOW, the shutter is open
shutterstatus = digitalRead(SENSORPIN);
if (shutterstatus == LOW) {
digitalWrite(LEDPIN, LOW);
timeclose=changetime;
}
else {
digitalWrite(LEDPIN, HIGH);
timeopen=changetime;
}

}
groetjes, Fenna
Heel leuk dat je zelf een sluitertijden tester hebt gemaakt. Zelf fotografeer ik nog steeds analoog met diverse spiegelreflex camera's.
Heb de SLR's ook beroepsmatig gerepareerd en doe dat nog wel eens maar mis daarbij een sluitertester.

Marcel


Groeten Marcel V
Gebruikersavatar

fenix
Berichten: 564
Lid geworden op: 04 apr 2019 14:26

Re: Veel vragen over Arduino sketch

Bericht door fenix »

Hallo Marcel,

schuin-vet is de interrupt code.
het woord 'shutter' in de enkele schuin-vet regel is de aanroop van de void shutter() routine
het 'attachinterrupt' verteld de arduino dat er met hardware interrupt wordt gewerkt en welke functie er bij die hardware interrupt hoort en op wat voor pin verandering er gelet moet worden

in de void loop() worden vervolgens de waarden verwerkt die door de interrupt routine zijn veilig gesteld
//firmware version:
const int firmware_major=1;
const int firmware_minor=5;

// algemene definities
#define LEDPIN 13
#define SENSORPIN 2

//lcd defenities
#include <LiquidCrystal.h>
LiquidCrystal lcd = LiquidCrystal(3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
const int numRows = 2;
const int numCols = 16;

//sluitertijd defenities
volatile unsigned long changetime;
volatile unsigned long timeopen;
volatile unsigned long timeclose;
unsigned long shutteropen;
float floatingdenominator;
unsigned int wholeseconds;
int shutterstatus;
float shuttertime;

void setup() {
pinMode(LEDPIN, OUTPUT);
pinMode(SENSORPIN, INPUT_PULLUP);
lcd.begin(numCols, numRows);
lcd.setCursor(0,0);
lcd.print("shutterspeed ");
lcd.print(firmware_major);
lcd.print(".");
lcd.print(firmware_minor);
lcd.setCursor(0,1);
lcd.print("by: Fenna Pel");
delay(2000);
attachInterrupt(digitalPinToInterrupt(SENSORPIN), shutter, CHANGE);
timeclose=0;
timeopen=0;

}

void loop(){
shutteropen = timeclose-timeopen;
wholeseconds = trunc (shutteropen/1000000.0);
shuttertime = shutteropen/1000000.0-wholeseconds;
floatingdenominator = (1/shuttertime);
lcd.setCursor(0,0);
lcd.print("shutterspeed: ");
lcd.setCursor(0,1);
if (wholeseconds >0) lcd.print(wholeseconds);
lcd.print(" 1/");
lcd.print(floatingdenominator);
lcd.print("s ");
}

void shutter(){
//record the time the change of state occurd
changetime=micros();

// read the state of the photo transistor:
// if the shutterstate is LOW, the shutter is open
shutterstatus = digitalRead(SENSORPIN);
if (shutterstatus == LOW) {
digitalWrite(LEDPIN, LOW);
timeclose=changetime;
}
else {
digitalWrite(LEDPIN, HIGH);
timeopen=changetime;
}

}
Als je wilt, kan ik via PB wel wat meer over die sluitertijd tester met je delen

gr. Fenna



Onderwerp starter
Onmogelijkhier
Berichten: 376
Lid geworden op: 05 jan 2021 20:06
Locatie: Omgeving Rotterdam mijn geboorte stad

Re: Veel vragen over Arduino sketch

Bericht door Onmogelijkhier »

Graag ik heb zeker interesse hierin. Je weet mij nog te bereiken?

Marcel


Groeten Marcel V
Plaats reactie