編集履歴一覧に戻る
lipoyangのアイコン画像

lipoyang が 2026年01月21日19時10分38秒 に編集

バッテリー電圧監視機能を追加

本文の変更

# 概要 センスチャン は [スタックチャン](https://github.com/stack-chan/stack-chan) から派生して誕生したロボットです。スタックチャン は[ししかわ](https://x.com/stack_chan)氏が開発・公開している、手乗りサイズのスーパーカワイイコミュニケーションロボットです。センスチャン は、スタックチャンの親しみやすいデザインやオープンソースの思想を受け継ぎつつ、ロボット用マイコンとしても高性能なSPRESENSEを採用し、また移動用に対向2輪型の駆動輪を持たせました。 センスチャン は、SPRESENSEを搭載したロボット用基板、対向2輪型のロボット機構、そしてそれらを制御するソフトウェアから構成されています。コミュニケーションロボットだけでなく、センサー処理や自動走行など、幅広いロボット開発の素体となることを目指しています。 @[youtube](https://www.youtube.com/watch?v=7vNrGq3GYxY) # システム構成 システム構成を下図に示します。 ![システム構成図](https://camo.elchika.com/c84f111e8c073a2990025c1a95138927cf91d34f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f31643530336231332d653631322d343764652d383566662d663832343636616261646135/) センスチャン専用基板を設計しました。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で設計しました。 ![回路図](https://camo.elchika.com/0abcd37bbcef7c4c1af041df7f56b477e9eddad8/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f37373338313537622d356339342d343931332d386636662d616538623035633664346362/) ![パターン設計](https://camo.elchika.com/8f5e5a36bdd1f0caa40b789156871f4b7be84ef9/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f38313730663833312d643936352d343664382d623133622d633233636161303039363734/) - [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 様に発注しました。部品の実装は手ハンダです。 ![表面](https://camo.elchika.com/6d6b50b5dc570c0270926868ace869b4c10beedd/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f63663066643937312d613565372d343539622d626664332d633763636531336163313639/) ![裏面](https://camo.elchika.com/e71e866fbf66e8ae2a61158229a97c63dada7a61/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f61643531636163392d353639362d343534362d396236332d346538356363386264326662/) SPRESENSEメインボードを接続するB2Bコネクタは0.4mmピッチ×100ピンですが、なんとか手ハンダで実装できました。何個も作るならPCBAを発注するべきでしょう。また、少しパターン設計にミスがありました。四隅のランドは大きくして強度を稼ぐべきでした。 ![B2Bコネクタ](https://camo.elchika.com/7da567886d9f206914724083d20d5818c92997b9/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f63343430393334652d386562302d346262632d383334622d303366326461373736656137/) ## 結線 下図のように結線します。 ![結線図](https://camo.elchika.com/074031d6b2c06fdf55ab44577adf2e7f85633f88/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f39623061363862632d393233382d346333612d623634302d643762626335336436636535/) - 電源のコネクタは、JST EH 3ピンです。 - シリアルサーボのコネクタは、Dynamixel XL330シリーズ標準の JST EH 3ピンです。 - M5 NanoC6 および IMUセンサ との接続にはGroveケーブルを使用しますが、センスチャン基板側はスペースの都合でGroveコネクタではなく、JST EH 4ピンです。 # ソフトウェア ## センスチャン本体 (SPRESENSE) のソフトウェア - IDE : PlatformIO - フレームワーク : Arduino - 依存ライブラリ : LovyanGFX, Dynamixel2Arduino ++Dynamixel2Arduinoライブラリは、SPRESENSE環境とマクロ定義名の衝突があるので、ローカルで修正して使っています。++ ![ソフトウェア構成](https://camo.elchika.com/2968021b76bac7b8ac9044738c581ab87861912f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f33333530613434322d383166612d343261612d386336352d373332303935326361313837/) ++ソフトウェアの開発はまだまだこれからです。++ 現状、モータ制御・画面表示・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/)ライブラリをSPRESENSEに移植しました。 [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```を用います。 ![BLEシリアルブリッジ](https://camo.elchika.com/8b02750093a7f3bd765744f7062abb964b397335/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f61356466613039352d363864622d343339352d393933652d666135643439663563383731/) - [ソースコード一式](https://github.com/lipoyang/Sense-chan/tree/main/firmware/NUS_NanoC6) ## ラジコン操縦用スマホアプリ(Webアプリ) センスチャンをラジコン操縦できるスマホアプリ(Webアプリ)です。BLEで通信します。 ![システム概略図](https://camo.elchika.com/41a9254e77f7af3c9d86f77e51691a56b1dfd6eb/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f64616462623065352d646162642d346365332d383338652d633939316539346332303563/) Web Bluetooth API を使用するため、 対応ブラウザは Chrome系 (PCやAndroidのChrome, Edgeなど) です。ただし、 iOSのChromeはBLEへのアクセスが許可されていないため非対応です。 iOSでも Bluefy は Web Bluetooth API に対応しているらしいですが動作未確認です。ネットワークは使用しないのでオフラインでも動作します。 ![スマホアプリの画面](https://camo.elchika.com/7ad3a0d4c8a5bbc93d6f9badbb6d4872f1f9f6a3/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f66363939666232332d303264372d343361382d626338312d383138303831393966613233/) - [ソースコード一式](https://github.com/lipoyang/SpresensePropoBLE) - [こちら](https://licheng.sakura.ne.jp/spr_propo_ble/)でもホストしています # メカ ## 設計 メカは Autodesk Fusion で設計しました。 ![3Dモデル](https://camo.elchika.com/e9a49705005fa7ec2cc5b952db521b102233a568/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f62346233383635392d333934382d343633342d396130352d376134303931326466616438/) - [設計データ一式](https://github.com/lipoyang/Sense-chan/tree/main/mechanical) ++Autodesk Fusionは個人用ライセンスで使用しました。このデータの商用利用は不可です。++ 3Dプリンタ (Bambu Lab A1 mini) でパーツを出力しました。使用したフィラメントはPLAです。 ![3Dプリンタ出力](https://camo.elchika.com/73741d4e5d5efced49d2e3263bf3ffbfc25e0b73/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f32383733373538612d366534612d346336312d383736332d336132363966373332316236/) 表面処理をして、塗装して仕上げました。使用した塗料はクレオスの水性ガンダムカラーです。 - XHUG09 ミカエリス パープル - HUG104 ディアクティブ ホワイト ![塗装後](https://camo.elchika.com/ad9aedb9496f15718b25c13d8bb1dd41088ce77c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f37343663313035352d303532642d343738652d383564622d343530653637363534383536/) タイヤはタミヤのナロータイヤ(58mm径)です。また、デザインの都合でLCDパネルより筐体の開口部が大きいため、厚さ1mmの透明アクリル板に裏面から黒枠を塗装したパネルを作成しました。 ![その他のパーツ](https://camo.elchika.com/fd3dde5fd8b3e25f180c9061033157d7388aaf23/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f64343836643538382d626235302d346531362d623061622d326663373831316137636637/) 前脚は動きません。足の裏にはカグスベール (トスベール) を貼りました。 ![足の裏](https://camo.elchika.com/318986cef7888f1e641482e0aec80d5c810cde4c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f34653132376232652d363265362d343464642d383837312d653264383166333764333033/) ## 組立て パーツを組み立てて回路を組み込んだら完成です。 ![組立て](https://camo.elchika.com/49d877c270d8eac295b0ab559c43944b6526bdfa/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f32616531623932632d336563312d343661622d613230312d303266636630626530303637/) # 課題 ソフトウェアの開発はまだまだこれからです。

-

- バッテリー電圧監視の動作確認

+

- ~~バッテリー電圧監視の動作確認~~ → 2026/01/21 動作確認OK (※3)

- マイクとスピーカの動作確認 - microSDカードの不具合調査 (※1) - IMUセンサ等を用いた自動走行 (※2) - コミュニケーションロボット化 (スタックチャンのような) ++(※1) microSDカードの読み書きは確認できています。しかし、電源オン時は正常にマウントされるのに、リセットボタンで再起動するとマウントされません。カードを挿入しなおすと自動マウントされます。++ ++(※2) 6軸IMUユニットの動作確認はできています。++

+

++(※3) バッテリー電圧監視処理と警告表示処理を実装しました。++ ![電圧低下の警告](https://camo.elchika.com/dfceb657a641b911ec334cf60f209dec3f48f523/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f34386134376439352d363534652d343833322d613839652d306439616638636466393863/)