Inhoudsopgave:

Arduino RF-sensordecoder - Ajarnpa
Arduino RF-sensordecoder - Ajarnpa

Video: Arduino RF-sensordecoder - Ajarnpa

Video: Arduino RF-sensordecoder - Ajarnpa
Video: Decode any IR remote using Arduino | Easy way 2024, November
Anonim
Arduino RF-sensordecoder
Arduino RF-sensordecoder

Mijn vorige huis werd geleverd met een vooraf geïnstalleerd beveiligingssysteem met deursensoren, een bewegingssensor en een bedieningspaneel. Alles was vast aangesloten op een grote elektronicadoos in een kast en er waren instructies voor het bedraden van een vaste telefoon om automatisch uit te bellen in geval van een alarm. Toen ik ermee probeerde te spelen, ontdekte ik dat een van de deursensoren niet volledig was geïnstalleerd en een andere af en toe was vanwege onjuiste uitlijning. Tot zover de professionele installatie die wordt aangeprezen op het visitekaartje van het beveiligingsbedrijf. Mijn oplossing destijds was om een paar internetbeveiligingscamera's en een goedkoop draadloos beveiligingsalarm te kopen.

Snel vooruit naar vandaag en dat draadloze alarm zit in een doos in mijn kelder. Na mijn aanschaf van een goedkope RF-ontvanger besloot ik te kijken of ik de berichten kon decoderen die werden verzonden door de verscheidenheid aan alarmsensoren en afstandsbedieningen die ik heb. Ik dacht dat, aangezien ze allemaal met de goedkope alarmbox werkten, ze allemaal hetzelfde berichtformaat moesten gebruiken met alleen een andere ID. Ik kwam er al snel achter dat ze alleen vergelijkbaar zijn in de algemene structuur van de berichten. Zo ging het project al snel van triviaal naar heel interessant.

Stap 1: Sensormodules

Sensormodules
Sensormodules
Sensormodules
Sensormodules
Sensormodules
Sensormodules
Sensormodules
Sensormodules

Zoals u op de bovenstaande afbeeldingen kunt zien, bevatten de zenders deuropensensoren, bewegingsdetectoren, afstandsbedieningen voor inschakelen en een draadloos toetsenbord dat wordt gebruikt voor het programmeren van de alarmbox. Het blijkt dat geen twee van deze apparaten dezelfde synchronisatielengte of bitduur gebruiken. De enige overeenkomst, behalve de berichtlengte, is het basisformaat van de bits. Elke bit neemt een vaste tijdsperiode in beslag, waarbij het verschil tussen een nul en een één de werkcyclus van de hoge/lage delen is.

De mooie golfvorm die hierboven wordt getoond, is NIET wat ik voor het eerst ontving. Omdat er zoveel verkeer is in de 433 MHz-frequentieband, moest ik ervoor zorgen dat ik de sensor activeerde net voordat ik de scope instelde om een enkele trigger uit te voeren. Gelukkig geven de sensoren meerdere kopieën van het databericht wanneer ze worden geactiveerd en blijven de afstandsbedieningen en het toetsenbord berichten uitvoeren zolang een toets wordt ingedrukt. Door de scope te gebruiken, kon ik de synchronisatielengte en de databitduur voor elk item bepalen. Zoals eerder vermeld, zijn de synchronisatietijden verschillend en zijn de bittijden verschillend, maar de berichtformaten hebben allemaal een synchronisatie op laag niveau, gevolgd door 24 databits en één stopbit. Dat was genoeg voor mij om een generieke decoder in software te kunnen bouwen zonder alle verschillende details voor elk apparaat hard te moeten coderen.

Stap 2: Hardware

Hardware
Hardware
Hardware
Hardware

Ik heb oorspronkelijk een sensordecoder gebouwd met behulp van een PIC-microcontroller en assembleertaal. Ik heb onlangs met Arduino-varianten gespeeld, dus ik dacht dat ik zou kijken of ik het kon repliceren. Het eenvoudige schema is hierboven weergegeven en er is ook een foto van mijn prototype. Het enige wat ik deed was om drie gemeenschappelijke jumperdraden te gebruiken om van de Arduino Nano naar het RF-ontvangerbord te gaan. Stroom en een enkele datalijn zijn alles wat nodig is.

Als je mijn Instructable op de "3-in-1 tijd- en weerweergave" leest, zul je zien dat ik een gewone RXB6, 433-MHz-ontvanger gebruik. Je kunt misschien de echt goedkope ontvangers aan het werk krijgen op het korte bereik dat nodig is voor dit project, maar ik raad toch aan om een super-heterodyne ontvanger te gebruiken.

Stap 3: Software

De software zet de ontvangen bits om in weer te geven ASCII-tekens. Het geeft de waarde van de synchronisatielengte en de lengtes van de 1 en 0 bits weer. Omdat ik de synchronisatielengtes en de bitformaten al kende, had ik de software speciaal voor hen kunnen schrijven. In plaats daarvan besloot ik te kijken of ik het kon schrijven om de synchronisatielengtes te sorteren en automatisch de databits te achterhalen. Dat zou het gemakkelijker moeten maken om te wijzigen voor het geval ik op een bepaald moment andere formaten wil proberen te detecteren. Het is belangrijk op te merken dat de software niet weet of het eerste bit van een bericht een 1 of een 0 is. Het gaat ervan uit dat het een 1 is, maar als het erachter komt dat het een nul had moeten zijn, zal het de bits in het voltooide bericht voordat het de seriële poort wordt verzonden.

