Hallo,
ich möchte das Jarolift Rolladen Projekt von GitHub - madmartin/Jarolift_MQTT: Controlling Jarolift TDEF 433MHZ radio shutters via ESP8266 and CC1101 Transceiver Module in asynchronous mode auf einen ESP32 mit Ethernet portieren (ich habe den Olimex ESP32-POE).
Leider komme ich nur sehr sehr mühsam voran - ich bin eigentlich ein Backend-Entwickler und nicht in der Arduino und Microcontroller-Welt beheimatet.
Zunächst habe ich es mit der CC1101-Library von PanStamp, die im Ursprungsprojekt benutzt wird, versucht. Damit gibt es einen crash beim Aufruf von cc1101.setTxState():
assert failed: spinlock_acquire spinlock.h:122 (result == core_id || result == SPINLOCK_FREE)
Backtrace: 0x40083349:0x3ffc4ed0 0x40087f7d:0x3ffc4ef0 0x4008ce61:0x3ffc4f10 0x4008acdb:0x3ffc5040 0x40088dc2:0x3ffc5080 0x400d26fc:0x3ffc50c0 0x400d1e98:0x3ffc50e0 0x400d1999:0x3ffc5100 0x400d1d1d:0x3ffc5120 0x400d1508:0x3ffc5140 0x400d15d9:0x3ffc5160 0x400d1826:0x3ffc51b0 0x400d3461:0x3ffc5230
Wie kann man dem Fehler auf die Spur kommen?
Jedenfalls habe ich es danach mit der Library SmartRC-CC1101-Driver-Lib von @LSatan versucht. Es hat lange gedauert, bis ich herausgefunden dass es beim CC1101 einen asynchronen Modus gibt und dass der beim ursprünglichen Projekt verwendet wird. Also dann die Library entsprechend eingestellt und außerdem noch die Modulation auf ASK/OOK.
Ich habe parallel noch einen NodeMCU mit der Original-Library am Laufen. Dort habe ich ein paar Ausgaben hinzugefügt, damit ich sehen kann, wenn was vom CC1101 empfangen wird. Wenn ich vom ESP32 sende, sehe ich auch dass was ankommt - leider aber kann es nicht in ein gültiges Jarolift Paket dekodiert werden und die Rolläden reagieren deswegen auch nicht.
Ich habe schon mehrfach geprüft, dass vom ESP32 inhaltlich genau das gesendet wird, wie es auch in der Original-Library gesendet wird. Alle Variablen sind 100% identisch. Es liegt schlicht an dem Handling mit dem CC1101, irgendwas muss da falsch eingestellt sein.
Dann habe ich beim NodeMCU alle Register des CC1101 ausgegeben und sie im ESP32 genauso eingestellt. Damit empfange ich dann beim NodeMCU allerdings überhaupt nichts mehr
Hier ist mal der Code, wie ich den CC1101 initialisiere:
ELECHOUSE_cc1101.setGDO(TXPin, RXPin); // GDO0, GDO2
ELECHOUSE_cc1101.setSpiPin(SCKPin, MISOPin, MOSIPin, CSNPin);
ELECHOUSE_cc1101.Init();
ELECHOUSE_cc1101.setCCMode(0); // set config for internal transmission mode.
ELECHOUSE_cc1101.SpiWriteReg(CC1101_FREQ2, CC1101_DEFVAL_FREQ2_433);
ELECHOUSE_cc1101.SpiWriteReg(CC1101_FREQ1, CC1101_DEFVAL_FREQ1_433);
ELECHOUSE_cc1101.SpiWriteReg(CC1101_FREQ0, CC1101_DEFVAL_FREQ0_433);
ELECHOUSE_cc1101.setPA(12); // Set TxPower. The following settings are possible depending on the frequency band. (-30 -20 -15 -10 -6 0 5 7 10 11 12) Default is max!
// Modulation 2 is correct for Jarolift!
ELECHOUSE_cc1101.setModulation(2); // Set modulation mode. 0 = 2-FSK, 1 = GFSK, 2 = ASK/OOK, 3 = 4-FSK, 4 = MSK.
// Async mode is correct for Jarolift!
ELECHOUSE_cc1101.setPktFormat(3); // Format of RX and TX data.
// 0 = Normal mode, use FIFOs for RX and TX.
// 1 = Synchronous serial mode, Data in on GDO0 and data out on either of the GDOx pins.
// 2 = Random TX mode; sends random data using PN9 generator. Used for test. Works as normal mode, setting 0 (00), in RX.
// 3 = Asynchronous serial mode, Data in on GDO0 and data out on either of the GDOx pins.
ELECHOUSE_cc1101.setCrc(0); // 1 = CRC calculation in TX and CRC check in RX enabled. 0 = CRC disabled for TX and RX.
ELECHOUSE_cc1101.setSyncMode(0); // Combined sync-word qualifier mode.
// 0 = No preamble/sync.
// 1 = 16 sync word bits detected.
// 2 = 16/16 sync word bits detected.
// 3 = 30/32 sync word bits detected.
// 4 = No preamble/sync, carrier-sense above threshold.
// 5 = 15/16 + carrier-sense above threshold.
// 6 = 16/16 + carrier-sense above threshold.
// 7 = 30/32 + carrier-sense above threshold.
// Should be equivalent of cc1101.disableAddressCheck();
ELECHOUSE_cc1101.setAdrChk(0); // Controls address check configuration of received packages.
// 0 = No address check.
// 1 = Address check, no broadcast.
// 2 = Address check and 0 (0x00) broadcast.
// 3 = Address check and 0 (0x00) and 255 (0xFF) broadcast.
// set data rate, got it from dumping NodeMCU
ELECHOUSE_cc1101.SpiWriteReg(CC1101_MDMCFG4, 0xF8);
ELECHOUSE_cc1101.SpiWriteReg(CC1101_MDMCFG3, 0x11);
Es wäre super, wenn mir jemand Tipps geben könnte, an was sowas liegen kann. Ich bin langsam mit meinem Latein am Ende.
Danke + Gruß