2023年 SPRESENSE活用コンテスト への道⑦ ーBLE通信3ー
HomeMadeGarbage Advent Calendar 2023 |20日目
前回は 2023年 SPRESENSE活用コンテスト への応募に向けてサーボモータSTS3032でロボット犬を構成してSPRESENSEのマルチコア機能を使って動作を確認しました。
目次
データ送信
ロボット制御のためには動作パターンの他に各種パラメータの設定も必要となります。
ここではBLEによるパラメータ送信及び保存動作を確認します。
Arduinoコード
以下のように2コア使用して動作確認します。
- Mainコア:BLE1507で受信した動作モードとパラメータを受けて
サーボ SCS3032をsoftwareserial (GPIO D7)で制御 - Subコア1:BLEボード BLE1507 での通信管理
Mainコア
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
#ifdef SUBCORE #error "Core selection is wrong!!" #endif #include <MP.h> #include <SoftwareSerial.h> #include <EEPROM.h> int sub1 = 1; SoftwareSerial mySerial(-1, 7); // RX,TX int8_t id; /* user-defined msgid */ int8_t idMode = 10; int8_t idPeriod = 20; int8_t idHeight = 30; int ret = 0; int Data = 0, Mode = 0; const int Stretch = 1; const int Step = 2; const int Advance = 3; const int Back = 4; const int L = 5; const int R = 6; const int run = 7; int period = 120, height = 80; void setup() { Serial.begin(115200, SERIAL_8N1); mySerial.begin(1000000); MP.begin(sub1); MP.RecvTimeout(MP_RECV_POLLING); //Polling 受信待ちなし delay(200); EEPROM.get(idPeriod, periodRx); if(periodRx != 0) period = periodRx; EEPROM.get(idHeight, heightRx); if(heightRx != 0) height = heightRx; } void loop() { ret = MP.Recv(&id, &Data, sub1); if (ret == idMode) { Mode = Data; }else if (ret == idPeriod) { period = Data; EEPROM.put(idPeriod, period); }else if (ret == idHeight) { height = Data; EEPROM.put(idHeight, height); } if(Mode == Stretch){ 屈伸 }else if(Mode == Step){ 足踏み }else if(Mode == Advance){ 前進 }else if(Mode == Back){ 後進 }else if(Mode == R){ 右旋回 }else if(Mode == L){ 左旋回 }else if(Mode == run){ 走行 }else{ 初期姿勢 } } |
Sub1コアからの動作選択信号 (Mode: 0~7)と動作周期 (period [msec])、姿勢高さ (height [mm])を受信してSCS3032をsoftwareserial (GPIO D7)で制御して動作
periodとheight は電源OFF後も保持させたいので EEPROMライブラリ を使用してSPRESENSEに保存しています。
EEPROMライブラリはメインコアでのみ使用可能のようです。
Subコア1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#if (SUBCORE != 1) #error "Core selection is wrong!!" #endif #include <MP.h> int8_t idMode = 10; int8_t idPeriod = 20; int8_t idHeight = 30; String rcv; int Data = 0; void setup() { Serial2.begin(115200, SERIAL_8N1); delay(300); MP.begin(); } void loop() { while(Serial2.available() != 0){ rcv = Serial2.readStringUntil('\n'); if (rcv.indexOf('p') != -1) { Data = rcv.substring(1).toInt(); MP.Send(idPeriod, Data); }else if (rcv.indexOf('h') != -1) { Data = rcv.substring(1).toInt(); MP.Send(idHeight, Data); }else{ Data = rcv.toInt(); MP.Send(idMode, Data); } } } |
BLE1507とSPRESENSE間はUART2 (Serial2)で通信
BLE通信で受信してデータ冒頭が’p’なら動作周期 (period [msec])、’h’なら姿勢高さ (height [mm])、それ以外なら動作選択信号 (Mode)として随時Mainコアに送信
動作
姿勢高さや行動周期を送信してコントロール
文字データを手打ちして送っているのでタイプミスすると変な動作になる。
キチンとエラー除去もしないといけませんね。
というか操作しやすいアプリの製作が必要ですわ。
おわりに
ここでは送信データにバラエティを持たせての動作確認を実施しました。
BLE通信アプリの製作というかなり重めの課題はありますが、とりあえずSPRESENNSEを用いての多様なロボット操作が可能であることがわかりました。
次はロボットにセンサを搭載して更なる知的動作を目指します。
それではまた。