virt_flyのブログ -27ページ目

virt_flyのブログ

フライトシミュレーターソフトのFlightGearで仮想飛行を楽しむブログです。

↑ブレッドボードで作ったTinyJoypad インベーダーゲームに不要な上下移動キーは未完成状態。

 

人気のTinyJoypadをつくる

 

 今まで通りではつくれないTinyJoypad

 

以前、光るアクリル板にかえて透過ディスプレイにすれば、いっそのことカラー化もできていいんじゃないかと、まじでネット検索したことがありました。その際に出会ったのが「Mira&Luna’s nursery lab」という姉妹によるサイト。そこで初めてATtiny85自体とATtiny85を使ったミニゲーム機TinyJoyPadのことを知ったものでした。

 

今回、ATtiny85を使って今すぐにでもできそうなものは何かと考えたとき、思い浮かんだのは電子オルゴールの他にミニゲーム機がありました。

 

これが、少々甘かった。

 

 

本家がダメでも別サイトのゲームプログラムをDLすればよい

 

↑TinyJoypadののサイト いくつものゲームがあるのだが、簡単には楽しめなくなった

 

ゲーム機づくりを、いざ試してみようと思ったところでびっくり。あろうことか開発者のDaniel ChampagneさんのサイトTinyjoypad.comを訪れると、ゲーム機のディスプレイに必要なライブラリがソースコードには含まれず、自分でhファイルをつくれ、と書かれているではありませんか。

 

そんなの聞いてなかったよ、と泣き言を口にしつつ、とても自分ではhファイルは書けないので、ネットでTinyJoypadを扱った新しい記事に解決法を求めることにしました。

 

何とうれしや、この間ATtiny85のArduino化で勉強させてもらっていた東京バードさんのサイト「ぶらりweb走り書き」に解決法が書かれていました。

 

↑すぐ使えるTinyJoypad用のゲームが公開されていてありがたいGitHubの「gametiny」

 

TinyJoypad用にうまく修正されたゲームデータがGitHubに公開されているというのです。GitHubの「gametiny」には、すべてではないにしても、おおくのゲームのファイルが掲載されています。ラッキー!

 

 

●指定の抵抗器がなくても代用ができる

 

喜びもつかの間、問題はそれだけではありませんでした。次に判明したのがTinyJoypadづくりに指定された抵抗器が、10KΩ以外は手元に揃っていないことでした。OLEDディスプレイや圧電ブザー、タクトスイッチも5個以上手持ちがあるというのに…。

 

TinyJoypadの作製に必要なパーツ一覧

・ATtiny85

・0.96インチOLEDディスプレイ(124×64 I2Cタイプ SSD1306)

・タクトスイッチ 5個

・圧電ブザー

・抵抗 10KΩ1個、22KΩ2個、33KΩ2個、88KΩ(または91KΩ)2個

・他 電源スイッチやジャンパー線

 

 

↑TinyJoypadの回路図 10KΩ、22KΩ、33KΩ 、88KΩ(または91KΩ)の抵抗を使い分圧

 

DanielさんのTinyJoipadでは、8ピンしかないATtiny85のピンの不足を補うために、抵抗を使って電圧を違えてどのタクトスイッチが使われたかがわかるようにされています。「抵抗分圧」(電源の電圧が、直列接続された 各抵抗の大きさに比例して分圧される)という現象の応用だそうです。

 

ぞれだけ重要な抵抗ですから、揃っていた方が良いに決まっていますが、異なる値の抵抗で代用する方法があることもわかりました。Kazuさんの「Kazuの模型部屋」の記事によれば、その際プログラムの条件分岐部分の変数の値をあらたな電圧に対応したものに変えてやればいいということになります。

 

Kazuさんの回路図では、抵抗は88KΩを20KΩに、他はすべて10KΩに置き換え、20KΩも10KΩを直列につなぐことでまかなわれていますから、これなら無駄な抵抗のパック買いをいくつもせずとも回路が組めます。

 

