レトロでハードな物語

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

小型のジョイスティックを使ったカジェットを作りたい (その1)

2023年11月08日 | 電子工作

秋月電子で購入した小型のアナログジョイスティックAE-JY-DIP(KIT)。

本体サイズが17.5mm×17.5mmでDIP化キットで250円でした。指先でスライドさせるようにして動かします。結構スムーズに動いて使いやすいジョイスティックです。
店舗で見かけて衝動買いしたのですが、せっかくなので何かに利用したくなりました。

そこでゲームとか自作アプリを動かす小型のカジェットを作って組み込もうと考えました。これをベースにしてみようと思います。
このTinyjoypadは回路が簡単なので以前にブレッドボードで組んだことがあります。でもそのときは方向キーをスイッチボタンにしていたため操作性が悪く、ゲームを一通り遊んだだけで終わってしまいました。今回のジョイスティックを使えば操作性が良さそうなのでゲームも快適に遊べるはずです。

Tinyjoypadで使用しているマイコンはattiny85です。

非常に小さくて省電力に優れているので小型のガジェットを作るには最適なのですが、メモリが少なくあまり大きなプログラムは入りません。また、端子も少ないのでボタンを増やすとかディスプレイを変えるとか、なにか拡張したくなったときにちょっと不便です。

そのためもっと高機能なマイコンにしたいと思い、普段メインで使用しているGR-COTTONを使うことにしました。attiny85に比べるとだいぶかさばりますが、省電力機能も充実していてコイン電池ホルダーも標準装備です。RTCも搭載しているので時計としても利用でき、手持ちのマイコンの中では持ち運べるガジェットに最適です。attiny85向けのスケッチを移植するのも難しくはないでしょう。

さっそくアナログジョイスティックの動作確認をしたいところですが、その前にディスプレイをつなげないことには話になりません。
TinyjoypadはI2C接続のSSD1306を使ったOLEDを利用するのですが、I2CよりSPIの方が高速という話も聞きますし、OLEDよりはバックライト無しのLCDの方が省電力に優れているし、どのディスプレイを使うか迷います。

そこで実際にOLEDやLCDディスプレイをGR-COTTONにつないで検討してみようと思います。

比較するのは昔Amazonで購入したSSD1306 OLEDディスプレイ(128x64)2種類と秋月電子通商で購入したグラフィックLCD AQM1248A(128x48)です。

AQM1248Aは縦方向の表示が48ドットとOLEDより16ドット小さくなっていますが、描画用のRAMは132x64の容量があります。RAMの表示開始行を指定できるので、縦方向にスクロールさせれば128x64の範囲を見せることは可能です。
ディスプレイの接続方式は、AQM1248AがSPIでSSD1306はSPIとI2Cの2種類です。I2Cに比べてSPIがどれだけ高速に表示できるのか実際に目で見て確認したいと思います。

これらのディスプレイのライブラリはすでにありますが、汎用的な物より自分で必要な機能だけを実装した方がメモリ使用量やスピードが有利になるので自作することにしました。文字と画像を表示する最低限の機能だけ作ります。文字表示のためのフォントは8x8ドットでASCIIキャラクターにカタカナとかな文字と記号を加えた256文字にしました。フォント形状は、美咲ゴシック第2フォント(PNG形式)から抜粋したものを利用します。

AQM1248Aは付属の説明書を読めば利用方法は大体分かります。SSD1306はコマンドも多くちょっと複雑な印象でしたが、頻繁に使用するコマンドはそれほど無いので使い方はネットで調べればすぐに分かります。

ということで今回作成したスケッチはこちらになります。(クリックしてウィンドウが開いたら右上のダウンロードボタンを押してください)

SSD1306 128x64 I2C

SSD1306 128x64 SPI

AQM1248A 128x48 SPI

これ以外にSSD1306 128x32のディスプレイも持っているので、おまけで作成してみました。

SSD1306 128x32 I2C

配線は次のようにしました。

SSD1306 SPI - GR-COTTON
D0  - 13
D1  - 11
RES -  6
DC  -  9
CS  - 10

AQM1248A - GR-COTTON
CS    - 10
RESET - 必要なし
RS    - 9
SCLK  - 13
SDI   - 11

I2Cは接続端子が決まっているので省略します。

どのスケッチもデータ送信部分以外はほぼ同です。ただし、AQM1248Aはスクロールして128x48の範囲を表示できるように表示開始ラインを指定するルーチンを追加してあります。
文字の表示は8x8ドットだけでは小さくて見づらいこともあるので、縦横2倍に拡大する機能も付けました。

それと今回はAQM1248AとSSD1306とでグラフィックのビットマップデータが反転しています。AQM1248Aはビットが1ならドットを表示、0なら表示しません。SSD1306は1なら白、0なら黒になります。今回SSD1306の文字表示は黒字に白い文字を表示しているのでフォントのビットマップデータは共通となりますが、画像データは白地に黒で表示するのでSSD1306とAQM1248Aとではビットが反転します。(どのディスプレイもドットを反転表示する機能はあります)

ちなみにCR-COTTON開発ソフトのIDE for GRのスケッチはArduino IDEと互換性があるので、ピン番号を変更すればArduino対応のマイコンでほぼそのまま利用できると思います。

これらのスケッチで文字や画像を表示してみました。

OLEDはとても明るいので輝度は最低に設定してあります。でも、これでも十分に明るいですね。輝度を下げると使用電流も少なくなります。LCDはパックライトがないので暗いところでは見えません。
画面書き換えについてですが、確かにSPIとI2Cでは描画スピードに差があります。I2Cは書き換えている様子が一瞬見えるのですが、SPIでは瞬時に画面が変わります。同じSPI通信のOLEDとLCDでは書き換えスピードに差があるように見えませんでした。というか高速なので目視では分かりませんでした。ただ、LCDの方は書き換え時に少し残像が残る感じです。やはり視認性は圧倒的にOLEDの方が上です。
でも消費電流はLCDの方がOLEDの1/10くらい(たぶん)なので、コイン電池で動作させるときには捨てがたい面もあります。どちらにしろSPI接続のディスプレイの方が良さそうですね。

続いてアナログジョイスティックをつないでTinyjoypadのゲームを動かしてみたいと思いますが、ゲームプログラムの移植作業が必要なのでまた次回に。



最新の画像もっと見る

コメントを投稿