Retropie mobile case with a bluetooth game controller (rev.1)

持ち運びできるRetropieゲーム機のケース制作。

参考

≫ Nintendo Pi Switch? Portable Raspberry Pi 3 Ghetto Pi Boy V2 5 Inch Screen

こちらのゲットーパイをもう少し扱いやすいケースに納めたもの。
市販製品の組み込みのみで作れそうだったので制作。電源スイッチもモバイルブースターについているものをそのまま利用。電気の素人がリチウムポリマー電池を扱うのは怖いので、市販製品の組み合わせだけで作れるというのが利点。本体だけで使う分にははんだづけ作業は不要。引き換えに重量・サイズは製品次第。また、申し訳程度にヒートシンクは付いているけれど、それ以外の温度管理は行なっていないので、熱暴走するかもしれないし、ハードウェアが故障するかもしれない点は未解決。サウンドもイヤホンのみでスピーカーはなし。Bluetoothコントローラーの設定はゲットーパイまま。

基本情報

持ち運び可能だけれど、「携帯ゲーム機」というには非常に重く大きい。スペースの都合上バッテリーが上部にくるのも重量バランスを悪くしている。

サイズ

縦 / 125mm (本体:117mm)
横 / 228mm (本体:132mm)
厚 / 約53mm (本体:33mm)
重 / 630g (本体:439g)
ディスプレイ / 5.0inch

<参考>
  • Nintendo Switch [縦 102mm × 横 239mm x 厚 13.9mm (w Joy-Con) / 重 398g / 6.2inch Display]
  • Nintendo 3DS(折畳時) [縦 80.6mm × 横 142 mm × 厚 21.6mm / 重 253g / 3.88 + 3.33inch]
  • Nintendo ゲームボーイ [縦 148mm x 横 90mm x 厚 32mm /300g(電池含)]
  • Sony PSP-3000 [縦 約 73mm x 横 168mm x 厚 23mm / 重量 189g / 4.3inch Display]
  • NEC PCエンジンGT [縦 185mm × 横 108mm × 厚 46.8mm / 重量 550g(電池含) / 2.6inch Display]

部品コスト

キレイに1台分のみの部品は買えないので、ネジ10台分、アクリル3台分というような買い方になる。2017年11月時点のAmazon中心での購入概算、Aliexpressを利用したりアクリル板の購入とカット同時にやってもらえるところなどを使うと20000円程度にはなるかもしれない。30000円程度で買えるSwitchやPS Vitaなど、市販携帯ゲーム機はすごい。

(JPYEN) 2017/10時点

  • RPi / 5500
  • Disp / 4980
  • Batt / 1399
  • Controller / 4980
  • USB1 / 800
  • USB2 / 800
  • SD64 / 2580
  • AcrylicBoard / 3780 (1260)
  • Cut / 3000
  • substrate / 1080
  • heatsink / 679 (136)
  • spacer / 464 (231)
  • screw / 629 (50)
  • switchCable / 30
  • switch / 120 (12)

30671 (1台換算 26808)

本体部品

※スペーサーは4本(8本置いてしまっているけれど)

■ Raspberry Pi 3 Model B

■ Elecrow 5インチHDMIディスプレイモニター 800×480解像度タッチスクリーン

■ モバイルバッテリー RAVPower 3350mAh RP-PB33 ブラック

■ 8pcsセットfor Raspberry Pi 3 Raspberry and for Pi 2 model B+ model B 専用冷却 アルミ・ヒートシンク 冷却クーラー キット

■ Rerii 左向き両端L型 マイクロUSBケーブル USB L字 MicroUSB l型 Micro USB充電ケーブル30cm

■ URBAN UTILITY USB micro-B ケーブル L型 レッド 10cm

■ IPEGA PG-9055 iPhone6s対応ブルートゥースゲームコントローラー

以下は購入時とは仕様が異なるかもしれない

モバイルバッテリーRAVPower 3350mAhは、黒以外は1A出力の場合があるそうなので、黒を選択。このバッテリーはオンオフスイッチがついているため、そのまま利用することで、別途電源スイッチを実装する必要はなくなった。ただし、時期違いで何本か購入したけれど、ボタン操作が2度押しだったり長押しだったり、稼働中のランプの点灯・消灯など動作が異なるよう。
USBケーブル黒い方は電力供給用、ピンクのほうは充電用。充電の際は通電してしまうので、RPi供給用のUSBケーブルは外した方がよさそうだけれど、これも各時期のバッテリー仕様によるのかもしれない。バッテリーの設置はディスプレイ裏に両面テープで貼り付け。

