Auto op afstandsbediening met Windows 10 iot en Raspberry Pi 2


Inleiding

In een eerdere blogpost kon u al lezen over ons experiment met een rapsberry pi waarin een auto op afstandsbediening werd ontwikkeld, draaiende op een Linux operating systeem

Omdat we bij Progressive allemaal vooral Windows .Net ontwikkelaars zijn werd het pas echt interessant toen Microsoft eind juli de eerste versie van Windows IoT (internet of things) uitgebracht. Hierdoor kunnen we via .Net en Visual Studio software ontwikkelen voor mobiele apparaten zoals de Raspberry Pi en in de toekomst mogelijks nog vele andere apparaten.

Om een mooi en concreet voorbeeld uit te werken gingen we opnieuw aan de slag met onze op afstand bestuurbare wagen.

Benodigdheden

Benodigdheden

Om onze wagen te ontwikkelen hebben we uiteraard wat software en enkele materialen nodig. Hieronder vindt u een overzicht:

  • Afgedankte auto (op afstandsbediening)
  • Raspberry Pi 2
  • Windows 10
  • Windows 10 IoT
  • Visual Studio 2015
  • L293D chip
  • Kabels
  • Breadboard
  • Powerbank
  • Raspberry Pi usb Wifi dongle

De totale prijs van deze onderdelen komt neer op ongeveer € 85.

Afgedankte auto

Afgedankte auto

Om het ons wat makkelijker te maken hebben we een goedkope auto op afstandsbediening gekocht en deze volledig uit elkaar gehaald, zodat enkel het frame met de motors er nog blijven inzitten. Dit autootje heeft ons € 15 gekost.

De echte techniekers onder ons zullen uiteraard zelf een auto maken met zelfgemaakte materialen.

Raspberry Pi 2

Raspberry Pi 2

Indien je met Microsoft technologie wenst te werken heb je een Raspberry Pi 2 nodig. De oudere modellen ondersteunen geen Windows. Dit model is reeds te koop voor +- 40 euro. Een overzicht van verkooppunten vind je op de website van Tweakers.Net. Merk op dat je hierbij ook een micro SD kaartje nodig hebt van minstens 4GB, deze moet je apart bijbestellen.

Windows 10

Windows 10

Wanneer je op de Raspberry Pi Windows wil installeren moet je beschikken over Windows 10. Met oudere versies van Windows kan je geen images op de SD kaart zetten.

Windows 10 IoT

Windows 10 IoT

De Windows IoT versie is geen volwaardige Windows versie. Het OS bevat geen klassieke grafische gebruikersinterface, maar enkel een homescherm waarbij je enkele basiszaken zoals taalinstellingen en netwerk kan configureren.

Windows IoT kan je downloaden en installeren door de instructies op Microsofts IoT pagina te volgen: https://ms-iot.github.io/content/en-US/Downloads.htm

Visual Studio 2015

Visual Studio 2015

Visual Studio 2015 bevat ondersteuning om te ontwikkelen voor Windows iot en kan deze rechtstreeks deployen op externe devices. Hiermee kan je remote debuggen, wat zeer handig is. Sommige zaken kan je niet enkel lokaal testen en daarom is remote debugging heel handig.

Eerdere versies van Visual Studio kunnen niet gebruikt worden. Gelukkig is er voor de hobbyisten onder ons een gratis Community versie van Visual Studio 2015 verkrijgbaar.

L293D

L293D

De L293D is een IC die ontwikkeld is om motors te sturen. Eén enkele IC kan 2 motoren sturen, wat voldoende is voor dit project. Er is één motor nodig om vooruit en achteruit te rijden en eentje om te draaien.

Het gebruik van de IC vereist weinig technische kennis. Op het internet zijn er voldoende tutorials beschikbaar met aansluitvoorbeelden.

Kabels

Kabels

Om de componenten aan elkaar te hangen heb je uiteraard heel wat kabeltjes nodig.

Handig zijn de steekpluggen die je los kan kopen. Je kan ook (net als ons) met wat geluk, deze kabels terugvinden in oud elektronica materiaal en deze hergebruiken op de Raspberry Pi. Deze kabels kan je pluggen op de GPIO uitgangen van de Raspberry Pi.

De overige kabeltjes kan je ook recycleren uit ander oud materiaal. Indien nodig kan je ze op hun uiteinde wat vertinnen zodat ze makkelijker werkbaar zijn.

Breadboard

Breadboard

Tijdens het experimenteren is het altijd handig om een klein breadboard te gebruiken. Een breadboard is een paneeltje die vol zit met gaatjes en onderliggend rij per prij met elkaar verbonden zijn. Hierdoor kan je snel eenvoudige verbindingen leggen en deze ook weer ongedaan maken. Een breadboard kost bij Conrad ongeveer € 10.

Let er op dat je qua grootte een passend breadboard koopt. In ons geval zijn we beter met een heel klein breadboard, zodat het uiteindelijk in onze auto past wanneer deze dichtgemaakt wordt.

Powerbank (optioneel)

Powerbank (optioneel)

Optioneel kan je ook een kleine (of grotere) powerbank aankopen. Dit is een oplaadbare batterij die gemaakt is om aan te sluiten op o.a. een tablet of smartphone, zodat je langer mobiel kan blijven zonder extra te moeten opladen. Deze powerbanks worden aangesloten via een usb kabel en zijn ook prima voor de Raspberry Pi.

Je kan uiteraard ook zonder powerbank werken, maar dan heb je steeds de stroomkabel van de Raspberry Pi nodig en kan je minder mobiel werken.

Raspberry Pi USB Wifi Dongle (optioneel)

Raspberry Pi USB Wifi Dongle (optioneel)

Net zoals bij de powerbank is het ook handig om een wifi adapter te hebben voor onze device. Indien je dit niet hebt, moet je steeds via een onhandige netwerkkabel werken. Ook hier heb je dit naargelang het uit te werken project niet altijd nodig.

Er bestaan verschillende usb adapters voor de Raspberry Pi, maar op het moment van schrijven wordt er slechts één ondersteund voor Windows IoT. Er moeten namelijk voor elk apparaat nieuwe drivers ontwikkeld worden omdat de Raspberry Pi op een ARM processor draait en niet op een gewone processor waar gewone Windows versies op draaien.

De enige adapter die op dit moment beschikbaar is, is de Raspberry Pi USB Wifi Dongle, die te koop is voor +- € 10.

Technisch

Software

Aangezien de Raspberry Pi 2 een versie van Windows draait, kan men kiezen uit verschillende platformen om het project te doen draaien. Asp.Net of WPF is een prima oplossing, maar wij kozen hier uitzonderlijk eens voor Node JS, standaard aanwezig in Visual Studio 2015.

De keuze van Node JS hierbij was puur persoonlijk om hier ook een eerste ervaring mee op te doen. Een voordeel van Node JS is ook dat het heel light weight is en enkel kennis van Javascript vereist.

Hardware

Voor velen het leukste is de hardware, terwijl dit voor sommige anderen de hel kan betekenen.

Beginnen doen we met de L293D IC te verbinden met de motoren enerzijds en met de Raspberry Pi anderzijds. Let er op dat je deze verbindt met de geschikte GPIO uitgangen. Niet alle uitgangen zijn geschikt. Sommige bevatten continu 3.3V of 5V, terwijl andere ground zijn en (de meeste) overige wel te gebruiken zijn (hoog of laag te zetten).

Ontwikkeling

Serverside

Zoals reeds aangegeven werd er vanuit educatief standpunt Node JS gebruikt. Node JS is een omgeving waarin via javascript serverside ontwikkeld kan worden. De enige voorkennis die nodig is hiervoor is dus javascript.

Frontend

We hebben gekozen om een webapplicatie te maken en hiervoor heb je uiteraard wat (eenvoudig) frontend werk voor nodig. We kozen er voor om een heel eenvoudige html pagina met de pijlen up, down, left & right te gebruiken. Met wat javascript (alweer) roepen we ons Node JS script op en geven we de commando’s mee met de events keydown (start de actie) en Keyup (stop de actie)

Er werd ook een eenvoudige claxon voorzien als leuke extra.

In onze auto is er ook ondersteuning voor het aanzetten van de voor- en achterlichten, evenals de pinkers. Deze gaan automatisch branden wanneer de auto aan het rijden is.

In de toekomst kunnen we dit (als we tijd en zin hebben) nog uitbreiden met bv motorgeluiden, autoradio (streamen van radiozenders) en nog veel meer leuke dingen…

De frontend code zelf werd geschreven met vrij weinig zorg voor propere code en/of optimalisatie. Dit is voorlopig ook niet het doel van het project.

Codeknipsel

Het belangrijkste in de serverside code is het aansturen van de GPIO pinnen. Hiervoor moet je een pinnummer definieren en deze instellen als output of input. Je kan namelijk via de GPIO ook data gaan inlezen, zoals temperatuur- of lichtsensoren.

var gpioController = Windows.Devices.Gpio.GpioController.getDefault();
var m1A = gpioController.openPin(23);

m1A.setDriveMode(Windows.Devices.Gpio.GpioPinDriveMode.output);
m1A.write(Windows.Devices.Gpio.GpioPinValue.high);
m1A.write(Windows.Devices.Gpio.GpioPinValue.low);

Via deze link kan je de volledige broncode downloaden en bekijken of eventueel zelf aanpassingen aanbrengen. Laat ons zeker iets weten wat je er zoal mee ontwikkeld hebt.

Het resultaat in beeld

Bekijk het resultaat op onderstaand Youtube filmpje.

Conclusie

Met Windows IoT komen er plots heel veel nieuwe mogelijkheden voor de .Net ontwikkelaars onder ons. We hoeven dus niet langer gebonden te zijn aan Linux (wat heb ik hier vroeger op gevloekt).

Het blijft uiteraard nog wat afwachten hoe Microsoft hieraan verder zal werken en welke devices het in de toekomst nog zal ondersteunen, maar een eerste belangrijke stap is alvast gezet. Terwijl de mogelijkheden op dit moment nog vrij beperkt zijn (Raspberry Pi is een educatief product en niet geschikt voor productieomgevingen), zullen deze in de toekomst alleen maar toenemen.

Ook zullen er zich nog andere spelers in deze steeds belangrijker worden markt zich mengen, denk bijvoorbeeld maar aan Google...