ブログだいちゃん

ブログだいちゃん

趣味のブログ

ブログだいちゃん

ATTiny85 で動くレトロゲーム機を作ってみた

若かりし頃インベーダーゲームをカフェに置いてあったゲーム機でよく遊んでいた記憶があります。
あの頃とは違い、今はボケ防止のため指先の運動でもしてみよう的な思惑でゲームをしてみます、月日が経つのは早い物です。(*^▽^*)

よく見るのは0.96インチの小さなOLEDを使用した小型のゲーム機ですが、目が遠くなった私には見づらいのでちょっと大きめなディスプレイを使用して作成します。
 

 

参考記事

 

ゲームモジュールをカセット式にしている動画

www.youtube.com

回路図

 

ATTiny85ゲーム機の一般的な回路図です、これに充電モジュールを追加しました。

回路図はUncle in Yokohama さんの動画からの転載です。

5ポジションスイッチのピン配置図です

 

ケース作成

 

縦55mm×横85mm×厚さ23mm 肉厚3mmで作成

OLED、スイッチ類など全てケースにホットグルーで固定しました、裏蓋の固定用にインサートナットを使用します。

STLファイルを必要な方は Download して下さい。
 

配線・組み込み

 
OLED、スイッチ類、電源・充電表示用3mmLEDはリード線をハンダ付けしてからケースにホットグルーで固定します。
裏蓋にあるユニバーサル基板取付用突起の寸法は12.5×15mmです、2.5mmピッチの基板の穴に合うようにしました。
リポ電池は裏蓋にベルクロで貼り付けました。

ATTINY85を載せたカセット式の小さな基板です。

スイッチを入れると電源表示用青色LEDが点灯します、充電時は赤色LEDが点灯(充電モジュールから配線)します。


外観です


1.54インチのOLEDは見やすくていいですね、このディスプレイドライバーがSH1116となっていてドライバーファイルがどこを探しても見つからず、SH1106のドライバーを使用しても正常に表示されなくて悩んでいましたが、SSD1306ドライバーを使用したところ正常に表示されました紛らわしいですね。

Raspberry Pi Pico と MH-Z19Cを使用し CO2濃度測定器を作成してみました

寒い日が続き室内で窓を閉め切りファンヒーターなどを付けていると、CO2濃度もどんどん上昇していると思いますが、実際どの位の濃度になっているのか見当が付きません。

最近またコロナの感染者が増えてきました、室内の空気を入れ換え感染症の予防も必要です、換気の目安を知るためCO2センサーを使って二酸化炭素濃度測定器を作成してみようと思います。
 

 

参考サイト

 

CO2測定について書かれている記事です

plaza.rakuten.co.jp
 

SH1106 DriverのGithub です、Thonnyのパッケージ管理からではインストール出来ないので。

github.com
 

Micropython 用 日本語フォント、OLEDに日本語で表示させるため。

github.com
 

回路図

 

OLEDにCO2濃度を表示し濃度を4段階に分けLEDで表示します。

OLED端子のGNDとVCCが入れ替わっているモジュールがあります注意が必要です。
回路図のCO2センサーはMH-Z19Bですが使用したのはMH-Z19Cです。


 

ソフトウエアのインストール

 

Picoへのインストールには Thonny を使用しました

Rspberry Pi Pico へのMicropython farmwareのインストール、Thonny の使用方法については省きます。

1. OLEDのドライバーをGithubからダウンロードしてインストールします。

2. 日本語フォントをGithubからダウンロードして解凍したファイルの中のmfontフォルダーをPicoにアップロードします。
 ※ 日本語フォントは u_16x16.fnt と u_24x24.fnt だけを使用しますのでそれ以外のフォントは削除してからアップロードしないとメモリーオーバーになります。

3. LEDが点滅するCO2濃度の基準値は次のようにしました。
 青色LED:~1000PPM
 緑色LED:1001~2000PPM
 黄色LED:2001~3000PPM
 赤色LED:3001~

