ロボットアーム操作画面のUI改善(レベル1)

障害者利用想定のIoTロボットアームを開発しています。スマホで遠隔操作可能なロボットアームです。しかし、スマホの操作画面が使いにくかったので、段階的に改修していきます。

てまりを渡すロボットアーム

Obnizを使ったロボットアームです。てまりを手渡ししてくれました。

スマホからインターネットを経由して、ロボットアームを操作。zoomと併用して、遠隔地で操作することもできます。

操作画面の改修

前回とりあえず作った操作画面は、4つのスライダーがあり、どこをどう操作すればよいか、直感的ではありません。

UI改善のため、スライダーを2つ減らしました。

入力項目は少ないほど、迷わず使えます。

手首関節の操作を減らす

どんな作業をするかにもよりますが、てまりを掴む作業であれば、ロボットアームの手首関節は、ほぼ使いません。

おそらく手首関節は、傾けてはいけないものを持つとき、常に水平を保つ役割で使います。

アームを上げたとき、手首を直角にして水平を保ち・・・

アームを下げたときは手首を水平にします。写真だと調整できておらず、水平を保っていません。

水の入ったコップを掴むような作業の時は、しっかり調整してください。

アームの上下運動と、手首の上下運動を連動させることで、入力操作は一つ減りました。

掴むのはボタンでいい

掴む動作はスライダーからボタンに変更しました。

繊細な作業を行わない場合、掴む⇔離すを交互に切り替えるボタンにしたほうが簡単です。

改修したコード

操作画面とObniz制御のコードです。

※サーボモーターをどの角度で組み立てたかにより、angleに入れる数字は変わります。

今回のUI改善は、実は最低限使える程度にしか、良くなっていません。

次回、さらにUIを改善して、スライダーもボタンもなくします

IoTロボットアームをスマホで操作する

組み立てたIoTロボットアーム(ネット経由で動くアーム)をスマホで操作できるようにします。操作画面のUIを変えないと、まだ使い勝手が悪いです。

てまりを掴むロボットアーム

操作している様子です。てまりを掴んでみましょう。

アームの旋回、アームの上下、手首の上下、掴む離す、計4か所のサーボモーターをスマホで制御しています。

操作画面のUI(仮)

スマホの操作画面です。ブラウザで動きます。

4つのスライダーで、ロボットアームのサーボモーターを操作します。

ただ、このUIはどう考えても直感的ではないので、後で作りなおします。

ロボットアームの配線

ロボットアームにはObnizを利用しています。

サーボモーターとObnizボードの配線は、下記となります。

servo1(旋回)・・・gnd:0,vcc:1,signal:2
servo2(上下)・・・gnd:3,vcc:4,signal:5
servo3(手首)・・・gnd:6,vcc:7,signal:8
servo4(掴み)・・・gnd:9,vcc:10,signal:11

アーム動作と操作画面のコード

zoomと併用で遠隔操作可能

てまりを掴むIoTロボットアームができました。

zoomなどと併用して、離れた場所からアームを動かすこともできます。

次回、操作画面UIを改修します

IoTロボットアームの組み立て

障害者利用想定で、インターネット経由で動かせるロボットアームを作っています。組み立ては長男(小4)にお願いしました。制御するマイコンボードを変えて、インターネットで動くIoTロボットアームとします。

SunFounder ロボットアームキット

あまり評価のよくない「SunFounder ロボットアームキット」という商品をAmazonで購入。

コメントを見ると、Arduinoのセットアップが難しそうですが、私は使わないので大丈夫です。

IoTが簡単に実現できる「obnizボード」に取り換えます。

組み立ては長男の得意分野

ロボットアームを組み立てます。

私は組み立てが苦手です。説明書をよく読まず、パーツを破損してしまいます。

こういった組み立ては、長男が得意なのでお願いしました。

やはり、パーツの歪みがあって組み立てにくいそうです。

それでも手際よく、組み立ててくれます。

インターネットで操作できるボードに

組み立て完了。

付属のArduinoは重りがわりに搭載しています。

Arduinoは使ってなく、インターネットで簡単にアームが操作できるよう、Obnizボードに配線をつなぎ替えました。

引き続き、操作画面設計とプログラミングを行います。

4K360度VRでも見えている解像度は低い

高解像度・高品質のディスプレイを持つiPhone12 Pro。このスペックを生かして、VRを体験したくなりました。現実と見間違うような高い没入感を期待しましたが・・・まだ配信側のコンテンツや設備が整っていませんでした。

Super Retina XDR ディスプレイを生かしたい

iPhone12 は「Super Retina XDR ディスプレイ」という、壮大な名前が付いたディスプレイを搭載しています。

このディスプレイの映像表現力を生かしたい。そこで、思いついたのはVR。

VRゴーグルを使って、現実と見間違うほどの没入感を体験したいと思います。

ダイソーで買ったVRゴーグル

ダイソーの500円VRゴーグルを使います。

