Maak een geanimeerde slimme LED-strip die via Alexa wordt bestuurd met Arduino
Onderdelen en benodigdheden
| Onderdeel | Aantal | Opmerkingen |
|---|---|---|
| Arduino UNO | 1 | Arduino Nano kan ook worden gebruikt. Arduino Mega is handig om meer LED-pixels aan te sturen. |
| Raspberry Pi 3 Model B | 1 | |
| NeoPixel-strip (WS2812) | 1 | Elke WS2812 LED-strip is geschikt. |
Apps en online diensten
- Arduino IDE
- Amazon Web Services AWS Lambda
- Amazon Alexa Alexa Skills Kit
- Amazon Web Services AWS IoT
Over dit project
Waarom een LED-strip?
Ik was altijd gefascineerd door adresbare RGB LED-strips. De oneindige kleureneffecten en animatiemogelijkheden hebben mijn creativiteit altijd geprikkeld, dus ik besloot enkele jaren geleden een bibliotheek voor Arduino-boards te ontwikkelen genaamd ALA (Arduino Light Animations). Alexa geeft me nu de mogelijkheid om kamerverlichting en effecten met mijn stem te besturen – en dat is geweldig!
Projectoverzicht
De benodigde componenten voor dit project zijn:
- Amazon Alexa: Een aangepaste Alexa-skill (Light Strip) definieert het spraakinteractiemodel en vertaalt commando's (intents) die worden uitgegeven aan de Lambda-functie.
- Amazon Lambda: Een Python-script dat berichten van Alexa ontvangt en updates naar de IoT-service stuurt.
- Amazon IoT: De IoT-service slaat een 'thing shadow' op, een weergave van de status van de RGB-strip. Telkens wanneer de shadow wordt bijgewerkt, worden de geabonneerde MQTT-clients (Raspberry Pi) genotificeerd.
- Raspberry Pi: Deze kleine PC draait een MQTT-client om berichten van de Amazon IoT-service te ontvangen. Aan de andere kant voedt het de Arduino en stuurt het commando's via de USB-poort.
- Arduino: Deze microcontroller draait de ALA-bibliotheek om de LED-strip aan te sturen, met commando's van de Raspberry Pi via de seriële USB-poort. Je kunt een Arduino Uno, Nano of Mega gebruiken.
- WS2812 RGB LED-strip: Dit zijn adresbare LED-strips, waarbij elke LED apart kan worden gecontroleerd. Dit maakt mooie en kleurrijke lichtanimaties mogelijk.
Niets in dit project is extreem uitdagend, maar er zijn veel onderdelen die met elkaar verbonden zijn. Ik raad aan om de voorgestelde structuur te volgen om je project op een stevige basis te bouwen voordat je doorgaat naar de volgende stap. Om de zaken zo simpel mogelijk te houden, heb ik het project opgesplitst in twee subprojecten.
Het eerste deel van het project wordt beschreven in mijn Hackster.io-project "Web-Controlled LED Animations with Raspberry Pi and Arduino" en begeleidt je door de stappen om de Raspberry Pi, de Arduino en de WS2812 LED-strip te verbinden. Aan het einde van deze fase kun je de LED-animaties besturen vanaf een smartphone of pc via de webbrowser.
Het tweede deel van het project, dat hier wordt beschreven, voegt stemmenbesturing toe aan de vorige implementatie met Amazon Alexa. Er zijn verschillende stappen om de hele keten correct in te stellen, dus wees geduldig en volg de instructies zorgvuldig.
Amazon IoT
Heb je het hardwaregedeelte voltooid? Het is nu tijd voor de cloud! We gebruiken het AWS IoT-platform om ons 'thing' vanaf het internet te beheren.
We gebruiken een Device Shadow, een kopie van de status van een thing, samen met de gewenste wijzigingen. De Raspberry Pi abonneert zich op een notificatiesfeed die de wijzigingen ('delta') aan deze Shadow publiceert. Raadpleeg deze link voor meer informatie over het AWS IoT-platform en API's.
Een IoT Thing aanmaken
- Log in op de AWS Console. Als je dat nog niet hebt gedaan, maak dan een gratis account aan.
- Zorg dat je bent ingelogd in de regio US East (N. Virginia) of EU (Ireland) (rechtsboven).
- Zoek naar 'IoT' en selecteer de AWS IoT service. Klik op de knop Get Started (indien aanwezig) om de introductietutorial te sluiten.
- Maak eerst een beveiligingsbeleid voor ons "thing". Ga naar Secure > Policies en klik op Create a Policy. Vul in:
- Name: LightStripPolicy
- Action: *
- Resource: *
- Effect - Allow: aangevinkt
- Klik op 'Create'
- Maak nu het IoT Thing:
- Selecteer Manage > Things en maak een nieuw AWS IoT Thing via Register a Thing (of Create rechtsboven) en kies Create a single thing.
- Voer 'LS01' in bij Name. Laat de overige velden standaard en klik op Next.
- Klik op Create certificate in de sectie One-click certificate creation.
- Download de 3 certificaten voor je apparaat en de Root CA. Voor de Root CA moet je misschien rechtsklikken en 'opslaan als' kiezen.
- Klik na het downloaden op Activate.
- Klik op Attach a Policy, selecteer het eerder aangemaakte LightStripPolicy en klik op Register Thing.
- Noteer het AWS IoT Endpoint: klik op Settings linksonder in de AWS IoT-console, open het en noteer het Endpoint.
Raspberry Pi configureren om naar de 'Thing' te luisteren
- Installeer de AWS IoT Device SDK for Python op de Raspberry Pi:
sudo pip3 install AWSIoTPythonSDK - Download de LightStrip-repository van GitHub en pak uit:
mkdir -p /home/pi/LightStrip cd /home/pi/LightStrip wget https://github.com/bportaluri/LightStrip/archive/master.zip unzip master.zip - Kopieer de vier gedownloade certificaten (van het aanmaken van het IoT Thing) naar de map /home/pi/LightStrip/LightStrip-master/pi.
- Bewerk het script lightstripcfg.py (bijv. met nano):
Pas de instellingen aan:cd /home/pi/LightStrip/LightStrip-master/pi nano lightstripcfg.py- AWSIOT: het AWS IoT Endpoint dat je net noteerde.
- ROOT_CA: bestandsnaam van het root CA-certificaat.
- CERTIFICATE: bestandsnaam van het certificaat.
- PRIVATE_KEY: bestandsnaam van de private key.
- DEVICE_NAME: laat ongewijzigd op "LS01".
- Start het script lightstrip.py:
Het script toont de aangesloten USB-poorten. De Arduino zit meestal opsudo python3 lightstrip.py/dev/ttyACM0. Start het script met de poort:sudo python3 lightstrip.py /dev/ttyACM0
De testclient verbindt met de Amazon Thing Shadow-service en abonneert zich op wijzigingen van de LS01 device shadow. Bij succesvolle verbinding werkt de client zijn status bij naar de LS01 device shadow en ontvangt een bevestiging.
Om te controleren of alles werkt, ga terug naar de AWS IoT-console, selecteer Manage > Things, open het LS01 apparaat en kies het Shadow menu. Je ziet de device shadow state.
Klik op de Edit link in de Shadow Document sectie en plak de volgende JSON in het Shadow state-vak:
{ "desired": { "animation": "101" } }
Na het opslaan wordt een 'delta'-bericht naar de MQTT-client op de Raspberry Pi gestuurd, die de LED-strip inschakelt.
De volgende JSON zet de kleur op blauw:
{ "desired": { "color": "0066CC" } }
Op dit moment kun je je LED-strip besturen via de AWS IoT-service – daar mag je trots op zijn!
AWS Lambda-functie
AWS Lambda stelt je in staat om code in de cloud uit te voeren zonder servers te hoeven inrichten of beheren. Het is de perfecte brug tussen de Alexa Skills Kit die later stemmenbesturing mogelijk maakt.
- Log in op de AWS Console en selecteer Lambda uit de lijst met services.
- Zorg dat je in dezelfde regio zit als bij de vorige stap: US East (N. Virginia) of EU (Ireland).
- Klik op Create Function. Kies Author from scratch en configureer:
- Name = LightStrip
- Runtime = Python 3.6
- Role = Create a Custom Role. Er opent een nieuw tabblad; klik op "Allow" om een nieuwe rol lambda_basic_execution aan te maken.
- Existing role: lambda_basic_execution
- Klik op Create Function.
- Noteer de Lambda ARN ID (rechtsboven).
- Klik op het LightStrip vakje om de functiecode te openen.
- Code entry type: Edit code inline
- Runtime: Python 3.6
- Handler: lambda_function.lambda_handler
- Plak de code uit LightStrip\lambda\lambda_function.py in de code-editor.
- Maak een nieuw bestand ala_controller.py en plak de code uit LightStrip\lambda\ala_controller.py.
- Klik op de oranje Save knop rechtsboven.
Alexa Skill
Nu maken we de aangepaste Light Strip-skill voor Alexa.
- Ga naar de Amazon Developer Console en log in (registreer indien nodig).
- Ga naar Alexa > Alexa Skills Kit (Get Started).
- Klik op Add a New Skill rechtsboven en vul in het tabblad Skill Information:
- Skill Type: Custom Interaction Model
- Language: English (U.S.)
- Name: LightStrip
- Invocation Name: light strip
- Klik op Save
- Noteer de Skill ID.
- Selecteer het Interaction Model menu en klik op Launch Skill Builder.
- Klik op de Code Editor knop en plak de inhoud van LightStrip/alexaskill/lightstrip_skill.json in het tekstvak.
- Klik op Save Model en Build Model. Het bouwen duurt enkele minuten. Klik daarna op Skill Information om terug te keren.
- Klik op het Configuration menu.
- Bij Service Endpoint Type kies AWS Lambda ARN en plak de Lambda ARN die je eerder noteerde.
- Laat de standaardwaarden staan en klik op Save.
Alexa Skill koppelen aan de Lambda-functie
- Ga terug naar je Lambda-functie. Aan de rechterkant staat een lijst met vooraf gedefinieerde triggers. Selecteer Alexa Skills Kit; deze wordt aan je functie toegevoegd.
- Configureer:
- Application Id = de Skill ID die je noteerde.
- Klik op Add, daarna op Save.
Klaar!
Het project is nu compleet. Probeer de volgende spraakcommando's:
- Open Light Strip
- Turn on
- Set brightness to 20 percent
- Set brightness to 50 percent
- Set color to red
- Set color to turquoise
- Turn off
- Run an exciting animation
- Run a relaxing animation
De LightStrip-skill ondersteunt ook geavanceerdere interacties:
- Jij: Alexa, open Light Strip
- Alexa: Welkom bij LightStrip – De LED-strip gloeit met een blauw licht
- Jij: Launch an animation
- Alexa: Wil je een relaxende of een opwindende animatie?
- Jij: Relaxing
- Alexa: OK – De LED-strip toont een willekeurige animatie
- Jij: Next animation
- Alexa: OK – Nog een willekeurige animatie wordt getoond
Om het interactiemodel beter te begrijpen, hier is het volledige VUI-diagram van de skill:
Verbeteringen en verfijningen
AlaWeb automatisch starten bij opstarten
Een kleine verbetering is het automatisch starten van het lightstrip.py script bij het opstarten van de Raspberry Pi, zodat je het niet handmatig hoeft te starten na elke herstart. Volg deze instructies:
- Open
/etc/rc.localmet een editor:sudo nano /etc/rc.local - Voeg voor de regel
exit 0toe:cd /home/pi/LightStrip/LightStrip-master/pi && sudo python3 lightstrip.py /dev/ttyACM0 & - Sla op en herstart de Pi om te testen.
Animaties toevoegen en aanpassen
De Light Strip-skill bevat al 20 animatievarianten. De ALA-bibliotheek maakt het echter eenvoudig om eigen animaties te definiëren door de animatiepreset, kleurenpalet en snelheid te kiezen. Je kunt eigen animaties toevoegen of bestaande aanpassen in het bestand ala_controller.py. Rond regel 80 vind je een lijst met animatie-instellingen die je kunt wijzigen naar eigen smaak.
Code
Alle benodigde code voor dit project vind je op GitHub:
https://github.com/bportaluri/LightStrip
Schema's
Productieproces
- Arduino Nano Flight Simulator 2020 Bedieningspaneel – LCD & CDI Display
- Arduino-gebaseerd schakelaar- & LED-paneel voor Microsoft Flight Simulator 2020
- Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
- Slimme Zelfzittende Schoenen met Ingebouwde Energie-opwekking
- Bouw een Slimme Arduino Vierpotige Robot: Stap-voor-Stap Handleiding
- Arduino & MPU6050: Precieze Servomotor Besturing met SG90 & MG996R
- Naadloze LED-dimmer met Bolt IoT en Arduino UNO
- u-blox LEA‑6H GPS Module: Arduino & Python Integratie Handleiding
- Bouw een Slimme Arduino-gestuurde Robotarm: Eenvoudige DIY Handleiding
- Spraakherkenning & Synthese Meesteren op Arduino Due
- Een 8×8 LED-matrix beheersen met Arduino Uno: Stap-voor-stap handleiding