Nieuws:

Nu in MSM 251 PRAKTIJK: Zelfbouw van briketten voor de stoomlocomotief * Een Railpool-TRAXX in een Lineas-jasje * Een trein voor de staalindustrie

Hoofdmenu

Arduino interrupt

Gestart door bumper, 08 januari 2024, 21:29:55 PM

perk

Effe snel gekeken.

Dus deze sensor : https://cdn-reichelt.de/documents/datenblatt/B400/TLE49X5L.pdf

figure 6 - geeft de output versus de inductie.

a) je hebt het non-latching type , dus da's goed
b) de output is omgekeerd met de inductie.  dus als de magneet in de buurt komt, gaat de output van de sensor LAAG.  Is dat wat je verwacht met je programma en met het meten van de voltages?

>Kan dat met dezelfde kabel voor het uploaden van een programma op een laptop via usb?

jazeker, gewoon dezelfde kabel.  En gewoon met het arduino programma dat je al gebruikt voor de compilatie. 

>In mijn handboek Arduino programmeren van Elector staat echter dat INPUT-PULLUP niet mag gebruikt worden met Attachinterrupt (uitzonderlijk geval).

geen idee, maar je kan voor de veiligheid dan gewoon je eigen pullup weerstand gebruiken.   Dat deed je toch al?

Is het mogelijk nu even het exactle stukje code wat je gebruikte voor de test?  Want ik weet nu met al die versies niet meer welke je gebruikte.

Als je wil, kan ik je ook wat uitleg geven over de seriele monitor en hoe dat te gebruiken, het is ECHT handig hoor.
Maar da's makkelijker aan de telefoon - dus als je wil stuur me dan via PM je nummer en dan bellen we eens.
Volgens mij gaat dat veel makkelijker zijn dan naar ledjes te kijken




bumper

Patrick,

Mijn code :
const int led1=11;
const int led2=12;
const byte S1interrupt=2;
boolean sensor1=false;
unsigned long int gemtijd_a;
unsigned long basetime;

void setup() {
pinMode(led1,OUTPUT);
pinmode(led2,OUTPUT);
attachInterrupt(digitalPinToInterrupt(S1interrupt),tijd_a,FALLING);
pinMode(S1interrupt,INPUT);
}

void loop(){
if(sensor==true){
if(millis()-basetime>=5000){
basetime=millis();
if(sensor1==true){
digitalWrite(led1,LOW);
}
if(gemtijd_a>0){
digitalWrite(led2,LOW);
}
sensor1=false;
}
}
}

void tijd_a() {
sensor1=true;
gemtijd_a=millis();
digitalWrite(led1,HIGH);
digitalWrite(led2,HIGH);
}

Voor alle duidelijkheid :
Geen magneet over sensor, signaal input hoog. Wel magneet over sensor, signaal input laag.
Signaal blijft maar ongeveer 1 sec laag (rijdende trein).
Vermits mijn input signaal hoog is, gebruik ik een PULL-DOWN weerstand anders is de ingang zwevend als de magneet
de sensor bediend.
Hetgeen ik wil bereiken is de tijd die verloopt tussen het bedienen van de twee sensoren.
Met deze test wil ik zien of een interrupt werkt, alvorens het volledige programma te schrijven.

Groeten.
Ludo.
 

 

eve

Heb je al eens nagedacht over hoe de signalen van uw Hall-sensoren moeten aangeboden worden aan de Arduino?
Ik heb de indruk dat je wilt werken met niveau's (hoog of laag), waar het aangewezen is om flanken (edges) te gebruiken.

Mvg, Erik.

bumper

Erik,

In mijn handboek staan vier mogelijkheden vermeld.(LOW,CHANGE,RISING en FALLING)
Ik dacht dat de neergaande flank het meest aangewezen was.
Verder rijkt mijn kennis niet.

Groeten.
Ludo.
 

eve

Die neergaande flank moet dan wel snel genoeg zijn. Ik denk dat dit met Hall's niet het geval is. Je kunt dat oplossen door er een Schmitt-trigger achter te plaatsen. Dat is nog even studeren.

Mvg, Erik.

perk

#35
>Vermits mijn input signaal hoog is, gebruik ik een PULL-DOWN weerstand anders is de ingang zwevend als de magneet

ik denk dat dit goed fout zit.  Figuur 3 in de datasheet https://cdn-reichelt.de/documents/datenblatt/B400/TLE49X5L.pdf toont dat je echt wel een pullup weerstand nodig hebt.  Anders ga je de uitgang continue naar de massa trekken, ongeacht wat de sensor wil doen.

De sensor is eigenlijk een schakelaar die aan gaat tussen de grond en de Q uitgang als er een magneet tegen zit (en nog wel de juiste kant).  Dus je trekt als het ware de uitgang naar beneden ALS er een magneet in de buurt is.  Als er geen is, wil je de Q uitgang (die dan zweeft) gewoon hoog houden - dus PULL UP.

ivm FALLING or RISING.

Als de magneet over de sensor gaat, gaat de spanning eerst vallen en daarna terug omhoog.  Het maakt dus niet erg veel uit welke je kiest maar FALLING lijkt het meest logische (de snelste respons ook)

Ps - in alle eerlijkheid ik heb die dingen nog nooit gebruikt maar probeer de datasheet te begrijpen


