Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Generisches serielles Bluetooth mit Win 10 IoT-Core RPI2

Komponenten und Verbrauchsmaterialien

Raspberry Pi 2 Model B
× 1
Generischer Bluetooth-USB-Dongle
× 1
Arduino UNO
× 1
SparkFun Bluetooth-Modem - BlueSMiRF Silber
× 1

Apps und Onlinedienste

Microsoft Windows 10 IoT Core
Microsoft Visual Studio 2015

Über dieses Projekt

Weitere

Dieses Projekt wird ausführlich auf embedded101.com besprochen:

"Win 10 IoT-Core:Bluetooth Universal Windows Serial App"

Über

Dieses Projekt ist eine universelle Windows-App, die ein IoT-Core-Gerät wie einen Raspberry PI 2 mit einem eingebetteten Bluetooth-Gerät über das serielle Bluetooth-Profil mithilfe eines genetischen Bluetooth-USB-Dongles verbindet.

Hintergrund

.Bluetooth unterstützt Peer-to-Peer-Netzwerke über eine kurze Reichweite. Im Gegensatz zu einem Wi-Fi-Netzwerk ist die Bluetooth-Konnektivität eins zu eins. Zwei Geräte können sich verbinden und interagieren. Zum Beispiel können sich zwei Geräte symmetrisch unter Verwendung des seriellen Profils verbinden und Rohdaten zwischen ihnen übertragen. Im Allgemeinen ist die Bluetooth-Konnektivität jedoch asymmetrisch, wobei ein Ende ein bestimmtes Datenformat generiert, das am anderen Ende verwendet werden soll. Beispielsweise kann ein Mobiltelefon das A2DP-Profil (Advanced Audio Distribution Profile) implementieren und Audio an ein Headset streamen, das das HSP-Profil (Headset) implementiert. OBEX (Object Exchange) ist eine symmetrische Verbindung zwischen zwei Geräten, die Daten zwischen ihnen austauschen.

Das Microsoft IOT-Core Bluetooth-Beispielprojekt verwendet das GATT (Generic Attribute Profile Profile). Dies bietet Profilerkennungs- und -beschreibungsdienste für das Bluetooth Low Energy-Protokoll. Mit diesem Protokoll können an einem Ende einfache Geräte mit geringem Stromverbrauch angeschlossen werden, die Daten erzeugen, die von einem komplexen Prozessor verarbeitet werden.

Dies ist ein viel einfacheres Projekt als das Microsoft-Beispiel. Es betrifft nur das allgemeinere SPP (Serial Port Profile), das auf dem RFCOMM-Profil basiert. Es wurde mit einem sehr alten USB-Bluetooth-Dongle entwickelt und sollte daher mit jedem Bluetooth-Dongle funktionieren.

Die IoT-App

Diese App ist eine einfache Bluetooth Serial Universal Windows (Windows 10) Test-App. Es beginnt mit der Aufzählung (als Liste) aller Geräte, die über Bluetooth mit dem Gerät verbunden sind, auf dem die App ausgeführt wird. Eine wird durch Doppelklick ausgewählt, wodurch die Verbindung initiiert wird. Der zu sendende Text wird in eine Textbox eingegeben und beim Drücken einer Schaltfläche gesendet. Die App empfängt automatisch alle an sie gesendeten Texte (und zeigt sie an). Wenn der Endpunkt (wie oben) also einfach den empfangenen Text wiedergibt, sollte der gesendete Text wieder im Empfangsfeld der UW-App erscheinen.


Der Endpunkt

Zum Testen wird ein Arduino Uno mit einem Bluetooth-Adapter verwendet. Es hat einen einfachen Schild, der nur alle Zeichen zurückgibt, die es über die Bluetooth-Verbindung empfängt:

Der Schildaufbau:

// Eine serielle Loopback-App// Früheres Setup// Initiiert durch verbundenes System// Hinweis kann mit Bluetooth verwendet werden, wo die RxTx des BT-Geräts// mit dem TxRx des Arduino-Boards verbunden sind. // Muss den BT-Adapter zum Programmieren trennen.void setup () { // Mein Adapter ist auf diesen BAUD 115200 eingestellt // Dies ist die Arduino-zu-BT-Adapter-Port-Rate // Wird eingestellt, wenn sich der BT-Adapter im Befehlsmodus befindet. // Es ist NICHT die BT-Rate, die Sie nicht einstellen können. Serial.begin(115200); Verzögerung (333); while (!Seriell); Verzögerung (1000); Serial.println("Der schnelle braune Fuchs springt über den faulen Hund!");} 

