たっち&びーぷとAtom LiteでiPad/iPhoneをスイッチ化🕹️
iPad/iPhoneをスイッチにしておもちゃを動かす
この記事では、iPad/iPhoneアプリ『たっち&びーぷ Connect』でおもちゃを動かすために必要になるデバイスを自作していきます。
まずは動画で紹介
『たっち&びーぷ Connect』はタッチ以外にもきょろきょろ操作やもしもし操作に対応しているので、視線や声でも扇風機を回すことができます。
iPad/iPhoneと繋がるスイッチ制御ユニット
自作が必要なのは「スイッチ制御ユニット」になります。
模式図的に表現すると以下のようなイメージです。
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 無線 スイッチ ┃
┃ 電源 - 通信機能 - 切替機能 - プラグ ┃
┃ (Bluetooth)(DCリレー) ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
iPad/iPhoneと繋がるためにはBluetooth接続できることが大事です。
スイッチ切替にはリレーという電磁石でオンオフする電子部品を利用します。
MaBeeeを使ったアイディア
これまで、iPadをスイッチにしておもちゃを操作するには乾電池型IoT製品MaBeeeを活用できることがよく知られていました。
上述の模式図と照らし合わせて考えると、MaBeeeが電源と無線通信を担当していることになります。
MaBeeeが乾電池型ということで、電源そのもの。
別途電源を用意する必要がないため、全体をコンパクトにできる非常に使い勝手に優れた構成でした。
ですが、2026年4月現在、このMaBeeeは入手困難となってきているようです。
そこで、代替となるユニットを自作しようというのが本記事の内容。
コンパクトさではMaBeeeに敵いませんが、低価格で入手しやすく、半田づけ作業がなるべく少ない構成を考えてみました。
Atom Liteで自作するスイッチ制御ユニット
使用するのはAtom Liteという小型のマイコンボードと、Grove Relayというパーツです。
材料
- Atom Lite
- Grove Relay
- 3.5mmモノラルプラグ+ケーブル
- USB-Cケーブル(電源用)
- タッパー
💡ケーブルについて補足①
今回私が使ったケーブルは2sqという太さ(断面積)のものです。
AWGという規格だと16あたりのようです。
福祉スイッチのケーブルとしては少し太めかもしれません。
後述する「コネクタ」を使う場合はもう少し細い方が良いかもです(AWG24〜28あたり)。
💡ケーブルについて補足②
USB-Cのケーブルは100円ショップのものでOKです。
充電専用ではなく、データ通信も可能なものを選ぶとプログラムを書き込むのが楽です。
組み立て方
半田付け作業が必要なのはモノラルプラグの2箇所だけです。
Atom Liteに、Grove Relayに同梱されている4色のケーブルを接続します。
色の並びに注意してください。
ケーブルの反対側にGrove Relayを接続します。
こちらも色の並びに注意してください。
両端を繋ぐとこんな感じです。
モノラルプラグが付いたケーブルを、Grove Relayに繋ぎます。
マイナスドライバーが必要です。
💡ケーブルについての補足③
分かりやすくするために、上の写真ではビニールを剥いたままのケーブルをそのまま装着しています。
ですが、実際にはこの接続方法では抜けてしまうかもしれません。
私はQIコネクタという部品を装着しました。
半田付けは不要ですが、圧着するためにペンチなどの工具が必要です。
こういった部品や工具を揃えるのが難しい場合は、ビニールを剥いて銅線部に半田を溶かし込むだけでも抜けづらくなるかもしれません。
タッパーに入れて完成です。
プログラムの書き込み
Atom Liteというマイコンボードは、自分でプログラムを書き込む必要があります。
Arduinoというソフトを使うのがお勧めですが、その辺りの環境設定については以下の記事で流れを解説しています。
本記事も同じAtom Liteを活用するので上の記事とほとんど同じなのですが、プログラムは少し変更します。
#include <M5Atom.h>
#include <NimBLEDevice.h>
/* ---------- UUID ---------- */
// 説明を簡単にするため、固定 UUID を使用しています。
// 実際のアプリケーションでは、独自に生成した UUID を使用してください。
// Webアプリでも生成できます⬇
// https://aki-ict.com/app/ble-uuid-generator/
const char* service_uuid = "00000001-0123-4567-1234-56789abcdef0";
const char* characteristic_uuid = "00000002-0123-4567-1234-56789abcdef0";
/* ---------- デバイス名 ---------- */
// ここでデバイス名を指定します。任意です。
// アプリ『たっち&びーぷ Connect』側からはこの名称で検索できます。
const char* deice_name = "AtomLite-Relay";
#define RELAY_PIN 32
bool isConnected = false;
class ServerCallbacks : public NimBLEServerCallbacks {
void onConnect(NimBLEServer *pServer, NimBLEConnInfo &connInfo) {
isConnected = true;
Serial.printf("Client connected: %s\n", connInfo.getAddress().toString().c_str());
M5.dis.drawpix(0, CRGB::Blue); // 接続時に青色に点灯
}
void onDisconnect(NimBLEServer *pServer, NimBLEConnInfo &connInfo, int reason) {
isConnected = false;
Serial.println("Client disconnected, restarting advertising");
NimBLEDevice::getAdvertising()->start();
}
};
class ActionCallback : public NimBLECharacteristicCallbacks {
void onWrite(NimBLECharacteristic *pChar, NimBLEConnInfo &connInfo) override {
std::string value = pChar->getValue();
if (!value.empty()) {
Serial.printf("Received: %s\n", value.c_str());
// ここで指定したコマンドをアプリ『たっち&びーぷ Connect』側で指定(Textモード)
if (value == "1") {
// 1というコマンドを受信した場合
M5.dis.drawpix(0, CRGB::Red); // 赤く点灯
digitalWrite(RELAY_PIN, HIGH); // リレーOn
} else {
// その他のコマンドを受信した場合
M5.dis.clear(); // 消灯
digitalWrite(RELAY_PIN, LOW); // リレーOff
}
}
}
};
void setup() {
Serial.begin(115200);
M5.begin(true, false, true);
M5.dis.clear();
pinMode(RELAY_PIN, OUTPUT);
NimBLEDevice::init(deice_name);
NimBLEServer *pServer = NimBLEDevice::createServer();
pServer->setCallbacks(new ServerCallbacks());
NimBLEService *pService = pServer->createService(service_uuid);
NimBLECharacteristic *pCharacteristic = pService->createCharacteristic(
characteristic_uuid,
NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::WRITE_NR);
pCharacteristic->setCallbacks(new ActionCallback());
NimBLEAdvertising *pAdvertising = NimBLEDevice::getAdvertising();
pAdvertising->addServiceUUID(service_uuid);
pAdvertising->enableScanResponse(true);
pAdvertising->setName(deice_name);
pAdvertising->start();
Serial.println("Advertising started");
}
void loop() {
if (!isConnected) {
// 接続待機中は緑点滅
uint32_t now = millis();
if (now % 1000 < 500) {
M5.dis.drawpix(0, CRGB::Green);
} else {
M5.dis.clear();
}
}
M5.update();
}
たっち&びーぷとの連携
iPad/iPhoneアプリ『たっち&びーぷ Connect』の操作手順は以下の通りです。
- [外部デバイス接続]を開く
- [その他のBLEデバイスに接続]をタップする
- [周辺のデバイスを探す]をタップする
- <AtomLite-Relay> というデバイス(プログラム内で指定した名称)を探してタップする
- [Select]ボタンをタップする
- コマンドを登録する(Aコマンドはプログラム内で指定した文字列)
おまけ
シーケンス実行もできます。
シーケンス実行とは、外部機器に対して複数の動作を順番に自動実行させる機能です。
コマンド例はこんな感じ⬇️です。
1
{wait1000ms}
2
{wait500ms}
1
{wait500ms}
2