4. プログラムについてはド素人ですので間違いがあるとは思いますが、一応動いたので載せておきますご指摘がありましたらコメント下さい。

##########################################################
# SH1106 OLED Display I2C Driver for Raspberry Pi Pico
# https://github.com/robert-hh/SH1106
# 日本語フォントを使用する
# https://github.com/Tamakichi/pico_MicroPython_Multifont
##########################################################
from machine import Pin, I2C
from sh1106 import SH1106_I2C
import utime
from micropython import const
from mfont import mfont
#----LED設定-----
led_red = Pin(16,Pin.OUT)
led_orange = Pin(17,Pin.OUT)
led_green = Pin(18,Pin.OUT)
led_blue = Pin(19,Pin.OUT)
# 定数(デフォルトは、Seeed XIAO RP2040用)
I2C_ID       = const(1)       # I2C ID
I2C_FREQ     = const(400_000) # I2C バス速度
OLED_WIDTH   = const(128)     # OLEDの横ドット数
OLED_HEIGHT  = const(64)      # OLEDの縦ドット数
OLED_ADDR    = const(0x3c)    # OLEDのI2Cアドレス
OLED_SCL     = const(15)       # OLEDのSCLピン
OLED_SDA     = const(14)       # OLEDのSDAピン
# OLEDディスプレイのインスタンスの生成
i2c = I2C(I2C_ID, scl=Pin(OLED_SCL), sda=Pin(OLED_SDA), freq=I2C_FREQ)
oled = SH1106_I2C(OLED_WIDTH, OLED_HEIGHT, i2c, addr=OLED_ADDR, rotate=180)
oled.contrast(255)
oled.invert(False)
# フォントの表示
def drawFont(self, font, x, y, w, h, flg=False):
    bn = (w+7)>>3
    py = y
    for i in range(0, len(font), bn):
        px = x
        for j in range(bn):
            for k in range(8 if (j+1)*8 <=w else w % 8):
                self.pixel(px+k,py, 1 if font[i+j] & 0x80>>k else 0) 
            px+=8
        py+=1
    if flg:
        self.show()    
# テキストの表示
def drawText(self, text, x, y, fs, wt=0):
    self.x = x
    self.y = y    
    # フォントの設定
    self.mf = mfont(fs)
    self.mf.begin()
    # テキスト表示
    for c in text:
        code = ord(c) 
        font = self.mf.getFont(code)
        self.drawFont(font, self.x, self.y, self.mf.getWidth(), self.mf.getHeight(), True)
        if wt:
            utime.sleep_ms(wt)
        self.x+=self.mf.getWidth()
    self.mf.end()   
# SH1106_I2Cに漢字表示インスタンス・メソッドの追加
SH1106_I2C.drawText = drawText
SH1106_I2C.drawFont = drawFont
#----タイトル表示----
txt = "CO2 濃度測定"
fsize = 16
oled.fill(0)
oled.drawText(txt,15,0,fsize,50)
oled.show()
#----CO2数値の表示---
mhz19c=machine.UART(1,baudrate=9600) # UART
while True:
    for gx in range(98):
        data=bytearray([0xff, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79])
        mhz19c.write(data)
        mhz19c.readinto(data,len(data))
        co2=data[2]*256+data[3]
        print(str(co2)+'ppm')
        fsize = 24
        txt = str(co2)
        oled.drawText(txt+" PPM",15,30,fsize,50)
        oled.show()
        #----LED表示----
        if (co2 > 3000):
           led_red.value(1)
           led_orange.value(1)
           led_green.value(1)
           led_blue.value(1)
           utime.sleep(3)
           led_red.value(0)           
        elif (co2 > 2000):
            led_red.value(0)
            led_orange.value(1)            
            led_green.value(1)
            led_blue.value(1)
            utime.sleep(3)
            led_orange.value(0)
        elif (co2 > 1000):
            led_red.value(0)
            led_orange.value(0)
            led_green.value(1)
            led_blue.value(1)
            utime.sleep(3)
            led_green.value(0)
        elif (co2 <= 1000):
            led_red.value(0)
            led_orange.value(0)
            led_green.value(0)
            led_blue.value(1)
            utime.sleep(3)
            led_blue.value(0)
        # CO2数値を消去
        oled.drawText("           ",0,30,fsize,50)
 #==================================

 

