Google AIY 보이스 키트의 기기 동작을 사용하여 LED를 제어해 보세요.

Google Assistant SDK를 업데이트하는 데 기기 액션 구현이 있습니다.
샘플 코드를 들여다 보면 어쩐지 그것 같은 기술이 있거나, 장치 등록의 순서로 수수께끼의 키워드가 나오거나 했기 때문에, 어쩐지 사용할 수 있을까? 라고 하는 곳으로부터, 실제로 놀아 보았습니다.

준비



이전 기사 까지의 순서로 Voice kit를 사용할 수 있게 되어 있다고 합니다.
또한 샘플 코드는 이전 기사에서 복사 및 편집한 것을 계속 사용합니다.

나중에 설명하겠지만 보이스 HAT에 LED를 연결하기 위해 LED를 준비하십시오.

기기 등록 업데이트



이미 등록된 기기의 정보를 업데이트하여 기기가 특정 작업에 반응하도록 합니다.
먼저 장치 모델 정보를 업데이트합니다.
(env) pi@raspberrypi:~/AIY-voice-kit-python $ googlesamples-assistant-devicetool register-model --manufacturer "Assistant SDK developer" --product-name "Assistant SDK light" --type LIGHT --model <model-name> --trait action.devices.traits.OnOff --trait action.devices.traits.Brightness --trait action.devices.traits.ColorTemperature

여기서 나오는 --type--trait 의 종류는 Google Assistant SDK 문서 를 참고로 선택합니다. 위의 예에서는 라이트의 온 오프, 밝기, 색을 조정하는 옵션을 붙이고 있습니다.

명령을 실행하고 성공적으로 업데이트되면 확실히 확인하십시오. 다음과 같은 출력을 얻을 수 있습니다.
(env) pi@raspberrypi:~/AIY-voice-kit-python $ googlesamples-assistant-devicetool list --model
Device Model Id: <model-name>
        Project Id: <Project ID>
        Device Type: action.devices.types.LIGHT
        Trait action.devices.traits.Brightness
        Trait action.devices.traits.ColorTemperature
        Trait action.devices.traits.OnOff


확인이 완료되면 기기 정보를 업데이트합니다.
(env) pi@raspberrypi:~/AIY-voice-kit-python $ googlesamples-assistant-devicetool register-device --device <device-id> --model <model-name> --client-type SERVICE

지금까지 오류없이 가면 아마 정보 업데이트가 완료되었습니다.

Voice HAT에 LED를 연결



AIY Project 페이지의 Voice HAT GPIO 및 Voice kit와 함께 제공된 설명서 P.58을 참조하여 LED를 연결합니다.
이번에는 풀 컬러 LED를 사용하여 Servo0에 LED 적색, Servo1에 LED 녹색, Servo2에 LED 파란색을 연결했습니다.



샘플 코드 추가 개조



디바이스 액션이 실행될 때 GPIO를 직접 두드려 LED를 빛내도록 샘플 코드를 개조합니다.
이전 기사 에서 편집한 파일을 계속 사용합니다.
PWM을 사용하거나 하면 좋았을지도 모릅니다만, 어디까지나 샘플이므로 꽤 손발입니다, 양해 바랍니다.

호와 rd. py


--- hotword.py.1        2018-02-21 02:42:00.071501759 +0900
+++ hotword.py  2018-02-22 03:59:04.228139279 +0900
@@ -21,6 +21,8 @@ import argparse
 import os.path
 import json

+import RPi.GPIO as GPIO
+
 import google.auth.transport.requests
 import google.oauth2.credentials

@@ -34,6 +36,10 @@ from google.assistant.library.file_helpe

 DEVICE_API_URL = 'https://embeddedassistant.googleapis.com/v1alpha2'

+# GPIO Pin no.
+RED_PIN = 26
+GREEN_PIN = 6
+BLUE_PIN = 13

 def process_device_actions(event, device_id):
     if 'inputs' in event.args:
