Treindetectie met een Raspberry Pi Zero

Het probleem van hoe een trein te detecteren blijft me bezighouden. Eerder heb ik dit al geprobeerd met barcodes, Hall-sensoren en ultrasoon geluid. Hiervan werkt alleen de oplossing met Hall-sensoren, maar die heeft weer als nadeel dat je ze in de baan moet inbouwen.

Mijn nieuwe poging is om een bewegende trein te laten detecteren door een videocamera. Dit klinkt ingewikkeld en vooral duur, maar dat valt op zich wel mee.
Wat je nodig hebt is een Raspberry Pi Zero W, die koop je voor zo’n 10 tot 15 euro, bijvoorbeeld hier. Bij AliExpress koop je een camera voor een paar euro. Let wel op dat je eentje koopt die voor de Zero geschikt is, de aansluiting is anders dan op een ‘normale’ Raspberry Pi.
Ook heb je wellicht nog wat kabeltjes nodig om een muis, toetsenbord en monitor aan te sluiten. Dat is uiteraard niet meer nodig als alles klaar is, maar tijdens de bouw wel. Let op dat er een micro-usb aansluiting zit op de Zero voor muis en toetsenbord, en een mini-hdmi voor de monitor. Er zijn wel leuke aanbiedingen te vinden waarbij je alles in een keer koopt.
Ook heb je een micro-sd-kaart nodig. Liefst eentje van 32GB of meer. En let op: dat kaartje MOET geformateerd worden met FAT32 en dus NIET exFat of NTFS!

Als je alle spullen verzameld hebt kan je beginnen de software te installeren.
– Download Raspbian Stretch full version.
– Pak dit bestand uit, je hebt nu een .img bestand
– Zet deze image op je sd-kaart, bijvoorbeeld met balenaEtcher.
– Start je Raspberry Pi Zero met deze sd-kaart, en volg de instructies
– Start een terminal en type ‘sudo raspi-config’, en kies bij de advanced options de eerste optie om het geheugengebruik te optimaliseren. Bij de interfacing options kies je ook weer de eerste optie om de camera te activeren. Herstart hierna je Raspberry Pi Zero.
– Installeer OpenCV door weer een terminal te starten en een script te downloaden:wget http://www.alexkwak.nl/rpz/install_cv3.script. Maak dit script uitvoerbaar door: chmod a+x install_cv3.script. En voer het uit: ./install_cv3.script. Meer info vind je hier.
– Installeer de module imutils door: pip3 install imutils.
– Download nu de demo van het bewegings-herkenningsprogramma: wget http://www.alexkwak.nl/rpz/motion_detector.py en start deze met python3 motion_detector.py. Meer info vind je hier.

Dit is de basis voor (trein)detectie. In een volgend artikel zal ik ingaan op de verdere uitwerking.

Geluid met Arduino

Stationsgeluiden, de bellen bij een overweg, enz enz.
Hartstikke leuk natuurlijk om die ook te laten horen op de baan. En dat moet dan toch kunnen met een Arduino? Ja, maar niet zonder slag of stoot…

Het probleem is dat er geen eenvoudige manier is waarmee je ‘gewoon’ een MP3 of WAV aan kunt bieden en dat die dan afgespeeld wordt.
Wat ik uiteindelijk heb gebruikt is https://www.hackerspace-ffm.de/wiki/index.php?title=SimpleSDAudio. Probleem daarmee is dat er nogal wat onduidelijkheden staan op die site. Ik zal hier mijn bevindingen plaatsen:

Allereerst heb je iets nodig om je geluidsbestanden op te plaatsen: een SD-kaart. Ik heb deze bij AliExpress aangeschaft: https://nl.aliexpress.com/item/1PCS-Micro-SD-Storage-Expansion-Board-Mciro-SD-TF-Card-Memory-Shield-Module-SPI-For-Arduino/32523546123.html

SimpleSDAudio leest NIET het bestand dat opgegeven wordt, maar zoekt de eerste sector op de schijf op en leest daarna domweg de volgende sectoren. Als een bestand gefragmenteerd is werkt dit dus niet. Oplossing: formatteer je SD-kaart, en plaats je bestanden. Nieuw bestand toevoegen? Geen probleem…. totdat je ook een keer een bestand hebt verwijderd 🙁

SimpleSDAudio leest geen MP3 of WAV(!), maar alleen een raw-bestand dat in feite per byte het volume weergeeft. Door dat 31250 keer per seconde te doen krijg je geluid.
Zo’n raw-bestand maak je met het meegeleverde ‘sox’. Het commando dat ik gebruik en goed werkt is:

sox spoor12.mp3 --norm=-1 -e unsigned-integer -b 8 -r 31250 -c 1 -t raw converted/spoor12.raw

Let er ook op dat bestandsnamen aan de prehistorische eis van maximaal 8+3 karakters moet voldoen.

Hierna is het een kwestie van een kleine sketch maken:

#include <SimpleSDAudio.h>

void setup() {
SdPlay.setSDCSPin(4); // sd card cs pin
SdPlay.init(SSDA_MODE_HALFRATE | SSDA_MODE_MONO | SSDA_MODE_AUTOWORKER);
play("ding.raw");
play("spoor12.raw");
}

void loop(void) { }

void play(String file) {
SdPlay.setFile(file.c_str());
SdPlay.play(); // play music
while (!SdPlay.isStopped()) { }
}

Verkeerslichten met een Arduino

Had ik al gezegd dat knutselen met een Arduino verslavend is? 🙂
Nu in een uurtje een verkeerslicht gemaakt. Nou ja, de vekeerslichten zelf zijn nog in bestelling bij AliExpress, dus maar even een paar seinen gepakt. Vandaar dat groen boven zit enz.
De sessie start met knipperend oranje. Dan klik ik op een knop op de PC en gaan even alle lichten op rood, waarna de normale groen-oranje-rood cyclus wordt doorlopen, net zo lang tot ik weer op de knop klik. Dan gaat na afloop van een cyclus even alles op rood, om daarna weer oranje te gaan knipperen.

Voor meer info zie ook http://www.alexkwak.nl/elektronica/spelen-met-arduinos/

Spelen met Arduino’s

Arduino’s zijn kleine computertjes, waarmee je heel eenvoudig zaken aan kunt sturen.

Zo had ik een tijd geleden een mini-display aangeschaft, en ben er vandaag eens voor gaan zitten om hiermee een stations-informatiebord te maken. En dat was binnen een uur gepiept. Ook de koppeling met de PC is eenvoudig gemaakt. Met een klik van de muis verandert de tekst op het display:

Wil je dit zelf doen? Dat kan eenvoudiger dan je wellicht denkt.
Wat heb je nodig:
1) Een Arduino Uno, ongeveer 3 euro, bijvoorbeeld https://nl.aliexpress.com/item/Free-shipping-UNO-R3-MEGA328P-with-usb-cable-for-Arduino-Compatible-Dropshipping/32241225914.html
2) Een display, ongeveer 2 euro, bijvoorbeeld deze: https://nl.aliexpress.com/item/1pcs-0-96-yellow-blue-0-96-inch-OLED-module-New-128X64-OLED-LCD-LED-Display/32637614958.html
3) Wat kabeltjes, ongeveer 1 euro: https://nl.aliexpress.com/item/40PIN-Dupont-Lijn-10-cm-20-cm-30-cm-Male-naar-Male-Vrouwelijke-naar-Mannelijke-en/32891879068.html Voor dit project heb je alleen male-female nodig, maar als je toch besteld, bestel dan van alles wat.
4) Een USB-kabel, type A naar type B, ongeveer 1 euro: https://nl.aliexpress.com/item/Hoge-Snelheid-Transparant-Blauw-USB-2-0-Printer-Kabel-Type-A-Male-naar-B-Male-Dual/32845453952.html
5) De code, gratis. Ik heb een voorbeeld gemaakt voor een ‘sketch’ (=programma) voor de Arduino dat twee verschillende teksten kan schrijven op het display, en een C#-programma dat een commando vanaf de Windows-PC naar de Arduino kan sturen zodat je onder andere kan wisselen van tekst. Je vindt die code op deze pagina.

Installeer de Arduino-IDE (https://www.arduino.cc/en/main/software). Open de Arduino-sketch van punt 5 hierboven. Selecteer in de Arduino-IDE het juiste apparaat en de juiste com-poort, en upload de sketch.
Verbind het display met de Arduino:
SDA -> A4
SCK -> A5
VDD -> 3.3V
GND -> GND
Je moet nu het eerste scherm al op het display zien. Herstart eventueel de Arduino.

Installeer nu Visual Studio van Microsoft (https://visualstudio.microsoft.com/downloads/, gratis!) en open het C#-project van punt 5 hierboven. Voer deze uit en in het scherm dat verschijnt select de juiste com-poort en stuur commando 254. Als antwoord moet je dan krijgen: “4;Arduino Uno;NS board”.
Stuur commando 253 en de tekst op het display zal wijzigen.

LPS, Local Positioning System

Het blijft me bezighouden: hoe bepaal ik de positie van treinen en wagonnen. Dus opnieuw een idee uitgeprobeerd: met behulp van ultrasoon geluid!

Nu klinkt dat [pun intended] misschien wat raar, maar geluid gaat met een snelheid van ‘slechts’ zo’n 340 meter per seconde. Dus 34cm per milliseconde. En als je je bedenkt dat een Arduino zo ongeveer op de microseconde kan meten, dan weet je dat in principe een positiebepaling door het verschil wanneer een geluidspuls vanaf een loc bij verschillende ontvangers aankomt te meten, ook de daadwerkelijk positie heel redelijk bepaald kan worden. Eigenlijk wat een GPS-ontvanger ook doet, maar dan op kleinere schaal en met geluid in plaats van radio-golven.

Maar helaas, een eerste test verliep niet goed. Bij onze grote vriend AliExpress een stuk of wat ultrasone tranceivers gekocht, en daar mee aan het experimenteren.

Helaas blijken deze jongens heel erg richtingsgevoelig. Als je er net naast mikt wordt er meteen helemaal niets meer ontvangen. En dan wordt in de praktijk vrijwel geen enkele puls die vanaf de loc wordt verstuurd daadwerkelijk door een ontvanger ‘gezien’.

Op zoek naar een andere oplossing…

220V voorziening

Toch maar een keer alles wat met 220V te maken heeft op één plank gemonteerd. Bovenaan een kunststof behuizing met aansluitingen voor een apparaatstekker, de noodschakelaar, twee stopcontacten waarvan er een geschakeld wordt via de noodschakelaar en de andere -voor de pc- niet, en twee aanluiten naar de gelijk- en wisselstroomvoedingen.

Detectie

Om te detecteren waar een trein zich bevindt heb ik gekozen voor Hall-sensoren die tussen de bielzen geplaatst worden. De treinen en wagonnen worden voorzien van magneten, zodat elke Hall-sensor een signaal afgeeft zodra een trein of wagon over de sensor rijdt.

Per detectiepunt zijn er twee sensoren, zodat ook de beweegrichting bepaald kan worden.

En het werkt! Let op het led’je boven in beeld dat even aan gaat op het moment dat de wagon over de sensor beweegt:

 

Weer iets verder…

De Electronica-bak is weer iets verder, en de eerste vijf wissels zijn aangesloten.

Ongeveer een uur kwijtgeraakt aan een defecte trafo, maar na een paar uurtjes zweten heb je dan ook wat.

Een bak aan electronica…

De electronica voor de automatisering heeft ook ruimte nodig. Hiervoor heb ik een houten bak gemaakt met als bodem vrij dun triplex. Hierdoor is het lichtgewicht en kan er toch her en der iets met boutjes in vast gezet worden.
De bak wordt met onder de baan tegen de wand bevestigd, met scharnieren zodat ik ook nog bij de onderkant kan om de boutje aan te draaien.

Rechts tegen de wand van de doos zie je de USB naar I2C-convertor. Dit is het punt waar de PC met het geheel verbonden wordt.
De uitgang van de I2C gaat naar twee blokken van elk 16 relais. Deze bedient straks de wissels en ontkoppelrails.
Links zie je een gevoede USB-hub die zorgt voor de voeding van het I2C-gebeuren.

Een rij bedieningen voor de seinen is het volgende dat wordt toegevoegd.

De baanbesturing

Om de baan te kunnen besturen is niet alleen software nodig, maar ook een scherm om het programma op te kunnen tonen.

De bediening met een muis is lastig , maar op Marktplaats.nl heb ik een touchscreen-monitor op de kop kunnen tikken.