BeneluxSpoor.net forum

Vraag en antwoord => Elektronica en analoog => Topic gestart door: peterha op 13 mei 2015, 13:33:48

Titel: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 13 mei 2015, 13:33:48
Hallo,

Ik zou graag willen weten/zien of mijn treinen uiteindelijk ook daadwerkelijk de snelheid rijden zoals deze bij het ijken zijn bepaald en vastgelegd.
Nu heb ik op Internet al diverse commerciele toepassingen gevonden, maar ik vind deze erg aan de prijs. Er worden al gauw prijzen van 150 - 250 euro gevraagd.

Aangezien ik me steeds weer verbaas over de grote hoeveelheid technische kennis die hier op het forum aanwezig is, vroeg ik mij af of er iemand is die zelf al zo'n snelheidsmeter gemaakt heeft of zoiets (o.a. voor mij) zou kunnen maken?

Het kan -wat mij betreft- dan een simpel printje zijn met een uitleesschermpje.
Ikzelf rij H0, dus dat zou een vast gegeven kunnen zijn, met een meting m.b.v. twee sensoren of een vaste afstand?

Is dit eenvoudig te ontwerpen en te maken voor een simpele doe-het-zelver?

Met vriendelijke groet,
Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Dirk J op 13 mei 2015, 13:35:50
Ik heb er ooit eens zelf een gebouwd en dat kostte me alles bij elkaar minder dan twee tientjes.

Het begon allemaal met een Fleischmann railreinigingswagen. Die voldeed niet best. Toen de viltjes vervangen moesten worden was het mij genoeg geweest en werd hij terzijde gesteld. Ondertussen wilde ik een tacho wagen hebben, daar de tijd van "een trein moet zo hard mogelijk" allang plaats gemaakt had voor de tijd van "hoe snel zou realistisch zijn". Nu kun je die kopen, maar zelf bouwen is natuurlijk altijd leuker. En in dit geval ongeveer een kwartiertje werk, dus eigenlijk een kleinigheidje.

Eerst heb ik een gewone digitale snelheidsmeter gekocht bij de fietsenwinkel. De goedkoopste kostte me een tientje, en heeft 3 standen: snelheid, trip en afstand. Trip is in wezen hetzelfde als afstand, alleen is trip op nul te zetten. We zullen zien dat de trip stand heel handig is bij het ijken van de meter. Belangrijk is dat het een meter is die snelheden boven de 99 km/u aan kan geven, en dat de wieldiameter vrij instelbaar is.

De railreinigingswagen is een handig uitgangspunt met deze meter. De wagen heeft wat extra gewicht zodat slip van de meet-as voorkomen wordt, en dat de assen verdikt en niet geleidend zijn zal ook goed van pas komen. Daarnaast is het een leuk compact wagentje, waar de meter mooi ingebouwd kan worden en gecamoufleerd met delen van de huif.

Voor we de meter kunnen plaatsen moet eerst het plaatje met de reinigingswielen en het aandrijfriempje onder de wagen verwijderen. Het riempje kun je doorknippen, en het plaatje klikt er eenvoudig uit.

Aan het voetje van de meter zitten twee draadjes, die samen uitkomen op een in een plastic huisje verpakt reedrelais. De oorspronkelijke bedoeling is dat een magneetje op een van de spaken per omwenteling één puls geeft aan het reedrelais, dat dan sluit. In plaats van het reedrelais met magneetje heb ik een telcontact gemaakt aan een van de assen. Stap 1 daartoe is het afknippen van het reedrelais, en het splitsen van de beide draadjes. Met een klein boortje worden aan weerszijden van de wagen de gaatjes gemaakt waardoor de draadjes naar beneden kunnen. De voet van de meter kan nu op de wagen gelijmd worden; ik heb dat gedaan met een gel-secondenlijm. Deze lijm is nog even nastelbaar, en dat is wel zo prettig.

Van boven ziet het er nu zo uit:
(http://www.deteco.nl/h0/Tacho1.jpg)

Aan de onderzijde moet het telcontact komen. Dit heb ik gemaakt van 0,5mm messing staf ("draad"). Op de meet-as heb ik in de lengterichting een stukje messing staf van 11mm lengte gelijmd, alweer met gel-secondenlijm. Hier komt het handig van pas dat de as een kunststof mantel heeft. Vanuit het midden van de wagen heb ik twee stukjes staf van 35mm zo geplaatst, dat de uiteinden net over de as heen steken. De andere uiteinden zijn gelijmd aan de bodem van de wagen. Deze twee staven worden nu bij elke omwenteling van de as éénmaal kortgesloten. Vlak bij de lijmpunten kunnen nu de beide draden van de meter aangesoldeerd worden. Om enige veerspanning op de staven te houden heb ik een stukje van een satéprikker onder de treden gelijmd, waardoor de staven iets omlaag gedrukt worden.

De onderzijde ziet er nu als volgt uit:
(http://www.deteco.nl/h0/TachoOnder.jpg)

Op de rechteras zie je aan de onderzijde het stukje messing staf dat per omwenteling éénmaal een kortsluiting maakt.

Nu is het tijd om de gebruiksaanwijzing van de meter lezen; daar staat in hoe de wieldiameter ingesteld wordt. Daarvoor heb ik de diameter van een wiel met de schuifmaat opgemeten, en omdat ik de schaalsnelheid wil meten heb ik die waarde vermenigvuldigd met 87. Na het instellen van deze waarde kan de meter in het voetje geklikt worden. Daarna kan de kap verzaagd worden, en de volgende foto is gemaakt na het passend maken van de twee kapdelen met een Proxxon en een slijpschijfje.

(http://www.deteco.nl/h0/Tacho2.jpg)

De kapdelen zitten wat strak, en omdat de meter er nog af moet voor het ijken heb ik die pas geplaatst na het ijken. Om de wieldiameter in te kunnen stellen moet er namelijk een knopje aan de onderzijde van de meter ingedrukt worden, en daarvoor moet de meter afgenomen worden.
IJken op snelheid is moeilijk, maar op afstand gelukkig niet. Ik heb een ovaal uitgelegd waarvan ik de lengte nauwkeurig heb gemeten. Deze lengte heb ik vermenigvuldigd met 870, en die uitkomst is wat de tripmeter aan moet wijzen na tien rondjes. Dus nu de wagen rondjes laten rijden. Is de uitkomst te laag, dan moet een grotere wieldiameter ingesteld worden, en andersom. Toen de meter een afwijking van minder dan 1% aangaf vond ik het prachtig, en heb ik de kappen erop gezet.

(http://www.deteco.nl/h0/TachoBoven.jpg)

En klaar is Dirk. Tweedehands kun je zo'n wagentje voor een euro of 5 op de kop tikken, dus voor 15 euro kun je een tacho wagen hebben. En dat is dan toch weer leuk, zo simpel als het is.
Daarbij kost de bouw van de wagen minder tijd dan het schrijven van dit verhaal  ;)
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 13 mei 2015, 13:59:18
Hallo Dirk,

Bedankt voor je reactie en uitgebreide uitleg.

Zelf heb ik ook al eens zoiets gemaakt van een fietscomputertje (gekocht bij de Action), maar dat voldeed toch niet.

Ik moest de metalen as waarop het de voelers kwamen, isoleren en in tweëen 'delen', d.w.z. bij elke omwenteling van de as moesten er twee pulsen gegeven worden anders kon de fietscomputer niet goed ingesteld worden om de juiste snelheid te tonen. Of ik moest bij een omwenteling de getoonde snelheid x2 doen. Dat werkte niet echt betrouwbaar.

Het meetwagentje hing achter de trein en om de snelheid te lezen, moest je a.h.w. even achter de trein aan lopen om 'm te kunnen aflezen.
Ik vond dat niet zo'n succes. Daarbij komt dat ik nu bij mijn sluitwagons de koppeling verwijderd heb, zodoende kan ik 'm niet meer achter een trein hangen.

Vandaar dat ik liever een stationaire meting langs de baan doe, waarbij de snelheid (gemeten over een vaste afstand) van de voorbij rijdende trein getoond wordt.

Groeten,
Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Dirk J op 13 mei 2015, 14:48:41
Ik moest de metalen as waarop het de voelers kwamen, isoleren...

Daarom komt die railreinigingswagen met z'n verdikte geïsoleerde assen zo goed van pas.

... en in tweëen 'delen', d.w.z. bij elke omwenteling van de as moesten er twee pulsen gegeven worden anders kon de fietscomputer niet goed ingesteld worden om de juiste snelheid te tonen. Of ik moest bij een omwenteling de getoonde snelheid x2 doen. Dat werkte niet echt betrouwbaar.

Daarom is de keuze van de te gebruiken fietscomputer erg belangrijk. Zoals ik al schreef, "belangrijk is dat het een meter is die snelheden boven de 99 km/u aan kan geven, en dat de wieldiameter vrij instelbaar is."

Het meetwagentje hing achter de trein en om de snelheid te lezen, moest je a.h.w. even achter de trein aan lopen om 'm te kunnen aflezen.
Ik vond dat niet zo'n succes. Daarbij komt dat ik nu bij mijn sluitwagons de koppeling verwijderd heb, zodoende kan ik 'm niet meer achter een trein hangen.

Bij de mijne zijn de cijfers groot genoeg om wanneer de trein voorbij komt de snelheid af te lezen terwijl je zelf stil staat. Bovendien heb ik later aan een zijde de koppeling verwijderd en een stukje relatief zacht materiaal op de kopse kant van de wagen aangebracht, zodat ik de trein de wagen kan laten duwen. Met name bij treinstellen die geen werkende koppelingen hebben vind ik dat handig.

Vandaar dat ik liever een stationaire meting langs de baan doe, waarbij de snelheid (gemeten over een vaste afstand) van de voorbij rijdende trein getoond wordt.

Dan heb je hier helemaal niets aan. Ik ben benieuwd!
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 13 mei 2015, 16:02:56
Wat ook werkt is een lichtsluis(je): twee lichtgevoelige weerstanden (LDR's) op 100 mm van elkaar tussen de biels, een Arduino met wat software voor het rekenwerk en klaar is Peter. Indien gewenst heb ik een schema en wat software ter informatie...  ;)
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: zuylen op 13 mei 2015, 16:18:38
Stuur maar op naar mij die software en elektronische schema's en software! Hoewel de mobiele tachowagen wil ik ook nog wel in elkaar freubelen. Heb nog zo'n wagentje liggen.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 13 mei 2015, 16:31:51
Geef me even een paar uur de tijd om het een en ander uit te graven... 8)
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 13 mei 2015, 16:54:34
Hier alvast een schema - de software zit iets dieper (en dan duurt 't graven wat langer...)

(https://images.beneluxspoor.net/bnls/lichtsluis_schema.png) (https://images.beneluxspoor.net/bnls/lichtsluis_schema.png)
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 13 mei 2015, 17:09:03
En wat code om de snelheid te meten en zichtbaar te maken. Dit werkt - voor mij - maar is uiteraard op alle mogelijke manieren aan te passen.
Misschien zelfs wel te verbeteren...  ;D

/********************************************************************
Speedometer
 
als er bij opstarten licht brand boven de ldr's zijn ze alle twee hoog,
dwz boven het kantelpunt (offset = 511) en gaat alles goed.

dus alvorens de speedometer te gebruiken controleren of er voldoende
licht aanwezig is.

********************************************************************/

#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"

Adafruit_7segment display = Adafruit_7segment();

#define ldrLeft  A2  // linker lichtsluis
#define ldrRight A3  // rechter lichtsluis

bool timerRuns = false;
bool fromLeft  = false;
bool fromRight = false;
bool drawDots  = false;
bool reset     = false;

unsigned long curTime = 0;
unsigned long preTime = 0;
unsigned long runTime = 0;

int valLeft    =     0;
int valRight   =     0;
int offset     =   511; // 0 is geheel bedekt, 1023 is vol verlicht

float distance =    98; // afstand tussen LDR's in mm.
float speed    = 10000; // preset in schaal km/h.

/*******************************************************************/

void setup()  {
 
  display.begin(0x70);
  display.setBrightness(7);  // 0..15
  display.print(speed, 1);   // display "----"
  display.writeDisplay();

  pinMode(ldrLeft,  INPUT);
  pinMode(ldrRight, INPUT);
 
  delay(5000);  // opstartvertraging 5 seconden

} // end of setup

/*******************************************************************/

void loop() { 

  valLeft  = analogRead(ldrLeft);  delay(10);
  valRight = analogRead(ldrRight); delay(10);

  speedometer();
 
} // end of loop
 
/*******************************************************************/

void speedometer() { 

  if (!timerRuns) { // nog geen meting
   
    if (valLeft < offset || valRight < offset) { // links of rechts bezet ?
     
      timerRuns = true;
      preTime   = millis();
      runTime   = 0;
      if (valLeft  < offset) fromLeft  = true;
      if (valRight < offset) fromRight = true;
     
      // alle 2 bezet of te weinig licht: is foute boel, dus opnieuw...

      if (fromLeft && fromRight) reset = true;
    }

  } else { // meting loopt...
 
    curTime = millis();         
    runTime = curTime - preTime;

    if ((runTime / 500) % 2) // knipperen display
      display.print(speed, 1);
    else
      display.clear();
    display.writeDisplay();
 
    if (fromLeft  && (valRight < offset) ||
        fromRight && (valLeft  < offset)) {
     
      preTime = curTime;
      calculateSpeed();
    }
  }
 
} // end of speedometer

/*******************************************************************/

void calculateSpeed() {

  if (!reset) {
   
    speed = ((distance * 3600) / runTime / 1000) * 87;
 
    display.print(speed, 1); // display gemeten snelheid in km/h
    display.writeDisplay();
 
    delay(5000); // display speed for 5 seconds
  }
 
  timerRuns = false; // reset speedometer
  fromLeft  = false;
  fromRight = false;
  reset     = false;
 
  speed = 10000;
  display.print(speed, 1); // display "----"
  display.writeDisplay();
 
} // end of calculateSpeed

/*******************************************************************/

Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 13 mei 2015, 20:09:40
Dan heb je hier helemaal niets aan. Ik ben benieuwd!

Hoe zo? Die dingen worden zelfs gebruikt om de snelheid te ijken en in te voeren in treinbesturingsprogramma's.
Ik zal in ieder geval ook nog wel eens zoeken naar zo'n (betere) fietssnelheidsmeter die je omschrijft.

.... een Arduino met wat software voor het rekenwerk en klaar is Peter. Indien gewenst heb ik een schema en wat software ter informatie...

Bedankt, maar ik denk dat dit voor mij voorlopig alvast te hoog gegrepen is.
Ik zal me dan eerst helemaal moeten verdiepen in zo'n Arduino en hoe de software er in te krijgen. Zal de website van Arduino.cc maar eens uitpluizen. Zie in ieder geval al wel dat  je software voor H0 is.
Zijn hiervoor speciale Arduino's of kan ik gewoon de eerste de beste c.q. de goedkoopste nemen? Kun je me hier wat verder mee helpen?

Groeten,
Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 13 mei 2015, 20:27:21
Zie in ieder geval al wel dat  je software voor H0 is.

Als je dat al meteen ziet dan zal het programmeren van een Arduino een makkie zijn...  ;)

Het kan met elke Arduino - zolang er maar een USB snoertje aan kan.

En helpen kan altijd. Er zijn hier trouwens nog veel meer mensen met Arduinos bezig - hulp zat...  (y)
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 13 mei 2015, 21:44:19
Alvast op voorhand: ik neem aan dat ik het stukje code zo integraal kan invoeren?
Hoe, dat ga ik hopelijk wel lezen op de Arduino website.

Wat voor display heb ik nodig? Is deze (https://www.kiwi-electronics.nl/1-4cm-4-Digit-7-Segment-Display-met-I2C-Backpack-Rood?gclid=CKGf-eG6v8UCFWrJtAodmQ4A5g) bijvoorbeeld goed?

Groeten,
Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 13 mei 2015, 21:57:08
Hoi,

Het is inderdaad goed te doen met een Arduino. Zou zelf denk ik alleen een goedkoop 16*2 LCD schermpje pakken maar dan is de code voor een groot deel gewoon te gebruiken. Adafruit is leuk maar wel wat duur. Ook zou ik voor stroomdetectie gaan ipv LDR's. Dit omdat het punt van detectie dan een stuk nauwkeuriger is. Als het licht in de kamer niet gelijkmatig is dan kan een van de twee sensoren eerder onder de threshold duiken dan de andere. En iedere mm fout levert een snelheidsverschil op van bijna een km/h (uitgaande van 100km/h op 98mm in H0). Dit wordt groter naarmate de snelheid toeneemt. Natuurlijk gaat de fout omlaag als het meetstuk langer is. Ik zou zelf voor een stuk van 50cm gaan ofzo. Iedere mm fout levert dan een fout op van 0,2km/h @100km/h.

De resolutie is (op 98mm in H0) een 0,5km/h @120km/h en ruim 0,3km/h @100km/h. Dit neemt niet de onnauwkeurigheid van de code mee. Het is best makkelijk om 1 of 2 ticken van millis() te missen op deze manier waardoor je er makkelijk een km/h naast zit. Natuurlijk geldt ook hier dat een langer meetstuk nauwkeurigere resultaten oplevert. Ga je voor 500mm dan geeft iedere ms een verschil van 0,07km/h (@100km/h) (=resolutie)

Daarom heeft stroomdetectie nog een voordeel, je kan de interrupt routine gebruiken voor de tijdbepaling. Hierdoor is de kans kleiner dat er een tick van millis gemist wordt. Wil je het in een vaste baan gebruiken (heb je ergens een recht stuk van een leuke lengte) kan je de stroomdetectie in de baan delen met de Arduino en de PC.

Code is natuurlijk makkelijk aan te passen naar een schaal. Mooiste zou natuurlijk zijn dat je dit in kunt stellen. Dit is niet zo heel lastig in te bakken. En hoe kleiner de schaal hoe groter de fout per gemiste mm en hoe kleiner de fout per gemiste ms.

Let er ook op, de snelheid op iedere stap is afhankelijk van de spanning van de centrale. Gebruik je dus een andere centrale om te eiken, wees er dan zeker van dat de spanning hetzelfde staat ingesteld. En ook, als je op je baan stroomdetectie hebt, moet je hier rekening mee houden. Dit levert namelijk een spanningsval op. Deze spanningsval moet je dan ook op je eikbaan hebben (dus de wel bekende diodeschakeling op de open baan/bij gebruik van LDR's).

@Max, ik zie alleen nog één fout in je code staan. Je gebruikt na iedere analogRead een delay van 10ms. Hiermee creëer je een enorme meetfout van 10 of zelfs 20ms! Dit levert vanzelf een meetfout van 3km/h of 6km/h op! (Uitgaande van 100km/h @ 98mm) Dit vind ik nogal flink ;)

Misschien kunnen we hier samen/met z'n alle de code verder aanpassen voor verschillende schalen (menutje), verschillende displays en verschillende sensoren?

@Peter, die code kan je zo ingeven. Wel moet je nog de gebruikte libraries downloaden. Het is dus makkelijker als er even een download (met libraries) komt :) het display is prima geschikt. Zou alleen kunnen dat het adress van eht display standaard niet juist staat (weet zo even niet waar Adafruit vanuit gaat). Maar in de basis is elk display bruikbaar :) Je kan ook even op eBay (China), Banggood  (http://www.banggood.com)of DX  (http://www.dx.com)zoeken naar Arduino en display. Kost het je bij elkaar nog geen €10,- ;D


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 13 mei 2015, 22:57:58
@Peter - ja dat display is hetzelfde als die ik gebruik.

@Timo - uiteraard kunnen we met z'n allen hier wat leuks van maken. Voor meerdere schalen bv, of snelheden tot 500 km/h. Zelf heb ik niet zo'n last van die snelheidsafwijking - ik rijd niet harder dan 25 km/h...  ;D
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 13 mei 2015, 23:01:31
Oh, en wat die LDR's betreft: in de meeste recente software meet ik eerst het omgevingslicht zodat ik zeker weet hoe groot het verschil tussen licht en donker is.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 14 mei 2015, 11:56:18
Timo, ook bedankt voor je reactie.

Ik zou zelf ook het liefst voor stroomdetectie gaan; alle blokken zijn tenslotte al voorzien van een bezet-/terugmelder, ik maak gebruik van de Digitrax BDL168. Mijn huidige ijkstuk voor het meten/inregelen van de locsnelheid is 3660 mm lang. Dus als ik deze zou kunnen gebruiken -zoals je ook al aangeeft-, zal de afwijking ook maar marginaal zijn?
Overigens, doordat het meetstuk op mijn vaste baan ligt, is de gebruikte opstelling, inclusief centrale, baanspanning e.d. altijd hetzelfde.

Het zou fijn zijn als jullie samen de code nog wat kunnen finetunen.

Maar welke Arduino kan ik het best gebruiken of welke is het makkelijkst?
Ik zie namelijk ook een Arduino Uno, maar ook kleinere exemplaren zoals de Micro of de Nano.

Het downloaden van de gebruikte libraries downloaden gaat neem ik aan van de site van Aruino?
Wat bedoel je precies met ".. als er even een download (met libraries) komt.."?
Houdt dat in dat jullie (?) die maken/beschikbaar stellen?

Ga verder zoeken bij Aruino naar informatie.

In ieder geval zover bedankt.

Groeten,
Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 14 mei 2015, 12:27:43
Peter,

de libraries die nodig zijn voor de verschillende displays worden altijd geleverd door de betreffende leveranciers en zijn dus bij de prijs inbegrepen.

Zelf heb ik geen ervaring met DCC - ik rijd analoog. Zelf zou ik het liefst een snelheidsmeter bouwen die ik als een poortje over de rails kan zetten; vandaar mijn voorkeur voor een lichtsluis, al dan niet met LDR's. Maar het zal niet al te veel moeite kosten iets op te zetten wat overal voor te gebruiken is - dat is slechts een kwestie van software delen samenvoegen.

Welke Arduino is een kwestie van persoonlijke voorkeur; ik gebruik de Uno en Micro, Timo gebruikt een andere.

De gewenste resolutie is een ook een kwestie van voorkeur; dat hoeft toch niet met 3 cijfers achter de komma? Ik wilde zelf graag het verschil tussen voor en achteruit rijden kunnen zien want dat was bij sommige locs nogal fors. Dat is uiteindelijk ook gelukt.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 14 mei 2015, 14:26:02
@Max
Ik kan een orginele Arduino Uno met Adafruit display kopen, dan heb ik hetzelfde als jij en kan ik de software 1 op 1 overnemen. Maar via de tip van Timo ben ik gaan kijken en vond dit.

Als ik deze (http://www.banggood.com/UNO-R3-ATmega328P-Development-Board-For-Arduino-No-Cable-p-964163.html) koop, is dit wel het goede type omdat het een 'development-board' is?
Zie dat ik wel apart drivers moet downloaden, zal met origineel Arduino waarschijnlijk niet hoeven?
En daaraan gekoppeld  deze (http://www.banggood.com/4-Bits-Digital-Tube-LED-Display-Module-Board-For-Arduino-p-931236.html) display?
Zelf heb ik nog wel een USB kabel en een voedingsadapter.

Ik begrijp alleen nog niet goed hoe de LDR werken. Welke LDR's gebruik jij, heb je daar een nummer van?
Werken deze LDR's als er licht opvalt of juist als het licht wegvalt (dus als de trein er over rijdt)?
Moet ik deze LDR's in de baan inbouwen of kan ik ze naast de rails zetten?

@Timo
Bedankt voor de tip. Het gebruiken van stroomdetectie is voor mij nog even te moeilijk.
Ik zal al blij zijn als het werkt zoals bij Max.
Maar gaan jullie de code nog wat aanpassen om de 'fout' er uit te halen?

Als ik bovenstaande 'kloon' met display koop, moet er dan nog wat aangepast worden in de code van Max?

Misschien wat (domme) vragen maar ik ben nog maar een leek op dit gebied, maar dit is een nieuw, maar wel interessant nieuw onderwerp.

Groeten,
Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Klaas Zondervan op 14 mei 2015, 14:31:29
Je kan het ook wat simpeler aanpakken. Met die twee lichtsluizen meet je de tijd, en met behulp van een tabel maak je de vertaalslag naar snelheid. Zo'n tabel kun je handmatig uitrekenen, maar je kunt hem ook met Excel maken.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 14 mei 2015, 14:53:37
de Arduino Uno die ik gebruik is ook een kloon - alleen mijn eerste Uno was een originele. Als je al een snoertje hebt moet het werken.
Maar zo te zien moet deze eerst geinstalleerd worden - dat is bij andere klonen niet nodig? Timo?
Voor deze display geldt hetzelfde - waar is de driver (library) ?

De LDR's die ik gebruik komen bij Electronica Onderdelen Online vandaan (voorheen Dick Best) type LDR-07-62 4x5 mm en passen precies tussen m'n Peco biels. 't werkt als volgt: weinig licht veel weerstand, veel licht weinig weerstand. Dus op de Arduino ingang weinig spanning (<2v) wanneer donker en veel spanning (>3v) wanneer verlicht.

Als je een kant en klare kloon koopt en een Adafruit display kan ik je een op een helpen omdat ik dan eventuele wensen ook kan uit proberen. Dat kost misschien een paar euro meer maar dan weten we zeker dat het werkt. En dat is ook wat waard.  ;)

Er zijn geen domme vragen, alleen maar domme antwoorden, en ook ik ben maar een beginner...

@Klaas
ook ik maak gebruik van twee lichtsluizen - 100 mm bij elkaar vandaan...
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 14 mei 2015, 14:55:09
@Klaas, moet je nog steeds iets hebben dat de tijd opslaat...

@Peter, even snel antwoord want moet eigenlijk weg  :-X Zal morgen er even wat beter op in gaan maar kon het niet laten.

De Arduino is een development platform dus dat er de naam "Development Board" staat is niet zo gek ;) Maar daarmee moet het prima lukken. Dat display is op basis van een shift register zo te zien (ipv I2C) maar dat is geen enkel probleem. Heb je alleen nog wat draad, voeding, usb kabel en wat weerstanden nodig. En natuurlijk een detectie methode, welke dat ook is. Kan dus ook prima die in je baan zijn :)

Driver is altijd nodig, waar je hem ook koopt. Die op Banggood is echt prima :) Is een bordje op basis van de CH341 dus geen gezeur met FTDI drivers (http://hackaday.com/2014/10/22/watch-that-windows-update-ftdi-drivers-are-killing-fake-chips/).


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Klaas Zondervan op 14 mei 2015, 15:35:39
@Klaas, moet je nog steeds iets hebben dat de tijd opslaat...
Jawel, maar tijd meten is veel makkelijker dan snelheid bepalen.
Tijd meten kun je b.v. doen door een teller aan te sturen met een puls van 1kHz. Teller starten met de eeste lichtsluis en stoppen met de tweede.
Voor het bepalen van de snelheid moet je de afstand tussen de lichtsluizen delen door de gemeten tijd, en dat is een extra rekenslag. Die rekenslag kun je overslaan door met een tabel of een grafiek te werken.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 14 mei 2015, 15:50:01
@Klaas
Maar is de grap niet dat die Arduino dat veel sneller kan uitrekenen dan dat wij dat kunnen opzoeken?  8)
En ik heb dat ding toch al voor de snelheidsregeling en voor de stopwatch - dan kan de km/h berekening er ook nog wel bij. ;)
Bij de volgende update zet 'ie ook koffie en rolt 'ie een shaggie... (y)
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Klaas Zondervan op 14 mei 2015, 15:52:24
Max, ik denk altijd in hardware oplossingen. :)
Maar als je overweg kan met een Arduino of andere microcontroller, dan is dat rekenwerk een fluitje van een cent.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 14 mei 2015, 15:57:24
Maar 'n Excel sheet als hardware oplossing ??? ;D
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Klaas Zondervan op 14 mei 2015, 16:09:51
Die had ik verwacht.  ;D
Maar een Excel sheet maken is toch een stuk makkelijker dan een Arduino programmeren (voor mij dan).
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 14 mei 2015, 18:55:06
@Klaas,
Een Excel sheet maken is voor mij geen enkel probleem, maar ik vind zo'n electronische/stationaire oplossing een beter en vooral leuker alternatief. Dan wordt gewoon voor elke treinpassage de snelheid getoond en anders moet je steeds zelf rekenen c.q. opzoeken.
Daarbij komt dat als er nog iets gemaakt moet worden om tellers aan te sturen, schiet dat wat mij betreft z'n doel voorbij. Ik ben eigenlijk op zoek naar iets dat al bedacht en/of gebouwd is en in praktijk werkt omdat ik zelf geen verstand van heb en dit soort 'zelfbouw' projecten gewoon leuk vind.

