Raspberry Pi 3와 Genuino (Arduino) 101에서 BLE 통신
16908 단어 RaspberryPiGenuinoArduinoBLE
아래에 대한 자세한 설명은 쓰지 않습니다.
또한 Raspberry Pi 3에서 Genuino 101에 연결할 때 광고 패킷에 포함된 정보가 아닌 MAC 주소를 직접 설명하고 연결합니다.
일단, 꺾쇠 글자로 했으므로, xxxxxxxxxxxx라고 하는 기술이 있으면, 수중의 Genuino 101의 MAC 주소와 바꿔서 시험해 주세요.
Genuino 101면
Genuino 101에 대해서, 이하를 참고로 했습니다. 고마워요.
캐릭터리스틱등의 디자인으로부터 하지 않으면! 라고 생각했지만, 스케치의 예가 충실하고 있었으므로,
スケッチの例 > CurieBLE > ButtonLED
를 그대로 사용하기로 했습니다.스케치가 상정하고 있는 다음과 같은 회로를 작성했습니다.
센트럴로부터의 접속이 없는 상태의 동작으로서는, 스위치를 누르고 있는 동안에는 LED가 점등하고, 누르지 않은 동안에는 점등하지 않습니다.
스위치에 풀다운 저항을 가하여 스위치를 누르고 있는 동안은 HIGH, 누르지 않은 동안은 LOW가 되도록 합니다.
Raspberry Pi 3면
Node.js의 noble 라이브러리를 사용하여 Genuino 101로부터 알림을 받습니다.
광고 패킷 확인
noble의 리포지토리에 포함되어 있는 샘플 코드 advertisement-discovery.js 를 사용해, Genuino 101이 발행하고 있는 광고 패킷을 확인합니다.
peripheral discovered (xxxxxxxxxxxx with address <xx:xx:xx:xx:xx:xx, public>, connectable true, RSSI -68:
hello my local name is:
ButtonLE
can I interest you in any of the following advertised services:
["19b10010e8f2537e4f6cd104768a1214"]
위의 출력에는 샘플 스케치의
blePeripheral.setLocalName("ButtonLED");
에 지정된 로컬 이름과 BLEService ledService("19B10010-E8F2-537E-4F6C-D104768A1214");
에 지정된 UUID가 하이픈없이 포함됩니다.서비스 구성 확인
noble의 리포지토리에 포함되어 있는 샘플 코드 peripheral-explorer.js 를 사용해, 샘플 스케치가 정의하고 있는 ledService 의 구성을 확인합니다.
런타임에 아래와 같이 앞서 설명한 광고 패킷 수신 시 출력에 포함된 MAC 주소를 콜론 없이 지정합니다.
$ sudo node peripheral-explorer.js xxxxxxxxxxxx
그러면 샘플 스케치에 정의된 Characteristic 속성, 현재 값 등이 출력됩니다.
peripheral with ID xxxxxxxxxxxx found
Local Name = ButtonLE
Service Data =
Service UUIDs = 19b10010e8f2537e4f6cd104768a1214
services and characteristics:
1800 (Generic Access)
2a00 (Device Name)
properties read
value 47454e55494e4f203130312d38323841 | 'GENUINO 101-828A'
2a01 (Appearance)
properties read
value 0000 | ''
2a04 (Peripheral Preferred Connection Parameters)
properties read
value 4000780000005802 | '@xX'
1801 (Generic Attribute)
19b10010e8f2537e4f6cd104768a1214
19b10011e8f2537e4f6cd104768a1214
properties read, write
value 00 | ''
19b10012e8f2537e4f6cd104768a1214
properties read, notify
value 00 | ''
스위치 상태 수신
확인한 서비스 구성에 따라 버튼 상태를 Raspberry Pi 3에서 수신합니다.
var noble = require('noble');
var ledServiceUuid = '19b10010e8f2537e4f6cd104768a1214';
var ledCharacteristicUuid = '19b10011e8f2537e4f6cd104768a1214';
var buttonCharacteristicUuid = '19b10012e8f2537e4f6cd104768a1214';
var peripheralIdOrAddress = process.argv[2].toLowerCase();
// Bluetoothデバイスの状態変更時の処理
noble.on('stateChange', function(state) {
if (state === 'poweredOn') {
// ペリフェラルのスキャンを開始
noble.startScanning();
} else {
noble.stopScanning();
}
});
// ペリフェラル発見時の処理
noble.on('discover', function(peripheral) {
if (peripheral.id === peripheralIdOrAddress || peripheral.address === peripheralIdOrAddress) {
// ペリフェラルのスキャンを停止
noble.stopScanning();
console.log('peripheral with ID ' + peripheral.id + ' found');
peripheral.once('disconnect', function() {
console.log('disconnected');
process.exit(0);
});
// ペリフェラルとの接続を開始
peripheral.connect(function(error) {
console.log('connected');
// サービス探索を開始
peripheral.discoverServices([], onServicesDiscovered);
});
}
});
// サービス発見時の処理
function onServicesDiscovered(error, services) {
console.log('services discovered');
services.forEach(function(service) {
if (service.uuid == ledServiceUuid) {
// キャラクタリスティック探索を開始
service.discoverCharacteristics([], onCharacteristicDiscovered);
}
});
}
// キャラクタリスティック発見時の処理
function onCharacteristicDiscovered(error, characteristics) {
console.log('characteristics discovered');
characteristics.forEach(function(characteristic) {
if (characteristic.uuid == ledCharacteristicUuid) {
characteristic.on('read', onLedCharacteristicRead);
} else if (characteristic.uuid == buttonCharacteristicUuid) {
characteristic.on('read', onButtonCharacteristicRead);
// データ更新通知の受け取りを開始
characteristic.notify(true, function(error) {
console.log('buttonCharacteristic notification on');
});
}
});
}
// ledCharacteristicのデータ読み出し時の処理
// (現在のこのコードでは呼ばれることがない想定です)
function onLedCharacteristicRead(data, isNotification) {
console.log('ledCharacteristic read response value: ', data.readInt8(0));
}
// buttonCharacteristicのデータ読み出し時、もしくは更新時の処理
function onButtonCharacteristicRead(data, isNotification) {
if (isNotification) {
// データ更新通知による呼び出し
console.log('buttonCharacteristic notification value: ', data.readInt8(0));
} else {
// データ読み出し時の呼び出し
console.log('buttonCharacteristic read response value: ', data.readInt8(0));
}
}
위 코드를 `button_led_central.js'로 저장하고 다음과 같이 실행합니다.
sudo node button_led_central.js xxxxxxxxxxxx
연결 후 버튼의 누름에 따라 값이 출력됩니다.
peripheral with ID xxxxxxxxxxxx found
connected
services discovered
characteristics discovered
buttonCharacteristic notification on
buttonCharacteristic notification value: 1
buttonCharacteristic notification value: 0
buttonCharacteristic notification value: 1
buttonCharacteristic notification value: 0
buttonCharacteristic notification value: 1
buttonCharacteristic notification value: 0
buttonCharacteristic notification value: 1
buttonCharacteristic notification value: 0
buttonCharacteristic notification value: 1
buttonCharacteristic notification value: 0
마지막으로
Raspberry Pi 3쪽에서도 LED를 빛내고 싶었지만 밤도 깊어져 왔기 때문에 포기했습니다 ....
Genuino 101의 스케치를 쓸 때의 상태가 미묘한 것 이외에는 안정적으로 동작하고 있는 것 같아서 잠시 놀 수 있을 것 같습니다.
Reference
이 문제에 관하여(Raspberry Pi 3와 Genuino (Arduino) 101에서 BLE 통신), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jakalada/items/7ad4144efa2f5e109b89
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Raspberry Pi 3와 Genuino (Arduino) 101에서 BLE 통신), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/jakalada/items/7ad4144efa2f5e109b89텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)