実は裏話てんこ盛りの「リモートdeキー暴動？」開発秘話？

## はじめに

本記事は、[MAヒーローズ・リーグ Advent Calendar](https://qiita.com/advent-calendar/2020/heroesleague "MAヒーローズ・リーグ Advent Calendar")　用に作成した記事です。
[「ヒーローズ・リーグ」](https://heroes-league.net/ "ヒーローズ・リーグ")という開発コンテストに応募した、「リモートdeキー暴動？」という作品の開発裏話等を書きます。

作品自体の説明は[Protopedia 「リモートdeキー暴動？」](https://protopedia.net/prototype/2001 "Protopedia") に記載がありますのでここでは割愛します、見たことない方は何のことかわからないかと思いますので、そちらを参照ください。

沢山有りすぎて長文なってしまいましたが、非公開写真も交えて書いていきます。
小さく区切っているので、興味の引くタイトルの個所だけでも参照頂ければと思います。

## 開発裏話

#### (1) きっかけ
きっかけは「キーボードをピアノの自動演奏みたいに自動で動かす」とネタ帳に書かれた１文と、「リモート（在宅）ワーク中に、邪魔にならない程度にさりげなく、作業の様子や温度観を伝える方法はないものか？」というところを解決できないかという想いから話は発展しました。

きっかけはそんなもんでしたが、なにか理由を付けないとと考えているうち「キーボードって叩かれてかわいそうだから…」って理由がついたんですが、いざ開発に熱中して苦労を重ねていくとなんか愛着がわいてきて、なんか本当にかわいそうになってきましたっというのが、本音ですねｗ。

#### (2) 動機から実現方法までに期間の半分以上の時間が掛かっている。
やりたいことは決まったもののとにかく情報が少ない、事例もない。
まぁ普通、誰も考えませんよね。キーボード動かしたいとは。メリットもないし。それこそ技術の無駄遣いですからね。

なので、共同開発に誘ったナッキィーさんを説得する事自体大変でした。理由が理解できないと...
引き受けてくれたものの、テンキーベースでの試作品がいい感じでサクサク動くのを見るまでは、あまり乗り気ではありませんでしたね。
![DSC_2300.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211331/59c7df45-de6a-2f18-72df-58f9b7130168.jpeg) 


まぁ、もともと思い立ってから行動に移すまでが長い性格なんですが、話を持っていくまでにも、自分で実現方法についてさんざん悩んで、機構系の本も流し読みしたり、動画見たり。そういったことに、かなりの日数を費やしてしまってました。

#### (3) 実はサーボで動かすを即却下
素人考えなのか、サーボって反応悪いし動きもとろいと思い込んでしまっていました。
それまでサーボって大きく 100度前後動かすようなものでしか使ってこなかった事や、ロボットなどの動きを外から眺めてみると、サーボって機敏に動かすのは苦手だし反応性は相当悪くなると思い込みで却下していました。

そこは、ちゃんと専門家に相談してみるもんですね。キートップ動かすくらいなら、10度くらいの動きに抑えればサーボでも結構早く動くよって教えてもらえました。

もしサーボ使うならと考えていた「両腕で動かすことで１個のサーボで２つのキーを」という案も快く採用してくれ試作してくれました。
![DSC_2302.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211331/97fad32e-bd8c-847f-1947-095d69ab5364.jpeg)


#### (4) メカ系の人と組むこと
[本町デジもく会（もくもく会）](https://dezimoku.connpass.com/ "本町デジもく会")で知り合ったナッキィーさんとはお互い常連ですが、一緒に組んで何かをしたことはありませんでした。

組むと決まったときに、私はソフトの事わからないよって言われていたのですが、Arduino IDE 使ったこと位はあると聞いてたので、何とかなるかなと思っていましたが甘い考えでした。

確かに専門外の知識をお互いに持っているだけあって、しかも完全リモートでやり取りしていたので、誤解は多くわからなくなるたびに Zoom でモノを映しながらの開発でした。

例えば、私の方からソフトを渡して試してくださいといっても、「よくわからないけど・動かない」という連絡しか来ない感じですね。常にヒヤリングして、順序だって確認しないと前に進まない感じです。

もちろんメカのことでは、作業手順、考え方や、工数感覚等は私には想像できないことも多いので、お互い様なのですが。

組み込みをやっていると普段は、ハード屋さんとやり取りすることは多く慣れているんですが、これはこれでなかなかいい経験になりました。

#### (5) 最初の地雷は、購入した基板が壊れていたこと
地雷踏み体質の私なんで、よく購入品が不良品で交換なんてことはよくあるんですが、今回は多チャンネルサーボドライバ基板。

モータ二次側の電圧が全く出てきません。

なので、こちらではオシロスコープで波形が動くのを確認して、後はソフトを渡して動くかどうか確かめてもらうっといった面倒くさいことが続きました。

最終的には、回路図を見てみると間に入っているのは保護用ダイオードだけとのことが判明し、バイパスジャンパーを飛ばすことで解決しましたが。
![DSC_2310.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211331/d1e8c123-0740-a531-047d-cb46f1bbbd10.jpeg)

#### (6) MQTT との闘い
組み込み屋であまりネット系強くないし、MQTT 存在は知ってるけど使ったことない感じでした、初挑戦です。リモート制御はこの作品の根幹となる技術なんですが…

そもそもブローカーはどこがいいのかってところ。
IBMクラウドとか Azure とか GCPとか大きいところからまず使い方を調べるところから。
ドキュメントがやたら多いし専門用語ばっかで使い方わからない。
特に 認証がどうだとかSSLとか証明書がとか言われるとマイコンレベルでどうにかできるのか疑問？ってなってくるし。
M5StackとかESP32とかでどうやって制御するのか分からず、結構調べるのに苦労した末に挫折しました。（時間をかければもう少し理解はできたのかもしれませんが）

shiftr.io との出会いは奇跡的でした。誰かが ESP32で使うならどのブローカーがいいかってSNSで相談していた回答をたまたま見かけて知りました。
Arduino-IDEサンプルも公開されているし使いかたもシンプルなのですが、何より助かったのは、Publish や Subcribe でパケットが飛ぶ様子を可視化してくれるところですね。デバッグに重宝しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211331/c258b802-cf78-1021-75a4-7866238b599d.png)

#### (7) 他にも初めての挑戦も多く
実は簡単に実装できた様に見えますが、色々と初めての挑戦がたくさんありました。
まぁ、動くまで完成してから暴走していろいろ手を広げた感じでしたが、
以下の通りです。
* Azure アカウントすら持っておらず。
* もちろん Azure Speech の音声認識サービス使ったこともなく
* 普段から Twitterあまり使わないのに、twitter API を使う羽目に
* 最終的には LINE messagingAPI まで手を出した
* 漢字交じりの日本語で来る音声認識した結果をローマ字まで逆変換する機能
* マウスもリモートで動かしてみたいと途中で脱線、メカナムホイールを初めて制御

自分にとっては、とてもいい勉強（経験）になりました。

#### (8) 実は、デバッグ・調整・設定機能がコードの大部分を占める
やり方が煩雑だと即わからないとの報告がすぐ来るので、色々と対策した結果、様々な調整・設定ツール類、デバッグコード、を作った結果、本当に必要なソフト部分の５倍強のコードが出来上がりました。注文もいっぱいあり、ソフト担当としては大変だったのですが、結果作ったから簡単に調整や設定がスムーズにできたのかと思っています。作ったのは主にこんな感じです。
* シリアル接続した PC から SSID やパスワードを設定して本体に書き込むツール
![DSC_2308.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211331/8dd5e1ce-75be-e291-79f2-c88bc3f5ab04.jpeg)

* M5Stack単体で各サーボチャンネルを個別に調整値±30度 をリアルタイムに調整できる機能
![DSC_2303.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211331/a9f20d37-379e-bb74-0f9b-1c5cdb912421.jpeg)

* 各サーボの状態を表示する機能
（左右どちらかに引っ張っているか、どちらも引っ張っていない状態か）
![M5StackPhoto_for_ProtoPedia.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211331/99f12228-35cb-b406-7149-acacb17e2409.jpeg)

* どのキーを何番のサーボに割り当てるかを決めるためのツール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211331/7cbcc475-fbb8-2df3-1747-0f273bb51825.png)


* 上記の各種設定・調整モードを呼び出すための階層メニュー

#### (9) GUGEN でつまづく！？
ヒーローズリーグ１週間前に、GUGENという別のコンテストがあり応募。

動画を作成するための週末土日の時間を確保して、いざZOOMのリモートで撮影という直前、電源の逆差しで基板が燃えたとの悲報が届きます。
２個あるうちの１つのサーボドライバーが、うんともすんとも言わなくなります。すぐにポチったらしいのですが到着は月曜日。
２０チャンネルで４０個のうち、１６チャンネルで３２キーしか動かなくなりました。
あと４チャンネルのサーボを M5Stack の本体側の端子からサーボ制御信号を出して何とかしようとして、大失敗します。
時間を使い切って結局動かないという状況にorz 
二つめの地雷はまたまたサーボドライバ。
M5Stack本体で PWM制御信号を出すとタイマ周りの動きが怪しくなるのか、他の機能が挙動不審になります（詳しくは未調査ですが）。
結局平日に撮影し、締切日の仕事終わってからの数時間でほとんど動画制作の時間が取れず。

応募後、改めて見直すと動画仕上がりも悪いし、掲載写真も地味で目立ちません。
なんかあかんやろなと思ったら案の定の結果でした。（知り合いがちょっと見てくれたかなくらいの反応でした）
でも、このときの失敗を反省したおかげで ヒーローズリーグの完成度があると思っています。

#### (10) 締切１週間前が勝負どころ？
GUGEN終わってから１週間ですが実質取れる時間は週末の２日間。で何が出来るか？
色々悩みながらも、出来てるところまでの動画を作りつつあったのですが、動画作りながら音声でも動かそうとふと思いつきました。
何故動かしたかったか？
「キーボードの役目を取って代わろうと現れた、新参者であるVUIに逆襲し、逆に役目を奪い取ってやるんだ。」という意味不明なシナリオで暴走は始まります。

とはいえ、Azureで音声認識を試してみると、お節介にもわざわざ漢字を返してくれます。
いやいや漢字じゃなくて。かなでいいんだよかなで (ﾟДﾟ;)
キーコードに変換するにはローマ字に変換しないとあかんし、面倒やから是非かなでお願いしますと願いましたが解決策はなさそう。結局漢字をよみがなに逆変換する方法を組み込む羽目に。

動画作るのにどっぷりハマるはずの土日の時間を、７割程度使ってしまいました。

#### (11) 作品写真が地味すぎた
GUGEN のときの反省点でもあるんですが、作品写真にサムネイル表示する写真の選択一つで悩みました。
動くキーボードって動いていない時の写真が地味すぎるんです。沢山並んでいるキーのいくつかが凹んでいても全然目立ちません。
静止画のままどうやったら目立つんだろうって、作品の目玉でもある裏を見せるのが一番ではりますが裏だけだと何のことかわからない。
と言うことで裏表を並べた写真をサムネイルにし、それだけでは弱いと感じたので、タイトルも過激に攻めている感を出すようにしました。
![MainPhoto_for_Protopedia.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211331/a6f3c293-1dcf-71e6-53b4-c7a0a5014e48.png)

それが功を奏したのか、結構目を引いたみたいです。Protopedia には閲覧数が出るのですが、ぐんぐん上がっていきました。ここだけは成功したかなと思います！

#### (12) オンライン予選の早い者勝ち定員にあぶれ落ち込む
そんなこんなで結局動画の微調整だの Protopedia に掲載する写真の差し替えだので締め切り当日の夕方までかかってしまい、それからエントリー。
もうここまで来たら、動画で伝えきれない想いは、発表の時に何とかしようと決めて応募準備。
で、ここでまた失敗発覚。

なんと、応募しようとしたら、オンライン予選の申し込みは定員に達したので締め切りましたと冷たいお言葉が T_T

とりあえず、応募は完了しましたがその後の２日くらいは最後にやらかした感がぬぐえず、相当凹みました。今年は失敗したか？と…

#### (13) 救いの知らせが届きだす
落込んで悶々としていると、少しずつ救いのお知らせが届きだし復活しました。
* オレトクリーグ
* VUI リーグ
の二つでオンライン決勝審査会へのお誘いが届きました。また、
* IoTリーグ
はオンラインで全部が審査対象なので、これも評価されるとの情報も

凹んでいた気持ちが一気に吹き飛び、また暴走が再開します。

#### (14) 皆に楽しんでもらいたい一心で！
やはり皆に楽しんでもらうのが一番というのはいつも感じているので、何とか楽しんでもらう方法を考えました。とはいえオンラインでは実物を見せれないし触ってももらえない。
こんな不利な状況でどうやったら楽しんでもらえるんだろうと思い悩み、リアルタイム体験ができないか考えました。

VUIリーグは マイクの音を直接取って音声入力でデモすれば何とかなりそうですが、オレトクリーグの方はどうしようかと悩みました。
なんせ、送信側のアプリはWindowsのアプリですし、Macの人は使えなかったり環境 によっては動かなかったりするので、そのままでは失敗すると直感で思っていました。

多くの人が馴染みもあって体験できる環境はSNS かな？と考え、LINE と Twitter が候補に挙がりました。
LINE はちょっとハードルが高そうだったのと、あらかじめ友達になっておかないといけないというところで失敗しかねないので、ちょっとリスク有りかなということで、Twitterに決まりました。 
特定ハッシュタグでつぶやいた発言をローマ字に変換して、それでキーボードが動くのを画面で見てもらう形で。

オレトクリーグ上位には食い込めませんでしたが、Tweetした言葉でリアルタイムにキーボードを動くのを見て沢山の人に体験して楽しんでもらえたようで何よりでした。
そのために頑張ったようなものでしたので。
![TwitterDemo2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211331/aef0a15b-58e3-f469-80e9-c77f0aae67dd.png)

#### (15) IoTリーグで勝利を
これはIoTリーグに申請した全作品を５時間近くかけて、作品紹介ページと動画をオンラインで審査していく形でした。気合い入れて最初から YouTube で他の全作品が審査されるのを見ながら、ひたすら番が来るのを待ちました。
いざ、順番が来た頃には最後の方だったので、審査員も疲れてきているし不利かなとちょっと心配していたのですが、今までの審査をやっているときと審査員の反応が全然違います。ひょっとしてと思いながらひたすら祈ってました。
で、決勝進出が決まった時は飛び上がるほどうれしかったですね。数日前に凹んでた事なんてどっか行っちゃいました。

#### (16) 次の週はVUIリーグの決勝
IoTリーグにて決勝進出は決まったものの、何故か全く気は抜けませんでした。
とにかく参加者に楽しんでもらわねばと。
こちらも音声入力でキーボードが動くリアルタイムデモをすることにしました。
ZOOMによる審査だったので、同時に多人数がしゃべると失敗するともおもったので、先着順で一人に体験してもらう形にしました。
プレゼンによる審査前に体験希望者を選出しておいて、デモの時に喋ってみてくださいという形でデモしました。
もちろん、こちらでの優勝は取れませんでしたが３位には入れました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211331/48875954-0e50-e61d-b600-7b8c1de389d1.png)

何よりもデモで楽しんでもらえたのが一番です。そのために頑張ったようなものでしたので。

#### (17) 最終決勝は作戦失敗！？
最終決勝はプレゼンではなく動画を流しての評価という事。
応募動画のブラッシュアップが必要とのことで、１週間かけて動画を作り直しました。
いままで、プレゼンで込めた思いも、動画に追加しつつ作品ページも更新しつつと時間に追われながらも、最後の決め手になるようなインパクトが欲しいと思いました。

作品ページの今後の展開の欄に「次はマウスも動かしたい」みたいなことを書いたところ、そこに反応してくださる人も何人かいた為、そこを隠し玉にしようと思いました。

新たに[「リモートdeマウスも暴動？」](https://protopedia.net/prototype/2108 "リモートdeマウスも暴動？")という作品ページを作って動画も作って、当日に公開してと結構時間を割いて仕込んで挑んだのですが、そこが仇になったようです。

そちらが目立ってしまって、肝心のキーボードの良さが伝わらなかった感が残る審査となってしまいました。完全な作戦失敗ですね最終審査で10位以内には入れたものの、優勝は逃してしましました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211331/fb525d8a-09d5-7e22-7622-7521000b6dca.png)

というより他の作品のインパクトがすごすぎたのかなと思います。このすごい作品達、タイトルも凄い。
やっぱりオンライン審査は難しいですね、空気の流れが見えないというか…

とはいえ、IoTリーグでの優勝で盛大に表彰はされとてもいい思い出になりました。
![DSC_2287.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211331/9534816f-ba0d-c71e-4d94-c4c84f975b6e.jpeg)

## まとめ

開発中に色々ありすぎて裏話もてんこ盛り。
つい書きすぎてしまいました。申し訳ありません。
まだまだ叩けばホコリが出てとネタは尽きませんがこのくらいにしておきます。
ここまで読んでいただきありがとうございました。

最後に、お世話になったコンテスト運営の皆さま、意味不明な作品の発表にも関わらず良い評価をしてくださった審査員の皆さま、作品の発表を楽しんで最後まで付き合ってくださった皆様、深く感謝申し上げます。

そして何より、協力者であるナッキィーさん。
恐らく参加者の中で最高齢であられる可能性が濃厚なのですが、ご老体に鞭打つかの如く私の暴走に付き合ってくれたことを深く感謝しております。
この場を借りてお礼申し上げます。

皆さま、本当にありがとうございました。