やったね!ということで、さっそくブレッドボード上に回路を組み立てたのが冒頭の写真です。この写真では、目標とするインベーダーゲームを動かすのに不要な上下移動キー部分についてはキーのみで抵抗は付けておらず未完成な状態です。

 

なお、違う抵抗値で代用することは、先にふれたようにプログラムの書き換えがゲームごとに必要になりますから、指定の抵抗を揃えた方が無難でしょう。

 

 

 ATtiny85にゲームプログラムを書き込むまでの手順

 

それでは、マイコンチップATtiny85にゲームプログラムを書き込むまでの手順を記します。ATtiny85への書き込みも慣れてきましたので、簡略化します。

 

 

●前提

 

①パソコンへのArduino IDEのインストール

 

②WindowsへのAVRプログラマーUSBaspのドライバーのインストール(ATtiny85への書き込みにUSBaspの使用を前提)

 

③Arduino IDEへのATtiny85用のボードパッケージのインストール

 

以上の3点は、すでにインストールされているものとします。

 

詳しくは、ATtiny85(1)ーArduino化ATtiny85(2)―スケッチの書き込みと実行 を参照。

 

 

●手順の実際

 

①ゲームプログラムのダウンロード

ブラウザでGitHubの「gametiny」を開き、[Code]をクリック

→[Local]タブのなかの[Download Zip]をクリックすれば、一括してゲームプログラムがダウンロードできます。

 

②解凍したファイルからArduino IDFを起動

ダウンロードしたgametiny-master.zipを解凍

→あたらしくできたgametiny-masterの中から、目的のゲームプログラムフォルダ(ここではTiny_space_invaders)を開き、inoファイル(Tiny_space_invaders.ino)をダブルクリック

→目的のゲームファイルを開いたArduino IDEが起動します。

 

③ボード、ポート、Chip、Clock source、書き込み装置の選択

 

 

Arduino IDEのメニューにある[ツール]を選択し、ドロップダウンメニューを開きます。

→[ボード]は[Attiny25/45/85(No bootloader)]を指定

→[ポート]を指定

→[Chip]は[ATtiny85]

→[Clock Source]には[16MHz(PLL)]

