Respeaker4 : animation des Leds (wyoming-satellite) avec ou sans pixel_ring

Bonjour,

Mon problème

Je n’arrive pas à mettre en place l’animation des LEDs sur mon Respeaker 4

J’ai installé un assistant vocal satellite Wyoming sur un Raspberrypi 3 en suivant ce tuto :

Cela fonctionne correctement mais je souhaiterais avoir des animations pour les LEDs de mon Respeaker 4 hat.

Il existe une librairie, pixel_ring, qui permet l’animation des LEDs à la façon Echo ou Google (selon le pattern que l’on choisit) :

Malheureusement, je n’arrive pas à l’intégrer correctement, les LEDs font n’importe quoi !

Mon test d’intégration (fichier 4mic_service.py) :

original =>

modifié =>

#!/usr/bin/env python3
"""Controls the LEDs on the ReSpeaker 4mic HAT."""
import argparse
#[TRUNCATE...]
from wyoming.wake import Detection

#########
# Ajout :
from pixel_ring import pixel_ring
#########

_LOGGER = logging.getLogger()

#[TRUNCATE...]


async def main() -> None:
#[TRUNCATE...]


# -----------------------------------------------------------------------------

_BLACK = (0, 0, 0)
#[TRUNCATE...]


class LEDsEventHandler(AsyncEventHandler):
#[TRUNCATE...]

    async def handle_event(self, event: Event) -> bool:
        _LOGGER.debug(event)

#########
# Ajout :
        pixel_ring.change_pattern('echo')
#########

        if StreamingStarted.is_type(event.type):
            self.color(_YELLOW)
        elif Detection.is_type(event.type):
            #self.color(_BLUE)
            #await asyncio.sleep(1.0)  # show for 1 sec
#########
# Ajout :
            pixel_ring.wakeup()
#########
        elif VoiceStarted.is_type(event.type):
            self.color(_YELLOW)
        elif Transcript.is_type(event.type):
            self.color(_GREEN)
            await asyncio.sleep(1.0)  # show for 1 sec
        elif StreamingStopped.is_type(event.type):
            self.color(_BLACK)
        elif RunSatellite.is_type(event.type):
            self.color(_BLACK)
        elif SatelliteConnected.is_type(event.type):
            # Flash
            for _ in range(3):
                self.color(_GREEN)
                await asyncio.sleep(0.3)
                self.color(_BLACK)
                await asyncio.sleep(0.3)
        elif SatelliteDisconnected.is_type(event.type):
            self.color(_RED)

        return True

    def color(self, rgb: Tuple[int, int, int]) -> None:
        for i in range(NUM_LEDS):
            self.leds.set_pixel(i, rgb[0], rgb[1], rgb[2])

        self.leds.show()


# -----------------------------------------------------------------------------
#[TRUNCATE...]

J’ai voulu essayé un code custom mais le problème de celui ci est que les LEDs ne changent plus pour les évènements (wake, listen etc.). Par contre j’ai bien mes LEDs de différentes couleurs qui tournent :

#!/usr/bin/env python3
"""Controls the LEDs on the ReSpeaker 4mic HAT."""
#[TRUNCATE...]

    async def handle_event(self, event: Event) -> bool:
        _LOGGER.debug(event)

        if StreamingStarted.is_type(event.type):
            self.color(_YELLOW)
        elif Detection.is_type(event.type):
            self.color(_BLUE)
            await asyncio.sleep(1.0)  # show for 1 sec
        elif VoiceStarted.is_type(event.type):
            self.color(_YELLOW)
        elif Transcript.is_type(event.type):
            self.color(_GREEN)
            await asyncio.sleep(1.0)  # show for 1 sec
        elif StreamingStopped.is_type(event.type):
            #self.color(_BLACK)
#########
# Ajout :
            # Couleurs random pour chaque led
            self.leds.set_pixel(1, 0,25,25,1)
            self.leds.set_pixel(2, 25,25,25,1)
            self.leds.set_pixel(3, 25,50,25,1)
            self.leds.set_pixel(4, 0,25,50,1)
            self.leds.set_pixel(5, 100,25,25,1)
            self.leds.set_pixel(6, 0,100,25,1)
            self.leds.set_pixel(7, 0,100,100,1)
            self.leds.set_pixel(8, 0,25,255,1)
            self.leds.set_pixel(9, 0,255,25,1)
            self.leds.set_pixel(10, 255,25,25,1)
            self.leds.set_pixel(11, 110,250,125,1)
            self.leds.set_pixel(0, 50,75,105,1)
            self.leds.show()
            # Différents essais avec while et sleep
            #while True:
            while StreamingStopped.is_type(event.type):
                #time.sleep(0.2)
                await asyncio.sleep(0.3)
                self.leds.rotate()
                self.leds.show()
#########
        elif RunSatellite.is_type(event.type):
            self.color(_BLACK)
        elif SatelliteConnected.is_type(event.type):
            # Flash
            for _ in range(3):
                self.color(_GREEN)
                await asyncio.sleep(0.3)
                self.color(_BLACK)
                await asyncio.sleep(0.3)
        elif SatelliteDisconnected.is_type(event.type):
            self.color(_RED)

        return True


#[TRUNCATE...]

Le soucis étant que je ne m’y connait pas du tout en Python… :confused:

Merci par avance de votre aide :slight_smile:

Ma configuration


Raspberry Pi 3 + Respeaker 4 hat

Wyoming-satellite