Показания GPIO и пересылка OSC с использованием Python в Raspberry PiPython

Программы на Python
Ответить
Anonymous
 Показания GPIO и пересылка OSC с использованием Python в Raspberry Pi

Сообщение Anonymous »

Я пытаюсь настроить простой сервер Raspberry Pi, который отправляет сообщение OSC при нажатии кнопки. Мой план состоял в том, чтобы прочитать GPIO с помощью сценария Python и отправить сообщение OSC в PureData, работающую на том же устройстве.
Проблема, которая меня не дает, заключается в том, что я использую gpiozero (установленный глобально) для доступа к своему GPIO, который, похоже, не работает в виртуальной среде (это приводит меня к ошибке RuntimeError: не удалось добавить обнаружение границ). Но пока я запускаю это без виртуальной среды, все в порядке. Проблема в том, что я не могу импортировать python-osc в свой скрипт Python, не находясь в виртуальной среде.
Есть идеи, как мне выйти из этой лазейки? Может быть, есть другая библиотека, которая лучше подойдет для этой комбинации? Объединение показаний GPIO и обмена сообщениями OSC не кажется таким уж странным.
Я работаю с Raspberry Pi 3B+, использую ОС Trixie и Python 3.
Заранее большое спасибо за любые возможные подсказки!!
Я вставляю сюда свой код:
print("Hello from Raspberry Pi")

from gpiozero import Button, LED
from datetime import datetime
from pathlib import Path
from signal import pause

from pythonosc import udp_client
from pythonosc import dispatcher
from pythonosc import osc_server
import argparse
import threading

# --- GPIO Setup ---
BUTTON_1 = Button(4, pull_up=True, bounce_time=0.05)
BUTTON_2 = Button(5, pull_up=True, bounce_time=0.05)
LED_1 = LED(22)
LED_2 = LED(27)
SAMPLE_RATE = 44100 # standard sample rate
DURATION = 2.0 # example duration in seconds

# Microphone state memory
mic1_state = 0
mic2_state = 0

# --- File Management ---
BASE_DIR = Path(__file__).resolve().parent
DATA_DIR = BASE_DIR / "data"
DATA_DIR.mkdir(exist_ok=True)

def record_audio(prefix):
timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
filename = f"{prefix}_{timestamp}.wav"
print (f"Recording audio: {filename} ...")
# TODO: add actual audio recording

def toggle_mic_1():
global mic1_state
mic1_state = 1 - mic1_state
print(f"[OSC send] /mic1 {mic1_state}")
client.send_message("/mic1", mic1_state)
record_audio("A")

def toggle_mic_2():
global mic2_state
mic2_state = 1 - mic2_state
print(f"[OSC send] /mic2 {mic2_state}")
client.send_message("/mic2", mic2_state)
record_audio("B")

# --- Button Handlers ---
BUTTON_1.when_pressed = lambda: toggle_mic_1
BUTTON_2.when_pressed = lambda: toggle_mic_2

# --- Incoming OSC Handlers ---
def led1_handler(address, value):
print(f"[OSC recv] {address} {value}")
if value == 1:
LED_1.on()
else:
LED_1.off()

def led2_handler(address, value):
print(f"[OSC recv] {address} {value}")
if value == 1:
LED_2.on()
else:
LED_2.off()

# --- OSC Server Thread ---
def start_osc_listener():
disp = dispatcher.Dispatcher()
disp.map("/led1", led1_handler)
disp.map("/led2", led2_handler)

server = osc_server.ThreadingOSCUDPServer(("0.0.0.0", 8001), disp)
print("Listening for OSC on port 8001...")
server.serve_forever()

if __name__ == "__main__":
# Start OSC listener in a separate thread
parser = argparse.ArgumentParser()
parser.add_argument("--ip", default="127.0.0.1",
help="The ip of the OSC server")
parser.add_argument("--port", type=int, default=8000,
help="The port the OSC server is listening on")
args= parser.parse_args()

client=udp_client.SimpleUDPClient(args.ip, args.port)

# Start callback listener thread
listener_thread = threading.Thread(target=start_osc_listener, daemon=True)
listener_thread.start()

print("Ready. Waiting...")

# --- Keep script alive ---
pause()


Подробнее здесь: https://stackoverflow.com/questions/798 ... spberry-pi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»