→[書き込み装置]を[USBasp(ATTinyCore]と指定します。

 

④ブートローダーのインストール

Arduino IDEのメニューにある[ツール]を選択し、ドロップダウンメニューを開きます。

→[ブートローダを書き込む]をクリックしてブートローダーをATtiny85に書き込みます。

 

⑤グラフィックライブラリーのダウンロード

 

 

0.96インチOLEDディスプレイ(Ī2Cタイプ SDD1306)用のライブライリーは、GitHub - Defragster/ssd1306xledからダウンロードします。

 

⑥Arduino IDEへのグラフィックライブラリーのインストール

 

 

ライブラリーのインストールには、ダウンロードしてきたファイルからArduino IDEへインストールすることができます。

Arduino IDEのメニューにある[スケッチ]をクリック

→次いで[ライブラリをインクルード]を選択

→[.ZIP形式のライブラリをインストール]をクリック

→ダウンロードしたzipファイルを選択してインストールします。

 

⑦ゲームプログラムの修正

前述のと おり、TinyJoypad回路に使用する抵抗が変更されていますから、それに合わせてプログラムの次に示す箇所の修正をしないと、移動キーがうまく働きません。書き換えは、電圧を読み取り0~1023の変数で表す「analogRead」を使った条件分岐の部分の閾値です。

 

if ((analogRead(A0)>=750)&&(analogRead(A0)<950)) {Sprite[0].DirectionV=0;}

else if ((analogRead(A0)>500)&&(analogRead(A0)<750)) {Sprite[0].DirectionV=1;}

if ((analogRead(A3)>=750)&&(analogRead(A3)<950)) {Sprite[0].DirectionH=1;}

else if ((analogRead(A3)>500)&&(analogRead(A3)<750)) {Sprite[0].DirectionH=0;}

 

エディターで表示箇所を、Kazuさんにならいあらたな抵抗分圧を反映して750→600、500→400と書き改めます。

 

⑧ゲームプログラムの書き込み

プログラムが修正できたら、ATtiny85にへの書き込みです。

Arduino IDEのをメニューにある[スケッチ]をクリック

→次いで「書き込み装置を使って書き込む」をクリックすれば、コンパイルの後、完了が表示されます。

 

●動作確認

 

TinyJoypadがおおよそ完成したところで、試験的にインベーダーゲームを動かしてみることにしました。

 

 

ゲームは無事に起動し、キーで操作もでき、音も鳴り、TinyJoypadの動作確認は成功です。

ATtiny85というこんな小さなマイコンチップにプログラムを書き込み、ゲームで遊べるようにできるなんてすごいですね。

 

随分昔のこと、同じく8ビットであるCPUのZ80にEPROMやRAM、PIOなどを加え、たいそうにマイコンボードを組み上げときには、LEDを点灯させるのがやっとだったことを思い出し、ついつい対比してしまいます。

 

何よりも、ゲーム画面は、単色ながら他の方もおっしゃるとおりすごくきれいです。

今回はブレッドボード上で作製したための制約があって、どうしてもキー操作が不自由になります。本格的にゲームを楽しむには、やはりユニバーサル基板上に移すのがよさそうです。望むらくは、もう少し大きな画面で楽しめたらと思います。

 

 

≪参考サイト≫

 

 

 

 

 

↑ミニブレッドボード上がオルゴール 左はバッテリー

 

音色が美しい!

 

Attiny85へブートローダーやスケッチが書き込めるようになり、Arduino化ができたので、さっそくこれを使って何かやってみたいと思います。

 

パーツを買い足さなくてもできそうなことはとはないかと考え、見つけた一つがオルゴールでした。

 

電子工作の定番でもあるようですね。自分でも、日本橋がまだ電気屋街だった頃に買ってきた光が当たると鳴るメロディーICが、朝になると毎日鳴っていたと娘が言っていたのを思い出します。

 

 

 電子オルゴールの奥深さー3つの方式

 

バネで回る突起が金属板をはじいてメロディーを奏でるという割とわかりやすい仕組みのオルゴールも、電子式になるとなにやら難しいものです。

 

電子オルゴールには3種類の方式があるんだとか。減衰矩形波、減衰正弦波にWaveTableだそうです。

 

目も悪けりゃ、耳も悪く、ついでに頭も悪いとくれば、芸術的なことは大の苦手になります。そのせいで、映像やサウンドからは遠いところに身をおくようにしてきましたから。

 

和音や正弦波とか言われてもさっぱり理解ができませんが、聞きくらべれば、和音が豊で、矩形波より正弦波の方がより美しいことくらいはわかります。サンプリング音源を使うWaveTableもすごいですね。

 

電子オルゴールの奥深さをはじめて知りました。

 

ただし、電子工作としてはいたって簡素。マイコンチップのATtiny85と圧電ブザーもしくはスピーカー、電源となる電池があればできるということで、作ってみる気になったのです。

 

今回は、弘前大学の小山智史先生の減衰矩形波、減衰正弦波方式による電子オルゴールソフト「MyMelo2」を試してみることにしました。

 

「テキスト音楽サクラ」または「メモ帳」などのテキストエディターで、「ドドソソララソー」のように楽譜ファイル(〇〇.mml)を作成し、このmmlファイルをmymelo2.wsfにドラッグ&ドロップすることで、ATtiny85で利用できる形に変換できるのが特徴です。

 

ど素人にも書けそうな気がしませんか。3和音までトラックを使って実現できるそうですから、わかる人にはありがたいことでしょう。試していませんが、音声を録音しメッセージとして添付できる「MyMelo2 PLUS」というものもあります。オルゴールに音声が入るなんて、さすがマイコンですね。

 

最終的に変換されたファイルをArduino IDEで開き、AVRプログラマーを使ってATtiny85に書き込みます。下に手順を載せます。

 

なお、ChanさんのWaveTable方式も捨てがたいのですが、如何せんAVRマイコンに特徴的なヒューズの設定方法が不勉強でまだわからず、使用チップもATtiny45であったため、今回は見送っています。小山さんの方式では、手順通りにすすめればヒューズ設定が書き込まれるようです。

 

 

 MyMelo2を使う

 

それでは、「MyMelo2」を使って電子オルゴールを作ってみましょう。

 

①「MyMelo2」のダウンロード

 

 

まず、小山さんのサイト「私だけの電子オルゴール」から、zipファイルをダウンロードし、解凍します。生成したMyMelo2フォルダ中の「mymelo2.wsf.txt」ファイル名称を「mymelo2.wsf」に変更します。

 

②楽譜ファイルの用意

 

↑楽譜ファイル作成中のブラウザ版「ピコサクラ」。スクリーンショット中の3和音の例は、「和音のできる電子オルゴール」から拝借しました。

 

楽譜のmmlファイルは、「メモ帳」や「テキスト音楽サクラ」で作成することができますが、サクラで演奏できる楽譜のすべてがオルゴールにで使えるわけではありません。MyMelo2では使用できる命令に制限があります。

 

五線譜が読めず、楽譜を入力する自信はありませんから、今回は手抜きしてMyMelo2に入っていた「kira2.mml」を使います。

 

③楽譜データへの変換、追加

 

 

mymelo2.wsfをダブルクリックすると、楽譜データが初期化されます。

 

 

その際画像のようなダイアログボックスが開きますので、矩形波、正弦波、正弦波(伴奏は3角波)のいずれかを選択します。選択ボタンは、「はい(Y)」、「いいえ(N)」、「キャンセル」がそれぞれに対応しています。

 

 

次いで、楽譜ファイル(〇〇.mml)をmymelo2.wsfの上にドラッグ&ドロップします。

 

私のように間違える人はないと思いますが、ダイアログボックスの上ではなく、当該フォルダ内のファイルの上です。やり直しの際に、すっかり忘れて書き込めないとまごついたものです。

 

 

これで、変換された楽譜データーが楽譜データーファイルに記録されます。

 

引き続き別の楽譜ファイル(〇〇.mml)をmymelo2.wsf上にドラッグ&ドロップすれば、2曲目、3局目と楽譜データーファイルに追加されます。

 

 

 ATtiny85への書き込み

 

①mymelo.inoを読み込む

 

 

起動したAeduino IDEのウインドウ画面上部のメニューにある[ファイル]をクリック、開いたドロップダウンメニューの中の[開く]をクリックし、mymelo.inoを探して開きます(解凍してできたmymelo2フォルダー下のmymelo2ファルダー内にあります)

 

 

②「ボード」と「チップ」、「Clock Source」を選択

 

次は、上部のメニューから[ツール]を開き、「ボード」と「Chip」、「Clock Source」を選びます。

 

 

ボードを[ATTinyCore]、ついで[ATtiny25/45/85(No bootloader)]とし、「Chip」を[ATtiny85]とします。次に「Clock Source」は、減衰矩形波の場合は[8MHz(internal)]、減衰正弦波の場合は[16MHz(PLL)]とし、減衰正弦波(伴奏は三角波)の場合ではさらに「Timer 1 Clock」を64MHzとします。

 

③書き込み装置の接続

 

 

次に、書き込み装置(ここではAVRプログラマーとしてUSBaspを使用)を介してパソコンとマイコンをつなぎます。USBポートをパソコンに、ケーブルをマイコンに接続します。

ピン同士の接続は、下記の表のとおり。

 

USBasp ATtiny85 同  左
ピン番号
RESET RESET
GND GND
MOSI MOSI
MISO MISO
SCK SCK
VCC VCC

 

 

 

 

 

 

 

 

 

 

 

ATtiny85のピン番号は、チップの切欠きのある方の横、〇印のついたピンが1番ピンで、反時計回りに2,3,4、…、と8番ピンまで。

 

なお、USBaspではジャンパー接続端子が3箇所あり、うちハンダ付けされた5本のピンは電圧の設定ピンで、画像の茶色のジャンパー線部分の2本を短絡(5Vに設定)させておく必要があります。

 

④「ポート」の選択、[書き込み装置]の指定

 

 

書き込み装置を接続したら、Arduino IDE上部のメニューから[ツール]を開き、[ポート]をクリックして適切なポートを選び、さらに[ツール]から[書き込み装置]をクリックして書き込み装置を指定します(今回の例では[USBasp(ATTinyCore] )。

 

④プログラムの書き込み

 

 

ブートローダーを一度も焼いたことがない生のマイコンチップの場合は、[ツール]から[ブートローダを書き込む]を実行します(これにより②の設定がマイコンのヒューズビットに書き込まれるそうです)。

 

 

最後は、先にArduino IDEに読み込んであったプログラム(mymelo.ino)の書き込みです。上部のメニューにある[スケッチ]から[書き込み装置を使って書き込む]を実行します。通常のスケッチの書き込み方法とは異なるので注意!

 

 

 完成

 

後は、実際にATtiny85にスピーカー(あるいは圧電ブザー)と電池をつなぎ、音を鳴らしてみるだけです。

 

ATtiny85の3番ピンと6番ピンをスピーカーにつなぎ、電池は8番ピンに「+」、4番ピンに「-」をつなぎます。

 

私の場合は、スムースにはいきませんでした。1度目は音がでたのに、矩形波、正弦波の違いを試そうとしたら、書き込みに失敗したり、書き込めても音が出ず、何か誤ってチップを壊してしまったかと思うくらいでした。

 

原因は、ICソケットを使わずに直にATtiny85をブレッドボードに挿していたせいか、接触不良で信号が流れていなかったようです。しっかり押し込んでいたつもりでしたが、見た目ではわからないほどほんのわずかに浮いていて、押せばチップが沈み、手を離せば浮くのです。

 

微妙なもので、ブレッドボード上の位置を変えれば大丈夫なところもあり、これにはまいりました。今後の教訓にしたいと思います。

 

なお、小さな圧電ブザーでは音が小さくよく聞こえませんでした。ガラクタの中から見つけてきた小型のスピーカーにつないでみたところ、クリアな音でよく聞こえました。もともと音が小さく使い物にならなかったスピーカーから大きく聞こえたのは驚きです。

 

↑正弦波です

 

動画では、スピーカーからの音をパソコンのマイクで拾ったものなので、せっかくの音色も音質が悪いのが残念です。

 

今回は、お試しということでとりあえずブレッドボード上につくって済ませ、スイッチも設けませんでしたが、長押しすれば曲が順次変わるプログラムになっているようです。小さいのに思いの外良い音色なので、手抜きせずにつくればそれなりの電池で動く可愛いオルゴールができそうです。

 

《参考サイト》

 

私だけの電子オルゴール (koyama.verse.jp)

「和音のできる電子オルゴール」 (hidapio.jp)

3種類の方式の電子オルゴール -- その音の違いは|人生に出会う7WAYS+α (fc2.com)

ELM - WaveTable電子オルゴール (elm-chan.org)
テキスト音楽「サクラ」 (sakuramml.com)

 

《追記》

 

自分では楽譜が書けないもので、公開されている方のmmlファイルをコピーさせていただいてます。下記のサイトでは、6曲分の楽譜ファイルが掲載されています。

そわそわ_うきうき:作品20 電子オルゴール_小さな世界~その1.音譜作成~ (fc2.com)

↑Arduino化したATtiny85がLEDの点滅用スケッチを実行

 

「書き込み装置を使って書き込む」

ATtiny85にブートローダーを書き込みArduino化ができましたので、次はスケッチ(プログラム)の書き込みと実行です。

 

 

 スケッチの書き込みと実行

 

●要点

 

要点は、ATtiny85はArduinoと違ってUSBポートがなく直接パソコンに接続ができないので、ブートローダーの書き込み同様スケッチも書き込み装置を使うことになる点です。ちなみに、私の場合はArduinoを書き込み装置として使う方法ではブートローダーの書き込みに失敗していますので、スケッチも書き込み専用のUSBaspを使うこととします。

 

ちなみに、スケッチの書き込みはArduinoの通常のスケッチの書き込みと異なり、[スケッチ]から「書き込み装置を使って書き込む」を実行することとなります。USBaspという書き込み装置を使うわけですが、ブートローダーの書き込みでは[ツール]から[書き込み装置]を指定し、[ブートローダを書き込む]をクリックだったので、少々紛らわしいことに注意を要します。

 

話は以上に尽きるのですが、一応スクリーンショットも伏して手順をメモします。

 

●USBaspを使ったスケッチの書き込み

 

USBaspとパソコン、ATtiny85との接続はブートローダーの書き込み時と全くかわりません。そのまま使うことを前提に話を進めます。必要な場合は前号を参照ください。

 

書き込むスケッチは、ATtiny85がArduinoのとして動くかどうかを確かめるためですから、当然ながらLチカになります。参考にしたサイトにならい、Arduino IDEに参考例として含まれるBlinkを流用し外部LEDの点灯用に修正します。ATtiny85にはArduinoのようにLEDを内蔵していませんから。

 

LEDは、後でATtiny85の3ピンにつなぎ、適当な抵抗を付けることにします。

 

それでは、スケッチの参考例から目的のスケッチを開くことにします。

 

 

Arduino IDEのウインドウ画面上部のメニューから[ファイル]をクリック、開いたドロップダウンメニューの中の[スケッチ例]をクリックし、次に開いた「付属のスケッチ例」のリストにある[01.Basics]をクリックして、あらたなリストから[Blink]を選びます。

 

 

開いた「Blink」のエディット画面で、スケッチに修正を加えます。28行目の「pinmode(LED_BUILTIN、OUTPUT);」と33行目の「digitalWrite(LED_BUILTIN, HIGH);」、35行目の「digitalWrite(LED_BUILTIN, LOW);」のいずれも「LED_BUILTIN」の部分を「4」に書き換えます。

 

 

スケッチが修正できたら、上部のメニューの[スケッチ]をクリックし、次いで「書き込み装置を使って書き込む」を選択します(通常、Arduinoでスケッチを書き込む方法とは異なっていることに注意!)。

 

 

すると、コンパイルと書き込みが行われ、問題がなければ「完了」が表示されます。

上はWindows、下にUbuntuの場合のスクリーンショットも参考に掲載します。Arduino IDEのバージョンの違いでしょうか、少し違いがあります。

 

 

●LEDの点灯

 

スケッチを書き込んだATtiny85を取り出し、その3ピンにLEDをつないで適当な抵抗も付けて給電できるようにしてやります。

 

 

電気が流れると、無事LEDが点滅しだしました。

 

点滅のパターンを変えたスケッチに修正して改めてATtiny85に書き込み直したところ、新たな点滅パターンで点滅しだしましたからフロックではありません。Windows11、Ubuntu22.04LTSのいずれで書き込んだものでも光ってくれました。

 

Attiny85 を使って何を作ろうか、楽しみになってきました。

 

●ブートローダーがなくてもスケッチが実行できる!

 

さて、前回冒頭でふれたブートローダーがなくてもスケッチが実行できるかについて、ATtiny85で試してみました。

 

ATtiny85にブートローダーがインストールされていなくても、スケッチを書き込み実行することは可能です。LEDの点滅を実行させてみて確認できました。

 

ただし、ブートローダーをインストールしてある場合と較べて点滅の間隔は長く、あるサイトで見かけたように「ブートローダーを書き込んでいない場合は不安定」なのかもしれません。

 

 

《主な参考サイト》

 

 

 

 

《物品購入先》