@Timo
Bij deze (https://www.kiwi-electronics.nl/1-4cm-4-Digit-7-Segment-Display-met-I2C-Backpack-Rood?gclid=CKGf-eG6v8UCFWrJtAodmQ4A5g) staat dat die op basis van I2C is. Wat dat betekent weet ik niet, maar betekent dat wel dat ik 'm zonder problemen en rechtstreeks op het (kloon) Arduino board kan aansluiten en dat deze (https://www.kiwi-electronics.nl/1-4cm-4-Digit-7-Segment-Display-Rood) dat niet kan?

Afgezien dat die Adafruit iets duurder is, vind ik dat wanneer die zonder probleem geïnstalleerd kan worden, dat wel een groot voordeel.

@Max
Dus als ik dat development board koop (en Timo zegt dat die prima is) samen met die Adafruit display, dan kun jij me helpen en dan moet 't werken? Ik kan in de code eventueel ook de afstand aanpassen naar bv 1000 mm i.v.m. betrouwbaarheid over grotere afstand of is dat te ver? Of stel je een ander Arduino board voor?

Tja, je ziet wel: vragen, vragen en vragen  ;D

Groeten,
Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 14 mei 2015, 19:23:17
De display op basis van I2C heeft een vier draads aansluiting waarvan twee voor de voeding zodat 'ie slechts twee poorten van de Arduino nodig heeft. En met gebruik van de juiste library werkt het meteen. Voor die andere moet je zelf een interface bouwen. Uiteindelijk kosten ze dan evenveel...

Als je zo'n development board koopt met zo'n I2C display kan je mijn software meteen gebruiken plus dat ik je dan kan helpen met aanpassen aan jouw wensen. En inderdaad, als je wilt meten over 1000 mm dan kan dat. Het komt de nauwkeurigheid zeker ten goede. Of dat nodig is, is de vraag. Maar in principe kan de hele zaak aan jouw situatie worden aangepast.

Bij mij werkt het op dit moment als volgt: als ik snelheid wil meten staan er vier streepjes op de display "----", als de meting begint bij het passeren van de eerste LDR beginnen die streepjes te knipperen. Bij het passeren van de tweede LDR is de snelheid voor een aantal seconden zichtbaar als "123.4" .
Daarna worden 't weer streepjes en kan je opnieuw meten. Wil je het anders dan kan dat...

mvg,
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 14 mei 2015, 20:30:06
Oké, dus de Arduino-kloon UNO R3 ATmega328P Development Board samen met het Adafruit 1,4cm 4-Digit 7-Segment Display met I2C Backpack moet werken?
Het enige dat ik hierbij nodig heb (en ook in huis heb) is een usb-kabel en een voeding?
Dan kan ik gewoon het display aankoppelen, de software en de usb chip driver downloaden, daarna jouw code inladen en dan zou het (in principe) moeten werken?

Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 14 mei 2015, 21:08:19
Ja... ;D (en zo niet lossen we dat op).
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 14 mei 2015, 21:29:15
Zover bedankt voor de informatie en de hulp.

Je geeft aan dat het display twee poorten voor de voeding nodig heeft, maar die voeding haalt ie neem ik aan van de Arduino?
Ga nog even wat verder lezen over deze Arduino-kloon, de software en de drivers en zal daarna de spullen bestellen.
Als het binnen is en het gaat geïnstalleerd worden, dan meld ik me weer.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 14 mei 2015, 21:32:29
Inderdaad, de display wordt aangesloten op de +5v en de GND van de Arduino.

Succes.

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 15 mei 2015, 15:53:48
Hoi allen,

Gisteren stond ik met een biertje in de hand te genieten van de zon en een muziekje dus kon niet reageren. Dus bij deze dus weer verder  ;D

Allereerst even de grootste fout iets  ;D (zag niet dat Peter er twee gelinkt had) wegwerken uitleggen:
Voor die andere moet je zelf een interface bouwen. Uiteindelijk kosten ze dan evenveel...
Die op Banggood is (net als de I2C variant) ook gewoon direct aan de Arduino te koppelen. Kost je alleen 3 draadjes maar pinnen zat op zo'n Arduino. Ondanks dat ze hetzelfde display hebben stuur je ze beide iets anders aan (I2C tegen shift register), verder geen probleem. Zowel die met shift register als die met I2C hebben het genoemde display op Kiwi. Die is ook wel zo aan een Arduino te hangen (alleen weerstanden nodig) maar kost je wel heel veel pinnen. Die valt dus wel af, zeker omdat hij ook meer kost.

Omdat zo'n ding (Banggood shift register versie)  2 euro kost heb ik er gisteren gelijk eentje besteld. Beide leveren natuurlijk een prima werkende module op (vandaar mijn voorstel om de code aan te passen voor meerdere display's) maar deze is wel lekker goedkoop. ;D Ik heb al wel wat libraries gezien hiervoor maar voor de meeste is de documentatie niet heel goed. Maarja, vind ik eigenlijk ook voor alle AdaFruit libraries.

Naast Arduino (de genoemde is helemaal prima), het scherm (welke dan ook) heb je inderdaad een voeding en een USB kabel nodig. De voeding kan ook een telefoon lader (met USB) zijn. Maar je hebt ook nog wat draadjes nodig om de boel te verbinden en een manier van detectie. Dit laatste kan de huidige stroomdetectie zijn (heb je echt een losse voeding nodig), lichtsluizen of LDR's (waar je dan nog de losse onderdelen voor nodig hebt). Als je ook een stukje experimenteer printplaat (http://www.eoo-bv.nl/index.php?_a=viewProd&productId=427) (of goedkoop China (http://www.banggood.com/Double-Side-Prototype-PCB-Stripboard-Universal-Printed-Circuit-Board-p-89057.html)) pakt kan je dit mooi als sandwich op de Arduino drukken. Het aantal kabeltjes valt enorm mee. Eventueel met 2 knopjes (voor een schaal menutje) en schroefklemmen voor de detectie heb je een mooie oplossing zou ik zeggen. Maar ook zonder knoppen/menu is het makkelijk aanpasbaar te maken voor verschillende lengtes en schalen.

Wat betreft drivers, die heb je altijd nodig. De originele Arduino maakt gebruik van een FTDI chip en daar kan Windows zelf vaak de driver voor vinden. Maar na wat gedoe en hoge kosten zijn veel clones overgestapt op de CH341. Kan zijn dan Windows deze ook gewoon zelf vind, anders is de driver gewoon te vinden.

Wat betreft libraries, iedereen kan er een maken dus je kunt ze ook echt overal vinden. Maar voor jou (en eigenlijk iedereen) is het gewoon makkelijk om een complete download (zipje) te maken met alle benodigde code bij elkaar. Is het gewoon uitpakken en gaan.

Bij 25km/h zijn de gevolgen inderdaad nog wel te overzien, dan is het een fout van maximaal 0,4km/h. Maar het is toch een onnodige afwijking. De delay's kunnen er overigens zonder gevolgen uit en ben je er vanaf.

@Max, kan jij je laatste code eens plaatsen, dan gaan we die samen wat uitbouwen als universeel project :)


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 15 mei 2015, 16:14:59
Timo,

leg me dat eens uit van die display? Als ik naar de datasheet van de display kijk waar Peter naar linkt mis ik een multiplexer terwijl die wel in de beschrijving staat?   ???

Misschien heb ik fout gezien omdat ikzelf die extra pennen die nodig zijn niet over heb...  :'(

Ik zal mijn laatste code even uitgraven.

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 15 mei 2015, 16:37:57
Hoi Max,

Je bedoelt dit display (http://www.banggood.com/4-Bits-Digital-Tube-LED-Display-Module-Board-For-Arduino-p-931236.html)? Welke datasheet bedoel je dan?

Het enige wat al op die module zit is een shift register (http://www.arduino.cc/en/Reference/shiftOut). Daar zit inderdaad geen automatische multiplexer op maar daar is de Arduino zelf ook gewoon heel goed in hoor  ;D Moet de Arduino misschien iets meer doen maar de Arduino staat toch eigenlijk de hele tijd uit zijn neus te vreten  :P Enige wat je aan sluit zijn 5V, GND, Data, Clock en Latch. 3 data pinnen dus, eentje meer dan met I2C.


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 15 mei 2015, 16:54:14
Citaat
Bij deze (https://www.kiwi-electronics.nl/1-4cm-4-Digit-7-Segment-Display-met-I2C-Backpack-Rood?gclid=CKGf-eG6v8UCFWrJtAodmQ4A5g) staat dat die op basis van I2C is. Wat dat betekent weet ik niet, maar betekent dat wel dat ik 'm zonder problemen en rechtstreeks op het (kloon) Arduino board kan aansluiten en dat deze (https://www.kiwi-electronics.nl/1-4cm-4-Digit-7-Segment-Display-Rood) dat niet kan?

Afgezien dat die Adafruit iets duurder is, vind ik dat wanneer die zonder probleem geïnstalleerd kan worden, dat wel een groot voordeel.

Mijn antwoord aan Peter was op de links uit bovenstaande quote. De tweede is volgens mij een kale display met een verwijzing naar een datasheet.

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 15 mei 2015, 17:16:39
Ah, die tweede link had ik even gemist  ::) Ja, dat is alleen het kale display, wat op beide andere modules zit (zowel de shift register als de I2C). Om deze aan te sluiten heb je meer pinnen nodig en nog weerstanden enzo. Zou ik dus niet voor gaan, meer werk  ;D


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 15 mei 2015, 17:22:07
 (y) Zou je dan zo vriendelijk willen zijn bovenstaande opmerking inzake "grootste fout" even te willen aanpassen...  ;D ;D ;D

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 15 mei 2015, 18:49:50
Dank...
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 15 mei 2015, 19:17:08
Gisteren stond ik met een biertje in de hand te genieten van de zon en een muziekje dus kon niet reageren.

Dat is het betere werk  (y)

Wat betreft libraries, iedereen kan er een maken dus je kunt ze ook echt overal vinden. Maar voor jou (en eigenlijk iedereen) is het gewoon makkelijk om een complete download (zipje) te maken met alle benodigde code bij elkaar.

Vooralsnog heb ik geen idee hoe ik dat zou moeten doen; dus voorlopig probeer ik -als ik de spullen heb- gewoon de Arduino-kloon te installeren inclusief drivers en dan die voor het display. Hopelijk gaat het dan werken.

Ben ook wel benieuwd naar het verdere verloop van dit 'project'; vind het wel interessant om te volgen.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 15 mei 2015, 19:35:57
@Peter, dat is ook voor Max en mij (en iedereen die code maakt en een library gebruikt). Maakt het juist voor jouw een downloaden en gaan verhaal :)


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 15 mei 2015, 19:40:46
En aan ons de schone taak een en ander werkend af te leveren... ;)
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 15 mei 2015, 22:24:16
Ben nu toch wel erg nieuwsgierig....  ;)
Sterkte en wijsheid.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Fransx op 16 mei 2015, 21:45:29
Wat Klaas vertelde is de eenvoudigste manier, een lichtsluis A en een B,  afstand is bekend,  de tijd wordt dan vastgelegd en in Excel de omrekening van snelheid.
Het enigste verschil dat ik doe is dat ik met IR reflectie werkt, en het rekenwerk laat doen door een microcontroller, geeft dan gelijk op een display de snelheid weer. Kan in de mode HO of N en ook weergave in Km of Miles. Richting is niet bepaald, van A naar B of van B naar A, tevens in ontwikkeling op een test bok, zowel meting van A naar B, maar ook de mogelijkheid om deze meting naar koploper te sturen als zijnde bezet meldpunt A en B.

Geen Ardunio, gewoon een Pic 16F628A met een LCD display met twee IR reflectie detectors.
Daar het een onafhankelijk systeem is kan deze zowel voor digitaal als analoog worden gebruikt.

Ben op vakantie dus foto's kan ik nu niet versturen.

Groeten Frans
Titel: Re: Tonen daadwerkelijke snelheid
Bericht door: peterha op 16 mei 2015, 22:51:24
Hallo Frans,

Dat klinkt ook goed; twee lichtsluisjes heb ik nog wel.

Alleen ik wil niet steeds als de snelheid gemeten moet worden een Excelsheet erbij pakken.
Het liefst wil ik dat elke keer als er een trein voorbij rijdt, de snelheid gemeten wordt en vervolgens de snelheid op een display getoond wordt.

Ik begrijp dat jij dit ook zo hebt werken?
Hou me sterk aanbevolen om jouw oplossing te zien en te kijken of ik dat ook kan bouwen.

Fijne vakantie en ik hoop na je vakantie nog iets van je hierover te lezen.

Groeten, Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 17 mei 2015, 16:03:53
Wat Klaas vertelde is de eenvoudigste manier, een lichtsluis A en een B,  afstand is bekend,  de tijd wordt dan vastgelegd en in Excel de omrekening van snelheid.
Het enigste verschil dat ik doe is dat ik met IR reflectie werkt, en het rekenwerk laat doen door een microcontroller, geeft dan gelijk op een display de snelheid weer.
Uhm, dan ben je toch gewoon weer terug bij wat al gezegd is? Of je nu een PIC, een losse Atmel, een ARM of een Arduino pakt, dat maakt dan ook niet meer uit. En op dit moment zijn de Arduino clone boardjes (en of je het clone moet noemen is maar de vraag, iedereen mag een Arduino maken) gewoon best bang for the buck. Voor die 3 euro kan ik het zelf niet meer maken.

En of je nu lichtsluizen, IR reflectie, LDR's, stroomdetectie of drukknoppen gebruikt maakt in de basis ook niet uit. Je hebt gewoon twee inputs nodig die aangeven of de trein bij punt A of punt B is om de tijdmeting te kunnen starten/stoppen.


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Fransx op 17 mei 2015, 20:21:58
Sorry Timo, het maakt terdege uit wat je voor input gebruikt.

Stroom detectie ben je afhankelijk van blokken en je moet digitaal rijden, dus niet bruikbaar voor analoge rijders.
LDR is helemaal niet te gebruiken om de licht gevoeligheid ook reflectie met de CNY70 en daar heb ik zeker ervaring mee.
Een IR lichtsluis of reflectie kan voor elke systeem gebruikt worden, componenten zijn hetzelfde alleen iets anders in gebruik.

Kost pijs is ook voor een PIC zeer laag, wat de prijs nu is is de interface en de inputs.

Opmerking:
Wat mij het meest opvalt is dat men er veel vanuit gaat dat men stroom detectie toepast, er zijn ook andere systemen voor detectie.

IK heb de software twee jaar geleden al ontwikkeld en dacht, ik reageer weer eens, helaas, heb er nu eigenlijk geen zin meer in om hierover verder op in te gaan.
Lekker vakantie vieren en tot misschien na half juli, Frans


Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Fritsprt op 17 mei 2015, 20:39:49

Citaat
En of je nu lichtsluizen, IR reflectie, LDR's, stroomdetectie of drukknoppen gebruikt maakt in de basis ook niet uit. Je hebt gewoon twee inputs nodig die aangeven of de trein bij punt A of punt B is om de tijdmeting te kunnen starten/stoppen.

Volgens mij slaat Timo de spijker op zijn kop. Het principe is altijd hetzelfde. Om de snelheid uit te rekenen in km/h of m/s heb je altijd de tijd nodig die verstrijkt tussen die twee punten en de afstand tussen die twee punten. v=d/t

Om de snelheid van mijn Faller auto's te berekenen meette ik eenvoudig de tijd die ze er over deden om 1m af te leggen. Volgens onderstaande tabel bepaalde ik de snelheid.

Snelheidsberekening 1:87      
      
km/h   cm/s   s/m
      
30   10   10,4
50   16   6,3
80   26   3,9
100   32   3,1
120   38   2,6

Ga je het electronisch doen dan mag het duidelijk zijn dat er verschillen tussen de sensoren zijn en dat de één meer geschikt is dan de ander. En hoe nauwkeurig wil je het hebben? Het blijft hobby. En het leuke van deze hobby is dat je het zo ingewikkeld mag maken als je zelf wil.

Groet, Frits
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Fransx op 17 mei 2015, 20:49:31
Ach ja, nog even ter informatie, kan ook de meting doen op een rollerbank.

Frans
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 17 mei 2015, 21:00:12
Hoi Frans, nu moet je je niet op je teentjes getrapt voelen, zo was mijn post echt net bedoelt  (y) En als je de luxe hebt om nu vakantie te hebben dan bof je  ;) Maar het ging mij er vooral om dat je eerst Klaas aan haalt (suggestie dat het puur in hardware kan) en dan vervolgens de opmerking maakt dat je een microcontroller in de mix gegooid hebt. Dan snijdt die opmerking geen hout meer en opper je precies hetzelfde als oa Max en ik. En tuurlijk zou iedereen het op prijs stellen als je de code deelt  (y) Zou hier een universeel systeem gemaakt kunnen worden.

En wat ik zeg, welke microcontroller je dan pakt is om het even. Maar niets verslaat op dit moment een Arduino cloon bordje. Voor 3 euro is er zelf niet tegenaan te bouwen. Zelf kom ik ook van de PIC's en doe er nog regelmatig wat mee maar voor 3 euro gaat je dat niet lukken (uC, spanningsregelaar, PCB en mogelijkheid om te programmeren).

Afgezien van LDR hebben alle genoemde manieren van detectie een digitale output en maakt het geen fluit uit welke je nu uiteindelijk aan je systeem hangt. En zelfs een LDR kan op dezelfde hardware, alleen andere code en gaan. Dat is nu juist de hele grap van een microcontroller tegenover hardware.  ;D

Stroom detectie ben je afhankelijk van blokken en je moet digitaal rijden, dus niet bruikbaar voor analoge rijders.
Dat is een misvatting. Stroomdetectie is prima te gebruiken bij analoog. Tijdens het meten van een snelheid staat er constant spanning op de baan dus kan er gewoon een melding gegeven worden. Ook kan je zelf bepalen waar je zo'n detectie plaatst, blok of geen blok. Wat wel een punt is dat de meeste stroomdetectie ontwerpen maar in één polariteit werken maar dit is in de meeste ontwerpen prima op te lossen door een AC optocoupler te gebruiken.

En waarom stroomdetectie populair is in dit draadje is omdat de topic starter heeft aangegeven al stroomdetectie op zijn baan heeft liggen. Het is dan natuurlijk super makkelijk hiervan gebruik te maken. Samen met het feit dat stroomdetectie een strak gedefinieerd begin/einde aangeeft. Maar er is de hele tijd de weg vrijgehouden voor andere soorten van detectie. Zeker omdat Max zelf LDR's gebruikt. En misschien geeft dit niet de meest nauwkeurige meting, bruikbaar zijn ze, zoals Max laat zien, zeker wel.


Timo (die hier niemand wil wegjagen  ::) )
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 17 mei 2015, 22:30:52
Hallo,

@Frans,
Je gaf naar mijn mening ook een hele zinvolle bijdrage voor mij; ik realiseerde me n.a.v. jouw reactie dat ik zelf ook nog twee lichtsluisjes heb, die ik daarvoor best kan gebruiken.
En als je zegt dat je ook software daarvoor hebt, dan kan jouw oplossing toch ook prima werken? Ik ben wel benieuwd, misschien maakt de samenvoeging van al jullie software oplossingen wel een perfect product?

Naar aanleiding van een ieders bijdrage kunnen toch ook voor- en nadelen van diverse componenten besproken worden? Overigens kan en moet ieder gewoon doen wat hij (of zij) het beste acht.

Een rollenbank is statisch en misschien goed om de snelheidsstappen van een loc te bepalen, maar wat ik wil is de snelheid meten van een daadwerkelijk rijdende trein. Daar is een rollenbank niet geschikt voor.

@Timo,
Ik heb inderdaad mijn baan opgedeeld in blokken en voorzien van bezet-/terugmelders. Maar of en hoe deze dan gebruikt kunnen worden voor bedoelde snelheidsmeting weet ik niet.
Die melders worden tenslotte al gebruikt voor de terugmeldkaart BDL168. Kun je ze dan tegelijk ook nog gebruiken voor een snelheidsmeting?

Als het gebruik van LDR's minder betrouwbaar is, dan kun je toch ook een soort 'tunneltje' maken, waarbij je desnoods een lampje inbouwt, zodat er een constant, gelijk licht is en het omgevingslicht niet meer zoveel uitmaakt? Of is dat te simpel gedacht?

Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 17 mei 2015, 23:06:09
Zoals altijd leiden meerdere wegen naar Rome  ;D

