lipoyang が 2026年01月16日12時08分37秒 に編集
初版
タイトルの変更
センスチャン ~ スタックチャン派生のSPRESENSE搭載ロボット ~
タグの変更
ロボット
スタックチャン
SPRESENSE
シリアルサーボ
PlatformIO
メイン画像の変更
記事種類の変更
製作品
ライセンスの変更
(MIT) The MIT License
本文の変更
# 概要 センスチャン は、[ししかわ](https://x.com/stack_chan)氏が開発・公開している、手乗りサイズのスーパーカワイイコミュニケーションロボットである [スタックチャン](https://github.com/stack-chan/stack-chan) から派生して誕生したロボットです。スタックチャンの親しみやすいデザインやオープンソースの思想を受け継ぎつつ、ロボット用マイコンとしても高性能なSPRESENSEを採用し、また移動用に対向2輪型の駆動輪を持たせました。 センスチャン は、SPRESENSEを搭載したロボット用基板、対向2輪型のロボット機構、そしてそれらを制御するソフトウェアから構成されています。センスチャン はコミュニケーションロボットにとどまらず、センサー処理や自動走行など、幅広いロボット開発のプラットフォームとなることを目指しています。 @[youtube](https://www.youtube.com/watch?v=7vNrGq3GYxY) # システム構成 システム構成を下図に示します。  センスチャン専用基板を設計しました。SPRESENSEメインボードを拡張し、M5Stackと同等の2インチ QVGA(320x240) の液晶パネルを実装できます。また、シリアルポートの半二重化回路も搭載し、シリアルサーボを直接接続できます。 無線通信 (BLEまたはWiFi) のためにM5Stack NanoC6を接続でき、SPRESENSEメインボードとはUARTで通信します。また、IMUセンサ等のモジュールも接続でき、SPRESENSEメインボードとはI2Cで通信します。これらの接続にはGroveケーブルを用います。 また、今回はソフトウェアの開発が間に合いませんでしたが、将来的な拡張のため、マイク、スピーカ、マイクロSDカードも接続できるように設計しました。 # 主要コンポーネント表 |名称|型番・備考| |---|---| |SPRESENSEメインボード|CXD5602PWBMAIN1| |M5Stack NanoC6|BLEシリアル通信モジュールとして使用| |2.0インチ 240x320 LCDモジュール|ST7789搭載| |DYNAMIXELシリアルサーボ|XL330-M077-T ×2個| |タミヤ ナロータイヤセット (58mm径)|楽しい工作シリーズ(No.145)| |電池ボックス 単4×3本|BH-431-1A150| |メインスイッチ|超小型波動スイッチ KCDI-11 2P| |DCDCコンバータ|入力:2.5V〜5V / 出力:5V| # 電子回路 ## 基板設計 センスチャン専用基板はKiCAD 9.0で設計しました。   - [KiCadの設計データ一式](https://github.com/lipoyang/Sense-chan/tree/main/board) - [回路図](https://github.com/lipoyang/Sense-chan/blob/main/board/Sense-chan.pdf) - [部品表](https://github.com/lipoyang/Sense-chan/blob/main/board/Sense-chan_BOM.xlsx) 基板の製造は JLCPCB 様に発注しました。部品の実装は手ハンダです。   SPRESENSEメインボードを接続するB2Bコネクタは0.4mmピッチ×100ピンですが、なんとか手ハンダで実装できました。何個も作るならPCBAを発注するべきでしょう。また、少しパターン設計にミスがありました。四隅のランドは大きくして強度を稼ぐべきでした。  ## 結線 下図のように結線します。  - 電源のコネクタは、JST EH 3ピンです。 - シリアルサーボのコネクタは、Dynamixel XL330シリーズ標準の JST EH 3ピンです。 - M5 NanoC6 および IMUセンサ との接続にはGroveケーブルを使用しますが、センスチャン基板側はスペースの都合でGroveコネクタではなく、JST EH 4ピンです。 # ソフトウェア ## センスチャン本体 (SPRESENSE) のソフトウェア - IDE : PlatformIO - フレームワーク : Arduino - 依存ライブラリ : LovyanGFX, Dynamixel2Arduino  ++ソフトウェアの開発はまだまだこれからです。++ 現状、モータ制御・画面表示・BLE通信を統合して、ラジコン操縦ができるソフトウェアになっています。SPRESENSEのマルチコアを活用し、モータ制御・画面表示・BLE通信は別々のコアで実行します。その他の機能については開発中です。詳細は後述します。 ```c++:main.cpp #include <Arduino.h> #include <Dynamixel2Arduino.h> #include "SenseChanFace.h" #include "BleReceiver.h" // スタックチャンの顔表示器 SenseChanFace face; // BLEラジコン受信器 BleReceiver receiver; // DYNAMIXEL設定 #define DXL_SERIAL Serial2 // シリアルポート const int DXL_DIR_PIN = 5; // 半二重通信の方向制御ピン const uint8_t DXL_ID_L = 1; // 左モータID const uint8_t DXL_ID_R = 2; // 右モータID const float DXL_PROTOCOL_VERSION = 2.0; // プロトコルバージョン Dynamixel2Arduino dxl(DXL_SERIAL, DXL_DIR_PIN); using namespace ControlTableItem; // BLEラジコン接続時 void onConnect() { Serial.println("Connected!"); face.setBaseExpression(Expression::Neutral); face.setExpression(Expression::Happy, 2000); face.setSpeachText("プロポ接続したよ", 2000); } // BLEラジコン切断時 void onDisconnect() { Serial.println("Disconnected!"); face.setBaseExpression(Expression::Sleepy); face.setExpression(Expression::Neutral, 2000); face.setSpeachText("プロポ切断したよ", 2000); } // BLEラジコン受信時 void onReceive(int l, int r) { Serial.printf("Received: l=%d r=%d\n", l, r); // モータの速度制御 // 対向二輪駆動なので極性に注意 dxl.setGoalVelocity(DXL_ID_L, +l, UNIT_PERCENT); dxl.setGoalVelocity(DXL_ID_R, -r, UNIT_PERCENT); } // 初期化 void setup() { Serial.begin(115200); // BLEラジコン受信器の初期化 receiver.onConnect = onConnect; receiver.onDisconnect = onDisconnect; receiver.onReceive = onReceive; receiver.begin(); // スタックチャンの顔の初期化 face.begin(); face.setBaseExpression(Expression::Sleepy); face.setExpression(Expression::Sleepy); // DYNAMIXELシリアルサーボの初期化 dxl.begin(57600); dxl.setPortProtocolVersion(DXL_PROTOCOL_VERSION); dxl.ping(DXL_ID_L); dxl.ping(DXL_ID_R); dxl.torqueOff(DXL_ID_L); dxl.torqueOff(DXL_ID_R); dxl.setOperatingMode(DXL_ID_L, OP_VELOCITY); dxl.setOperatingMode(DXL_ID_R, OP_VELOCITY); dxl.torqueOn(DXL_ID_L); dxl.torqueOn(DXL_ID_R); } // メインループ void loop() { // BLEラジコン受信器のメインループ処理 receiver.loop(); } ``` - [ソースコード一式](https://github.com/lipoyang/Sense-chan/tree/main/firmware/Sense-chan) LCDにはスタックチャンと同様の顔が表示されます。これには、スタックチャンの顔表示に用いられている [M5Stack-Avatar](https://github.com/stack-chan/m5stack-avatar/)ライブラリを移植した [Common-Avatar](https://github.com/lipoyang/Common-Avatar)ライブラリを作成して使用しています。 ## 通信モジュール (M5Stack NanoC6) のファームウェア - IDE : PlatformIO - フレームワーク : Arduino SPRESENSEとM5NanoC6をUARTで接続し、M5NanoC6には送受信データへBLEサービスにブリッジさせます。BLEサービスは NUS (Nordic UART Service) を使用します。ただし、SPRESENSEの2つのシリアルポートのうち、```Serial```はUSBシリアル通信専用であり、```Serial2```はシリアルサーボとの通信に使用するので、M5NanoC6との通信には```SoftwareSerial```を用います。  - [ソースコード一式](https://github.com/lipoyang/Sense-chan/tree/main/firmware/NUS_NanoC6) ## ラジコン操縦用スマホアプリ(Webアプリ) センスチャンをラジコン操縦できるスマホアプリ(Webアプリ)です。BLEで通信します。  Web Bluetooth API を使用するため、 対応ブラウザは Chrome系 (PCやAndroidのChrome, Edgeなど) です。ただし、 iOSのChromeはBLEへのアクセスが許可されていないため非対応です。 iOSでも Bluefy は Web Bluetooth API に対応しているらしいですが動作未確認です。ネットワークは使用しないのでオフラインでも動作します。  - [ソースコード一式](https://github.com/lipoyang/SpresensePropoBLE) - [こちら](https://licheng.sakura.ne.jp/spr_propo_ble/)でもホストしています # メカ ## 設計 メカは Autodesk Fusion で設計しました。  - [設計データ一式](https://github.com/lipoyang/Sense-chan/tree/main/mechanical) ++Autodesk Fusionは個人用ライセンスで使用しました。このデータの商用利用は不可です。++ 3Dプリンタ (Bambu Lab A1 mini) でパーツを出力しました。使用したフィラメントはPLAです。  表面処理をして、塗装して仕上げました。使用した塗料はクレオスの水性ガンダムカラーです。 - XHUG09 ミカエリス パープル - HUG104 ディアクティブ ホワイト  タイヤはタミヤのナロータイヤ(58mm径)です。また、デザインの都合でLCDパネルより筐体の開口部が大きいため、厚さ1mmの透明アクリル板に裏面から黒枠を塗装したパネルを作成しました。  前脚は動きません。足の裏にはカグスベール (トスベール) を貼りました。  ## 組立て パーツを組み立てて回路を組み込んだら完成です。  # 課題 ソフトウェアの開発はまだまだこれからです。 - バッテリー電圧監視の動作確認 - マイクとスピーカの動作確認 - microSDカードの不具合調査 (※1) - IMUセンサ等を用いた自動走行 (※2) - コミュニケーションロボット化 (スタックチャンのような) ++(※1) microSDカードの読み書きは確認できています。しかし、電源オン時は正常にマウントされるのに、リセットボタンで再起動するとマウントされません。カードを挿入しなおすと自動マウントされます。++ ++(※2) 6軸IMUユニットの動作確認はできています。++