ブレッドボードに配線して動かしてみました

 

ブレッドボードに配線しました

タイトルは16×16ドット、CO2測定値は24×24ドットで表示しています。
CO2センサーのキャリブレーションはマニュアルの通り屋外で設定しました。


CO2とLEDの表示について

CO2の表示は約3秒ごとに更新されます。
LEDの表示は前述の基準に達しているLEDが点滅し、それ以下のLEDは点灯します。


www.youtube.com
 
画像と動画ではディスプレイが180度回転していますが、プログラムでは修正してあります。

なんとか表示出来たのでケースを作成し組み込んでみようと思います。
 

2月5日追記

 

ケースに組み込み完成させました

Rspberry pi pico でレトロゲーム機を作ってみる

購入しておいた Rspberry pi pico が何個かあるので、python ではなく Arduino の farmware を使用してレトロゲーム機を作成してみようと思います。

0.96インチのOLEDを使用した小さなレトロゲーム機が主流ですが、老眼の私にはよく見えないのでちょっと大きめなディスプレイを使用します。
 

 

参考サイト

 

picoを使用したレトロゲームGithub

github.com
 
Github の元になったサイトWemosD1 Mini などを使用しています。

www.tinyjoypad.com
 

回路図

 
Github からダウンロードしたファイルの中のReadMeテキストを開くと配線について書いてありますが、これを元に回路図を作成してみました。


 

インストールして動作確認

 

Pico にArduino farmware を入れてレトロゲームをインストールする。

Arduino farmware インストールなどについては下記の記事が参考になります。

logikara.blog

ブレッドボード上に配線して動作確認しました。

パーツの数が少ないので配線も簡単です。
スケッチの中に16種類のゲームが入っておりメニューから選択できます。

動作が確認出来たのでケースを作成し完成させたいと思います。

最初に作成したMiniWebRadioもV2にして ケースを小型化する

MiniWebRadioV2 がストレスなく動作するので、最初に作成したMiniWebRadioもV2化してケースも小型にしてみます。

最初に作成したMiniWebRadio

blogdaichan.hatenablog.com
 

 

使用パーツ

 
使用パーツは最初に作成した物でまかないます、ただしESP32は ESP32-WROVER-E に変更します。

アンプはスイッチ付きボリュームが無いものを使用

MiniWebRadioV2 の使用パーツは前の記事を参考にして下さい。

blogdaichan.hatenablog.com
 

ユニバーサル基板は最初の物を流用

 

基板への配線

回路はV2になり多少の変更がありますので配線を全部取り外して再度配線し直しました。

ユニバーサル基板はLCDのピンヘッダーにピンソケットで差し込み固定しています、今回はスイッチ付きのアンプは使用せず VS1053 の背面に両面テープでアンプを固定しました、したがって音量調節はリモコンまたはタッチパネルで行います。


 

ケースの作成

 
ケースの両横にスピーカーを取り付けようとしましたがLCDの背面に基板があり支障するので諦めました。
横長にはしたくなかったのこの様な形になりました。
大きさは 縦110×横110×奥行き70mm でPLA使用 インフル20% 厚さ3mm で印刷しました。

作成した外観です

 

ケースへの組込

 

ネジ止めはプラスチックネジを使用、そのほか両面テープホットボンドなどを使用しました。

 

以前作成した物との比較


 

MiniWebRadioV2 を作成してケースに組み込む

前の記事で MiniWebRadioV2 をブレッドボード上に組込み問題なく動いたので、基板上に作成してケースに組み込みたいと思います。

前の記事

blogdaichan.hatenablog.com
 


 

使用パーツ

 
前の記事で紹介したパーツ以外の物を上げておきます

インサートナット挿入用小手先

ハンダごての小手先で挿入ーしてましたがこれがあれば間単に挿入できそうです、使用しているハンダごてが白光のFX600なので合います。

 