LDR's zijn wat onnauwkeurig doordat je niet met zekerheid kunt zeggen wanneer (dus positie van de loc over de LDR) de LDR onder de drempelwaarde zakt. Dit doordat je niet met zekerheid kunt zeggen waar het licht vandaan komt, hoe de LDR geplaatst is en verschil in LDR's. Dit zou je wat kunnen ondervangen door kokertjes en extra lichtbronnen. Eigenlijk ga je dan naar een klassieke lichtsluis. Hoe belangrijk een nauwkeurige meting is hangt af van de lengte van het stuk spoor, de snelheid (en dus ook de schaal) en hoe belangrijk jij een fout vindt.

Manieren van detectie die ik zo even kan bedenken:
- Stroomdetectie
- IR Lichtsluis
- LDR (al dan niet als sluis)
- IR reflectie
- Reedswitches
- Hallsensoren
- Schakelaars onder de rails (lijkt me niet heel pratisch)
- Drukknoppen (krijg je dus eigenlijk gewoon een stopwatch die de snelheid geeft ipv tijd)

In de basis zijn ze allemaal gelijk => de tijd moet bepaald worden tussen twee gebeurtenissen.

Overigens is de stoomdetectie prima te gebruiken voor zowel S88 als snelheidsmeting. Je tapt de draden tussen stroomdetectie en S88 af van de blokken die je wilt gebruiken + de GND draad van de S88 bus. Die drie draden hang je aan een Arduino en je zorgt dat je deze voedt uit een losse voeding.

@Max, heb jij de laatste code nog kunnen uitgraven? Anders begin ik met aanpassen van je oudere code (vooral voor andere schermen enzo).


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 17 mei 2015, 23:22:15
Timo,
voor dat ik die code hier neer zet wil ik 't eerst even proberen.  8)
Dat kan morgenochtend na 10en. Kun je tot zolang nog even geduld hebben?  ;D

(omdat de code voor de lichtsluis onderdeel is van een groter geheel - PBM snelheidsregelaar, stopwatch, snelheidsmeter - heb ik de code even gestript)

Ook zal ik een paar LDR's plaatsen in m'n Roco ovaaltje - al is 't alleen maar om met eigen ogen te zien hoe groot de spreiding is.
Ik ben nu eenmaal dol op dingen waarvan anderen zeggen dat ze niet gaan... ;)

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 18 mei 2015, 11:39:17
Dit werkt:

