Taula de continguts:

Domòtica súper senzilla de Raspberry Pi a 433 MHz: 7 passos
Domòtica súper senzilla de Raspberry Pi a 433 MHz: 7 passos

Vídeo: Domòtica súper senzilla de Raspberry Pi a 433 MHz: 7 passos

Vídeo: Domòtica súper senzilla de Raspberry Pi a 433 MHz: 7 passos
Vídeo: Projeto 11 - Controlando o SONOFF TH16 + Google Assistant + Raspberry Pi 4 - Makers casa dos Jetsons 2024, De novembre
Anonim
Domòtica súper senzilla de Raspberry Pi a 433 MHz
Domòtica súper senzilla de Raspberry Pi a 433 MHz

Aquest tutorial és un dels molts a l’hora d’utilitzar un Raspberry Pi per controlar els dispositius sense fils de casa. Com molts altres, us mostrarà com utilitzar un parell de transmissor / receptor econòmic connectat al vostre Pi per interactuar amb els dispositius que funcionen a la banda de freqüència de ràdio de 433 MHz. Us mostrarà específicament com encendre o apagar qualsevol dispositiu elèctric mitjançant el Pi mitjançant la transmissió d’ordres a un conjunt de preses d’alimentació controlades a distància de 433 MHz.

Per què he creat aquest tutorial si ja n’hi ha tantes? Principalment perquè gairebé tots els altres tutorials amb què em vaig trobar semblaven complicar massa les coses, sobretot pel que fa al programari. Vaig notar que confiaven en gran mesura en biblioteques de tercers, scripts o fragments de codi per fer tota la feina. Molts ni tan sols explicarien què feia el codi subjacent: només us demanaven que introduïu dos o tres programes al vostre Pi i que executeu un munt d’ordres, sense preguntes. Tenia moltes ganes de provar d’utilitzar el meu Pi per encendre i apagar dispositius elèctrics a casa meva mitjançant un conjunt de preses de control remot de 433 MHz, però volia crear la meva pròpia versió del sistema que pogués comprendre, amb sort, eliminant la necessitat de utilitzeu biblioteques o scripts d'algú altre.

D’això tracta aquest tutorial. El costat del programari d’aquest sistema consta de dos scripts Python molt senzills: un per rebre i enregistrar senyals i un per transmetre aquests senyals a les preses d’alimentació sense fils. La recepció / transmissió real del senyal només depèn de la biblioteca RPi. GPIO de fàcil ús que, almenys per a mi, va venir preinstal·lada amb Raspbian. Aquesta biblioteca també es pot importar directament a Python.

Per a aquest projecte necessitareu:

Un Raspberry Pi. Qualsevol model hauria de funcionar, he utilitzat un kit d’inici tot en un, però potser només necessiteu la unitat central

Un parell transmissor / receptor de 433 MHz. Els més utilitzats en aquest tipus de projectes semblen ser aquests. La compra d’un paquet de cinc com l’enllaç assegura que teniu uns quants recanvis

Un conjunt de preses de corrent controlades a distància de 433 MHz. Els he fet servir, que us recomanaria, però hi ha infinitat de models disponibles. Assegureu-vos que funcionen amb aquesta freqüència

Alguns accessoris per a la construcció de circuits. Recomanaria utilitzar una placa de connexió i alguns cables de pont per facilitar el procés de construcció del circuit.

[Si decidiu comprar algun d'aquests productes, us agrairia molt que accedís a les fitxes mitjançant els enllaços anteriors; d'aquesta manera obtindré una petita part dels beneficis sense cap cost addicional per a vosaltres.]

Pas 1: Configuració de la unitat receptora

Configuració de la unitat receptora
Configuració de la unitat receptora

Abans de poder utilitzar el Pi per enviar ordres als sòcols controlats a distància, heu de saber a quins senyals específics responen. La majoria de preses de control remot s’envien amb un telèfon que es pot utilitzar per encendre o apagar unitats específiques. En el cas dels que he comprat, el telèfon té quatre files de botons ON / OFF aparellats, cadascun dels quals envia un senyal ON o OFF a una unitat de sòcol particular.

Això ens planteja una pregunta: com sabem quins botons corresponen a quin sòcol? En realitat, això depèn del model que tingueu. Una de les principals raons per les quals he escollit el meu estil particular de sòcol (enllaçat a la introducció) és que les unitats es poden configurar amb un commutador físic per fer que un sòcol concret respongui a un conjunt concret de botons ON / OFF del telèfon. Això també vol dir que podeu desconnectar i moure els endolls per la casa sabent que cada unitat sempre respondrà als mateixos senyals ON / OFF.

Un cop hàgiu comprovat com interactuen els vostres endolls amb el telèfon, haureu d'utilitzar la unitat de receptor de 433 MHz (que es mostra a la part superior) per "ensumar" els codis que envia el telèfon. Un cop hàgiu enregistrat les formes d'ona d'aquests codis, podeu reproduir-les amb Python i enviar-les mitjançant la unitat transmissora.

El primer que heu de fer aquí és connectar els pins del vostre receptor als pins GPIO correctes del Pi. La unitat receptora té quatre pins, però només se’n necessiten tres. Crec que tots dos pins centrals donen la mateixa sortida, de manera que només heu de connectar-vos a un d’ells (tret que vulgueu transmetre els senyals rebuts a dos pins GPIO separats).

La imatge superior resumeix pràcticament el cablejat. Cada pin del receptor es pot connectar directament al pin corresponent del Pi. Faig servir una placa de connexió i cables de pont per fer el procés una mica més elegant. Tingueu en compte que podeu triar qualsevol pin de dades GPIO per connectar-lo a qualsevol dels pins del receptor central. He utilitzat el passador marcat com a "23" a la capçalera del meu Pi.

IMPORTANT: si connecteu el pin marcat com a "3v3" a la imatge anterior a un pin de tensió superior al Pi (per exemple, 5v), probablement danyareu el Pi ja que els pins GPIO no poden tolerar tensions superiors a 3v3. Com a alternativa, podeu alimentar-lo amb 5v i configurar un divisor de tensió per enviar un voltatge segur al pin DATA.

L’abast del receptor no serà molt gran a aquesta tensió, sobretot si no hi ha una antena connectada. Tanmateix, aquí no necessiteu un abast llarg, sempre que el receptor pugui captar els senyals del telèfon quan es mantenen al costat de l’altre, això és tot el que necessitem.

Pas 2: ensumar els codis del telèfon

Ensumar els codis del telèfon
Ensumar els codis del telèfon

Ara que el vostre receptor està connectat al Pi, podeu començar la primera etapa emocionant d’aquest projecte: el sniff. Això implica utilitzar l'script Python adjunt per enregistrar el senyal transmès per l'auricular quan es prem cada botó. L’escriptura és molt senzilla i us recomanaria que la feu abans d’executar-la; al cap i a la fi, el punt d’aquest projecte és que no només executareu a cegues el codi d’una altra persona.

Abans d’iniciar aquest procés, haureu d’assegurar-vos que teniu les biblioteques Python necessàries per executar l’escript de sniffer. Es mostren a la part superior del guió:

des de la data i hora d'importació de la data

importar matplotlib.pyplot com a pyplot importar RPi. GPIO com a GPIO

Les biblioteques RPi. GPIO i datetime es van incloure amb la meva distribució Raspbian, però vaig haver d’instal·lar la biblioteca matplotlib de la següent manera:

sudo apt-get install python-matplotlib

Aquesta biblioteca és una biblioteca de dibuix de gràfics d’ús habitual que és molt útil fins i tot fora d’aquest projecte, de manera que instal·lar-la definitivament no pot fer mal. Un cop les biblioteques estiguin actualitzades, ja podreu començar a enregistrar dades. A continuació s’explica com funciona el guió:

