IoT-integratie: Arduino Op afstand Besturen via Windows 10 UWP Apps
Onderdelen en benodigdheden
| Arduino UNO | × | 1 |
| SparkFun Bluetooth Modem - BlueSMiRF Silver | × | 1 |
Over dit project
Opmerking: Zie de updates in de reacties onderaan.
Een Windows 10 UWP-app kan gebouwd worden op de Remote-Wiring-bibliotheek zodat de app kan interageren met een Arduino-apparaat dat Firmata draait. Een app, vergelijkbaar met het Windows Remote Arduino "Blinky"-voorbeeld, maar met functie-uitbreidingen, is ontwikkeld. Het voert GPIO (output EN input) uit alsook enkele analoge I/O. Deze app is functioneel hetzelfde als de Windows 8.1-versie in de vorige blog in deze serie. Deze blog werkt door hetzelfde materiaal (d.w.z. herhaalt veel ervan) als de vorige blog, maar vanuit de Universal Windows Platform (UWP)-context in plaats van de Windows 8.1 Universal App-context. Het doel voor de app is Win 10 desktop, Win 10 telefoon en Raspberry PI2 (met Win 10 IoT draaiende). Het laatste doel is een "work-in-progress". Deze blog kan gelezen worden zonder verwijzing naar de vorige blog.
Dit project is gedetailleerd op mijn blog op embedded101.com
Het Windows Remote Arduino "Blinky"-voorbeeld is te vinden op ms-iot.github.io.
Universele Apps en Universal Windows Platform Apps
Universele apps (UA) bereikten hun zenit in Windows 8.1. Je kon apps implementeren gericht op Windows Intel desktop, de ARM RT Surface en de Windows Phone (ARM), allemaal in dezelfde oplossing. Ze konden gemeenschappelijke code delen zoals event handlers, algemene berekeningen en data. XAML-code moest specifiek zijn voor het doel. Je compileerde gewoon de afzonderlijke subprojecten voor elk doel. Tijdens de compilaties werd de gemeenschappelijke code meegenomen.
Met de "One Windows" paradigma-shift in Windows 10 kan dezelfde code voor alle doelen gebruikt worden, inclusief de XAML-code. Hetzelfde project hoeft alleen maar voor verschillende doelen opnieuw gecompileerd te worden. Met de UA-naam toegepast op Windows 8-apps, was een nieuwe naam nodig voor de werkelijk universele apps. Daarom werd de naam Universal Windows Platform apps bedacht voor Windows 10.
Alle Windows 10-platforms ondersteunen UWP-apps. Maar er zijn extensies specifiek voor elk platform. Bijvoorbeeld Windows 10 IoT-extensies ondersteunen GPIO, I2C, SPI, etc. Mobiele extensies ondersteunen telefoonfuncties. Etc. UWP biedt een gegarandeerde kern API-laag over alle apparaten.
De Windows 10 Extension SDKs. De Desktop, Mobile en IoT-extensies zijn aangevinkt.
Voor deze blog gebruiken we de UWP-sjabloon in plaats van de UA als in de vorige blog. We hebben geen van de extensie-SDK's nodig.
[1] Bluetooth-communicatie instellen met het Arduino-apparaat
Je kunt deze sectie overslaan als je de Win 8.1-activiteit al gedaan hebt.
USB of Bluetooth kan gebruikt worden voor de Firmata-communicatie tussen het Arduino-apparaat en het Windows-apparaat. Voor Windows 10 kunnen beide gebruikt worden, terwijl voor Windows 8.1 alleen Bluetooth kan worden gebruikt. Voor deze versie van de app wordt Bluetooth gebruikt. Ik gebruikte een Sparkfun Bluetooth Mate Gold, terwijl de Sparkfun Bluetooth Mate Silver werd gebruikt met het "Blinky"-voorbeeld waarnaar boven verwezen. Het belangrijkste verschil is dat de bereik van de Gold tot 100m is, terwijl die van de Silver 10m is. De standaard handshake-instellingen zijn ook anders. Beide hebben een TTL-niveau UART-interface die zowel gebruikt kan worden voor het configureren van de werkmodus van het Bluetooth-apparaat als voor het interageren met de Arduino-seriële poort.






