iOSのアクセシビリティのスイッチコントロール用のスイッチボックス作成(有線)

iPhone、iPadなどのiOSにはアクセシビリティという設定があって、1スイッチでiOS機器を操作できるようになっています。

これの外部スイッチ用のスイッチボックスの作成メモです。

iOSの外部スイッチ

いろいろあるみたいですが、とりあえずここではUSBで接続するものを対象にします。無線接続(BLE)のものについてはこちらに

USBで接続する場合にはiPhoneやiPadにLightning - USBカメラアダプタ(ipad proなどのようにUSB-Cのものに関してはUSB-C - USBアダプタ)というものを接続します (スイッチボックスの電源はiphoneからもらいますので、電源が接続できるLightning - USB 3カメラアダプタのほうがよいかと思います)。 そこに以下で作成するスイッチボックスをつなぎます。

基本的なこと

iOSに対して半角スペースとかを入力してあげれば良いようです。つまりスイッチボックスはキーボードとしてふるまえば良いみたい。 試しにLightning - USB 3カメラアダプタにキーボードをつないであげると外部スイッチとして登録できます。 なのでサポートする人が自分のiPhoneとかでいろいろ試してみたいときにはLightning - USB 3カメラアダプタにキーボードをつないであげれば色々試してみることができます。

「USBキーボード 自作」とかで検索すればいろいろ出てきます

必要なもの

DigiSpark。同等品(?)がamazonとかでも買えます。
本来のDigiSparkは直刺しのUSB TypeAですが、これだと抜けやすかったりしてちょっと使いにくいです。同等品でmicroUSBのものがありますので、 そちらを使った方が幸せになれるかもしれません。ただ何度も抜き差ししているとmicroUSBのものはUSBをつなぐところがとれちゃうことがあるようです。
スイッチ接続用の3.5mmモノラルジャック
スイッチをつなぐためのもの
Arduinoとか
ArduinoでDigiSparkボードを使えるようにしておく。「digispark 開発環境」検索すると色々でてきます

配線図

配線図

工作的にはボードとモノラルジャックをつなぐだけなので簡単ですかね。

プログラム

#include "DigiKeyboard.h"
#define KeyPort 0 //スイッチ入力はP0を使う

bool outputState = true;

void setup() {
  pinMode(KeyPort,INPUT_PULLUP); //スイッチ入力ポートの設定、入力ポートとして使う。内部pullup有効
}

void loop() {
  usbPoll();
  if (digitalRead(KeyPort) == LOW) {
    if(!outputState) {
      outputState=true;
      DigiKeyboard.sendKeyStroke(KEY_SPACE);
    }
  } else {
    outputState = false;
  }
  DigiKeyboard.delay(50);
}

これで「スケッチ」→「検証・コンパイル」して、エラーが出なければ「スケッチ」→「マイコンボードに書き込む」すると


Running Digispark Uploader...
Plug in device now... (will timeout in 60 seconds)

と出るので、そしたらDigiSparkボードをパソコンにつなぐと書き込みされます。書き込みが完了すると


running: 100% complete
>> Micronucleus done. Thank you!

と出ます。そしたら書き込み完了です。パソコンからDigiSparkボードを外してください

iPhoneにつなぐと「このデバイスは使えません」とか「外部スイッチが見つかりません」とか出ることがあります。でもそのあと外部スイッチとして使えるようになります。

これはDigiSparkボードに書き込み用のファームウェアが入っていて、USB接続したときにまず書き込み用のファームウェアが働いてそのあとに先ほど書き込んだキーボードのファームウェアが働くためです。