산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

일반 직렬 Bluetooth(Win 10 IoT-Core RPI2 포함)

구성품 및 소모품

라즈베리 파이 2 모델 B
× 1
일반 블루투스 USB 동글
× 1
Arduino UNO
× 1
SparkFun 블루투스 모뎀 - BlueSMiRF 실버
× 1

앱 및 온라인 서비스

Microsoft Windows 10 IoT Core
Microsoft Visual Studio 2015

이 프로젝트 정보

추가

이 프로젝트는 Embedded101.com에서 자세히 설명됩니다.

"Win 10 IoT-Core:Bluetooth 범용 Windows 직렬 앱"

이 프로젝트는 유전자 블루투스 USB 동글을 사용하여 블루투스 직렬 프로필을 통해 Raspberry PI 2와 같은 IoT-Core 기기를 임베디드 블루투스 기기에 연결하는 유니버설 Windows 앱입니다.

배경

.Bluetooth는 단거리에서 피어 투 피어 네트워킹을 지원합니다. Wi-Fi 네트워크와 달리 Bluetooth 연결은 일대일입니다. 두 장치를 연결하고 상호 작용할 수 있습니다. 예를 들어 두 장치는 직렬 프로필을 사용하여 대칭 방식으로 연결하고 둘 사이에 원시 데이터를 전달할 수 있습니다. 그러나 일반적으로 Bluetooth 연결은 한쪽 끝이 다른 쪽 끝에서 사용할 특정 데이터 형식을 생성하는 비대칭입니다. 예를 들어 휴대폰은 A2DP(Advanced Audio Distribution Profile) 프로필을 구현하고 HSP(Headset) 프로필을 구현하는 헤드셋으로 오디오를 스트리밍할 수 있습니다. OBEX(Object Exchange)는 두 장치 간에 데이터를 교환할 때 대칭 연결입니다.

Microsoft IOT-Core Bluetooth 샘플 프로젝트는 GATT(일반 속성 프로필 프로필)를 사용합니다. 이것은 Bluetooth Low Energy 프로토콜에 대한 프로필 검색 및 설명 서비스를 제공합니다. 이 프로토콜을 사용하면 복잡한 프로세서에서 사용할 데이터를 생성하는 간단한 저전력 장치를 한쪽 끝에 연결할 수 있습니다.

이것은 Microsoft 샘플보다 훨씬 간단한 프로젝트입니다. RFCOMM 프로필을 기반으로 하는 보다 일반적인 SPP(직렬 포트 프로필)에만 관련됩니다. 아주 오래된 USB 블루투스 동글로 개발되었으므로 모든 블루투스 동글에서 작동합니다.

IoT 앱

이 앱은 간단한 블루투스 직렬 유니버설 Windows(Windows 10) 테스트 앱입니다. 앱이 실행 중인 기기와 페어링된 모든 기기 블루투스를 목록으로 열거하는 것으로 시작합니다. 연결을 시작하는 두 번 클릭하여 하나를 선택합니다. 보낼 텍스트는 TextBox에 입력하고 버튼을 누르면 전송됩니다. 앱은 전송된 모든 텍스트를 자동으로 수신하고 표시합니다. 따라서 엔드포인트(위와 같이)가 수신된 텍스트를 단순히 에코할 때 전송된 텍스트는 UW 앱의 수신 상자에 다시 나타나야 합니다.


끝점

Arduino Uno를 테스트하기 위해 Bluetooth 어댑터가 사용됩니다. Bluetooth 연결을 통해 수신한 모든 문자를 반향시키는 간단한 방패가 있습니다.

방패 설정:

// 직렬 루프백 앱// 과거 설정// 연결된 시스템에 의해 시작// 참고는 BT 장치의 RxTx가// 아두이노 보드의 TxRx에 연결된 블루투스와 함께 사용할 수 있습니다. // 프로그래밍을 위해 BT 어댑터를 분리해야 하지만.void setup() { // 내 어댑터는 이 BAUD 115200으로 설정되어 있습니다. // 이것은 Arduino에서 BT로의 어댑터 포트 속도입니다. // BT 어댑터가 명령 모드에 있을 때 설정합니다. // 설정할 수 없는 BT rate가 아닙니다. Serial.begin(115200); 지연(333); 동안 (! 직렬); 지연(1000); Serial.println("빠른 갈색 여우가 게으른 개를 뛰어 넘습니다!");} 