設計したケースではコントローラーとの設置面積が足りず不安定だったので、コントローラー内側側面のゴム部分に、さらにゴムシートを貼った。
このほかretropieをインストールしたSDカードが必要。

ケース部品

≫ アクリル板スモーク(押出し)(コモグラス) 板厚(3ミリ) 600×910  [アクリルショップはざいや]
三等分カット:約300×600ミリ 600×910のアクリルを3等分カットして注文、3体分。何色でもいいけれど、ディスプレイの上に1枚乗るので、その1枚だけは無彩色のほうがいいと思う。

≫ 黄銅スペーサー(六角)/ASB-300-5E ASB-327-5E [ヒロスギネット]
1体につき4本

■ Angelakerry M3 六角穴付きボルト キャップボルト (皿) 6mm ブラック 六角 ボルト ネジ 炭素鋼製 スクリュー 螺子

■ スターエム ハイス六角軸面取カッター NO.5007 10MM

1体につき8個。ネジはM3 6mmであればなんでも可、黒いネジのほうが目立たないかなというだけでこのネジを使用。黒いネジがコレしか見つからなかったので使用したけれど、+字ネジ穴よりもスマートだった。

六角軸面取りカッターは、ネジ穴をザグるための工具。皿ネジを使うのでなければ不要。

ケース図面

≫ ケース図面(PDF)

≫ ケース図面(Illustrator)

ケースはよく見かけるRaspberry Piのプラ積層ケースを真似て、アクリル板の積層。カットはfab施設に持ち込んでレーザーカッター依頼。(たぶん)[Universal PLS6xxx]という青い機械を使用、カット時間35min弱。レーザーカッターのカットだけでなく彫刻も試してみたかったので適当なロゴを入れた。彫刻の有無で想定時間差を確認させてもらったところ、このサイズの彫刻だとカット時間への影響はほぼなかった。天板の下、2枚目の板に刻印したのだけれど、スモークのアクリルではほぼ視認できなかったため、ホワイトエナメルカラーでスミ入れした結果、想像した程度に見えるようになった。

LCDモニター回転(rotate)スイッチ

ディスプレイはイヤホンジャックを下出しにしたかったので180度回転した設定をしているため、仮にTVなどHDMIディスプレイに繋いだ際は逆さに映るので、画面を180度回転させるボタンを設置。回転と併せて音声出力もRaspberry Piの3.5mmジャックからHDMIのオーディオに切り替え。ボタンの動作は、長押し(3秒)で設定を書き換えて再起動するので時間はかかる。本体だけで使うなら不要。

≫ コネクタ付コード2P(A) (赤白) [秋月電子]
≫ タクトスイッチ(黒) (10個入) [秋月電子]

■ 曲がるPC基盤 自由に曲がる!300X200mmサイズ

[amazonjs asin=”B00PXL9C0K” locale=”JP” title=”曲がるPC基盤 自由に曲がる!300X200mmサイズ 【ブラック】”]

ディスプレイ回転スクリプト

≫ ラズパイ+タクトスイッチでSlack用へぇボタン作成してみた
≫ RaspberryPiにshutdownボタンを付けよう
≫ Raspberry Pi に高精細IGZOパネルを繋げてみた。

パイソンスクリプトもシェルスクリプトもよくわからないけれど、試してできた機能の組み合わせで作成。シャットダウンボタンを参考にスイッチの待ち受けを作り、config書き換えを参考にスイッチ押下認識後の動作を作成。使用したGPIOピンは、ディスプレイで埋まったピンの反対端の2本。

rotateLcd.py

/home/pi/script/rotateLcd.py 配置はどこでも可
今回/home/pi/以下にscriptディレクトリを作って配置。

# /home/pi/script/ 配置はどこでも可

import time
import os
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)

GPIO.setup(21,GPIO.IN,pull_up_down=GPIO.PUD_UP)

while True:
    GPIO.wait_for_edge(21, GPIO.FALLING)
    sw_counter = 0

    while True:
        sw_status = GPIO.input(21)
        if sw_status == 0:
            sw_counter = sw_counter + 1
            if sw_counter >= 300:
                os.system('chmod +x /home/pi/script/rotateLcd.sh')
                os.system('/home/pi/script/rotateLcd.sh')
                break
        else:
            break

        time.sleep(0.01)

    # print(sw_counter)