Quan s'executa (mitjançant l'ordre 'python ReceiveRF.py'), configurarà el pin GPIO definit com a entrada de dades (el pin 23 per defecte). A continuació, mostra el pin contínuament i registra si està rebent un digital o 1. Això continua durant una durada determinada (5 segons per defecte). Quan s'assoleix aquest límit de temps, l'script deixarà de gravar dades i tancarà l'entrada GPIO. A continuació, realitza una mica de post-processament i representa el valor d'entrada rebut en funció del temps. Una vegada més, si teniu preguntes sobre què fa el guió, probablement els pugueu respondre vosaltres mateixos després de veure com funciona. He intentat que el codi sigui el més llegible i senzill possible.

El que heu de fer és mirar quan l’escriptura indica que ha començat a gravar **. Quan aparegui aquest missatge, haureu de mantenir premut un dels botons del telèfon durant aproximadament un segon. Assegureu-vos de mantenir-lo a prop del receptor. Un cop l’escriptura hagi acabat de gravar, utilitzarà matplotlib per traçar una forma d’ona gràfica del senyal que ha rebut durant l’interval de gravació. Tingueu en compte que si esteu connectat al vostre Pi mitjançant un client SSH com PuTTY, també haureu d’obrir una aplicació X11 per permetre la visualització de la forma d’ona. Faig servir xMing per a això (i per a altres coses, com ara fer servir el desbloqueig remot al meu Pi). Per permetre que es mostri la trama, simplement inicieu xMing abans d'executar l'script i espereu que apareguin els resultats.

Un cop aparegui la finestra de matplotlib, l'àrea d'interès de la trama hauria de ser força evident. Podeu utilitzar els controls de la part inferior de la finestra per apropar-vos fins que pugueu seleccionar els nivells màxims i màxims del senyal transmès pel telèfon mentre es manté premut el botó. Vegeu la imatge anterior per obtenir un exemple de codi complet. El senyal probablement consistirà en impulsos molt curts separats per períodes de temps similars en què no es rep cap senyal. Aquest bloc d’impulsos curts probablement anirà seguit d’un període més llarg on no es rebi res, després del qual es repetirà el patró. Un cop hàgiu identificat el patró que pertany a una única instància del codi, feu una captura de pantalla semblant a la part superior d'aquesta pàgina i continueu amb el següent pas per interpretar-lo.

Pas 3: Transcripció del senyal resultant

Transcripció del senyal resultant
Transcripció del senyal resultant

Ara que heu identificat el bloc de màxims i mínims periòdics corresponents al senyal d'un botó concret, necessitareu una manera d'emmagatzemar-lo i interpretar-lo. A l'exemple de senyal anterior, notareu que només hi ha dos patrons únics que formen tot el bloc de senyal. De vegades veus un màxim curt seguit d'un mínim llarg i, de vegades, és el contrari: un màxim llarg seguit d'un mínim curt. Quan transcrivia els meus senyals, vaig decidir utilitzar la següent convenció de noms:

1 = short_on + long_off0 = long_on + short_off

Torneu a mirar la forma d'ona etiquetada i veureu el que vull dir. Un cop hàgiu identificat els patrons equivalents del vostre senyal, tot el que heu de fer és comptar els 1 i els 0 per construir la seqüència. Quan es transcriu, el senyal anterior es pot escriure de la següent manera:

1111111111111010101011101

Ara només heu de repetir aquest procés per gravar i transcriure els senyals corresponents als altres botons del vostre telèfon i ja heu completat la primera part del procés.

Abans de tornar a enviar els senyals mitjançant el transmissor, hi ha una mica més de feina a fer. El temps entre els màxims i els mínims corresponents a un 1 o un 0 és molt important i heu d'assegurar-vos de quant de temps dura un "short_on" o un "long_off". Per als meus codis, hi havia tres dades d'informació de temps que necessitava extreure per reproduir els senyals:

  • La durada d'un interval "curt", és a dir, el començament d'un 1 o el final d'un 0.
  • La durada d'un interval "llarg", és a dir, el final d'un 1 o l'inici d'un 0.
  • La durada d'un interval "ampliat". Em vaig adonar que, quan vaig mantenir premut un botó a l’auricular, hi havia un període “Extended_off” entre cada instància repetida del bloc de senyal. Aquest retard s’utilitza per a la sincronització i té una durada fixa.

