Обновил Raspberry PI 4 с Debian Buster до Debian Bullseye и подключил схему управления оборотами вентилятора чтобы сделать его тише. Для управления PWM я использую GPIO 16.
https://www.raspberrypi.org/documentation/computers/os.html |
В прошлый раз я тестировал на OpenELEC с python 2.7, но в Bullseye используется python 3.9.2. Для работы с GPIO в Debian нужно установить пакет python3-rpi.gpio
$ sudo apt-get update $ sudo apt-get install python3-rpi.gpio
Теперь можно установить сервис для управления оборотами в зависимости от температуры процессора
$ git clone https://github.com/tataranovich/Raspberry-Pi-PWM-fan.git $ cd ./Raspberry-Pi-PWM-fan/ $ sudo python3 fan.py Traceback (most recent call last): File "/home/andrey/Raspberry-Pi-PWM-fan/fan.py", line 42, in <module> GPIO.setup(FAN_PIN, GPIO.OUT, initial=GPIO.LOW) RuntimeError: Not running on a RPi!
Судя по ошибке RPi.GPIO не определил Raspberry PI 4. Подтверждение этому нашлось в Wiki Debian. Проблему с определением платы уже решили в upstream, но в Debian еще нет исправления (подробности в #976114).
Я собрал последний срез из репозитария в пакет для Debian Bullseye (arm64) и залил в свой репозитарий.
$ sudo apt-get install -y curl gnupg $ curl -fsSL http://www.tataranovich.com/debian/gpg | sudo apt-key add - $ APT_SOURCE='deb http://www.tataranovich.com/debian bullseye main' $ echo $APT_SOURCE | sudo tee /etc/apt/sources.list.d/tataranovich.list $ sudo apt-get update $ sudo apt-get install -t bullseye python3-rpi.gpio $ $ apt policy python3-rpi.gpio python3-rpi.gpio: Installed: 0.7.1a4-1 Candidate: 0.7.1a4-1 Version table: *** 0.7.1a4-1 500 500 http://www.tataranovich.com/debian bullseye/main arm64 Packages 100 /var/lib/dpkg/status 0.7.0-0.2+b2 990 990 http://deb.debian.org/debian bullseye/main arm64 Packages
После обновления пакета python3-rpi.gpio до версии 0.7.1a4-1 ошибка меняется
$ sudo python3 fan.py Traceback (most recent call last): File "/home/andrey/Raspberry-Pi-PWM-fan/fan.py", line 42, in <module> GPIO.setup(FAN_PIN, GPIO.OUT, initial=GPIO.LOW) RuntimeError: Mmap of GPIO registers failed
Решение есть в той же Wiki Debian. Нужно передать ядру параметр iomem=relaxed
. Для этого создаем файл /etc/default/raspi-extra-cmdline и записываем в него нужное значение (важно чтобы там была только одна строка без комментариев)
$ echo 'iomem=relaxed' | sudo tee /etc/default/raspi-extra-cmdline $ sudo update-initramfs -u -k all $ cat /boot/firmware/cmdline.txt console=tty0 console=ttyS1,115200 root=/dev/sda2 rw fsck.repair=yes net.ifnames=0 rootwait iomem=relaxed $ sudo reboot
После перезагрузки GPIO начинает работать без проблем.
Комментариев нет:
Отправить комментарий