レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

ATtiny85搭載の超小型マイコンを使ってみた その3

2019年01月10日 | 電子工作

前年度より弄っているATtiny85搭載のDigisparkですが、最近になって癖というか特徴のようなものが少しずつ分かってきました。

引き続きDigisparkとPro Miniの組み合わせでUSBキーボードやジョイスティックライブラリを試していたのですが、頻繁にPCからUSBデバイスが認識されなくなる現象が発生していました。初めは原因がよく分からずお手上げ状態でしたが、色々試している内にPCの方からUSBの接続を切られているらしいことが分かってきました。
ネットの情報やライブラリヘッダのコメントなどを見てみると、どうやら一定時間DigisparkとPC間の通信が途絶えるとPCからデバイスが外されたとみなされてしまうようです。それがどのくらいの時間なのか分かりませんでしたが、わりと短い時間であることは確かです。そのためキーボードやジョイスティックライブラリのヘッダファイルには、delay()は使わずにDigiKeyboard.delay()やDigiJoystick.delay()を使うようなことがコメントされていました。

DigisparkのUSBデバイスの機能はソフトウェアで実装されているので(USB1.1の機能を実現するV-USBというソフトウェアらしい)、delay()や他の重い処理を実行しているとUSB通信に影響が出てPCに接続を切られることがあるようです。

ある程度原因が分かってきたのでDigisparkに負荷をかけないように気を付けてスケッチを書けば、Pro Miniとの安定した連携動作も出来そうです。

さっそく前回もチャレンジしたテンキーのスケッチを一から書き直してみました。DigisparkとPro Miniの通信部分は処理を軽くしたいので独自に作成し、送るデータも最小限にすることにしました。
ところが、なかなか思うように動作しません。通信データを取りこぼさないように外部割り込みは使わなければならなかったのですが、Pro Mini側で割り込みを受け付けるようなスケッチにするとどうしても安定動作させることが出来ないのです。また、キーボードライブラリなどの使い方によってもPCから切断されてしまうことがあったりしてうまく行きません。

そこで負荷を懸念して避けていたのですが、Digispark側で外部割り込みを受け付けるようにしてみました。すると何故かこれがうまく動作したのです。理由はよく分かりません。とりあえずこのスケッチを元に細部を調整して最終的に作成したスケッチがこちらです。

DigisparkTenkeyServer.ino Digispark用
DigisparkTenkeyClient.ino Pro Mini用

Digisparkピン → Pro Miniピン
0   → 2
2   → 3
VCC → VCC
GND → GND

Digisparkの2ピンは外部割り込みで使用するので変更しないで下さい。



今回使用したテンキーはいつもArduinoのテストに利用しているマトリックス配線を引き出したMACテンキーで、12本ものピンを使用します。DigisparkTenkeyClient.inoのテンキー処理部分はこのハード独自のものなので参考になる部分はあまりないでしょう。
Pro Miniからのデータ送信を行っているのはこのスケッチ内のsendCode()で、ここでテンキーボタンに勝手につけた番号1〜23をDigisparkに送ります。プロトコルは単純で、押されたキーの番号をCLOCKのタイミングで1ビットずつDATAから送るようになっています。Pro MiniがDATAにビットをのせてCLOCKをLOWにしたら、Digisparkは外部割り込みでCLOCKのLOWを検知しDATAのビットを読み取ります。キー番号は23までしかないので、送るデータは5ビットで済みます。

setup()中のDigispark動作確認の処理は、起動時にビットの読み取り位置がずれることがあったので追加しました。この処理でビットずれを完全に抑止できているのか確信はありませんが、今のところうまく動作してくれているようです。

Pro Miniから送られるキー番号は、Digisparkの外部割り込みを使ってDigisparkTenkeyServer.inoのreceiveData()で読み取ります。データを取りこぼさないように、5ビットのデータを読み込んだら一旦バッファに入力します。loop()内でバッファを見て、データがあればその番号に対して自分で定義したキーデータをPCに送ります。
Digisparkキーボードライブラリは英語キーボードのみ扱っているので一部の記号は文字化けします。そこで文字化けする記号は予め日本語キーボードの対応する記号に変換しておく必要があります。

今回作成したスケッチはキーリピートが実装されていないなど完全なテンキー動作とはなっていませんが、十分実用になると思います。ちょっと気になるのUSB接続をした後、PCに認識されるまで少し時間がかかることです。まあ、個人的には許容範囲ですけど。

キーボードライブラリがうまく動作したので、ジョイスティックライブラリのスケッチも書いてみました。使用するのは前回も試したスイッチ配線を取り出した(多分ファミコン互換機の)ゲームパッドです。



スケッチはこちら。

DigisparkJoypadServer.ino Digispark用
DigisparkJoypadClient.ino Pro Mini用

使用するピンは上記テンキーと同じです。

このゲームパッドは基板のパターンをカットして10個のボタンとGNDの配線を引き出したもので、11本のピンを使用します。スケッチは使用するライブラリがジョイスティックになっただけで、テンキーのときと同じような処理になっています。

実際に使用してみると若干レスポンスが悪いような気がします。ジョイスティックの軸やボタンの設定を個別に行うよりは、このスケッチのように全ての設定を一括に行うほうがレスポンスがいい感じなのですが、まだジョイスティックライブラリの使い方にひと工夫必要なのかもしれません。
これもUSB接続をした後、PCに認識されるまで少し時間がかかるのはキーボードライブラリのときと同じです。

ところでDigisparkにスケッチを書き込む際に60秒以内にUSBポートに差し込むように指示されますが、急いで差すと大抵は書き込みに失敗します。20〜30秒待ってから差し込めばほぼ問題なく書き込めます。何故でしょう??
これはUbuntuで書き込む場合のみの問題かもしれませんが、ちょっと煩わしいですね。

Digisparkはサンプルスケッチを見るとキーボードやジョイスティック以外にも様々なデバイスを扱えるようでなかなか面白いマイコンです。値段も300円ほどと安いので気軽に色々なデバイスをつなげて遊べますね。



最新の画像もっと見る

コメントを投稿