ここにはお金をかけませんが、きっと大丈夫でしょう。

iPhone12 Proの6.1インチサイズは、ケース付でもダイソーのVRゴーグルに格納できました。

映像解像度が低い?

YouTubeアプリで、てきとうな4KVRを体感してみました。

第一印象、解像度が低い・・・。

4Kの360度映像を閲覧しても、見える部分は1Kもないかもしれません。

360度見えない部分の映像も含め、合計で4Kなので、解像度が低く見えるのも当たり前です。

期待値が高かった分、少し残念。これは現状、仕方ないですね。

今後5G普及で、超高解像度VRが気軽に体験できることを期待します。

ガソリンスタンドのユニバーサルデザイン

ガソリンスタンドで軽自動車に軽油を入れる間違いは起こります。そのため、軽油のノズルだけ違う場所にして、「軽自動車への給油は行わないでください」と注意書きがあると、とても親切です。

軽油はディーゼル車専用燃料です

家の車の不調で、代車の軽自動車を借りています。

妻にとっては初めての軽自動車で、危うく軽自動車に軽油を入れそうになりました。

たしかに、紛らわしいですね。

間違って軽自動車に軽油を入れるとエンジンが停止して走らなくなります。

ここのガソリンスタンド分かりやすい!

あるガソリンスタンドに寄ったとき、妻が「分かりやすい!」と絶賛しました。

そこのガソリンスタンドは、軽油ノズルが離れた場所にあり、「<注意>軽油はディーゼル車専用燃料です 軽自動車への給油は行わないでください」と書かれていました。

たしかに言われてみれば、普段使うガソリンスタンドは、軽油ノズルも他のノズルも等間隔で置かれていた気がします。

間違いやすい軽油を離して注意を促すのは、軽自動車に乗り慣れない人にやさしい気遣いです。

ユニバーサルデザインだと感じました。

防犯カメラの命綱3Dプリント

防犯カメラ「Litmor Battery Cam 2」をベランダから吊るしています。転落の心配があるのでもう一本、転落防止のひもを付けられるようにします。

ひもでぶら下げられる防犯カメラ

Amazonで購入できる「Litmor Battery Cam 2」。

丸い防犯カメラで、ひもで吊るすことができます。

念のため、ひもが切れても大丈夫なように、もう一本命綱をつけることにしました。

カメラネジのストラップ

「Litmor Battery Cam 2」には、カメラ用の1/4ネジを差し込むこともできます。

1/4ネジ付きストラップを購入しても良いですが、今回は手元に1/4ネジと100円ショップのネックストラップがあるので、これらを使います。

ネジとストラップのジョイント

1/4ネジとストラップを接続するジョイントをモデリングします。

断面はこんな感じです。

フィラメントはTPUで3Dプリントします。

3Dプリントしたジョイントにネジをはめます。一度はめるとネジのかさが引っ掛かって、もう指では外れません。

ジョイントに100円ショップで購入したストラップを付けます。

カメラの充電を考えると、脱着が簡単なタイプが良いと思います。

命綱を防犯カメラに装着

防犯カメラの1/4ネジに、作ったジョイントを差し込みます。

しっかりカメラをぶら下げられます。

ひもで吊るした防犯カメラに、命綱が装着されました。

これで転落の心配が、大きく減りました。

メインコンテンツにスキップ アクセシビリティ

Webサイトをキーボード操作するユーザーのために、ページの先頭には「メインコンテンツにスキップ」のリンクを設けたほうが良いでしょう。

ブロックスキップを理解する

Webコンテンツアクセシビリティガイドライン(WCAG2.1)の達成基準 2.4.1に、「ブロックスキップを理解する」という項目があります。

ページ先頭にメイン記事へスキップするリンクがないと、利用者にとって深刻な肉体的苦痛を引き起こすことがある・・・というようなことが書いてあります。

どういうことか?

報道機関のホームページが実例に挙げられています。実際に海外の報道機関のホームページを見てみましょう。

公共放送のブロックスキップ

イギリス「BBC」

世界的に有名なイギリスの公共放送「BBC」のホームページで、キーボード操作をしてみます。

早速「Skip to content」というスキップするリンクが出現しました。

さすが世界のBBC。

アメリカ「PBS」

続いてアメリカの公共放送「PBS」。こちらもキーボード操作で「Skip to Main Content」の文字が出現。

アクセシビリティが作り込まれています。

スウェーデン「SVT」

福祉大国のイメージが強い北欧スウェーデン。公共放送「SVT」を見てみます。

文字は読めませんが、やはりスキップするリンクが仕込まれていました。

いくつか報道機関のサイトを回ってみると、アクセシビリティを大事している機関が多いことが分かります。

インフラサイトのブロックスキップ

続いて誰もが生活に欠かせなくなっているインフラサイトのブロックスキップを見てみます。

Google

Google先生。キーボード操作で「メインコンテンツにスキップ」が表示されます。

Amazon

Amazon。こちらもキーボード操作で「メインコンテンツにスキップ」が表示されます。

インフラサイトは見えないアクセシビリティ機能も、しっかり作り込んでいます。

ブロックスキップの実装方法

実装コードの一例です。

ヘッダーに「メインコンテンツにスキップ」のページ内リンクを設置します。

普段は見えない状態にして、キーボードのフォーカスが当たった時だけ出現するようにCSSで指定します。

サンプルページもアップしました。

参考まで。

aタグの中にaタグ アクセシビリティ観点で

HTMLのコーディングで、aタグの中にaタグを書くことはできません。どうしてもaタグの中にリンクを書く場合、spanタグで書き、onClickとonKeydownとtabindexを指定します。

検証に使ったテストページはこちら

aタグの中にaタグは書けない

aタグはHTML5の仕様上、aタグなどの対話型コンテンツを内包できません。

例えば図1のカードのようなUIで、カード自体がリンクになっているのに、さらにリンクを内包させる場合、問題になります。

図1 リンクを内包するカード

実際にaタグの中に、aを書いてみましょう。

結果は図2のように、表示崩れを起こします。

図2 aタグの中にaタグ

aタグの中にonClick

aタグの中にaタグが使えないなら、spanタグに変えてしまい、その上でJavaScriptのonClickイベントを指定してみます。

HTMLの構造的には問題ないため、図3のように望む形で表示されます。

図3 aタグの中にonClick

しかし、この組み方だとアクセシビリティで問題があります。

キーボード操作でaタグの中のリンクにフォーカスを当てることができません。

キーボードしか操作できないユーザーが、リンク先にアクセスできなくなってしまいます。

aタグの中にonClickとonKeydownとtabindex

アクセシビリティ確保のため、onKeydownとtabindexを記述します。

コード量が増えてしまいました。

まず、「tabindex=”0″」で、キーボードのTab操作時に、フォーカスされるようにします。

tabindexは値が”0″の時、表示順でフォーカスされるようになります。

上記のコードの場合、一番上のaタグにフォーカスされた後、3行目のspanタグがフォーカスされます。

さらに、onkeydownで「Enter(kyeCode=13)」キーが押しこまれたとき、指定のリンクに飛ぶようにしました。

HTML自体はほぼ変わっていないため、表示は図4のように正常です。

図4 aタグの中にonClickとonKeydownとtabindex

読み上げは少し惜しい

スクリーンリーダー(NVDA)で読み上げたとき、正常に使えるかも試しました。

すると一点だけ、惜しいところがありました。

リンクフォーカスや、ページ遷移に問題はないのですが、既読リンクかどうかを正しく判定できません。

aタグの中のspanタグがフォーカスされている時、spanタグのリンク(JavaScriptで指定)の訪問履歴ではなく、aタグの訪問履歴を参照して、既読リンクかどうかを読み上げます。

やはり、根本的にはaタグの中に別のリンクを指定しないことが理想です。

システム都合やクライアント都合など、避けられないこともあると思うので、対処法として参考になればと思います。

修理したUSBケーブルで充電テスト

腐食したUSBケーブルを切断し、新しいものに交換しました。久しぶりの晴天で、絶好のテスト日和。無事、ソーラーパネルから充電できることを確認しました。

トランシーバーで充電テスト

せっかくの晴天ですが、スマホはフル充電状態です。テストする端末が手元にありません。

探してみると、バッテリー残量0のトランシーバーがありました。

これで充電確認をします。

電圧は異状なし

電圧・連流チェッカーで充電状況を確認します。

正常に5Vくらいの電圧がかかっているのは確認できました。

肝心の電流が計測できず・・・チェッカーのUSB端子の接触が問題のような気がします。

チェッカーを挟まず直接充電すると、電流は流れているようです。

フル充電完了

トランシーバーを4時間放置していたら、充電はいっぱいになっていました。

このトランシーバー、仕様書を見てもバッテリー容量が不明。

いったい何ワットで充電しているか、結局よく分かりません。

しかし、USBケーブルを修理して、問題なくソーラーパネルが使えるようになったとは、言えそうです。

腐食防止にUSBキャップを3Dプリント

野外に置いていたソーラーパネルのUSB端子が腐食しました。新しいUSBケーブルに付け替え、今度は同じ過ちを繰り返さぬよう、3Dプリンターでキャップを作りました。

USBキャップは3Dプリント向き

同じマイクロUSB端子でも、付け根の部分はケーブルごとに形が違います。

自分のケーブルの形状に合わせて、キャップをモデリングしました。

オリジナルの形状が必要な時、3Dプリンターが活躍します。

キャップはゴムのようなTPU素材でプリントします。

紛失防止ベルト付きUSBキャップ

絶対にキャップを無くしそうなので、紛失防止ベルトを付けました。

キャップをかぶせた状態です。

これで、野外に置いても腐食を防げるでしょう。