sobota, 25 listopada 2017

Router 433 MHz - nauka czytania i pisania

No dobra - zaczynamy.

Najpierw uwaga.

Mój router 433 MHz będzie łączył urządzenia pracujące ze stałym kodem. To jest takie, które w czasie normalnej pracy za każdym razem wysyłają taką samą sekwencję. Oczywiście kod ten można zmienić na etapie konfiguracji (ręcznie lub automatycznie) ale generalnie kod jest niezmienny. Co to oznacza dla użytkownika? Taki kod można odczytać i nim się posłużyć. I o ile stosowanie tego typu sterowania do zapalania świateł, załączania grzania czy sterowania podlewaniem ogrodu jest stosunkowo bezpieczne to już bramy garażu czy drzwi wejściowych takim systemem bym nie otwierał. Stosowanie urządzeń ze stałym kodem w obrębie domu w zasadzie ogranicza propagację sygnałów sterujących do obszaru naszej działki. Ale w mieszkaniu jest on już odbierany u sąsiadów. Decyzję czy stosować urządzenia bezprzewodowe ze stałym kodem należy zawsze przeanalizować pod kątem naszego bezpieczeństwa. Co by było gdyby.......... Gdy zależy nam na poufności dostępu należy stosować  urządzenia z kodem zmiennym (kroczącym) - i takie są w większości układów sterowania bram garażowych czy pilotów samochodowych.

Część I - Układ testowy


Zanim zacznę cokolwiek rzeźbić w oprogramowaniu warto poskładać jakiś próbny układ. Transmisja radiowa to dosyć kapryśne medium i warto od samego początku testować poszczególne funkcje na rzeczywistym układzie. Szczególnie, że nie mam jeszcze większych doświadczeń ze współpracy modułów radiowych CY z ESP8266. Również standardowe biblioteki Arduino do obsługi protokołów w paśmie 433MHz mogą zachowywać się różnie na tym mikrokontolerze.

Układ jest banalny - poskładane na szybko ESP w wersji D1 MINI i dwa moduły CY - nadawczy CYT1 i odbiorczy CY-07. Nie daję osobnego zasilania. Wszystko ma czerpać energię z USB. Oba moduły radiowe jadą na 5 V choć zasilenie nadajnika z 12 V znakomicie powiększyłoby zasięg. Dodałem jednak oryginalną antenkę z bezprzewodowej czujki PIR i to powinno znacząco  poprawić osiągi. Zasilenie ESP8266 napięciem 3V3 rozwiązano skutecznie na module D1 MINI. Pytanie tylko czy USB pociągnie bez czkawki taki zestaw. ESP jest bardzo wrażliwy na wahania napięcia zasilania i lubi się resetować.
Całość zmieściła się na niewielkiej płytce prototypowej  Zasilanie i programowanie  dokonuje się jednym kablem. D1 MINI to naprawdę super moduł do szybkiego wdrażania projektów na ten chiński mikroprocesor.

Napięcie zasilania sprawdzone - o dziwo trzyma się nawet w okolicach 5 V.  Testowy program BLINK mrugający ledem na modle D1 działa więc komunikacja jest OK. Można zaczynać.

CZĘŚĆ II - Moduł radiowy - odbiornik


Zaczniemy od odbiornika. Standardowo używam biblioteki RCSwitch.h.  Jest uniwersalna i daje sobie radę z większością kodów stałych. Pozwala ona na odbiór i wysyłanie sygnałów obsługiwanych przez następujące chipsety
  • SC5262 / SC5272
  • HX2262 / HX2272
  • PT2262 / PT2272
  • EV1527 / RT1527 / FP1527 / HS1527
  • Intertechno outlets
  • HT6P20X
Trochę informacji o kodach stosowanych w tych kościach tu>>>> i tu>>>>
Moduły radiowe i biblioteka RCswitch działa świetnie z modułami Arduino. Mam nadzieję, że z ESP będzie podobnie. Podstawowy kod do odbioru danych to lekko zmodyfikowany przykład wprost z biblioteki Arduino


#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

void no433setup()
{ mySwitch.enableReceive(12);  //
  mySwitch.enableTransmit(13); //
}

void no433akcja()
{ // procedura obsługi kodu odebranego z 433MHz
  if (mySwitch.available()) {
    Serial.print("Received ");
    Serial.print( mySwitch.getReceivedValue() );
    Serial.print("  / ");
    Serial.print( mySwitch.getReceivedBitlength() );
    Serial.print("bit ");
    Serial.print("Protocol: ");
    Serial.print( mySwitch.getReceivedProtocol() );
    Serial.print("  / PulseLength: ");
    Serial.println(mySwitch.getReceivedDelay() );
mySwitch.resetAvailable(); } }

Moduły wiszą na porcie GPIO12 i 13.
A to wyniki rzeczywistych odczytów kilku przykładowych nadajników 433MHz

Pilot ELRO
Received 5522769  / 24bit Protocol: 1  / PulseLength: 324
Received 5522769  / 24bit Protocol: 1  / PulseLength: 325

ten sam kod z innego pilota ELRO

Received 5522769  / 24bit Protocol: 1  / PulseLength: 338
Received 5522769  / 24bit Protocol: 1  / PulseLength: 339

Termostat DIGITIME
Received 5592332  / 24bit Protocol: 1  / PulseLength: 212
Received 5592332  / 24bit Protocol: 1  / PulseLength: 211

Pilot od termostatu DIGITIME
Received 5592324  / 24bit Protocol: 1  / PulseLength: 190
Received 5592324  / 24bit Protocol: 1  / PulseLength: 192

Czujka PIR jednego producenta
Received 14013756  / 24bit Protocol: 1  / PulseLength: 409
Received 14013756  / 24bit Protocol: 1  / PulseLength: 408

Czujka PIR drugiego producenta
Received 5591381  / 24bit Protocol: 1  / PulseLength: 456
Received 5591381  / 24bit Protocol: 1  / PulseLength: 455

Czujka PIR trzeciego producenta
Received 69653  / 24bit Protocol: 1  / PulseLength: 319
Received 69653  / 24bit Protocol: 1  / PulseLength: 319

Czujnik kontaktronowy
Received 3150041  / 24bit Protocol: 1  / PulseLength: 405
Received 3150041  / 24bit Protocol: 1  / PulseLength: 404

Czujnik kontaktronowy innego producenta
Received 5784067  / 24bit Protocol: 1  / PulseLength: 571
Received 5784067  / 24bit Protocol: 1  / PulseLength: 571

Jak widać rozrzuty i długości kodów a przede wszystkim długości okresów w nadawanych kodach znacznie się różnią. Praktycznie każdy z producentów ma swoje indywidualne nastawy. To zrozumiałe:) i jednocześnie wyjaśnia niemożność współpracy tych urządzeń. A więc potrzeba zrobienia rutera dopasowującego charakterystyki kodów urządzeń nadawczych i odbiorczych różnych marek staje się oczywistą oczywistością!
Nie wszystkie urządzenia da się odczytać tą biblioteką. Nie udało się zdekodować sygnału np. z dzwonka bezprzewodowego czy stacji pogodowej. Nad tymi elementami trzeba będzie jeszcze trochę popracować.

CZĘŚĆ III - Modułu radiowy - nadajnik


Jak wiadomo co i jak nadają nasze urządzenia łatwo jest zmusić program to powtórzenia takich samych sekwencji kodu.

Sterowanie konkretnym urządzeniem trzeba poprzedzić wstępną konfiguracją parametrów transmisji. Najlepiej skupić to w jednej funkcji. I tak do załączenia gniazda ELRO przyda się taka procedura

void sendkodpilot (unsigned long codeA)
{
  mySwitch.setPulseLength(320);
  mySwitch.setProtocol(1);
  mySwitch.setRepeatTransmit(4);
  mySwitch.send(codeA, 24);
}

Wywołanie procedury sendkodpilot (kod) gdzie kod = kod dla danego gniazda niechybnie spowoduje jego załączenie lub wyłączenie. Dla innych urządzeń wykonawczych parametry procedury "send" należy odpowiednio dopasować

I to wszystko!!!

Nie ma tak łatwo


Niestety co pewien czas wyskakuje dobrze znany w ESP8266 komunikat o resecie modułu.
--------------------------
Exception (0):
epc1=0x40204d78 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
ctx: sys 
sp: 3ffffc30 end: 3fffffb0 offset: 01a0
>>>stack>>>
3ffffdd0:  40106bb4 40101591 00000002 4000050c  
3ffffde0:  ffffffff 00000020 00000001 00000000  

............................................................................

3fffff90:  3ffee510 00000000 40000f65 3fffdab0  
3fffffa0:  40000f49 00019b0b 3fffdab0 40000f49  
<<<stack<<<

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)
load 0x4010f000, len 1384, room 16 
tail 8
chksum 0x2d
csum 0x2d
v3de0c112
~ld
------------------------
Przyczyn takiego stanu może być wiele. Od nieaktualnego oprogramowania procesora do zakłóceń na zasilaniu lub portach wejściowych. Trzeba więc znowu wrócić do hardwaru .  Trudno - czeka mnie chwilowa przerwa w programowaniu routera 433 MHz

Ale jak mniemam ciąg dalszy nastąpi

Wcześniejsze odcinki serialu
http://100-x-arduino.blogspot.com/2017/11/router-433-mhz-aczymy-rozne-systemy.html

103

Brak komentarzy:

Publikowanie komentarza