Spresense経由でToioを動かす

Qiita Advent calendar2021の記事です。

:::note
Spresenseの関係会社に勤務していますが、業務外の個人活動の紹介です。
当記事は会社と関係ありません。
:::

:::note alert
誤った基板上のピン接続により故障する可能性があります。
自己責任でお願いします。
:::

こちらを参考にSpresense経由でToioを動かしてみました。
https://qiita.com/kenichih/items/a05eac7242d120592fbe
使ったBluetoothモジュールはRN4020です。
https://akizukidenshi.com/catalog/g/gK-11102/

####接続
|Spresense|RN4020
|---|---|
|GND|GND|
|3.3v|5v|
|D0|TX|
|D1|RX|

####コード

<details><summary> サンプルコード </summary><div>

``` 
//#include <SoftwareSerial.h> // これは化けた　やり直したらうまくいくかも

//#include <USBSerial.h> // これは不要だった
//USBSerial USBSerial;

// 参考 https://qiita.com/kenichih/items/a05eac7242d120592fbe

void sendCom(char *com, int len0)     // (A)
{
  Serial2.write(com, len0);           // (B)
  Serial.println();
  int n = Serial2.available();
  while (Serial2.available()) 
  {
    Serial.write(Serial2.read());
  }
}

// http://www.picfun.com/musen/musen02.html
// (C)
char com0[2] = "+\r";     // echo on/off
char com1[5] = "sf,1\r";  // 初期化
char com2[2] = "f\r";     // デバイス探し
char com3[2] = "x\r";     // デバイス探しやめ

char comT1[17] = "E,1,C930FAAC6A88\r";        // (1)　Toio接続　C930FAAC6A88はデバイスアドレス　予め調べる　
char comT2[24] = "CHW,0015,03100101F00000\r"; // LED赤色ちょっと光る
char comT3[24] = "CHW,0011,01010144020112\r"; // モータ回す
char comT4[24] = "CHW,0011,01010100020100\r"; // モータ止める
char comT9[3] = "k,\r";                       // Toio切断

void setup() 
{
  //https://developer.sony.com/develop/spresense/docs/arduino_developer_guide_ja.html
  // USB on main board      = Serial
  // D0 and D1 on ext board = Serial2
  // USB on ext board       = USBSerial

  Serial.begin(115200);
  Serial2.begin(115200);
  Serial.println("start");

  sendCom(com0, sizeof(com0));
  sendCom(com1, sizeof(com1));
  sendCom(com2, sizeof(com2));
  delay(5000);
  sendCom(com3, sizeof(com3));   
//  sendCom(com4, sizeof(com4));   
}

int i = 0;
 
void loop() 
{ // run over and over
  while (int n = Serial.available()) 
  {
//    Serial.print("usb;pc->bt"); 
    if (n > 2) 
    {  
      while (int n = Serial.available()) 
      {
        Serial2.write(Serial.read());
      }
    }
    else
    {
      char ch1 = Serial.read();
      switch (ch1)
      {
        case '1':
          sendCom(comT1, sizeof(comT1));
          break;
        case '2':
          sendCom(comT2, sizeof(comT2));
          break;
        case '3':
          sendCom(comT3, sizeof(comT3));
          break;
        case '4':
          sendCom(comT4, sizeof(comT4));
          break;
        case '9':
          sendCom(comT9, sizeof(comT9));
          break;
        default:
          Serial2.write(ch1);
      }
    }
  }

  while (int n = Serial2.available()) 
  {
//    Serial.println("pc<-bt");
    Serial.write(Serial2.read());
  }

}
```

</div></details>

####使い方
1. toioの電源を入れる
1. ArduinoIDEのシリアルモニタを開く
1. Bluetoothデバイスのリストが表示されるので、toioのデバイス番号をプログラム中の(1)の部分を書き換える
1. 再度コンパイルし書き込む
1. 数字の1, 2, 3, 4, 9を入力すると、対応するtoioの動作が起きるはず

<img width="500" alt="211206a2.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/a5f7ef91-67dd-a0a3-f16a-569447aea352.jpeg">
起動時のシリアルモニタ　赤枠がtoioのデバイス番号。改行はCRのみにした。

とりあえず動きました。
気が向いたらUIを工夫しようと思います。

https://youtu.be/SCJwv8AO_PI


#####備考
動かなくて困ったコードの部分をコメントアウト(A)(B)(C)で印をつけました。
(A) 配列のポインタを渡したら配列のサイズまでは送れなかったので、別の引数で渡した。
(B) 配列に入れたシリアル通信の命令を送るとき1文字づつ送ると動かなかった。
(C) 配列の終わりを"\0"にしないとSerial.printで表示したとき化ける。