De tijden van de sync-puls en de databits worden bepaald door gebruik te maken van de INT0 externe interrupt-ingang om een interrupt-handler te triggeren. INT0 kan worden geactiveerd bij stijgende, dalende of beide flanken, of op een stabiel laag niveau. De software wordt aan beide kanten onderbroken en meet hoe lang de puls laag blijft. Dat vereenvoudigt de zaken omdat het bericht start/sync een low-level puls is en de bits kunnen worden bepaald op basis van hun low-level tijd.

De interrupt-handler bepaalt eerst of de vastgelegde telling lang genoeg is om een start/sync-puls te zijn. De verschillende apparaten die ik heb gebruiken synchronisatiepulsen van 4, 9, 10 en 14 milliseconden. De definitie-instructies voor de min/max toegestane synchronisatiewaarden staan vooraan in de software en zijn momenteel ingesteld op 3 en 16 milliseconden. De bittijden variëren ook tussen de sensoren, dus het algoritme voor het decoderen van bits moet daar rekening mee houden. De bittijd van de eerste bit wordt opgeslagen, evenals de tijd van een volgende bit die een significant verschil heeft met de eerste bit. Een directe vergelijking van opeenvolgende bittijden is niet mogelijk, daarom wordt een "fudge-factor"-definitie ("Variation") gebruikt. De bitdecodering begint door aan te nemen dat de eerste databit altijd wordt geregistreerd als een logische 1. Die waarde wordt opgeslagen en vervolgens gebruikt om de volgende bits te testen. Als een volgende databittelling binnen het variantievenster van de opgeslagen waarde valt, wordt het ook geregistreerd als een logische 1. Als het buiten het variantievenster van de opgeslagen waarde ligt, wordt het geregistreerd als een logische 0. Als de logische 0 bittijd korter is dan de eerste bittijd, dan wordt er een vlag ingesteld om de software te vertellen dat de bytes moeten worden omgekeerd voordat ze worden weergegeven. Het enige geval waarin dit algoritme faalt, is wanneer de bits in een bericht allemaal nullen zijn. We kunnen die beperking accepteren omdat zo'n bericht zinloos is.

De sensoren waarin ik geïnteresseerd ben, hebben allemaal een berichtlengte van 24 databits, maar de software is niet beperkt tot die lengte. Er is een buffer voor maximaal zeven bytes (er kunnen meer worden toegevoegd) en definieert de minimale en maximale berichtlengte in bytes. De software is ingesteld om de bits te verzamelen, ze om te zetten in bytes, ze tijdelijk op te slaan en ze vervolgens via de seriële poort in ASCII-formaat uit te voeren. De gebeurtenis die de uitvoer van het bericht activeert, is de ontvangst van een nieuwe start-/synchronisatiepuls.

Stap 4: Gegevensregistratie

Gegevens bijhouden
Gegevens bijhouden

De software is ingesteld om de geconverteerde gegevens als ASCII-tekens uit te voeren via de seriële (TX) uitvoer van de Arduino. Toen ik de PIC-versie maakte, moest ik verbinding maken met een terminalprogramma op de pc om de gegevens weer te geven. Een voordeel van de Arduino IDE is dat deze een ingebouwde seriële monitorfunctie heeft. Ik stel de seriële poortsnelheid in op 115,2k en stel vervolgens het seriële monitorvenster in op dezelfde snelheid. De schermafbeelding hier toont een typisch display met uitgangen van verschillende sensoren die ik heb. Zoals je kunt zien, zijn de gegevens soms niet perfect, maar je kunt gemakkelijk bepalen wat de echte waarde van elke sensor zou moeten zijn.

Stap 5: voorbeeldontvangersoftware

Voorbeeldontvangersoftware
Voorbeeldontvangersoftware

Ik heb een voorbeeldsoftwarelijst toegevoegd die laat zien hoe u de verzamelde informatie kunt gebruiken om een specifieke set codes voor uw toepassing te ontvangen. Dit voorbeeld is ingesteld om een van mijn externe Etekcity-stopcontacten te emuleren. Met één commando wordt de LED ingeschakeld die in de Nano (D13) is ingebouwd en met het andere commando wordt de LED uitgeschakeld. Als je geen LED hebt ingebouwd in je Arduino, voeg dan de weerstand en LED toe zoals weergegeven in het diagram. In een echte toepassing zou deze functie de stroom aan/uit zetten voor een stopcontact (met behulp van een relais of een triac). De synchronisatietijden, bittijden en verwachte databytes zijn allemaal vooraf gedefinieerd voor eenvoudige wijziging. U kunt elk van de resterende datalijnen gebruiken om dingen aan/uit te zetten, enz. voor uw specifieke toepassing. Voeg gewoon de toepasselijke commandocode toe die definieert en vervang de LED aan/uit-logica in "lus" om aan uw behoeften te voldoen.

Aanbevolen: