IoT:Windows Remote Arduino und universelle Apps
Komponenten und Verbrauchsmaterialien
| × | 1 | ||||
| × | 1 |
Über dieses Projekt
Hinweis:Siehe die Updates in den Kommentaren unten.
Eine Windows 10 UWP-App kann auf der Remote-Wiring aufgebaut werden Bibliothek, sodass die App mit einem Arduino-Gerät interagieren kann, auf dem Firmata ausgeführt wird. Es wird eine App entwickelt, ähnlich dem Windows Remote Arduino „Blinky“, jedoch mit Funktionserweiterungen. Es führt GPIO (Ausgang UND Eingang) sowie einige analoge E/A durch. Diese App ist funktional identisch mit der Windows 8.1-Version im vorherigen Blog dieser Serie. Dieser Blog arbeitet mit dem gleichen Material (dh wiederholt viel davon) wie der vorherige Blog, jedoch aus dem Kontext der universellen Windows-Plattform (UWP) und nicht dem Kontext der universellen Windows 8.1-App. Das Ziel der App ist Win 10 Desktop, Win 10 Phone und Raspberry PI2 (mit Win 10 IoT). Letzteres Ziel ist jedoch ein "work-in-progress". Dieser Blog kann ohne Bezugnahme auf den vorherigen Blog gelesen werden.
Dieses Projekt wird in meinem Blog unter http://embedded101.com/Blogs/David-Jones/entryid/636/Windows-10-IoT-Windows-Remote-Arduino-and-Universal-Windows-Platform-Apps beschrieben
Das Windows Remote Arduino „Blinky“-Beispiel ist unter ms-iot.github.io.
Universelle Apps und universelle Windows-Plattform-Apps
Universal Apps (UA) erreichten ihren Höhepunkt in Windows 8.1 Sie könnten Apps für Windows Intel Desktop, das ARM RT Surface und das Windows Phone (ARM) in derselben Lösung implementieren. Sie könnten gemeinsamen Code wie Ereignishandler, allgemeine Berechnungen und Daten teilen. XAML-Code musste für das Ziel spezifisch sein. Sie haben lediglich die einzelnen Teilprojekte für jedes Target zusammengestellt. Bei den Kompilierungen wurde der gemeinsame Code eingebunden.
Mit dem „One Windows“-Paradigmenwechsel in Windows 10 kann derselbe Code für alle Ziele, also auch der XAML-Code, für alle Ziele verwendet werden. Das gleiche Projekt muss nur für verschiedene Ziele neu kompiliert werden. Da der UA-Name auf Windows 8-Apps angewendet wurde, wurde ein neuer Name für die wirklich universellen Apps benötigt. Daher wurde der Name Universelle Windows-Plattform-Apps für Windows 10 geprägt.
Alle Windows 10-Plattformen unterstützen UWP-Apps. Es gibt jedoch für jede Plattform spezifische Erweiterungen. Zum Beispiel unterstützen Windows 10 IoT-Erweiterungen GPIO, I2C, SPIO usw. Mobile Erweiterungen unterstützen Telefonfunktionen. UWP bietet eine garantierte Kern-API-Schicht für alle Geräte.
Die Windows 10-Erweiterungs-SDKs. Die Desktop-, Mobile- und IoT-Erweiterungen werden überprüft.
Für diesen Blog verwenden wir das UWP-Template anstelle des UA wie im vorherigen Blog. Wir benötigen keines der Erweiterungs-SDKs.
[1] Richten Sie die Bluetooth-Kommunikation mit dem Arduino-Gerät ein.
Sie können diesen Abschnitt überspringen, wenn Sie die Win 8.1-Aktivität bereits durchgeführt haben.
USB oder Bluetooth können für die Firmata-Kommunikation zwischen dem Arduino-Gerät und dem Windows-Gerät verwendet werden. Für Windows 10 können beide verwendet werden, während für Windows 8.1 nur Bluetooth verwendet werden kann. Für diese Version der App wird Bluetooth verwendet. Ich habe einen Sparkfun Bluetooth Mate Gold verwendet, während der Sparkfun Bluetooth Mate Silver mit dem oben erwähnten "Blinky"-Beispiel verwendet wurde. Der Hauptunterschied besteht darin, dass die Reichweite des Gold bis zu 100 m beträgt, während die des Silbers 10 m beträgt. Die Standard-Handshake-Einstellungen sind ebenfalls unterschiedlich. Diese verfügen beide über eine UART-Schnittstelle auf TTL-Ebene, die sowohl zur Konfiguration des Betriebsmodus des Bluetooth-Geräts als auch zur Interaktion mit der seriellen Schnittstelle von Arduino verwendet werden kann.
Wenn Sie das Bluetooth-Gerät konfigurieren müssen, kann ein Sparkfun- oder Freetronics-USB-Serial- oder Free-Gerät verwendet werden, um das Gerät über ein serielles Desktop-Terminal zu konfigurieren. Sie können das Gerät auch auf die Werkseinstellungen zurücksetzen, indem Sie den PIO6-Pin (eigentlich PIO4) mit High verbinden und dreimal umschalten.
Bluetooth Mate hat die gleiche Pinbelegung wie das Sparkfun FTDI Basic und kann daher austauschbar verwendet werden. Sie können den Bluetooth Mate nicht direkt an ein FTDI Basic Board anschließen (Sie müssen TX und RX austauschen). Diese Konfiguration kann mit einem seriellen Desktop-Terminal verwendet werden, wobei das FTDI-Gerät über USB mit dem Desktop verbunden ist, um das Bluetooth-Gerät zu konfigurieren (oder um das Bluetooth-Gerät für die serielle Kommunikation vom Desktop aus zu verwenden.
Die standardmäßigen seriellen TTL-UART-Einstellungen sind:
- · Baudrate 115.200
- · 8 Bit
- · Keine Parität
- · 1 Stoppbit
- · Hardware-Flusskontrolle aktiviert (bei Mate Silver ist dies None)
- · Serial Port Profile (SPP):FireFly-WXYZ
wobei WXYZ die letzten 4 Ziffern der BT-MAC-Adresse des Geräts sind. - · Passwort 1234
Beachten Sie, dass das Gerät bis zu 8 Gerätepaare speichern kann.
Die Dokumentation für das Bluetooth-Gerät finden Sie unter:
http://www.sparkfun.com/datasheets/Wireless/Bluetooth/rn-bluetooth-um.pdf
Die Firmata-Konfiguration ist für eine Baudrate von 57600, die geändert werden muss oder das Bluetooth-Gerät dafür konfiguriert. Für diese Übung werden wir die Firmata-Konfiguration ändern, was der einfachere Ansatz ist. Der Hardware-Steuerungsfluss kann auch durch die Konfiguration des Bluetooth-Geräts gehandhabt werden, aber für diese Übung wird durch die Verbindung von RTS mit CTS gehandhabt.
Während das Bluetooth-Gerät auf einem Breadboard montiert und von dort mit dem Arduino-Gerät verbunden werden kann, habe ich mich dafür entschieden, eine Buchse dafür auf einem Prototyping Shield zu montieren.
Ein 6-poliger Arduino Shield Header wurde an den TTL-UART-Pins mit der Buchse nach außen auf das Bluetooth-Gerät gelötet. Die Pins wurden um 900 nach unten gebogen, damit das Gerät senkrecht in einen anderen Schirmträger gesteckt werden kann. Über die BT-Buchse kann es dann bei Bedarf direkt mit einem ähnlich montierten FTDI-Basismodul verbunden werden. Später wurde ein Draht an PIO6 (PIO4) des Bluetooth-Moduls zum Zurücksetzen auf die Werkseinstellungen angelötet.
Abbildung 3 Bluetooth-Modul mit geschirmtem Header an UART-Pins und geschirmten Headern
Ein 8-Schild-Header wurde in der Mitte des Prototypen-Schildes unten montiert. Fügen Sie auch Header an der Außenseite der Abschirmung hinzu, damit sie direkt in den Uno gesteckt werden kann.
Abbildung 4 Arduino Prototype Shield zur Montage des Bluetooth-Moduls
Das Bluetooth-Modul wird dann mit Blick auf die GPIO-Pins in Richtung der Pins 0 und 1 (Rx/Tx) eingesetzt, wobei die gelbe Position frei bleibt. Einer davon kann als temporärer Ort für das Kabel zum Zurücksetzen auf die Werkseinstellungen verwendet werden.
Abbildung 6 Montiertes Bluetooth-Modul auf einem Arduino-Gerät
[2] Firmata einrichten
Sie können diesen Abschnitt überspringen, wenn Sie die Win 8.1-Aktivität bereits durchgeführt haben.
Hinweis: Die UART-Pins 0 und 1 des Arduino Uno sind nicht verfügbar, wenn er über USB von der Arduino-IDE programmiert wird. Dieselben Pins sind mit der TTL-UART-Schnittstelle des Bluetooth-Moduls verbunden, wenn es für die Firmata-Kommunikation angeschlossen ist. Wenn das Arduino-Gerät in diesem Abschnitt programmiert werden soll, sollte das Bluetooth-Gerät daher nicht verbunden sein.
2.1 Angenommen, Sie haben zuvor für ein Arduino (Uno)-Gerät entwickelt, erstellen Sie ein neues Standard-Firmata-Shield:
2.2 Es ist eine Änderung vorzunehmen, die Baudrate. Suchen Sie in der IDE nach 57600. Ersetzen Sie 115200. Speichern Sie die Skizze, ich habe sie Firmata_115200 genannt. Programmieren Sie das Uno und dieser Teil ist fertig.
[3] Richten Sie den Universal App Firmata-Software-Stack ein
Dieser Abschnitt unterscheidet sich nur geringfügig von der Aktivität von Win 8.1.
Der Software-Stack besteht aus drei Schichten:
Die Remote-Wiring API implementiert Eigenschaften (Konfiguration), Methoden und Ereignisse auf konzeptionell hohem Niveau für die Arduino-Hardware-Interaktion. Zum Beispiel GPIO (zB Get und Set Pin, On Pin geändert usw.). Es kommuniziert mit der Firmata-Schicht unter Verwendung des Firmata-Protokolls. Firmata kommuniziert den Stack über das serielle Protokoll, das als Bluetooth- und USB-Seriell-Transportschichten in der seriellen Schicht implementiert ist. Die USB-Option ist für Windows 8.1 nicht verfügbar.
Dieser aufgerufene Software-Stack ist für zwei Quellen verfügbar:
- https://github.com/ms-iot/windows-remote-arduino-samples
- https://github.com/ms-iot/remote-wiring/
Beide enthalten die Versionen Windows 8.1 und Windows 10. Während die Windows 10-Versionen beider Versionen erstellt werden, habe ich festgestellt, dass Windows 8.1 der zweiten Version nicht erstellt wird. Ich habe die Version von Visual Studio 2015 RC verwendet:
- Microsoft Visual Studio Community 2015 RC
- Version 14.0.22823.1 D14REL
- Microsoft .NET Framework
- Version 4.6.00076
3.1 Laden Sie die erste Version herunter. Um dies richtig zu tun, müssen Sie das Repository klonen (nicht die ZIP-Datei herunterladen):
- Installieren Sie git oder GitHub
- Geben Sie in der Git-Shell oder GitHub-Desktop-Shell (es ist Powershell) Folgendes aus einem geeigneten Verzeichnis ein:
git-Klon --rekursiv https://github.com/ms-iot/windows-remote-arduino-samples.git
Die Verzeichnisstruktur von dem, was Sie erhalten, ist:
Windows-Remote-Arduino-Beispiele
o Fernverkabelung
Microsoft.Maker.win8_1
Microsoft.Maker.win10
Quelle
o win8_1
o win10
Die letzten beiden Ordner (win8_1 und win10) sind nur Beispiel-Apps (einschließlich des „blinky“-Beispiels), die wir vorerst ignorieren. Beide Maker-Versionen verwenden denselben Quellordner, daher benötigen wir für Windows 10 nur:
Windows-Remote-Arduino-Beispiele
o Fernverkabelung
Microsoft.Maker.win10
Quelle
in einen passenden Ordner. Ich schlage eine im Stammverzeichnis des Laufwerks vor, beispielsweise c:\wras10, da ich festgestellt habe, dass bei einem ARM-Build einige Fehler auftreten können, die mit zu langen Pfadnamen zusammenhängen. Vielleicht möchten Sie auch die .md-Dateien als Referenz kopieren. Diese können in VS geöffnet werden.
3.2 Öffnen Sie die Lösungsdatei in Microsoft.Maker.win10
3.3 Legen Sie das Ziel auf Win32 fest, um die Lösung zu erstellen.
Drei Builds sind fertig. Eine für jede der drei Ebenen im Software-Stack..
3.4 Machen Sie dasselbe für die ARM-Konfiguration. Wenn Sie einen x64-Computer haben, möchten Sie vielleicht auch diesen Build ausprobieren.
[4] Erstellen Sie die HW-LED-UWP-App
In diesem Abschnitt gibt es einen "Kurzschluss" für diejenigen, die die vorherige Win 8.1-Aktivität durchgeführt haben.
Bei dieser ersten Version der App/s schaltet eine Software-Taste eine Hardware-LED ein und eine andere schaltet sie aus. Die LED wird an GPIO-Pin 5 angeschlossen.
In der „Blinky“-Dokumentation heißt es, dass es eine Reihe von Möglichkeiten gibt, diese Bibliotheken zu erhalten und zu verwenden. Letztendlich wird Nuget der Weg sein, aber das ist noch nicht verfügbar. Sie können diese erstellten Versionen in Ihrem Entwicklungssystem allgemein referenzieren. Am einfachsten ist es, die erforderliche universelle App zur Lösung hinzuzufügen und darauf zu verweisen. Wir werden diese Methode verwenden.
4.1 Fügen Sie der Lösung eine neue universelle C#-Windows Blank-App hinzu. (Achtung diesmal nicht Windows 8.1):
Geben Sie ihm einen passenden Namen. Ich habe mein wrauwp aufgerufen:Windows Remote Arduino Universal App UWP.
Beachten Sie, dass diesmal nur EIN Projekt erstellt wurde (UWP). Der XAML- und CSharp-Code ist für die Desktop- und die mobile Version der App identisch. Der Unterschied liegt in der Zusammenstellung.
Die seriellen und Bluetooth-Funktionen werden im Paket-Manifest benötigt:
4.2 Öffnen Sie das package.appmanifest im Texteditor (nicht dessen GUI) mit View Code. Die Internet-Client-Funktionalität ist unten enthalten. Ändern Sie diesen Abschnitt zu:
In packkage.appmanifest
Wenn wir USB-Seriell anstelle von Bluetooth-Seriell auf dem Desktop verwenden würden, würden wir eine Funktion dafür hinzufügen.
Ein Verweis auf jede der relevanten Softwareschichten ist erforderlich:
4.3 Referenzen Firmata, RemoteWiring und Serial für den Desktop-UA hinzufügen (auch hier nur für ein Projekt erforderlich):
TIPP:Für diejenigen, die bereits das vorherige Windows 8.1 gemacht haben, können Sie jetzt Folgendes kurzschließen :
- Kopieren Sie den Raster-XML-Code aus diesem Projekt in MainPage.xaml in diesem neuen Projekt.
- Sie können jetzt mit dem Testen der App auf dem/den Ziel(en) fortfahren
Für diejenigen, die hier fortfahren …
4.4 Ändern Sie das Grid-XAML beider UAs in:
MainPage.xaml:Benutzeroberfläche
Kommentar Wir haben dieses Mal nur eine MainPage.cs, da es nur ein App-Projekt gibt ... Ein Windows.
Zuvor gab es eine für den Desktop und eine für das Telefon, die wir gemeinsam gemacht haben, indem wir eine Version in das Teilprojekt "Share" platziert haben.
Der gesamte cs-Code verweist auf MainPage.cs
4.7 Fügen Sie in der MainPage-Klasse die folgenden Deklarationen am Anfang der Klasse hinzu:
MainPage.cs-Deklarationen
//USB wird unter Win8.1 nicht unterstützt. Um die Schritte zur USB-Verbindung zu sehen, lesen Sie stattdessen die win10-Lösung.
BluetoothSerielles Bluetooth;
RemoteDevice arduino;
// Die verwendeten Pins. Hinweis:Tatsächliche Pinn-Nummern.
private const int LED_PIN =5;
4.8 im MainPage-Konstruktor, nach InitializeComponent() hinzufügen:
In MainPage() der Konstruktor
Bluetooth =neue BluetoothSerial("FireFly-748B");
arduino =neues RemoteDevice (Bluetooth);
bluetooth.ConnectionEstablished +=OnConnectionEstablished;
Ersetzen Sie FireFly-748B durch Ihr SPP.
4.9 Implementieren Sie OnConnectionEstablished, indem Sie der Klasse den folgenden mthod hinzufügen:
OnConnectionEstablished() hinzufügen
privater Void OnConnectionEstablished()
{
//Schaltflächen im UI-Thread aktivieren!
var action =Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, new Windows.UI.Core.DispatchedHandler(() => {
this.OnButton.IsEnabled =true;
das. OffButton.IsEnabled =true;
arduino.pinMode(LED_PIN, PinMode.OUTPUT);
}));
}
4.10 Und schließlich fügen Sie der Klasse die Ereignishandler für die Schaltflächen hinzu:
Schaltflächenereignishandler hinzufügen
private void OnButton_Click(object sender, RoutedEventArgs e)
{
//Schalte die an Pin 5 angeschlossene LED EIN
arduino.digitalWrite(5, PinState.HIGH);
}
private void OffButton_Click(Objektsender, RoutedEventArgs e)
{
//Schalte die an Pin 5 angeschlossene LED aus
arduino.digitalWrite(5, PinState.LOW);
}
4.11 Testen Sie die UWP-App in x86-, x64- und ARM-Konfigurationen
[5] Bereitstellen und Testen der universellen Apps.
In diesem Abschnitt werden wir die Hardware-LED mit dem Arduino-Gerät verbinden und die App auf dem Desktop und einem Windows 10 Phone ausführen*
Testen Sie auf Ihrem Desktop
5.1 Legen Sie die Desktop-App als Startprojekt fest
5.2 Setzen Sie das Ziel auf x86 und Local Machine. Erstellen Sie die Desktop-UWP-App neu
5.3 Verbinden Sie den Arduino Pin 5 mit einer Hardware-LED. Stellen Sie GND, VCC und einen geeigneten Widerstand in Reihe bereit.
Wie in einem früheren Blog in Bezug auf . erwähnt Windows 10 IoT Raspberry PI 2 GPIO Ich verwende ein Entwicklungsboard, um meine Test-IOs wie LEDs, Schalter usw. zu implementieren. Wenn Sie kein ähnliches Board haben, möchten Sie vielleicht das „Blinky“-Hardwarekonfiguration Sie müssen jedoch die Polarität der Pin-Einstellung in Schaltflächen-Handlern umkehren.
5.4 Schalten Sie das Arduino-Gerät ein und koppeln Sie das Bluetooth-Modul mit Ihrem Desktop (Passkey=1234). .. Ich gehe davon aus, dass Sie wissen, wie das geht.
5.5. Führen Sie die App aus.
5.6 Sie werden wahrscheinlich gefragt, ob es in Ordnung ist, dass die App eine Verbindung zum Bluetooth-Gerät herstellt. OK
5.7 Testen Sie die Funktionalität der App. Setzen Sie einen Breakpoint in den Button-Handlern und prüfen Sie, ob Sie debuggen können.
5.8 Wiederholen Sie 4.1 bis 4.6 für x64, wenn Sie einen 64-Bit-Desktop haben.
5.9 Deaktivieren Sie Bluetooth auf Ihrem Desktop
Testen Sie jetzt Ihr Windows 10 Phone, vorausgesetzt, das Telefon ist für die Entwicklung konfiguriert.
5.10 Schalten Sie Ihr Telefon ein, gehen Sie zu Einstellungen/Bluetooth und schalten Sie es ein. Mit dem Bluetooth-Modul koppeln (Passkey =1234).
5.11 Fortfahren mit der Windows Universal-App als Startprojekt ..
5.12 Setzen Sie das Ziel auf ARM,, Gerät und neu erstellen
5.11 Verbinden Sie das Telefon über USB Serial mit dem Desktop und stellen Sie die App bereit.
Jetzt den Raspberry PI 2 testen
DAS IST EINE ARBEIT IN ARBEIT. SIEHE HINWEIS AM ENDE DIESES ABSCHNITTs
5.13 Der Remote-Debugger ist bereits auf dem für Win 10 IoT konfigurierten RPI2 installiert und aktiv.
5.14 Ermitteln Sie die IP-Adresse des RPI2, zB mit dem Windows IoT Core Watcher
5.15 Stellen Sie in den Projekteigenschaften-Debug das Ziel auf Remote-Computer, Keine Authentifizierung und geben Sie die IP-Adresse ein
5.16 Erstellen Sie die UWP-App neu
5.17 Stellen Sie die App auf dem RPI2 bereit und testen Sie sie.
Ich habe noch nicht die RPI2-Version, um eine Bluetooth-Verbindung herzustellen:
- Bluetooth wird hauptsächlich noch nicht unterstützt
- Bitte hinterlassen Sie Kommentare, wenn Sie Ideen oder Erfolg damit haben.
- Ich werde hier aktualisieren, wenn ich Fortschritte mache
[6] "Verschönern" Sie die Benutzeroberfläche
Im Folgenden wird die Benutzeroberfläche verschönert und die Schaltflächen Bluetooth Connect und Disconnect hinzugefügt.
6.1 Ändern Sie den UI GRID-XAML-Code in (PS:Beachten Sie die Änderung der vorherigen Schaltflächenrasterzeilen ):
Fügen Sie zwei Schaltflächen &
hinzu
Die Benutzeroberfläche hat größere Schaltflächen und ist farbenfroher, was eine bessere Benutzerfreundlichkeit bietet. Ich bin darauf gekommen, nachdem ich es mit meiner 4-jährigen Enkelin getestet hatte!.
Der ProgressRing ist sichtbar und zirkuliert, während die App eine Verbindung herstellt.
6.2 Fügen Sie am unteren Rand von OnConnectionEstablished() ein:
In OnConnectionEstablished()
//BT ist verbunden, also schalte den Fortschrittsring aus
this.progress1.IsActive =false;
this.progress1.Visibility =Visibility.Collapsed;
6.3 Fügen Sie die folgenden Handler für die Schaltflächen Connect und DisConnect hinzu:
Eventhandler für neue Schaltflächen hinzufügen
private void ConnectButton_Click(object sender, RoutedEventArgs e)
{
//Diese Parameter sind für Bluetooth- Arduino Firmata egal, außer SerialConfig.SERIAL_8N1
bluetooth.begin(115200, SerialConfig.SERIAL_8N1);
this.ConnectButton.IsEnabled =false;
//BT verbinden, also Fortschrittsring anzeigen
this.progress1.IsActive =true;
this.progress1.Visibility =Visibility.Visible;
}
privat 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 Kommentieren Sie die folgende Zeile aus MainPageConstructor aus oder entfernen Sie sie, da sie jetzt im Connect-Button-Handler ist:
bluetooth.begin(115200, SerialConfig.SERIAL_8N1);
6.5 Fügen Sie dem OnButton-Handler die folgende Statusverwaltung hinzu
In OnButton_Click()
this.OffButton.IsEnabled =true;
this.OnButton.IsEnabled =false;
6.6 Und Folgendes zum OffButton-Handler:
In OffButton_Click
this.OffButton.IsEnabled =false;
this.OnButton.IsEnabled =true;
6.7 Bereitstellen und testen der App auf allen drei (4) Zielen wie in Abschnitt 5
[7] Drucktasteneingang hinzufügen
In dieser Erweiterung der Windows 8.1 Universal Apps wird ein Drucktasten-GPIO-Eingang am Arduino Pin 5 ermöglicht und dessen Zustand in der Benutzeroberfläche angezeigt. Die Eingabe wird zunächst durch periodisches Lesen des Wertes erfasst.
Die Funktionalität wird dann verbessert, indem ein Handler für das DigitalPinChanged-Ereignis implementiert wird
7.1 Ändern Sie das Grid-Steuerelement im UI-XAML-Code für beide UA wie folgt:
Fügen Sie der Benutzeroberfläche ein Textfeld hinzu
7.2 Geben Sie in der MainPage-Klasse den Eingangs-Pin an:
- Fügen Sie in Deklarationen oben in der Klasse den Eingabe-Pin hinzu:
In MainPage-Deklarationen
private const int PB_PIN =6;
- Im OnConnectionEstablished-Handler setzen Sie es auf input::
In OnConnectionEstablished
arduino.pinMode(PB_PIN, PinMode.INPUT);
7.3, Fügen Sie einen Timer zum Abfragen der Eingabe wie folgt hinzu:
- In Deklarationen an der Spitze der Klasse:
In MainPage-Deklarationen
// Im Poll-Modus tasten Timer-Ticks die Eingaben ab
privater DispatcherTimer pbPolltimer;
- Im Konstruktor den Timer einstellen:
In MainPage()
this.pbPolltimer =new DispatcherTimer();
this.pbPolltimer.Interval =TimeSpan.FromMilliseconds(250);
this.pbPolltimer.Tick +=PBTimer_Tick;
this.pbPolltimer.Stop();
- Fügen Sie seinen Timer-Tick-Ereignishandler hinzu
Abfrage-Timer-Tick-Handler hinzufügen
PinState pbPinValue =PinState.LOW;
private void PBTimer_Tick(Objektsender, Objekt e)
{
PinState pbPinValueTemp =arduino.digitalRead(6);
Pushbutton_Pressed(pbPinValueTemp);
}
- Implementieren Sie PushButton_Pressed():
PushButton_Pressed() hinzufügen
privater Void Pushbutton_Pressed(PinState pbPinValueTemp)
{
if (pbPinValue !=pbPinValueTemp)
{
//Wert schreiben, falls geändert
TxtPin6.Text ="Taste:" + pbPinValueTemp.ToString();
pbPinValue =pbPinValueTemp;
}
}
7.4 Wir brauchen einen Druckknopfschalter. Zum Glück stellt mein Entwicklungsboard diese zur Verfügung, also verwende ich sie einfach. Wenn Sie kein solches Biest haben, implementieren Sie die gegenüberliegende Schaltung.
In dieser Erweiterung zu den Windows 8.1 Universal Apps wird ein GPIO-Eingang auf Knopfdruck am Arduino Pin 5 ermöglicht und dessen Zustand in der Benutzeroberfläche angezeigt. Die Eingabe wird zunächst durch periodisches Lesen des Wertes erfasst. Mit dem Win 10 IoT Raspberry PI 2 (RPI2) wurde es gemeldet dass es einige Fehler bei der Häufigkeit der Registrierung der digitalen Eingänge gibt, die im RTM für Win 10 IoT behoben werden.
Die Funktionalität wird dann verbessert, indem ein Handler für das DigitalPinChanged-Ereignis implementiert wird
Die Entprellung kann für diese Situation in Hardware verbessert werden durch:
- Legen Sie einen kleinen Kondensator über den Schalter, um etwas Hardware-Entprellung als RC-Verzögerung hinzuzufügen.
- Fügen Sie dieser Schaltung auch einen Schmidt-Trigger hinzu.
Mit dem RPI2 besteht die Möglichkeit, eine Entprellung durch Softwarekonfiguration hinzuzufügen.
Beim RPI2 besteht die Möglichkeit, die Entprellung durch Softwarekonfiguration hinzuzufügen.7.5 Erstellen, Bereitstellen und Testen der App auf den Zielen wie zuvor
Fügen wir der Benutzeroberfläche eine durch Software simulierte LED hinzu, um den Status des Schalters anzuzeigen.
7.6 Fügen Sie der Benutzeroberfläche im Raster-XAMLcode in beiden universellen Apps Folgendes hinzu:
- Fügen Sie eine weitere Zeilendefinition hinzu (unten):
- Fügen Sie dieser Zeile das folgende Ellipsen-Steuerelement hinzu:
Ellipse zur Benutzeroberfläche hinzufügen
7.7 Fügen Sie den MainPage-Klassendeklarationen oben zwei Farbpinsel-Definitionen hinzu:
Farben in den Deklarationen hinzufügen
// Farben für Ellipse bei gedrückter/nicht gedrückter Hardware-Taste
privat SolidColorBrush redBrush =new SolidColorBrush(Windows.UI.Colors.Red);
privat SolidColorBrush greyBrush =new SolidColorBrush(Windows.UI.Colors.LightGray);
7.8 Implementieren Sie die Manipulation der LEDs mit diesen Farben wie folgt:
- Legen Sie im Klassenkonstruktor seine Anfangsfarbe fest:
Im Konstruktor
//Beginnen Sie mit der Farbe der Ellipse
this.PBStatusLED.Fill =greyBrush;
- In PushButtonPressed() die Farbe abhängig vom Zustand der Schaltfläche einstellen:
Zu Pushbutton_Pressed() hinzufügen
Schalter (pbPinValue)
{
Fall PinState.HIGH:
this.PBStatusLED.Fill =redBrush;
Pause;
Fall PinState.LOW:
this.PBStatusLED.Fill =greyBrush;
Pause;
}
7.9 Erstellen, Bereitstellen und Testen der Apps auf den Zielen ..Wala!
Verbessern Sie jetzt diesen Code mithilfe des digitalen Ereignisses.
7.10 Kommentieren Sie den gesamten Code, der mit dem Timer zu tun hat, aus, aber verlassen Sie die Funktion PushButtonPressed(); hence the reason for separate to the timer tick event handler.
7.11 Add the event delegate specification to the OnConnectionEstablished() event handler within the action
Add to 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).
Schaltpläne
Herstellungsprozess
- Raspberry Pi Universal-Fernbedienung
- Windows IoT:Tür zur Gesichtserkennung
- Windows 10 IoT Core und SHT15
- Windows 10 IoT Core für Raspberry Pi 3 Model B+
- GoPiGo v2 mit Windows IoT
- Die Apps und Geräte, die Remote-Lieferkettenteams unterstützen
- Universelle Fernbedienung mit Arduino, 1Sheeld und Android
- LCD-Animation und -Spiele
- Leitfaden zu PCBs und IoT
- Cisco stellt IoT-Fernüberwachungslösungen für IT und OT vor