Spresense BLE1507で簡易ラジコンの製作

# 概要
12/4にspresense sdk 3.3.0 になり、ArduinoIDE環境でBLE1507(serialization FW版）が制御できました。
BLE1507とメインボードとモータドライバを使って簡易ラジコンを製作してみました。

# 外観
以下のようなラジコンです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3002095/bc7ec4c6-565b-d8d1-3c68-6fd23e57fa89.png)

# 部品リスト
主な部品のリストは以下です。
| No | 部品名 | 購入先 |
|:-:|:-:|:-:|
| 1  |Spresense Main1ボード   |Switch Science等   |
| 2  |BLE1507   |Switch Science等   |
| 3 | モータードライバ | [amazon](https://www.amazon.co.jp/dp/B08S34C92H) |
| 4 | 電池ボックス 単3x3(Spresense用) | amazon |
| 5 | 電池ボックス 単3x2(モーター用) | amazon |
| 6 | ラジコンシャーシ | [amazon](https://www.amazon.co.jp/dp/B0BDNNGRBT) |
| 7 | ブリッジ基板 | JLCPCB |

# ブリッジ基板について
BLE1507はメインボードのソケットに直接差し込んで使いますが、
差し込んだ場合に、別のピンが引き出せないので、別のピンが使えるように
ブリッジ基板を作成しました。
今回は23-26pinをモータ制御のピンとして使用しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3002095/52a89e8d-4093-3632-3ac1-19ecdd721e0b.png)
上記のCN1の6,7,8,9を制御ピンとして使用する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3002095/189c0a38-7fa9-a843-8297-383e2bf3afc6.png)

# Arduinoスケッチ
https://github.com/TomonobuHayakawa/BLE1507_Arduino
のBLE1507_write.inoと
https://sensing-solution-hackathon-materials.sonyged.com/SPRESENSE_BLE_2024.pdf
を参考に修正を加えました。
write発生時にコールバック関数にモータドライブの制御を
追加しました。
```c:BLE1507_write_car.ino
/*
 * 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を差し込む時に
テープで固定してあげる事で、ギリギリ接続している状態になっています。
低背かつ、足の長いピンソケットがあるとよいのですが、なかなか見つかりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3002095/139208a2-ae37-8288-d802-4e8636ab8099.png)