Per determinar aquests valors de temps, podeu utilitzar la funció de zoom a la finestra matplotlib per apropar-vos completament i col·locar el cursor sobre les parts rellevants del senyal. La lectura de la ubicació del cursor a la part inferior de la finestra us ha de permetre determinar l’amplada de cada part del senyal que correspon a un interval llarg, curt o ampliat. Tingueu en compte que l’eix x de la trama representa el temps i que el component x de la lectura del cursor és en unitats de segons. Per a mi, les amplades eren les següents (en segons):

  • retard_cort = 0,00045
  • retard_llarg = 0,00090 (el doble que un "curt")
  • demora_extesa = 0,0096

Pas 4: Configuració de la unitat de transmissió

Configuració de la unitat del transmissor
Configuració de la unitat del transmissor

Un cop hagueu recopilat els vostres codis i dades de temps, podreu desconnectar la unitat receptora perquè ja no la necessiteu. A continuació, podeu connectar el transmissor directament als pins PIN GPIO corresponents, tal com es mostra a la imatge anterior. He comprovat que els pins dels transmissors estan etiquetats, cosa que facilita el procés.

En aquest cas, està bé alimentar la unitat mitjançant l'alimentació de 5v del Pi, ja que el pin DATA no enviarà senyals al Pi, només els rebrà. A més, una font d'alimentació de 5v proporcionarà més abast de transmissió que l'ús de la font de 3v3. Una vegada més, podeu connectar el pin DATA a qualsevol pin apropiat del Pi. He utilitzat el pin 23 (el mateix que per al receptor).

Una altra cosa que recomanaria fer és afegir una antena al petit forat de la part superior dreta del transmissor. He utilitzat un tros de filferro recte de 17 cm de llarg. Algunes fonts recomanen un filferro enrotllat de longitud similar. No estic segur de quin és el millor, però el cable recte em proporciona prou abast per activar / desactivar els endolls des de qualsevol lloc del meu petit pis. El millor és soldar l’antena, però acabo d’eliminar part del plàstic del cable i vaig embolicar el coure pel forat.

Un cop el transmissor estigui connectat, ja és tota la configuració de maquinari feta. L’únic que queda per fer ara és establir els endolls cap a casa i fer una ullada al programa del transmissor.

Pas 5: Transmissió de senyals mitjançant el Pi

Aquí és on entra el segon script Python. Està dissenyat per ser tan senzill com el primer, si no més. Una vegada més, descarregueu-lo i consulteu el codi. Haureu d’editar l’escriptura per transmetre els senyals correctes d’acord amb les dades que heu gravat al pas 3, així que ara és un bon moment per fer-hi una ullada ràpida.

Totes les biblioteques necessàries per executar aquest script ja estaven preinstal·lades al meu Pi, de manera que no calia més instal·lació. Es mostren a la part superior del guió:

temps d'importació

import sys import RPi. GPIO com a GPIO

Sota les importacions de la biblioteca hi ha la informació que haureu d’editar. A continuació s’explica el seu aspecte per defecte (aquesta és la informació corresponent als meus sòcols segons es determina mitjançant el pas 3):

a_on = '1111111111111010101011111'

A_OFF = '1111111111111010101010111' b_on = '1111111111101110101011101' b_off = '1111111111101110101010111' c_on = '1111111111101011101011101' c_off = '1111111111101011101010111' d_on = '1111111111101010111011101' d_off = '1111111111101010111010111' short_delay = 0,00045 long_delay = 0,00090 extended_delay = 0,0096

Aquí tenim vuit cadenes de codis (dues per a cada parell de botons d’encesa / apagada del meu telèfon, és possible que tingueu més o menys codis) seguides de les tres informacions de sincronització que també es determinen al pas 3. Preneu-vos el temps per assegurar-vos que teniu ha introduït aquesta informació correctament.

Quan estigueu satisfet amb els codis / retards que heu introduït a l'script (podeu canviar el nom de les variables de la cadena de codi si voleu), ja esteu a punt de provar el sistema. Abans de fer-ho, mireu la funció transmit_code () a l'script. Aquí és on es produeix la interacció real amb el transmissor. Aquesta funció espera que s'enviï una de les cadenes de codi com a argument. A continuació, obre el pin definit com a sortida GPIO i passa per tots els caràcters de la cadena de codi. A continuació, encén o apaga el transmissor segons la informació de temps que vau introduir per crear una forma d'ona que coincideixi amb la cadena de codi. Envia cada codi diverses vegades (10 per defecte) per reduir la possibilitat que es perdi i deixa un delay_delay entre cada bloc de codi, igual que el telèfon.

Per executar l'script, podeu utilitzar la sintaxi d'ordres següent:

python TransmitRF.py code_1 code_2 …

Podeu transmetre diverses cadenes de codi amb una sola tirada de l'script. Per exemple, per activar i connectar els sòcols (a) i (b), executar l'script amb l'ordre següent:

python TransmitRF.py a_on b_on c_off

Pas 6: una nota sobre la precisió del temps

Com s'ha esmentat, el temps entre els impulsos d'encesa / apagada transmesos és força important. L'escriptura TransmitRF.py utilitza la funció time.sleep () de python per construir les formes d'ona amb els intervals de pols correctes, però cal tenir en compte que aquesta funció no és del tot precisa. La durada de la qual fa esperar l'script abans d'executar la següent operació pot dependre de la càrrega del processador en aquell instant donat. Aquesta és una altra raó per la qual TransmitRF.py envia cada codi diverses vegades, per si la funció time.sleep () no és capaç de construir correctament una instància determinada del codi.

Personalment mai he tingut problemes amb time.sleep () a l’hora d’enviar els codis. Tanmateix, sé que el meu time.sleep () tendeix a tenir un error d’uns 0,1 ms. Ho he determinat mitjançant l'script SleepTest.py adjunt que es pot utilitzar per donar una estimació de la precisió de la funció time.sleep () del vostre Pi. Per a les meves preses de control remotes particulars, el retard més curt que necessitava implementar va ser de 0,45 ms. Com he dit, no he tingut problemes amb sòcols que no responguin, de manera que sembla que 0,45 ± 0,1 ms és prou bo.

Hi ha altres mètodes per assegurar que el retard sigui més precís; per exemple, podeu utilitzar un xip PIC dedicat per generar els codis, però coses com aquesta estan fora de l'abast d'aquest tutorial.

Pas 7: Conclusió

Conclusió
Conclusió

Aquest projecte ha presentat un mètode per controlar qualsevol aparell elèctric mitjançant un Raspberry Pi i un conjunt de preses de control remot de 433 MHz, amb un enfocament de simplicitat i transparència. Aquest és el projecte més emocionant i flexible per al qual he utilitzat el meu Pi, i hi ha aplicacions il·limitades. Aquí hi ha algunes coses que ara puc fer gràcies al meu Pi:

  • Enceneu un escalfador elèctric al costat del meu llit mitja hora abans que soni l'alarma.
  • Apagueu l'escalfador una hora després d'haver dormit.
  • Enceneu la llum de nit quan es dispara l’alarma per no tornar a dormir.
  • i molts més…

Per a la majoria d’aquestes tasques, faig servir la funció crontab a Linux. Això us permet configurar tasques programades automàtiques per executar l'script TransmitRF.py en moments específics. També podeu utilitzar el Linux at command per executar tasques puntuals (que, per a mi, necessitaven instal·lar-se per separat amb 'sudo apt-get install at'). Per exemple, per encendre el meu escalfador mitja hora abans que soni l'alarma l'endemà al matí, només cal que escriviu:

a les 05:30

python TransmitRF.py c_on

També podeu fer servir aquest projecte juntament amb el meu sistema de control domèstic Dropbox per controlar els electrodomèstics per Internet. Gràcies per llegir i, si voleu aclarir alguna cosa o compartir la vostra opinió, envieu un comentari.

Recomanat: