Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Bluetooth serial genérico com Win 10 IoT-Core RPI2

Componentes e suprimentos

Raspberry Pi 2 Modelo B
× 1
Dongle USB Bluetooth genérico
× 1
Arduino UNO
× 1
SparkFun Bluetooth Modem - BlueSMiRF prata
× 1

Aplicativos e serviços online

Microsoft Windows 10 IoT Core
Microsoft Visual Studio 2015

Sobre este projeto

Além


Este projeto é discutido em detalhes em embedded101.com:

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

Sobre


Este projeto é um aplicativo universal do Windows que conecta um dispositivo IoT-Core, como o Raspberry PI 2, a um dispositivo Bluetooth incorporado no perfil serial do Bluetooth, usando um dongle USB Bluetooth genético.

Antecedentes


.Bluetooth suporta rede ponto a ponto em um curto alcance. Ao contrário de uma rede Wi-Fi, a conectividade Bluetooth é um para um. Dois dispositivos podem se conectar e interagir. Por exemplo, dois dispositivos podem se conectar de maneira simétrica usando o perfil serial e passar dados brutos entre eles. Geralmente, porém, a conectividade Bluetooth é assimétrica com uma extremidade gerando um formato de dados específico a ser consumido na outra extremidade. Por exemplo, um telefone móvel pode implementar o Perfil A2DP (Perfil de Distribuição de Áudio Avançada) e transmitir áudio para um fone de ouvido que implementa o Perfil HSP (Fone de ouvido). OBEX (Troca de Objetos) é uma conexão simétrica entre dois dispositivos enquanto trocam dados entre eles.



O projeto Microsoft IOT-Core Bluetooth Sample usa o GATT (Generic Attribute Profile Profile). Isso fornece serviços de descoberta e descrição de perfil para o protocolo Bluetooth Low Energy. Com este protocolo, dispositivos simples de baixo consumo de energia podem ser conectados em uma extremidade, gerando dados a serem consumidos por um processador complexo.

Este é um projeto muito mais simples do que o exemplo da Microsoft. Ele está preocupado apenas com o SPP (Perfil de Porta Serial) mais genérico que é baseado no perfil RFCOMM. Ele foi desenvolvido com um dongle Bluetooth USB muito antigo e, portanto, deve funcionar com qualquer dongle Bluetooth.

O aplicativo IoT


Este aplicativo é um aplicativo de teste simples do Bluetooth Serial Universal Windows (Windows 10). Ele começa enumerando (como uma lista) todos os dispositivos Bluetooth emparelhados com o dispositivo em que o aplicativo está sendo executado. Um é selecionado clicando duas vezes, o que inicia a conexão. O texto a ser enviado é inserido em uma caixa de texto e enviado quando um botão é pressionado. O aplicativo recebe automaticamente qualquer texto enviado a ele (e o exibe). Portanto, quando o ponto de extremidade (como acima) simplesmente ecoa o texto recebido, o texto enviado deve reaparecer na caixa de recepção no aplicativo UW.



O ponto final


Para testar um Arduino Uno com um adaptador Bluetooth é usado. Ele tem um escudo simples que apenas ecoa quaisquer caracteres recebidos pela conexão Bluetooth:

Configuração do escudo:
  // Um ​​aplicativo de loop back serial // Configuração anterior // Iniciado pelo sistema conectado // Nota pode ser usado com Bluetooth onde o RxTx do dispositivo BT // está conectado ao TxRx da placa Arduino. // É necessário desconectar o adaptador BT para programação embora.void setup () {// Meu adaptador está definido para este BAUD 115200 // Esta é a taxa de porta do adaptador Arduino para BT // Definida quando o adaptador BT está no modo de comando. // NÃO é a taxa de BT que você não pode definir. Serial.begin (115200); atraso (333); while (! Serial); atraso (1000); Serial.println ("A rápida raposa marrom pula sobre o cachorro preguiçoso!");}  

The Shield Loop:
  void loop () {char ch =Serial.read (); enquanto (255 ==(byte) ch) {ch =Serial.read (); } Serial.print (ch);}  

Emparelhamento


O Bluetooth é um cenário ponto a ponto. Antes que eles possam se conectar por Bluetooth, eles devem ser emparelhados. Isso não é feito no aplicativo. O emparelhamento com uma chave de acesso pode ser problemático entre os dispositivos incorporados, pois eles geralmente não têm cabeça e podem não suportar pop-ups (o que o IoT-Core não oferece). Há um portal da web IoT-Core para fazer isso, bem como um utilitário de linha de comando no dispositivo que pode ser executado em um shell SSH. A versão mais recente do portal da web do sistema operacional oferece suporte ao emparelhamento de chave de acesso que estava faltando na época do Windows 10 RTM. "Win 10 IoT-Core:Bluetooth Universal Windows Serial App" discute o emparelhamento neste contexto em detalhes.

Iniciando o projeto


O projeto do aplicativo é criado usando o Visual Studio 2015 usando o modelo de aplicativo Universal do Windows:

Novo projeto -> Visual C # -> Windows-> Aplicativo em branco (Windows universal)

Criação da IU do aplicativo


A IU é implementada em XAML

Crie a IU de acordo com o layout acima (ou semelhante):

A IU é bastante simples e é criada da seguinte maneira:
  • Todos os elementos de texto são TextBlocks, exceto SendText, que é um TextBox
  • SendText aceita CarriageReturn (ou seja, é multilinha)
  • O texto do Recvd tem WrapText ativado (ou seja, é multilinha)
  • Os elementos da IU são organizados em linhas usando um StackPanel definido para orientação horizontal
  • Esses StackPanels são então empilhados com um StackPanel definido para orientação vertical, junto com o ListBox.

Você pode preferir fazer o layout da IU usando Relative StackPanels ou usar linhas e colunas de grade, etc.

O ConnectDevices é um ListBox com uma Binding Source definida para PairedDevices ( ver mais tarde ) e um ItemTemplate que consiste em um TextBlock vinculado à propriedade Name de PairedDevices ( ver mais tarde )
          

Configuração do aplicativo

  • O aplicativo não faz uso dos recursos do IOT-Core, portanto não exigirá nenhuma referência de extensão.
  • O aplicativo precisará de alguns recursos específicos para Bluetooth e Serial adicionados a Package.appxmanifest.
  • Infelizmente, a IU que você obtém para isso se clicar duas vezes nesse arquivo no Solution Explorer não suporta a adição desses recursos e, portanto, você precisa adicioná-los manualmente clicando com o botão direito no arquivo no Solution Explorer e selecione Open With-> Editor XML.

Modifique a seção de recursos (na parte inferior) para:
           

O recurso internetClient já estará lá. Não é necessário para este aplicativo, então você pode querer removê-lo. Eu deixo.

Informações do dispositivo pareado


No início do aplicativo, os dispositivos emparelhados são enumerados usando:

DeviceInformationCollection DeviceInfoCollection

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

Esta coleção é então transformada em uma ObservableCollection que pode ser usado no ListBox:

_pairDevices =new ObservableCollection ();

O DeviceInfoCollection é iterado através da criação de um PairedDeviceInfo objeto para cada item que é adicionado a _pairDevices coleção.



PairedDeviceInfo é uma classe com propriedades:

Nome

Id

DeviceInfo

A classe possui um construtor apropriado.

DeviceInformation é Windows.Devices.Enumeration.DeviceInformation

Na caixa de listagem de dispositivos emparelhados, o Nome campo é (vinculado) exibido.

Quando um dispositivo é selecionado (clicado duas vezes), DeviceInformation do terminal é, na verdade, parte do item de menu selecionado e, portanto, é usado para estabelecer a conexão.

Conexão


