Bluetooth®規格は20年以上前の、1994年に、エリクソンのJaarp Haartsen博士により考案されました。この規格は、10 世紀にデンマークとノルウェーを統一した有名なバイキングのKing Harald Gormssonから名付けられました。Haartsen博士はRS-232規格を置き換える近距離無線通信規格を開発するよう命じられました。RS-232は、1960年代に考案され、今も利用されている有線通信規格です。
1994年には、エリクソンのほかに、インテルやノキア、IBM、東芝などの企業も電子機器間での短距離無線通信接続のアイデアを持っていました。この時点でこれらの企業が理解したのは、異なる電子機器間で短距離無線接続するには、プロトコルが標準化され、一般的に利用される必要があるということです。1996年に、これらの企業は、Bluetooth® Special Interest Group (SIG)を結成し、最終的に1998年に設立されました。SIGは5人のメンバーで開始しましたが、最初の年の終わりには4000人に達しました。今は30000人以上となっています。
Bluetooth®の目的は、King Harald Gormssonがデンマークの民族を一つの王国に統一したように、機器を統一することです。
/*
BLE_Central_Device.ino
This program uses the ArduinoBLE library to set-up an Arduino Nano 33 BLE Sense
as a central device and looks for a specified service and characteristic in a
peripheral device. If the specified service and characteristic is found in a
peripheral device, the last detected value of the on-board gesture sensor of
the Nano 33 BLE Sense, the APDS9960, is written in the specified characteristic.
The circuit:
- Arduino Nano 33 BLE Sense.
This example code is in the public domain.
*/#include<ArduinoBLE.h>#include<Arduino_APDS9960.h>constchar*deviceServiceUuid="19b10000-e8f2-537e-4f6c-d104768a1214";constchar*deviceServiceCharacteristicUuid="19b10001-e8f2-537e-4f6c-d104768a1214";intgesture=-1;intoldGestureValue=-1;voidsetup(){Serial.begin(9600);while(!Serial);if(!APDS.begin()){Serial.println("* Error initializing APDS9960 sensor!");}APDS.setGestureSensitivity(80);if(!BLE.begin()){Serial.println("* Starting Bluetooth® Low Energy module failed!");while(1);}BLE.setLocalName("Nano 33 BLE (Central)");BLE.advertise();Serial.println("Arduino Nano 33 BLE Sense (Central Device)");Serial.println(" ");}voidloop(){connectToPeripheral();}voidconnectToPeripheral(){BLEDeviceperipheral;Serial.println("- Discovering peripheral device...");do{BLE.scanForUuid(deviceServiceUuid);peripheral=BLE.available();}while(!peripheral);if(peripheral){Serial.println("* Peripheral device found!");Serial.print("* Device MAC address: ");Serial.println(peripheral.address());Serial.print("* Device name: ");Serial.println(peripheral.localName());Serial.print("* Advertised service UUID: ");Serial.println(peripheral.advertisedServiceUuid());Serial.println(" ");BLE.stopScan();controlPeripheral(peripheral);}}voidcontrolPeripheral(BLEDeviceperipheral){Serial.println("- Connecting to peripheral device...");if(peripheral.connect()){Serial.println("* Connected to peripheral device!");Serial.println(" ");}else{Serial.println("* Connection to peripheral device failed!");Serial.println(" ");return;}Serial.println("- Discovering peripheral device attributes...");if(peripheral.discoverAttributes()){Serial.println("* Peripheral device attributes discovered!");Serial.println(" ");}else{Serial.println("* Peripheral device attributes discovery failed!");Serial.println(" ");peripheral.disconnect();return;}BLECharacteristicgestureCharacteristic=peripheral.characteristic(deviceServiceCharacteristicUuid);if(!gestureCharacteristic){Serial.println("* Peripheral device does not have gesture_type characteristic!");peripheral.disconnect();return;}elseif(!gestureCharacteristic.canWrite()){Serial.println("* Peripheral does not have a writable gesture_type characteristic!");peripheral.disconnect();return;}while(peripheral.connected()){gesture=gestureDetectection();if(oldGestureValue!=gesture){oldGestureValue=gesture;Serial.print("* Writing value to gesture_type characteristic: ");Serial.println(gesture);gestureCharacteristic.writeValue((byte)gesture);Serial.println("* Writing value to gesture_type characteristic done!");Serial.println(" ");}}Serial.println("- Peripheral device disconnected!");}intgestureDetectection(){if(APDS.gestureAvailable()){gesture=APDS.readGesture();switch(gesture){caseGESTURE_UP:Serial.println("- UP gesture detected");break;caseGESTURE_DOWN:Serial.println("- DOWN gesture detected");break;caseGESTURE_LEFT:Serial.println("- LEFT gesture detected");break;caseGESTURE_RIGHT:Serial.println("- RIGHT gesture detected");break;default:Serial.println("- No gesture detected");break;}}returngesture;}
/*
BLE_Peripheral.ino
This program uses the ArduinoBLE library to set-up an Arduino Nano 33 BLE
as a peripheral device and specifies a service and a characteristic. Depending
of the value of the specified characteristic, an on-board LED gets on.
The circuit:
- Arduino Nano 33 BLE.
This example code is in the public domain.
*/#include<ArduinoBLE.h>enum{GESTURE_NONE=-1,GESTURE_UP=0,GESTURE_DOWN=1,GESTURE_LEFT=2,GESTURE_RIGHT=3};constchar*deviceServiceUuid="19b10000-e8f2-537e-4f6c-d104768a1214";constchar*deviceServiceCharacteristicUuid="19b10001-e8f2-537e-4f6c-d104768a1214";intgesture=-1;BLEServicegestureService(deviceServiceUuid);BLEByteCharacteristicgestureCharacteristic(deviceServiceCharacteristicUuid,BLERead|BLEWrite);voidsetup(){Serial.begin(9600);while(!Serial);pinMode(LEDR,OUTPUT);pinMode(LEDG,OUTPUT);pinMode(LEDB,OUTPUT);pinMode(LED_BUILTIN,OUTPUT);digitalWrite(LEDR,HIGH);digitalWrite(LEDG,HIGH);digitalWrite(LEDB,HIGH);digitalWrite(LED_BUILTIN,LOW);if(!BLE.begin()){Serial.println("- Starting Bluetooth® Low Energy module failed!");while(1);}BLE.setLocalName("Arduino Nano 33 BLE (Peripheral)");BLE.setAdvertisedService(gestureService);gestureService.addCharacteristic(gestureCharacteristic);BLE.addService(gestureService);gestureCharacteristic.writeValue(-1);BLE.advertise();Serial.println("Nano 33 BLE (Peripheral Device)");Serial.println(" ");}voidloop(){BLEDevicecentral=BLE.central();Serial.println("- Discovering central device...");delay(500);if(central){Serial.println("* Connected to central device!");Serial.print("* Device MAC address: ");Serial.println(central.address());Serial.println(" ");while(central.connected()){if(gestureCharacteristic.written()){gesture=gestureCharacteristic.value();writeGesture(gesture);}}Serial.println("* Disconnected to central device!");}}voidwriteGesture(intgesture){Serial.println("- Characteristic <gesture_type> has changed!");switch(gesture){caseGESTURE_UP:Serial.println("* Actual value: UP (red LED on)");Serial.println(" ");digitalWrite(LEDR,LOW);digitalWrite(LEDG,HIGH);digitalWrite(LEDB,HIGH);digitalWrite(LED_BUILTIN,LOW);break;caseGESTURE_DOWN:Serial.println("* Actual value: DOWN (green LED on)");Serial.println(" ");digitalWrite(LEDR,HIGH);digitalWrite(LEDG,LOW);digitalWrite(LEDB,HIGH);digitalWrite(LED_BUILTIN,LOW);break;caseGESTURE_LEFT:Serial.println("* Actual value: LEFT (blue LED on)");Serial.println(" ");digitalWrite(LEDR,HIGH);digitalWrite(LEDG,HIGH);digitalWrite(LEDB,LOW);digitalWrite(LED_BUILTIN,LOW);break;caseGESTURE_RIGHT:Serial.println("* Actual value: RIGHT (built-in LED on)");Serial.println(" ");digitalWrite(LEDR,HIGH);digitalWrite(LEDG,HIGH);digitalWrite(LEDB,HIGH);digitalWrite(LED_BUILTIN,HIGH);break;default:digitalWrite(LEDR,HIGH);digitalWrite(LEDG,HIGH);digitalWrite(LEDB,HIGH);digitalWrite(LED_BUILTIN,LOW);break;}}
コードのテスト
コードが完成したら、双方のスケッチをボードにアップロードします。まず、セントラルデバイス(Arduino nano 33 BLE Sense)の正しいポートを選択し、シリアルモニタを開いて、セントラルデバイスが想定通りに動作しているか確認します。シリアルモニタには、以下が表示されます。
その後、セントラルデバイスは、ペリフェラルデバイスと接続を確立しようとします。また、前に指定したサービスとキャラクタリスティックを発見しようとします。両方とも成功すると、Nano 33 BLE Senseボードの内蔵ジェスチャーセンサーを起動できます。Nano 33 BLE SenseボードのUSBポートを下に向け、正面に立てた状態で安定させます。そして、手を上・下・右・左と手を動かします。ジェスチャーセンサーがジェスチャーを検出すると、シリアルモニタには、以下が表示されます。