Die Schildschleife:

void loop () { char ch =Serial.read (); während ( 255 ==(Byte) ch) { ch =Serial.read (); } Serial.print(ch);} 

Koppeln

Bluetooth ist ein Peer-to-Peer-Szenario. Bevor sie sich über Bluetooth verbinden können, müssen sie gekoppelt werden. Dies geschieht nicht innerhalb der App. Das Pairing mit einem Passkey kann zwischen eingebetteten Geräten problematisch sein, da sie oft ohne Kopf sind und Popups möglicherweise nicht unterstützen (wie IoT-Core nicht). Dafür gibt es ein IoT-Core-Webportal sowie ein Kommandozeilen-Dienstprogramm auf dem Gerät, das über eine SSH-Shell ausgeführt werden kann. Die neueste Version des OS-Webportals unterstützt das Pairing von Passkeys, das zur Zeit von Windows 10 RTM fehlte. "Win 10 IoT-Core:Bluetooth Universal Windows Serial App" geht in diesem Zusammenhang ausführlich auf das Pairing ein.

Projekt starten

Das App-Projekt wird in Visual Studio 2015 mit der Universellen Windows-App-Vorlage erstellt:

Neues Projekt-->Visual C#->Windows->Leere App (Universal Windows)

Erstellen der App-Benutzeroberfläche

Die Benutzeroberfläche ist in XAML implementiert

Erstellen Sie die Benutzeroberfläche gemäß dem Layout wie oben (oder ähnlich):

Die Benutzeroberfläche ist recht einfach und wird wie folgt erstellt:

  • Alle Textelemente sind TextBlocks mit Ausnahme des SendText, der eine TextBox ist
  • SendText akzeptiert CarriageReturn (dh ist mehrzeilig)
  • Der Recvd-Text hat WrapText aktiviert (dh ist mehrzeilig)
  • UI-Elemente werden in Zeilen mit einem StackPanel organisiert, das auf horizontale Ausrichtung eingestellt ist
  • Diese StackPanels werden dann gestapelt, wobei ein StackPanel zusammen mit der ListBox vertikal ausgerichtet ist.

Sie können es vorziehen, die Benutzeroberfläche mit Relativen StackPanels zu gestalten oder Rasterzeilen und -spalten usw. zu verwenden.

Das ConnectDevices ist eine ListBox mit einer Binding Source, die auf PairedDevices eingestellt ist (siehe später ) und ein ItemTemplate bestehend aus einem TextBlock, der an die Name-Eigenschaft von PairedDevices gebunden ist (siehe später ).

      

App-Konfiguration

  • Die App verwendet keine IOT-Core-Funktionen und erfordert daher keine Erweiterungsreferenzen.
  • Die App benötigt einige spezielle Funktionen für Bluetooth und Serial, die zu Package.appxmanifest hinzugefügt werden.
  • Leider unterstützt die Benutzeroberfläche, die Sie dafür erhalten, wenn Sie im Projektmappen-Explorer auf diese Datei doppelklicken, das Hinzufügen dieser Funktionen nicht. Sie müssen sie daher manuell hinzufügen, indem Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Datei klicken und Öffnen mit auswählen.>XML-Editor.

Ändern Sie den Abschnitt "Funktionen" (unten) in:

       

Die internetClient-Funktion ist bereits vorhanden. Es wird für diese App nicht benötigt, daher möchten Sie es möglicherweise entfernen. Ich lasse es drin.

Informationen zu gekoppelten Geräten

Beim App-Start werden die gekoppelten Geräte nummeriert mit:

DeviceInformationCollection DeviceInfoCollection

=wait DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort));

Diese Sammlung wird dann in eine ObservableCollection umgewandelt dass es in der ListBox verwendet werden kann:

_pairedDevices =new ObservableCollection();

Die DeviceInfoCollection wird durch das Erstellen einer PairedDeviceInfo . iteriert Objekt für jedes Element, das dann zu den _pairedDevices hinzugefügt wird Sammlung.

PairedDeviceInfo ist eine Klasse mit Eigenschaften:

Name

ID

DeviceInfo

Die Klasse hat einen passenden Konstruktor.

Geräteinformationen ist Windows.Devices.Enumeration.DeviceInformation

In der Listbox der gekoppelten Geräte ist der Name Feld wird (gebunden) angezeigt.

Wenn ein Gerät ausgewählt (Doppelklick) wird die DeviceInformation des Endpunkts tatsächlich Teil des ausgewählten Menüelements und wird daher zum Herstellen der  Verbindung verwendet.

Verbindung

Die DeviceInformation wird verwendet, um den RFCOMM-Dienst abzurufen. Die Verbindung wird dann als StreamSocket unter Verwendung des Endpoint-Hostnamens (eigentlich seine Bluetooth-Mac-Adresse) und der ServiceName-Zeichenfolge hergestellt.

_service =wait RfcommDeviceService.FromIdAsync(DeviceInfo.Id);_socket =new StreamSocket();await _socket.ConnectAsync(_service.ConnectionHostName, _service.ConnectionServiceName); 

Wenn alles in Ordnung ist, haben wir eine Verbindung .. der Socket ist sinnvoll (nicht null).

Natürlich ist dies fehlerbehaftet (try-catch)

Text senden und Text empfangen verwenden die Eigenschaften InputStream und OutputStream des Sockets.

SMS empfangen

Der Empfang von Text sollte zuerst gestartet werden, da er als separater Thread ausgeführt wird. Es führt einen asynchronen Wartevorgang aus, um eine serielle Eingabe zu erhalten, verarbeitet die Eingabe und führt dann einen weiteren asynchronen seriellen Empfang aus. Alles in einer Schleife. Dies wird kontinuierlich wiederholt, bis eine Stornierung generiert wird.

privat async void Listen(){ ReadCancellationTokenSource =new CancellationTokenSource(); if (_socket.InputStream !=null) { dataReaderObject =new DataReader(_socket.InputStream); // weiterhin die serielle Eingabe lesen while (true) { wait ReadAsync (ReadCancellationTokenSource.Token); } }}DataReader dataReaderObject;private CancellationTokenSource ReadCancellationTokenSource;private asynchrone Aufgabe ReadAsync (CancellationToken CancellationToken) { uint ReadBufferLength =1024; // Wenn der Abbruch der Aufgabe angefordert wurde, erfüllen Sie CancellationToken.ThrowIfCancellationRequested(); // InputStreamOptions setzen, um den asynchronen Lesevorgang abzuschließen, wenn ein oder mehrere Bytes verfügbar sind dataReaderObject.InputStreamOptions =InputStreamOptions.Partial; // Erstellen Sie ein Aufgabenobjekt, um auf Daten auf dem serialPort.InputStream zu warten loadAsyncTask =dataReaderObject.LoadAsync(ReadBufferLength).AsTask(cancellationToken); // Task starten und warten UInt32 bytesRead =wait loadAsyncTask; if (bytesRead> 0) { string recvdtxt =dataReaderObject.ReadString (bytesRead); }} 

SMS senden

Während der empfangene Text asynchron ausgeführt wird, da die Ankunft von Text aus Sicht der App nicht deterministisch ist, wird gesendeter Text von der Benutzeroberfläche der App ausgeführt und ist daher im Wesentlichen synchron (obwohl ein Wait verwendet wird, um die Benutzeroberfläche freizugeben).

privat async void Send(string msg){ Task storeAsyncTask; DataWriter dataWriteObject =new DataWriter(_socket.OutputStream); dataWriteObject.WriteString(msg); // Starten Sie eine asynchrone Aufgabe, um die Schreiboperation abzuschließen storeAsyncTask =dataWriteObject.StoreAsync().AsTask(); UInt32 bytesWritten =wait storeAsyncTask;} 

Schaltflächenstatus

Die Befehlsschaltflächen werden je nach Status der App aktiviert und deaktiviert. Zum Beispiel sind die Schaltflächen Senden und Recv starten deaktiviert, wenn die App nicht verbunden ist, werden jedoch aktiviert, wenn die App verbunden ist usw.

Genießen! :)

Code

iotbluetoothserial auf Github
Auch auf Codeplex (Spiegel)https://iotgenbluetoothserialuwa.codeplex.com/https://github.com/djaus2/iotbluetoothserial

Herstellungsprozess

  1. GoPiGo v2 mit Windows IoT
  2. Dimmen von Lichtern mit PWM über Drucktasten
  3. Druckluftstrom-Messgerät mit analogem Sensor
  4. Arduino-Gyroskop-Spiel mit MPU-6050
  5. Discord-Überwachungskamera mit ESP32
  6. DHT11-Sensor mit LEDs und einem Piezo-Lautsprecher
  7. Unopad - Arduino MIDI-Controller mit Ableton
  8. Batteriebetriebene TV-Fernbedienung mit 3D-bedrucktem Gehäuse
  9. Arduino mit Bluetooth zur Steuerung einer LED!
  10. Einfacher Hindernissensor mit Arduino