(https://images.beneluxspoor.net/bnls/lichtsluis_schema.png) (https://images.beneluxspoor.net/bnls/lichtsluis_schema.png)

/*****************************************************************************
test versie: Speedometer met LDR's
*****************************************************************************/

// libraries
#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"

Adafruit_7segment display = Adafruit_7segment();

const int LDRleft       =     A0; // LDR left
const int LDRright      =     A1; // LDR right

const int Overflow      =  10000;
unsigned long curTime   =      0;
unsigned long preTime   =      0;
unsigned long runTime   =      0;

// speedometer
bool  timerRuns         =  false;
bool  fromLeft          =  false;
bool  fromRight         =  false;
bool  calcReady         =  false;
int   valLeft           =      0;
int   valRight          =      0;
int   refLight          =    511; // 0 is geheel bedekt, 1023 is vol verlicht
float distance          =     98; // afstand tussen LDR's in mm.
float scaleSpeed        =      0; // in schaal km/h.

// display schaalsnelheid
unsigned long showTime  =  5000; // tijd snelheid zichtbaar in ms
unsigned long showStart =     0;

/****************************************************************************/

void setup() {
 
  // set display
  display.begin(0x70);
  display.setBrightness(7); // 0..15
  display.writeDisplay();

  calibrateSpeedometer();

  showStart = millis();
 
} // end setup

/****************************************************************************/

void loop() {
   
   speedometer();
   displaySpeed();
 
} // end loop

/****************************************************************************/

void calibrateSpeedometer() {                            // check the light...

  valLeft  = analogRead(LDRleft);
  valRight = analogRead(LDRright);
  refLight = (valLeft + valRight) / 4;                 // helft van gemiddelde
 
  display.println(refLight);
  display.writeDisplay();

  delay(2500); 
 
  display.println(Overflow);                                // display "----"
  display.writeDisplay();
 
}

/****************************************************************************/

void speedometer() {
 
  if (calcReady) return;            // als berekening klaar is rest overslaan.

  valLeft  = analogRead(LDRleft);
  valRight = analogRead(LDRright);

  if (!timerRuns) {                                         // nog geen meting

    if (valLeft < refLight || valRight < refLight) { // links of rechts bezet?
      timerRuns = true;                                        // meting loopt
      preTime   = millis();
      runTime   = 0;
      if (valLeft  < refLight) fromLeft  = true;
      if (valRight < refLight) fromRight = true;
    }

  } else {                                           // als de meting loopt...
 
    curTime = millis();         
    runTime = curTime - preTime;
   
    if (fromLeft  && (valRight < refLight) ||
        fromRight && (valLeft  < refLight)) {              // meting ten einde
     
      // bereken schaal snelheid
      scaleSpeed = ((distance * 3600) / runTime / 1000) * 87;
      calcReady  = true;
      timerRuns  = false;
      fromLeft   = false;
      fromRight  = false;
      showStart  = millis();
    }
  }
}

/****************************************************************************/

void displaySpeed() {
 
  unsigned long timeNow = millis();

  if (timerRuns) {                         // als snelheidsmeting gaande is...
   
    if ((runTime / 100) % 2) {                            // knipperen display
      display.println(Overflow);                             // display "----"
    } else
      display.clear();                                       // display "    "
   
  } else {

    if (calcReady) {                        // als snelheidsmeting klaar is...
      if ((timeNow - showTime) < showStart) {
        display.print(scaleSpeed, 1);      // display gemeten snelheid in km/h
      } else {
        calcReady = false;
        showStart = timeNow;
        display.println(Overflow);                           // display "----"
      }
    }
  }
  display.writeDisplay();
}

/****************************************************************************/

Tijdens het opstarten lees ik even het beschikbare licht zodat ik een referentiepunt heb. Als dat klaar is zie ik "----". Na het passeren van het eerste meetpunt zie ik "----" knipperen, na het passeren van het tweede meetpunt verschijnt voor 5 sec. de snelheid in km/h als "123.4". Daarna weer "----" en kan de volgende meting plaats vinden. Als ik er met dezelfde snelheid meerdere malen overheen rij zie ik steeds hetzelfde resultaat dus met de nauwkeurigheid zal het wel meevallen...

Het lijkt me wel lollig een en ander ook eens met andere sensoren te proberen: vooral IR reflectie klinkt interessant, omdat dat ook tussen de biels zou moeten kunnen.

wordt vervolgd...
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: gvandersel op 18 mei 2015, 13:27:02
Is dat Ardiuno verplicht tegenwoordig?
Download koploper (of iTrain of RocRail) Maak twee secties van 20 cm op 80 cm afstand.
Voer beide secties in in koploper en ga je trein ijken. Je weet dan precies bij welke stap welke snelheid hoort.

Groet,

Gerard van der Sel.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 18 mei 2015, 13:56:22
Gerard, het gaat me niet om het ijken van de lokomotieven maar, zoals al meermalen aangehaald, het kijken wat de daadwerkelijke snelheid van de treinen is als ze rijden.

Ik gebruik iTrain en daarmee heb ik ook al mijn treinen geijkt voor alle 28 snelheidsstappen, zoals je ook doet in Koploper, TrainController etc.
Met Rocrail kun je je treinen zo niet ijken, maar moet je de hoogste snelheid bepalen en die via de decodersetting aanpassen aan je gewenste snelheid. Wat Rocrail wel heeft, is de mogelijkheid om in het server venster de snelheid te tonen van de trein die op dat moment door een gedefinieerd blok rijdt.

Dat kan iTrain niet, dat kan Koploper niet, dat kan Traincontroller niet en ik wil een apart iets hebben waarmee ik dat wel kan, los van het programma en ik wil dat in een display'tje getoond hebben.

Groeten, Peter.

Een van de mogelijkheden is Arduino, maar zoals Fransx ook zei, het kan ook met een PIC.
Nogmaals, het gaat me niet om het ijkproces.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: gvandersel op 18 mei 2015, 15:09:50
Dan kan het nog simpeler. Neem de "Lichtsluis van Huub Maaskant" (http://www.floodland.nl/aim/info_lichtsluis_1.htm). En laat deze de rol van de reedswitch overnemen. Lengte van een route uitrekenen en de trein deze af laten leggen.

Groet,

Gerard van der Sel.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 19 mei 2015, 17:55:51
@Gerard, en wat bepaald dan de tijd?


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: ex44 op 19 mei 2015, 18:01:28
ESU komt met een meetwagen (http://www.esu.eu/produkte/engineering-edition/messwagen-ehg-388/) (of misschien is die al wel leverbaar, dat weet ik zo niet) waar je ook allerlei dingen mee kunt meten. Schijnt ook via (een) functietoets(en) op afstand te werken.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 19 mei 2015, 18:13:38
Dat meetwagentje is best wel interessant. Jammer dat 'ie wat lang is (>40ft) en buffertjes heeft. En misschien wat onhandig op een rangeerbaantje. Maar vooral de prijs is aantrekkelijk - slechts €179...  8)

mvg

PS - ik heb nog wat software voor een stopwatch ook - indien gewenst...  (y)
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: roy1986 op 19 mei 2015, 18:48:46
Dat meetwagentje is best wel interessant. Jammer dat 'ie wat lang is (>40ft) en buffertjes heeft. En misschien wat onhandig op een rangeerbaantje. Maar ....

ESU komt met een meetwagen (http://www.esu.eu/produkte/engineering-edition/messwagen-ehg-388/) (of misschien is die al wel leverbaar, ......

Hij is al leverbaar denk ik i.v.m Dit Filmpje (https://youtu.be/0pbPXE_RpkM)

Gr Roy
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Teun60 op 19 mei 2015, 19:32:16
In elk geval geweest, ik heb mijn exemplaar sinds ergens half december. Maar op dit moment staan de 3 varianten bij die leverancier op 'reserveren'.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 19 mei 2015, 19:36:06
Maar vooral de prijs is aantrekkelijk - slechts €179...  8)
En dat is nu precies de reden waarom ik dit soort diy-projecten liever heb; eigen werk en goedkoper.

ik heb nog wat software voor een stopwatch ook - indien gewenst...
Max, zou je ook nog iets kunnen maken voor het werken met IR sensoren. Of Timo misschien? Want bij nader inzien wil ik mijn lichtsluisjes liever voor wat anders gebruiken.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 19 mei 2015, 19:38:04
@Teun60,
dan kun jij antwoord geven op de vraag of 'ie omgebouwd kan worden naar een lengte van ca. 140 mm?
Bij voorbaat hartelijk dank.

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 19 mei 2015, 19:44:07
Max, zou je ook nog iets kunnen maken voor het werken met IR sensoren. Of Timo misschien?

Er staan IR sensoren op m'n onderdelen bestellijstje en ben op dit moment zoekende naar de meest geschikte versies. Misschien dat Timo nog wat leuke tips heeft?
Want IR reflectie is mogelijk het meest interessant - die kunnen tussen de rails. Als ze tenminste werken met de meestal donkere onderzijde van het rollend materieel... ???
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Teun60 op 19 mei 2015, 19:51:27
@Max

Onmogelijk is er niets, maar het lijkt mij een uitdagende operatie. Tussen de draaistellen zit een 'gereedschapskist' en ik kan niet zien of die leeg is of niet (er zit in elk geval een schakelaar in voor ac/dc). En die kast zou moeten verdwijnen, anders krijg je de draaistellen niet dicht genoeg bijelkaar. Verder heeft het ding een redelijk gewicht en ik kan niet goed zien waar dat vandaan komt. Of anders alle techniek overbouwen naar een ander voertuig maar dat lijkt me zonde.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 19 mei 2015, 20:01:46
@Teun
Bedankt. Er moet ongeveer 124 mm tussenuit...
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Teun60 op 19 mei 2015, 20:30:08
Dat is precies de lengte van die gereedschapskist, hou je eigenlijk alleen de draaistellen over...
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 19 mei 2015, 20:35:06
En waarschijnlijk ook alle elektronica - dat gaat 'm dus niet worden - blijft over 'n Arduino... ;D
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Fransx op 19 mei 2015, 21:00:42
Hallo Max
Ooit eens een topic geopend over IR sensor reflectie, staat zelfs een filmpje op you tube, wat er nu wordt over gezegd is allang bekend.
Ben alweer verder in ontwikkelen, de reflectie sensors voor het schaduw station naast de rails en ja zichtbaar gedeelte, in de rails.
Door proefneming kan ik in het zichtbare gedeelte eerst naast de rails plaatsen en als de positie mij bevalt, dan in de rails

Trouwens terug komend op kostprijzen, Ardunio, zeker lage prijs maar ook een PIC is behoorlijk in prijs gedaald.
Een 12F629 voor 50 cent, software erin om 4 servo's te besturen en klaar is kees, (Wel een ontkoppelde DCC signaal nodig via een opto copler, maar deze is gemeenschappelijk voor meerdere schakelingen).

Nee Timo, nam je erg kwalijk de opmerkingen en wat gebeurd er, je komt met dezelfde gegevens terug over de soorten intefaces maar vergeet ook de reed kontakt dan niet.

De snelheids meting die ik gebruik geeft en blijft altijd de laatste meting aangeven en dit zolang er geen nieuwe meting is. Verder gebruik ik deze voor ijking van de locomotieven, reden is dat als bijvoorbeeld de locomotief 200Km rijd bij stap 28 de ijking voor koploper bij instelling van 100Km tot stap 14 maar gaat. Bij het bereiken van 0 naar 100Km is de snelheids toename per stap 100/14. Als ik nu van de locomotief de CV zo instelt dat deze bij 100Km stap 28 is dan zal ook bij ijking voor koploper bij 100Km een totaal van 28 stappen zijn. Nu is voor het bereiken van 0 naar 100Km de snelheids toename per stap kleiner namelijk 100/28. (In de praktijk zal ik de instelling doen voor 110Km bij 28 stappen.)
Uiteraard kan je met andere foefjes dit ook bereiken maar mijn inziens is dit de makkelijkste manier en zeker als je dit doet op een rollerbank.

Zo gebruik ik dus mijn snelheids meting.

PS. Als je de snelheids meting op een rollerbank kan toepassen zou dit ook in een wagon kunnen worden ingebouwd, zomaar een gedachte gang.

Frans

Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 19 mei 2015, 21:47:02
@Frans,

ik heb dat topic inmiddels gelezen en dat is inderdaad heel leerzaam. (y)

Maar het beantwoordt maar ten dele de oorspronkelijke vraag: namelijk wie heeft er iets eenvoudigs om de snelheid van een trein te kunnen meten.

Nu ben ik al een tijdje bezig met het knutselen aan een snelheidsregelaar met enkele schakelaar bediening (links, stop, rechts). En bij mijn toepassing heb ik ook een stopwatch nodig. En het zou wel mooi zijn als de locomotief even hard rijdt in z'n voor- en achteruit; en niet harder dan ca. 25 km/h.

En nu heb ik 'n PBM snelheidsregelaar met instelbaar optrekken en afremmen, een H-brug eindtrap, een stopwatch, meetbare en automatisch instelbare maximum snelheden in beide richtingen. Kortom: alles wat ik wil. Met een (1) Arduino. Meer heb ik niet nodig.

Dus gaan we kijken of we een bestaande schakeling voor een paar rot centen geschikt kunnen maken voor verschillende situaties. Dat moet kunnen. En zo niet bedenken we weer iets anders.

En ik heb op internet niets kunnen vinden waarmee dat in zo'n eenvoudige vorm mogelijk is, tenzij ik bereid zou zijn meerdere printen aan elkaar te knopen. Net als jij bouw ik wat ik zelf nodig heb. En het liefst zo eenvoudig mogelijk.

En als ik daar dan een ander mee kan helpen zal ik dat niet laten. Maar dat het anders kan: ja. Of het beter kan: vast wel. Goedkoper: misschien. Eenvoudiger: denk 't niet...  8)

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 20 mei 2015, 18:34:09
Beste Frans,

Ik vind het jammer dat jij je het zo aan trekt. Een persoonlijk aanval is het nooit geweest. Ik heb steeds alleen een uiteenzetting van feiten willen gegeven. En als jij iets tegen komt wat niet klopt kan je dat gewoon melden, dan wordt het aangepast. Zelfde heb ik bij Max gedaan toen ik een type display over het hoofd had gezien. Reedswitch had ik zo snel niet aan gedacht, deze heb ik dus ook toegevoegd (samen met hallsensor) maar ik heb ook nooit gezegd dat de lijst compleet is. Maar het maakt ook niet uit hoe je detectie doet voor de microcontroller. In ieder geval niets wat niet te fixen is in software (HIGH of LOW of analoog met threshold). Dus laten we alsjeblieft de strijdbijl begraven (y) Het is nooit mijn bedoeling geweest daar mee te gaan zwaaien.

Wat betreft de PIC, ik weet dat die inderdaad erg goedkoop is. En voor iets simpels als een tijdmeting prima geschikt. (y) Alleen kant-en-klare (of kit) programmers zijn dat niet. Als je een programmer hebt liggen is het daar dus ook prima goedkoop te maken. Maar de topic starter is geen hobby EL'er dus is iets op basis van een Arduino (Uno) wel zo makkelijk. Er lopen gewoon meerdere wegen naar Rome, alle met voor en nadelen.

@Rest, Ik heb geen ervaring met IR reflectie maar eigenlijk is dat hetzelfde als een lichtsluis maar is de detectie omgedraaid (detectie bij IR detectie ipv detectie bij het ontbreken van IR). Zoals Frans al aan gaf heeft hij daar eerder al mee gespeeld, dit is hier te vinden (http://hier te vinden). Daar gebruikt hij dezelfde setup (zonder het relais) als de Floodland lichtsluis schakeling. Het is goed om te zien dat iemand dus al getest heeft dat de onderkant van materieel reflecterend genoeg is voor IR.

Enige wat ik als nadeel zie van de gebruikte IS471F is de prijs van €5,- per stuk in kleine hoeveelheden. Als ik zoek naar alternatieven zijn er niet zo veel. url=https://www.pololu.com/category/79/optical-range-finders]Pololu[/url] en url=https://www.sparkfun.com/search/results?term=proximity&what=products]Sparkfun[/url] hebben wel wat maar dat zijn eigenlijk alleen maar (nog duurdere) rang finders. Je kan gewoon een IR-led met een photodiode pakken (http://arduinotronics.blogspot.nl/2012/06/reflective-optical-sensor-with.html) en deze analoog uitlezen. Of een kant en klare module (http://www.ebay.nl/itm/Infrared-reflective-Photoelectr-Switch-IR-Barrier-Line-Track-sensor-TCRT5000-M26-/121335210191?pt=LH_DefaultDomain_0&hash=item1c402460cf) gebruiken maar deze zijn beide niet gemoduleerd en weer gevoelig voor omgevingslicht. Natuurlijk zou je zelf modulatie/filtering kunnen maken maar dat is wel weer complex.

Enige simpele oplossing die ik kan bedenken is gebruik te maken van een IR data receiver (zoals gebruikt voor afstandsbedieningen) zoals bijvoorbeeld de TSOP1738 (http://www.ebay.nl/itm/10PCS-TSOP1738-1738-VISHAY-DIP-3-Modules-for-PCM-Remote-Control-NEW-T40-/290940548669?pt=LH_DefaultDomain_0&hash=item43bd68763d) (er zijn ook wel kleinere). De IR led laat je dan door de Arduino op de benodigde 38kHz (zijn ook 36kHz varianten) PWM'en. Dit is goedkoop en is ongevoelig voor (omgevings)licht. Het is alleen iets meer code in de Arduino en dus geen 100% stand alone oplossing zoals de IS471F. Of dat een probleem is moet je zelf bedenken. Dus ook bij IR reflectie (of lichtsluis) leiden er weer meerdere wegen naar Rome. ;D


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Fransx op 20 mei 2015, 21:15:33
Ok Timo, allemaal goed bedoeld en we houden het daarbij maar mijn ervarinegen op deze forum zijn niet al te positief.

Die IS471F is niet goedkoop maar als je zoekt vind je deze echt voor een lagere prijs, maar ja als je voor een loc bereid bent om € 200,- te betalen moet dit ook geen probleem zijn.
Dan de RC5 ontvanger, PIC 12F683, deze is helaas te groot, gebruik deze wel voor  handbediening MRDirect en koploper aangesloten op de bezetmeldpunten van een S88 module welke 32 ingangen heeft, zie foto:

(https://images.beneluxspoor.net/bnls/RC5_Ontvanger.jpg) (https://images.beneluxspoor.net/bnls/RC5_Ontvanger.jpg)

De zender is dan een afstands bediening voor televisie.
Ook heb ik een RC5 zender gemaakt voor de RC5 code, gebruikt de zelfde IR zenddiode als in de IR reflectie schakeling, nu met de PIC 16F628A, dit i.v.m. meerder switches.

Gaat een beetje of topic, maar ja, soms is een zijspoor ook wel eens goed.

Nog even een ander invals hoek voor snelheids meting, radar of lasergun systeem, alleen heb ik hier totaal geen kaas van gegeten, maar dan heb je geen input meer nodig van twee meet punten.

Frans

 
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 20 mei 2015, 21:44:19
Helemaal mooi Frans! En mooie old school wire wrap!  (y)

Zou je ons kunnen voorzien van een hint (of link :P ) waar de IS471F goedkoper te krijgen is (zonder er 100+ te moeten kopen)? Op eBay kan ik ze amper vinden. Farnell heeft ze wel maar niet goedkoop. Goedkoopste die ik kan vinden is Dick Best/EOO. En tja, ik heb geen €200,- over voor een loc dus ja  ;D

[edit]Ah, bij TME zijn ze met €3,16 (vanaf 5) wel iets goedkoper. Maarja, met een tientje verzendkosten moet je wel wat meer willen bestellen om het er uit te krijgen.

En ja, die ontvangers zijn allemaal iets groter. Maar je zou alleen de kop door de bielzen kunnen steker. Is hij alleen niet meer later te plaatsen. Zoals iemand ooit zei: "Elk voordeel hept zijn nadeel".  ;D

Zelf ook MRdirect gebruiker. Jammer dat de ontwikkeling beetje weg is en de site ook  :-\ Heb jij toevallig nog de laatste handleiding in pdf liggen?


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 20 mei 2015, 22:06:55
Hallo,

Mijn Arduino heb ik helaas nog niet, maar ik ben me wat aan het inlezen in de materie.

Max geeft in zijn schema met LDR's aan dat deze aangesloten moeten worden op pin A0 en A1. Dat zijn de 'ANALOG IN' pinnen.

Timo geeft aan dat ook stroomdetectie gebruikt kan worden voor input. Kunnen de draden van deze melders zo zonder meer gebruikt worden? En moeten die dan aan de 'DIGITAL' pinnen (bv ~5 en ~6) aangesloten worden?

Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: gvandersel op 21 mei 2015, 09:00:46
Peter,

Alle ingangen/uitgangen van de Arduino zijn digitaal. Bij zowat alle ingangen/uitgangen zijn als extra een bijzondere functie toegevoegd. Voorbeelden zijn analoge ingang of pwm sturing. Deze worden dan met speciale registers geactiveerd. Dus je kunt dezelfde pennen gebruiken om je stroomsensor in te lezen, je zult alleen andere functies moeten aanroepen om dat te doen.

Groet,

Gerard van der Sel.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 21 mei 2015, 09:57:39
Dat betekent dan dat ik ook A0 en A1 kan gebruiken?
Maar als ik de bestaande bezetmelders gebruik en deze aftak naar de Arduino, kom ik dan niet in de knoei omdat vanuit de bezetmelders de volle DCC spanning aangeleverd wordt?

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 21 mei 2015, 10:09:11
Dat klopt. En als de bestaande melders een andere spanning dan +5v afgeven kan er altijd een optocoupler tussen.

mvg
Titel: Re: Tonen daadwerkelijke snelheid
Bericht door: peterha op 21 mei 2015, 10:27:02
De baanspanning is 15,6 V, dus dan wordt het input-verhaal anders als bij het toepassen van LDR's.
Is voor het gebruik van de bestaande bezetmelders ook een schema te maken met optocouplers?
Ligt verder ook een beetje aan de ingewikkeldheid en de toepasbaarheid welke input methode ik uiteindelijk zal gaan gebruiken.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 21 mei 2015, 10:34:33
Maar geeft de bezetmelder de baanspanning door als 'ie bezet is? (ik gebruik zelf geen DCC)
Als je even aangeeft welke bezetmelders je wilt gebruiken kan ik het schema aanpassen.

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 21 mei 2015, 11:31:24
S88 bus werkt ook gewoon met 5V. In rust is de lijn voorzien van een pull-up op de S88 (zelfde principe als je meestal op de Arduino doet) en de stroomdetectie trekt de lijn naar GND bij bezet (active low). Kan dus gewoon prima direct aan de Arduino. Welke pin je dan pakt maakt inderdaad niet uit, kunnen dus ook A0 en A1 zijn. Andere optie is pin 2 en pin 3, deze geven een interrupt. Maar echt nodig is dat ook weer niet  ;) (gaat immers niet op microseconde, millisecondes zijn traag voor een (hedendaagse) microcontroller). Alleen om ground loops te voorkomen zou ik een losse voeding pakken.

@Peter, heb je al een Arduino en display besteld? En welke? Mijn laatste Banggood bestelling was er in 8 dagen  ;D


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: gvandersel op 21 mei 2015, 11:38:14
S88 bus werkt inderdaad met signalen naar 0V. Dit werkt echter alleen op 3 rail systemen. Linkerrail melder, rechterrail massa en middenrail voeding. Voor 2 rail zul je de bekende (van opto coupler voorziene) schakeling moeten gebruiken.
(http://people.zeelandnet.nl/zondervan/optodetector.gif)
Bron Klaas Zondervan (op forum actief) (http://people.zeelandnet.nl/zondervan/bonte%20verzameling.html#05)

Groet,

Gerard van der Sel.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 21 mei 2015, 11:42:21
Gerard, dat klopt. Maar het ging hier inderdaad al om stroomdetectie icm S88. Dat heeft Peter al op zijn baan liggen. Dus achter de stroomdetectie aftappen kan gelijk naar de Arduino.


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 21 mei 2015, 13:18:14
Max, Timo,

Voor detectie/bezetmelding gebruik ik de BDL168 van Digitrax.
Ik weet wel dat er constant zo'n 16 volt baanspanning is, zowel in de blokken waar een trein in staat als de blokken waar geen trein in staat.
Bij het binnenrijden van een trein wordt een bezetmelding doorgegeven aan de BDL168 en via de interface weer aan de computer (iTrain).

Maar hier moet ik helaas afhaken.

En aangezien Timo al terecht opmerkte: "Maar de topic starter is geen hobby EL'er ...", heb ik geen idee hoe dat (electronica-technisch) allemaal werkt, daar zal ik toch echt jullie hulp en expertise voor nodig hebben.
Het zou makkelijk zijn om de bezetmelders te gebruiken omdat die er inderdaad al liggen.

Maar de stroondetectie gaat m.b.v. de BDL168 en op de draad die vanaf een blok komt staat met gnd van de BDL168 exact 17,6 volt. Dus dan kan ik die niet gebruiken? En die optocoupler van Klaas ziet er mooi uit maar kan ik niet in elkaar zetten.
Maar wordt dan in mijn geval de zaak niet wat ingewikkeld?

Ik heb vrijdag 15 mei de UNO R3 ATmega328P Development Board For Arduino besteld en melding gekregen dat deze gelijk de 15e verstuurd is. Het Adafruit display heb ik inmiddels al binnen. Dus dan hopelijk binnen een paar dagen binnen???

Groet,
Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 21 mei 2015, 13:57:31
Peter,
net even door de handleiding gekeken en het is heel eenvoudig. Er zitten vier "External LED connectors" op de print. Die kunnen gebruikt worden om de bezetmelding door te geven aan de Arduino. Al dan niet met gebruikmaking van een optocoupler. Dat lijkt mij het veiligst. Maar misschien dat Timo daar anders over denkt.  ;D Maar dat printje van Klaas heb je in ieder geval niet nodig.
Het is overigens wel handig als je de juiste stekers hebt om in die connectors te stoppen (staan in de documentatie).

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: gvandersel op 21 mei 2015, 15:13:53
Handleiding ook net even doorgelezen. Ik verwacht 16 opto-couplers in het apparaat, gezien de 16 terugmelders in groepen van 4 voor een keerlus gebruikt kunnen worden. een van de 5 GND pennen naar de Arduino en de twee melder draden naar de ingangen.
De steker is een standaard steker, je zal op zijn hoogst wat moeite hebben met het vinden van een 2x5 versie.

Groet,

Gerard van der Sel.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 21 mei 2015, 16:47:49
Max en Gerard,

Inderdaad zitten er op de BDL168 extra aansluitingen voor externe leds.
Deze zijn gekoppeld aan elke ingang van de BDL en kunnen voor terugmelding op een extern tableau gebruikt worden. Om deze te gebruiken, had ik zelf niet aan gedacht; slim van jullie!  (y)

Ik heb net gemeten op een sectie waar een trein staat en op die pin en de gnd van de aansluiting staat + 5 Volt. Op de andere pinnen staat (uiteraard) 0 Volt. Dus die pinnen zijn  prima te gebruiken.

Het vinden van connectoren is geen probleem, het zijn standaard connectoren en die heb ik nog voldoende liggen.

Weer een stap verder in de goede richting.

Groeten,
Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: gvandersel op 22 mei 2015, 08:18:25
Beetje off topic, maar wat zijn die andere twee stekers (iets met R4X)

Groet,

Gerard van der Sel.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 22 mei 2015, 08:54:57
Gerard,

Die twee RX4 connectors zijn bedoeld voor 'RX4 Transponding Detectors'.
Hiermee wordt de positie op de baan uitgelezen als de trein met een 'Transponding Decoder' is uitgerust. Je moet dan twee RX4 ontvangers op die connectors aansluiten, onder de baan bevestigen en vervolgens ben je in staat te zien welke blokken bezet zijn en welke trein het is.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: gvandersel op 22 mei 2015, 11:26:21
Bedankt. Als ik het dus goed begrijp lijkt het dus op railcom. Maar terug on topic.
Kun je voor mij een foto van een BDL168 plaatsen (als de elektronica tenminste niet in een kast zit). Kunnen we kijken of er opto-couplers op de print zitten. Zoals ik de BDL168 begrijp zijn dit 16 schakelingen zoals aangegeven die hun meldingen op de loconet bus doen.

Groet,

Gerard van der Sel.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 22 mei 2015, 11:51:42
Gerard,

ik denk niet dat er optocouplers zijn gebruikt voor die LED uitgangen want dan had Peter geen spanning kunnen meten...

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 22 mei 2015, 12:27:50
Gerard,

Hierbij een foto van de  BDL168 (https://images.beneluxspoor.net/bnls/BDL168.jpg).

Hoop dat je deze goed kunt 'lezen'.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 22 mei 2015, 20:02:16
Kijk, dat is prima te gebruiken! Gewoon een GND draadje en dan vanaf de twee led aansluitingen die overeen komen met de juiste blokken en klaar ben je. Ik had eerder even niet bedacht dat er ook stroomdetectie met S88 (of in dit geval LocoNet) in een zijn. Maar deze is ideaal te gebruiken.  ;D

Deze uitgangen zijn niet voorzien van een opto maar dat is ook niet nodig. De stroomdetectie waarschijnlijk wel maar dat maakt niet uit. Er is een methode om een signaal eruit te krijgen. In de handleiding staat "The LED drive from the BDL168 is active high at about +5 volts above the
BDL168 ground pin, via a 1 Kohm resistor." Helemaal prima om naar de Arduino te voeren. Makkelijkste is alleen wel als de de melders die je wilt gebruiken in dezelfde zone zitten, dan heb je maar 1 stekker nodig (http://www.eoo-bv.nl/index.php?_a=viewProd&productId=14265) :). (Weet het, één rij te weinig maar de zone melding is toch nooit nodig dus is prima.) 3 draadjes erin en gaan!  ;D Okay, waarschijnlijk alleen nog 2 pull-down weerstanden nodig (aangezien ik durf te wedden dat er nu alleen een PNP transistor naar de 5V zit op die led-uitgang) en dat kunnen we prima voor je uittekenen.  ;) Dat is geen rocket science.

Ik zal morgen eens verder naar de code kijken. Heb je al wat besteld Peter?


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 22 mei 2015, 21:53:42
Ja, ik had zelf ook al het idee dat deze prima te gebruiken zou zijn: bij bezet +5 Volt en bij niet bezet 0 Volt. Volgens mij is dat perfect om pin 1 van de twee bezetmeldpinnen als start van de meting een HIGH te geven en de meting te eindigen als pin 2 HIGH is.
Dan is het een kwestie van snelheid berekenen met afstand/tijd?

Bedankt voor de link, maar ik heb zelf nog de nodige connectoren liggen en deze zijn makkelijk op maat te maken. Overigens, de melders zitten allebei in dezelfde zone, dus op dezelfde connector.

Ik heb vrijdag 15 mei de UNO R3 ATmega328P Development Board For Arduino besteld en melding gekregen dat deze gelijk de 15e verstuurd is. Het Adafruit display heb ik inmiddels al binnen. Dus dan hopelijk binnen een paar dagen binnen???

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 25 mei 2015, 08:54:07
Even een klein praktisch vraagje over de Arduino.
Als ik straks mijn Arduino heb en ik heb de (aangepaste) code/sketch ingelezen, dan kan ik  de gereden snelheid uitlezen.

Ik las dat de Arduino ook als stand-alone gebruikt kan worden.
Betekent dat dat na het (via de computer-usb kabel) inlezen van de code, ik de Arduino kan loskoppelen van de computer, daarna aansluiten op een aparte, eigen voeding en dat het dan nog steeds werkt?

En dat als ik alles afsluit en de volgende dag verder ga, ik gewoon de voeding van de Arduino kan aanzetten en dat ie 't dan weer doet?

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Fritsprt op 25 mei 2015, 10:33:44
Ja:D

Verstuurd vanaf mijn HTC One X met Tapatalk

Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 25 mei 2015, 10:42:04
Ja...  ;D
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 25 mei 2015, 11:09:48
Het wordt steeds mooier...  ;D
Nu de Arduino zelf nog.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: gvandersel op 26 mei 2015, 08:57:57
Peter,

Zowel bij de te gaan gebruiken melders als tussen stroomdetectoren zitten geen opto-couplers. Overigens interessante schakeling. Maar 1 brug voor 4 stroomdetektoren. Uitdenken hoe dat gaat. Wat betreft het aanwezig blijven van het programma: welkom in d emoderne wereld van microcontrollers.

Groet,

Gerard van der Sel.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 26 mei 2015, 09:43:14
Gerard,

De vier 'External LED Connectors' geven bij bezetmelding 5 Volt en in rust zijn ze 0 Volt. Bij elke BDL wordt een testprintje meegeleverd, dat op zo'n connector kan worden gezet. Op die tester zitten 5 smd leds (een voor de baanspanning en vier voor elke sector). Deze smd led's zijn niet voorzien van een (smd) weerstandje.

Ik kan dan toch de twee bezetmeldpunten vanaf deze connector aansluiten op de Arduino? Het is tenslotte 'maar' 5 Volt.

Wat betreft het aanwezig blijven van het programma: welkom in d emoderne wereld van microcontrollers.
Inderdaad, na wat neuzen en speuren op Internet gaat er zeker een nieuwe wereld voor mij open.

Groet,
Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: gvandersel op 26 mei 2015, 10:15:58
Ja maar zoals Timo al aangaf zijn dit vermoedelijk open collector uitgangen (sorry voor de technische term). Hierdoor zit er als het ware alleen maar een schakelaar tussen de +5 met weerstand en de LED. Hierdoor zal de spanning aan de niet 0 Volt zijde voor je meter schakelen tussen "0 volt" en 5 volt. Deze "0 volt" is eigenlijk geen spanningen geen 0 volt. Hiervoor stelt Timo om met een pulldown weerstand (wederom een technisch term) het 0 volt spanningsniveau te maken. Een gebruikelijke manier. Maar deze uitgangen zijn ideaal. Zowel voor dit doel als tijdens het ingebruik nemen, zeker als zo'n opzet printje standaard meegeleverd word zoals ik begrijp. Als toch wel een beetje luie elektronicus zou je er graag vier hebben, om de gehel schakeling in een keer te kunnen controleren.

Groet,

Gerard van der Sel.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 26 mei 2015, 10:35:11
Gerard was me eigenlijk al voor  ;D

De uitgangen hebben inderdaad geen opto-coupler maar dat is ook niet erg. Zolang een losse voeding gebruikt wordt voor de Arduino gaat dat prima.

@Gerard, je hebt toch verkeerd gekeken. Er zitten 8 bruggen op voor 16 detecties. Dat maakt het al een stuk beter te begrijpen. Ik denk dat er maar de spanningsval over 1 paar diodes (halve brug, + en - aansluiting als spanning in, de twee ~ aansluitingen voor twee blokken) gebruikt wordt voor de detectie ipv de gangbare 2 paar (hele brug). Hierna gewoon de standaard opto schakeling (ook al kan ik geen foto vinden waarop ik de IC types kan lezen).

@Peter, op de print zitten al 1k weerstanden waardoor je direct de ledjes er aan kunt hangen. Maar aangezien de Arduino geen vermogen vraagt van die uitgangen is het helemaal prima en ziet de Arduino gewoon 5V. Maar wat ik al zei, waarschijnlijk moet je nog wel een weerstand (van pak hem beet, 50k) tussen iedere uitgangen en de GND bevestigen  (zogeheten pull-down). Dit omdat de uitgangen waarschijnlijk alleen kunnen sourcen (en niet sinken) zoals dat heet.


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 26 mei 2015, 11:10:48
Als ik het goed begrijp gaan we het dus zo aansluiten:

(https://images.beneluxspoor.net/bnls/Lichtsluis_02.jpg) (https://images.beneluxspoor.net/bnls/Lichtsluis_02.jpg)

Zo ja, dan hoef ik alleen de software wat aan te passen want dan is het met drukknoppen te testen...  ;D

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: gvandersel op 26 mei 2015, 11:52:00
Zo zal het wel worden. Denk bij drukknoppen aan bounsen, alhoewel de detektie misschien door het huppelen van de wielen ook wel wat zal dansen.

Groet,

Gerard van der Sel.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 26 mei 2015, 12:01:56
Tja, hoeveel bounce er uit de Digitrax komt is even afwachten. Maar ik denk dat deze (net als de meeste stroomdetectie) al is voorzien van een soort debounce. Maar zolang je triggert op de eerste flank en dan alleen nog naar de andere input kijkt dan levert het bouncen geen probleem op.

@max, qua schema klopt het helemaal. Ik zou denk ik alleen een iets hogere waarde pakken om het spanningsdeler effect wat te verkleinen (er is namelijk nog een 1k weerstand in serie).


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 26 mei 2015, 12:08:19
@Gerard,
Per BDL-kaart wordt er 1 tester (= printje met de genoemde 5 ledjes) meegeleverd.
Inmiddels heb ik 8 kaarten en heb ik dus voldoende testers om van twee kaarten alle vier de connectoren hiervan te voorzien. Op die manier kan ik de trein (lees: alle bezetmelders) over de hele kaart volgen.
Voor het huppelen van de wielen ben ik niet zo bang en anders kan ik altijd de reactietijd op die BDL-kaart wat vertragen.

@Timo,
Ik ga voor de Arduino zeker een eigen voeding gebruiken.
M.b.t. die pull-down weerstand. Ik zie dat Max die weerstanden gekoppeld heeft aan de Arduino, maar ik ging er van uit dat die weerstanden op de uitgangen van de BDL168 gemonteerd moeten worden?
Moet ik nog een nieuwe foto maken van de BDL168, waar zaken wat duidelijker op staan?
Zo ja,van welk gedeelte dan?

@Max,
Mooi plaatje.
Maar even voor mijn duidelijkheid; is dat één puls signaal? En is die bedoeld voor beide bezetmelders/ingangen voor de Arduino?
Want (waarschijnlijk overbodige opmerking) de meting kan pas starten als beide bezetmelders/ingangen laag zijn en de meting start als bezetmelder 1 (A0) hoog wordt en eindigt als bezetmelder 2 (A1) hoog wordt.

Van electronica heb ik weinig verstand, ik kan wel een heleboel dingen volgen die jullie schrijven en ben daarom ook erg blij met jullie reacties en bijdragen. Op deze manier gaat het voor mij ook wat meer 'leven'.

Groet,
Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: gvandersel op 26 mei 2015, 12:24:43
Het enige IC wat in aanmerking komt als opto-coupler is het IC naast de DPR315. Het tweede IC aan de rechter onderkant. De tekst daarvan (alleen bovenste regel) is voldoende. Dit IC zit er overigens 2 keer op.
Wat beterft de GND of 0V. Die wordt hard verbonden. Dus de 0V van de BDL en de Arduino worden gelijk. Hierdoor is de plaats van de twee weerstanden onbelangrijk. Aangezien ze toegevoegd worden kunnen ze het beste op de arduino.
Wij elektronicie zijn lui. Als het met een plaatje kan doen we het met een plaatje. De puls hoor je eigenllijk 2x te tekenen, voor iedere ingang een. Maar de beide signaal vormen zijn gelijk dus waarom?

@Peter:
Even over de signalen. Als een trein op de sectie staat, brand dan de LED op de testprint, of is de LED dan uit?
Als de LED brand als er een trein in de sectie staat, dan is de puls zoals getekend. En de volgorde is als volgt:
A0 en A1 beide 0V: rust of meten
A0 gaat hoog: start meting
A0 is hoog: meten

A1 gaat hoog: stop meting en bereken de data
A1 hoog: Blijf data weergeven


Groet,

Gerard van der Sel.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 26 mei 2015, 12:38:04
Of je de weerstanden nu bij de BDL plaatst of de Arduino maakt niet uit. Laatste lijkt me makkelijker. In het schema van Max staan beide ingangen/blokken/signalen. Wat het misschien wat verwarrend maakt is dat Max de derde draad (de GND draad) niet getekend heeft. Deze is wel belangrijk  ;D Deze gaat naar de GND van de BDL.

Van mij hoef je op zich geen foto te maken. Mag wel als mensen het echt willen weten :p

@Max, kan je deze er nog bij tekenen?

[Edit] Gerard was weer eerder. In de handleiding staat dat de uitgang active high is (brandt als er detectie is).

Detectie is dan bijna zoals Gerard zegt alleen dan vanaf twee kanten. Als A0 eerst hoog werd dan wachten op A1. Anders andersom. Het maakt voor de snelheid niet uit welke kant op gereden word.


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 26 mei 2015, 12:58:36
Aangezien ik 1 vierpolige (of 2 tweepolige) connectoren moet maken met draden naar de Arduino, dacht ik 't lui en makkelijk op te kunnen lossen door op de connector voor de BDL twee weerstanden (een voor elke uitgang) te solderen en daarna gewoon de draden naar de Arduino te voeren. Is voor mij makkelijker  ;D
Zijn jullie het er al over eens wat de waarde van de weerstand moet zijn?

Voor de beeldvorming: ik rij op mijn baan met eenrichtingsverkeer; dus zal bij mij altijd de volgorde A0 > A1 zijn. Scheelt misschien ook weer wat programmeerwerk, althans voor mijn situatie.
Dus, zodra een trein de sectie binnenrijdt gaat de led branden en als de trein de sectie verlaat, gaat de led uit. Op de BDL is overigens nog een mogelijkheid om (ter voorkoming van valse signalen of 'denderen' van het signaal) de reactietijd wat te vertragen. Maar bij staat die op minimaal.

Dus inderdaad zoals je aangeeft:
A0 en A1 beide geen spanning: geen trein/bezetmelding in beide secties;
A0 gaat hoog: de trein rijdt de sectie binnen, dus start meting;
A1 gaat hoog: de trein verlaat deze sectie en gaat de volgende sectie binnen: stop meting.

Hoe lang A0 of A1 hoog blijven is m.i. niet belangrijk. Als er een heeeeele lang trein in dat blok rijdt (die heb ik overigens niet) kan in theorie zowel A0 alsook A1 hoog zijn.
Maar een gegeven moment is de trein beide blokken uit en zijn beide melders dus weer laag en kan een nieuwe meting beginnen.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 26 mei 2015, 13:14:19
U vraagt, wij draaien...

(https://images.beneluxspoor.net/bnls/Lichtsluis_03.jpg) (https://images.beneluxspoor.net/bnls/Lichtsluis_03.jpg)

Dender is geen probleem want de software reageert op de eerste flank.

Peter had al gemeten dat vrij laag is en bezet hoog dus heb ik de software even aangepast:

Dit werkt (met drukknoppen):

/*****************************************************************************
test versie: Speedometer tbv Peter
*****************************************************************************/

// libraries
#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"

Adafruit_7segment display = Adafruit_7segment();

const int LDRleft       =     A0; // LDR left
const int LDRright      =     A1; // LDR right

const int Overflow      =  10000;
unsigned long curTime   =      0;
unsigned long preTime   =      0;
unsigned long runTime   =      0;

// speedometer
bool  timerRuns         =  false;
bool  fromLeft          =  false;
bool  fromRight         =  false;
bool  calcReady         =  false;
int   valLeft           =      0;
int   valRight          =      0;
int   refLight          =    511; // 0 is uit, 1023 is aan
float distance          =     98; // afstand tussen meetpunten in mm.
float scaleSpeed        =      0; // in schaal km/h.

// display schaalsnelheid
unsigned long showTime  =  5000; // tijd snelheid zichtbaar in ms
unsigned long showStart =     0;

/****************************************************************************/

void setup() {
 
  // set display
  display.begin(0x70);
  display.setBrightness(7); // 0..15
  display.writeDisplay();

  showStart = millis();
 
} // end setup

/****************************************************************************/

void loop() {
   
   speedometer();
   displaySpeed();
 
} // end loop

/****************************************************************************/

void speedometer() {
 
  if (calcReady) return;            // als berekening klaar is rest overslaan.

  valLeft  = analogRead(LDRleft);
  valRight = analogRead(LDRright);

  if (!timerRuns) {                                         // nog geen meting

    if (valLeft > refLight || valRight > refLight) { // links of rechts bezet?
      timerRuns = true;                                        // meting loopt
      preTime   = millis();
      runTime   = 0;
      if (valLeft  > refLight) fromLeft  = true;
      if (valRight > refLight) fromRight = true;
    }

  } else {                                           // als de meting loopt...
 
    curTime = millis();         
    runTime = curTime - preTime;
   
    if (fromLeft  && (valRight > refLight) ||
        fromRight && (valLeft  > refLight)) {              // meting ten einde
     
      // bereken schaal snelheid
      scaleSpeed = ((distance * 3600) / runTime / 1000) * 87;
      calcReady  = true;
      timerRuns  = false;
      fromLeft   = false;
      fromRight  = false;
      showStart  = millis();
    }
  }
}

/****************************************************************************/

void displaySpeed() {
 
  unsigned long timeNow = millis();

  if (timerRuns) {                         // als snelheidsmeting gaande is...
   
    if ((runTime / 100) % 2) {                            // knipperen display
      display.println(Overflow);                             // display "----"
    } else
      display.clear();                                       // display "    "
   
  } else {

    if (calcReady) {                        // als snelheidsmeting klaar is...
      if ((timeNow - showTime) < showStart) {
        display.print(scaleSpeed, 1);      // display gemeten snelheid in km/h
      } else {
        calcReady = false;
        showStart = timeNow;
        display.println(Overflow);                           // display "----"
      }
    }
  }
  display.writeDisplay();
}

/****************************************************************************/

Als ik zin heb zal ik de naamgeving even aanpassen aan Peter's situatie...  8)

mvg

Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 26 mei 2015, 13:22:33
Dus inderdaad zoals je aangeeft:
A0 en A1 beide geen spanning: geen trein/bezetmelding in beide secties;
A0 gaat hoog: de trein rijdt de sectie binnen, dus start meting;
A1 gaat hoog: de trein verlaat deze sectie en gaat de volgende sectie binnen: stop meting.

Hoe lang A0 of A1 hoog blijven is m.i. niet belangrijk. Als er een heeeeele lang trein in dat blok rijdt (die heb ik overigens niet) kan in theorie zowel A0 alsook A1 hoog zijn.
Maar een gegeven moment is de trein beide blokken uit en zijn beide melders dus weer laag en kan een nieuwe meting beginnen.

En dankzij het gebruik van software is het altijd mogelijk het een en ander aan te passen aan de situatie. Denk aan het missen van een detectie, lengte van het meettraject, snelheid zichtbaar tijd, automatische reset. Aanpassen is geen probleem - (bijna) alles kan...

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: gvandersel op 26 mei 2015, 13:45:15
Max,

De regel:
scaleSpeed = ((distance * 3600) / runTime / 1000) * 87;
is voor Peter volledig valide. Voor een modelspoorder is het handiger als de 87 een constante wordt.
Ik als N rijder kan hier dan 160 invullen, die dan automatisch via compileren goed gezet wordt.

Vraag van een niet Arduino bezitter:
Doet analogRead(A0) een digitale read?

Groet,

Gerard van der Sel.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 26 mei 2015, 13:50:58
 ;D Zojuist is dan eindelijk mijn Arduino binnengekomen  ;D

Software + drivers geïnstalleerd, Arduino aangesloten en warempel: het werkt!
Eerst maar wat van de voorbeelden proberen, ik heb in ieder geval de 'Blink-sketch' laten werken  (y)

Volgende stap is het Adafruit display aansluiten.

@Max,
Ik zal de variabele 'distance' aanpassen aan mijn situatie, nl. 3660 mm.
En als ik de weerstanden aanbreng en de verbinding van de BDL naar de Arduino, zou het moeten werken?

@Gerard,
Ik was zelf van plan om de schaal en de omreken factoren voor tijd en mm>km als algemene variabelen te definiëren.

Ga meteen aan de slag. Weerstanden 47k heb ik al klaarliggen.

Wordt vervolgd.....

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 26 mei 2015, 13:54:03
De regel:
scaleSpeed = ((distance * 3600) / runTime / 1000) * 87;
is voor Peter volledig valide. Voor een modelspoorder is het handiger als de 87 een constante wordt.
Ik als N rijder kan hier dan 160 invullen, die dan automatisch via compileren goed gezet wordt.

Uiteraard is een constante beter - ik heb er nooit aan gedacht om het voor meerdere schalen geschikt te maken. Uiteraard kan het ook met een schakelaar of dipswitch - dan zijn meerdere schalen mogelijk.

Citaat
Vraag van een niet Arduino bezitter:
Doet analogRead(A0) een digitale read?

Ja - het zet een analoge waarde van 0 tot 5 volt om in een digitale waarde van 0 tot 1023.

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 26 mei 2015, 13:58:03
Ik zal de variabele 'distance' aanpassen aan mijn situatie, nl. 3660 mm.
En als ik de weerstanden aanbreng en de verbinding van de BDL naar de Arduino, zou het moeten werken?

Ja - succes  (y)

en zoniet - we zijn staande bij... 8)

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: gvandersel op 26 mei 2015, 14:07:27
Max,

Wat ik bedoel te vragen is:
Op A0/A1 ziiten geen LDR schakelingen meer. Je laat nu gewoon een digitale situatie omzetten naar analoog en dan verwerken. Het werkt, maar is "duurder".

Groet,

Gerard van der Sel.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 26 mei 2015, 14:29:34
Gerard,

dat klopt; maar het is wel universeel. Ik wil namelijk ook nog iets proberen met IR sluizen en IR reflectie. Met een beetje mazzel kan ik het met een schakeling af.

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Fritsprt op 26 mei 2015, 14:39:34
@ Gerard
Citaat
Doet analogRead(A0) een digitale read?
Zoals de naam al zegt leest analogRead(A0) de analoge waarde van A0. Je kunt A0 overigens gewoon als digitale input gebruiken door digitalRead(A0) te doen. De Arduino (Uno) heeft 14 digitale in- en uitgangen (0 - 13) en 6 (A0 - A5) analoge ingangen. Je kan A0 -A5 zefs gewoon doortellen vanaf 14. M.a.w. A0 = 14, A1 = 15 enz.
Dus digitalRead(14) geeft de digitale waarde van A0

groet Frits
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 26 mei 2015, 14:51:16
Max, nog even een vraagje voor ik het display verkeerd aansluit en verknal.

Op het Adafruit display zitten 4 aansluitingen: SCL, SDA, GND en VCC
In jouw schema staat het display aangesloten op pinnen: +5V, A4, A5 en GND.
+5V=VCC, GND=GND, dat is niet moeilijk; maar waar gaan SCL en SDA naar toe van A4 en A5?
Op de website vind ik het niet.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 26 mei 2015, 15:01:00
Peter,
op de andere kant van de print staan de tekens die ik gebruikt heb:

SCL = C = A5 (clock)
SDA = D = A4 (data)
GND = -
VCC = +

Hier is een link: https://learn.adafruit.com/adafruit-led-backpack/0-dot-56-seven-segment-backpack (https://learn.adafruit.com/adafruit-led-backpack/0-dot-56-seven-segment-backpack)

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 26 mei 2015, 18:50:51
Het werkt...... (bijna)  :-\

Max, nu zie en snap ik het. Bedankt voor de link; die had ik zo gauw niet gevonden, maar heb 'm wel opgeslagen.
Het was overigens nog even een gepuzzel met de libraries van het Adafruit display, maar uiteindelijk is ook dat voor elkaar gekomen en was het geheel (Arduino + display) tot leven gekomen.

De aansluitingen van de bezetmelders van de BDL168 aangesloten en testen maar...

Er zit wel wat vreemds in; als een trein de eerste bezetmelder activeert, verschijnt er een snelheid van 13 - 15 km in het display. Het display gaat daarna weer knipperen, om vervolgens de 'uiteindelijke' snelheid weer te geven. Echter, deze is 2x zo hoog als de werkelijke snelheid!

Als ik via iTrain een snelheidsmeting doe, dan kom ik uit op een snelheid van 112,4 km/u, terwijl de display een snelheid aangeeft van 223,4 km/u.

Ik zal zelf ook nog de software bekijken om te zien of ik wat kan vinden (zal wel niet...), maar vooralsnog ben ik erg blij met al jullie inbreng, zodat nu het geheel werkt; de melders worden geactiveerd en een snelheid wordt gemeten. Dus dat functioneert, verder is het misschien wat finetunen van de software. De brightness van het display heb ik al wat lager gezet. Het knipperen zou ik graag nog wat willen aanpassen.

Ik had al eerder willen antwoorden, maar tegen vijf uur kwam de Ziggo monteur om mijn nieuwe Horizon box te installeren en daarna werd er geroepen: "Aan tafel..."  ;D
Dus dat ging even voor.

Maar ga nu weer lekker verder met experimenteren.

Groeten,
Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 26 mei 2015, 19:42:50
Peter,
mooi dat 't werkt - een goed begin enz.  (y)

Nu even zorgen dat 't goed werkt...  ;)

Even voor de duidelijkheid; de volgorde zou als volgt moeten zijn:

stap 1: het display toont "----"
stap 2: eerste melding, display toont knipperend "----"
stap 3: tweede melding, display toont snelheid "123.4"
stap 4: na 5 seconden toont het display weer "----"

Gebruik eventueel de reset op de Arduino om te wissen alvorens te meten.

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 26 mei 2015, 19:53:29
Max,

Wat er nu aan de hand is, weet ik niet maar het display toont nu helemaal niets meer.
Ik had de computer en de Arduino weer opnieuw aangezet en ook nog gereset, maar het display is nu levenloos.

Voor het eten deed ie 't wel, kon ik ook de sketch van Adafruit laden en werden alle elementen van het display aangestuurd. Leuk om te zien trouwens.
Met de metingen had ik geen 'vast' display "----", maar knipperende streepjes, zowel voor, tijdens als na de meting.
Dus misschien is het display stuk? Kan ik dat testen?

Sorry, maar nu gaat het even niet zoals ik wil.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 26 mei 2015, 20:26:24
Peter,

ben even aan het uitzoeken wat dat kan zijn - ik kom er straks op terug...

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 26 mei 2015, 20:56:10
Max,

Het display doet het toch wel, alleen kan ik het gedrag nog niet verklaren of begrijpen.

De ene keer doet het display het wel nadat ik de usb kabel eruit gehaald heb of alles afgesloten heb, de andere keer niet.
In ieder geval niet nadat ik de software geüpload heb en daarna de zaak heb afgesloten en weer opnieuw opgestart heb. Ik had verwacht dat alles in de vorige staat zou zijn en werken. Dus dit moet ik nog even uitvogelen.

Wanneer het display na opstart niets toont, gaat het wel knipperen nadat bezetmelder 1 geactiveerd is en blijft dan ook wel 'aan'.

Wat ik nu ervaar is dat als bm1 en bm2 niet actief zijn, het display knippert; is geen vast "----". Wanneer de loc over het begin van de sectie is, wordt een snelheid getoond, bv 16,4 km. Vervolgens komen de wagons, knippert het display en nadat de loc bm2 heeft geactiveerd, wordt de snelheid getoond.

Dus:
- knipperen "----"
- bm1 actief
- loc erover => snelheid 18,7 km
- knipperen "----"
- bm2 actief => 209 km
- vast "----"
- knipperen "----"
Zoals jij in je antwoord #121 schrijft, dit is precies zoals ik 't ook zou willen.

Ik zag dat een keer de door iTrain gemeten snelheid en die van de Arduino heel dicht bij elkaar lagen (2 km verschil), andere keren zijn de snelheden bv. (iTrain) 108 km en (Arduino) 208 km.

Ik wil zelf eerst ook nog kijken of dit misschien ligt aan het feit of maar een kant van de wagons gedetecteerd worden (misschien moeten wel alle assen?) of dat ik de reactietijd van de BDL168 wat moet verhogen, zodat die bm niet te snel laag gaat.

Maar dat vergt wat meer tijd. Ben in ieder geval erg blij met de ondersteuning.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 26 mei 2015, 21:08:12
Peter,

je moet maar denken dat dit onder de kinderziektes valt...

Helaas heb ik vanmorgen mijn proefopstelling uit elkaar getrokken om iets anders te doen met mijn Uno.
Maar ik zal een proefopstelling maken die jouw situatie nabootst zodat ik mee kan kijken.
Ik kom hier uiterlijk morgenochtend op terug.

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 26 mei 2015, 22:05:20
Peter,

even een vraag: hoe voedt je de Arduino tijdens het testen?

Heb net de schakeling opnieuw opgebouwd en gebruik drukknoppen ipv bezetmelders.

Inderdaad start af en toe de Arduino zonder dat de display iets weergeeft. Dat zit in de interne timing en is inmiddels opgelost.

Verder werkt hier alles zoals gewenst.

We kunnen de serieele monitor gebruiken om te kijken of je de juiste signalen binnen krijgt maar dan moet de Arduino tijdens het testen aan het USB-snoertje.


mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 26 mei 2015, 22:27:56
Max,

Als we samen de kinderziektes er uit kunnen halen, is dat toch mooi? Voor mij geen bezwaar, alleen denk ik altijd -als het niet goed werkt- dat het aan mij ligt  8).

Ik ben begonnen met de aansluiting via usb omdat ik ook met het programmaatje van Adafruit het display wilde testen.
Maar ik heb de Arduino ook aan de 12 Volt voeding gehad en in beide gevallen was het dat wanneer ik de usb of de 12 volt voeding er af haalde en daarna weer aansloot, het display niet mee opstartte.

Geen probleem om de seriële monitor te gebruiken,  alleen zal dan de code aangepast moeten worden  ;D.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 26 mei 2015, 22:37:34
Peter,
dat is de juiste instelling. ;D Als er iets niet werkt weet ik zeker dat ik het verkeerd gedaan heb. 8)

Dit is de aangepaste code die hier werkt en gebruik de monitor om mee te kijken:

/*****************************************************************************
test versie: Speedometer tbv Peter
*****************************************************************************/

// libraries
#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"

Adafruit_7segment display = Adafruit_7segment();

const int LDRleft       =     A0; // LDR left
const int LDRright      =     A1; // LDR right

const int Overflow      =  10000;
unsigned long curTime   =      0;
unsigned long preTime   =      0;
unsigned long runTime   =      0;

// speedometer
bool  timerRuns         =  false;
bool  fromLeft          =  false;
bool  fromRight         =  false;
bool  calcReady         =  false;
int   valLeft           =      0;
int   valRight          =      0;
int   refLight          =    511; // 0 is uit, 1023 is aan
float distance          =     98; // afstand tussen meetpunten in mm.
float scaleSpeed        =      0; // in schaal km/h.

// display schaalsnelheid
unsigned long showTime  =  5000; // tijd snelheid zichtbaar in ms
unsigned long showStart =     0;

/****************************************************************************/

void setup() {
 
  // set display
  display.begin(0x70);
  display.setBrightness(7); // 0..15
  display.writeDisplay();

  Serial.begin(9600);
  Serial.println("Check inputs");
 
  showStart = millis();
 
  display.println(Overflow);                             // display "----"
 
} // end setup

/****************************************************************************/

void loop() {
   
   speedometer();
   displaySpeed();
 
} // end loop

/****************************************************************************/

void speedometer() {
 
  if (calcReady) return;            // als berekening klaar is rest overslaan.

  valLeft  = analogRead(LDRleft);
  valRight = analogRead(LDRright);

  if (!timerRuns) {                                         // nog geen meting

    if (valLeft > refLight || valRight > refLight) { // links of rechts bezet?
      timerRuns = true;                                        // meting loopt
      preTime   = millis();
      runTime   = 0;
      if (valLeft  > refLight) fromLeft  = true;
      if (valRight > refLight) fromRight = true;
     
      Serial.print("start left   = "); Serial.println(valLeft);
      Serial.print("start right  = "); Serial.println(valRight);
    }

  } else {                                           // als de meting loopt...
 
    curTime = millis();         
    runTime = curTime - preTime;
   
    if (fromLeft  && (valRight > refLight) ||
        fromRight && (valLeft  > refLight)) {              // meting ten einde
     
      // bereken schaal snelheid
      scaleSpeed = ((distance * 3600) / runTime / 1000) * 87;
      calcReady  = true;
      timerRuns  = false;
      fromLeft   = false;
      fromRight  = false;
      showStart  = millis();
     
      Serial.print("finish left  = "); Serial.println(valLeft);
      Serial.print("finish right = "); Serial.println(valRight);
      Serial.print("scale speed  = "); Serial.println(scaleSpeed, 1);
    }
  }
}

/****************************************************************************/

void displaySpeed() {
 
  unsigned long timeNow = millis();

  if (timerRuns) {                         // als snelheidsmeting gaande is...
   
    if ((runTime / 100) % 2) {                            // knipperen display
      display.println(Overflow);                             // display "----"
    } else
      display.clear();                                       // display "    "
   
  } else {

    if (calcReady) {                        // als snelheidsmeting klaar is...
      if ((timeNow - showTime) < showStart) {
        display.print(scaleSpeed, 1);      // display gemeten snelheid in km/h
      } else {
        calcReady = false;
        showStart = timeNow;
        display.println(Overflow);                           // display "----"
      }
    }
  }
  display.writeDisplay();
}

/****************************************************************************/

Hoop doet leven...  ;D

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 26 mei 2015, 22:42:44
Bedankt, ik ga morgenochtend gelijk testen.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Biesje op 27 mei 2015, 01:14:41
Zomaar even tussendoor: ik heb al jaren een Fleischmann tachowagen. Het is eigenlijk gewoon een fietscomputer met wat speciale instellingen. Nadeel is dat het lastig is om op het ding te kijken als het voorbij zoeft. Er zijn natuurlijk ergere problemen in de wereld, het werkt perfect voor mijn doeleinden om treinstellen en loks een realistische snelheid te geven.

Er zijn ook draadloze fietscomputertjes met een sensor op het wiel die dus draadloos verbinding maakt met het schermpje. Met andere woorden: er zijn wellicht fietscomputertjes waar we de sensor in een wagen of rijtuig kunnen bouwen en het display gewoon stationair kan blijven :) Dit hangt verder natuurlijk af van het bereik van het zendertje maar dat kan wellicht stiekum opgevoerd worden? Grotere antennes/meer prik/antimaterie reactoren, kies maar  (y)

Mvg,

Robert
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 27 mei 2015, 10:09:13
Hallo Max,

Hier even kort wat bevindingen van vanmorgen.
Nadat ik de baan en de Arduino en de seriele monitor had opgestart, knipperde het display.
meting:
loc activeerde bm1 > snelheid 5,6 km
loc in sectie > display knipperen
bm2 actief > snelheid 188,6 km, iTrain 102,6 km
display even vast, daarna knipperen.

meting:
knipperen
bm1 actief > 13,1 km
loc in sectie > knipperen
bm2 actief > snelheid 198,3 km, iTrain 105,6 km
display even vast, daarna knipperen.

meting:
knipperen
bm1 actief > 11,5 km
loc in sectie . knipperen
bm2 actief > snelheid 198,2 km, iTrain 105,6 km
display even vast, daarna knipperen.

Daarna weer een nieuwe meting gedaan en de monitor resultaten staan in Meting.txt
knipperen
bm1 actief > 9,6 km
meting = 198,3 km, iTrain = 105,6 km

knipperen
bm1 actief > 12,1 km
meting = 198,1 km, iTrain = 105,6 km

Daarna weer een nieuwe meting gedaan en de monitor resultaten staan in Handmatig.txt
Ik heb een loc voor de sectie van bm1 gezet, vervolgens handmatig met een as in bm1 laten staan, blijft permanent meten (scale speed = 382104,0 km
Daarna loc uit bm1 gehaald

Opnieuw loc met 1 as bm1 geactiveerd en daarna meteen weer terug, dus bm1 niet meer actief:
snelheid 24,3 km

Ik verwacht niet dat het te maken heeft met reactie instellingen van de BDL168 kaart.
Dit 'rare' gedrag doet zich voor zodra bm1 geactiveerd wordt?

Kun jij wat wijs worden uit bovenstaande bevindingen?
Ik kan de twee tekstbestanden niet bijvoegen en heb ze maar via een pb naar je gestuurd.

Groet,
Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 27 mei 2015, 10:31:49
Peter,
het probleem zit 'm meteen al in het begin. Als beide meldingen onbezet zijn en de Arduino wordt gereset (met de reset knop) hoort het display niet te knipperen. Dat 'ie wel knippert betekent dat de meting is gestart door een van de twee melders.
Wat me opvalt in het tekst bestand is dat bij start links en rechts soms beide getallen hoog zijn (>511) - dat zou niet moeten kunnen als maar een van de twee melders bezet is.  ???

Het lijkt erop dat de ingangen van de Arduino  soms "fladderen" - dwz onbepaald zijn. Weet je zeker dat alle aansluitingen goed vastzitten? Bij mij wil hetzelfde wel eens gebeuren als mijn testbordje slecht kontakt maakt.

Je hebt een test display voor dat bord; als je die er op zet tijdens het rijden zie je dan iets vreemds? Oplichtende leds als dat niet moet?

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 27 mei 2015, 10:52:11
Voor alle duidelijkheid even het schema van de schakeling waarmee ik test:

(https://images.beneluxspoor.net/bnls/Lichtsluis_04.jpg) (https://images.beneluxspoor.net/bnls/Lichtsluis_04.jpg)

Voeding via de USB kabel vanaf m'n PC.

Dit staat als een huis... 8)

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 27 mei 2015, 13:24:08
Wat kun jij een mooie schema's maken  (y)

Vanmorgen even een boodschap gedaan, de hond uitgelaten en onderwijl wat nagedacht.
Je gaf aan dat het er op leek dat een van de melders gestart/actief was. Dat kon niet anders zijn dan dat de weerstanden een bezetmelding genereerden. Eerst alle draden en aansluitingen gecontroleerd, getest met het testprintje; alles werkte normaal.

Toen eerst de weerstanden verwijderd, alles opnieuw aangesloten en daarna de zaak opnieuw opgestart.
Eureka! Het display knipperde niet maar stond vast met "----".
Daarna een drietal metingen gedaan, deze metingen gaven goede hoop, want het ging: streepjes vast, meting streepjes knipperen, meting gedaan=snelheid, streepjes knipperen, blok uit=streepjes vast.
De metingen gaven aan: 1e meting=104,9km iTrain=104,1km, 2e meting=106,3km, iTrain=105,6km, 3e meting=109,3km, iTrain=108,5km. Prima toch?

Echter daarna ging het toch weer anders.
Na de reset bleven de streepjes vast, meting begon>knipperen>meting112,7km>knipperen>blok uit, dus bm2 niet meer bezet, maar bleef knipperen. Volgende ronde: streepjes nog steeds knipperen>meting=18,1km>knipperen>meting=18,1km>knipperen>221,4km.

Weer een reset gedaan en de resultaten via de monitor in bestand GeenWeerstand.txt gedaan:
streepjes vast>meting=knipperen>111,0km>knipperen>blok uit>blijft knipperen>meting=18,1km>knipperen, 221,4km>knipperen>meting=18,2km>knipperen>meting=228,2km>knipperen> etc.

Het heeft dus even goed gedaan en daarna weer niet. Tijdens deze metingen heb ik de Arduino gewoon aangesloten gehad op de USB kabel. Hoop dat alles weer/nog steeds duidelijk is.
Kun jij er nog wat van bakken?

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 27 mei 2015, 13:45:13
Het komt volgens mij omdat de ingangssignalen af en toe niet duidelijk genoeg gedefinieerd zijn. Waarom weet ik nog niet.
Als ik het goed heb gebruik je weerstanden van 47k - kan je er paar van 10k in solderen? Die maken mogelijk het signaal voor de Arduino wat harder.

Hoe lang doet je trein er over het blok te passeren ??? Als dat langer duurt dan de tijd dat de snelheid wordt weergeven wordt mogelijk de meting opnieuw gestart. De display tijd staat op dit moment op 5 seconden (5000 ms). Na afloop van die tijd dienen alle twee de melders vrij te zijn.

Je vertelde dat de afstand tussen melding 1 en melding 2 ongeveer 3500 mm is. Hoe groot is de afstand tussen melding 2 en melding 1  ???

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 27 mei 2015, 14:17:30
Ik gebruikte inderdaad 47k, ik zal er vanmiddag 10k in solderen.

Bij een snelheid van 100 à 110 km doet de trein er 10 - 12 seconden over om het meetblok (= blok6 = 3660 mm) door te rijden. Bij actief worden van bm2 = inrijden blok 7 dient de meting te stoppen; blok 7 is ook 3660 mm lang. Ergo, na ook zo'n 12 seconden gaat bm2 uit/laag.

Wat bedoel je met "..afstand tussen melding 2 en melding 1.."?
De afstand tussen melding 1 en melding 2 is 3660 mm en aangezien ik maar een richting op rij, is er geen meting c.q. melding van melding 2 naar melding 1.

Of bedoel je daarmee de hele baan rond? Het traject waarin blok 6 zit, bestaat uit 8 blokken [1 t/m 8]. De afstand van begin blok 7 + blok 8 + blok 1 + blok 2 + blok 3 + blok 4 + blok 5 is in totaal 22590 mm.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 27 mei 2015, 15:05:42
Dus er is een moment waarop beide blokken bezet gemeld worden; namelijk als de locomotief van het ene blok in het andere rijdt. Dat is het moment waarop de invoer fladdert. Zijn er wagens met geleidende assen die eventueel voor valse meldingen kunnen zorgen ???

Op dit moment meten we de opgaande flank van het signaal. Op de blokgrens komen die van twee blokken. Dus of we moeten de tijdsduur van het signaal meten, maar dat heeft als nadeel dat de lengte van de locomotief meetelt of we moeten een blok overslaan.

Probeer het eens als volgt: eerste melding van blok 6, tweede melding van blok 8. Als het tussenliggende blok 7 langer is dan de trein krijgen we gescheiden meldingen die elkaar niet overlappen. Dan zou het goed moeten gaan...  8)

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 27 mei 2015, 15:20:41
Ik heb ondertussen de weerstanden van 10K er tussen gedaan, maar dat biedt ook geen soelaas.
Alleen bij het opstarten en/of resetten van de Arduino blijven de streepjes vast, maar zodra een meting gestart is en de streepjes gaan knipperen, blijven ze knipperen en komt er dus ook geen goede melding.

Juist om te voorkomen dat wagons bij meldingen c.q. blokovergangen roet in het eten gooien, heb ik de vorige (en ook deze) testen uitgevoerd met alleen de loc; dus niets erachter.

En het is juist dat bezetmelders 1 en 2 tegelijk branden/actief zijn wanneer de loc over deze blokscheiding rijdt.

Ga je suggestie even proberen door de tweede melder een positie/blok op te schuiven.
Wordt vervolgd  ;D
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 27 mei 2015, 15:26:37
Het heeft even geduurd maar  ik denk dat 't muntje is gevallen...  ::)

Het eerste signaal duurt 10 seconden (blok 6)
Het tweede signaal duurt ook 10 seconden (blok 7)
Na de opgaande flank van blok 7 laat het display 5 seconden de snelheid zien.
En dan is het tweede signaal nog niet weg en start de meting opnieuw - maar nu vanaf de andere kant.
En eindigt de meting met het opnieuw inrijden van blok 6...

Dus moet je de display tijd verhogen - maak 'm langer dan de rijtijd door blok 7 - dus pakweg zo'n 15 seconden.
Door de variabele showtime van 5000 te veranderen in 15000.

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 27 mei 2015, 15:54:20
Ik ga dat straks proberen, maar ondertussen was ik aan het testen met je vorige opmerkingen.

Ik heb de signaaldraad een melder opgeschoven en de meetafstand dienovereenkomstig verlengd, maar ondanks dat na het opstarten of resetten de streepjes vast bleven en daardoor wel een goede meting kon plaatsvinden, gingen ze weer knipperen nadat de meting afgelopen was.

Ik dacht dat het misschien toch aan de weerstanden lag, dus ik heb die van 47k er nu weer tussen; maar het euvel bleef.

Oké, ga weer naar boven om e.e.a. aan te passen en testen.

" I'll be back....."  ;D
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 27 mei 2015, 16:36:32
Dit is wel 'n oplossing  (y)

Ik heb de connectors weer op de oorspronkelijke posities gezet en het meettraject aangepast naar 3660 mm. Met de instelling van een langere display-tijd blijven de streepjes na het verstrijken weer 'vast'. Dit gaat dus goed, maar met alleen één loc.

Vervolgens heb ik er weer de wagons achter gehangen, zodat het weer een trein is, maar nu gaat het weer fout; de trein is te lang (180 cm) en is het blok nog niet uit voordat de melding weggaat. Dus knipperen de streepjes weer.
Heb vervolgens de wachttijd op 20000 ms gezet en toen ging het weer goed.

Maar met een langere trein (248 cm) gaat het weer fout; ook deze is dan weer te lang. Door nu de wachttijd op 25000 ms te zetten, gaat het weer wel goed.

Ik betwijfel echter of dit dé oplossing is, zeker wanneer de treinbaan in automatisch bedrijf is en er meerdere treinen rijden.
Net nog even gekeken, maar het komt (makkelijk) voor dat twee opvolgende blokken bezet zijn door twee elkaar volgende treinen. Ze zullen niet elkaars blok inrijden, daar zorgt iTrain wel voor, maar wanneer dit in blok 6 en blok 7 (het meettraject) gebeurt, gaat de meting fout.

Is het een oplossing door de code wat 'uit te kleden' zodat alleen gekeken en gereageerd wordt op enkel de bezetmelding van melder 1 en melder 2, zonder dat gewacht moet worden dat de display tijd voorbij is?
Misschien een (te) simpele vraag van een niet-programmeur... :-\

Gr. Peter

p.s. dit houd je wel van de straat, hé?  ::)
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 27 mei 2015, 16:58:49
Nee, dit is niet "de" oplossing, maar maakt wel het probleem duidelijk. 8)

Als eerste ga ik de code aanpassen voor eenrichtingsverkeer, zodat de meting alleen start bij het eerste blok en stopt bij het tweede blok.
Precies datgene wat jij al voorstelt. Dan moet het werken en is de displaytijd niet langer van invloed. Een nieuwe meting kan pas plaats vinden als het tweede blok ook verlaten is. Denk ik... 8)

wordt vervolgd.

ps - er is hier op straat toch niets te beleven... ;) (aan de overkant is een begraafplaats...)

Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 27 mei 2015, 17:24:56
Een nieuwe meting kan pas plaats vinden als het tweede blok ook verlaten is. Denk ik... 8)
Hoewel het in praktijk ook voorkomt dat twee blokken achter elkaar bezet zijn... Wat dan?
Misschien toch handiger om te meten met IR of LDR en over een kortere afstand?
Of wordt dit nu een uitdaging die we toch gaan oplossen?  ;D

(aan de overkant is een begraafplaats...)
Nou ja, dan heb je daar ook weinig last van  ;)
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 27 mei 2015, 17:36:32
Hoewel het in praktijk ook voorkomt dat twee blokken achter elkaar bezet zijn... Wat dan?
Maar je gaat toch geen snelheid meten als het volgende blok bezet is... ???

Citaat
Misschien toch handiger om te meten met IR of LDR en over een kortere afstand?
Dat nooit. ;D Je hebt de perfecte melders liggen... ;)

