4回連載の最終回、いよいよ遊べる状態まで。
〇 Waveshare HAT用の設定
使い方の想定として、ブート後にLCDに単体で使うアプリが表示され、ボタン入力で操作できればいいが、HDMIに繋げてキーボードなどをつないで使うこともできる事を考えた。
フレームバッファをサブディスプレイに複製する(解像度も調整する)、fbcpというツールがあるので、それを使ってみる。
1. まず、Waveshare 1.3" IPS LCDに画面を出せるようにする。
参考:公式ブログ
sudomodの1.44" 128x128 pi zero hatのスレッド
① /etc/modules に SPIドライバと、フレームバッファドライバを追加。おまけでJOYPAD部分のドライバも書いておく。
② /etc/modprobe.d/fbtft.conf の作成
Ctrl+O、Ctrl+Xで出力して終了。このinitの後の16進数コマンドが重要なので、間違えないこと。
リブートして、/dev/fb1が生えているか確認する。
③ 動作確認 (やらなくても良い)
とりあえずちゃんと動いているか確認したいので、何かデータを書き込み。
画面上にゴミが表示されたら動作OK。
2. デスクトップをLCDへ同期表示
① fbコピーをインストール
② 設定ファイルの変更
Ctrl+O、Ctrl+X で終了。
LCD表示が(比較的)綺麗になるよう以下の設定にする。
# HDMI接続が主な場合は、以下のconfig.txt変更をしないでもいい。が、それならLCD Hat付ける意味ないよなあ・・・
hdmi_cvtのパラメータで720x720にしているのは、アスペクト比を1:1にするため。こうしないと、ただでさえ狭い240x240の画面に横圧縮な画面が表示されてとても見にくくなる。
ちなみに、縦240とか300だと、うちのディスプレイでは表示できなかった。
書いてる時に見つけたこちらのサイトでは、WaveshareのHATに合わせているらしいfbcp-ili9341というのを使っているので、こちらを使った方がいいかも知れない。
3.ボタン入力の設定
GPIOボタン入力をRetroPieで利用するため、AdafruitのPiGRRR用ドライバを使う。これは、GPIO入力を適当なキーボード入力に変換してくれる。
→ うまくRPiから拾えない時は、母艦で保存して渡すなど。
→ 3 のPiGRRL Zeroを選択。GPIO番号は後で修正するので大丈夫。
→ 適宜ダウンロードしてインストールしてくれる。流石Adafruit。
→ 最後にrebootするかと聞かれるのでYでリブート。
再起動後、キー定義ファイルを修正。追加キー(GPIO12)をつけてないならESCの行は不要。
Ctrl+O、Ctrl+Xで書いて終了。
この定義は変更してもリブート不要らしい。使いやすいように修正するといい。
ただ、困ったことにGPIO#12の追加キーが変な動作になっている。具体的には、一度押すとしばらく入力がリピートされる。加工の問題か、ソフト設定の問題か、切り分けが付かない。別のキーを押すと解消するので、実害は少ないが、課題表には載せておこう。
Emulation Stationのキーバインドも変更しておく。EmulationStationは一旦killしておくといいかも。
Ctrl+O、Ctrl+Xで書いて終了。
4.Bluetooth Audioの設定
音声はHDMI出力で出せるのだが、単体で音を出したいのでBluetoothで出力。
参考:雑木林ブログ
① pulse audioのインストール
Ctrl+O、Ctrl+Xで書いて終了。
② Bluetoothのプロファイル作成
:wq で出力して終了。
③ モジュール読み込み設定
:wq で出力して終了。
④ Pulse Audioのサービスを起動
一度リブートしてから、サービスを登録する。
enableしとかないと自動起動しないっぽい。
⑤ デバイスの接続登録
⑥ アカウント設定
ユーザ名piだけじゃなく、rootもaudioグループ等に入れておく。
グループに入れていないと、permission deniedになってしまう。
--
これで、大体の設定はおしまい。
キーが圧倒的に少ないので、NES,Gameboy/Color,PCEngine(2ボタン仕様),GameGearあたりが妥当。
ただし、NESは横256を240に縮小することもあって、ドラクエを表示すると微妙に文字が読めない(よく目を凝らすと読める)。GBCは160x144なので、ときメモポケットは十分読める。
そんな微妙なサイズ。
とりあえず、普通に画面に表示すれば勝手にLCDにも表示されるし、retrogameモジュールでボタン+方向入力が普通の文字入力にマップされるので、RetroPieじゃなく普通のアプリケーションを作ってポケット端末化することも問題ない感じ。
しかし、バッテリー内蔵じゃないので、モバイルバッテリーなど外付け電源が必要なのは、少し不便か。
色々と改善ポイントを残しつつ、今年はここまで。
〇 Waveshare HAT用の設定
使い方の想定として、ブート後にLCDに単体で使うアプリが表示され、ボタン入力で操作できればいいが、HDMIに繋げてキーボードなどをつないで使うこともできる事を考えた。
フレームバッファをサブディスプレイに複製する(解像度も調整する)、fbcpというツールがあるので、それを使ってみる。
1. まず、Waveshare 1.3" IPS LCDに画面を出せるようにする。
参考:公式ブログ
sudomodの1.44" 128x128 pi zero hatのスレッド
① /etc/modules に SPIドライバと、フレームバッファドライバを追加。おまけでJOYPAD部分のドライバも書いておく。
$sudo nano /etc/modules spi-bcm2835 flexfb fbtft_device |
② /etc/modprobe.d/fbtft.conf の作成
$sudo nano /etc/modprobe.d/fbtft.conf #/etc/modprobe.d/fbtft.conf # waveshare 1.3 LCD ST7789v options fbtft_device name=flexfb gpios=reset:27,dc:25,cs:8,led:24 custom=1 height=240 width=240 rotate=180 speed=40000000 fps=60 bgr=1 options flexfb setaddrwin=0 width=240 height=240 init=-1,0x11,-2,120,-1,0x36,0x70,-1,0x3A,0x05,-1,0xB2,0x0C,0x0C,0x00,0x33,0x33,-1,0xB7,0x35,-1,0xBB,0x1A,-1,0xC0,0x2C,-1,0xC2,0x01,-1,0xC3,0x0B,-1,0xC4,0x20,-1,0xC6,0x0F,-1,0xD0,0xA4,0xA1,-1,0x21,-1,0xE0,0x00,0x19,0x1E,0x0A,0x09,0x15,0x3D,0x44,0x51,0x12,0x03,0x00,0x3F,0x3F,-1,0xE1,0x00,0x18,0x1E,0x0A,0x09,0x25,0x3F,0x43,0x52,0x33,0x03,0x00,0x3F,0x3F,-1,0x29,-3 |
リブートして、/dev/fb1が生えているか確認する。
③ 動作確認 (やらなくても良い)
とりあえずちゃんと動いているか確認したいので、何かデータを書き込み。
$ sudo cat /dev/fb1 > test.fb $ vi -b test.fb :%!xxd → 16進編集モードに入るのだが、しばらく待たされる → 適当にフォーマットが崩れないように16進数を入れる。連続してそこそこ変えないと画面上で目立たない。 :%!xxd -r → 16進編集から抜ける。戻るのはそんなに待たない :wq → 書いた結果を保存して終了 $ sudo cat test.fb > /dev/fb1 |
2. デスクトップをLCDへ同期表示
① fbコピーをインストール
$ sudo apt-get install cmake git $ cd ~ $ git clone https://github.com/tasanakorn/rpi-fbcp $ cd rpi-fbcp $ mkdir build $ cd build $ cmake .. $ make $ sudo install fbcp /usr/local/bin/fbcp |
② 設定ファイルの変更
$ sudo nano /etc/rc.local → 最後の"exit 0" の前の行に "fbcp &" を追記 : fbcp & exit 0 |
LCD表示が(比較的)綺麗になるよう以下の設定にする。
# HDMI接続が主な場合は、以下のconfig.txt変更をしないでもいい。が、それならLCD Hat付ける意味ないよなあ・・・
$ sudo nano /boot/config.txt → 以下の行を修正・追記 hdmi_force_hotplug=1 hdmi_cvt 720 720 60 1 0 0 0 hdmi_group=2 hdmi_mode=87 |
ちなみに、縦240とか300だと、うちのディスプレイでは表示できなかった。
書いてる時に見つけたこちらのサイトでは、WaveshareのHATに合わせているらしいfbcp-ili9341というのを使っているので、こちらを使った方がいいかも知れない。
3.ボタン入力の設定
GPIOボタン入力をRetroPieで利用するため、AdafruitのPiGRRR用ドライバを使う。これは、GPIO入力を適当なキーボード入力に変換してくれる。
$ cd ~ $ wget https://raw.githubusercontent.com/adafruit/Raspberry-Pi-Installer-Scripts/retrogame.sh |
$ sudo bash ./retrogame.sh |
→ 適宜ダウンロードしてインストールしてくれる。流石Adafruit。
→ 最後にrebootするかと聞かれるのでYでリブート。
再起動後、キー定義ファイルを修正。追加キー(GPIO12)をつけてないならESCの行は不要。
$ sudo mv /boot/retrogame.cfg /boot/retrogame.cfg.PiGRRRZero $ sudo nano /boot/retrogame.cfg # Uses Broadcom pin numbers for GPIO. LEFT 5 # Joypad left RIGHT 26 # Joypad right DOWN 19 # Joypad down UP 6 # Joypad up Z 16 # 'A' button; key 3 X 20 # 'B' button; key 2 ESC 12 # Exit ROM; additional button LEFTCTRL 13 # 'Select' button; Joypad Press ENTER 21 # 'Start' button; Key 1 |
この定義は変更してもリブート不要らしい。使いやすいように修正するといい。
ただ、困ったことにGPIO#12の追加キーが変な動作になっている。具体的には、一度押すとしばらく入力がリピートされる。加工の問題か、ソフト設定の問題か、切り分けが付かない。別のキーを押すと解消するので、実害は少ないが、課題表には載せておこう。
Emulation Stationのキーバインドも変更しておく。EmulationStationは一旦killしておくといいかも。
$ sudo mv ~/.emulationstation/es_input.cfg ~/.emulationstation/es_input.cfg.orig $ sudo nano ~/.emulationstation/es_input.cfg <inputList> <inputAction type="onfinish"> <command>/opt/retropie/supplementary/emulationstation/scripts/inputconfiguration.sh</command> </inputAction> <inputConfig type="keyboard" deviceName="Keyboard" deviceGUID="-1"> <input name="start" type="key" id="13" value="1"/> <input name="down" type="key" id="1073741905" value="1"/> <input name="right" type="key" id="1073741903" value="1"/> <input name="select" type="key" id="1073742048" value="1"/> <input name="left" type="key" id="1073741904" value="1"/> <input name="up" type="key" id="1073741906" value="1"/> <input name="a" type="key" id="122" value="1"/> <input name="b" type="key" id="120" value="1"/> <input name="x" type="key" id="1073742054" value="1"/> <input name="y" type="key" id="49" value="1"/> </inputConfig> </inputList> |
4.Bluetooth Audioの設定
音声はHDMI出力で出せるのだが、単体で音を出したいのでBluetoothで出力。
参考:雑木林ブログ
① pulse audioのインストール
$ apt-get install pulseaudio pulseaudio-module-bluetooth $ sudo nano /etc/systemd/system/pulseaudio.service [Unit] Description=Pulse Audio [Service] Type=simple ExecStart=/usr/bin/pulseaudio --system --disallow-exit --disable-shm [Install] WantedBy=multi-user.target |
② Bluetoothのプロファイル作成
$ sudo vi /etc/dbus-1/system.d/pulseaudio-bluetooth.conf <busconfig> <policy user="pulse"> <allow send_destination="org.bluez"/> </policy> </busconfig> |
③ モジュール読み込み設定
$ sudo vi /etc/pulse/system.pa ### Automatically load driver modules for Bluetooth hardware .ifexists module-bluetooth-policy.so load-module module-bluetooth-policy .endif .ifexists module-bluetooth-discover.so load-module module-bluetooth-discover .endif |
④ Pulse Audioのサービスを起動
一度リブートしてから、サービスを登録する。
$sudo systemctl start pulseaudio.service $sudo systemctl status pulseaudio.service $sudo systemctl enable pulseaudio.service |
⑤ デバイスの接続登録
$ sudo blootoothctl [bluetooth]# agent on [bluetooth]# default_agent [bluetooth]# scan on → つなげたいBTデバイスのID(MACアドレス風の6バイトデータ)を確認 [bluetooth]# pair **:**:**:**:**:** [bluetooth]# trust **:**:**:**:**:** [bluetooth]# connect **:**:**:**:**:** [bluetooth]# quit |
⑥ アカウント設定
$ sudo usermod -a -G pulse-access,audio root $ sudo usermod -a -G pulse-access,audio pi |
グループに入れていないと、permission deniedになってしまう。
--
これで、大体の設定はおしまい。
キーが圧倒的に少ないので、NES,Gameboy/Color,PCEngine(2ボタン仕様),GameGearあたりが妥当。
ただし、NESは横256を240に縮小することもあって、ドラクエを表示すると微妙に文字が読めない(よく目を凝らすと読める)。GBCは160x144なので、ときメモポケットは十分読める。
そんな微妙なサイズ。
とりあえず、普通に画面に表示すれば勝手にLCDにも表示されるし、retrogameモジュールでボタン+方向入力が普通の文字入力にマップされるので、RetroPieじゃなく普通のアプリケーションを作ってポケット端末化することも問題ない感じ。
しかし、バッテリー内蔵じゃないので、モバイルバッテリーなど外付け電源が必要なのは、少し不便か。
色々と改善ポイントを残しつつ、今年はここまで。