@@ -48,6 +54,30 @@ def process_device_actions(event, device
                                         yield e['command'], e['params']
                                     else:
                                         yield e['command'], None
+                                    if e['command'] == 'action.devices.commands.OnOff':
+                                        if e['params']['on']:
+                                            GPIO.output(RED_PIN,GPIO.HIGH)
+                                            GPIO.output(GREEN_PIN,GPIO.HIGH)
+                                            GPIO.output(BLUE_PIN,GPIO.HIGH)
+                                        else :
+                                            GPIO.output(RED_PIN,GPIO.LOW)
+                                            GPIO.output(GREEN_PIN,GPIO.LOW)
+                                            GPIO.output(BLUE_PIN,GPIO.LOW)
+                                    if e['command'] == 'action.devices.commands.ColorAbsolute':
+                                        print(e['params']['color']['spectrumRGB'])
+                                        if e['params']['color']["spectrumRGB"] & 0xff0000:
+                                            GPIO.output(RED_PIN,GPIO.HIGH)
+                                        else:
+                                            GPIO.output(RED_PIN,GPIO.LOW)
+                                        if e['params']['color']["spectrumRGB"] & 0x00ff00:
+                                            GPIO.output(GREEN_PIN,GPIO.HIGH)
+                                        else:
+                                            GPIO.output(GREEN_PIN,GPIO.LOW)
+                                        if e['params']['color']["spectrumRGB"] & 0x0000ff:
+                                            GPIO.output(BLUE_PIN,GPIO.HIGH)
+                                        else:
+                                            GPIO.output(BLUE_PIN,GPIO.LOW)
+


 def process_event(event, device_id):
@@ -139,6 +169,13 @@ def main():
         credentials = google.oauth2.credentials.Credentials(token=None,
                                                             **json.load(f))

+    # GPIO setup
+    GPIO.setmode(GPIO.BCM)
+    GPIO.setwarnings(False)
+    GPIO.setup(RED_PIN,GPIO.OUT)
+    GPIO.setup(GREEN_PIN,GPIO.OUT)
+    GPIO.setup(BLUE_PIN,GPIO.OUT)
+
     with Assistant(credentials, args.device_model_id) as assistant:
         events = assistant.start()


부 sh와 다른 lk. py


--- pushtotalk.py.1     2018-02-21 02:18:19.228083473 +0900
+++ pushtotalk.py       2018-02-22 04:04:27.796660481 +0900
@@ -22,6 +22,8 @@ import os.path
 import sys
 import uuid

+import RPi.GPIO as GPIO
+
 import click
 import grpc
 import google.auth.transport.grpc
@@ -54,6 +56,10 @@ DIALOG_FOLLOW_ON = embedded_assistant_pb
 CLOSE_MICROPHONE = embedded_assistant_pb2.DialogStateOut.CLOSE_MICROPHONE
 DEFAULT_GRPC_DEADLINE = 60 * 3 + 5

+# GPIO Pin no.
+RED_PIN = 26
+GREEN_PIN = 6
+BLUE_PIN = 13

 class SampleAssistant(object):
     """Sample Assistant that supports conversations and device actions.
@@ -296,6 +302,13 @@ def main(api_endpoint, credentials, proj

         $ python -m googlesamples.assistant -i <input file> -o <output file>
     """
+    # GPIO setup
+    GPIO.setmode(GPIO.BCM)
+    GPIO.setwarnings(False)
+    GPIO.setup(RED_PIN,GPIO.OUT)
+    GPIO.setup(GREEN_PIN,GPIO.OUT)
+    GPIO.setup(BLUE_PIN,GPIO.OUT)
+
     # Setup logging.
     logging.basicConfig(level=logging.DEBUG if verbose else logging.INFO)

@@ -363,8 +376,33 @@ def main(api_endpoint, credentials, proj
     def onoff(on):
         if on:
             logging.info('Turning device on')
+            GPIO.output(RED_PIN,GPIO.HIGH)
+            GPIO.output(GREEN_PIN,GPIO.HIGH)
+            GPIO.output(BLUE_PIN,GPIO.HIGH)
         else:
             logging.info('Turning device off')
+            GPIO.output(RED_PIN,GPIO.LOW)
+            GPIO.output(GREEN_PIN,GPIO.LOW)
+            GPIO.output(BLUE_PIN,GPIO.LOW)
+
+    @device_handler.command('action.devices.commands.ColorAbsolute')
+    def colorabsolute(color):
+        logging.info(color["spectrumRGB"])
+        if color["spectrumRGB"] & 0xff0000:
+            logging.info('RED')
+            GPIO.output(RED_PIN,GPIO.HIGH)
+        else:
+            GPIO.output(RED_PIN,GPIO.LOW)
+        if color["spectrumRGB"] & 0x00ff00:
+            logging.info('GREEN')
+            GPIO.output(GREEN_PIN,GPIO.HIGH)
+        else:
+            GPIO.output(GREEN_PIN,GPIO.LOW)
+        if color["spectrumRGB"] & 0x0000ff:
+            logging.info('BLUE')
+            GPIO.output(BLUE_PIN,GPIO.HIGH)
+        else:
+            GPIO.output(BLUE_PIN,GPIO.LOW)

     if not device_id or not device_model_id:
         try:


실제 시도해보기



hotword의 경우, 「OK Google, 라이트를 켜고」라고 하는 워드로 LED가 점등합니다. 마찬가지로, 「라이트를 끄고」 「라이트를 파랑으로 하고」 「라이트를 빨강으로」등으로 LED를 제어할 수 있게 됩니다.
pushtotalk의 경우는 일일이 버튼을 눌러야 합니다만, 나머지는 같은 동작이 됩니다.

좋은 웹페이지 즐겨찾기