O DeviceInformation é usado para obter o serviço RFCOMM. A conexão é então estabelecida como um StreamSocket usando o Endpoint HostName (na verdade, seu endereço Bluetooth Mac) e a string ServiceName.
  _service =await RfcommDeviceService.FromIdAsync (DeviceInfo.Id); _ socket =new StreamSocket (); await _socket.ConnectAsync (_service.ConnectionHostName, _service.ConnectionServiceName);  

Se tudo estiver bem, então temos uma conexão .. o soquete será significativo (não nulo).

Claro que isso é uma armadilha de erro (try-catch)

Envie e receba texto usando as propriedades InputStream e OutputStream do soquete.


Receber Texto


O recebimento de texto deve ser iniciado primeiro, pois é executado como um thread separado. Ele executa uma espera assíncrona para obter a entrada serial, lida com a entrada e, em seguida, executa outra recepção serial assíncrona .. tudo em um loop. Isso faz um loop contínuo até que um cancelamento seja gerado.


  private assíncrono void Listen () {ReadCancellationTokenSource =new CancelamentoTokenSource (); if (_socket.InputStream! =null) {dataReaderObject =new DataReader (_socket.InputStream); // continue lendo a entrada serial while (true) {await ReadAsync (ReadCancellationTokenSource.Token); }}} DataReader dataReaderObject; privado CancelamentoTokenSource ReadCancellationTokenSource; privado assíncrono Tarefa ReadAsync (Cancelamento CancelTokenToken) {uint ReadBufferLength =1024; // Se o cancelamento da tarefa foi solicitado, cumpra cancellationToken.ThrowIfCancellationRequested (); // Defina InputStreamOptions para concluir a operação de leitura assíncrona quando um ou mais bytes estiverem disponíveis dataReaderObject.InputStreamOptions =InputStreamOptions.Partial; // Crie um objeto de tarefa para aguardar os dados no serialPort.InputStream loadAsyncTask =dataReaderObject.LoadAsync (ReadBufferLength) .AsTask (cancellationToken); // Inicie a tarefa e aguarde UInt32 bytesRead =await loadAsyncTask; if (bytesRead> 0) {string recvdtxt =dataReaderObject.ReadString (bytesRead); }}  


Enviar Texto


Embora o texto recebido seja executado de forma assíncrona, visto que a chegada do texto não é determinística da perspectiva do aplicativo, o texto enviado é acionado a partir da IU do aplicativo e, portanto, é essencialmente síncrono (embora um await seja usado para liberar a IU).
  private assíncrono void Send (string msg) {Task storeAsyncTask; DataWriter dataWriteObject =new DataWriter (_socket.OutputStream); dataWriteObject.WriteString (msg); // Inicie uma tarefa assíncrona para concluir a operação de gravação storeAsyncTask =dataWriteObject.StoreAsync (). AsTask (); UInt32 bytesWritten =await storeAsyncTask;}  

Estados do botão


Os botões de comando são habilitados e desabilitados dependendo do estado do aplicativo. Por exemplo, os botões Enviar e Iniciar recebimento são desativados quando o aplicativo não está conectado, mas são ativados quando o aplicativo é conectado, etc.

Aproveitar! :)

Código

iotbluetoothserial no Github
Também no Codeplex (espelho) https://iotgenbluetoothserialuwa.codeplex.com/https://github.com/djaus2/iotbluetoothserial

Processo de manufatura

  1. GoPiGo v2 com Windows IoT
  2. Luzes de dimerização com PWM usando o botão de ação
  3. Dispositivo de medição de pressão de fluxo de ar com sensor analógico
  4. Jogo Arduino Gyroscope com MPU-6050
  5. Câmera de segurança Discord com ESP32
  6. Sensor DHT11 com LEDs e um alto-falante Piezo
  7. Unopad - Controlador Arduino MIDI com Ableton
  8. Controle remoto de TV a bateria com caixa impressa em 3D
  9. Arduino com Bluetooth para controlar um LED!
  10. Sensor de obstáculo simples com Arduino