Inhoudsopgave:
2025 Auteur: John Day | [email protected]. Laatst gewijzigd: 2025-01-13 06:57
Mijn kinderen waren dol op deze kleine Lego Duplo-trein, vooral mijn jongste die moeite heeft om zichzelf met woorden te communiceren, dus ik wilde iets voor haar bouwen waarmee ze onafhankelijk van volwassenen of telefoons/tablets met de trein zou kunnen spelen. Iets wat de trein een extra dimensie zou geven en extra speelwaarde zou geven
De Lego-set heeft al weinig manieren om de trein te besturen, je kunt hem naar voren duwen om te starten en hem vasthouden om hem te stoppen, je kunt hem besturen met behulp van kleurtags die op het spoor gaan, dus wanneer de trein erover rijdt, worden verschillende acties geactiveerd, dwz vooruit, achteruit, speel geluiden zet de lichten aan. Je kunt ook een app voor je telefoon of tablet downloaden die via bluetooth verbinding kan maken met de trein.
Hier een volledige review van de trein
Na wat rond te speuren op internet ontdekte ik dat er nogal wat verschillende mensen waren die allemaal klaar waren met geschreven code om de trein te besturen. Het 'Poweredup'-knooppunt geschreven door nathan.kellenicki (https://nathan.kellenicki.com/node-poweredup/) zag eruit als een perfect begin. Het is geschreven met Javascript waarvan ik niet gedeeltelijk bekend was, maar ik dacht dat ik java-gebaseerde microchip zou kunnen vinden, zou dit een goed begin zijn.
Weer na wat rondzoeken op internet vond ik het espruino-systeem, dit is vergelijkbaar met de ardiuno, maar gebaseerd op javascript. De espriuno-code kon worden geladen op een MDBT42Q-mircochip met Bluetooth-embed. Ik dacht dat als ik de "powered-up" module erin zou kunnen laden, ik al halverwege zou zijn, maar dit eenvoudig was niet het geval omdat de module te veel bibliotheken bevatte die te groot waren om op de MDBT42Q te laden, dus het lijkt erop dat ik moet zoek een eenvoudigere oplossing….
Stap 1: De code
Esprinuo
Voor degenen die het Espruino-platform niet kennen https://www.espruino.com (en ik niet) lijkt het erg op de Arduino, er zijn een paar belangrijke verschillen, het is geschreven voor javascript in plaats van c, het voelt iets nieuwer aan dus er zijn voorbeelden, maar de ondersteuning via de forums is geweldig en zeer nuttig.
Javascript ontmoet de trein
De eerste hindernis was om via bluetooth verbinding te maken met de trein. Dit kan met behulp van de NRF-klasse die wordt meegeleverd in de espruino-code.
NRF.connect kan worden gebruikt om verbinding te maken met de trein, maar je moet eerst het adres van de trein zelf vinden, je kunt NRF.findDevices gebruiken om deze informatie te krijgen
Zodra je dit hebt gedaan, moet je de trein twee waardes naar handshake met de trein sturen, voor mijn trein was dit "00001623-1212-efde-1623-785feabcd123" gevolgd door "00001624-1212-efde-1623-785feabcd123" geloof ik dit zal hetzelfde zijn voor alle stoomtreinen, maar de andere versies, dwz de vrachtset, kunnen anders zijn
Als je dit eenmaal hebt, kun je de trein verbinden met behulp van de volgende functie, kun je zien wanneer de trein verbinding heeft, omdat deze blauw knippert
NRF.connect("e0:7d:ea:0c:03:29").then(function(g) {
console.log("Bezig met verbinden2"); gatt = g; retourneer gatt.getPrimaryService("00001623-1212-efde-1623-785feabcd123"); }).then(function(service) { return service.getCharacteristic("00001624-1212-efde-1623-785feabcd123"); }).then(function(characteristic) { Characteristic_store = karakteristiek; return karakteristieke.readValue();}).then(value => { console.log(value);}).then(function() { console.log("Train Connected"); connected = 1;
De leuke dingen
Nu je verbinding hebt gemaakt met de trein, is het tijd voor alle leuke dingen zoals het vooruit rijden, geluid maken en het licht aan en uit doen. Het is eenvoudig om de trein een prep-waarde te sturen, gevolgd door het daadwerkelijke commando, dwz
functie play_horn() {
console.log("message = ", Characteristic_store); const prepval = nieuwe Uint8Array([0x0a, 0x00, 0x41, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01]); const sendvalue = nieuwe Uint8Array([0x08, 0x00, 0x81, 0x01, 0x11, 0x51, 0x01, 0x09]); Characteristic_store.writeValue(prepval).then(_ => { Characteristic_store.writeValue(verzendwaarde);}); }
Het kan zijn dat je wat rond moet graven om een ander commando te vinden dan degene die ik heb gebruikt
Knoppen en hendels
De fysieke kant van de afstandsbediening is heel eenvoudig vier knoppen (om geluiden af te spelen, de lichten aan en uit te zetten) en een potentiometer die is aangesloten op een hendel, zodat je de snelheid en richting van de trein kunt regelen
De knop heeft geen pull-up-weerstand nodig, maar u kunt dit in code doen, dat wil zeggen:
pinMode(D15, 'input_pulldown');
U kunt de potentiometer aansluiten op een van de ingangen en deze vervolgens het analoge signaal uitlezen met behulp van de volgende opdracht:
var lezen = analoog lezen (D31);
Het andere verschil met de arduino is dat esprunio geen setup en lus heeft. Dus in plaats daarvan plaats ik alle afzonderlijke commando's/triggers in functies en stel vervolgens setInterval in dat elke 100 milliseconden in een lus loopt, luisterend naar de knop en vervolgens de vereiste functie uitvoeren wanneer de knop is ingedrukt.
if (digitalRead (D15) == 1) { play_horn (); }
Het bedienen van de hendel was iets gecompliceerder omdat ik de snelheid stapsgewijs wilde kunnen aanpassen, dus eerst moest ik de analoge waarde verzenden om te functioneren
var lezen = analoog lezen (D31);
train_direction (lezing * 1024);
Vervolgens heb ik in de functie train_direction het commando opgesplitst in 6 verschillende stappen op basis van de potwaarde
Helemaal naar boven, vertelt de trein om op volle snelheid vooruit te gaan
Halverwege, vertelt de trein om met 50% snelheid vooruit te gaan
Midden, vertelt de trein om te stoppen
Halverwege, vertelt de trein achteruit te gaan met 50% snelheid
Helemaal naar beneden, vertelt de trein om op volle snelheid achteruit te rijden
d.w.z
functie treinrichting (dir_val) {
//console.log ("message = ", Characteristic_store); const prepval = nieuwe Uint8Array([0x0a, 0x00, 0x41, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01]); const verzendwaarde = nieuwe Uint8Array([0x08, 0x00, 0x81, 0x00, 0x01, 0x51, 0x00, 0x00]); if (dir_val > 300 && dir_val 400 && dir_val 500) { const sendvalue = new Uint8Array([0x08, 0x00, 0x81, 0x00, 0x01, 0x51, 0x00, 0x64]); } if (dir_val 200) {const sendvalue = new Uint8Array([0x08, 0x00, 0x81, 0x00, 0x01, 0x51, 0x00, 0xe2]); } if (dir_val 100) {const sendvalue = new Uint8Array([0x08, 0x00, 0x81, 0x00, 0x01, 0x51, 0x00, 0xce]); } if (dir_val { Characteristic_store.writeValue (verzendwaarde); }); }
De volledige code kan worden gevonden voor de onderstaande link:
Stap 2: De bedrading
De bedrading was het eenvoudigste deel
Het bestond gewoon uit 4 drukknoppen aangesloten op D15, D16, D17 en D18 zonder enige pull-up-weerstand zoals dit in de code werd gedaan en 1 10k-weerstand aangesloten op D31
Ik ben nog bezig met de voeding, maar momenteel komt alle stroom uit een micro-usb breakout en dit kunnen ze rechtstreeks op een powerbank of een USB-poort worden aangesloten
Stap 3: Het bouwen
De afstandsbediening is meestal uit 3 mm, 6 mm of 9 mm A4-vellen multiplex. Ze zijn op mijn CNC-machine gesneden, maar met behulp van de meegeleverde sjabloon zou ik dat doen, hoewel het niet onmogelijk zou zijn om het met de hand te doen
Ik hoop dat de sjabloon en foto's je alles zullen geven wat je nodig hebt om opnieuw te maken, maar er zijn enkele opmerkingen die kunnen helpen
De 3 mm drukknopbevestiging is om de drukknop op te plakken, de opening zal de knop op de juiste plaats plaatsen, maar we geven je toegang tot het been aan de achterkant zodat je aan de microchip kunt solderen, aan de achterkant kun je ook de MDBT42Q monteren wat lijm gebruiken. Aan de voorkant moet je schuim toevoegen zodat de knoppen een beetje stuiteren als je ze indrukt, je kunt ook veren gebruiken
Knoppen van 9 mm hebben verf, gravure of iets anders van het logo nodig om te laten zien welke knop wat doet
De hendel / handgreep moet worden gelaagd, ik heb een plug van 6 mm gebruikt om ze in alle juiste posities uit te lijnen