Raspberry PI Python с преобразователем Adafruit Rotary

Вопрос или проблема

Я запускаю python3 на Raspberry Pi 3:

   Статическое имя хоста: raspberrypi
         Имя значка: компьютер
        Идентификатор машины: 0bd95523f1a44b54abc9402a9f8f6b23
           Идентификатор загрузки: 89ff548a7bb541daa4f9be88d6544fc6
  Операционная система: Raspbian GNU/Linux 10 (buster)
            Ядро: Linux 5.10.103-v7+
      Архитектура: ar

Я пытаюсь использовать ротационный датчик Adafruit (с I2C). Программа для простого тестирования, которую я использую, выглядит следующим образом:

# SPDX-FileCopyrightText: 2021 John Furcean
# SPDX-License-Identifier: MIT

"""Простой тестовый пример для I2C ротационного кодера."""

import board
from adafruit_seesaw import seesaw, rotaryio, digitalio

# Для использования с разъемом STEMMA на QT Py RP2040
# import busio
# i2c = busio.I2C(board.SCL1, board.SDA1)
# seesaw = seesaw.Seesaw(i2c, 0x36)

i2c = board.I2C()  # использует board.SCL и board.SDA
# i2c = board.STEMMA_I2C()  # Для использования встроенного разъема STEMMA QT на микроконтроллере
seesaw = seesaw.Seesaw(i2c, addr=0x36)

seesaw_product = (seesaw.get_version() >> 16) & 0xFFFF
print("Найден продукт {}".format(seesaw_product))
if seesaw_product != 4991:
    print("Загружена неправильная прошивка? Ожидалось 4991")

# Настройка пина seesaw, используемого для чтения нажатий кнопки ручки
# Внутренний подтягивающий резистор включен, чтобы предотвратить плавающее состояние входа
seesaw.pin_mode(24, seesaw.INPUT_PULLUP)
button = digitalio.DigitalIO(seesaw, 24)

button_held = False

encoder = rotaryio.IncrementalEncoder(seesaw)
last_position = None

while True:
    # инвертировать позицию, чтобы положительное вращение было по часовой стрелке
    position = -encoder.position

    if position != last_position:
        last_position = position
        print("Позиция: {}".format(position))

    if not button.value and not button_held:
        button_held = True
        print("Кнопка нажата")

    if button.value and button_held:
        button_held = False
        print("Кнопка отпущена")

Когда я запускаю это, я получаю следующую ошибку:

Трасировка (последний вызов последним):
  Файл "seesaw_rotary_simpletest.py", строка 7, в <module>
    from adafruit_seesaw import seesaw, rotaryio, digitalio
  Файл "/usr/local/lib/python3.7/dist-packages/adafruit_seesaw/seesaw.py", строка 43, в <module>
    from adafruit_bus_device.i2c_device import I2CDevice
  Файл "/usr/local/lib/python3.7/dist-packages/adafruit_bus_device/i2c_device.py", строка 15, в <module>
    from circuitpython_typing import ReadableBuffer, WriteableBuffer
  Файл "/usr/local/lib/python3.7/dist-packages/circuitpython_typing/__init__.py", строка 79
    def read(self, count: Optional[int] = None, /) -> Optional[bytes]:
                                                ^
SyntaxError: неверный синтаксис

Похоже, что что-то неправильно загружается или у меня неправильная версия чего-то.

Ошибка вызвана использованием / как маркера для аргументов, только позиционных, что является новым синтаксисом, добавленным в Python 3.8. Debian buster, на основе которого вам доступна версия ОС, имеет только Python 3.7. Вам нужно использовать более новую ОС или, в противном случае, получить более новую версию Python (используя pyenv или подобное). Это, похоже, связано с зависимостью, а не с самим скриптом, поэтому вы можете попробовать использовать более старые версии зависимостей.

Ответ или решение

Решение проблемы с использованием Rotary Transducer от Adafruit на Raspberry Pi 3

Вы пытаетесь использовать вращающий трансдьюсер (ротари энкодер) от Adafruit в своей программе на Python 3, работающей на Raspberry Pi 3 с операционной системой Raspbian GNU/Linux 10 (Buster). Ошибка, которую вы получаете, указывает на проблему с синтаксисом, связанного с использованием аргументов, доступных только в более поздних версиях Python.

Проблема

Ваш код вызывает ошибку:

SyntaxError: invalid syntax

Ответ на вопрос заключается в следующем: проблема возникает из-за того, что библиотека circuitpython_typing, используемая в вашем коде, содержит синтаксические конструкции, которые стали доступны только в Python версии 3.8 и выше. На вашей системе установлена версия Python 3.7, что и вызывает конфликт при попытке загрузить нужные модули.

Решение проблемы

Вам необходимо обновить ваш Python до более новой версии, чтобы вам стало доступно использование всех возможностей необходимых библиотек:

  1. Обновление операционной системы: Рассмотрите возможность обновления до более свежей версии Raspberry Pi OS, такой как Bullseye, которая поддерживает Python 3.9 и выше. Это лучший вариант, поскольку вы получите не только новый Python, но и все обновления системы в целом.

    Для обновления системы выполните следующие команды:

    sudo apt update
    sudo apt full-upgrade
    sudo apt dist-upgrade
  2. Установка нового Python через pyenv: Если вы хотите остаться на Buster, вы можете использовать pyenv для установки более новой версии Python.

    • Установите зависимости для сборки Python:
      sudo apt install -y make build-essential libssl-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libgdbm-dev liblzma-dev python3-openssl git
    • Установите pyenv с помощью следующих команд:
      curl https://pyenv.run | bash

      Добавьте следующие строки в файл ~/.bashrc:

      export PATH="$HOME/.pyenv/bin:$PATH"
      eval "$(pyenv init --path)"
      eval "$(pyenv init -)"
      eval "$(pyenv virtualenv-init -)"

      После сохранения .bashrc, запустите:

      source ~/.bashrc
    • Установите последнюю версию Python:
      pyenv install 3.10.0
      pyenv global 3.10.0
  3. Переустановка библиотек: После обновления Python, рекомендуется переустановить все зависимости вашего проекта:

    pip install -U adafruit-circuitpython-seesaw

Проверка

После выполнения указанных шагов, запустите свой скрипт снова. Если все было выполнено корректно, ошибка синтаксиса должна исчезнуть, и поведение вашего ротари энкодера подтвердится правильной работой.

Заключение

Обновление Python или установка более новой версии системы — это лучший способ устранить возникшую проблему с совместимостью. Регулярное обновление программного обеспечения не только расширяет ваши возможности, но и сохраняет безопасность вашей системы.

Оцените материал
Добавить комментарий

Капча загружается...