Занятые GPIO Django Raspberry Pi 5 ⇐ Python
Занятые GPIO Django Raspberry Pi 5
При попытке подключиться к GPIO RPi 5 с помощью gpiozero я сталкиваюсь с ошибкой, сообщающей, что GPIO занят. Контекст таков: я запускаю этот код в задаче Celery в Django.
Проблема аналогична этой, но предоставленное исправление не сработало в этом контексте.
Полная трассировка ошибок
Исключение в потоке django-main-thread: Traceback (последний вызов последний): Файл "/usr/lib/python3/dist-packages/gpiozero/pins/pi.py", строка 408, в контакте пин = self.pins[информация] ~~~~~~~~~^^^^^^ KeyError: PinInfo(number=36, name='GPIO16', name=frozenset({'GPIO16', 16, 'BOARD36', 'WPI27', 'BCM16', 'J8:36', '16'}), pull ='', row=18, col=2, интерфейсы=frozenset({'', 'uart', 'spi', 'dpi', 'gpio'})) Во время обработки вышеуказанного исключения произошло другое исключение: Traceback (последний вызов последний): Файл «/usr/lib/python3.11/threading.py», строка 1038, в _bootstrap_inner self.run() Файл "/usr/lib/python3.11/threading.py", строка 975, в запуске self._target(*self._args, **self._kwargs) Файл "/usr/lib/python3/dist-packages/django/utils/autoreload.py", строка 64, в оболочке fn(*args, **kwargs) Файл «/usr/lib/python3/dist-packages/django/core/management/commands/runserver.py», строка 110, в файле Internal_run. autoreload.raise_last_Exception() Файл «/usr/lib/python3/dist-packages/django/utils/autoreload.py», строка 87, в raise_last_Exception. вызвать _исключение[1] Файл "/usr/lib/python3/dist-packages/django/core/management/__init__.py", строка 375, выполняется autoreload.check_errors(django.setup)() Файл "/usr/lib/python3/dist-packages/django/utils/autoreload.py", строка 64, в оболочке fn(*args, **kwargs) Файл «/usr/lib/python3/dist-packages/django/__init__.py», строка 24, в настройке apps.populate(settings.INSTALLED_APPS) Файл "/usr/lib/python3/dist-packages/django/apps/registry.py", строка 91, в заполнении app_config = AppConfig.create(запись) ^^^^^^^^^^^^^^^^^^^^^^^ Файл "/usr/lib/python3/dist-packages/django/apps/config.py", строка 224, в файле create import_module (запись) Файл «/usr/lib/python3.11/importlib/__init__.py», строка 126, в import_module return _bootstrap._gcd_import(имя[уровень:], пакет, уровень) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ Файл «», строка 1206, в _gcd_import Файл «», строка 1178, в _find_and_load Файл «», строка 1149, в _find_and_load_unlocked Файл «», строка 690, в _load_unlocked Файл «», строка 940, в exec_module Файл «», строка 241, в _call_with_frames_removed Файл «/home/user/Desktop/PressureSwitchTestGUI/SD_18_GUI/app/__init__.py», строка 3, в из приложения импорта .celery как celery_app Файл «/home/user/Desktop/PressureSwitchTestGUI/SD_18_GUI/app/celery.py», строка 9, в из app.tasks импортировать ввод-вывод Файл «/home/user/Desktop/PressureSwitchTestGUI/SD_18_GUI/app/tasks.py», строка 36, в сервопривод = PWMLED(servoControlPin) ^^^^^^^^^^^^^^^^^^^^^^^ Файл «/usr/lib/python3/dist-packages/gpiozero/devices.py», строка 103, в __call__ self = super().__call__(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл "/usr/lib/python3/dist-packages/gpiozero/output_devices.py", строка 392, в __init__ super().__init__(pin, active_high=active_high, Initial_value=None, Файл «/usr/lib/python3/dist-packages/gpiozero/output_devices.py», строка 74, в __init__ super().__init__(pin, pin_factory=pin_factory) Файл «/usr/lib/python3/dist-packages/gpiozero/mixins.py», строка 75, в __init__ super().__init__(*args, **kwargs) Файл "/usr/lib/python3/dist-packages/gpiozero/devices.py", строка 549, в __init__ штырь = self.pin_factory.pin(pin) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл "/usr/lib/python3/dist-packages/gpiozero/pins/pi.py", строка 410, в контакте штифт = self.pin_class(сам, информация) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл «/usr/lib/python3/dist-packages/gpiozero/pins/lgpio.py», строка 126, в __init__ lgpio.gpio_claim_input( Файл «/usr/lib/python3/dist-packages/lgpio.py», строка 755, в gpio_claim_input return _u2i(_lgpio._gpio_claim_input(handle&0xffff, lFlags, gpio)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ Файл «/usr/lib/python3/dist-packages/lgpio.py», строка 458, в _u2i поднять ошибку (error_text (v)) lgpio.ошибка: «GPIO занят» Вот файл settings.py Django
""" Настройки Django для проекта проекта. Создано «django-admin startproject» с использованием Django 5.0. Дополнительную информацию об этом файле см. https://docs.djangoproject.com/en/5.0/topics/settings/ Полный список настроек и их значений см. https://docs.djangoproject.com/en/5.0/ref/settings/ """ из пути импорта pathlib # Создайте пути внутри проекта следующим образом: BASE_DIR/'subdir'. BASE_DIR = Путь(__file__).resolve().parent.parent # Настройки быстрого старта разработки - непригодны для производства # См. https://docs.djangoproject.com/en/5.0/h ... checklist/. # ПРЕДУПРЕЖДЕНИЕ БЕЗОПАСНОСТИ: не запускайте с включенной отладкой в рабочей среде! ОТЛАДКА = Ложь ALLOWED_HOSTS = ['локальный хост'] # Определение приложения INSTALLED_APPS = [ 'приложение', 'Дафна', 'каналы', 'django.contrib.admin', 'джанго.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] ПРОМЕЖУТОЧНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'project.urls' ШАБЛОНЫ = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'ДИРС': [], 'APP_DIRS': Верно, 'ПАРАМЕТРЫ': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'project.wsgi.application' # База данных # https://docs.djangoproject.com/en/5.0/r ... #databases БАЗЫ ДАННЫХ = { 'по умолчанию': { «ДВИГАТЕЛЬ»: «django.db.backends.sqlite3», «ИМЯ»: BASE_DIR / «db.sqlite3», } } # Проверка пароля # https://docs.djangoproject.com/en/5.0/r ... validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Интернационализация # https://docs.djangoproject.com/en/5.0/topics/i18n/ LANGUAGE_CODE = 'ru-ru' TIME_ZONE = 'UTC' USE_I18N = Истина USE_TZ = Истина # Статические файлы (CSS, JavaScript, изображения) # https://docs.djangoproject.com/en/5.0/h ... tic-files/ STATIC_URL = 'статический/' # Тип поля первичного ключа по умолчанию # https://docs.djangoproject.com/en/5.0/r ... auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' КЭШИ = { "по умолчанию": { "BACKEND": "django_redis.cache.RedisCache", "РАСПОЛОЖЕНИЕ": "redis://127.0.0.1:6379/1", "ПАРАМЕТРЫ": { "CLIENT_CLASS": "django_redis.client.DefaultClient" }, "KEY_PREFIX": "пример" } } # django_celery/settings.py # ... # Настройки сельдерея CELERY_BROKER_URL = "redis://localhost:6379" CELERY_RESULT_BACKEND = "redis://localhost:6379" # Дафна ASGI_APPLICATION = "project.asgi.application" Код Tasks.py
# ПРЕДВАРИТЕЛЬНЫЕ РЕКВИЗИТЫ ЗАДАЧИ СЕЛЬДЕРА из импорта сельдерея Shared_task из каналов.layers импортируйте get_channel_layer из asgiref.sync импортировать async_to_sync # ОБЩИЕ ПРЕДПОСЫЛКИ импорт даты и времени время импорта из коллекций импортировать дек # ПРЕДВАРИТЕЛЬНЫЕ ТРЕБОВАНИЯ АЦП импортная доска импортный бизнес импортировать adafruit_ads1x15.ads1115 как ADC из adafruit_ads1x15.analog_in импортировать AnalogIn как AnalogRead # НЕОБХОДИМЫЕ GPIO из gpiozero импортировать PWMLED, Кнопка #from gpiozero.pins.lgpio import LGPIOFactory # КОНСТАНТЫ Отношение напряжения и давления = 300/5 # КНОПКИ И ШИМ #факт = LGPIOFactory() ПрерываниеПин = 21 сервоКонтрольПин = 16 давлениеSwitchReadPin = 12 #servo = PWMLED(servoControlPin, pin_factory=факт) #interruptButton = Кнопка(interruptPin, pull_up=True, pin_factory=факт) #switchState = Button(pressureSwitchReadPin, pull_up=True, pin_factory=факт) сервопривод = PWMLED(servoControlPin) прерываниеButton = Кнопка (interruptPin, pull_up=True) switchState = Кнопка (pressureSwitchReadPin, pull_up = True)
При попытке подключиться к GPIO RPi 5 с помощью gpiozero я сталкиваюсь с ошибкой, сообщающей, что GPIO занят. Контекст таков: я запускаю этот код в задаче Celery в Django.
Проблема аналогична этой, но предоставленное исправление не сработало в этом контексте.
Полная трассировка ошибок
Исключение в потоке django-main-thread: Traceback (последний вызов последний): Файл "/usr/lib/python3/dist-packages/gpiozero/pins/pi.py", строка 408, в контакте пин = self.pins[информация] ~~~~~~~~~^^^^^^ KeyError: PinInfo(number=36, name='GPIO16', name=frozenset({'GPIO16', 16, 'BOARD36', 'WPI27', 'BCM16', 'J8:36', '16'}), pull ='', row=18, col=2, интерфейсы=frozenset({'', 'uart', 'spi', 'dpi', 'gpio'})) Во время обработки вышеуказанного исключения произошло другое исключение: Traceback (последний вызов последний): Файл «/usr/lib/python3.11/threading.py», строка 1038, в _bootstrap_inner self.run() Файл "/usr/lib/python3.11/threading.py", строка 975, в запуске self._target(*self._args, **self._kwargs) Файл "/usr/lib/python3/dist-packages/django/utils/autoreload.py", строка 64, в оболочке fn(*args, **kwargs) Файл «/usr/lib/python3/dist-packages/django/core/management/commands/runserver.py», строка 110, в файле Internal_run. autoreload.raise_last_Exception() Файл «/usr/lib/python3/dist-packages/django/utils/autoreload.py», строка 87, в raise_last_Exception. вызвать _исключение[1] Файл "/usr/lib/python3/dist-packages/django/core/management/__init__.py", строка 375, выполняется autoreload.check_errors(django.setup)() Файл "/usr/lib/python3/dist-packages/django/utils/autoreload.py", строка 64, в оболочке fn(*args, **kwargs) Файл «/usr/lib/python3/dist-packages/django/__init__.py», строка 24, в настройке apps.populate(settings.INSTALLED_APPS) Файл "/usr/lib/python3/dist-packages/django/apps/registry.py", строка 91, в заполнении app_config = AppConfig.create(запись) ^^^^^^^^^^^^^^^^^^^^^^^ Файл "/usr/lib/python3/dist-packages/django/apps/config.py", строка 224, в файле create import_module (запись) Файл «/usr/lib/python3.11/importlib/__init__.py», строка 126, в import_module return _bootstrap._gcd_import(имя[уровень:], пакет, уровень) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ Файл «», строка 1206, в _gcd_import Файл «», строка 1178, в _find_and_load Файл «», строка 1149, в _find_and_load_unlocked Файл «», строка 690, в _load_unlocked Файл «», строка 940, в exec_module Файл «», строка 241, в _call_with_frames_removed Файл «/home/user/Desktop/PressureSwitchTestGUI/SD_18_GUI/app/__init__.py», строка 3, в из приложения импорта .celery как celery_app Файл «/home/user/Desktop/PressureSwitchTestGUI/SD_18_GUI/app/celery.py», строка 9, в из app.tasks импортировать ввод-вывод Файл «/home/user/Desktop/PressureSwitchTestGUI/SD_18_GUI/app/tasks.py», строка 36, в сервопривод = PWMLED(servoControlPin) ^^^^^^^^^^^^^^^^^^^^^^^ Файл «/usr/lib/python3/dist-packages/gpiozero/devices.py», строка 103, в __call__ self = super().__call__(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл "/usr/lib/python3/dist-packages/gpiozero/output_devices.py", строка 392, в __init__ super().__init__(pin, active_high=active_high, Initial_value=None, Файл «/usr/lib/python3/dist-packages/gpiozero/output_devices.py», строка 74, в __init__ super().__init__(pin, pin_factory=pin_factory) Файл «/usr/lib/python3/dist-packages/gpiozero/mixins.py», строка 75, в __init__ super().__init__(*args, **kwargs) Файл "/usr/lib/python3/dist-packages/gpiozero/devices.py", строка 549, в __init__ штырь = self.pin_factory.pin(pin) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл "/usr/lib/python3/dist-packages/gpiozero/pins/pi.py", строка 410, в контакте штифт = self.pin_class(сам, информация) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл «/usr/lib/python3/dist-packages/gpiozero/pins/lgpio.py», строка 126, в __init__ lgpio.gpio_claim_input( Файл «/usr/lib/python3/dist-packages/lgpio.py», строка 755, в gpio_claim_input return _u2i(_lgpio._gpio_claim_input(handle&0xffff, lFlags, gpio)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ Файл «/usr/lib/python3/dist-packages/lgpio.py», строка 458, в _u2i поднять ошибку (error_text (v)) lgpio.ошибка: «GPIO занят» Вот файл settings.py Django
""" Настройки Django для проекта проекта. Создано «django-admin startproject» с использованием Django 5.0. Дополнительную информацию об этом файле см. https://docs.djangoproject.com/en/5.0/topics/settings/ Полный список настроек и их значений см. https://docs.djangoproject.com/en/5.0/ref/settings/ """ из пути импорта pathlib # Создайте пути внутри проекта следующим образом: BASE_DIR/'subdir'. BASE_DIR = Путь(__file__).resolve().parent.parent # Настройки быстрого старта разработки - непригодны для производства # См. https://docs.djangoproject.com/en/5.0/h ... checklist/. # ПРЕДУПРЕЖДЕНИЕ БЕЗОПАСНОСТИ: не запускайте с включенной отладкой в рабочей среде! ОТЛАДКА = Ложь ALLOWED_HOSTS = ['локальный хост'] # Определение приложения INSTALLED_APPS = [ 'приложение', 'Дафна', 'каналы', 'django.contrib.admin', 'джанго.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] ПРОМЕЖУТОЧНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'project.urls' ШАБЛОНЫ = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'ДИРС': [], 'APP_DIRS': Верно, 'ПАРАМЕТРЫ': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'project.wsgi.application' # База данных # https://docs.djangoproject.com/en/5.0/r ... #databases БАЗЫ ДАННЫХ = { 'по умолчанию': { «ДВИГАТЕЛЬ»: «django.db.backends.sqlite3», «ИМЯ»: BASE_DIR / «db.sqlite3», } } # Проверка пароля # https://docs.djangoproject.com/en/5.0/r ... validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Интернационализация # https://docs.djangoproject.com/en/5.0/topics/i18n/ LANGUAGE_CODE = 'ru-ru' TIME_ZONE = 'UTC' USE_I18N = Истина USE_TZ = Истина # Статические файлы (CSS, JavaScript, изображения) # https://docs.djangoproject.com/en/5.0/h ... tic-files/ STATIC_URL = 'статический/' # Тип поля первичного ключа по умолчанию # https://docs.djangoproject.com/en/5.0/r ... auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' КЭШИ = { "по умолчанию": { "BACKEND": "django_redis.cache.RedisCache", "РАСПОЛОЖЕНИЕ": "redis://127.0.0.1:6379/1", "ПАРАМЕТРЫ": { "CLIENT_CLASS": "django_redis.client.DefaultClient" }, "KEY_PREFIX": "пример" } } # django_celery/settings.py # ... # Настройки сельдерея CELERY_BROKER_URL = "redis://localhost:6379" CELERY_RESULT_BACKEND = "redis://localhost:6379" # Дафна ASGI_APPLICATION = "project.asgi.application" Код Tasks.py
# ПРЕДВАРИТЕЛЬНЫЕ РЕКВИЗИТЫ ЗАДАЧИ СЕЛЬДЕРА из импорта сельдерея Shared_task из каналов.layers импортируйте get_channel_layer из asgiref.sync импортировать async_to_sync # ОБЩИЕ ПРЕДПОСЫЛКИ импорт даты и времени время импорта из коллекций импортировать дек # ПРЕДВАРИТЕЛЬНЫЕ ТРЕБОВАНИЯ АЦП импортная доска импортный бизнес импортировать adafruit_ads1x15.ads1115 как ADC из adafruit_ads1x15.analog_in импортировать AnalogIn как AnalogRead # НЕОБХОДИМЫЕ GPIO из gpiozero импортировать PWMLED, Кнопка #from gpiozero.pins.lgpio import LGPIOFactory # КОНСТАНТЫ Отношение напряжения и давления = 300/5 # КНОПКИ И ШИМ #факт = LGPIOFactory() ПрерываниеПин = 21 сервоКонтрольПин = 16 давлениеSwitchReadPin = 12 #servo = PWMLED(servoControlPin, pin_factory=факт) #interruptButton = Кнопка(interruptPin, pull_up=True, pin_factory=факт) #switchState = Button(pressureSwitchReadPin, pull_up=True, pin_factory=факт) сервопривод = PWMLED(servoControlPin) прерываниеButton = Кнопка (interruptPin, pull_up=True) switchState = Кнопка (pressureSwitchReadPin, pull_up = True)
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение