不自由をもつ人のためのマウス作りと題していますが、自由とは不自由とは何でしょう、できるとかできないは何でしょう。随意とか不随意とは何でしょう。今回はこれらについて考えてみましょう。
スイッチ操作やコミュニケーションエイドに関係する集まりが各地で色々あります。そこに参加すると様々なお話を聞くことができます。(まれにとても少ないこともありますがそれはさておき)そこではうまくいかないとかできないとかの話がとても多いのは、ある意味では当然のことでしょう。参加者のみなさんはそこに困っているから参加しているのですから。しかし残念ながらうまくいかない理由や原因や解決方法について話が進むことはあまりありません。(正しくはほとんどありません)
うまくいかない事例紹介にも意味も価値もないわけではありませんが、こればかりが続くとなんとも変なこころもちになります。気を取り直してまた別の会に参加するとなぜか前の会と同じようなことになったりしてまた変なこころもちになります。どうもこの問題を多くの人々に知らせることにばかり力が入っているように思えてきます。環境なんとかや自然なんとかもそうですが、大勢集まってもできるものはできるし、できないものはできません。大切なのは原理を理解し原因を明らかにして、根拠のある対策を行うことだと思うのですがどうでしょうか。
そこでスイッチ操作がうまくいかない場面について、その理由を考え対策することについて考えてみることにします。
前回はモーメンタリ動作とオルタネイト動作について説明しました。その際に使用したサンプルのコードをもう一度見てみよう。
mouse2.ahk
Speed:=20 Up:: X:=0 Y:=-2 Sleep, 250 Loop { MouseMove, X, Y, Speed, R if GetKeyState("Up", "P") = 1 Return } return Down::MouseMove, 0, 2, 50, R Left::MouseMove, -2, 0, 50, R Right::MouseMove, 2, 0, 50, R
このサンプルは、上矢印キーを押せばマウスカーソルが上方向に動き、再度上矢印キーを押せば停止するものです。
この6行目で、Sleep, 250 として250ミリ秒間停止させています。
実ははじめはこの行はありませんでした。しかし試運転の結果この行を追加することにしました。
このサンプルは、上矢印キーを押したとき3行目から動作が開始し、行に記された仕事を次々とこなしていきます。そしてLoopで8-12行を繰り返します。9行目でマウスカーソルを動かしています。10行目で上矢印キーが押されたかどうかを判定しもし押されていたら、11行目でLoopから抜けてマウスの動きも止まります。
さてはじめ6行目がない状態で試してみました。ところが上矢印キーを押してもマウスカーソルは動きません。何回やってもおなじです。プログラム自体は途中で止まっていません。きちんと終了しています。そのうち一回やることにほんの少し動いていることに気がつきました。そうです。私が上矢印キーをポンと押す瞬間に2行、3行と進んで指が離れるまえに10行目で「押している」と判断し停止していたのです。その間に9行目で2dotだけ動いていたのです。5行目に注目ください。
このトラブルの原因は、「押したあと指を離すのが遅い」ことでした。そこでまず十分神経を集中して可能な限り押し時間を短くするようにやってみました。しかしうまくいくのは10回に1回くらいでそれもかなり疲れますので実用的ではありません。しかし原因がはっきりしていますので対策も明確です。すなわち6行目と10行目の間の時間を長くすればいいのです。これにはSleepコマンドを使います。ミリ秒単位で停止を指定できます。100ミリ秒で試したところ随分改善しました。さらに250ミリ秒にするとかなりのんびり押しても問題ありませんでした。さらにこのような操作でミリ秒単位の無駄時間が生じてもとくに問題はありません。そこで、6行目にSleep, 250 を入れることにしました。これで改善はできました。
しかし「押したあと指を離すのが遅い」のでうまくいかないという話をきいたことはありませんか?そうです不自由をもつ人でも同じ理由でうまくいかないことがよくあるのです。今回偶然、不自由をもつ人のスイッチ操作での苦労を私も体験することができました。『そうかこんなきもちなのか』。この分野に関心のある方々には一度体験されることをお勧めします。
不自由のあるなしで、やれ指の動きが早いとか遅いとか言っても、コンピュータの速さと比べれば大した違いはありません。もし二倍時間がかかるとしても、原理的にはSleep, 500 で防止できます。このように仕組みがわかって原因もはっきりすれば、効果的な対策を立てることも、手直しして使うことも可能になります。
ただしこれは遅れ時間がほぼ均一なときに限ります。なかには時々スイッチをおしたまま数秒以上固まってしまう人もいます。このような場合はスイッチから手が離せるようになるまで動作を止めて待っているようにするのがいいでしょう。方法は色々考えられますが、例えばこのようなやり方はいかがでしょうか?
mouse3.ahk
Speed:=20 Up:: X:=0 Y:=-2 Loop { if GetKeyState("Up", "P") = 0 Break Sleep, 100 } Loop { MouseMove, X, Y, Speed, R if GetKeyState("Up", "P") = 1 Y:=0 if (GetKeyState("Up", "P") = 0) and (Y = 0) Break } return Down::MouseMove, 0, 2, 50, R Left::MouseMove, -2, 0, 50, R Right::MouseMove, 2, 0, 50, R
説明
前回のサンプルに改良を加えています。
3-5行 上矢印キーを押下すると、x=0、y=-2に指定します
6-11行 つぎにこのループに入ります。上矢印キーを離さないとここから抜けられません
12-19行 loopでこの間の処理を繰り返します
14行 指定されたx,y,speedでマウスカーソルを移動します
15行 上矢印キーが押されると速度Yがゼロになります
17-18行 上矢印キーが離されるとループから抜けます あと省略
実際に試してみたい方は、 常駐型実行ファイル、mouse3.exe をこちらから ダウンロードしてください。ダブルクリックで動作を開始します。終了するときはタスクトレイ(通知領域、画面右下の部分)のHのアイコンを右クリックしてEXITしてください。
スイッチ操作が機敏に押したり離したりが難しい場合の対策はこのようにすればよろしいでしょう。
このほかの不都合として、震えのためスイッチ操作の際に、オンオフオンオフ。。。。。と繰り返してしまうことがあります。こちらはチャタリングと言います。これは健常者でも発生します。このためスイッチを設計する際は、バネ、接点、摩擦粘性など考慮してチャタリングを防止するようにします。しかしこれは普通の人の場合が対象です。不自由を持つ人の場合は震えの種類も大きさも幅広いですから、スイッチなどのものを作るよりも、ソフトで対応するのが手間もお金も節約できるだろうと思います。
震えがある場合の基本的対応として、一定時間オンが続いたらオンと同じく一定時間オフが続いたらオフと判断しそれ以外は無視するのが基本です。使用する人の震えに合わせて調整するといいでしょう。一例を次に示します。
mouse4.ahk
Speed:=100 X:=0 Y:=0 A:=0 Loop { if GetKeyState("Up", "P") = 1 Count++ Else Count:=0 if (count=10 and A=0) { A:=1 X:=0 Y:=-2 } Else if (count=10 and A=1) { A:=0 X:=0 Y:=0 } MouseMove, X, Y, Speed, R Sleep, 100 } Return Down::MouseMove, 0, 2, 50, R Left::MouseMove, -2, 0, 50, R Right::MouseMove, 2, 0, 50, R
説明
今回は起動すると即プログラムが動き始めます。一秒間押し続けるとマウスカーソル動き始め、一秒間押し続けると止まります。
全体が大きなループになっています。
7-10行 上矢印キーを押していると、Countが1増えます。離していると0になります。
11-16行 Countが10で(1秒経過)停止しているとき(A=0)速度(XとY)に値を入れ、Aを1に変更します。
17-22行 Countが10で(1秒経過)動いているとき(A=1)速度(XとY)にゼロを入れ、Aを0に変更します。
23行 そのときのXとYの値でマウスカーソルを動かします。
24行 100ミリ秒停止します。このループ10回で1秒になります。
あと省略
実際に試してみたい方は、 常駐型実行ファイル、mouse4.exe をこちらから ダウンロードしてください。ダブルクリックで動作を開始します。終了するときはタスクトレイ(通知領域、画面右下の部分)のHのアイコンを右クリックしてEXITしてください。
今回はAutoHotkeyを使って不自由をもつ人がスイッチ操作で遭遇しがちな問題とその対策について考えてみました。AutoHotkeyはもともとWindowsでホットキー(ショートカットキーともいいます)を作るためのツールですが、使いようによっては不自由をもつ人がパソコンを操作する際の支援にもずいぶん役に立つようです。また手作りスイッチと違い、作っては壊しの試行錯誤もやりやすいことがわかりました。このようなツールをもっと広い用途につかっていきたいと思います。
また、AutoHotkeyには機器操作支援やコミュニケーション支援にあたる支援者の学習教材としての使い道もあるようです。かなり手軽ですし無料ですし、事例もサンプルもたくさんあります。また実行ファイルを作って配布しやすい特徴もあります。GNU GPLv2. ライセンスですのでまあ気楽に自由に何でもできます。今回の試みでも、スイッチ操作で不自由をもつ人の困難は程度の違いはあるものの普通の人々も同様にもっていることがわかりました。ただ普通の人たちへの対策は身の回りにあふれていますが、少数者への配慮は大量生産では省略されています。その部分を作って付け足せば問題の解決に近づくわけです。
最後にこのようなソフトを自作する意味について考えて見ましょう。Windowsにはテンキーで操作するマウスが『簡単操作』にすでに存在します。それでも同じ目的で似たものを作るのはなぜでしょう。
プログラムを作るには中の仕組みをひとつひとつ理解しなくてはなりません。反対に考えるとプログラムを作ると中の仕組みがわかってきます。作ったプログラムがうまく動くように改善できるのも中の仕組みがわかっているからです。そしてうまくいかない人がうまくできるように改善するときも中の仕組みがわかっていないとうまく修正できません。それどころか中の仕組みがわからないとその人がどうしてうまくいかないかも容易に理解できないでしょう。このような理由から自分でプログラムを作ろうとしているのです。また同じ理由でこのページではどう作ったのか中身をお見せしています。
市販品を次々と試しているがどれもうまくいかないという人がいます。でも考えてみてください。竹取物語ではどの縁談もうまくいきませんでしたがそれには原因がありました。原因を無視していたらどれだけやってもまとまる話もまとまらないのは無理もありませんね。
操作スイッチの適合関係
AutoHotkey 関係
GNU GPL v2.0 関係
2019/12/13 公開
研究企画課リハ工学科にもどる
←もくじはこちらです