Als je het Bluetooth-apparaat moet configureren, kan een Sparkfun of Freetronics USB-Serieel of gratis apparaat gebruikt worden om het apparaat via een desktop-seriële terminal te configureren. Je kunt het apparaat ook naar fabrieksinstellingen resetten door de PIO6 (eigenlijk PIO4) pin hoog te maken, en drie keer te toggelen.
Bluetooth Mate heeft dezelfde pin-uitgang als de Sparkfun FTDI Basic, en ze kunnen onderling gewisseld worden. Je kunt de Bluetooth Mate niet direct in een FTDI Basic-board steken (je moet TX en RX omwisselen). Die configuratie kan gebruikt worden met een desktop-seriële terminal, met het FTDI-apparaat via USB verbonden met de desktop, om het Bluetooth-apparaat te configureren (of het Bluetooth-apparaat te gebruiken voor seriële communicatie vanaf de desktop).
De standaard TTL UART-seriële instellingen zijn:
- · Baudrate 115.200
- · 8 bits
- · Geen Pariteit
- · 1 stopbit
- · Hardware flow control ingeschakeld (op Mate Silver is dit None)
- · Serial Port Profile (SPP): FireFly-WXYZ waar WXYZ de laatste 4 cijfers van het BT MAC-adres van het apparaat zijn.
- · Pascode 1234
Let op dat het apparaat tot 8 apparaarkoppelingen kan opslaan.
De documentatie voor het Bluetooth-apparaat is te vinden op:
SparkFun Datasheet
De Firmata-configuratie is voor een baudrate van 57600 wat gewijzigd moet worden of het Bluetooth-apparaat moet daarvoor geconfigureerd worden. Voor deze oefening zullen we de Firmata-configuratie wijzigen, wat de eenvoudigere benadering is. De hardware flow control kan ook afgehandeld worden door het Bluetooth-apparaat te configureren, maar voor deze oefening wordt dit afgehandeld door RTS aan CTS te koppelen.
Hoewel het Bluetooth-apparaat op een breadboard gemonteerd kan worden en vanaf daar verbonden kan worden met het Arduino-apparaat, koos ik ervoor om een socket ervoor op een prototyping shield te monteren.
Een 6-pins Arduino Shield Header werd op het Bluetooth-apparaat gesoldeerd aan de TTL UART-pinnen met de socket naar buiten gericht. De pennen werden 90 graden naar beneden gebogen zodat het apparaat verticaal in een andere shield-header gestoken kan worden. De BT-socket kan dan direct gebruikt worden om het te verbinden met een op dezelfde manier gemonteerde FTDI Basic-module als configuratie vereist is. Later werd een draad aan PIO6 (PIO4) op de Bluetooth-module gesoldeerd, voor fabrieksreset.
Figuur 3: Bluetooth-module met shield-header aan UART-pinnen, en shield-headers
Een 8-pins shield-header werd in het midden van het prototype-schild aan de onderkant gemonteerd. Voeg ook headers aan de buitenkant van het schild toe zodat het direct in de Uno kan worden gestoken.
Figuur 4: Arduino Prototype Shield voor het monteren van de Bluetooth-module
De Bluetooth-module wordt dan ingevoegd met de GPIO-pinnen naar de pinnen 0 en 1 (Rx/Tx) toe, met de gele locatie vrij. Een van die kan gebruikt worden als tijdelijke locatie voor de fabrieksreset-draad.
Figuur 6: Gemonteerde Bluetooth-module op Arduino-apparaat
[2] Firmata instellen
Je kunt deze sectie overslaan als je de Win 8.1-activiteit al gedaan hebt.
Let op: De Arduino Uno's UART-pinnen 0 en 1 zijn niet beschikbaar wanneer het via USB vanuit de Arduino IDE geprogrammeerd wordt. Deze dezelfde pinnen zijn wat verbonden zijn met de Bluetooth-module's TTL UART-interface wanneer het geïntegreerd is voor Firmata-communicatie. Daarom, wanneer het Arduino-apparaat in deze sectie geprogrammeerd moet worden, mag het Bluetooth-apparaat niet verbonden zijn.
2.1 Aannemend dat je eerder voor een Arduino (Uno) apparaat hebt ontwikkeld, maak een nieuwe Standard Firmata shield:
2.2 Er is één wijziging te maken, de baudrate. In de IDE, zoek naar 57600. Vervang het door 115200. Sla de sketch op, ik noemde het Firmata_115200. Programmeer de Uno en dit deel is klaar.
[3] Universele App Firmata-softwarestack instellen
Deze sectie verschilt slechts iets van de Win 8.1-activiteit.
De softwarestack bestaat uit drie lagen:
De Remote-Wiring API implementeert eigenschappen (configuratie), methoden en events op conceptueel hoog niveau voor Arduino-hardware-interactie. Bijvoorbeeld GPIO (bijv. Get en Set Pin, On Pin changed etc.). Het communiceert met de Firmata-laag met behulp van het Firmata-protocol. Firmata communiceert naar beneden via de seriële protocol die geïmplementeerd is als Bluetooth en USB-Seriele transportlagen in de Serial-laag. De USB-optie is niet beschikbaar voor Windows 8.1.
Deze softwarestack is beschikbaar vanuit twee bronnen:
Beide bevatten Windows 8.1 en Windows 10-versies. Hoewel beide versies' Windows 10-versies zullen bouwen, heb ik gevonden dat de tweede zijn Windows 8.1 niet zal bouwen. Ik gebruikte de Visual Studio 2015 RC-versie:
- Microsoft Visual Studio Community 2015 RC
- Versie 14.0.22823.1 D14REL
- Microsoft .NET Framework versie 4.6.00076
3.1 Download de eerste versie. Om dit goed te doen, moet je de repository klonen (download niet de zip):
- Installeer git of GitHub
- In de git-shell of GitHub Desktop Shell (het is PowerShell), voer het volgende in vanaf een geschikte map:
git clone --recursive https://github.com/ms-iot/windows-remote-arduino-samples.git
De mapstructuur van wat je krijgt is:
windows-remote-arduino-samples
o remote-wiring
Microsoft.Maker.win8_1
Microsoft.Maker.win10
source
o win8_1
o win10
De laatste twee mappen (win8_1 en win10) zijn voorbeeld-apps (inclusief het "blinky"-voorbeeld) die we voor nu negeren. Beide Maker-versies maken gebruik van dezelfde source-map, dus voor Windows 10 hebben we alleen nodig:
windows-remote-arduino-samples
o remote-wiring
Microsoft.Maker.win10
source
naar een geschikte map. Ik stel er een voor in de root van de schijf, zeg, c:\wras10, omdat ik ontdekte dat je fouten kunt krijgen met een ARM-build vanwege pijnamen die te lang zijn. Je wilt misschien ook de .md-bestanden kopiëren voor referentie. Deze kunnen in VS geopend worden.
3.2 Open het solution-bestand in Microsoft.Maker.win10
3.3 Stel het doel in op Win32-build de oplossing.
Er worden drie builds gedaan. Één voor elke van de drie lagen in de softwarestack.
3.4 Doen hetzelfde voor de ARM-configuratie. Als je een x64-machine hebt, wil je misschien die build ook proberen.
[4] De HW LED UWP-app maken
Er is een "kortsluiting" in deze sectie voor wie de vorige Win 8.1-activiteit gedaan heeft.
Voor deze initiële versie van de app(s) zal een softwareknop een hardware-LED aanzetten en een andere het uitschakelen. De LED zal verbonden zijn met GPIO-pin 5.
De "Blinky"-documentatie zegt dat er een aantal manieren zijn om deze bibliotheken te krijgen en te gebruiken. Uiteindelijk zal Nuget de manier zijn, maar dat is nog niet beschikbaar. Je kunt deze gebouwde versies op een algemene manier refereren op je ontwikkelsysteem. De makkelijkste manier is om de benodigde Universele app aan de oplossing toe te voegen en ernaar te refereren. We zullen die methode gebruiken.
4.1 Voeg een nieuwe C# Windows Blank Universal app toe aan de oplossing. (Let op: niet Windows 8.1 deze keer):