Citaat
Of wordt dit nu een uitdaging die we toch gaan oplossen?  ;D
Yep... 8)

Wordt vervolgd...
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 27 mei 2015, 18:56:55
Maar je gaat toch geen snelheid meten als het volgende blok bezet is... ???
Wat ik bedoel te zeggen is, dat de Arduino staat ingesteld om snelheid te meten wanneer melder 1 getriggerd wordt en meet wanneer melder 2 getriggerd wordt.

In het geval er twee treinen dicht achter elkaar zitten, dus trein 1 zit in het tweede blok en trein 2 rijdt het eerste blok binnen, vindt er geen accurate melding plaats. Maar, aangezien het volgende blok bezet is, zal de trein toch moeten afremmen en geldt die snelheid niet. Dus waar maak ik me druk om? :)

Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 27 mei 2015, 19:44:05
De meting begint als de trein het eerste blok in rijdt. Dan wordt melder 1 hoog.
De meting stopt als de trein het tweede blok in rijdt. Dan wordt melder 2 hoog.
Dat zijn twee duidelijk gedefinieerde kantelpunten.

Om eenduidig te kunnen meten moeten dus - voor dat de meting begint - beide blokken leeg zijn.
Want bij een bezet blok is de melder al hoog en is er geen opgaande flank.

