Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Generieke seriële Bluetooth met Win 10 IoT-Core RPI2

Componenten en benodigdheden

Raspberry Pi 2 Model B
× 1
Algemene Bluetooth USB-dongle
× 1
Arduino UNO
× 1
SparkFun Bluetooth-modem - BlueSMiRF Zilver
× 1

Apps en online services

Microsoft Windows 10 IoT Core
Microsoft Visual Studio 2015

Over dit project

Verder

Dit project wordt in detail besproken op embedded101.com:

"Win 10 IoT-Core:Bluetooth universele Windows seriële app"

Over

Dit project is een universele Windows-app die een IoT-Core-apparaat zoals een Raspberry PI 2 verbindt met een ingebouwd Bluetooth-apparaat via het Bluetooth Serial Profile met behulp van een genetische Bluetooth USB-dongle.

Achtergrond

.Bluetooth ondersteunt peer-to-peer-netwerken over een kort bereik. In tegenstelling tot een Wi-Fi-netwerk, is Bluetooth-connectiviteit één op één. Twee apparaten kunnen verbinding maken en communiceren. Twee apparaten kunnen bijvoorbeeld op een symmetrische manier verbinding maken met behulp van het seriële profiel en onbewerkte gegevens tussen hen doorgeven. Over het algemeen is Bluetooth-connectiviteit echter asymmetrisch, waarbij aan de ene kant een specifiek gegevensformaat wordt gegenereerd dat aan de andere kant kan worden gebruikt. Een mobiele telefoon kan bijvoorbeeld het A2DP-profiel (Advanced Audio Distribution Profile) implementeren en audio streamen naar een headset die het HSP-profiel (Headset) implementeert. OBEX (Object Exchange) is een symmetrische verbinding tussen twee apparaten terwijl ze gegevens tussen elkaar uitwisselen.

Het Microsoft IOT-Core Bluetooth-voorbeeldproject maakt gebruik van het GATT (Generic Attribute Profile Profile). Dit biedt profieldetectie- en beschrijvingsservices voor het Bluetooth Low Energy-protocol. Met dit protocol kunnen eenvoudige apparaten met een laag vermogen aan de ene kant worden aangesloten om gegevens te genereren die door een complexe processor kunnen worden gebruikt.

Dit is een veel eenvoudiger project dan het Microsoft-voorbeeld. Het houdt zich alleen bezig met het meer generieke SPP (Serial Port Profile) dat is gebaseerd op het RFCOMM-profiel. Het is ontwikkeld met een zeer oude USB Bluetooth-dongle en zou dus met elke Bluetooth-dongle moeten werken.

De IoT-app

Deze app is een eenvoudige Bluetooth Serial Universal Windows (Windows 10) test-app. Het begint met het opsommen (als een lijst) van alle apparaten die via Bluetooth zijn gekoppeld aan het apparaat waarop de app wordt uitgevoerd. Eén wordt geselecteerd door te dubbelklikken, waardoor de verbinding wordt gestart. Te verzenden tekst wordt ingevoerd in een tekstvak en verzonden wanneer er op een knop wordt gedrukt. De app ontvangt automatisch alle tekst die ernaar wordt verzonden (en geeft deze weer). Dus wanneer het eindpunt (zoals hierboven) gewoon de ontvangen tekst herhaalt, zou de verzonden tekst opnieuw moeten verschijnen in de ontvangstbox op de UW-app.


Het eindpunt

Voor het testen wordt een Arduino Uno met een Bluetooth-adapter gebruikt. Het heeft een eenvoudig schild dat alle tekens die het via de Bluetooth-verbinding ontvangt, terugkaatst:

De Shield-configuratie:

// Een seriële loopback-app// Eerdere setup// Geïnitieerd door aangesloten systeem// Note kan worden gebruikt met Bluetooth waarbij de RxTx van het BT-apparaat// zijn verbonden met de TxRx van het Arduino-bord. // Moet de BT-adapter loskoppelen om te kunnen programmeren. // Het is NIET de BT-snelheid die u niet kunt instellen. Serieel.begin(115200); vertraging (333); while (!Serial); vertraging (1000); Serial.println("De snelle bruine vos springt over de luie hond!");} 

De schildlus:

void loop() { char ch =Serial.read(); terwijl ( 255 ==(byte) ch) { ch =Serial.read(); } Serial.print(ch);} 

Koppelen

Bluetooth is een peer-to-peer-scenario. Voordat ze verbinding kunnen maken via Bluetooth, moeten ze worden gekoppeld. Dit gebeurt niet binnen de app. Koppelen met een wachtwoordsleutel kan problematisch zijn tussen embedded apparaten, omdat ze vaak headless zijn en mogelijk geen pop-ups ondersteunen (zoals IoT-Core dat niet doet). Er is een IoT-Core-webportal om dit te doen, evenals een opdrachtregelhulpprogramma op het apparaat dat via een SSH-shell kan worden uitgevoerd. De meest recente versie van de OS-webportal ondersteunt het koppelen van wachtwoorden die rond de tijd van Windows 10 RTM ontbrak. "Win 10 IoT-Core:Bluetooth Universal Windows Serial App" gaat in detail in op koppeling in deze context.

Het project starten

Het app-project is gemaakt met behulp van Visual Studio 2015 met behulp van de universele Windows-app-sjabloon:

Nieuw project-->Visual C#->Windows->Lege app (universele Windows)

De app-gebruikersinterface maken

De gebruikersinterface is geïmplementeerd in XAML

Maak de gebruikersinterface volgens de lay-out zoals hierboven (of vergelijkbaar):

De gebruikersinterface is vrij eenvoudig en is als volgt gemaakt:

  • Alle tekstelementen zijn TextBlocks behalve de SendText die een TextBox is
  • SendText accepteert CarriageReturn (dwz is Multiline)
  • De Recvd-tekst heeft WrapText ingeschakeld (dwz is Multiline)
  • UI-elementen zijn geordend in rijen met behulp van een StackPanel ingesteld op horizontale oriëntatie
  • Deze StackPanels worden vervolgens gestapeld met een StackPanel ingesteld op verticale oriëntatie, samen met de ListBox.

Misschien geeft u er de voorkeur aan om de gebruikersinterface in te delen met behulp van relatieve stapelpanelen of rasterrijen en kolommen enz. te gebruiken.

De ConnectDevices is een ListBox met een Binding Source ingesteld op PairedDevices(zie later ) en een ItemTemplate bestaande uit een TextBlock gebonden aan de eigenschap Name van PairedDevices (zie later ).

      

App-configuratie

  • De app maakt geen gebruik van IOT-Core-functies, dus er zijn geen extensiereferenties nodig.
  • De app heeft een aantal specifieke mogelijkheden nodig voor Bluetooth en serieel toegevoegd aan Package.appxmanifest.
  • Helaas biedt de gebruikersinterface die u hiervoor krijgt als u dubbelklikt op dat bestand in Solution Explorer geen ondersteuning voor het toevoegen van deze mogelijkheden. U moet ze dus handmatig toevoegen door met de rechtermuisknop op het bestand in Solution Explorer te klikken en Openen met te selecteren.>XML-editor.

Wijzig het gedeelte met mogelijkheden (onderaan) in:

       

De internetClient-mogelijkheid is er al. Het is niet nodig voor deze app, dus misschien wilt u deze verwijderen. Ik laat het erin.

Informatie over gekoppeld apparaat

Bij het starten van de app worden de gekoppelde apparaten opgesomd met:

DeviceInformationCollection DeviceInfoCollection

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

Deze verzameling wordt vervolgens omgezet in een ObservableCollection dat het kan worden gebruikt in de ListBox:

_pairedDevices =nieuwe ObservableCollection();

De DeviceInfoCollection wordt herhaald door het maken van een PairedDeviceInfo object voor elk item dat vervolgens wordt toegevoegd aan de _pairedDevices collectie.

PairedDeviceInfo is een klasse met eigenschappen:

Naam

Id

DeviceInfo

De klasse heeft een geschikte constructor.

DeviceInformation is Windows.Devices.Enumeration.DeviceInformation

In de lijst met gekoppelde apparaten, de Naam veld wordt (gebonden) weergegeven.

Wanneer een apparaat is geselecteerd (dubbelklikt), maakt de DeviceInformation van het eindpunt deel uit van het geselecteerde menu-item en wordt dus gebruikt om de verbinding tot stand te brengen.

Verbinding

De DeviceInformation wordt gebruikt om de RFCOMM-service op te halen. De verbinding wordt vervolgens tot stand gebracht als een StreamSocket met behulp van de Endpoint HostName (eigenlijk het Bluetooth Mac-adres) en de ServiceName-reeks.

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

Als alles goed is, hebben we een verbinding.. de socket zal betekenisvol zijn (niet nul).

Natuurlijk is dit een opgesloten fout (try-catch)

Tekst verzenden en tekst ontvangen maken gebruik van de eigenschappen InputStream en OutputStream van de socket.

Tekst ontvangen

Het ontvangen van tekst moet eerst worden gestart omdat het als een afzonderlijke thread wordt uitgevoerd. Het voert een asynchrone wacht uit om seriële invoer te krijgen, behandelt de invoer en voert vervolgens een andere asynchrone seriële ontvangst uit ... alles in een lus. Dit loopt door totdat er een annulering wordt gegenereerd.

private async void Listen(){ ReadCancellationTokenSource =new CancellationTokenSource(); if (_socket.InputStream! =null) { dataReaderObject =nieuwe DataReader (_socket.InputStream); // blijf de seriële invoer lezen terwijl (true) {wacht op ReadAsync (ReadCancellationTokenSource.Token); } }}DataReader dataReaderObject;private CancellationTokenSource ReadCancellationTokenSource;private async Taak ReadAsync(CancellationToken cancelToken){ uint ReadBufferLength =1024; // Als taakannulering is aangevraagd, volg dan cancelToken.ThrowIfCancellationRequested(); // Stel InputStreamOptions in om de asynchrone leesbewerking te voltooien wanneer een of meer bytes beschikbaar zijn dataReaderObject.InputStreamOptions =InputStreamOptions.Partial; // Maak een taakobject om te wachten op gegevens op de serialPort.InputStream loadAsyncTask =dataReaderObject.LoadAsync (ReadBufferLength). AsTask (cancellationToken); // Start de taak en wacht op UInt32 bytesRead =wacht op loadAsyncTask; if (bytesRead> 0) { string recvdtxt =dataReaderObject.ReadString(bytesRead); }} 

Tekst verzenden

Terwijl de ontvangen tekst asynchroon wordt uitgevoerd omdat de aankomst van tekst niet deterministisch is vanuit het perspectief van de app, wordt verzonden tekst uitgevoerd vanuit de gebruikersinterface van de app en is dus in wezen synchroon (hoewel een wait wordt gebruikt om de gebruikersinterface vrij te maken).

private async void Send(string msg){ Task storeAsyncTask; DataWriter dataWriteObject =nieuwe DataWriter(_socket.OutputStream); dataWriteObject.WriteString(msg); // Start een async-taak om de schrijfbewerking te voltooien storeAsyncTask =dataWriteObject.StoreAsync().AsTask(); UInt32 bytesWritten =wacht op storeAsyncTask;} 

Knopstatussen

De opdrachtknoppen worden in- en uitgeschakeld, afhankelijk van de status van de app. De knoppen Verzenden en Start Recv zijn bijvoorbeeld uitgeschakeld wanneer de app niet is verbonden, maar worden ingeschakeld wanneer de app is verbonden, enz.

Genieten van! :)

Code

iotbluetoothserial op Github
Ook op Codeplex (mirror)https://iotgenbluetoothserialuwa.codeplex.com/https://github.com/djaus2/iotbluetoothserial

Productieproces

  1. GoPiGo v2 met Windows IoT
  2. Licht dimmen met PWM met drukknop
  3. Drukluchtstroommeetapparaat met analoge sensor
  4. Arduino-gyroscoopspel met MPU-6050
  5. Discord Beveiligingscamera met een ESP32
  6. DHT11-sensor met LED's en een piëzo-luidspreker
  7. Unopad - Arduino MIDI-controller met Ableton
  8. Tv-afstandsbediening op batterijen met 3D-geprint hoesje
  9. Arduino met Bluetooth om een ​​LED te bedienen!
  10. Eenvoudige obstakelsensor met Arduino
  11. Bluetooth spraakgestuurde apparaten met OK Google