GPIO.cleanup()
rotateLcd.sh

/home/pi/script/rotateLcd.sh 配置はどこでも可

# /home/pi/script/ 配置はどこでも可
configFile=/boot/config.txt
configDefault=/boot/config.txt.Default
configRotate=/boot/config.txt.Rotate
stateDefault=/boot/configStateDefault.txt
stateRotate=/boot/configStateRotate.txt

if [ -e $stateDefault ];
then
    sudo cp $configDefault $configFile
    sudo rm $stateDefault
    amixer cset numid=3 1
    sudo touch $stateRotate
    sudo reboot
elif [ -e $stateRotate ];
then
    sudo cp $configRotate $configFile
    sudo rm $stateRotate
    amixer cset numid=3 2
    sudo touch $stateDefault
    sudo reboot

fi
rc.local

前述のパイソンスクリプトをRaspberry Pi起動時に実行するための指定。編集後[sudo chmod +x /etc/rc.local]と1度実行すると実行権限がついて、起動時に動作するよう。

/etc/rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

sudo chmod +x python /home/pi/script/rotateLcd.py &

exit 0

configStateDefault.txt / configStateRotate.txt

現在の画面方向を示すフラグ用のダミーファイル[/boot/configStateDefault.txt]を作成。内容はなし、空のテキストファイル。現状判定なので、DefaultかRotateのどちらか1ファイル作成すればいい。

config.txt.Default

/boot/config.txt.Default

# /boot/config.txt.Default

# For more options and information see
# http://www.raspberrypi.org/documentation/configuration/config-txt.md
# Some settings may impact device functionality. See link above for details

# uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1

# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
#disable_overscan=1

# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16

# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720

# uncomment if hdmi display is not detected and composite is being output
hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
#hdmi_group=1
#hdmi_mode=1

# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
#hdmi_drive=2

max_usb_current=1

# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
#config_hdmi_boost=4

# uncomment for composite PAL
#sdtv_mode=2

#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800

# Uncomment some or all of these to enable the optional hardware interfaces
dtparam=i2c_arm=on
#dtparam=i2s=on
dtparam=spi=on
enable_uart=1
# Uncomment this to enable the lirc-rpi module
#dtoverlay=lirc-rpi

# Additional overlays and paramete<span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"></span>rs are documented /boot/overlays/README

# Enable audio (loads snd_bcm2835)
dtparam=audio=on
hdmi_group=2
hdmi_mode=1
hdmi_mode=87
hdmi_cvt 800 480 60 6 0 0 0
dtoverlay=ads7846,cs=1,penirq=25,penirq_pull=2,speed=50000,keep_vref_on=0,swapxy=0,pmax=255,xohms=150,xmin=200,xmax=3900,ymin=200,ymax=3900
display_rotate=2

config.txt.Rotate

/boot/config.txt.Rotate

# /boot/config.txt.Rotate
# 以下までは[config.txt.Default]と同様。rotateの設定だけが異なる
display_rotate=0

Dreamcast Controller settings

≫ Reicast on Pi3: Can’t configure analog stick (on a controller recognized as a keyboard)

reicastだけはEmulation Stationの設定だけでは動かないようなので、フォーラムを参考にPG-9055の吐き出している値をメモして書き換え。他と同じような[Start + Select]でのEmulation Station復帰の設定方法がわからなかったため、右アナログスティック押し込みをEmulation Station復帰ボタンに設定。

/opt/retropie/configs/dreamcast/mappings/controller_PG-9055.cfg

[emulator]
mapping_name = PG-9055
btn_escape = 318

[dreamcast]
btn_a = 304
btn_b = 305
btn_c =
btn_d =
btn_x = 307
btn_y = 308
btn_z =
btn_start = 315
btn_select =
btn_dpad1_left =
btn_dpad1_right =
btn_dpad1_up =
btn_dpad1_down =
btn_dpad2_left =
btn_dpad2_right =
btn_dpad2_up =
btn_dpad2_down =
axis_x = 0
axis_y = 1
axis_trigger_left =
axis_trigger_right =

[compat]
btn_trigger_left = 312
btn_trigger_right = 313
axis_dpad1_x = 16
axis_dpad1_y = 17
axis_dpad2_x =
axis_dpad2_y =
axis_x_inverted = no
axis_y_inverted = no
axis_trigger_left_inverted =
axis_trigger_right_inverted =
axis_dpad1_y_inverted = no
axis_dpad1_x_inverted = no

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください