L01 deep-sleep and LoRa transmission
-
I spent a lot of time troubleshooting weird behavior of LoRa transmission in combination with (proper) deep-sleep of L01. The weird symptom was byte errors in received messages especially in case the transmitting device was placed in colder environment. I was suspecting poor voltage regulator performance on my custom PCB, then issues with signal path between LoRa antenna pad and antenna itself. Then I checked the behavior on Pycom OEM baseboard with L01 solder on it and behaved similarly. As a next step I simplified the code:
Transmitter
from network import WLAN, LoRa import socket import machine import time wlan = WLAN() wlan.deinit() lora = LoRa(mode=LoRa.LORA, frequency=864000000, tx_power=14, bandwidth=LoRa.BW_500KHZ, sf=10, coding_rate=LoRa.CODING_4_5, tx_iq=True) lora_sock = socket.socket(socket.AF_LORA, socket.SOCK_RAW) lora_sock.setblocking(False) sample = bytearray(b'TEST1234') lora_sock.send(sample) print("LoRa message sent (%s)" % (sample)) machine.deepsleep(5000)Receiver
from network import WLAN, LoRa import socket import machine import time lora = LoRa(mode=LoRa.LORA, frequency=864000000, tx_power=14, bandwidth=LoRa.BW_500KHZ, sf=10, coding_rate=LoRa.CODING_4_5, rx_iq=True) lora_sock = socket.socket(socket.AF_LORA, socket.SOCK_RAW) lora_sock.setblocking(False) while True: recv_pkg = lora_sock.recv(512) if len(recv_pkg)>0: print(recv_pkg)Receiver output:
b'TE\x93\x94\xbd\xba\xcf"' b'T\x85\x9b\xd4\xbd6\xcfd' b'TE\x1d\x9e\xf9\xb6\x0f1' b'T\xc5?\x9e\xdf\x12\x9b\xce' b'T%\x93\xdes\x18\x19\x95'Note: some messages were not received at all
After some experiments i tried to call lora.power_mode(LoRa.SLEEP) before machine.deepsleep():
from network import WLAN, LoRa import socket import machine import time wlan = WLAN() wlan.deinit() lora = LoRa(mode=LoRa.LORA, frequency=864000000, tx_power=14, bandwidth=LoRa.BW_500KHZ, sf=10, coding_rate=LoRa.CODING_4_5, tx_iq=True) lora_sock = socket.socket(socket.AF_LORA, socket.SOCK_RAW) lora_sock.setblocking(False) sample = bytearray(b'TEST1234') lora_sock.send(sample) print("LoRa message sent (%s)" % (sample)) lora.power_mode(LoRa.SLEEP) machine.deepsleep(5000)And it did help - receiver output:
b'TEST1234' b'TEST1234' b'TEST1234' b'TEST1234' b'TEST1234'Note: tested on 1.7.5.b2 because of WiFi issues with later releases running on L01:
https://forum.pycom.io/topic/2009/l01-instabilityMy opinion is that the cause are floating SPI pins after ESP32 enters deep-sleep.
Now the question is if lora.power_mode(LoRa.SLEEP) should be called internally within machine.deepsleep() or is it developer's responsibility to do so?
I spent two days solving this issue and still do not understand coherence with lower environment temperature.
-
@danielm thanks for reporting this. We will investigate it.
-
@danielm Does adding a call to
time.sleep()(for 500 ms for instance) between thesendand thedeepsleepchange anything?Does setting the socket to blocking change anything as well?
-
@jcaron
I did not try those modifications as calling lora.power_mode(LoRa.SLEEP) before machine.deepsleep() made transmission reliable.On the other hand it may be possible that without this precaution ESP32 enters deep-sleep before transmission is finished.
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login