1:12 ASTRO CITY + PI

看到網路有神人將1:12的ASTRO CITY


弄成了像真的機台一樣 ,
自己也想來試看看 , 如下影片
由於模型的螢幕大概就是2吋左右,
所以打算用2.2吋TFT + RetroPie來實現功能 .

會遇到的問題 :
1.Pi 驅動2.2吋TFT .(花了我很多時間...YouTube一堆影片 , 但沒人有詳細說明)
2.如何將螢幕塞進去模型內 

先從接線開始:
我買的是ILI9341 2.2吋 , 我覺得很便宜 NT.220左右 .


但是這款邊太大了  Orz 所以完全不懂電路版的我 , 稍微研究一 下那SD卡的部分 ,
判斷應該沒影響 , 所以大膽的把那一半切了 .
然後稍微拉個排線角度 , 就可以塞進模型內 .
焊接厲害的的人可以把排線焊長一點 , 也許就不用這麼辛苦了 .
弄完大概是這樣 , 由於面板左右不是很對稱 , 會差一點點 , 可能要在驅動上去調教了 .

接下來是接線的部分 , 
參考了很多網路的文章 ,
早期大家都是用git上 https://github.com/notro/fbtft這個專案 ,
來解決驅動SPI TFT的問題 . 但現在FBTFT Driver已經含在kernel裡面了 ,
但接線還是個問題 , 
這片TFT有SDO(MISO) , LED , SCK , SDI(MOSI) , D/C , RESET , CS , GND , VCC
幾個SPI跟電源(3.3V)好接 , 直接就對應Pi 上那幾個位置就好了 

但是有幾條要接到GPIO的就頭痛了 ...
  .name = "adafruit22a",
  .spi = &(struct spi_board_info) {
   .modalias = "fb_ili9340",
   .max_speed_hz = 32000000,
   .mode = SPI_MODE_0,
   .platform_data = &(struct fbtft_platform_data) {
    .display = {
     .buswidth = 8,
     .backlight = 1,
    },
    .bgr = true,
    .gpios = (const struct fbtft_gpio []) {
     { "reset", 25 },
     { "dc", 24 },
     { "led", 18 },
     {},
    },
   }
  }

其中一段內容大概是這樣 , 所以就很明顯了 .
Reset接GPIO 25 , D/C接GPIO 24 , LED接GPIO 18
為何是選adafrut22a ? 因為網路上有人回答要用這個 , 雖然是ili9340(說實在我不知道9340跟9341有啥差別 , 還沒去研究) 裡面也有ili9341 name是rpi-disply 我沒試過 .
總之如果你有TFT要驅動 , 可以去看fbtft_driver.c , 去找到對應的 name也好 , modalias也好 ,
接線就參考gpios那一段 .

最後接線是這樣
SDO(MISO) ->Pin21(SPI_MISO) 應該是可以不用接給SD用的
LED -> Pin 12(GPIO 18)
SCK -> Pin 23(SPI_SCLK)
SDI(MOSI) -> Pin 19(SPI_MOSI)
D/C -> Pin18(GPIO 24)
RESET ->Pin 22(GPIO 25)
CS -> Pin 24(SPI_CE0)
GND -> Pin 6
VCC -> Pin 1
接完以後記得要啟動SPI , 我是到raspi-config去設定的 .

這時啟動RetroPie , TFT是還不會驅動的 .
進到console , 不管你是先退出ES 或是ssh連網進去都可
鍵入
sudo modprobe fbtft_device name=adafruit22a rotate=270 fps=60 (關機就會消失)
按下enter後 TFT螢幕會亮起 , 應該就是成功了 , 也可以dmesg|grep spi* 會出現一些資料

這時候鍵入ls /dev/fb*
應該會看到 /dev/fb0跟 /dev/fb1
fb0就是外接的hdmi
fb1就是接的tft
之後鍵入con2fbmap 1 1
就可看到console在TFT上出現了 , 恭喜完成一半 !!!

如果中間有問題 .
可能會需要做
sudo apt-get update
sudo apt-get upgrade
sudo rpi-update
來更新kernel支援fbtft

接下來就是如何讓ES出現在TFT上
原來我天真以為用FRAMEBUFFER=/dev/fb1 emulationstation可以啟動在TFT上 , 我錯了 .

後來想起之前用過的一個git專案(又一神人)
https://github.com/tasanakorn/rpi-fbcp
可以將fb0同步顯示在fb1
安裝步驟如下:
sudo apt-get install cmake
git clone https://github.com/tasanakorn/rpi-fbcp
cd rpi-fbcp/
mkdir build
cd build/
cmake ..
make
sudo install fbcp /usr/local/bin/fbcp
這時鍵入 fbcp &
就可同步顯示 hdmi跟ES , 恭喜完成3/4

接下來就是如何啟動Pi後直接讓TFT顯示RetroPie來玩遊戲了
一樣參考notro的專案
sudo nano /etc/modules-load.d/fbtft.conf
內容如下 :
spi-bcm2835
fbtft_device
存檔

sudo nano /etc/modprobe.d/fbtft.conf
內容如下 :
options  fbtft_device name=adafruit22a rotate=270 fps=60
存檔
上面fbtft_device的參數  可以視不同情況調整
(我有想過買2.4或是2.8直立調整rotate , 也許可以不用切PCB板)

到這裡可以reboot , 如果TFT有直接亮起就對了!

接下來的步驟就是啟動時利用fbcp將畫面同步顯示 ,
由於我是用5吋HDMI , 解析度是800x480
但TFT是320x240
所以這裡用了一個技巧
sudo nano /boot/config.txt
內容:
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=87
hdmi_cvt=320 240 60 6 0 0 0
存檔(如果只是5吋HDMI 可以是hdmi_cvt=800 480 60 6 0 0 0)
這時要注意 , reboot後HDMI顯示可能會怪怪的 .
建議用ssh遠端登入 .

然後
sudo nano /etc/rc.local
加入
/usr/local/bin/fbcp &
存檔

原理就是
先掛載fbtft driver ->設定fb0的解析度固定為320x240 ->透過fbcp 將fb0畫面顯示在fb1上

reboot後應該可成功看到TFT直接進入RetroPie , 可以傷眼玩遊戲了!!!



還沒有實際的成品 .(接下來的步驟都不難 , 就是拉線組裝而已)
因為怕忘記驅動TFT的步驟忘記了 ,
先弄個紀錄 .
困難的都解決了 ,
其它慢慢弄...

全篇仰賴網路上一堆神人 ,
我只是兜起來而已 XD

理論上 , Astro City模型裡面的空間 , 可以塞進去2.2 TFT螢幕 , Pi Zero, 小喇叭 , 
所以只要插上電跟GamePad就可以玩了 ,
Pi Zero沒有音源 .可以參考
https://learn.adafruit.com/introducing-the-raspberry-pi-zero/audio-outputs
https://learn.adafruit.com/adding-basic-audio-ouput-to-raspberry-pi-zero/pi-zero-pwm-audio
來實現Pi Zero Audio .
但我手邊沒有Pi Zero . 覺得還是太貴 , 為何說好5美元的東西 , 看到最便宜要NT.600 ...
我無法接受...


參考
http://marcosgildavid.blogspot.tw/2014/02/getting-ili9341-spi-screen-working-on.html
https://github.com/notro/fbtft/wiki#make-it-permanent-debian-jessie-arch-linux-systemd
https://github.com/tasanakorn/rpi-fbcp
https://learn.adafruit.com/introducing-the-raspberry-pi-zero/audio-outputs
....
族繁不及備載

留言

這個網誌中的熱門文章

RetroPie With WaveShare 3.5inch RPi LCD(A)

WaveShare LCD22A