Dus zit ik nu te bedenken hoe ik dat programmatisch zeker kan stellen - en aan kan geven...

Want er zijn vier mogelijke standen:

en voor die 4de heb ik nog niets...

- of ik moet het resultaat pas laten verdwijnen als beide blokken weer vrij zijn...  ::)
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 27 mei 2015, 20:40:18
Lastig,

Even kijken....

Niet gereed om te meten, betekent dat melder 2 nog hoog is (blok is bezet), waarbij melder 1 al hoog wordt, terwijl melder 1 al eerder laag is geweest.

Dat kan alleen als een nieuwe trein al blok 1 binnenrijdt, terwijl de oude trein zich nog in blok 2 bevindt.

Want als -als gevolg van een hele lange trein- melder 2 hoog wordt terwijl melder 1 nog hoog is (en niet al laag is geweest) is het een geldige meting.

Volgens mij is dit een situatie waarin geen correcte meting gedaan kan worden?

Je zou dan het display blank kunnen laten, dus niet "----" vast of knipperen, maar leeg.
Als het resultaat blijft staan en pas verdwijnt als beide blokken vrij zijn, zou het verwarring kunnen geven doordat gedacht wordt dat er toch een nieuwe meting gedaan is.

Wat vind je van deze casus?


Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 27 mei 2015, 20:51:18
Ik weet 't nog niet - blank laten kan worden verward met defect.
Nog maar even over nadenken - zou je in de tussentijd iets willen proberen?

/*****************************************************************************
test versie: Speedometer tbv Peter
*****************************************************************************/

// libraries
#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"

Adafruit_7segment display = Adafruit_7segment();

const int section1      =     A0; // first section
const int section2      =     A1; // second section

const int Overflow      =  10000;
unsigned long curTime   =      0;
unsigned long preTime   =      0;
unsigned long runTime   =      0;

// speedometer
bool  sect1occup        =  false;
bool  sect2occup        =  false;
bool  timerRuns         =  false;
bool  calcReady         =  false;
int   valSect1          =      0;
int   valSect2          =      0;
int   threshold         =    511; // 0 is uit, 1023 is aan
float distance          =   3450; // afstand tussen meetpunten in mm.
float scaleSpeed        =      0; // in schaal km/h.

/****************************************************************************/

void setup() {
 
  // set display
  display.begin(0x70);
  display.setBrightness(7); // 0..15
  display.writeDisplay();

  Serial.begin(9600);
  Serial.println("Check inputs");
 
  display.println(Overflow);                                 // display "----"
 
} // end setup

/****************************************************************************/

void loop() {
   
   speedometer();
   displaySpeed();
 
} // end loop

/****************************************************************************/

void speedometer() {
 
  valSect1 = analogRead(section1);
  valSect2 = analogRead(section2);
 
  if (valSect1 > threshold) sect1occup = true; else sect1occup = false;
  if (valSect2 > threshold) sect2occup = true; else sect2occup = false;

  if (!timerRuns) {                                         // nog geen meting

    if (sect1occup && !sect2occup) {                          // meting begint
      timerRuns = true;                                       
      preTime   = millis();
      runTime   = 0;
     
      Serial.print("sector 1 = "); Serial.println(valSect1);
    }

  } else {                                           // als de meting loopt...
 
    curTime = millis();         
    runTime = curTime - preTime;
   
    if (sect2occup) {                                      // meting ten einde
                                                    // bereken schaal snelheid
      scaleSpeed = ((distance * 3600) / runTime / 1000) * 87;
      calcReady  = true;
      timerRuns  = false;
     
      Serial.print("sector 2 = "); Serial.println(valSect2);
      Serial.print("   speed = "); Serial.println(scaleSpeed, 1);
    }
  }
}

/****************************************************************************/

void displaySpeed() {

  if (timerRuns) {                         // als snelheidsmeting gaande is...
   
    if ((runTime / 100) % 2) {                            // knipperen display
      display.println(Overflow);                             // display "----"
    } else
      display.clear();                                       // display "    "
   
  } else {

    if (calcReady) {                        // als snelheidsmeting klaar is...
        display.print(scaleSpeed, 1);      // display gemeten snelheid in km/h
        if (!sect1occup && !sect2occup) calcReady = false;
      } else {
        display.println(Overflow);                           // display "----"
      }
  }
   
  display.writeDisplay();
}

/****************************************************************************/

Dit is een eenrichting versie... (alleen even de afstand aanpassen)

Wordt vervolgd
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 27 mei 2015, 21:40:49
Ik zie dat er aardig bezig is geweest hier  ;D

@Peter, zijn al je blokken maar voorzien van één melder? Maar inderdaad, als de trein niet normaal kan doorrijden is de meting toch niet "goed". Het is nog steeds de gemiddelde snelheid  ;D

Zelf had ik met de code doorlopen ook al gezien dat er geen blokkade zat om een nieuwe meting te starten als de melder nog bezet was.

Zelf heb ik ook niet stil gezeten. In eerste instantie ben ik aan de slag gegaan met de code van Max. Alleen zoals gezegd, wilde ik het geschikt maken voor meerdere systemen en display's. De code raakte dus nogal aangepast  ::) Om te proberen heb ik even snel een display wat ik had liggen van stal gehaald. Een 128x64 I2C OLED met SSD1306 controller. Maar in principe is de code nu makkelijk te gebruiken met andere schermen  :) Zo heb ik het goedkope Banggood scherm ook binnen en daar wil ik hem eigenlijk aan hangen. Maar hiermee heb ik nog niet gespeeld. Omdat beelden meer zeggen, hier een filmpje (https://www.youtube.com/watch?v=9Y-wmeASeos).

Deze zou ook moeten werken met het Adafruit 7-segment display wat jullie (Peter en Max) hebben. Alleen laat de Arduino IDE me even vallen, Daar zo over meer. Maar toen ik de library van het display door keek schrok ik wel van de functie om getallen te printen op dat scherm. Of eigenlijk, om alles te printen op dat scherm. Ze hebben wel een hele fool-proof code gemaakt maar de methode die ze moeten gebruiken, mm. En dat vooral om de stomme floats te kunnen ondersteunen. Zelf heb ik het dus ook niet op basis van float gedaan maar gewoon met unsigned int. De snelheid berekenen komt dan neer op ((36UL * distance * scale + (time / 2)) / time ) en geeft 10x de snelheid. Later zet ik er nog een komma tussen om 1 getal achter de komma te hebben. Klinkt omslachtig maar is wat ze na veel code (om floats te ondersteunen) ook in de 7segment library doen.

Goed, en toen wilde ik me code hier plaatsen maar heb ik iets gedaan waardoor het compleet niet meer werkt  ::) Dat moet dus even wachten.

Wel zat ik met een gek probleem. Ik probeerde met een #define de juiste delen van de code te laden voor het juiste scherm. Zolang ik #define LCD_TYPE 1 had staan werkte alles prima. maar maakte ik er een 2 dan dan krijg ik opeens function not defined in this scope.  ??? Ik heb het probleem terug kunnen brengen naar:
#define TEST 1

#if (TEST == 1)
  byte varname = 1;
  //const byte bla = 2;
#endif
#if (TEST == 2)
  const byte bla = 2;
#endif

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}
Zolang TEST i 1, dan is er geen probleem. Maar zodra je er een 2 van maakt is het mis. En het gaat dan ook alleen mis als je ergens daarin een variable probeert te maken. Ik snap even niet meer waarom.


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 27 mei 2015, 22:58:27
@Max,
Bedankt voor het aanpassen, zal morgen de afstand aanpassen en het testen.
Dat blank laten verward zou kunnen worden met defect, realiseerde ik me ook.
Misschien is dan een optie om maar twee (middelste) streepjes te laten zien " -- ", al dan niet knipperend.

@Timo,
Het grootste deel van mijn blokken -en dan praat ik over de hoofdbaan met doorgaande sporen- hebben maar één melder. De stations- en opstelsporen hebben twee melders, maar die worden niet gebruikt voor deze meting.
Daarvoor gebruik ik blokken in de hoofdbaan, omdat daar de treinen op hun maximale snelheid (kunnen) rijden.
Behalve natuurlijk als er direct in het volgende blok nog een trein rijdt.  ;D

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 28 mei 2015, 09:52:17
Max,

Vanmorgen even een eerste testje gedaan en dat zag er goed uit.
Je hebt nu de displaytijd aangepast zodat deze de snelheid toont, zolang de 2e bezetmelder actief is?

Moet nog testen wat er gebeurt als trein het meetblok al heeft verlaten en een trein al wel dat blok binnenrijdt.
Ook nog geen "    " display kunnen simuleren.

Echter, vandaag heb ik mijn kleinzoontje om op te passen, dus niet veel tijd om rustig en uitgebreid te testen.
Zal pas weer in de loop van de middag kunnen  :(

Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 28 mei 2015, 10:05:01
Je hebt nu de displaytijd aangepast zodat deze de snelheid toont, zolang de 2e bezetmelder actief is?
Inderdaad...  8)

Citaat
Echter, vandaag heb ik mijn kleinzoontje om op te passen, dus niet veel tijd om rustig en uitgebreid te testen.
Zal pas weer in de loop van de middag kunnen  :(
;D Je bent opa of je bent 't niet... ;D

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: gvandersel op 28 mei 2015, 14:50:48
@Timo,

DEFINE definieert TEST, maar kan geen waarde toekennen. Dus als je zoiets als jij wilt doen, doe het dan alsvolgt:

#DEFINE TEST1
;#DEFINE TEST2

#if (TEST1)
  ; Doe iets voor TEST1
#endif
#if (TEST2)
  ; Doe iets voor TEST2
#endif

Groet,

Gerard van der Sel.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: spock op 28 mei 2015, 15:45:07
Ik gebruik hiervoor het #ifdef directive

#DEFINE TEST1    1
;#DEFINE TEST2    1

#ifdef TEST1
  ; Doe iets voor TEST1
#endif
#ifdef TEST2
  ; Doe iets voor TEST2
#endif
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: gvandersel op 28 mei 2015, 19:24:22
Spock,

Je hebt helemaal gelijk. Doe ik in de codefiles ook :-[

Groet,

Gerard van der Sel.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 28 mei 2015, 19:31:56
Hallo Max,

Daarnet even een uurtje getest, maar ik denk dat we 'm nu wel hebben.  (y)
De metingen met een losse loc, een korte trein en een lange trein gingen allemaal goed.

Het enige is -vooralsnog- dat, wanneer 2 treinen achter elkaar rijden met verschillende topsnelheden en de langzamere rijdt voor, dat dan de snellere trein moet afremmen. Als dit gebeurt wanneer voor trein 1 een meting plaatsvindt en de snellere trein moet afremmen en gaat versnellen wanneer sector 2 vrijkomt (en trein 2 dus niet met volle snelheid het blok/meettraject kan berijden), is het dan even opletten.

Daarentegen zijn er genoeg momenten waarop de metingen wel goed gedaan zullen worden.

Heb ook geconstateerd dat als trein A nog in sector 2 rijdt en trein B gaat al sector 1 binnen, dat dan ook een geldige meting plaatsvindt, al zal de gemeten snelheid dan niet correct zijn. Maar dat is dan maar zo.

Alternatief is: korter meettraject met IR of LDR.
Maar voorlopig ben ik met deze oplossing zeer tevreden.  :)

De waarden van valSect1 en valSect 2 schommelen tussen 999 en 1011, met een gemiddelde van 1003. Zijn toch mooie waarden?

Ik heb er nu 47k weerstanden tussen zitten. Dit is nog steeds een goede waarde?

Nogmaals: tot nu toe gaan de metingen goed en ben ik zeer tevreden.
Alvast erg bedankt voor het vele werk dat je tot nu toe (ook voor mij) gedaan hebt.  (y) (y)
Moet er nu nog meer gebeuren?

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 28 mei 2015, 20:05:39
Daarnet even een uurtje getest, maar ik denk dat we 'm nu wel hebben.  (y)
De metingen met een losse loc, een korte trein en een lange trein gingen allemaal goed.
Dat is mooi - om niet te zeggen heel mooi.  (y)

Citaat
Het enige is -vooralsnog- dat, wanneer 2 treinen achter elkaar rijden met verschillende topsnelheden en de langzamere rijdt voor, dat dan de snellere trein moet afremmen. Als dit gebeurt wanneer voor trein 1 een meting plaatsvindt en de snellere trein moet afremmen en gaat versnellen wanneer sector 2 vrijkomt (en trein 2 dus niet met volle snelheid het blok/meettraject kan berijden), is het dan even opletten.
Dat is logisch: om goed te kunnen meten moet de snelheid wel constant zijn. 8)

Citaat
Heb ook geconstateerd dat als trein A nog in sector 2 rijdt en trein B gaat al sector 1 binnen, dat dan ook een geldige meting plaatsvindt, al zal de gemeten snelheid dan niet correct zijn. Maar dat is dan maar zo.
Dat is dan fout - dat zal ik nakijken. ???

Citaat
De waarden van valSect1 en valSect 2 schommelen tussen 999 en 1011, met een gemiddelde van 1003. Zijn toch mooie waarden?
Ik heb er nu 47k weerstanden tussen zitten. Dit is nog steeds een goede waarde?
Dat is perfect - niets meer aan veranderen.

Citaat
Moet er nu nog meer gebeuren?
Ja. Als het gaat zoals ik hoop dat het gaat hebben we straks diverse stukjes schakeling en software voor verschillende situaties. Die moeten dan in elkaar geschoven worden tot een groot geheel - en daarna getest. Het zou plezierig zijn als je daar dan mee zou willen helpen. Mocht je in de tussentijd nog meer op- en aanmerkingen hebben - graag. Experimentjes als dit zijn heel leerzaam.
Het is een genoegen om met je samen te werken...  (y)

Met vriendelijke groet

ps - vergeet niet dat er met een Arduino nog veel meer leuke dingen kunnen...
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 28 mei 2015, 21:04:22
@Gerard, dat is niet correct  ;) Define is oorspronkelijk bedoelt om iets te definen, dit mag een waarde zijn. Dus:
#define DIT_IS_EEN_DEFINE_MET_WAARDE_3 3
Zet je er niets echter is het gewoon 0. Hier kan je dus ook echt tests mee doen zoals ik wilde. (Een bekende is het testen op de Arduino versie met #if ARDUINO > 100 voor hoger dan versie 1.00.) Ook als ik het deed zoals Spock ging het fout. De reden dat ik voor een waarde ging is dat je dan niet per ongeluk tegenstrijdige defines kan doen (ook al zou ik dit kunnen opvangen door #ifdef TEST1 #elif defined(TEST2) #endif maar is meer werk :D ) Alleen schijnbaar zit er een "bug" in de IDE omdat deze door de war raakt. Dit omdat setup() en loop() eigenlijk 2 functies zijn die leven in main() en de IDE dus een nieuwe cpp file maakt. Zie hiervoor het Arduino forum (http://forum.arduino.cc/index.php?topic=326100.msg2251669) waar ik een topic had geopend. Nu gelukkig opgelost (en zeer eenvoudig eigenlijk  ::) ).

Peter, leuk dat het nu werkt! Ik ben ondertussen ook weer verder gaan en werkt weer normaal. Zou je misschien mijn code ook eens willen testen?  ;D Ik heb nu ondersteuning voor twee schermen ingebouwd. Het Adafruit I2C 7-seg display dat jij gebruikt en een (goedkoop) I2C OLED scherm (http://www.banggood.com/0_96-Inch-4Pin-Blue-Yellow-IIC-I2C-OLED-Display-Module-For-Arduino-p-969144.html). Dit is het schermpje in het YouTube filmpje. Daarmee komt er ook extra informatie beschikbaar nu (gemiddelde snelheid, min en max). Het goedkope 7-segment scherm (http://www.banggood.com/4-Bits-Digital-Tube-LED-Display-Module-Board-For-Arduino-p-931236.html) moet nog volgen.

Het enige is -vooralsnog- dat, wanneer 2 treinen achter elkaar rijden met verschillende topsnelheden en de langzamere rijdt voor, dat dan de snellere trein moet afremmen. Als dit gebeurt wanneer voor trein 1 een meting plaatsvindt en de snellere trein moet afremmen en gaat versnellen wanneer sector 2 vrijkomt (en trein 2 dus niet met volle snelheid het blok/meettraject kan berijden), is het dan even opletten.
Tja, als een trein afremt geeft het niet wat je wil nee :p Er is geen andere plaats waar je kunt meten? Je zou ook een extra sectie kunnen maken (stroomdetectie) en deze gebruiken. Als je dan wel een stuk hebt waar de trein altijd snel gaat.

@Max, je weet dat je ook het scherm zelf kan laten knipperen? Dit kan met 2Hz, 1Hz of 0,5Hz. En in mijn code heb ik (als ik het goed heb gedaan) gekozen voor "____" (streepjes laag) als hij idle (aan het wachten op een melding) is. En knippert hij "|----" of "----|" als er een meting gaande is, al naar gelang de richting. (Streep geeft locatie van de eerste melding aan.) Zou jij dit ook kunnen testen?

Goed, hierbij de code. Deze is ook (inclusief de libraries) hier te downloaden (https://drive.google.com/file/d/0B0VTMBMOLEBdeDl0LU92WlBlWTg/view?usp=sharing). Loop wel even de configuratie na. (Bedenk me nu dat hij op de verkeerde pinnen staat te letten. Even aanpassen naar A0 en A1.)
/***************************************************
SpeedOmeter v1.0 - Speedometer for modelrailroad
  Created by Timo Engelgeer (Septillion), May 28, 2015
Based on Speedometer bij Max Roodveldt
 
  Calculates the (scale) speed of a (model) train based on two
  detections on the layout. This can be any kind you like.

****************************************************/
#define SPEEDOMETER_VERSION "v1.0"
/***** Configuration *******************************
The Speedometer is made very versatile. So in order to make it work with your setup
you have to configure it. The next few blocks will guide you to the configuration.

-- Display --
Because you can use different display's with Speedometer you have to select the correct one.
1 SSD1306 128x64 OLED display (I2C, default adress 0x3C)
  2 Adafruit 7-segment display (I2C, default adress is 0x70)

****************************************************/
#define LCD_TYPE 2

/**-- Sensor --
  It doesn't matter what kind of sensor you use. This can be an active low (signal goes
  low when train passes) or active high (signal goes high when train passes).
 
  #define ACTIVE_LOW    for active low  (uncommented)
  //#define ACTIVE_LOW  for active high (commented)
 
  Analoog komt nog ;)
**/
#define ACTIVE_LOW

/**-- Pins --
  To which pins are the sensors connected? Left and Right respectively
**/
const byte InputL = 9;
const byte InputR = 10;

/**-- Settings --
  Distance =>     Distance between start of the first detector and
                  the start of the second (in mm)
  Scale =>        Scale of the layout
  TimeShowSpeed =>Time to show the speed after finishing the measurement (in ms)
  TimeOut =>      Time to ignore re-triggering the detector after
                  finishing measurement (in ms)
**/
unsigned int distance = 5000;
unsigned int scale = 87;

const unsigned int TimeShowSpeed = 5000;
const unsigned int TimeOut = 3000;

/**-- Done! --
  You are done. Upload the sketch!
**/

//SSD1306 based OLED display
#if (LCD_TYPE == 1)
  #include <SPI.h>
  #include <Wire.h>
  #include <Adafruit_GFX.h>
  #include <Adafruit_SSD1306.h>

  Adafruit_SSD1306 display(255);
  const byte I2CAdress = 0x3C;
 
  #define INFO_EXTEND

//Adafruit 7-segment I2C
#else if (LCD_TYPE == 2)
  #include <Wire.h>
  #include "Adafruit_LEDBackpack.h"
  #include "Adafruit_GFX.h"

  Adafruit_7segment display = Adafruit_7segment();
  const byte I2CAdress = 0x70;
  const byte DisplayBrightness = 7; // 0..15
#endif

/***** Global vars *********************************/
bool timerRuns = false; //Does the timer run?
bool direction = false; //In which direction? (false = to left, true = to right
bool ready = true;      //ready to start the clock?
byte displayScreen = 0; //Which screen is displayed last?

unsigned long startTime;      //Saved start time
unsigned long endTime;        //Saved end time
unsigned long showTimer =  -1;//Time when display started showing something

//Speed stats
unsigned int speed, maxSpeed, minSpeed, avgSpeed = 0;

/***** Default functions ***************************/

void setup() {
//Initialize the display
  displayInit();

  //Set the input acording to the setting
#if defined(ACTIVE_LOW)
pinMode(InputL, INPUT_PULLUP);
pinMode(InputR, INPUT_PULLUP);
#else
pinMode(InputL, INPUT);
pinMode(InputR, INPUT);
#endif
}

void loop(){
  //Check for a finished measurement
if(checkInput()){
    //If so, calculate the speed and display it
    speed = calcSpeed(endTime - startTime);
displaySpeed(speed);
   
    //Set timer to display it
showTimer = millis();
   
    //Calc and store stats, skip for small displays
    #ifdef INFO_EXTEND
      if(speed > maxSpeed){
        maxSpeed = speed;
      }
      if(speed < minSpeed || minSpeed == 0){
        minSpeed = speed;
      }
      if(avgSpeed == 0){
        avgSpeed = speed;
      }
      else{
        avgSpeed += speed + 1;
        avgSpeed /= 2;
      }
    #endif
}

  //As long as display timer runs we don't update the screen
if(millis() - showTimer > TimeShowSpeed){
    //If timer runs, busy display
if(timerRuns){
displayBusy();
}
    //or the idle display
else{
displayIdle();
}
}
}

/***** SpeedOmeter functions ***********************/

//Calculates the speed as a fixed point int (1 decimal), with correct rounding
unsigned int calcSpeed(unsigned long time){
return (unsigned int)((36UL * distance * scale + (time / 2)) / time );
}

//Checks the inputs, returns true if a measurement is done, false otherwise
bool checkInput(){
  //state of the input, HIGH for detect (no matter the setting)
  bool lVal, rVal;
 
  //Set depending the setting
#if defined(ACTIVE_LOW)
lVal = !digitalRead(InputL);
rVal = !digitalRead(InputR);
#else
lVal = digitalRead(InputL);
rVal = digitalRead(InputR);
#endif

//Busy with timing
if(timerRuns){
    //End when the other detector is reached
    //Save endTime, remove flag, return true because of end
if(direction && lVal || !direction && rVal){
endTime = millis();
timerRuns = false;
return true;
}
}
  //Not busy
else{
    //We are ready and there is an input
if((lVal || rVal) && ready){
startTime = millis();
timerRuns = true;
ready = false;
direction = rVal;
}
   
    //Probably not ready,
    //make ready if no input at least TimeOut after ending timer
else if(!lVal && !rVal && (millis() - endTime > TimeOut)){
ready = true;
}
}

  //As long as it's not the end of the timer
return false;
}

/***** Display functions ***************************/

//Set up the display
void displayInit(){
//SSD1306 based OLED display
#if (LCD_TYPE == 1)
    //Setup, clear and welkom
display.begin(SSD1306_SWITCHCAPVCC, I2CAdress);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
    display.print("SpeedOmeter ");
display.println(SPEEDOMETER_VERSION);
display.println("Model railroad speed");
    display.println("By Timo Engelgeer");
    display.println("Septillion");
    display.print("Scale: ");
    display.println(scale);
    display.print("Dist: ");
    display.print(distance);
display.display();
delay(1000);

//Adafruit 7-segment I2C
#else if (LCD_TYPE == 2)
// set display
display.begin(I2CAdress);
display.setBrightness((DisplayBrightness > 15 ? 15 : DisplayBrightness)); // 0..15
   
    //Start up animation
    for(byte i = 0; i < 4; i++){
      byte icons[] = {0x5C, 0x63};
      for(byte y = 0; y < 4; y++){
        display.writeDigitRaw(y + (y > 2 ? 1 : 0), icons[y % 2] || (y == i ? 0x80 : 0x00));
      }
      display.writeDisplay();
      delay(500);
    }
#endif
}

//Displays the speed
void displaySpeed(unsigned int speed){
  //SSD1306 based OLED display
#if (LCD_TYPE == 1)
    byte position = 2; //to allign the speed right
 
    displayScreen = 2; //so we do this once
   
    //Clear etc
    display.clearDisplay();
    display.stopscroll();
    display.setTextColor(WHITE);
    display.setTextSize(2);
    display.setCursor(0,0);
   
    //Calculate the position so it's aligned to the right
    for(unsigned int test = (speed / 100); test; test /= 10){
      position--;
    }
   
    //Print speed
    display.print("Speed:");
    display.setTextSize(4);
    display.setCursor(position * 24,16);
    display.print(speed/10);
    display.print(",");
    display.print(speed % 10);
    display.setCursor(80, 48);
    display.setTextSize(2);
    display.print("km/h");
   
    display.display();
   
  //Adafruit 7-segment I2C
#else if (LCD_TYPE == 2)
    byte displayPos = 4; //Position on the screen

displayScreen = 2;//so we do this once

    //Disable blink
display.blinkRate(0);
   
    //But it speed is out of reach...
if(speed > 9999){
      //Make speed 9999 and blink
speed = 9999;
display.blinkRate(1);
}

    //Print speed
if(speed){  //if speed is not 0
      for(byte i = 0; speed && i <= 4; ++i) {
        display.writeDigitNum(displayPos--, speed % 10, i == 1);
        if(displayPos == 2) display.writeDigitRaw(displayPos--, 0x00);
        speed /= 10;
      }
    }
    else {
      display.writeDigitNum(displayPos--, 0, false);
    }
   
    //Fill rest with 0
    while(displayPos >= 0) display.writeDigitRaw(displayPos--, 0x00);
    display.writeDisplay();
  #endif
}

//Display when the timer is started
void displayBusy(){
//SSD1306 based OLED display
#if (LCD_TYPE == 1)
if(displayScreen != 3){
displayScreen = 3; //so we do this once
     
      //Clear etc
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);
     
      //If from right to left, scroll <--
if(direction){
        for(byte i = 0; i < 2; i++){
          display.print("<--- ");
        }
display.startscrollleft(0x00, 0x01);
}
      //If from left to right, scroll -->
else{
        for(byte i = 0; i < 2; i++){
          display.print("---> ");
        }
display.startscrollright(0x00, 0x01);
}
     
      //Display the info below
      displayInfo();
display.display();
}

//Adafruit 7-segment I2C
#else if (LCD_TYPE == 2)
if(displayScreen != 3){
displayScreen = 3; //so we do this once
     
      // |---- for from left, ----| for from right
for(byte i = 0; i < 5; i++){
        if(i == 2) display.writeDigitRaw(i++, 0x00);
        if(i == 0 && !direction){
          display.writeDigitRaw(i, 0x70);
        }
        else if(i == 5 && direction){
          display.writeDigitRaw(i, 0x46);
        }
        else{
          display.writeDigitRaw(i, 0x40);
        }
      }
      //and blink 1Hz
display.blinkRate(2);
display.writeDisplay();
}
#endif
}

//Screen to display when waiting for input
void displayIdle(){
//SSD1306 based OLED display
#if (LCD_TYPE == 1)
if(displayScreen != 4){
displayScreen = 4; //so we do this once
     
      //Clear, don't scroll, set size, set cursor, write
display.clearDisplay();
      display.stopscroll();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print("Wachten...");
     
      //And add info
      displayInfo();
     
display.display();
}


//Adafruit 7-segment I2C
#else if (LCD_TYPE == 2)
if(displayScreen != 4){
displayScreen = 4; //so we do this once
display.blinkRate(0); //Don't blink
     
      // Write "____"
for(byte i = 0; i < 5; i++){
        if(i == 2) display.writeDigitRaw(i++, 0x00);
        display.writeDigitRaw(i, 0x08);
      }
display.writeDisplay();
}
#endif
}

void displayError(){

displayScreen = 5;

}

//Display's the stats (min, max, avg, last)
void displayInfo(){
  #if (LCD_TYPE == 1)
    //Print last speed, max speed, min speed and average
    display.setTextSize(1);
    display.print("Lst: ");
    display.print(speed / 10);
    display.print(",");
    display.print(speed % 10);
    display.println("km/h");
    display.print("Max: ");
    display.print(maxSpeed / 10);
    display.print(",");
    display.print(maxSpeed % 10);
    display.println("km/h");
    display.print("Min: ");
    display.print(minSpeed / 10);
    display.print(",");
    display.print(minSpeed % 10);
    display.println("km/h");
    display.print("Avg: ");
    display.print(avgSpeed / 10);
    display.print(",");
    display.print(avgSpeed % 10);
    display.println("km/h");
  #endif
}


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 28 mei 2015, 22:53:05
Timo,

zal de code met plezier bestuderen en testen.

Ik heb trouwens nog een ander - mogelijk interessant - display liggen: http://hobbycomponents.com/displays/74-i2c-serial-lcd-1602-module (http://hobbycomponents.com/displays/74-i2c-serial-lcd-1602-module)

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: spock op 28 mei 2015, 23:59:34
mea culpa, ik zal het voorbeeld aanpassen   :-[
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 29 mei 2015, 09:14:15
Timo,

Heb de code gedownload, de Adafruit library had ik al dus die heb ik niet opnieuw geïnstalleerd.

In de tekstsectie onder #define LCD_TYPE 2 staan twee define's; allebei ACTIVE_LOW. De eerste zonder //, de tweede met //.
Omdat het toch allemaal tekst is, heb ik de 2e // weggehaald, maar ook ACTIVE_LOW in ACTIVE_HIGH veranderd.

Voor mijn situatie heb ik de variabelen 'InputL' en 'InputR' veranderd van 9 en 10 in A0 en A1, #define ACTIVE_LOW in #define ACTIVE_HIGH en de 'distance' heb ik aangepast naar 3660 mm.

Vervolgens de sketch geladen. Na een (voor alle zekerheid) reset van de Arduino, kreeg ik 4 streepjes onderin. Tijdens de meting veranderde dat in |---- knipperend en na de meting vernaderde dat in |---- vast! Er kwam geen melding van de gemeten snelheid.

Kennelijk wordt de meting niet 'vrij' gegeven, want het display bleef vast staan en bij volgende doorgangen van de meetsectie veranderde er niets.

Volgens mij heb ik het juiste aangepast of ben ik wat vergeten?
Kun je wat met deze opmerkingen?

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 29 mei 2015, 18:06:47
En hier is het resultaat hetzelfde met de aanvulling dat in de tegenovergestelde richting het display alleen "----" toont. Het verticale streepje mankeert.

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 30 mei 2015, 19:37:53
Hoi Peter en Max,

Bedankt voor het testen! :D

In de configuratie, het klopt dat er twee regels met #define ACTIVE_LOW in de comments staan. Het idee was dat je de define comment (dus eigenlijk weg haalt) om naar active high te schakelen. Dus wel definiëren voor active low (#define ACTIVE_LOW) of niet definiëren voor active high (//#define ACTIVE LOW). Het is op zich niet fout om het aan te passen naar #define ACTIVE_HIGH aangezien hiermee ACTIVE_LOW niet gedefinieerd wordt  ;D (Ook al wordt er nergens gekeken naar ACTIVE_HIGH :p ) Zou dit eigenlijk duidelijker zijn?

@Max, dat scherm is zeker ook te gebruiken. Het moet ook niet zo moeilijk zijn dit scherm toe te voegen aan de code. Zelf heb ik alleen een niet I2C versie maar de "normale". Ik zal kijken of ik beide toe kan voegen.  ;)

Ik heb net even de code doorgekeken en er inderdaad 3 fouten uit gehaald  :-X Beide bedankt, dat jullie twee opmerkingen wezen beide op een andere fout.

Eerst de belangrijkste, het niet printen van de snelheid en dan hangen. Het feit dat het display wel stopte met knipperen gaf aan dat de functie voor snelheid printen wel werd aangeroepen en dat hij daar bleef hangen in een loop voordat display.writeDisplay() werd aangeroepen. Wat bleek, ik heb een stukje code uit de library gekopieerd
while(displayPos >= 0) display.writeDigitRaw(displayPos--, 0x00);
Op zich niet fout maar in het originele code was displayPos een int, ik heb hem als byte gedefinieerd. En een byte kleiner dan 0 is niet mogelijk  ::) Nu vervangen door displayPos < 100 omdat er nu een rollover naar 255 plaats vindt. Dit zou het moeten oplossen.

Voor de andere richting werd geen streepje getoond. Dit kwam omdat ik had geschreven
else if(i == 5 && direction){
Terwijl het meest rechter karakter wel het 5e karakter is dit dan natuurlijk nummer 4 (== 4). Het meest linker karakter is dan ook nummer 0. Nu zou er dus wel een streepje moeten komen.

En dan nog een domme fout waar jullie niets gemerkt hebben.  ;D Ik had een simpele opstart animatie gemaakt voor het display. Hierin staat een regel met een bitwise OR van twee waarde. Ik had alleen ipv a | b geschreven a || b. Aangezien dit altijd waar is leverde dit dus de waarde 1 op ipv het gewenste getal. Als het goed is toonde het display bij het opstarten dus even 4 streepje bovenaan, klopt dat? In de nieuwe versie is dit de gewenste animatie (hopelijk :p).

[Edit]En omdat de IDE van Arduino nog steeds niet normaal met tabs om kan gaan de boel even in spaces omgezet.


Timo

De nieuwe code als download (v1.1) (https://drive.google.com/file/d/0B0VTMBMOLEBdam9sYm83Ylh6cVU/view?usp=sharing) en als post:
/***************************************************
  SpeedOmeter v1.1 - Speedometer for modelrailroad
  Created by Timo Engelgeer (Septillion), May 30, 2015
  Based on Speedometer bij Max Roodveldt
 
  Calculates the (scale) speed of a (model) train based on two
  detections on the layout. This can be any kind you like.
 
****************************************************/
#define SPEEDOMETER_VERSION "v1.0"
/***** Configuration *******************************
  The Speedometer is made very versatile. So in order to make it work with
  your setup you have to configure it. The next few blocks will guide you to
  the configuration.
 
  -- Display --
  Because you can use different display's with Speedometer you have to select
  the correct one.
  1 SSD1306 128x64 OLED display (I2C, default adress 0x3C)
  2 Adafruit 7-segment display (I2C, default adress is 0x70)

****************************************************/
#define LCD_TYPE 1

/**-- Sensor --
  It doesn't matter what kind of sensor you use. This can be an active low
  (signal goes low when train passes) or active high (signal goes high when
  train passes).
 
  Comment the line below for active low.
  #define ACTIVE_LOW    for active low  (uncommented)
  //#define ACTIVE_LOW  for active high (commented => not defined)
 
  Analoog komt nog ;)
**/
#define ACTIVE_LOW

/**-- Pins --
  To which pins are the sensors connected? Left and Right respectively
**/
const byte InputL = 9;
const byte InputR = 10;

/**-- Settings --
  Distance =>     Distance between start of the first detector and
                  the start of the second (in mm)
  Scale =>        Scale of the layout
  TimeShowSpeed =>Time to show the speed after finishing the measurement (in ms)
  TimeOut =>      Time to ignore re-triggering the detector after
                  finishing measurement (in ms)
**/
unsigned int distance = 5000;
unsigned int scale = 87;

const unsigned int TimeShowSpeed = 5000;
const unsigned int TimeOut = 3000;

/**-- Done! --
  You are done. Upload the sketch!
**/

//SSD1306 based OLED display
#if (LCD_TYPE == 1)
  #include <SPI.h>
  #include <Wire.h>
  #include <Adafruit_GFX.h>
  #include <Adafruit_SSD1306.h>

  Adafruit_SSD1306 display(255);
  const byte I2CAdress = 0x3C;
 
  #define INFO_EXTEND

//Adafruit 7-segment I2C
#else if (LCD_TYPE == 2)
  #include <Wire.h>
  #include "Adafruit_LEDBackpack.h"
  #include "Adafruit_GFX.h"

  Adafruit_7segment display = Adafruit_7segment();
  const byte I2CAdress = 0x70;
  const byte DisplayBrightness = 7; // 0..15
#endif

/***** Global vars *********************************/
bool timerRuns = false; //Does the timer run?
bool direction = false; //In which direction? (false = to left, true = to right
bool ready = true;      //ready to start the clock?
byte displayScreen = 0; //Which screen is displayed last?

unsigned long startTime;      //Saved start time
unsigned long endTime;        //Saved end time
unsigned long showTimer =  -1;//Time when display started showing something

//Speed stats
unsigned int speed, maxSpeed, minSpeed, avgSpeed = 0;

/***** Default functions ***************************/

void setup() {
  //Initialize the display
  displayInit();
 
  //Set the input acording to the setting
  #if defined(ACTIVE_LOW)
    pinMode(InputL, INPUT_PULLUP);
    pinMode(InputR, INPUT_PULLUP);
  #else
    pinMode(InputL, INPUT);
    pinMode(InputR, INPUT);
  #endif
}

void loop(){
  //Check for a finished measurement
  if(checkInput()){
    //If so, calculate the speed and display it
    speed = calcSpeed(endTime - startTime);
    displaySpeed(speed);
   
    //Set timer to display it
    showTimer = millis();
   
    //Calc and store stats, skip for small displays
    #ifdef INFO_EXTEND
      if(speed > maxSpeed){
        maxSpeed = speed;
      }
      if(speed < minSpeed || minSpeed == 0){
        minSpeed = speed;
      }
      if(avgSpeed == 0){
        avgSpeed = speed;
      }
      else{
        avgSpeed += speed + 1;
        avgSpeed /= 2;
      }
    #endif
  }
 
  //As long as display timer runs we don't update the screen
  if(millis() - showTimer > TimeShowSpeed){
    //If timer runs, busy display
    if(timerRuns){
      displayBusy();
    }
    //or the idle display
    else{
      displayIdle();
    }
  }
}

/***** SpeedOmeter functions ***********************/

//Calculates the speed as a fixed point int (1 decimal), with correct rounding
unsigned int calcSpeed(unsigned long time){
  return (unsigned int)((36UL * distance * scale + (time / 2)) / time );
}

//Checks the inputs, returns true if a measurement is done, false otherwise
bool checkInput(){
  //state of the input, HIGH for detect (no matter the setting)
  bool lVal, rVal;
 
  //Set depending the setting
  #if defined(ACTIVE_LOW)
    lVal = !digitalRead(InputL);
    rVal = !digitalRead(InputR);
  #else
    lVal = digitalRead(InputL);
    rVal = digitalRead(InputR);
  #endif
 
  //Busy with timing
  if(timerRuns){
    //End when the other detector is reached
    //Save endTime, remove flag, return true because of end
    if(direction && lVal || !direction && rVal){
      endTime = millis();
      timerRuns = false;
      return true;
    }
  }
  //Not busy
  else{
    //We are ready and there is an input
    if((lVal || rVal) && ready){
      startTime = millis();
      timerRuns = true;
      ready = false;
      direction = rVal;
    }
   
    //Probably not ready,
    //make ready if no input at least TimeOut after ending timer
    else if(!lVal && !rVal && (millis() - endTime > TimeOut)){
      ready = true;
    }
  }
 
  //As long as it's not the end of the timer
  return false;
}

/***** Display functions ***************************/

//Set up the display
void displayInit(){
  //SSD1306 based OLED display
  #if (LCD_TYPE == 1)
    //Setup, clear and welkom
    display.begin(SSD1306_SWITCHCAPVCC, I2CAdress);
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0,0);
    display.print("SpeedOmeter ");
    display.println(SPEEDOMETER_VERSION);
    display.println("Model railroad speed");
    display.println("By Timo Engelgeer");
    display.println("Septillion");
    display.print("Scale: ");
    display.println(scale);
    display.print("Dist: ");
    display.print(distance);
    display.display();
    delay(1000);

  //Adafruit 7-segment I2C
  #else if (LCD_TYPE == 2)
    byte icons[] = {0x5C, 0x63};
 
    // set display
    display.begin(I2CAdress);
    display.setBrightness((DisplayBrightness > 15 ? 15 : DisplayBrightness)); // 0..15
   
    //Start up animation
    for(byte i = 0; i < 4; i++){
      for(byte y = 0; y < 4; y++){
        display.writeDigitRaw(y + (y >= 2 ? 1 : 0), icons[(y + i) % 2] | (y == i ? 0x80 : 0x00));
      }
      display.writeDisplay();
      delay(500);
    }
  #endif
}

//Displays the speed
void displaySpeed(unsigned int speed){
  //SSD1306 based OLED display
  #if (LCD_TYPE == 1)
    byte position = 2; //to allign the speed right
 
    displayScreen = 2; //so we do this once
   
    //Clear etc
    display.clearDisplay();
    display.stopscroll();
    display.setTextColor(WHITE);
    display.setTextSize(2);
    display.setCursor(0,0);
   
    //Calculate the position so it's aligned to the right
    for(unsigned int test = (speed / 100); test; test /= 10){
      position--;
    }
   
    //Print speed
    display.print("Speed:");
    display.setTextSize(4);
    display.setCursor(position * 24,16);
    display.print(speed/10);
    display.print(",");
    display.print(speed % 10);
    display.setCursor(80, 48);
    display.setTextSize(2);
    display.print("km/h");
   
    display.display();
   
  //Adafruit 7-segment I2C
  #else if (LCD_TYPE == 2)
    byte displayPos = 4; //Position on the screen
   
    displayScreen = 2;//so we do this once
   
    //Disable blink
    display.blinkRate(0);
   
    //But it speed is out of reach...
    if(speed > 9999){
      //Make speed 9999 and blink
      speed = 9999;
      display.blinkRate(1);
    }
   
    //Print speed
    if(speed){  //if speed is not 0
      for(byte i = 0; speed && i <= 4; ++i) {
        display.writeDigitNum(displayPos--, speed % 10, i == 1);
        if(displayPos == 2) display.writeDigitRaw(displayPos--, 0x00);
        speed /= 10;
      }
    }
    else {
      display.writeDigitNum(displayPos--, 0, false);
    }
   
    //Fill rest with 0
    while(displayPos < 100) display.writeDigitRaw(displayPos--, 0x00);
    display.writeDisplay();
  #endif
}

//Display when the timer is started
void displayBusy(){
  //SSD1306 based OLED display
  #if (LCD_TYPE == 1)
    if(displayScreen != 3){
      displayScreen = 3; //so we do this once
     
      //Clear etc
      display.clearDisplay();
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(0,0);
     
      //If from right to left, scroll <--
      if(direction){
        for(byte i = 0; i < 2; i++){
          display.print("<--- ");
        }
        display.startscrollleft(0x00, 0x01);
      }
      //If from left to right, scroll -->
      else{
        for(byte i = 0; i < 2; i++){
          display.print("---> ");
        }
        display.startscrollright(0x00, 0x01);
      }
     
      //Display the info below
      displayInfo();
      display.display();
    }
   
  //Adafruit 7-segment I2C
  #else if (LCD_TYPE == 2)
    if(displayScreen != 3){
      displayScreen = 3; //so we do this once
     
      // |---- for from left, ----| for from right
      for(byte i = 0; i < 5; i++){
        if(i == 2) display.writeDigitRaw(i++, 0x00);
        if(i == 0 && !direction){
          display.writeDigitRaw(i, 0x70);
        }
        else if(i == 4 && direction){
          display.writeDigitRaw(i, 0x46);
        }
        else{
          display.writeDigitRaw(i, 0x40);
        }
      }
      //and blink 1Hz
      display.blinkRate(2);
      display.writeDisplay();
    }
  #endif
}

//Screen to display when waiting for input
void displayIdle(){
  //SSD1306 based OLED display
  #if (LCD_TYPE == 1)
    if(displayScreen != 4){
      displayScreen = 4; //so we do this once
     
      //Clear, don't scroll, set size, set cursor, write
      display.clearDisplay();
      display.stopscroll();
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(0,0);
      display.print("Wachten...");
     
      //And add info
      displayInfo();
     
      display.display();
    }
 
 
  //Adafruit 7-segment I2C
  #else if (LCD_TYPE == 2)
    if(displayScreen != 4){
      displayScreen = 4; //so we do this once
      display.blinkRate(0); //Don't blink
     
      // Write "____"
      for(byte i = 0; i < 5; i++){
        if(i == 2) display.writeDigitRaw(i++, 0x00);
        display.writeDigitRaw(i, 0x08);
      }
      display.writeDisplay();
    }
  #endif
}

void displayError(){
 
  displayScreen = 5;
 
}

//Display's the stats (min, max, avg, last)
void displayInfo(){
  #if (LCD_TYPE == 1)
    //Print last speed, max speed, min speed and average
    display.setTextSize(1);
    display.print("Lst: ");
    display.print(speed / 10);
    display.print(",");
    display.print(speed % 10);
    display.println("km/h");
    display.print("Max: ");
    display.print(maxSpeed / 10);
    display.print(",");
    display.print(maxSpeed % 10);
    display.println("km/h");
    display.print("Min: ");
    display.print(minSpeed / 10);
    display.print(",");
    display.print(minSpeed % 10);
    display.println("km/h");
    display.print("Avg: ");
    display.print(avgSpeed / 10);
    display.print(",");
    display.print(avgSpeed % 10);
    display.println("km/h");
  #endif
}
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 30 mei 2015, 20:46:00
Timo, deze versie werkt hier goed. (y)


In de configuratie, het klopt dat er twee regels met #define ACTIVE_LOW in de comments staan. Het idee was dat je de define comment (dus eigenlijk weg haalt) om naar active high te schakelen. Dus wel definiëren voor active low (#define ACTIVE_LOW) of niet definiëren voor active high (//#define ACTIVE LOW). Het is op zich niet fout om het aan te passen naar #define ACTIVE_HIGH aangezien hiermee ACTIVE_LOW niet gedefinieerd wordt  ;D (Ook al wordt er nergens gekeken naar ACTIVE_HIGH :p ) Zou dit eigenlijk duidelijker zijn?
Ben benieuwd hoe je dit uit gaat leggen aan iemand zonder veel programmeer ervaring ???  Kiezen tussen LOW en HIGH is misschien toch makkelijker...

Citaat
En dan nog een domme fout waar jullie niets gemerkt hebben.  ;D Ik had een simpele opstart animatie gemaakt voor het display. Hierin staat een regel met een bitwise OR van twee waarde. Ik had alleen ipv a | b geschreven a || b. Aangezien dit altijd waar is leverde dit dus de waarde 1 op ipv het gewenste getal. Als het goed is toonde het display bij het opstarten dus even 4 streepje bovenaan, klopt dat?
;D Nee - er waren slechts drie streepjes; het derde cijfer was zwart...

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 30 mei 2015, 21:38:36
Timo,

Wat Max al suggereerde: ik snap hier dus weinig van. Kiezen uit LOW of HIGH is voor mij duidelijker  ;D

Verder even een start gemaakt met testen, maar meteen wordt gezegd dat er geen Adafruit SSD1306.h file of library is. Terwijl de vorige versie wel werkte.

Ik krijg er nu geen leven in, dus ga morgen maar verder kijken.

Overigens, wat Max zegt van drie streepjes, dat klopt; had ik ook.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 30 mei 2015, 22:47:12
@Peter, dan ga ik er ACTIVE_LOW en ACTIVE_HIGH van maken ook al kijk ik nooit naar ACTIVE_HIGH  ;D

En als je met testen die error krijgt dan heb je niet het juiste display geselecteerd. Dan staat deze nog op 1 (#define LCD_TYPE 1) terwijl jij 1 nodig hebt. SSD1306 is de driver van mijn OLED display en hiervoor heb jij de library niet uitgepakt (ook niet nodig voor jou). Even op 2 zetten zou het moeten verhelpen.

@Max, goed om te horen! Werkt de "animatie" ook?

Net even snel gespeeld met het goedkope 7-segment schermpje. Morgen er even snel een library voor schrijven :) Vandaag iig al uitgevonden hoe ik elk segment aan krijg, dat is al heel wat.  8) De boel er gewoon uit pompen met shift out :) Als dat dan helemaal werkt heb je best iets leuks voor minder dan €5,-  ;D


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 31 mei 2015, 08:46:42
Timo,

Ook bij mij werkt het; de animatie, de meting vooruit en de meting achteruit.  (y)

Dat ik die error kreeg omdat ik het juiste display niet had geselecteerd, wist ik. Alleen ik wilde gisteravond 'nog even snel' kijken of 't werkte. En als je iets 'nog even snel' wilt doen, maak je fouten. Toen ik er daarna even rustig voor ging zitten, wist ik weer wat ik moest doen en daarna werkte het.  ;D

Om dit te voorkomen (voor gebruikers zoals ik), is het wat om via de seriele monitor de gebruiker een aantal vragen te stellen en d.m.v. het ingeven van een cijfer een keuze te maken en die dan stoppen in een variabele?
Bv. 1 voor SSD1306 based OLED display, 2 voor Adafruit_SSD1306 display, 3 voor aaaa, 4 voor bbbbb en x voor zelf aanpassen; 1 voor ACTIE_LOW en 2 voor ACTIVE_HIGH; meetafstanden zelf ingeven etc, of is het makkelijker als de gebruiker zelf de code aanpast?

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 31 mei 2015, 12:47:13
@Timo
Ook de animatie werkt... 8)

@Peter
Zo als jij het voorstelt zou inderdaad het eenvoudigst zijn maar er is een probleem: ruimte. Als je wilt kunnen selecteren als de Arduino al loopt moeten alle onderdelen van de software al in het programma zitten.

Door het te doen zoals Timo dat doet, worden alleen de geselecteerde stukken onderdeel van het programma en wordt voorkomen dat er ongebruikte onderdelen in de software zitten - onderdelen die wel veel ruimte innemen. Ruimte die er vaak niet is. Nadeel is inderdaad dat de selectie gemaakt moet worden voor het compileren; dus in de broncode. Maar er is niets wat niet met een duidelijke handleiding kan worden verholpen...  ;)

Gelukkig kunnen we er wel van uitgaan dat niet iedereen elke dag van display en/of melders wisselt, zodat een keer compileren vaak genoeg is.

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 31 mei 2015, 13:01:07
Ruimte die er vaak niet is

O.K., snap ik. Als ik in het onderste schermpje van de Arduino kijk, wordt er over bytes en enkele kilobytes gesproken. Dat is inderdaad niet veel: dus woekeren met de ruimte en dan is de code aanpassen de betere oplossing.  :)

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 31 mei 2015, 13:55:06
Max heeft helemaal gelijk  (y) Dat is de reden dat ik het zo doe. De 7-segment schermpjes nemen niet zo veel ruimte in, die zou ik bijna nog allemaal tegelijk kunnen laten aansturen (ook al is dat niet handig). Maar het schermpje van mij is (iig met deze library) een stuk hongeriger. En om het zo makkelijk mogelijk te doen heb ik zo veel mogelijk aanwijzingen in de code gezet. Zoals Max ook zei, het is iets wat je eenmalig doet. En voor de dingen die je misschien vaker wilt aanpassen (afstand, schaal) wil ik nog een (optioneel) menu inbouwen. Plaats je dan 3 knopjes is het zonder herprogrammeren aan te passen maar je kunt er ook voor kiezen geen knopjes te plaatsen en dit in te stellen met programmeren.


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 31 mei 2015, 15:19:04
Het zal inderdaad vaak maar een eenmalige instelling zijn, er van uitgaande dat je dit op een baan gebruikt.
Met wat aanwijzingen in de code moet het inderdaad te doen zijn om (eventueel) de schaal en de afstand in te stellen.

Dan is het zo laten van de code (en het eventueel zelf aanpassen in de broncode) heel legitiem  (y).

gr. Peter

Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 03 juni 2015, 11:28:29
Max,
Inmiddels is het display ingebouwd en is de snelheidsmeting een actief onderdeel van de baan.
De snelheid gemeten met iTrain en de Speedometer komt tamelijk goed overeen. Dat het niet exact hetzelfde is, zal -denk ik- zitten in interne afrondingsverschillen?

Verschillende treinen gemeten. Resultaten bv.:
iTrain  <> Speedometer
 114,4        115,2
 117,4        118,0
 115,5        116,4
 109,8        110,6

Nogmaals erg bedankt voor de hulp en het delen van de code. Ik vond het een leuk project en voor een paar euro doet ie volgens mij hetzelfde als commerciele apparaten van 200 dollar.

Dat is dan fout - dat zal ik nakijken. ???
Is dit inderdaad een foutje en is het er al uit gehaald?

Timo,
Is het nog gelukt met het schrijven van een library voor het andere (goedkope) display?

Gr. Peter

Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 03 juni 2015, 11:52:43
Verschillen zijn inderdaad niet zo groot. Zit hem denk ik niet in het afronden maar in latency. Ik denk zelfs dat het display het beter heeft dan iTrain. Dit doordat de signalen die iTrain krijgt eerst uitgelezen moeten worden door de centrale via loconet waarna de centrale ze door moet geven aan iTrain. Hier kan best 1 of 2 ms vertraging in zitten. Nu is vertraging niet zo erg, immers als beide signalen 2ms later zijn is de tijdmeting nog prima. Maar dat is niet zo, de centrale doet gewoon zijn routines en trekt zich niets aan van een melder, die komen wel weer als hij daar tijd voor heeft. Voor eht rijden is het niet zo erg dat een melding niet direct aan komt (paar ms is nog steeds snel) en 1km/h verschil in een meting van schaalsnelheid (echte snelheid verschilt dus maar 1/87!) doet hem ook niet.

De Arduino heeft nu als hoofdtaak snelheid meten dus die zal minder verschillende latency (tijd tussen handeling en actie) hebben. Wel is de interne klok iets onnauwkeuriger maar dat zal echt klein zijn. Waarschijnlijk kleiner dan de latency verschillen.

Library voor het kleine scherm krijgt al vorm. Het scherm geeft al dingen weer. Nu alleen nog ff in de krochten van timer interrupts van AVR duiken. Die heb ik altijd iets verwarrend gevonden met al die verschillende registers... Dan laat ik de timer interrupt de multiplexing en het dimmen doen (display is wel erg fel!) Maar al met al moet het gewoon een algemene library worden waarmee dit display is aan te sturen voor welke toepassing dan ook. Gek genoeg heb ik die voor dit scherm nog niet kunnen vinden. Wel voor losse 7-segment schermen en voor 7-segment met controllers net als die van jullie (Adafruit 7-segement).

Maar goed, altijd leuk, verschillende display's. Kan ik daar eindelijk eens mee spelen. Heb nog wel wat verschillende liggen  ::)


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: gvandersel op 03 juni 2015, 12:08:03
Is er ook een kleuren display?

Groet,

Gerard van der Sel.

PS. Overigens het is niet de latency die hier een rol speelt, daar jullie pollen en geen gebruik maken van interrupts. De snelheid van de Arduino is het meest nauwkeurig, omdat je bij iTrain naast de tijd om het signaal bij de PC tekrijgen ook nog het verschil in verwerking door het OS erbij krijgt. De iTrain tijd zal altijd een indicatie zijn, terwijl de Arduino tijd al redelijk nauwkeurig is. Nog even door naar interrupt verwerking en je krijgt inderdaad latency fouten.
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 03 juni 2015, 12:23:26
Peter,
ik ben blij dat je tevreden bent; uiteindelijk is dat het doel waar we naar streven... 8)

Is dit inderdaad een foutje en is het er al uit gehaald?

Dat weet ik nog niet zeker. Het probleempje is dat ik het hier niet goed kan simuleren - ik test met drukknoppen. Misschien dat je het probleem nog een keer zou kunnen omschrijven? Het duurt bij mij altijd even voor dat het muntje valt... ??? ???

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 03 juni 2015, 13:02:56
Twee kleuren OLED (https://www.youtube.com/watch?v=9Y-wmeASeos) kleuren genoeg?  ;D

Zo ver ik weet zou ik het gewoon latency mogen noemen. Het is het verschil tussen stimulation (trein komt blok binnen) en response (iTrain slaat de tijd op).

De Arduino doet inderdaad aan pollen. Maar het heeft eigenlijk geen zin om naar interrupt over te stappen. De loop() doet 99% van de tijd amper iets (meeste werk is het afsluiten van de meting) en zal dus snel doorlopen worden. Komt bij dat we meten in ms, de afwijking daarin acht ik groter dan de response van de loop dus heeft het weinig zin naar een interrupt over te stappen. Toegegeven, het is niet lastig. Maar op deze manier is het makkelijk om ook analoge uitlezing te kunnen doen (iets dat ook extra latency brengt...)


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 03 juni 2015, 13:05:46
Timo en Gerard, bedankt voor de uitleg en de aanvullingen. Geeft me toch een goed gevoel bij die Arduino.  (y)

Max, ik zal hier komende tijd even rustig voor gaan zitten en kijken of ik 't kan reproduceren en zo ja het 'probleem' omschrijven.
Ook als het niet lukt, hoor je 't.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 03 juni 2015, 19:56:03
Het probleempje is dat ik het hier niet goed kan simuleren - ik test met drukknoppen.

Het is vanavond rustig, dus ik ben er eventjes voor gaan zitten, maar volgens mij moet je het met drukknoppen ook kunnen simuleren.

Wat is de situatie?
Wanneer trein A blok 1 binnenrijdt, wordt melder 1 hoog gezet, knippert het display en start de meting.
Wanneer trein A blok 2 binnenrijdt, wordt melder 2 hoog gezet, stopt het knipperen van het display, stopt de meting en wordt de snelheid getoond.
De snelheid blijft in het display totdat blok 2 verlaten wordt en melder 2 laag gaat.
Tot zover alles correct, toch?

Wanneer een (langzame) trein blok 1 binnenrijdt, wordt melder 1 hoog gezet en start de meting. Na het verlaten van blok 1 wordt melder 2 hoog gezet en wordt de snelheid getoond. Echter, nu kan een andere (snellere) trein blok 1 al binnenrijden, omdat deze door trein 1 al verlaten is. Wanneer trein 1 blok 2 verlaten heeft, toont het display knipperen ten teken dat de meting loopt, omdat melder 1 hoog is. Maar de trein bevindt zich al ergens in het blok. Ergo, de meting vindt niet plaats vanaf het begin = hoog worden van melder 1?

Je kan dit m.i. simuleren door drukknop 1 te activeren, daarna drukknop 2 in te drukken (als zijnde blok 1 verlaten en blok 2 binnengereden) en onderwijl alweer drukknop 1 in te drukken (als zijnde een nieuwe trein in blok 1).
Je geeft dan melder 1 al hoog terwijl melder 2 nog steeds hoog is. Volgens mij is dit de situatie.

Een ander vraagje.
Ik wil mijn Arduino voeden met een externe voeding.
In de omschrijving staat dat ik 'm kan voeden via usb of AC > DC adapter. Het aanbevolen voltage ligt tussen de 7 en 12 volt.
Ik heb diverse gelijkstroom adapters; 7V-300mA, 9V-500mA, 9V-1A of 12V-2A.
Welke raden jullie aan om te gebruiken? Zo'n Arduino is toch niet zo 'hongerig'?

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Max Roodveldt op 03 juni 2015, 20:10:49
Peter,
ik snap 'm en ik zal er wat aan doen. Weet nog niet wat - er lijken meerdere oplossingen mogelijk... 8)

En alle vier de voedingen zijn te gebruiken - dus neem de kleinste... ;D

mvg
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 03 juni 2015, 20:14:16
Ben het inderdaad met Max eens, de kleinste voldoet prima. Let alleen wel op, mag geen AC adapter zijn, alleen DC.

En het probleem wat jij omschrijft zit niet in de code van mij. Daar kan direct na het eindigen van de meting, dus terwijl de snelheid nog getoond wordt, al een nieuwe meting gestart worden. Dit doordat de displaySpeed routine maar 1 keer aangeroepen wordt en dan al weer terug gaat naar het normale wachten.


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 03 juni 2015, 20:39:35
Thnxx, dan neem ik de kleinste; komt die ook nog een keer van pas  ;D

Timo, het kwam aan het licht bij de eerste testen van de code van Max. Maar goed te horen dat het niet in jouw code zit.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 14 juni 2015, 13:04:01
Toch wel profijt gehad van mijn Arduino snelheidsmeter!  ;D

Vanmorgen druk bezig geweest om een aantal locs te ijken op mijn maximale baansnelheid.
Nadat ik dat gedaan had, heb ik een loc een tijdje laten rijden en de gemeten snelheden via de seriele monitor geregistreerd.

Aanvankelijk had ik de loc/decoder ingeregeld op max plm 110 km/u.
Toen de trein zo'n 40 rondjes gereden had met de maximale snelheid op gemiddeld 110,4 km/u bleek hij plotseling rondjes van gemiddeld 133 km/u te rijden. Vreemd, maar wel goed dat ik die informatie nu had en dus maar opnieuw de decoder CV 5 instellen.

Dus prima aanwinst die Arduino snelheidsmeter  (y)

Timo, heb jij die display (http://www.banggood.com/4-Bits-Digital-Tube-LED-Display-Module-Board-For-Arduino-p-931236.html) al 'aan de praat'?

Ik zag dat deze mooi klien was en heb 'm ook besteld en inmiddels binnen. Aangezien die kleiner is dan die Adafruit, heb ik een mooi plekje om 'm in te bouwen. Dan zou 't fijn zijn als ik die kleine display zou kunnen gebruiken.

Alvast bedankt.

Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 15 juni 2015, 16:06:29
Hoi Peter,

Mooi dat het een nuttig gebruik heeft gekregen op je baan :D

Ik ben nog bezig met het scherm. Ik heb het op zich wel aan de praat maar ik ben nog niet tevreden met de library die ik er nu voor gemaakt heb. Ik zal proberen de library zo snel mogelijk aan te passen dat hij in ieder geval mooi geschikt is voor dit project. Dat moet deze week wel lukken.

Waarschijnlijk zal ik later de library nog meer aanpassen maar dat zie ik dan nog wel. (Vooral om makkelijk meerdere van die display's te kunnen linken.)

Nog een reden waarom de library nog niet af is, ander projectje met een PIC (http://hackaday.com/2015/06/14/hacking-a-wireless-ac-power-outlet/).


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 15 juni 2015, 18:33:12
Hi Timo,

Ja, ik ben ook wel blij dat ik 't geïnstalleerd heb.  :D

Even een vraag van een niet electonica-kenner: kun je (globaal) aangeven wat dat nu inhoudt, zo'n library schrijven? Ik heb echt geen idee....

Ander vraagje: is het mogelijk om twee meetpunten te hebben en elk meetpunt een eigen display te geven? Dus meetpunt 1 met de Adafruit display en meetpunt 2 met dat andere display? Ga het zelf niet doen omdat mijn huidige meetpunt op een goede plek zit en ik er voldoende aan heb, maar gewoon uit nieuwsgierigheid. En zoals ook vaak als antwoord gegeven wordt op de vraag: waarom.... omdat het kan.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 15 juni 2015, 19:53:51
Hoi Peter,

Het schrijven van een library is niets meer dan een stukje code maken wat je makkelijk kunt gebruiken (display.write() ipv de hele procedure die het eigenlijk is) en makkelijk kunt hergebruiken (scheelt werk voor een volgend project of dat van een ander). Ook is het vaak wel handig als het schaalbaar is (aansturen van twee schermen of meerdere lampjes enz). Voor de rest is het gewoon code, net als je voor de Arduino gewend bent.

Om klein voorbeeld te geven van een library is bijvoorbeeld de standaard library om een pin aan te sturen. Met digitalWrite() roep je eigenlijk al een library aan. Omdat een microcontroller eigenlijk niet werkt met individuele pinnen maar met poorten en een bitje per pin. Wat je kent als Arduino pin 13 (op een Uno) is eigenlijk poort B, bitje 5). Ook checkt de library voor je of je niet PWM aan hebt staan op deze pin en zat dat anders voor je uit. De op het oog simpele en leesbare functie  (en dat is wat je wilt met een library) is eigenlijk:
void digitalWrite(uint8_t pin, uint8_t val)
{
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *out;

if (port == NOT_A_PIN) return;

// If the pin that support PWM output, we need to turn it off
// before doing a digital write.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);

out = portOutputRegister(port);

uint8_t oldSREG = SREG;
cli();

if (val == LOW) {
*out &= ~bit;
} else {
*out |= bit;
}

SREG = oldSREG;
}

Maar nu kan je gewoon de functie gebruiken. Vergelijk het maar met een moderne auto. Waar je vroeger nog zelf de choke aan moest zetten, de koppeling in trappen, starten en gas geven wordt dat nu voor je gedaan als je op start drukt. Stuk simpeler! Maar komt natuurlijk tegen de prijs dat je wel minder makkelijk direct controle uit kunt oefenen maar dat is meestal prima.

Twee meetsecties maken zou zeer zeker mogelijk zijn. De Arduino is voor zijn doen eigenlijk 99% van de tijd uit zijn neus aan het eten. Dit zou je op hetzelfde scherm kunnen doen (afwisselend, aanduiding met ledje of naast elkaar op een grafisch scherm zoals de OLED) of met twee schermpjes. Dit hoeven niet eens twee verschillende te zijn. Kunnen ook twee dezelfde zijn. Alle hier genoemde schermen is het makkelijk een tweede aan te sluiten. (Veel I2C devices hebben een mogelijkheid een adres in te stellen.) Het is alleen een kwestie van de code juist aanpassen.


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 15 juni 2015, 22:12:09
Hi Timo,

Bedankt voor dit stukje uitleg, is me weer wat duidelijker geworden.
Dat de Arduino 99% niets doet, is helder; 't staat maar te wachten tot er eindelijk een trein over het meetstuk rijdt en dan is ie na zo'n 10 seconden weer klaar met meten en rekenen.
En bij bv 2 meetstukken is het dus na een meting, in de code het juiste display aansturen voor het tonen van het resultaat. Ook dat is helder.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Fransx op 18 juli 2015, 20:59:35
Ben terug van vakantie en zoals beloofd mijn snelheids meting, zie de You Tube film.
Ga nog een uitbreiding toepassen voor een rollerbank.

Meting in Km/u

http://youtu.be/n4Cm2AJiYgU

Meting in Mls/H

http://youtu.be/2yYW0UVmBro

Groeten Frans

Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: marcombv op 18 juli 2015, 22:05:13
Helaas de eerste video is prive?  ???
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 19 juli 2015, 08:52:40
Frans,

Ziet er goed uit, echter de eerste video is inderdaad privé en kunnen we niet bekijken.
Zo te zien heb je de code zo gemaakt dat je een aantal instellingen kunt doen, zoals km/h, mp/h, H0, N, afstand?
Blijft de snelheidsmeting altijd in beeld of kan het scherm ook geschoond worden na het passeren van het meettraject?

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Timo op 19 juli 2015, 13:17:03
Inderdaad mooi gedaan Frans  (y)

@Peter, sorry dat ik nog niet toegekomen ben aan het afmaken van de library voor het andere display. Op het moment ben ik niet thuis (bij mijn vriendin) maar ik hoop het snel af te kunnen maken. Probleem  is dat ik het te mooi en universeel wil maken  ::)

Wel heb ik de SpeedOmeter op GitHub gezet. Iets dat ik eigenlijk voor alle code wil gaan doen. GitHub heeft alleen wel even een leerproces  ;D

Septillion-SpeedOmeter op GitHub (https://github.com/sseptillion/Septillion-SpeedOmeter/tree/master)


Timo
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: peterha op 19 juli 2015, 13:52:23
Hi Timo,

Je hoeft je voor mij niet te verontschuldigen, hoor...   ;)
Tenslotte heb ik een meting die werkt met het display en daarnaast is het maar hobby en zijn er vaak andere dingen die voorrang hebben.

Gr. Peter
Titel: Re: Tonen daadwerkelijke snelheid.
Bericht door: Fransx op 19 juli 2015, 20:17:14
Als het goed is dan is de eerste video ook zichtbaar, heb alles snel gemaakt omdat ik er even verder geen tijd voor heb.
Als input twee infrarood refelectie detectoren (A en B), hierdoor is het niet van belang of het analoog of digitaal is, kan ook meting doen voor  bijvoorbeeld het Faller car systeem.
Er zijn twee instellingen voor de schaal, H0 of N en ook een instelling voor het display, Km of Mls.
De laatste actuele meting blijft in het display, een led geeft aan de status van de meting;
Off, niet gereed,     On, gereed voor meting,     knipperd, meting is bezig

Verder staat in het display A><B, zodra meting wordt gestart vanaf A zal er op het display A->B staan,
gestart vanaf B zal er op het display A<-B staan, na de meting A><B.

Gegevens blijven op het display staan tot de volgende meting want waarom zou je het schonen.

Indien de snelheid te laag is of alleen gestart en geen stop, dan verschijnt als meting ---
Indien de snelheid te hoog is, dus niet te meten dan verschijnt op het display +++.

Dit alles gerealiseerd met de PIC 16F628A en een LCD display, toekomst is deze ook geschikt te maken voor een rollerbank, alleen de sensor nog in mekaar flansen.

Groeten Frans