Geef het een geschikte naam. Ik noemde de mijn wrauwp: Windows Remote Arduino Universal app UWP.
Let op dat er nu slechts ÉÉN project gemaakt wordt (UWP).. De XAML en C#-code is hetzelfde voor de desktop- en mobiele versies van de app. Het verschil zit in hoe het gecompileerd wordt.
De Seriële en Bluetooth-mogelijkheden zijn nodig in het pakketmanifest:
4.2 Open het package.appmanifest in de teksteditor (niet de GUI) via View Code. De Internet Client-mogelijkheid is onderaan inbegrepen. Wijzig deze sectie in:
<Capabilities>
<Capability Name="internetClient" />
<DeviceCapability Name="bluetooth.rfcomm">
<Device Id="any">
<Function Type="name:serialPort"/>
</Device>
</DeviceCapability>
</Capabilities>
</Package>
Ook, als we USB-Serieel in plaats van Bluetooth-Serieel op de desktop zouden gebruiken, zouden we een mogelijkheid daarvoor toevoegen.
Een referentie naar elk van de relevante softwarelagen is vereist:
4.3 Voeg referenties toe aan Firmata, RemoteWiring en Serial voor de desktop UA (opnieuw hoef je dit maar voor één project te doen):

HINT: Voor wie de vorige Windows 8.1 al gedaan heeft, kun je nu afkappen wat volgt:
- Kopieer de grid XML-code van dat project naar MainPage.xaml in dit nieuwe project.
- Je kunt nu springen naar het testen van de app op de doelen
Voor wie hier doorgaat …
4.4 Wijzig de Grid XAML van beide UA in:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Button Name="OffButton" Click="OffButton_Click" Grid.Row="0" IsEnabled="False" HorizontalAlignment="Stretch" Foreground="White" Background="Green" FontSize="32">Off!</Button>
<Button Name="OnButton" Click="OnButton_Click" Grid.Row="1" IsEnabled="False" HorizontalAlignment="Stretch" Foreground="White" Background="Red" FontSize="32">On!</Button>
</Grid>
Opmerking We hebben nu maar één MainPage.cs, want er is maar één app-project… Eén Windows. Vroeger was er één voor de desktop en één voor de telefoon, die we gemeenschappelijk maakten door één versie in het shared-subproject te plaatsen.
Alle cs-code verwijst naar MainPage.cs
4.7 In de MainPage-klasse voeg de volgende declaraties bovenaan de klasse toe:
//Usb wordt niet ondersteund op Win8.1. Voor de USB-verbindingsstappen, verwijzen naar de win10-oplossing.
BluetoothSerial bluetooth;
RemoteDevice arduino;
// De pinnen die gebruikt worden. Let op: Echte pinnummers.
private const int LED_PIN = 5;
4.8 In de MainPage-constructor, na InitializeComponent() voeg toe:
In MainPage() de constructor
bluetooth = new BluetoothSerial("FireFly-748B");
arduino = new RemoteDevice(bluetooth);
bluetooth.ConnectionEstablished += OnConnectionEstablished;
Vervang FireFly-748B door je SPP.
4.9 Implementeer OnConnectionEstablished door de volgende methode aan de klasse toe te voegen:
private void OnConnectionEstablished()
{
//knoppen inschakelen op de UI-thread!
var action = Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, new Windows.UI.Core.DispatchedHandler(() => {
this.OnButton.IsEnabled = true;
this.OffButton.IsEnabled = true;
arduino.pinMode(LED_PIN, PinMode.OUTPUT);
}));
}
4.10 En ten slotte voeg de eventhandlers voor de knoppen aan de klasse toe:
private void OnButton_Click(object sender, RoutedEventArgs e)
{
//zet de LED verbonden met pin 5 AAN
arduino.digitalWrite(5, PinState.HIGH);
}
private void OffButton_Click(object sender, RoutedEventArgs e)
{
//zet de LED verbonden met pin 5 UIT
arduino.digitalWrite(5, PinState.LOW);
}
4.11 Test build de UWP-app in x86, x64 en ARM-configuraties
[5] De Universele apps deployen en testen
In deze sectie zullen we de hardware-LED aan het Arduino-apparaat aansluiten en de app draaien op de desktop, en een Windows 10-telefoon*
Test op je desktop
5.1 Stel de Desktop-app in als Startup Project
5.2 Stel het doel in op x86 en Local Machine. Herbouw de desktop UWP-app

5.3 Verbond Arduino Pin 5 met een hardware-LED. Voorzie GND, VCC en een geschikte weerstand in serie.
Zoals gezegd in een vorige blog met betrekking tot Windows 10 IoT Raspberry PI 2 GPIO gebruik ik een development board voor het implementeren van mijn test I/O zoals LEDs, schakelaars etc. Als je geen dergelijk board hebt, wil je misschien de "Blinky" hardwareconfiguratie gebruiken, maar je moet de polariteit van de pin-instelling in de knophandlers omkeren.
5.4 Zet het Arduino-apparaat aan en koppel de Bluetooth-module met je desktop (Pascode=1234). .. Ik ga ervan uit dat je weet hoe je dit doet.
5.5. Draai de app.
5.6 Het zal waarschijnlijk vragen of het OK is voor de app om verbinding te maken met het Bluetooth-apparaat .. OK
5.7 Test de functionaliteit van de app. Zet een breakpoint in de knophandler(s) en check dat je kunt debuggen.
5.8 Herhaal 4.1 tot 4.6 voor x64 als je een 64-bit desktop hebt.
5.9 Zet Bluetooth op je desktop uit
Nu je Windows 10-telefoon testen, ervan uitgaande dat de telefoon geconfigureerd is voor ontwikkeling.
5.10 Zet je telefoon aan, ga naar Instellingen/Bluetooth en zet het aan. Koppel met de Bluetooth-module (Pascode = 1234).
5.11 Ga verder met de Windows Universele app als startup project ..
5.12 Stel het doel in op ARM, Device en herbouw
5.11 Verbind de telefoon via USB Serieel met de desktop en deploy de app.
Nu de Raspberry PI 2 testen
DIT IS EEN WORK IN PROGRESS. ZIE OPMERKING AAN HET EINDE VAN DEZE SECTIE
5.13 De Remote debugger is al geïnstalleerd en actief op de RPI2 geconfigureerd voor Win 10 IoT.
5.14 Bepaal het IP-adres van de RPI2, bv. met de Windows IoT Core Watcher

5.15 In Project Properties-Debug stel het doel in op Remote Machine, Geen authenticatie en voer het IP-adres in

5.16 Herbouw de UWP-app
5.17 Deploy en test de app op de RPI2.
Ik heb de RPI2-versie nog niet via Bluetooth laten verbinden:
- Bluetooth wordt in de hoofdzak nog niet ondersteund
- Laat reacties achter als je ideeën of succes hiermee hebt.
- Ik zal hier updaten als ik vooruitgang maak
De Bluetooth-dongle is geladen op de RPI2

[6] De UI "opprikken"
Het volgende zal de UI opprikken en Bluetooth Connect- en Disconnect-knoppen toevoegen.
6.1 Wijzig de UI GRID XAML-code in (PS: Let op wijziging ten opzichte van vorige knoppen grid-rijen):
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="32"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Button Name="ConnectButton" Click="ConnectButton_Click" Grid.Row="0" IsEnabled="True" HorizontalAlignment="Stretch" BorderBrush="Lime" Foreground="Lime" FontSize="32">Connect</Button>
<Button Name="OffButton" Click="OffButton_Click" Grid.Row="1" IsEnabled="False" HorizontalAlignment="Stretch" Foreground="White" Background="Green" FontSize="32">Off!</Button>
<Button Name="OnButton" Click="OnButton_Click" Grid.Row="2" IsEnabled="False" HorizontalAlignment="Stretch" Foreground="White" Background="Red" FontSize="32">On!</Button>
<Button Name="DisconnectButton" Click="DisconnectButton_Click" Grid.Row="3" IsEnabled="False" HorizontalAlignment="Stretch" Foreground="Red" BorderBrush="Red" FontSize="32">Disconnect</Button>
<ProgressRing x:Name="progress1" Grid.Row="5" Height="50" Visibility="Visible"/>
</Grid>
De UI heeft grotere knoppen en is kleurrijker, wat betere bruikbaarheid biedt. Ik kwam hier na gebruikstest met mijn 4-jarige kleindochter!.
De ProgressRing is zichtbaar en cirkelt terwijl de app verbindt.
6.2 Voeg aan het einde van OnConnectionEstablished() toe:
In OnConnectionEstablished()
//BT is verbonden dus progress ring uitzetten
this.progress1.IsActive = false;
this.progress1.Visibility = Visibility.Collapsed;
6.3 Voeg de volgende handlers toe voor de Connect- en Disconnect-knoppen:
private void ConnectButton_Click(object sender, RoutedEventArgs e)
{
//deze parameters maken niet uit voor bluetooth- Arduino Firmata, behalve SerialConfig.SERIAL_8N1
bluetooth.begin(115200, SerialConfig.SERIAL_8N1);
this.ConnectButton.IsEnabled = false;
//Verbinden BT dus progress ring tonen
this.progress1.IsActive = true;
this.progress1.Visibility = Visibility.Visible;
}
private void DisconnectButton_Click(object sender, RoutedEventArgs e)
{
bluetooth.end();
this.OnButton.IsEnabled = false;
this.OffButton.IsEnabled = false;
this.ConnectButton.IsEnabled = true;
this.DisconnectButton.IsEnabled = false;
}
6.4 Commentaar de volgende regel uit of verwijder uit MainPageConstructor omdat het nu in de Connect-knophandler zit:
bluetooth.begin(115200, SerialConfig.SERIAL_8N1);
6.5 Voeg de volgende state management toe aan de OnButton-handler
In OnButton_Click()
this.OffButton.IsEnabled = true;
this.OnButton.IsEnabled = false;
6.6 En het volgende aan de OffButton-handler:
In OffButton_Click
this.OffButton.IsEnabled = false;
this.OnButton.IsEnabled = true;
6.7 Deploy en test de app op alle drie (4) doelen als in sectie 5
[7] Een Drukknop-invoegtoepassing toevoegen
In deze uitbreiding van de Windows 8.1 Universele apps, wordt een drukknop GPIO-invoer, op Arduino Pin 5, gefaciliteerd en de status ervan in de UI weergegeven. De invoer zal initieel gevoeld worden door periodiek de waarde te lezen.
De functionaliteit wordt vervolgens verbeterd door een handler voor het DigitalPinChanged-event te implementeren
7.1 Wijzig het Grid-besturingselement in de UI XAML-code voor beide UA als volgt:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="32"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Button Name="ConnectButton" Click="ConnectButton_Click" Grid.Row="0" IsEnabled="True" HorizontalAlignment="Stretch" BorderBrush="Lime" Foreground="Lime" FontSize="32">Connect</Button>
<Button Name="OffButton" Click="OffButton_Click" Grid.Row="1" IsEnabled="False" HorizontalAlignment="Stretch" Foreground="White" Background="Green" FontSize="32">Off!</Button>
<Button Name="OnButton" Click="OnButton_Click" Grid.Row="2" IsEnabled="False" HorizontalAlignment="Stretch" Foreground="White" Background="Red" FontSize="32">On!</Button>
<Button Name="DisconnectButton" Click="DisconnectButton_Click" Grid.Row="3" IsEnabled="False" HorizontalAlignment="Stretch" Foreground="Red" BorderBrush="Red" FontSize="32">Disconnect</Button>
<ProgressRing x:Name="progress1" Grid.Row="5" Height="50" Visibility="Visible"/>
<TextBox Name="TxtPin6" Visibility="Visible" Grid.Row="6" Text="Drukknop: HIGH"></TextBox>
</Grid>
7.2 In de MainPage-klasse specificeer de invoerpin:
- In declaraties bovenaan de klasse voeg de invoerpin toe:
In MainPage Declaraties
private const int PB_PIN = 6;
- In de OnConnectionEstablished-handler zet het op input:
In OnConnectionEstablished
arduino.pinMode(PB_PIN, PinMode.INPUT);
7.3 Voeg een timer toe om de invoer te pollen als volgt:
- In declaraties bovenaan de klasse:
In MainPage Declaraties
// In Poll-modus tasten de timer-ticks de invoeren
private DispatcherTimer pbPolltimer;
- In de constructor stel de timer in:
In MainPage()
this.pbPolltimer = new DispatcherTimer();
this.pbPolltimer.Interval = TimeSpan.FromMilliseconds(250);
this.pbPolltimer.Tick += PBTimer_Tick;
this.pbPolltimer.Stop();
- Voeg de timer-tick eventhandler toe
Voeg Poll Timer Tick handler toe
PinState pbPinValue = PinState.LOW;
private void PBTimer_Tick(object sender, object e)
{
PinState pbPinValueTemp = arduino.digitalRead(6);
Pushbutton_Pressed(pbPinValueTemp);
}
- Implementeer PushButton_Pressed():
Voeg PushButton_Pressed() toe
private void Pushbutton_Pressed(PinState pbPinValueTemp)
{
if (pbPinValue != pbPinValueTemp)
{
//Schrijf waarde als gewijzigd
TxtPin6.Text = "Drukknop: " + pbPinValueTemp.ToString();
pbPinValue = pbPinValueTemp;
}
}
7.4 We hebben een drukknopschakelaar nodig. Gelukkig voorziet mijn development board in deze, dus ik gebruik die gewoon. Als je zo'n beest niet hebt, implementeer dan het circuit aan de overkant.
In deze uitbreiding van de Windows 8.1 Universele apps, wordt een drukknop GPIO-invoer, op Arduino Pin 5, gefaciliteerd en de status ervan in de UI weergegeven. De invoer zal initieel gevoeld worden door periodiek de waarde te lezen. Met de Win 10 IoT Raspberry PI 2 (RPI2) is gerapporteerd dat er enkele bugs zijn met hoe vaak de digitale invoeren geregistreerd worden, wat in de RTM voor Win 10 IoT opgelost zal worden.
De functionaliteit wordt vervolgens verbeterd door een handler voor het DigitalPinChanged-event te implementeren
Debouncing kan voor deze situatie in hardware verbeterd worden door:
- Een kleine condensator over de schakelaar plaatsen om wat hardware-debouncing toe te voegen als RC-vertraging.
- Ook een Schmidt-trigger aan dit circuit toevoegen.
Met de RPI2 is er een optie om debouncing via softwareconfiguratie toe te voegen.
Met de RPI2 is er een optie om debouncing via softwareconfiguratie toe te voegen.

7.5 Bouw, deploy en test de app op de doelen als vorige
Laten we een software-gesimuleerde LED aan de UI toevoegen om de status van de schakelaar weer te geven.
7.6 Voeg het volgende toe aan de UI in de grid XAML-code in beide Universele apps:
- Voeg nog een Row Definition toe (onderaan)::
<RowDefinition Height="Auto"/>
- Voeg het volgende ellipse-besturingselement toe aan die rij:
Voeg een ellips toe aan de UI
<Ellipse x:Name="PBStatusLED" Fill="#FF96969B" Grid.Row="7" Stroke="Black" Width="64" IsRightTapEnabled="False" IsTapEnabled="True" IsDoubleTapEnabled="False" Height="64" VerticalAlignment="Top" HorizontalAlignment="Center" />
7.7 Voeg twee kleur-brush-definities toe aan de MainPage-klasse declaraties bovenaan:
Voeg kleuren toe in de Declaraties
// Kleuren voor ellips wanneer hardware drukknop ingedrukt/niet ingedrukt
private SolidColorBrush redBrush = new SolidColorBrush(Windows.UI.Colors.Red);
private SolidColorBrush grayBrush = new SolidColorBrush(Windows.UI.Colors.LightGray);
7.8 Implementeer de manipulatie van de LED met deze kleuren als volgt:
- In de klasse-constructor stel de initiële kleur in:
In de constructor
//Start met uit-kleur voor ellips
this.PBStatusLED.Fill = grayBrush;
- In PushButtonPressed() stel de kleur in afhankelijk van de knopstatus:
Voeg toe aan Pushbutton_Pressed()
switch (pbPinValue)
{
case PinState.HIGH:
this.PBStatusLED.Fill = redBrush;
break;
case PinState.LOW:
this.PBStatusLED.Fill = grayBrush;
break;
}
7.9 Bouw, deploy en test de apps op de doelen ..Wala!
Nu deze code verbeteren met het digitale event.
7.10 Commentaar alle code met betrekking tot de timer uit, maar laat de PushButtonPressed()-functie staan; vandaar de reden voor apart van de timer-tick eventhandler.
7.11 Voeg de event-delegate-specificatie toe aan de OnConnectionEstablished()-eventhandler binnen de actie
Voeg toe aan OnConnectionEstablished
arduino.AnalogPinUpdatedEvent += Arduino_AnalogPinUpdated;
We zouden de eventhandler als volgs kunnen implementeren:
Ongeldig DigitalPinUpdated
private async void Arduino_DigitalPinUpdated(byte pin, PinState pinValue)
{
if (pin == PB_PIN)
{
Pushbutton_Pressed(pinValue);
}
}
Maar dit mislukt omdat de event in een thread los van de hoofd-UI-thread draait. Dit is hetzelfde probleem als in .NET Windows Forms if (InvokeRequired) scenario.
7.12 Implementeer de eventhandler als volgt
Voeg DigitalPinUpdated toe
private async void Arduino_DigitalPinUpdated(byte pin, PinState pinValue)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
if (pin == PB_PIN)
{
Pushbutton_Pressed(pinValue);
}
});
}
7.13 Bouw, deploy en test de apps op de doelen. Wala
[8] Een Analog Invoer Toevoegen
Deze uitbreiding van de app-functionaliteit voegt een voortgangsbalk toe aan de UA UI om het niveau van een potentiometer in de hardware weer te geven.
De analoge invoer is via A0, pin 14.
Opnieuw voorziet mijn development board in een potentiometer voor dit doel, maar als je zo'n niet hebt, moet je dit circuit implementeren:

De analoge invoerpinnen zijn pinnen 14 (A0) tot pin 19 (A5).
arduino.pinMode(ANALOG_PIN, PinMode.ANALOG);
De opmerking hierboven is quite relevant. De eventhandler-signatuur geeft de analoge pin-index (0 tot 5) niet het pinnummer.
Analoge waarden lopen van 0 tot 1024. (10-bit)
// Let op: Heeft echt pinnummer nodig, niet analoge index:
arduino.pinMode(ANALOG_PIN, PinMode.ANALOG);
8.0 Schakel de Poll-timer weer in en schakel de Drukknop-event uit in de MainPage-klasse
8.1 In het grid-besturingselement in de UI XAML-code voeg nog een rij toe aan het grid als vorige en voeg een ProgressBar toe:
Voeg een ProgressBar toe aan de UI
<ProgressBar x:Name="analogBar" Value="0" Margin="10" Maximum="255" Height="32" IsIndeterminate="False" Grid.Row="8" Foreground="Green"/>
8.2 Voeg de Analogepincode als volgt toe.
- Declareren de pin bovenaan de MainPage-klasse:
Voeg de Analog Pin toe
private const int ANALOG_PIN = 14;
- Zet de modus op analog in OnConnectionEstablished() zoals hierboven
- Voeg het volgende toe aan de timer-tick-event:
Voeg toe aan Timer Tick Handler
//Let op: Analog Read Pin nummer is de analoge index
int PinValue = arduino.analogRead(ANALOG_PIN-14);
this.analogBar.Value = PinValue;
8.3 Bouw, deploy en test de app op de doelen. Variëer de potentiometer-positie en observeer de ProgressBar-veranderingen.
Nu voor de event-gedreven versie
8.4 Commentaar weer de Poll Timer-code uit.
8.5 Voeg de analoge eventhandler-delegaat-specificatie toe aan OnConnectionEstablished():
Zet Analog Pin Modus
// Let op: Heeft echt pinnummer nodig, niet analoge index:
arduino.pinMode(ANALOG_PIN, PinMode.ANALOG);
8.6 Voeg de Arduino_DigitalPinUpdated-eventhandlermethode toe:
Voeg AnalogPinUpdated toe
private async void Arduino_AnalogPinUpdated(byte pin, ushort PinValue)
{
//Let op: Pin nummer is de analoge index
if (pin == ANALOG_PIN -14)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
this.analogBar.Value = PinValue;
});
}
}
Let op dat de UI-update opnieuw asynchroon moet gebeuren.
8.7 Bouw, deploy en test de app op de doelen.
[9] Een PWM-uitgang toevoegen
Het is aan de lezer om analoge uitgang als PWM te implementeren, om een LED aan te sturen (gedimd via een schuifregelaar).
- PWM-pinnen:
3, 5, 6, 9, 10, en 11 > - Om een pin als PWM in te stellen:
arduino.pinMode(PWM_PIN,PinMode.PWM) > - Om een PWM-niveau in te stellen
arduino.analogWrite(byte, ushort) > - analogWrite-waarden lopen van 0 tot 255 (de ushort-parameter)
Ik zal misschien later een oplossing hiervoor geven.
[1] Ik heb eigenlijk een uitgevlogen eerdere versie van de Bluetooth-module gebruikt, maar de functionaliteit lijkt hetzelfde.
Code
- WindowsRemoteArduino_Win10.zip
WindowsRemoteArduino_Win10.zipC#
Een uitgebreide versie van "Blinky"
Input, Output, Analog Input
Fancy UI
Geen preview (alleen download).
Schema's
Productieproces
- Een Professionele Raspberry Pi Universele Afstandsbediening Bouwen met LIRC
- Bouw een Veilige Gezichtsherkenning-deur met Windows IoT en Raspberry Pi
- Nauwkeurige Temperatuur- & Vochtigheidsmonitoring met SHT15 op Windows 10 IoT Core
- Windows 10 IoT Core Installeren op Raspberry Pi 3 Model B+: Stap-voor-stap Handleiding
- GoPiGo v2 Uitbreiden op Windows 10 IoT Core voor Raspberry Pi 3
- Universele Android-afstandsbediening bouwen met Arduino, 1Sheeld en IR-besturing
- Bouw Boeiende LCD Animaties & Games met Arduino UNO
- Bouw een Slimme IoT Pot met ESP8266, Arduino & Ultrasonische Sensor – Real-time Monitoring
- Essentiële apps & apparaten voor remote supply chain teams
- PCB-ontwerp voor Internet of Things meesteren: Een uitgebreide gids
- Cisco Lanceert Cloud-Beheerde IoT Monitoring voor IT & OT Omgevingen