IoT:Windows Remote Arduino en universele apps
Componenten en benodigdheden
| × | 1 | ||||
| × | 1 |
Over dit project
Opmerking:zie de updates in de opmerkingen onderaan.
Een Windows 10 UWP-app kan worden gebouwd op de Remote-Wiring bibliotheek zodat de app kan communiceren met een Arduino-apparaat waarop Firmata draait. Er is een app ontwikkeld, vergelijkbaar met het Windows Remote Arduino "Blinky"-voorbeeld, maar met toevoeging van functies. Het voert zowel GPIO (output AND input) als een aantal analoge IO uit. Deze app is functioneel hetzelfde als de Windows 8.1-versie in de vorige blog in deze serie. Deze blog werkt met hetzelfde materiaal (dwz herhaalt veel ervan) als de vorige blog, maar vanuit de context van Universal Windows Platform (UWP) in plaats van 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). Dit laatste doelwit is echter een "work-in-progress". Deze blog kan gelezen worden zonder verwijzing naar de vorige blog.
Dit project wordt gedetailleerd beschreven op mijn blog op http://embedded101.com/Blogs/David-Jones/entryid/636/Windows-10-IoT-Windows-Remote-Arduino-and-Universal-Windows-Platform-Apps
Het Windows Remote Arduino “Blinky” voorbeeld is op ms-iot.github.io.
Universele apps en universele Windows-platformapps
Universele apps (UA) bereikten hun hoogtepunt in Windows 8.1 Je zou apps kunnen implementeren die gericht zijn op Windows Intel desktop, de ARM RT Surface en de Windows Phone (ARM), allemaal in dezelfde oplossing. Ze kunnen gemeenschappelijke code delen, zoals gebeurtenishandlers, algemene berekeningen en gegevens. XAML-code moest specifiek zijn voor het doel. Je hebt zojuist de afzonderlijke deelprojecten voor elk doel samengesteld. Tijdens de compilaties werd de gemeenschappelijke code opgenomen.
Met de "One Windows" paradigmaverschuiving in Windows 10 kan dezelfde code voor alle doelen, inclusief de XAML-code, voor alle doelen worden gebruikt. Hetzelfde project moet gewoon opnieuw worden gecompileerd voor verschillende doelen. Met de UA-naam toegepast op Windows 8-apps, was een nieuwe naam nodig voor de echt universele apps. Vandaar dat de naam Universal Windows Platform-apps is bedacht voor Windows 10.
Alle Windows 10-platforms ondersteunen UWP-apps. Maar er zijn extensies die specifiek zijn voor elk platform. Windows 10 IoT-extensies ondersteunen bijvoorbeeld GPIO, I2C, SPIO enz. Mobiele extensies ondersteunen telefoonfuncties. Enz. UWP biedt een gegarandeerde kern-API-laag op alle apparaten.
De Windows 10-extensie-SDK's. De Desktop-, Mobile- en IoT-extensies zijn aangevinkt.
Voor deze blog gebruiken we de UWP-template in plaats van de UA zoals in de vorige blog. We hebben geen van de extensie-SDK's nodig.
[1] Stel de Bluetooth-communicatie met het Arduino-apparaat in.
Je kunt dit gedeelte overslaan als je de Win 8.1-activiteit al hebt gedaan.
USB of Bluetooth kan worden gebruikt voor de Firmata-communicatie tussen het Arduino-apparaat en het Windows-apparaat. Voor Windows 10 kunnen beide worden gebruikt, 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 hierboven wordt verwezen. Het belangrijkste verschil is dat het bereik van het goud tot 100 meter is, terwijl dat van het zilver 10 meter is. De standaard handshake-instellingen zijn ook anders. Deze hebben beide een UART-interface op TTL-niveau die zowel kan worden gebruikt voor het configureren van de bedrijfsmodus van het Bluetooth-apparaat als voor interactie met de seriële poort van Arduino.
Als u het Bluetooth-apparaat moet configureren, kan een Sparkfun- of Freetronics USB-Serial- of Free-apparaat worden gebruikt om het apparaat te configureren via een seriële desktopterminal. Je kunt het apparaat ook terugzetten naar de fabrieksinstellingen door de PIO6 (de eigenlijke PIO4)-pin op hoog te zetten en drie keer te wisselen.
Bluetooth Mate heeft dezelfde pin-out als de Sparkfun FTDI Basic, en dus kunnen ze door elkaar worden gebruikt. je kunt de Bluetooth Mate niet rechtstreeks aansluiten op een FTDI Basic-bord (je moet TX en RX verwisselen). Die configuratie kan worden gebruikt met een seriële desktopterminal, met het FTDI-apparaat USB aangesloten op de desktop, om het Bluetooth-apparaat te configureren (of om een 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 stroomregeling ingeschakeld (op Mate Silver is dit Geen)
- · Serieel poortprofiel (SPP):FireFly-WXYZ
waarbij WXYZ de laatste 4 cijfers zijn van het BT MAC-adres van het apparaat. - · Wachtwoord 1234
Houd er rekening mee dat het apparaat maximaal 8 apparaatkoppelingen kan opslaan.
De documentatie voor het Bluetooth-apparaat is te vinden op:
http://www.sparkfun.com/datasheets/Wireless/Bluetooth/rn-bluetooth-um.pdf
De Firmata-configuratie is voor een baudrate van 57600 die moet worden gewijzigd of het Bluetooth-apparaat daarvoor is geconfigureerd. Voor deze oefening zullen we de Firmata-configuratie wijzigen, wat de gemakkelijkere benadering is. De hardwarestroom van controle kan ook worden afgehandeld door het Bluetooth-apparaat te configureren, maar voor deze oefening wordt afgehandeld door RTS te verbinden met CTS.
Hoewel het Bluetooth-apparaat op een Breadboard kan worden gemonteerd en van daaruit op het Arduino-apparaat kan worden aangesloten, heb ik ervoor gekozen om er een socket voor op een Prototyping Shield te monteren.
Een 6-pins Arduino Shield Header werd op het Bluetooth-apparaat gesoldeerd op de TTL UART-pinnen met de socket naar buiten gericht. De pinnen zijn 900 naar beneden gebogen, zodat het apparaat verticaal in een andere shield-header kan worden gestoken. De BT-aansluiting kan vervolgens worden gebruikt om deze rechtstreeks aan te sluiten op een soortgelijke gemonteerde FTDI-basismodule als configuratie vereist is. Later werd er een draad gesoldeerd aan PIO6 (PIO4) op de Bluetooth-module om de fabrieksinstellingen te herstellen.
Afbeelding 3 Bluetooth-module met shield-header op UART-pinnen en shield-headers
Een kop met 8 schilden werd onderaan in het midden van het prototypeschild gemonteerd. Voeg ook headers toe aan de buitenkant van het schild, zodat het rechtstreeks op de Uno kan worden aangesloten.
Afbeelding 4 Arduino Prototype Shield voor montage van de Bluetooth-module
De Bluetooth-module wordt vervolgens in de richting van de GPIO-pinnen geplaatst, in de richting van de pinnen 0 en 1 (Rx/Tx), waarbij de gele locatie vrij blijft. Een daarvan kan worden gebruikt als tijdelijke locatie voor de fabrieksresetdraad.
Afbeelding 6 Gemonteerde Bluetooth-module op Arduino-apparaat
[2] Firmata instellen
Je kunt dit gedeelte overslaan als je de Win 8.1-activiteit al hebt gedaan.
Opmerking: De UART-pinnen 0 en 1 van de Arduino Uno zijn niet beschikbaar wanneer deze via USB wordt geprogrammeerd vanaf de Arduino IDE. Deze zelfde pinnen zijn verbonden met de TTL UART-interface van de Bluetooth-module wanneer deze is aangesloten voor Firmata-communicatie. Daarom, wanneer het Arduino-apparaat in deze sectie moet worden geprogrammeerd, mag het Bluetooth-apparaat niet worden aangesloten.
2.1 Ervan uitgaande dat u eerder een Arduino (Uno)-apparaat hebt ontwikkeld, maakt u een nieuw Standard Firmata-schild:
2.2 Er moet één wijziging worden aangebracht, de Baudrate. Zoek in de IDE naar 57600. Vervang het 115200. Sla de schets op, ik noemde het Firmata_115200. Programmeer de Uno en dit deel is gedaan.
[3] De Universal App Firmata-softwarestack instellen
Dit gedeelte is alleen iets anders dan de Win 8.1-activiteit.
De softwarestack bestaat uit drie lagen:
De Remote-Wiring API implementeert eigenschappen (configuratie), methoden en gebeurtenissen op een conceptueel hoog niveau voor Arduino-hardware-interactie. Bijvoorbeeld GPIO (bijv. Get and Set Pin, On Pin gewijzigd etc). Het communiceert met de Firmata-laag via het Firmata-protocol. Firmata communiceert down the stack via het seriële protocol dat is geïmplementeerd als Bluetooth- en USB-seriële transportlagen in de seriële laag. De USB-optie is niet beschikbaar voor Windows 8.1.
Deze softwarestack genaamd is beschikbaar voor twee bronnen:
- https://github.com/ms-iot/windows-remote-arduino-samples
- https://github.com/ms-iot/remote-wiring/
Beide bevatten versies van Windows 8.1 en Windows 10. Hoewel de Windows 10-versies van beide versies zullen worden gebouwd, heb ik geconstateerd dat Windows 8.1 van de tweede 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 de zip niet):
- Installeer git of GitHub
- Voer in de git-shell of GitHub Desktop Shell (het is Powershell) het volgende in vanuit een geschikte map:
git clone --recursive https://github.com/ms-iot/windows-remote-arduino-samples.git
De directorystructuur van wat je krijgt is:
windows-remote-arduino-samples
o bedrading op afstand
Microsoft.Maker.win8_1
Microsoft.Maker.win10
bron
o win8_1
o win10
De laatste twee mappen (win8_1 en win10) zijn slechts voorbeeld-apps (inclusief het "blinky" voorbeeld) die we voorlopig zullen negeren. Beide Maker-versies maken gebruik van dezelfde bronnenmap, dus voor Windows 10 hebben we het volgende nodig:
windows-remote-arduino-samples
o bedrading op afstand
Microsoft.Maker.win10
bron
naar een geschikte map. Ik raad er een aan in de root van de schijf, bijvoorbeeld c:\wras10, omdat ik heb ontdekt dat je een aantal fouten kunt krijgen met een ARM-build die te maken heeft met te lange padnamen. Misschien wilt u ook de .md-bestanden kopiëren ter referentie. Deze kunnen in VS worden geopend.
3.2 Open het oplossingsbestand in Microsoft.Maker.win10
3.3 Stel het doel in op Win32 om de oplossing te bouwen.
Er worden drie builds gemaakt. Eén voor elk van de drie lagen in de softwarestack..
3.4 Doe hetzelfde voor de ARM-configuratie. Als je een x64-machine hebt, zou je die build misschien ook willen proberen.
[4] Maak de HW LED UWP-app
Er is een "kortsluiting" in dit gedeelte voor degenen die de vorige Win 8.1-activiteit hebben gedaan.
Voor deze eerste versie van de app/s zal een softwareknop een hardware-LED inschakelen en een andere zal deze uitschakelen. De LED wordt verbonden 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 weg zijn maar dat is nog niet beschikbaar. U kunt op een algemene manier naar deze gebouwde versies verwijzen op uw ontwikkelsysteem. De eenvoudigste manier is om gewoon de vereiste universele app aan de oplossing toe te voegen en ernaar te verwijzen. We zullen die methode gebruiken.
4.1 Voeg een nieuwe C# Windows Blank Universal-app toe aan de oplossing. (Let deze keer niet op Windows 8.1):
Geef het een passende naam. Ik noemde de mijne wrauwp:Windows Remote Arduino Universal app UWP.
Merk op dat er deze keer maar EEN project is gemaakt (UWP). De XAML- en CSharp-code is hetzelfde voor de desktop- en mobiele versies van de app. Het verschil zit 'm in de manier waarop het is samengesteld.
De seriële en Bluetooth-mogelijkheden zijn nodig in het pakketmanifest:
4.2 Open package.appmanifest in de teksteditor (niet de GUI) met View Code. De Internet Client-mogelijkheid is onderaan opgenomen. Wijzig deze sectie in:
In packkage.appmanifest
En als we USB-Serial in plaats van Bluetooth-Serial op de desktop zouden gebruiken, zouden we daar een mogelijkheid voor toevoegen.
Een verwijzing naar elk van de relevante softwarelagen is vereist:
4.3 Referenties Firmata, RemoteWiring en Serial voor de desktop UA toevoegen (ook dit hoef je maar voor één project te doen):
HINT:Voor degenen die de vorige Windows 8.1 al hebben gedaan, kunt u nu kortsluiten wat volgt :
- Kopieer de grid xml-code van dat project naar MainPage.xaml in dit nieuwe project.
- U kunt nu doorgaan naar het testen van de app op het/de doel(en)
Voor degenen die hier doorgaan ...
4.4 Wijzig beide UA's Grid XAML in:
MainPage.xaml:UI
Reageer We hebben dit keer maar één MainPage.cs, omdat er maar één app-project is... Eén Windows.
Voorheen was er één voor de desktop en één voor de telefoon, die we gemeenschappelijk hebben gemaakt door één versie in het deelproject te plaatsen.
Alle cs-code verwijst naar MainPage.cs
4.7 Voeg in de klasse MainPage de volgende verklaringen toe bovenaan de klasse:
MainPage.cs Verklaringen
//Usb wordt niet ondersteund op Win8.1. Raadpleeg in plaats daarvan de win10-oplossing om de stappen voor de USB-verbinding te zien.
BluetoothSeriële bluetooth;
RemoteDevice arduino;
// De gebruikte pinnen. Opmerking:werkelijke pincodes.
privé const int LED_PIN =5;
4.8 in de MainPage-constructor, voeg na InitializeComponent() toe:
In MainPage() de constructor
bluetooth =nieuwe BluetoothSerial("FireFly-748B");
arduino =nieuw RemoteDevice(bluetooth);
bluetooth.ConnectionEstablished +=OnConnectionEstablished;
Vervang FireFly-748B door uw SPP.
4.9 Implementeer OnConnectionEstablished door de volgende methode aan de klasse toe te voegen:
Voeg OnConnectionEstablished()
. toe
privé ongeldig OnConnectionEstablished()
{
// schakel de knoppen op de UI-thread in!
var action =Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, nieuwe Windows.UI.Core.DispatchedHandler(() => {
this.OnButton.IsEnabled =true;
dit. OffButton.IsEnabled =true;
arduino.pinMode(LED_PIN, PinMode.OUTPUT);
}));
}
4.10 En voeg tenslotte de event handlers voor de buttons toe aan de class:
Knopgebeurtenishandlers toevoegen
private void OnButton_Click(object afzender, RoutedEventArgs e)
{
//zet de LED aangesloten op pin 5 AAN
arduino.digitalWrite(5, PinState.HIGH);
}
private void OffButton_Click(object afzender, RoutedEventArgs e)
{
//zet de LED aangesloten op pin 5 UIT
arduino.digitalWrite(5, PinState.LOW);
}
4.11 Test de UWP-app in x86-, x64- en ARM-configuraties
[5] De universele apps implementeren en testen.
In deze sectie zullen we de hardware-LED aansluiten op het Arduino-apparaat en de app op de desktop uitvoeren, en een Windows 10 Phone*
Testen op je desktop
5.1 Stel de Desktop-app in als het opstartproject
5.2 Stel het doel in op x86 en Local Machine. Herbouw de desktop UWP-app
5.3 Sluit de Arduino Pin 5 aan op een hardware-LED. Zorg voor GND, VCC en een geschikte weerstand in serie.
Zoals vermeld in een eerdere blog met betrekking tot Windows 10 IoT Raspberry PI 2 GPIO Ik gebruik een ontwikkelbord voor het implementeren van mijn test-IO, zoals LED's, schakelaars enz. Als je geen vergelijkbaar bord hebt, wil je misschien de gebruiken “Blinky” hardwareconfiguratie maar je moet de polariteit van de pin-instelling in knop-handlers omkeren.
5.4 Schakel het Arduino-apparaat in en koppel de Bluetooth-module aan uw desktop (Passkey=1234). .. Ik neem aan dat je weet hoe je dit moet doen.
5.5. Start de app.
5.6 Het zal u waarschijnlijk vragen of het OK is dat de app verbinding maakt met het Bluetooth-apparaat. OK
5.7 Test de functionaliteit van de app. Stel een breekpunt in in de knophandler(s) en controleer of je fouten kunt opsporen.
5.8 Herhaal 4.1 tot 4.6 voor x64 als je een 64-bits desktop hebt.
5.9 Bluetooth uitschakelen op uw bureaublad
Nu om uw Windows 10-telefoon te testen, ervan uitgaande dat de telefoon is geconfigureerd voor ontwikkeling.
5.10 Zet je telefoon aan, ga naar Instellingen/Bluetooth en zet hem aan. Koppel met de Bluetooth-module (Passkey =1234).
5.11 Doorgaan met de Windows Universal-app als opstartproject ..
5.12 Stel het doel in op ARM,, Apparaat en herbouw
5.11 Verbind de telefoon via USB Serial met de desktop en implementeer de app.
Nu de Raspberry PI 2 testen
DIT IS EEN WERK IN UITVOERING. ZIE OPMERKING AAN HET EINDE VAN DEZE SECTIE
5.13 De externe debugger is al geïnstalleerd en actief op de RPI2 die is geconfigureerd voor Win 10 IoT.
5.14 Bepaal het IP-adres van de RPI2, bijv. met de Windows IoT Core Watcher
5.15 Stel in Project Properties-Debug het doel in op Remote Machine, No authenticatie en voer het IP-adres in
5.16 De UWP-app opnieuw opbouwen
5.17 Implementeer en test de app op de RPI2.
Ik heb de RPI2-versie nog niet om verbinding te maken via Bluetooth:
- Bluetooth wordt in het algemeen nog niet ondersteund
- Laat opmerkingen achter als je hier ideeën of succes mee hebt.
- Ik update hier wanneer ik vooruitgang boek
[6] Maak de gebruikersinterface mooi
Het volgende zal de gebruikersinterface mooier maken en Bluetooth Connect- en Disconnect-knoppen toevoegen.
6.1 Wijzig de UI GRID XAML-code in (PS:Let op wijziging in vorige knoppenrasterrijen ):
Voeg twee knoppen &
. toe
De gebruikersinterface heeft grotere knoppen en is kleurrijker voor een betere bruikbaarheid. Ik kwam tot dit nadat de gebruiker het had getest met mijn 4-jarige kleindochter!.
De ProgressRing is zichtbaar en circuleert terwijl de app verbinding maakt.
6.2 Invoegen onderaan OnConnectionEstablished() :
In OnConnectionEstablished()
//BT is verbonden, dus zet de voortgangsring uit
this.progress1.IsActive =false;
this.progress1.Visibility =Visibility.Samengevouwen;
6.3 Voeg de volgende handlers toe voor de Connect- en DisConnect-knoppen:
Eventhandlers voor nieuwe knoppen toevoegen
private void ConnectButton_Click(object afzender, RoutedEventArgs e)
{
//deze parameters zijn niet van belang voor bluetooth-Arduino Firmata, behalve SerialConfig.SERIAL_8N1
bluetooth.begin(115200, SerialConfig.SERIAL_8N1);
this.ConnectButton.IsEnabled =false;
// BT verbinden zodat voortgangsring wordt weergegeven
this.progress1.IsActive =true;
this.progress1.Visibility =Visibility.Visible;
}
private void DisconnectButton_Click(object afzender, RoutedEventArgs e)
{
bluetooth.end();
this.OnButton.IsEnabled =false;
this.OffButton.IsEnabled =false;
this.ConnectButton.IsEnabled =true;
this.DisconnectButton.IsEnabled =false;
}
6.4 Becommentarieer of verwijder de volgende regel uit MainPageConstructor aangezien deze nu in de knop-handler Connect zit:
bluetooth.begin(115200, SerialConfig.SERIAL_8N1);
6.5 Voeg het volgende statusbeheer toe aan de OnButton-handler
In OnButton_Cllick()
this.OffButton.IsEnabled =true;
this.OnButton.IsEnabled =false;
6.6 En het volgende voor de OffButton-handler:
In OffButton_Click
this.OffButton.IsEnabled =false;
this.OnButton.IsEnabled =true;
6.7 Implementeer en test de app op alle drie (4) doelen zoals in sectie 5
[7] Een drukknopingang toevoegen
In deze uitbreiding van de Windows 8.1 Universal-apps wordt een GPIO-input met drukknop, op Arduino Pin 5, mogelijk gemaakt en wordt de status ervan weergegeven in de gebruikersinterface. De ingang wordt in eerste instantie gedetecteerd door periodiek de waarde te lezen.
De functionaliteit zal dan worden verbeterd door een handler te implementeren voor de DigitalPinChanged-gebeurtenis
7.1 Wijzig het rasterbesturingselement in de UI XAML-code voor beide UA als volgt:
Voeg een tekstvak toe aan de gebruikersinterface
7.2 Geef in de klasse MainPage de invoerpin op:
- Voeg in verklaringen bovenaan de klasse de invoerpin toe:
In de hoofdpagina Aangiften
private const int PB_PIN =6;
- Stel het in de OnConnectionEstablished-handler in op input::
In OnConnectionEstablished
arduino.pinMode(PB_PIN, PinMode.INPUT);
7.3, Voeg een timer toe om de ingang als volgt te pollen:
- In verklaringen aan de top van de klas:
In de hoofdpagina Aangiften
// In de poll-modus bemonsteren timer-ticks de ingangen
privé DispatcherTimer pbPolltimer;
- Stel in de constructor de timer in:
In Hoofdpagina()
this.pbPolltimer =nieuwe DispatcherTimer();
this.pbPolltimer.Interval =TimeSpan.FromMilliseconds(250);
this.pbPolltimer.Tick +=PBTimer_Tick;
this.pbPolltimer.Stop();
- Voeg de timer-tick event-handler toe
Poll Timer Tick handler toevoegen
PinState pbPinValue =PinState.LOW;
private void PBTimer_Tick(object afzender, object e)
{
PinState pbPinValueTemp =arduino.digitalRead(6);
Pushbutton_Pressed(pbPinValueTemp);
}
- Implementeer PushButton_Pressed():
Voeg PushButton_Pressed()
toe
privé ongeldig Pushbutton_Pressed(PinState pbPinValueTemp)
{
if (pbPinValue !=pbPinValueTemp)
{
//Schrijf waarde indien gewijzigd
TxtPin6.Text ="Drukknop:" + pbPinValueTemp.ToString();
pbPinValue =pbPinValueTemp;
}
}
7.4 We hebben een drukknop nodig. Gelukkig biedt mijn ontwikkelbord deze, dus die gebruik ik gewoon. Als je zo'n beest niet hebt, implementeer dan het tegenovergestelde circuit.
In deze uitbreiding van de Windows 8.1 Universal-apps wordt een GPIO-input met drukknop, op Arduino Pin 5, mogelijk gemaakt en wordt de status ervan weergegeven in de gebruikersinterface. De ingang wordt in eerste instantie gedetecteerd door periodiek de waarde te lezen. Met de Win 10 IoT Raspberry PI 2 (RPI2) is dit gemeld dat er enkele bugs zijn met hoe vaak de digitale ingangen worden geregistreerd, die zullen worden opgelost in de RTM voor Win 10 IoT.
De functionaliteit wordt dan verbeterd door een handler te implementeren voor de DigitalPinChanged-gebeurtenis
Debouncen kan voor deze situatie in hardware worden verbeterd door:
- Plaats een kleine condensator over de schakelaar om wat hardware-debounce toe te voegen als RC-vertraging.
- Voeg ook een Schmidt-trigger toe aan dit circuit.
Bij de RPI2 is er een optie om debouncing toe te voegen via softwareconfiguratie.
Bij de RPI2 is er een optie om debouncing toe te voegen via softwareconfiguratie.7.5 Bouw, implementeer en test de app op de doelen zoals eerder
Laten we een door software gesimuleerde LED aan de gebruikersinterface toevoegen om de status van de schakelaar weer te geven.
7.6 Voeg het volgende toe aan de gebruikersinterface in de raster XAML-code in beide universele apps:
- Nog een rijdefinitie toevoegen (onderaan)::
- Voeg het volgende ellipsbesturingselement toe aan die rij:
Een ellips toevoegen aan de gebruikersinterface
7.7 Voeg twee kleurpenseeldefinities toe aan de MainPage-klassedeclaraties bovenaan:
Voeg kleuren toe in de declaraties
// Kleuren voor ellips wanneer hardwaredrukknop wordt ingedrukt/niet ingedrukt
private SolidColorBrush redBrush =nieuwe SolidColorBrush(Windows.UI.Colors.Red);
private SolidColorBrush greyBrush =nieuwe SolidColorBrush(Windows.UI.Colors.LightGray);
7.8 Implementeer de manipulatie van de LED's met deze kleuren als volgt:
- Stel in de klassenconstructor de beginkleur in:
In de constructor
//Begin met uit kleur voor ellips
this.PBStatusLED.Fill =greyBrush;
- Stel in PushButtonPressed() de kleur in, afhankelijk van de status van de knop:
Toevoegen aan Pushbutton_Pressed()
schakelaar (pbPinValue)
{
zaak PinState.HIGH:
this.PBStatusLED.Fill =redBrush;
pauze;
zaak PinState.LOW:
this.PBStatusLED.Fill =greyBrush;
pauze;
}
7.9 Bouw, implementeer en test de apps op de doelen ..Wala!
Nu deze code verbeteren met behulp van het digitale evenement.
7.10 Geef commentaar op alle code die met de timer te maken heeft, maar laat de functie PushButtonPressed() staan; vandaar de reden voor het apart zetten van de timer tick event handler.
7.11 Voeg de gebeurtenisafgevaardigdespecificatie toe aan de OnConnectionEstablished()-gebeurtenishandler binnen de actie
Toevoegen aan OnConnectionEstablished
arduino.AnalogPinUpdatedEvent +=Arduino_AnalogPinUpdated;
We could try to implement the event handler as follows:
Invalid DigitalPinUpdated
private async void Arduino_DigitalPinUpdated(byte pin, PinState pinValue)
{
if (pin ==PB_PIN)
{
Pushbutton_Pressed(pinValue);
}
}
But this fail as the event runs in a thread separate to the main UI thread. This is the same issue as in .NET Windows Forms if (InvokeRequired) scenario.
7.12 Implement the event handler as follows
Add DigitalPinUpdated
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 Build, deploy and test the apps on the targets. Wala
[8] Add an Analog Input
This extension to the app functionality adds a progress bar to the UA UI to display the level of a potentiometer in the hardware.
The analog input is via A0, pin 14.
Again my development board provides a potentiometer for this purpose but if you don’t have such you need to implement this circuit:The analog input pins are pins 14 (A0) to pin 19 (A5).
arduino.pinMode(ANALOG_PIN, PinMode.ANALOG);
The comment above is quite pertinent. The event handler signature provides the analog pin index (0 to 5) not the pin number.
Analog values range from 0 to 1024. (10 bit)
// Note:Need actual pin number, not analog index:
arduino.pinMode(ANALOG_PIN, PinMode.ANALOG);
8.0 Re-enable the Poll timer and disable the Pushbutton event in the MainPage class
8.1 In the grid control in the UI XAML code add another row to the grid as previous and add a ProgressBar:
Add a ProgressBar to the UI
8.2 Add the Analog pin code as follows.
- Declare the pin at the top of MainPage class:
Add the Analog Pin
private const int ANALOG_PIN =14;
- Set its mode to analog in OnConnectionEstablished() as above
- Add the following to the timer tick event:
Add to Timer Tick Handler
//Note:Analog Read Pin number is the analog index
int PinValue =arduino.analogRead(ANALOG_PIN-14);
this.analogBar.Value =PinValue;
8.3 Build, deploy and test the app on the targets. Vary the potentiometer position and observe the ProgressBar changes.
Now for the event driven version
8.4 Again comment out the Poll Timer code.
8.5 Add the analog event handler delegate specification to OnConnectionEstablished():
Set Analog Pin Mode
// Note:Need actual pin number, not analog ibndex:
arduino.pinMode(ANALOG_PIN, PinMode.ANALOG);
8.6 Add the Arduino_DigitalPinUpdated event handler method:
Add AnalogPinUpdated
private async void Arduino_AnalogPinUpdated(byte pin, ushort PinValue)
{
//Note:Pin number is the analog index
if (pin ==ANALOG_PIN -14)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
this.analogBar.Value =PinValue;
});
}
}
Note that the UI update has again to be done asynchronously.
8.7 Build, deploy and test the app on the targets.
[9] Add a PWM output
It is left to reader to implement analog output as PWM, to drive a LED (dimmed via a slider).
- PWM pins:
3, 5, 6, 9, 10, and 11> - To set a pin as PWM:
arduino.pinMode(PWM_PIN,PinMode.PWM)> - To set a PWM level
arduino.analogWrite(byte, ushort)> - analogWrite values are from 0 to 255 (the ushort parameter)
I might provide a solution to this at a later stage.
[1] I actually used a retired earlier version of the Bluetooth module, but functionality seems to be the same.
Code
- WindowsRemoteArduino_Win10.zip
WindowsRemoteArduino_Win10.zipC#
An extended version of "Blinky"Input, Output, Analog Input
Fancier UI
No preview (download only).
Schema's
Productieproces
- Raspberry Pi universele afstandsbediening
- Windows IoT:deur met gezichtsherkenning
- Windows 10 IoT Core en SHT15
- Windows 10 IoT Core voor Raspberry Pi 3 Model B+
- GoPiGo v2 met Windows IoT
- De apps en apparaten die externe supply-chain-teams ondersteunen
- Universele afstandsbediening met Arduino, 1Sheeld en Android
- LCD-animatie en gaming
- IOT - Smart Jar met ESP8266, Arduino en ultrasone sensor
- Gids voor PCB's en IoT
- Cisco introduceert IoT Remote Monitoring-oplossingen voor IT en OT