방패 루프:

void 루프() { char ch =Serial.read(); 동안 ( 255 ==(바이트) ch) { ch =Serial.read(); } Serial.print(ch);} 

페어링

블루투스는 피어 투 피어 시나리오입니다. Bluetooth를 통해 연결하려면 먼저 페어링해야 합니다. 이것은 앱 내에서 수행되지 않습니다. 내장형 장치는 종종 헤드리스이고 팝업을 지원하지 않을 수 있으므로(IoT-Core는 지원하지 않음) 패스키와 페어링하는 것은 임베디드 장치 간에 문제가 될 수 있습니다. 이를 위한 IoT-Core 웹 포털과 SSH 셸을 통해 실행할 수 있는 장치의 명령줄 유틸리티가 있습니다. 최신 버전의 OS 웹 포털은 Windows 10 RTM 당시에 누락되었던 패스키 페어링을 지원합니다. "Win 10 IoT-Core:Bluetooth Universal Windows Serial App"에서는 이러한 맥락에서 페어링에 대해 자세히 설명합니다.

프로젝트 시작

앱 프로젝트는 유니버설 Windows 앱 템플릿을 사용하여 Visual Studio 2015에서 생성됩니다.

새 프로젝트-->Visual C#->Windows->빈 앱(유니버설 Windows)

앱 UI 만들기

UI는 XAML로 구현됩니다.

위와 같이(또는 이와 유사한) 레이아웃에 따라 UI를 만듭니다.

UI는 매우 간단하며 다음과 같이 생성됩니다.

<울>
  • TextBox인 SendText를 제외한 모든 텍스트 요소는 TextBlocks입니다.
  • SendText는 CarriageReturn을 허용합니다(즉, 여러 줄임)
  • Recvd 텍스트에 WrapText가 활성화되어 있습니다(예:Multiline)
  • 가로 방향으로 설정된 StackPanel을 사용하여 UI 요소를 행으로 구성합니다.
  • 이러한 StackPanel은 ListBox와 함께 수직 방향으로 설정된 StackPanel과 함께 쌓입니다.
  • 상대 StackPanel을 사용하거나 그리드 행 및 열 등을 사용하여 UI를 레이아웃하는 것을 선호할 수 있습니다.

    ConnectDevices는 바인딩 소스가 PairedDevices로 설정된 ListBox입니다(나중에 참조). ) 및 PairedDevices의 Name 속성에 바인딩된 TextBlock으로 구성된 ItemTemplate(나중에 참조 ).

          

    앱 구성

    <울>
  • 앱은 IOT-Core 기능을 사용하지 않으므로 확장 참조가 필요하지 않습니다.
  • 앱에는 Bluetooth 및 Serial에 대한 몇 가지 특정 기능이 Package.appxmanifest에 추가되어야 합니다.
  • 안타깝게도 솔루션 탐색기에서 해당 파일을 두 번 클릭하면 표시되는 UI는 이러한 기능 추가를 지원하지 않으므로 솔루션 탐색기에서 파일을 마우스 오른쪽 버튼으로 클릭하고 연결 프로그램을 선택하여 수동으로 추가해야 합니다.>XML 편집기.
  • 기능 섹션(하단)을 다음과 같이 수정합니다.

           

    internetClient 기능은 이미 존재합니다. 이 앱에는 필요하지 않으므로 제거하는 것이 좋습니다. 남겨둡니다.

    페어링된 장치 정보

    앱 시작 시 다음을 사용하여 페어링된 장치가 열거됩니다.

    DeviceInformationCollection DeviceInfoCollection

    =DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort))를 기다립니다.

    이 컬렉션은 ObservableCollection으로 바뀝니다. ListBox에서 사용할 수 있음:

    _pairedDevices =새로운 ObservableCollection();

    DeviceInfoCollection PairedDeviceInfo 생성을 통해 반복됩니다. 각 항목에 대한 개체는 _pairedDevices에 추가됩니다. 컬렉션.

    페어링된 장치 정보 속성이 있는 클래스입니다.

    이름 <문자열>

    ID <문자열>

    장치 정보 <장치 정보>

    클래스에 적절한 생성자가 있습니다.

    기기 정보 Windows.Devices.Enumeration.DeviceInformation입니다.

    페어링된 기기의 목록 상자에서 이름 필드가 (바운드) 표시됩니다.

    기기가 선택되면(더블 클릭) 끝점의 DeviceInformation은 실제로 선택한 메뉴 항목의 일부이므로 연결을 설정하는 데 사용됩니다.

    연결

    DeviceInformation은 RFCOMM 서비스를 가져오는 데 사용됩니다. 그런 다음 연결은 끝점 HostName(실제로는 Bluetooth Mac 주소)과 ServiceName 문자열을 사용하여 StreamSocket으로 설정됩니다.

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

    모든 것이 정상이면 연결이 있는 것입니다. 소켓은 의미가 있습니다(null이 아님).

    물론 이것은 오류 트랩(try-catch)입니다.

    텍스트 보내기 및 받기 텍스트는 소켓의 InputStream 및 OutputStream 속성을 사용합니다.

    문자 수신

    별도의 스레드로 실행되기 때문에 수신 텍스트를 먼저 시작해야 합니다. 직렬 입력을 얻기 위해 비동기 대기를 실행하고 입력을 처리한 다음 루프에서 다른 비동기 직렬 수신을 실행합니다. 이것은 취소가 생성될 때까지 계속 반복됩니다.

    <사전><코드>비공개 비동기 무효 Listen(){ ReadCancellationTokenSource =new CancellationTokenSource(); if (_socket.InputStream !=null) { dataReaderObject =새로운 DataReader(_socket.InputStream); // 직렬 입력을 계속 읽습니다. while (true) { await ReadAsync(ReadCancellationTokenSource.Token); } }}DataReader dataReaderObject; 개인 CancellationTokenSource ReadCancellationTokenSource; 개인 비동기 작업 ReadAsync(CancellationToken 취소 토큰){ uint ReadBufferLength =1024; // 작업 취소가 요청된 경우 cancelToken.ThrowIfCancellationRequested()를 준수합니다. // 하나 이상의 바이트를 사용할 수 있을 때 비동기 읽기 작업을 완료하도록 InputStreamOptions를 설정합니다. dataReaderObject.InputStreamOptions =InputStreamOptions.Partial; // serialPort.InputStream에서 데이터를 기다리는 작업 개체를 만듭니다. loadAsyncTask =dataReaderObject.LoadAsync(ReadBufferLength).AsTask(cancellationToken); // 작업을 시작하고 대기 UInt32 bytesRead =await loadAsyncTask; if (bytesRead> 0) { 문자열 recvdtxt =dataReaderObject.ReadString(bytesRead); }}

    문자 보내기

    수신된 텍스트는 앱의 관점에서 텍스트의 도착이 비결정적이므로 비동기적으로 수행되는 반면, 보낸 텍스트는 앱의 UI에서 작동하므로 본질적으로 동기식입니다(await는 UI를 해제하는 데 사용됨).

    비공개 비동기 무효 Send(문자열 msg){ 태스크 storeAsyncTask; DataWriter dataWriteObject =새로운 DataWriter(_socket.OutputStream); dataWriteObject.WriteString(msg); // 쓰기 작업을 완료하기 위해 비동기 작업을 시작합니다. storeAsyncTask =dataWriteObject.StoreAsync().AsTask(); UInt32 bytesWritten =storeAsyncTask를 기다립니다.} 

    버튼 상태

    명령 버튼은 앱의 상태에 따라 활성화 및 비활성화됩니다. 예를 들어 Send 및 Start Recv 버튼은 앱이 연결되지 않은 경우 비활성화되지만 앱이 연결되면 활성화되는 등

    즐기다! :)

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    Github의 iotbluetoothserial
    또한 Codeplex(미러)https://iotgenbluetoothserialuwa.codeplex.com/https://github.com/djaus2/iotbluetoothserial

    제조공정

    1. Windows IoT 기반 GoPiGo v2
    2. 푸시 버튼을 사용하여 PWM으로 조명 디밍
    3. 아날로그 센서가 있는 기압 측정 장치
    4. MPU-6050을 사용한 Arduino 자이로스코프 게임
    5. ESP32가 장착된 Discord 보안 카메라
    6. DHT11 센서(LED 및 피에조 스피커 포함)
    7. Unopad - Ableton이 포함된 Arduino MIDI 컨트롤러
    8. 3D 인쇄 케이스가 있는 배터리 전원 TV 리모컨
    9. Bluetooth가 탑재된 Arduino로 LED 제어!
    10. Arduino를 사용한 간단한 장애물 센서