Cet article est l'article du 25ème jour du Calendrier de l'Avent North Detail 2019.
PostScript 02/04/2020 Cet article est également publié sur le blog NorthDetail. https://www.northdetail.co.jp/blog/455/
Joyeux Noël! Le calendrier de l'Avent est aussi le dernier jour de Noël, et Noël est une tarte aux râpes!
Donc, à la fin du Calendrier de l'Avent North Detail 2019, j'aimerais créer un mécanisme pour contrôler les lumières qui illuminent l'arbre de Noël avec Raspberry Pi.
Cliquez pour regarder la vidéo sur YouTube.
En secouant le capteur attaché au Raspberry Pi, la lumière peut être allumée et éteinte, et la luminosité et la teinte peuvent être ajustées en l'inclinant.
Raspberry Pi
Ce n'est pas grave si vous pouvez préparer quelque chose qui peut détecter l'inclinaison, etc. Utilisez ceci cette fois.
Hue
Cette fois, j'ai (enfin) utilisé ce que j'ai acheté comme ensemble lorsque j'ai acheté "Echo Show".
Utilisez un pont pour connecter Hue à partir du Raspberry Pi.
Plus précisément, le pont étant un serveur Web, vous pouvez prendre le contrôle de Hue en effectuant une requête HTTP du Raspberry Pi au pont.
C'est une précaution courante pour les lampes LED, mais elle est ** principalement différente des ampoules à incandescence dans la partie chauffée **.
Les ampoules à incandescence ont de la chaleur autour du filament de la partie émettrice de lumière, tandis que les lumières LED ont de la chaleur autour de la partie de la douille. Par conséquent, veuillez utiliser un support avec une structure qui dissipe correctement la chaleur autour de la prise.
Tout d'abord, utilisez l'application pour smartphone pour enregistrer la lumière sur le pont. Travaillez ici en fonction de la façon dont vous utilisez l'application.
Après cela, nous partirons du principe que le pont, le Raspberry Pi et le PC de travail sont tous sur le même réseau.
Vous devez connaître l'adresse IP car vous allez envoyer des requêtes HTTP au pont. Ceci peut être obtenu en accédant à l'adresse suivante si le pont est correctement configuré.
https://discovery.meethue.com/
[
{
id: "XXXXXXXXXXXXXXXX",
internalipaddress: "10.xxx.xxx.xxx"
}
]
Cette «adresseip interne» est l'adresse IP du réseau actuellement connecté. Prenons une note.
Lorsque vous utilisez Raspberry Pi, un ID utilisateur unique est requis sur le pont. Après avoir appuyé sur le bouton (physique) sur le corps du pont, si vous faites une requête HTTP sous la forme suivante, «nom d'utilisateur» est inclus dans la réponse. Notez-le car il sera utilisé dans les futures requêtes HTTP.
Au fait, devicetype
peut être défini librement par vous-même.
POST http://`internalipaddress`/api
body: {"devicetype":"tacck_hue_app#raspi"}
response.json
[
{
"success": {
"username": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
}
]
Ensuite, obtenez l'ID de la lumière enregistrée dans le pont pour faire fonctionner la lumière.
GET http://`internalipaddress`/api/`username`/lights
response.json
{
"1":{"state":{"on":false,"bri":254,...}
}
Beaucoup d'informations sont renvoyées, mais le premier «1» est l'ID.
Lancez la requête HTTP ci-dessous et le voyant devrait s'allumer. (Si vous remplacez «vrai» par «faux», il s'éteindra.)
Remplacez ʻinternalipaddress, ʻusername
et light_id
par les vôtres.
PUT http://`internalipaddress`/api/`username`/lights/`light_id`/state
body: {"on":true}
Raspberry Pi
Vient ensuite le réglage côté Raspberry Pi. Pour Raspberry Pi, il est supposé que le WiFi est disponible avec Raspbian déjà en cours d'exécution. De plus, on suppose que le capteur (ADRSZGR) est déjà connecté à l'unité principale du Raspberry Pi.
Tout d'abord, vérifiez si vous pouvez obtenir la valeur du capteur. Ici, le code source de base est fourni, alors utilisons-le.
Code de base https://github.com/bit-trade-one/RasPi-Zero-One-Series/tree/master/3rd/ADRSZGR_9-Axis_Gyro
Exécutons-le sur le Raspberry Pi.
$ git clone https://github.com/bit-trade-one/RasPi-Zero-One-Series.git
$ cd RasPi-Zero-One-Series/3rd/ADRSZGR_9-Axis_Gyro
$ python3 ADRSZGR_Sample.py
Ne déplacez pas le capteur pendant 10 secondes
Il reste 1 seconde
Calibration terminée
X:-0.045608688186813184 Y:0.7310804429945055 Z:-4.547119140625
2.7179718017578125e-05,0.01416015625,0.0185546875,1.0087890625,-0.045608688186813184,-0.12341174450549453,-0.152587890625,-14.843956043956045,6.447374847374848,-1.6493284493284492,
0.05398225784301758,0.0126953125,0.01513671875,1.00927734375,0.13749678056318682,0.059693724244505475,-0.213623046875,-16.193406593406593,6.297435897435897,-0.8996336996336997,
(Puisqu'il continue ci-dessous, Ctrl à un endroit approprié+Suspendu à C.)
Si la valeur sort comme ça, c'est OK car le capteur bouge.
Maintenant, implémentons-le pour utiliser les valeurs du capteur pour manipuler les lumières de Hue.
La base GYRO.py
fait tout le contrôle du capteur, vous n'avez donc qu'à réfléchir à la façon d'utiliser les valeurs.
Cette fois, nous allons l'implémenter avec une conception qui s'allume / s'éteint lorsque le capteur est secoué et change de luminosité et de tonalité de couleur lorsqu'il est incliné.
Copiez ʻADRSZGR_Sample.py utilisé dans la confirmation précédente comme ʻindex.py
et utilisez-le.
De plus, comme je n'écris généralement pas en Python, je vais l'implémenter en faisant attention à l'indent valley [^ 1].
[^ 1]: C'est mon mot inventé. https://speakerdeck.com/tacck/phpergawen-kitaipythonfalseikutukafalsekoto-pycon-mini-sapporo-2019-number-pyconsap?slide=18
J'ai fait divers ajustements et me suis installé avec le code suivant.
.
├── GYRO.py
└── index.py
index.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import signal
import requests
import time
import GYRO
GYR_THRESHOLD = 200.0
HUE_BRI_MIN = 0
HUE_BRI_MAX = 254
HUE_BRI_HALF = round((HUE_BRI_MAX - HUE_BRI_MIN + 1) / 2)
HUE_CT_MIN = 153
HUE_CT_MAX = 454
HUE_CT_HALF = round((HUE_CT_MAX - HUE_CT_MIN + 1) / 2)
HUE_API = 'http://`internalipaddress`/api/`username`/lights'
if __name__ == "__main__":
signal.signal(signal.SIGINT, signal.SIG_DFL)
gyro = GYRO.GYRO()
time.sleep(0.1)
gyro.sensor_calib()
#État d'éclairage de l'éclairage
light_on = False
prev_light_on = light_on
light_bri = HUE_BRI_MIN + HUE_BRI_HALF
light_ct = HUE_CT_MIN + HUE_CT_HALF
while True:
#Lire les valeurs des capteurs et les stocker dans les variables requises
values = gyro.get_sense_value()
axs_x = values[0]
axs_y = values[1]
# axs_z = values[2]
# print('{0:4.2f}'.format(axs_x), end=",")
# print('{0:4.2f}'.format(axs_y), end=",")
# print('{0:4.2f}'.format(axs_z), end=",")
# gyr_x = values[3]
# gyr_y = values[4]
gyr_z = values[5]
# print('{0:4.2f}'.format(gyr_x), end=",")
# print('{0:4.2f}'.format(gyr_y), end=",")
# print('{0:4.2f}'.format(gyr_z), end=",")
#Changer la tonalité de couleur à partir de l'inclinaison de l'axe X
light_ct += axs_x * HUE_CT_HALF
if light_ct < HUE_CT_MIN:
light_ct = HUE_CT_MIN
if light_ct > HUE_CT_MAX:
light_ct = HUE_CT_MAX
#Changer la luminosité de l'inclinaison de l'axe Y
light_bri += axs_y * HUE_CT_HALF
if light_bri < HUE_BRI_MIN:
light_bri = HUE_BRI_MIN
if light_bri > HUE_BRI_MAX:
light_bri = HUE_BRI_MAX
#Allumez l'éclairage lorsque la vitesse angulaire dans la direction Z dépasse le seuil/Contrôle OFF
if gyr_z < -GYR_THRESHOLD:
light_on = not light_on
#Jeter à Hue
if prev_light_on != light_on or light_on:
requests.put(HUE_API + '/`light_id`/state', json = {"on": light_on, "bri": round(light_bri), "ct": round(light_ct)})
# ON/OFF journal de confirmation
if prev_light_on != light_on:
print ('lignht_on:', light_on)
prev_light_on = light_on
time.sleep(0.10)
Le résultat de l'exécution sera la vidéo du début. Dans cet esprit, veuillez jeter un œil à nouveau.
Cette fois, il est lancé toutes les 0,1 secondes, mais veuillez prendre la responsabilité de la charge sur le réseau et le pont.
Si vous le combinez de différentes manières, vous pourrez contrôler librement l'éclairage de la pièce. Aligner les lumières de la maison avec la série Hue peut être très amusant.
Recommended Posts