2019/06/09
ブレッドボード上で設計して動作テストまで行きます。wararyoです。
約一年前にこのような記事を投稿しました。
今回はこの記事の続編です。
今回はソフトウェアと電子回路を設計していきます。
もしあなたがDTM界隈の方なら、この記事の大半は意味がわからないかもしれません。
こんな界隈もあるんだと思いながらご覧ください。
目次
sponsored link
V-USBでUSBマウスを作ろう
USBマウスを作るにあたって、今回はAVRマイコンのATTiny85と、AVR用USBライブラリのV-USBを用います。
USBマウスはHIDデバイスの仲間なので、基本的には「V-USB HID」で検索すると出てくるソースと公式の回路図を参考にすれば作ることができます。
しかし一つだけ工夫しなければいけない点がありました。
横スクロール対応のHIDディスクリプタを作る
HIDディスクリプタとは、USB HIDデバイスがホストに対し「自分は何者なのか、何を送信して何を受信したいのか」を伝える自己紹介文のようなものです。
「私はキーボードです。キー情報を送信します。Caps LockがONかどうか教えて欲しいです」
「私はマウスとキーボードが合わさったデバイスです。左右移動とカーソル移動とキー情報を送信します」
みたいな感じです。
そして今回作るデバイスはこんなカンジにしたいですよね。
「私はマウスです。横ホイール回転を送信します」
ところが、(考えればわかる話ですが)
巷に溢れるUSBマウス用HIDディスクリプタのサンプルは縦スクロールばっかりです。
↓これは横スクロールできないUSBマウスのディスクリプタ
さらに、初期のUSB HIDの仕様には横スクロールが定義されておらず、
MicrosoftがWindows Vistaで初めて導入したようです。
参考: Enhanced Wheel Support in Windows
HIDディスクリプタにおいては、
縦スクロールホイールのことをWheel、
横スクロールホイールのことをAC Panと呼ぶようです。
↓これは横スクロール対応したUSBマウスのディスクリプタです。ついでにスムーススクロールにも対応しておきました。
しかし、果たして現在USB HIDの公式仕様の中にAC Panが含まれているのかは不明です。
あと、AppleはWindows Vistaが出る前から横スクロール対応マウス出してましたよね?
あれはどうしてたんでしょうか。未だ謎は残ったままです。
ロータリーエンコーダーの調理法
壁はもう一つあります。ロータリーエンコーダーです。
ロータリーエンコーダーとは、回転を電気信号として読むための部品です。
ロータリーエンコーダーについて詳しく知りたい方はこちらが参考になります。
マイコンでロータリーエンコーダーを扱う方法は大きく2つに分けられるようです。
- A相立ち上がり時に割り込んで回転が起こったことを検知、B相がHighかLowかで回転方向を見る
- A相とB相を定期的に読みに行き、前回読んだ値との違いで回転したかどうか判断する
前者より後者の方が解像度が高い(4倍)上にチャタリングにも強いですが、後者は速く回しすぎると不安定になります。
とりあえず両方実装してみました。どっちを採用するかは筐体が完成してから考えます。
これにてソフトウェアは一旦完成です。
なぜかツェナーダイオードは使えず
とりあえずブレッドボード上に回路を組んで、動作実験です。
あれ…動作しない…
そもそもUSBデバイスとして認識してくれませんね。
結論から言うと、ツェナーダイオードを使わずに回路全体を3.3Vで動作させることで解決しました。
どういうことかと言うと、そもそもUSBの電源電圧は5Vですが、データ線の電圧は3.3Vです。
よってどこかで電圧を下げる必要があるのですが、今まではツェナーダイオードを用いてデータ線の電圧だけ下げる方法を取っていました。
しかしそれではなぜ動作せず、回路全体の電圧を3.3Vに下げることで動作しました。
理由はわかりません…できればツェナーダイオードを使いたいところなんですが…
平滑しすぎには気をつけろ
ロータリーエンコーダーも動作がおかしいようでした。全部ダメじゃねえか!
こちらの原因は念のために挿しておいたコンデンサーでした。
チャタリングを防ぐお守りとしてコンデンサーで平滑していたんですが、平滑しすぎて回転が取れていなかったみたいです。
これのせいで1日溶かしました。あぁ…
KiCadで設計
回路のテストも終わったので、KiCadで実際に組む回路を設計します。
といっても、プリント基板にするわけではなく、ユニバーサル基板で手ハンダ実装です。
前回軽く紹介した画像から少し変更を加えています。
こんな感じになりました
ブレッドボード上の配線を整理して動作実験。上手くできました!
次回予告
Fusion 360で筐体を作ります。実際に制作し始めるのはもうちょっと先です。