記事一覧

I tried to turn on the LED connected to the M5Stack from the iOS application via BLE

I tried to turn on the LED connected to the M5Stack from the iOS application via BLE



Hello everyone! I’m RoboTakao.

Previously, I checked if I can connect with BLE with M5Stack , but this time I will create an iOS application and send and receive data with BLE and light the LED.

M5Stack_BLE_LED01.jpg

I consulted O'Reilly Japan 's " Prototyping Lab 2nd edition " and a sample sketch of the M5Stack library put in Arduino IDE.


Samples of Prototyping Lab is in Github.

1) iOS App

Sample 32.6 of Prototyping Lab 2nd edition "Create a dedicated smartphone application (iOS)"
Basically it is a sample of Swift using CoreBluetooth.
However, because there was a part that did not go well, I am fixing it.

2) M5Stack Sketch

Prototyping Lab 2nd Edition
 Sample sketch of "I want to connect with a smartphone wirelessly"
"ex_32 _ 1 _ UART"
 Arduino IDE Sample Sketch BLE_uart
 I have combined them.

iOS application fix points

1) Change service name

if peripheral.name == "UART Service" {

2) Peripheral scan

I specified withServices but changed it to nil.

Before

let serviceUUIDs = [CBUUID(string: uartServiceUUIDString)]
centralManager.scanForPeripherals(withServices: serviceUUIDs, options: nil)

After

centralManager.scanForPeripherals(withServices: nil, options: nil)

3) Changing the type of peripheral uartRXCharacteristic

It seems to fail with Write if the type is different.

Before

peripheral!.writeValue(
command, for: uartRXCharacteristic!,
type: CBCharacteristicWriteType.withoutResponse)

After

peripheral!.writeValue(
command, for: uartRXCharacteristic!,
type: CBCharacteristicWriteType.withResponse)


Check sketch of M5Stack source.
Basically I combine sample sketches together.

Operation check

i Launch iOS application and start M5Stack.

Press the "connect" button to find the peripheral and connect to the service called UART Service.

When the LED button is pressed, the LED connected to the M5Stack lights up.



Actually I'd like to send M5Stack button information to iOS, but I have not done it yet.
I hope to post again when it goes well.

Sample Sketch


/*
Video: https://www.youtube.com/watch?v=oCMOYS71NIU
Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleNotify.cpp
Ported to Arduino ESP32 by Evandro Copercini

Create a BLE server that, once we receive a connection, will send periodic notifications.
The service advertises itself as: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E
Has a characteristic of: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E - used for receiving data with "WRITE"
Has a characteristic of: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E - used to send data with "NOTIFY"

The design of creating the BLE server is:
1. Create a BLE Server
2. Create a BLE Service
3. Create a BLE Characteristic on the Service
4. Create a BLE Descriptor on the characteristic
5. Start the service.
6. Start advertising.

In this example rxValue is the data received (only accessible inside that function).
And txValue is the data to be sent, in this example just a byte incremented every second.
*/
#include
#include
#include
#include
#include

BLEServer *pServer = NULL;
BLECharacteristic * pTxCharacteristic;
bool deviceConnected = false;
bool oldDeviceConnected = false;
uint8_t txValue = 0;

int LEDPinNo = 22;

// See the following for generating UUIDs:
// https://www.uuidgenerator.net/

#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"


class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
};

void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
}
};

class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string rxValue = pCharacteristic->getValue();

M5.Lcd.println("Receive");
Serial.println("Receive");


int from = 0;

boolean noMoreEvent = false;

while (!noMoreEvent) {
int index = rxValue.find("*", from);

if (index < 0) {
noMoreEvent = true;
}
else {
std::string command = rxValue.substr(from, index);

if (command == "On") {
digitalWrite(LEDPinNo, HIGH);
M5.Lcd.println("LED On");
Serial.println("LED On");
} else if (command == "Off") {
digitalWrite(LEDPinNo, LOW);
M5.Lcd.println("LED Off");
Serial.println("LED Off");
}

from = index + 1;
}
}
}
};


void setup() {
M5.begin();

Serial.begin(115200);

pinMode(LEDPinNo, OUTPUT); //22pin OUTPUT mode

// Create the BLE Device
BLEDevice::init("UART Service");

// Create the BLE Server
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());

// Create the BLE Service
BLEService *pService = pServer->createService(SERVICE_UUID);

// Create a BLE Characteristic
pTxCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_TX,
BLECharacteristic::PROPERTY_NOTIFY
);

pTxCharacteristic->addDescriptor(new BLE2902());

BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_RX,
BLECharacteristic::PROPERTY_WRITE
);

pRxCharacteristic->setCallbacks(new MyCallbacks());

// Start the service
pService->start();

// Start advertising
pServer->getAdvertising()->start();
M5.Lcd.println("Waiting a client connection to notify...");
Serial.println("Waiting a client connection to notify...");
}

void loop() {
// if (deviceConnected) {
// pTxCharacteristic->setValue(&txValue, 1);
// pTxCharacteristic->notify();
// txValue++;
// delay(10); // bluetooth stack will go into congestion, if too many packets are sent
// }

// disconnecting
if (!deviceConnected && oldDeviceConnected) {
delay(500); // give the bluetooth stack the chance to get things ready
pServer->startAdvertising(); // restart advertising
M5.Lcd.println("start advertising");
Serial.println("start advertising");
oldDeviceConnected = deviceConnected;
}
// connecting
if (deviceConnected && !oldDeviceConnected) {
// do stuff here on connecting
oldDeviceConnected = deviceConnected;
}

M5.update();
}



Good Bye! Thank you.

M5Stack related posts
1) M5Stack Arduino IDE initial setting (macOS)
2) M5Stack I tried Arduino IDE sample sketches
3) M5Stack I treid Avatar(Arduino IDE)
4) M5Stack LED Blink
5) M5Stack Servo operating
6) M5Stack X 16ch Servo Driver PCA9685
7) M5Stack Bluetooth Low Energy (BLE) Test
8) M5Stack WiFi Test

スポンサードリンク

コメント

コメントの投稿

非公開コメント

プロフィール

RoboTakao

Author:RoboTakao
みなさんご訪問ありがとうございます。ロボット作りたいけどお小遣いそんなにないし、簡単でローコストでロボットを作るための私のプロジェクトを紹介します。

ウェブサイトもありますのでそちらもよろしくお願いします。
http://robotakao.jp/

スポンサーリンク