Taula de continguts:
- Pas 1: Gran pla
- Pas 2: llista de la compra
- Pas 3: configureu el vostre Raspberry Pi
- Pas 4: configureu OpenCV
- Pas 5: configureu TensorFlow
- Pas 6: Detecció de moviment mitjançant OpenCV
- Pas 7: detecteu objectes mitjançant TensorFlow
- Pas 8: configureu un servidor web al Raspberry Pi
- Pas 9: notificacions mòbils des de Raspberry Pi mitjançant IFTTT
- Pas 10: afegiu un relé HAT al Raspberry Pi i connecteu-lo a una electrovàlvula
- Pas 11: connecteu un sensor de nivell d’aigua
- Pas 12: escriviu codi per lligar-ho tot
Vídeo: Pool Pi Guy - Sistema d'alarma impulsat per IA i monitoratge de piscina amb Raspberry Pi: 12 passos (amb imatges)
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:14
Tenir una piscina a casa és divertit, però comporta una gran responsabilitat. La meva major preocupació és controlar si hi ha algú a prop de la piscina sense atenció (especialment els nens més petits). La meva molèstia més gran és assegurar-me que la línia d’aigua de la piscina no baixi mai per sota de l’entrada de la bomba, la qual cosa faria que la bomba s’assequés i la destruís costant $ $$ en reparacions.
Recentment he descobert com utilitzar un Raspberry Pi amb OpenCV i TensorFlow, juntament amb un sensor de nivell d’aigua i una electrovàlvula per resoldre tots dos problemes, i divertir-me fent-ho.
Resulta que també és un gran sistema d’alarma: activat per moviment, controlat per IA, infinitament personalitzable.
Anem a bussejar.
Pas 1: Gran pla
En aquest instructiu us mostrarem com:
- Configureu un Raspberry Pi amb OpenCV i TensorFlow
- Connecteu una càmera web mitjançant un llarg cable USB
- Escriviu un algorisme OpenCV per detectar el moviment
- Utilitzeu TensorFlow per a la detecció d'objectes
- Configureu un servidor web al Raspberry Pi per mostrar les imatges interessants
- Integreu-vos amb IFTTT per activar alertes mòbils en cas que es detecti una persona
- Connecteu un relé HAT al Raspberry Pi i connecteu-lo a una electrovàlvula que afegiria aigua a la piscina
- Connecteu un sensor de nivell d’aigua al Raspberry Pi i connecteu-lo amb el GPIO del Pi
- Escriu algun codi per enganxar-ho tot junt
Pas 2: llista de la compra
Tots els components estan disponibles a Amazon. No dubteu a experimentar i intercanviar components; això és la meitat de la diversió.
- Raspberry Pi
- Font d'alimentació Raspberry Pi (no escatimeu aquí)
- Targeta de memòria (més gran és millor)
- Carcassa (aquest és prou gran per allotjar tant el Pi com el HAT)
- Càmera web USB (qualsevol càmera web ho farà, però en voleu una que obtingui bones imatges i equilibri bé la il·luminació)
- Cable d'extensió USB (si cal: mesureu la distància entre el Pi i el lloc on col·loqueu la càmera)
- Taula de relés HAT (aquest té 3 relés i només en necessitem un, però en trobareu un d’ús prou aviat!)
- Solenoide
- Ajust de solenoide 1 i Ajust 2 (que realment depèn del que s'adapti al solenoide, però això ha funcionat per a mi)
- Alimentació amb solenoide (qualsevol 24V CA ho faria)
- Cable (de nou, gairebé qualsevol cable de 2 fils ho faria; el corrent és mínim)
- Interruptor flotant de nivell d'aigua (aquest és només un exemple, comproveu què es pot connectar fàcilment a la vostra piscina)
- Alguns cables Jumper i connectors de cable
Pas 3: configureu el vostre Raspberry Pi
Raspberry Pi és un petit ordinador fantàstic. Costa només 35 dòlars, funciona de manera constant i té un munt de programari i maquinari compatibles. Configurar-lo és molt fàcil:
- Formateu la targeta SD. Això necessita una cura especial: Raspberry Pi només pot arrencar des d’una targeta SD amb format FAT. Seguiu aquestes instruccions.
- Connecteu el Raspberry Pi a un teclat i un ratolí USB, a més d’una pantalla HDMI i seguiu les instruccions del tutorial de Raspberry Pi NOOBS. Assegureu-vos de configurar el WiFi i activar l’accés SSH. No oblideu configurar una contrasenya per al compte pi predeterminat.
- A la configuració de la vostra xarxa domèstica, hi ha una IP estàtica per al Raspberry Pi; facilitaria l’entrada de SSH.
- Assegureu-vos que teniu instal·lat un client ssh al vostre ordinador de sobretaula / portàtil. Per a un PC recomanaria Putty, que podeu instal·lar des d’aquí.
- Desconnecteu l'USB i l'HDMI del Raspberry Pi, reinicieu-lo i introduïu-hi el fitxer ssh; si tot funcionava, hauríeu de veure alguna cosa així:
Linux raspberrypi 4.14.98-v7 + # 1200 SMP Dim 12 febrer 20:27:48 GMT 2019 armv7l
Els programes inclosos amb el sistema Debian GNU / Linux són programari lliure; els termes de distribució exactes de cada programa es descriuen als fitxers individuals a / usr / share / doc / * / copyright. Debian GNU / Linux no inclou cap GARANTIA, en la mesura permesa per la legislació aplicable. Darrer inici de sessió: dilluns 13 de maig 10:41:40 2019 de 104.36.248.13 pi @ raspberrypi: ~ $
Pas 4: configureu OpenCV
OpenCV és una increïble col·lecció de funcions de manipulació d’imatges per a la visió per ordinador. Ens permetrà llegir imatges de la càmera web, manipular-les per trobar zones de moviment, guardar-les i molt més. La configuració del Raspberry Pi no és difícil, però requereix una certa cura.
Comenceu instal·lant virtaulenvwrapper: utilitzarem python per fer tota la nostra programació i virtualenv ens ajudarà a mantenir les dependències separades per a OpenCV i TensorFlow vs. Flask o GPIO:
pi @ raspberrypi: ~ $ sudo pip install virtualenvwrapper
Ara podeu executar "mkvirtualenv" per crear un entorn nou, "workon" per treballar-hi i molt més.
Per tant, creem un entorn per a la nostra manipulació d’imatges, amb python 3 com a intèrpret per defecte (és el 2019, no hi ha cap raó per quedar-se amb el python 2 més antic):
pi @ raspberrypi: ~ $ mkvirtualenv cv -p python3
… (Cv) pi @ raspberrypi: ~
Ara estem preparats per instal·lar OpenCV. Seguirem sobretot l’excel·lent tutorial a Aprendre OpenCV. Seguiu específicament els passos 1 i 2:
sudo apt -y updates sud apt -y upgrade ## Instal·la dependències sudo apt-get -y install build-essential checkinstall cmake pkg-config yasm sudo apt-get -y install git gfortran sudo apt-get -y install libjpeg8-dev libjasper- dev libpng12-dev sudo apt-get -y install libtiff5-dev sudo apt-get -y install libtiff-dev sudo apt-get -y install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev sudo apt-get - i instal·leu libxine2-dev libv4l-dev cd / usr / include / linux sudo ln -s -f../libv4l1-videodev.h videodev.h sudo apt-get -y install libgstreamer0.10-dev libgstreamer-plugins-base0. 10-dev sudo apt-get -y install libgtk2.0-dev libtbb-dev qt5-default sudo apt-get -y install libatlas-base-dev sudo apt-get -y install libmp3lame-dev libtheora-dev sudo apt-get -y instal·lo libvorbis-dev libxvidcore-dev libx264-dev sudo apt-get -y install libopencore-amrnb-dev libopencore-amrwb-dev sudo apt-get -y install libavresample-dev sudo apt-get -y install x264 v4l-utils sudo apt-get -y instal·la libprotobuf -dev protobuf-compiler sudo apt-get -y install libgoogle-glog-dev libgflags-dev sudo apt-get -y install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen sudo apt-get install libqtgui4 sudo apt-get install libqt4- prova
Ara només podem instal·lar OpenCV amb enllaços python dins del cv virtualenv (encara hi esteu, oi?) Utilitzant
pip instal·lar opencv-contrib-python
I ja està! Tenim OpenCV instal·lat al nostre Raspberry Pi, a punt per capturar fotos i vídeos, manipular-los i ser genials.
Comproveu-ho obrint un intèrpret de python i important opencv i comproveu que no hi hagi errors:
(cv) pi @ raspberrypi: ~ $ python
Python 3.5.3 (predeterminat, 27 de setembre de 2018, 17:25:39) [GCC 6.3.0 20170516] a Linux Escriviu "ajuda", "drets d'autor", "crèdits" o "llicència" per obtenir més informació. >>> importa cv2 >>>
Pas 5: configureu TensorFlow
TensorFlow és un marc d'aprenentatge automàtic / IA desenvolupat i mantingut per Google. Compta amb un ampli suport per a models d’aprenentatge profund per a diverses tasques, inclosa la detecció d’objectes en imatges, i ara és bastant senzill d’instal·lar a Raspberry Pi. El rendiment dels seus models lleugers al petit Pi és d’uns 1 fotograma per segon, la qual cosa és perfectament adequat per a una aplicació com la nostra.
Seguirem bàsicament l’excel·lent tutorial d’Edje Electronics, amb les modificacions possibles gràcies a les distribucions més recents de TensorFlow:
pi @ raspberrypi: ~ $ workon cv
(cv) pi @ raspberrypi: ~ $ pip install tensorflow (cv) pi @ raspberrypi: ~ $ sudo apt-get install libxml2-dev libxslt-dev (cv) pi @ raspberrypi: ~ $ pip install coixí lxml jupyter matplotlib cython (cv) pi @ raspberrypi: ~ $ sudo apt-get install python-tk
Ara hem de compilar el protobuf de Google. Només heu de seguir les instruccions del pas 4 del mateix excel·lent tutorial
Finalment, cloneu i configureu les definicions del model de TensorFlow: seguiu el pas 5 del tutorial d’Edje Electronics
No dubteu a seguir el seu exemple també al pas 6, és una fantàstica introducció a la detecció d'objectes al Raspberry Pi.
Pas 6: Detecció de moviment mitjançant OpenCV
Comencem comprovant que OpenCV pot interactuar amb la nostra càmera web: ssh al Raspberry Pi, moveu-vos al cv virtualenv (workon cv), obriu un intèrpret de python (només heu d’escriure python) i introduïu les ordres python següents:
importar cv2
cap = cv2. VideoCapture (0) cap.set (cv2. CAP_PROP_FRAME_WIDTH, 1920) cap.set (cv2. CAP_PROP_FRAME_HEIGHT, 1080) ret, frame = cap.read () print ("Llegir mida del marc: {} x {}".format (frame.shape [1], frame.shape [0])
Amb sort, veureu que OpenCV era capaç de llegir un marc HD des de la càmera.
Podeu utilitzar cv2.imwrite (ruta, marc) per escriure aquest marc al disc i tornar-lo a configurar per obtenir un aspecte real.
L'estratègia per detectar el moviment és bastant senzilla:
- Treballeu en fotogrames de menor resolució: aquí no cal que funcioneu en Full HD
- A més, desdibuixa les imatges per assegurar el mínim soroll possible.
- Mantingueu una mitjana corrent dels darrers N fotogrames. Per a aquesta aplicació, on la velocitat de fotogrames és d’uns 1 FPS (només perquè TensorFlow triga un temps per fotograma), he trobat que N = 60 dóna bons resultats. I ja que una implementació acurada no necessita més CPU amb més fotogrames que està bé (requereix més memòria, però això és insignificant quan treballem amb els fotogrames de menor resolució)
- Resteu la imatge actual de la mitjana en curs (només tingueu precaució en escriure: heu de permetre valors positius i negatius [-255.. 255], de manera que cal convertir el marc a int)
- Podeu fer la resta en una conversió a escala de grisos del marc (i de la mitjana), o fer-ho per separat per a cadascun dels canals RGB i després combinar els resultats (que és l'estratègia que he triat, fent-lo sensible als canvis de color)
- Utilitzeu un llindar al delta i elimineu el soroll per erosió i dilatació
- Finalment, cerqueu contorns d’àrees amb delta: aquestes zones són on s’ha produït el moviment i la imatge actual és diferent de la mitjana de les imatges anteriors. Si és necessari, podem trobar més caixes de delimitació per a aquests contorns.
He encapsulat el codi per fer-ho a la classe de python DeltaFinder que podeu trobar al meu github aquí
Pas 7: detecteu objectes mitjançant TensorFlow
Si heu seguit el procediment d'instal·lació de TensorFlow, ja heu comprovat que teniu TensorFlow instal·lat i funcionant.
Amb l’objectiu de detectar persones en una escena general a l’aire lliure, els models prèviament entrenats al conjunt de dades COCO funcionen força bé, que és exactament el model que hem descarregat al final de la instal·lació de TensorFlow. Només hem d’utilitzar-lo per inferir.
Una vegada més, he encapsulat la càrrega i la inferència del model a la classe de Python TFClassify per facilitar les coses, que podeu trobar aquí.
Pas 8: configureu un servidor web al Raspberry Pi
La forma més senzilla d’accedir als resultats de la detecció d’objectes és un navegador web, així que configurem un servidor web al Raspberry Pi. A continuació, el podem configurar per publicar imatges d’un directori determinat.
Hi ha diverses opcions per a un entorn de servidor web. Vaig triar Flask. És extremadament configurable i fàcil d’ampliar amb Python. Atès que la "escala" que necessitem és trivial, era més que suficient.
Us suggereixo instal·lar-lo en un nou virtualenv, així que:
pi @ raspberrypi: ~ $ mkvirtualenv webserv
(webserv) pi @ raspberrypi: ~ $ pip install Flask
Tingueu en compte que amb una configuració de xarxa normal, només s’hi podrà accedir quan el navegador es troba a la mateixa xarxa sense fils que el vostre Raspberry Pi. Podeu crear una configuració de mapatge de ports / NAT al vostre encaminador d'Internet per permetre l'accés extern, però us ho recomano. El codi que he escrit no intenta proporcionar la seguretat que necessitareu quan permeteu l'accés general a Internet al vostre Raspberry Pi.
Proveu la instal·lació seguint la guia d’inici ràpid de Flask
Pas 9: notificacions mòbils des de Raspberry Pi mitjançant IFTTT
Vull rebre notificacions mòbils quan es produeixin esdeveniments. En aquest cas, quan es detecta una persona i quan es baixa el nivell de l’aigua. La forma més senzilla que he trobat de fer-ho, sense haver d’escriure una aplicació mòbil personalitzada, és mitjançant IFTTT. IFTTT significa "If This Then That That" i permet que molts tipus d'esdeveniments activin molts tipus d'accions. En el nostre cas, ens interessa el disparador IFTTT Maker Webhook. Això ens permet activar una acció IFTTT fent una sol·licitud HTTP POST al servidor IFTTT amb una clau especial assignada al nostre compte, juntament amb dades que especifiquen el que va passar. L'acció que fem pot ser tan senzilla com crear una notificació al nostre dispositiu mòbil mitjançant l'aplicació mòbil IFTTT o qualsevol cosa més complexa que això.
A continuació s’explica com fer-ho:
- Creeu un compte IFTTT a ifttt.com
- En iniciar la sessió, aneu a la pàgina de configuració del servei de Webhook i introduïu l'URL al navegador (com ara https://maker.ifttt.com/use/. Aquesta pàgina web us mostrarà la vostra clau i l'URL que cal utilitzar per activar accions.
-
Creeu una miniaplicació IFTTT que generarà una notificació mòbil quan s'activi el Webhook amb els detalls de l'esdeveniment:
- Feu clic a "Els meus applets" i, a continuació, a "Applet nou".
- Feu clic a "+ això" i trieu "webhooks". Feu clic a "Rebre una sol·licitud web" per anar a la informació detallada
- Posa un nom al teu esdeveniment, p. Ex. "PoolEvent" i feu clic a "Crea activador"
- Feu clic a "+ que" i trieu "notificacions". A continuació, trieu "Envia una notificació completa des de l'aplicació IFTTT"
- Per a "títol", trieu alguna cosa com "PoolPi"
- Per a "missatge", escriviu "Pool Pi detectat:" i feu clic a "afegir ingredient".. "Valor1".
- Torneu a l'URL que heu copiat al pas 2. Es mostrarà l'URL que cal utilitzar per invocar la miniaplicació de creació recent. Copieu aquest URL substituint el marcador {event} pel nom de l'esdeveniment (a l'exemple de PoolEvent)
- Descarregueu, instal·leu i inicieu sessió a l'aplicació IFTTT per al vostre dispositiu mòbil
- Executeu aquest script Python al vostre Raspberry Pi per veure-ho funcionant (tingueu en compte que pot trigar uns quants segons o minuts a activar-se al dispositiu mòbil):
sol·licituds d’importació
requests.post ('https://maker.ifttt.com/trigger/PoolEvent/with/key/', json = {"value1": "Hello Notifications"})
Pas 10: afegiu un relé HAT al Raspberry Pi i connecteu-lo a una electrovàlvula
Abans de continuar amb aquest pas, APAGUEU el vostre Raspberry Pi: ssh i escriviu "sudo shutdown now" i, a continuació, desconnecteu-lo de l'alimentació
El nostre objectiu és encendre i apagar l’alimentació d’una electrovàlvula, una vàlvula que pot obrir o tancar el subministrament d’aigua basat en la potència de 24 V CA que obté d’una font d’alimentació. Els relés són els components elèctrics que poden obrir o tancar un circuit basat en un senyal digital que el nostre Raspberry Pi pot proporcionar. El que fem aquí és connectar un relé a aquests pins de senyal digitals del Raspberry Pi i fer que tanqui el circuit entre la font d’alimentació de 24 V CA i la solenoide.
Els pins del Raspberry Pi que poden actuar com a entrada o sortida digital s’anomenen GPIO - General Purpose Input / Output i són la fila de 40 pins del lateral del Pi. Amb el Pi apagat i introduïu-hi el relé HAT fermament. El HAT que he escollit té 3 relés i en farem servir només un. Imagineu tot el que podeu fer amb els altres dos:)
Ara torneu a engegar el Raspberry Pi. El LED vermell "poder" del relé HAT s'hauria d'encendre, cosa que indica que està obtenint energia del Pi a través del GPIO. Provem que el podem controlar: ssh al Pi de nou, introduïu python i escriviu:
importar gpiozero
dev = gpiozero. DigitalOutputDevice (26, initial_value = True) dev.off ()
Hauríeu d'escoltar un "clic" audible que indiqui que el relé està activat i veureu com s'encén un LED que indica que el primer relé està en posició connectada. Ara podeu escriure
dev.on ()
La qual cosa convertiria el relé a la posició "off" (senar, ho sé …) i sortiria () de python.
Ara, mitjançant cables jumper i el cable més llarg, connecteu el relé entre la font d’alimentació de 24V i la solenoide. Vegeu l’esquema. Finalment, connecteu la electrovàlvula a una aixeta mitjançant els adaptadors i prepareu-vos per provar-ho tot repetint les ordres anteriors: haurien d’engegar i apagar l’aigua.
Connecteu una mànega a la solenoide i poseu l’altre extrem a la piscina. Ara teniu un sistema complementari de piscina controlat per ordinador i és hora de connectar un sensor per dir-li quan s’executa.
Pas 11: connecteu un sensor de nivell d’aigua
Un sensor de nivell d’aigua és simplement un flotador que connecta un circuit elèctric quan el flotador està baixat i el trenca quan flota amunt. Si l’inseriu a la piscina a l’alçada adequada, el flotador pujarà quan el nivell de l’aigua sigui adequat, però caurà quan no hi hagi prou aigua.
Perquè el Raspberry Pi conegui l’estat del sensor de nivell d’aigua, necessitem que el Pi detecti un circuit obert o tancat. Per sort, això és molt senzill: els mateixos connectors GPIO que fem servir com a sortida digital per controlar els relés poden actuar com a entrades (d’aquí la I de GPIO). Concretament, si connectem un cable del sensor a + 3,3 V al connector GPIO i l’altre cable del sensor a un pin que configurem com a entrada desplegable (és a dir, que normalment estarà al nivell de tensió GND), aquest pin mesurarà un voltatge digital "alt" o "activat" només quan el sensor de nivell d'aigua tanca el circuit, quan el nivell de l'aigua és baix. He utilitzat el pin 16 GPIO com a entrada, que he marcat a la imatge superior.
El codi python per configurar el pin com a entrada i provar el seu estat actual és:
importar gpiozero
level_input = gpiozero. Button (16) water_low = level_input.is_pressed
Un desafiament potencial és que quan el sensor només canviï d’estat oscil·li ràpidament entre estats d’activació i apagat. La solució a això es coneix com a "denúncia" i busca un canvi d'estat consistent abans d'actuar. La biblioteca GPIOZERO té codi per fer-ho, però per alguna raó aquest codi no em va funcionar bé. Vaig escriure un bucle senzill per activar alertes IFTTT quan es detecta un canvi d’estat consistent, que podeu trobar al meu dipòsit aquí.
Pas 12: escriviu codi per lligar-ho tot
Això és. La nostra configuració s'ha completat. Podeu escriure el vostre propi codi per lligar les coses en un sistema complet o utilitzar el codi que us proporciono. Per fer-ho, només cal crear l’estructura de directoris i clonar el dipòsit, així:
mkdir poolpi
cd poolpi git clon
A continuació, editeu els fitxers anomenats ifttt_url.txt als directoris motion_alert i water_level per tenir l'URL del vostre propi ganxo web IFTTT amb la vostra clau secreta. Podeu utilitzar dos ganxos web diferents per a diferents accions.
Finalment, volem que aquest codi s’executi automàticament. La forma més senzilla d’aconseguir-ho és mitjançant el servei crontab de Linux. Podem afegir algunes línies crontab per a dues tasques principals:
- Executeu els nostres tres programes: el detector d’objectes, el sensor de nivell d’aigua i el servidor web a cada reinici
- Netejar el directori de sortida, suprimir imatges antigues i fitxers de vídeo antics (he triat suprimir fitxers de més d'un dia i imatges de més de 7 dies; no dubteu a experimentar)
Per fer-ho, escriviu crontab -e que obrirà el vostre editor de text nano. Afegiu les línies següents a la part inferior del fitxer:
0 1 * * * find / home / pi / poolpi / output -type f -name "*.avi" -mtime +1 -delete
0 2 * * * find / home / pi / poolpi / output -type f -name "*.jpg" -mtime +7 -delete @reboot python3 /home/pi/poolpi/motion_alert/webserv/webserv.py @reboot python3 /home/pi/poolpi/motion_alert/motion_obj_alert.py @reboot python3 /home/pi/poolpi/water_level/test_water_level.py
Finalment, reinicieu el vostre Raspberry Pi. Ara està a punt per mantenir la piscina plena i segura.
Feu jocs amb la configuració, el codi i no us oblideu d’estrellar el meu repositori de github i comentar-ne l’informable si ho trobeu útil. Sempre busco aprendre més.
Feliç fer!
Segon classificat del IoT Challenge
Recomanat:
Panzer VIII Maus impulsat per Microbit: 4 passos
Panzer VIII Maus Driven by Microbit: Va ser en aquest semestre que la classe dotada de la nostra escola va tenir un curs especial: Utilitzar BBC micro: bit per alimentar un cotxe imprès en 3D. Però no em va agradar el marc que ens va fer el professor (ja ho saps , escriviu " BitCar Micro Bit " a Google i veureu molts
Controlador de ventilador impulsat per CPU i GPU: 6 passos (amb imatges)
Controlador de ventilador impulsat per CPU i GPU: recentment he actualitzat la meva targeta gràfica. El nou model de GPU té un TDP més alt que la meva CPU i una GPU antiga, de manera que també volia instal·lar ventiladors de carcassa addicionals. Malauradament, el meu MOBO només té 3 connectors de ventilador amb control de velocitat i només es poden enllaçar a
Monitoratge biològic: 8 passos (amb imatges)
Monitoratge biològic: Hola a tothom, en el context d’un projecte estudiantil, se’ns va demanar que publiquéssim un article que descrivís tot el procés. A continuació, us presentarem el funcionament del nostre sistema de monitorització biològica. Es tracta d’un dispositiu portàtil que permet controlar la humitat
Monitoratge intel·ligent de casa mitjançant Alexa i Arduino: 9 passos (amb imatges)
Monitoratge intel·ligent de casa mitjançant Alexa i Arduino: al món actual, la gent passa més temps al lloc de treball que a casa seva. Per tant, es necessita un sistema de control de la llar on la gent pugui conèixer les condicions de la casa mentre treballa. Seria encara millor si es c
Lightshow del punter làser impulsat per la música: 7 passos (amb imatges)
Music Driven Laser Pointer Lightshow: a diferència del mirall del truc del subwoofer, aquest bricolatge us mostra com crear un espectacle de llum molt barat, basat en la música, que realment visualitzi el so