概要
12/4にspresense sdk 3.3.0 になり、ArduinoIDE環境でBLE1507(serialization FW版)が制御できました。
BLE1507とメインボードとモータドライバを使って簡易ラジコンを製作してみました。
外観
部品リスト
主な部品のリストは以下です。
No | 部品名 | 購入先 |
---|---|---|
1 | Spresense Main1ボード | Switch Science等 |
2 | BLE1507 | Switch Science等 |
3 | モータードライバ | amazon |
4 | 電池ボックス 単3x3(Spresense用) | amazon |
5 | 電池ボックス 単3x2(モーター用) | amazon |
6 | ラジコンシャーシ | amazon |
7 | ブリッジ基板 | JLCPCB |
ブリッジ基板について
BLE1507はメインボードのソケットに直接差し込んで使いますが、
差し込んだ場合に、別のピンが引き出せないので、別のピンが使えるように
ブリッジ基板を作成しました。
今回は23-26pinをモータ制御のピンとして使用しました。
上記のCN1の6,7,8,9を制御ピンとして使用する。
Arduinoスケッチ
https://github.com/TomonobuHayakawa/BLE1507_Arduino
のBLE1507_write.inoと
https://sensing-solution-hackathon-materials.sonyged.com/SPRESENSE_BLE_2024.pdf
を参考に修正を加えました。
write発生時にコールバック関数にモータドライブの制御を
追加しました。
/*
* BLE1507_write.ino
* Copyright (c) 2024 Yoshinori Oota
*
* This is an example of BLE1507
*
* This is a free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/****************************************************************************
* Included Files
****************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "BLE1507.h"
/****************************************************************************
* ble parameters
****************************************************************************/
#define UUID_SERVICE 0x3802
#define UUID_CHAR 0x4a02
static BT_ADDR addr = {{0x19, 0x84, 0x06, 0x14, 0xAB, 0xCD}};
static char ble_name[BT_NAME_LEN] = "SPR-PERIPHERAL";
BLE1507 *ble1507;
/****************************************************************************
* ble write callback function
****************************************************************************/
void bleWriteCB(struct ble_gatt_char_s *ble_gatt_char) {
static int led = 0;
printf("write_callback!\n");
ledOff(led);
printf("length : %d \n",ble_gatt_char->value.length);
printf("value : ");
for (int i = 0; i < ble_gatt_char->value.length; i++) {
printf("%c ", ble_gatt_char->value.data[i]);
}
if(ble_gatt_char->value.data[0]==0x1){
digitalWrite(23, HIGH);
digitalWrite(24, LOW);
}else if(ble_gatt_char->value.data[0]==0x2){
digitalWrite(23, LOW);
digitalWrite(24, HIGH);
}else{
digitalWrite(23, LOW);
digitalWrite(24, LOW);
}
if(ble_gatt_char->value.data[1]==0x1){
digitalWrite(25, HIGH);
digitalWrite(26, LOW);
}else if(ble_gatt_char->value.data[1]==0x2){
digitalWrite(25, LOW);
digitalWrite(26, HIGH);
}else{
digitalWrite(25, LOW);
digitalWrite(26, LOW);
}
led = (ble_gatt_char->value.data[0] % 4)+ 0x40;
ledOn(led);
printf("\n");
}
void bleCommandCB(struct ble_gatt_char_s *ble_gatt_char) {
String command = "";
for (int i = 0; i < ble_gatt_char->value.length; i++) {
command += (char)ble_gatt_char->value.data[i];
}
Serial.println(command);
if (command.equals("start")) {
Serial.println("Recieve: start!");
}
else if (command.equals("stop")) {
Serial.println("Recieve: stop!");
}
else {
Serial.println("Recieve unknown command.");
}
}
/****************************************************************************
* setup function
****************************************************************************/
void setup() {
pinMode(23, OUTPUT);
pinMode(24, OUTPUT);
pinMode(25, OUTPUT);
pinMode(26, OUTPUT);
Serial.begin(115200);
ble1507 = BLE1507::getInstance();
ble1507->beginPeripheral(ble_name, addr, UUID_SERVICE, UUID_CHAR);
ble1507->setWritePeripheralCallback(bleWriteCB);
// ble1507->removeBoundingInfo();
ble1507->startAdvertise();
}
/****************************************************************************
* loop function
****************************************************************************/
void loop() {
}
改善点
ブリッジ基板なのですが、BLE1507の端子が短いにもかかわらず、低背ではない
ピンソケットを使ってしまいました。。。その結果、BLE1507を差し込む時に
テープで固定してあげる事で、ギリギリ接続している状態になっています。
低背かつ、足の長いピンソケットがあるとよいのですが、なかなか見つかりません。