これにRaspberryPiをつなげてみました。
「Raspberry Pi で framebuffer で遊ぶ」
https://qiita.com/nanbuwks/items/71062ada859846ec89eb
そのときに工夫したアレコレ。
環境
- Elecrow 5 Inch 800x480 TFT Raspberry Pi Touch Display with GPIO Backlight Control
- Raspberry Pi 3B
- Raspberry Pi OS Lite (2024-07-04-raspios-bookworm-armhf-lite.img.xz)
ドキュメント
わかりずらいけど、wiki はここ。
/boot/firmware/config.txt
wiki の説明に従って、以下の内容を /boot/firmware/config.txt
に追加する。
# --- added by elecrow-pitft-setup ---
hdmi_force_hotplug=1
max_usb_current=1
hdmi_drive=1
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=0
# --- end elecrow-pitft-setup ---
デフォルトだとブートメッセージは表示されないけれど、上記設定をすると表示されるようになりました。
gpiozero ライブラリとの競合
上記の内容を /boot/firmware/config.txt に書くと、 gpiozero ライブラリを使ったときに以下のエラーが出るようになりました。
$ python3 ac.py
/usr/lib/python3/dist-packages/gpiozero/pins/pi.py:465: SPISoftwareFallback: failed to initialize hardware SPI, falling back to software (error was: 'can not open SPI device')
warnings.warn(
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/gpiozero/devices.py", line 75, in __call__
self = cls._instances[key]()
~~~~~~~~~~~~~~^^^^^
KeyError: ('GPIO11', 'GPIO8')
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/gpiozero/pins/pi.py", line 408, in pin
pin = self.pins[info]
~~~~~~~~~^^^^^^
KeyError: PinInfo(number=24, name='GPIO8', names=frozenset({'BOARD24', 'GPIO8', 8, 'J8:24', '8', 'WPI10', 'BCM8'}), pull='', row=12, col=2, interfaces=frozenset({'spi', '', 'gpio', 'dpi'}))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/pi/ac.py", line 17, in <module>
mcp300802 = MCP3008(channel=2, device=0)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/gpiozero/devices.py", line 103, in __call__
self = super().__call__(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/gpiozero/spi_devices.py", line 428, in __init__
super().__init__(channel, differential, max_voltage, **spi_args)
File "/usr/lib/python3/dist-packages/gpiozero/spi_devices.py", line 286, in __init__
super().__init__(channel, 10, differential, max_voltage, **spi_args)
File "/usr/lib/python3/dist-packages/gpiozero/spi_devices.py", line 182, in __init__
super().__init__(bits, max_voltage, **spi_args)
File "/usr/lib/python3/dist-packages/gpiozero/spi_devices.py", line 129, in __init__
super().__init__(shared=True, **spi_args)
File "/usr/lib/python3/dist-packages/gpiozero/spi_devices.py", line 32, in __init__
self._spi = self.pin_factory.spi(**spi_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/gpiozero/pins/pi.py", line 469, in spi
return self._get_spi_class(shared, hardware=False)(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/gpiozero/devices.py", line 78, in __call__
self = super().__call__(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/gpiozero/pins/spi.py", line 47, in __init__
self._select = OutputDevice(
^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/gpiozero/devices.py", line 103, in __call__
self = super().__call__(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/gpiozero/output_devices.py", line 74, in __init__
super().__init__(pin, pin_factory=pin_factory)
File "/usr/lib/python3/dist-packages/gpiozero/mixins.py", line 75, in __init__
super().__init__(*args, **kwargs)
File "/usr/lib/python3/dist-packages/gpiozero/devices.py", line 549, in __init__
pin = self.pin_factory.pin(pin)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/gpiozero/pins/pi.py", line 410, in pin
pin = self.pin_class(self, info)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/gpiozero/pins/lgpio.py", line 126, in __init__
lgpio.gpio_claim_input(
File "/usr/lib/python3/dist-packages/lgpio.py", line 755, in gpio_claim_input
return _u2i(_lgpio._gpio_claim_input(handle&0xffff, lFlags, gpio))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/lgpio.py", line 458, in _u2i
raise error(error_text(v))
lgpio.error: 'GPIO busy'
また、以下の内容とも競合し、スプラッシュがでなくなってしまいました。
「RaspberryPi Lite で起動スプラッシュを設定する」
https://qiita.com/nanbuwks/items/5c9bde5dce676de623a2
/boot/firmware/config.txt のここに問題があるようです。
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
これをコメントアウトすると、gpiozero も スプラッシュも正常に動作するようになりました。
ローテートはうまくいかない
HDMI コネクタは液晶上側にあります。向き変更アダプタがついてますが、それでもコネクタの位置が取り回しが良くないので液晶下側に設定できないかな?
電源供給
電源供給用のUSBポートがありますがかっこわるいので適当なところから電源を供給するようにしています。
display_rotate=1
fbcon=rotate:2
lcd_rorate=2
上記の内容1つづつ、 /boot/firmware/config.txt
に追加して試してみましたが、全て機能しませんでした。