ユニバーサル基板 72×95mm 秋月電子

akizukidenshi.com

その他 3mmLED LED用2kΩ抵抗 配線用ワイヤー 両面テープ など

ほかにプラスチックネジがあればニッパで切って長さ調整が間単に出来るので便利です。
 

ケース作成

 
ケースの大きさは 横230×縦100×奥行き80mm PLA使用 インフル20% で作成しました。
奥行きがありますが、いずれバッテリーを搭載してポータブルタイプにするためです。

STLファイルが必要な方はDownloadして下さい。
 

基板に作成・組込

 
ユニバーサル基板にパーツを配置し配線しました、ケース内からのケーブルは作業性を考慮してピンヘッダーを使用しました。

基板右下の小さなモジュールは降圧モジュールです、使用してませんがいずれ3S_11.1V のバッテリーを降圧して5V にします。
 

完成しました

ケースの色についてはセンスの無さを感じますが勘弁して下さい。
タッチパネルやリモコンで音量調整は出来ますが、ボリューム摘まみの方が操作しやすいですね、右が電源表示用LED 左がリモコン用赤外線受信モジュールです。

※ 操作方法やタブレットなどでの設定は前とほとんど変わりません、過去記事をご覧下さい。
 

MiniWebRadio V2 をブレッドボード上に作成してみました

かれこれ5年ほど前になりますが MiniWebRadio を作成しました。

blogdaichan.hatenablog.com

現在も使用していますが、ブラウザでの設定がもたつくので直接SDカードに書き込みして局の編集などをしていました。
久しぶりに作者のGitHubにお邪魔したところバージョンアップしてV2になっていたので、ブレッドボード上に作成し動作確認をしてみます。

書き込みには VS Code を使用するようです、 VS Code は使ったことがありませんが手順通り行えばなんとかなるでしょう。

 

 

使用パーツ

 

ESP32-WROVER または ESP32 S3

PSRAMが使えるものでないと動作保証されていないようですが、とりあえず手持ちのESP-WROOM32 Sで試してみます

 

2.8"インチ TFT液晶ディスプレイ タッチパネル、3.5インチも使えるようです

 

SDカードアダプター

8GBのmicroSDと変換アダプターは手持ちの物を使用しました

 

IR受信モジュール

リモコンを使用しないなら必要ありません、これも手持ちにありましたので付けてみました

 

リモコン 赤外線受信モジュール付きです

以前リモコンカーに使用した似たようなリモコンがありますので使用しました。

 

その他 ブレッドボード 配線用ワイヤー 10KΩ 抵抗 など

 

参考記事

 

MiniWebRadioのGitHub

github.com
 

ESP32 Internet Radio, MP3 Player, and Alarm Clock

www.hackster.io
 

プログラムの書込準備

 

VS Code と Git のインストール

Microsoft の以下からダウンロード出来ます。

code.visualstudio.com

Git をダウンロードしてインストールします。

gitforwindows.org

最初この Git をインストールしなかったので Clone Git Project の所でロードできなくて躓きました。

他はダウンロードしたファイルの中の additional_info フォルダーにある How to install.pdf の通りに設定しました。
 

プログラムの設定と書込

 
自分使用の場合、タイムゾーン WiFiのID/Pass などを設定しておくと良いです。

rtime.cpp の設定

258行目を日本のNTPに変更しました char sbuf[20]="ntp.nict.jp";

rtime.h の設定

27行目を日本のタイムゾーンに変更 boolean begin(String TimeZone="Asia/Tokyo");

main.cpp の設定

130行目を日本のタイムゾーンに変更 String _TZName = "Asia/Tokyo";
131行目を変更           String _TZString = "JST-9";   

common.h の設定

7行目で自宅WiFiSSIDを設定
8行目で自宅WiFiのPassWordを設定します。
その他 使用するモジュールの設定をコメントを参考に設定します。

私の場合 9~14行目までは以下の通り設定しました。
#define DECODER       0     // (0)VS1053 , (1)MAX98357A PCM5102A CS4344... (2)AC101, (3)ES8388, (4)WM8978
#define TFT_CONTROLLER   0    // (0)ILI9341, (1)HX8347D, (2)ILI9486a, (3)ILI9486b, (4)ILI9488, (5)ST7796, (6)ST7796RPI
#define DISPLAY_INVERSION  0   // (0) off (1) on
#define TFT_ROTATION    3     // 1 or 3 (landscape)
#define TFT_FREQUENCY 40000000   // 80000000, 40000000, 27000000, 20000000, 10000000
#define TP_VERSION     0     // (0)ILI9341, (1)ILI9341RPI, (2)HX8347D, (3)ILI9486, (4)ILI9488, (5)ST7796, (3)ST7796RPI

以上を設定して ESP-WROOM32-S に書き込みました。
 

回路図

 
回路図は additional_info フォルダーにあります、分かりやすい回路図は ESP32 Internet Radio, MP3 Player, and Alarm Clock の記事内にあります。

回路図と液晶ディスプレイの画像です。※ additional_info フォルダーからの転載

 
こちらは分かりやすい回路図です。※ ESP32 Internet Radio, MP3 Player, and Alarm Clock からの転載

※ 最初の回路図には10KΩ の抵抗がありません、分かりやすい回路図では赤外線受信モジュールがありません。
※ 分かりやすい回路図ではSDカード変換アダプターの電源3.3Vが5Vに接続されていますので間違です3.3Vに接続します。
※ 液晶ディスプレイに付いているDSカードアダプターや、SDカードアダプターモジュールを使用すると動作しません。
※ SDカードに直接ハンダ付けすることも出来ますが、カードアダプターを使用する事をお勧めします。
 

動作確認

 
ESP-WROOM32-S でも動作はします、しかし画像の表示にもたつきがあり、下部に表示される操作アイコンが表示されないときがあります。
PSRAM搭載のESP32 は持っていないので試しておりませんが ESP32-WROVER-E を手に入れたらこの辺が改善されるのか試してみたいと思います。

ブレッドボード上の配線画像

 

11月27日 追記

 

ESP32-WROVER-E(FLASHメモリ8M PSRAM8M)を使用してみました

akizukidenshi.com

ESP32-WROVER-E を手に入れたので早速組み直してみました、画像表示のもたつきも無くなりブラウザでの設定も問題なく出来ます。

前よりちょっと大きめ50mmのスピーカー用ケースを作成して再度 WebRadio を作ってみます。
 

 

サイクロン集塵機の別バージョン作成

もうかれこれ9年くらい前になりますが、サイクロン集塵機を小型のパイロンを使用して作成しました。

blogdaichan.hatenablog.com

切削時に活躍していましたが、年数の経過とともにパイロンの表面がベトベトして劣化が始まりました。
最近は、サイクロン集塵機用のパーツが安価に入手出来ますので作り直すことにします。
 

使用パーツ

 

小型のサイクロン

直径80mmくらいで、以前使用した瓶に入りコンパクトになります。

ホース継手と瓶の蓋

サイクロン側とホースの径が違うので3Dプリンターで作成、継ぎ手はPLA樹脂、瓶の蓋はTPU樹脂で作成しました。
小型掃除機の吸い込み口が丸形ではなく特殊な形状なのでこの継ぎ手も作成。

 

瓶の蓋

前の集塵機に使用した瓶の蓋は穴の径が違い使用出来ないので作成し直します。
使用している瓶は梅酒などを入れるための物で蓋の内側に注ぎ口の着いたビニール製の蓋が付いています、この蓋を参考にTPUフィラメントを使用して作成しました。
サイクロン取付用の穴はサイクロンの直径より1mm短くしました、ネジなどで固定しなくても空気漏れは無いようです。


 

完成した外観

 
Shapeoko2 に取り付けて使用するので、切削クズを吸い込むには適した大きさです。
ホースと継ぎ手の接続部には空気漏れ防止のためホットボンドを使用しました。