概要
センスチャン は スタックチャン から派生して誕生したロボットです。スタックチャン はししかわ氏が開発・公開している、手乗りサイズのスーパーカワイイコミュニケーションロボットです。センスチャン は、スタックチャンの親しみやすいデザインやオープンソースの思想を受け継ぎつつ、ロボット用マイコンとしても高性能なSPRESENSEを採用し、また移動用に対向2輪型の駆動輪を持たせました。
センスチャン は、SPRESENSEを搭載したロボット用基板、対向2輪型のロボット機構、そしてそれらを制御するソフトウェアから構成されています。コミュニケーションロボットだけでなく、センサー処理や自動走行など、幅広いロボット開発の素体となることを目指しています。
システム構成
センスチャン専用基板を設計しました。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で設計しました。
基板の製造は 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
Dynamixel2Arduinoライブラリは、SPRESENSE環境とマクロ定義名の衝突があるので、ローカルで修正して使っています。
ソフトウェアの開発はまだまだこれからです。
現状、モータ制御・画面表示・BLE通信を統合して、ラジコン操縦ができるソフトウェアになっています。SPRESENSEのマルチコアを活用し、モータ制御・画面表示・BLE通信は別々のコアで実行します。その他の機能については開発中です。詳細は後述します。
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();
}
LCDにはスタックチャンと同様の顔が表示されます。スタックチャンの顔表示に用いられている M5Stack-AvatarライブラリをSPRESENSEに移植しました。 Common-Avatarライブラリとして公開しています。
通信モジュール (M5Stack NanoC6) のファームウェア
- IDE : PlatformIO
- フレームワーク : Arduino
SPRESENSEとM5NanoC6をUARTで接続し、M5NanoC6には送受信データへBLEサービスにブリッジさせます。BLEサービスは NUS (Nordic UART Service) を使用します。ただし、SPRESENSEの2つのシリアルポートのうち、SerialはUSBシリアル通信専用であり、Serial2はシリアルサーボとの通信に使用するので、M5NanoC6との通信にはSoftwareSerialを用います。
ラジコン操縦用スマホアプリ(Webアプリ)
センスチャンをラジコン操縦できるスマホアプリ(Webアプリ)です。BLEで通信します。
Web Bluetooth API を使用するため、 対応ブラウザは Chrome系 (PCやAndroidのChrome, Edgeなど) です。ただし、 iOSのChromeはBLEへのアクセスが許可されていないため非対応です。 iOSでも Bluefy は Web Bluetooth API に対応しているらしいですが動作未確認です。ネットワークは使用しないのでオフラインでも動作します。
メカ
設計
メカは Autodesk Fusion で設計しました。
Autodesk Fusionは個人用ライセンスで使用しました。このデータの商用利用は不可です。
3Dプリンタ (Bambu Lab A1 mini) でパーツを出力しました。使用したフィラメントはPLAです。
表面処理をして、塗装して仕上げました。使用した塗料はクレオスの水性ガンダムカラーです。
- XHUG09 ミカエリス パープル
- HUG104 ディアクティブ ホワイト
タイヤはタミヤのナロータイヤ(58mm径)です。また、デザインの都合でLCDパネルより筐体の開口部が大きいため、厚さ1mmの透明アクリル板に裏面から黒枠を塗装したパネルを作成しました。
前脚は動きません。足の裏にはカグスベール (トスベール) を貼りました。
組立て
課題
ソフトウェアの開発はまだまだこれからです。
バッテリー電圧監視の動作確認→ 2026/01/21 動作確認OK (※3)- マイクとスピーカの動作確認
- microSDカードの不具合調査 (※1)
- IMUセンサ等を用いた自動走行 (※2)
- コミュニケーションロボット化 (スタックチャンのような)
(※1) microSDカードの読み書きは確認できています。しかし、電源オン時は正常にマウントされるのに、リセットボタンで再起動するとマウントされません。カードを挿入しなおすと自動マウントされます。
(※2) 6軸IMUユニットの動作確認はできています。
(※3) バッテリー電圧監視処理と警告表示処理を実装しました。
投稿者の人気記事




-
lipoyang
さんが
2026/01/16
に
編集
をしました。
(メッセージ: 初版)
-
lipoyang
さんが
2026/01/16
に
編集
をしました。
(メッセージ: 文言の修正と、注意書きの追加)
-
lipoyang
さんが
2026/01/16
に
編集
をしました。
-
lipoyang
さんが
前の水曜日の19:10
に
編集
をしました。
(メッセージ: バッテリー電圧監視機能を追加)
ログインしてコメントを投稿する