Het hele LED gebeuren verwart me nog steeds, maar ik geef je anders morgen even een belletje en dan spreken we wel eens over hoe de seriele monitor van de arduino te gebruiken


patrick smout

Citaat van: bumper op 14 januari 2024, 22:15:38 PMPatrick Smout, dit is getest volgens uw eerste code.
Dag Ludo, ik sluit me aan bij de bevinding van Perk dat het een pullup moet zijn. Na die aanpassing het geheel nog eens ff testen.
Met vriendelijke groeten,

Patrick Smout

bumper

Beste allemaal,

Toch even wat nieuwe resultaten.
Ik was fout met de output van de sensor.
Het moet zijn : geen magneet boven de sensor dan is de output van de sensor laag (0V).
                wel een magneet boven de sensor dan is de output van de sensor hoog (4.5V).
Als de sensor bediend wordt en snel terug niet bediend (rijdende trein), beginnen beide leds te branden wat wil zeggen dat de interrupt gewerkt heeft. Na ongeveer 5 sec gaan beide leds uit dit wil zeggen dat de sensor bediend is en dat de tijd gemeten is en de waarde groter dan 0.
Maar als de sensor traag bediend wordt (meer dan 5 sec), dan gaan de twee leds uit nog voor de magneet van de sensor is en gaan opnieuw aan als de magneet weg is en gaan na +/-5sec weer uit. De interrupt wordt dus twee maal getriggerd. Dat moet dus opgelost worden.
Ook het opstarten is een probleem. Als de 5V van de sensors aan is alvorens de arduino spanning krijgt werkt het normaal. Als de spanning van de arduino op is voor de 5v van de sensoren wordt de interrupt getriggerd ongeacht de sensor bediend is of niet. Daar moet in het programma rekening mee gehouden worden.
Blijkbaar is de manier van triggeren met dalende of opgaande flank altijd van toepassing. Dat zal dus een andere manier moeten worden.
Ik heb nog wat info bijeengezocht en getracht met een NE555 timer een schmitt-trigger te  maken, maar dat is niet gelukt. Ik zal een ander schema moeten opzoeken.
In ieder geval het interrupt programma werkt eindelijk, en mits wat aanpassingen kan dit dienen.
Nu verder proberen met twee sensoren en de tijd berekenen.

Groeten.
Ludo.
 

patrick smout

Dag Ludo,

Mooi zo!
Welk programma gebruik je momenteel? Hoe staat de triggering ingesteld?
Kijk ook eens naar mijn voorbeeld van 11 januari 22:19 (snelheidsmeting).
In dit voorbeeld zit een vergrendelmechanisme in dat, als het werkt zoals bedacht  ;) , voorkomt dat een sensor dubbel gezien wordt. Na sensor1 moet sensor2 volgen en vervolgens terug sensor1. Zoals het nu in die code is werkt het enkel voor 1-richting verkeer. Beide richtingen kan ook mits een uitbreiding van de code.
Met vriendelijke groeten,

Patrick Smout

dani

ah, er komt schot in de zaak zie ik .  Mooi zo.
Ik ben er nog niet aan toe geraakt om zelf aan de slag te gaan met dit progje. 
Momenteel aan een ander Arduino project bezig dat tegen zaterdag helemaal af moet
De kruik is te water gegaan...
De kruik is niet meer.

bumper

Beste allemaal,

Het voorbije weekend nog wat kunnen prutsen en resultaat gehad.
Wat heb zoal gedaan.
1) op de datasheet staat een klein stukje elektronica achter de sensor. Op een stukje strokenprint voor 2 sensoren toegepast. Wat daar de reden er voor is en wat het doet weet ik niet, maar ik heb het toch maar toegepast.
2) Heb een externe pull-upp van 10kohm gebruikt.
3) Programma wat aangepast aan de hand van de gegeven info en het trager laten werken zodat de leds beter zichtbaar worden. Ps een monitor heb ik niet. Enkel een laptop, maar ik weet niet of dat daar mee gaat. Dus vandaar nog steeds de leds. Achteraf gaan die dus uit het programma, want dan zijn die niet meer nodig.
4) Na wat tegenvallende resultaten, de triggering op RISING gezet, en dat werkt prima.
De interrupt wordt telkens goed gezien en de variabelen die worden juist gezet.
Dus ik ga nog verder testen om te kijken of de verschillende bedrijfsmogelijkheden een goed en betrouwbaar resultaat opleveren. (bijvoorbeeld bij zeer traag of zeer snel rijdende treinen enz.)
Bedankt om mee te helpen zoeken om resultaat te krijgen.
Het verder verloop laat ik wel weten.

Groeten.
Ludo.
 
 

bumper

Om dit draadje af te sluiten. Met 4 hall sensoren in de baan en 4 interrupt routines in mijn arduino Mega ben ik tot een goed resultaat gekomen. Bij rood stopt de trein, ongeacht zijn snelheid steeds op dezelfde plaats voor het rode licht. Als het sein op groen gezet wordt, trekt de trein langzaam op en als de loc 1,5 maal zijn lengte voorbij het sein is wordt dit automatisch op rood gezet. Zo ook bij groen en twee geel, maar dan stopt de loc uiteraard niet. Bevredigend resultaat, op een analoge baan, dat veel weg heeft van de realiteit bij het grootspoor.
Bij deze bedankt aan diegenen die mij op weg geholpen hebben.

Ludo.