
2023年 SPRESENSE活用コンテスト への道⑥ ーマルチコア ロボット犬ー
    Home > Advent Calendar > 
本記事にはアフィリエイト広告が含まれます。
HomeMadeGarbage Advent Calendar 2023 |16日目
前回は 2023年 SPRESENSE活用コンテスト への応募に向けてサーボモータSTS3032でロボット犬を構成して動作を確認しました。
目次
マルチコア
ここでは前回作ったロボット犬をSPRESENSEのマルチコア機能を使用して動作確認します。
以下のように2コア使用して動作確認します。
- Mainコア:BLEボード BLE1507 での通信管理
 - Subコア1:BLE1507で受信した動作モードを受けて足用サーボ SCS3032をsoftwareserial (GPIO D7)で制御
 
Arduinoコード
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  | 
						#ifdef SUBCORE #error "Core selection is wrong!!" #endif #include <MP.h> int8_t   id = 100; /* user-defined msgid */ int sub1 = 1; String rcv; int Data = 0; void setup() {   Serial2.begin(115200, SERIAL_8N1);   delay(300);   MP.begin(sub1); } void loop() {   while(Serial2.available() != 0){     rcv = Serial2.readStringUntil('\n');     Data = rcv.toInt();     MP.Send(id, Data, sub1);   } }  | 
					
BLE1507とSPRESENSE間はUART2 (Serial2)で通信
BLE通信で受信したデータint形式に変換して随時Subコア1に送信
 
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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56  | 
						#if (SUBCORE != 1) #error "Core selection is wrong!!" #endif #include <MP.h> #include <SoftwareSerial.h> SoftwareSerial mySerial(-1, 7);    // RX,TX int8_t   id = 100; /* user-defined msgid */ 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; void setup() {   mySerial.begin(1000000);   MP.begin();   MP.RecvTimeout(MP_RECV_POLLING); //Polling 受信待ちなし   delay(200); } void loop() {   ret = MP.Recv(&id, &Data);   if (ret != 0) {     Mode = Data;   }   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{     初期姿勢   } }  | 
					
Mainコアからのデータを受信して、データ(Mode: 0~7)に応じてSCS3032をsoftwareserial (GPIO D7)で制御して動作
受信モードをMP.RecvTimeout(MP_RECV_POLLING)として、受信待ちなしでデータ送信がない場合はスルー
動作
はっきり言ってマルチコアにしたご利益はさすがに動作からは分からない。。
しかしこれからドンドン高機能化するのでSPRESENSEの6コアが効果的に作用すると信じています。
おわりに
ここではマルチコア機能でロボット制御を並列処理して楽しみました。
次回はBLEによるデータ受信の多様化をはかりたいと思います。
