Welcome to the Pycom forum Forum
    • \[\[global:header.categories\]\]
    • \[\[global:header.recent\]\]
    • \[\[global:header.tags\]\]
    • \[\[global:header.popular\]\]
    • Login

    Explore Pybytes | Official Documentation | Report a Firmware Bug/Issue | GitHub

    Using Lopy1 for just LoRa

    Scheduled Pinned Locked Moved LoPy
    lopyloralora gatewaylora lopyuart
    11 Posts 3 Posters 1.6k Views 3 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • B Offline
      Burgeh
      last edited by

      Greetings,

      How applicable is using two LoPy1 SOICs to communicate via LoRa, but not as a packet forwarder? To clarify more, I basically would like to know how well it would work to use a LoPy to act somewhat like a gateway, for receiving data from other LoPys via LoRa. However, once I get that data I want to send it out via UART. No forwarding.

      I have done this with the ping-pong example, but how well would this work on a larger scale? Like 20 LoPys sending to the same "listening LoPy".

      Thanks!

      robert-hhR 1 Reply Last reply Reply Quote 0
      • robert-hhR Offline
        robert-hh @Burgeh
        last edited by

        @burgeh You can do that with raw LoRa. if you look at the nanogateway examples, the gateway are configures as Raw Lora Devices. If it is just one direction, nodes to "gateway", that should be simple. If you want to implement a kind of downlink, you have to add more elements of a protocol, such that the nodes in your net can tell the types and purpose of messages they receive.
        Obviously you have the problem of collisions and lost messages, which is not addressed by the basic transport mechanism.

        B 1 Reply Last reply Reply Quote 2
        • B Offline
          Burgeh @robert-hh
          last edited by

          @robert-hh

          It may need two way connection eventually, but would a single LoPy setup as a "gateway" be able to handle multiple other units sending, and deal with collisions?

          By deal with collisions I mean, it is receiving data from LoPy A and LoPy B sends, will it wait until A is done and not jumble the messages?

          robert-hhR 1 Reply Last reply Reply Quote 0
          • robert-hhR Offline
            robert-hh @Burgeh
            last edited by

            @burgeh The receiver can hardly control when two parties are sending at the same time. In that case, the transmission can fail. The sending nodes can check with lora.ischannel_free() before sending, if someone else is sending, and wait until that is finished.
            Even when you try to implement something like a round robin protocol, some other devices may send.

            B 1 Reply Last reply Reply Quote 1
            • B Offline
              braulio
              last edited by

              How I can get transmition time with LoRaRAW??

              robert-hhR 1 Reply Last reply Reply Quote 0
              • robert-hhR Offline
                robert-hh @braulio
                last edited by

                @braulio I think you found that already in this post: https://forum.pycom.io/topic/3120/value-of-tx_time_on_air-of-the-lora-stats-function/5

                1 Reply Last reply Reply Quote 0
                • B Offline
                  Burgeh @robert-hh
                  last edited by Burgeh

                  @robert-hh

                  I don't quite understand the lora.ischannel_free() function. The first code below is my main "sending node". I then send it to a reciever which is using the second code. It works fine without the lora.ischannel_free(-120) condition, but when I use it it never actually sends. I only have one sending so I would not think it is busy. The rssi value is like -40.

                  from network import LoRa
                  import socket
                  import time
                  import pycom
                  import binascii
                  import machine
                  from machine import UART
                  #NODE B
                  
                  # Please pick the region that matches where you are using the device:
                  # Asia = LoRa.AS923
                  # Australia = LoRa.AU915
                  # Europe = LoRa.EU868
                  # United States = LoRa.US915
                  lora = LoRa(mode=LoRa.LORA, frequency = 915000000, region=LoRa.US915, tx_power = 20)
                  s = socket.socket(socket.AF_LORA, socket.SOCK_RAW)
                  s.setblocking(False)
                  
                  pycom.heartbeat(False)
                  pycom.rgbled(0x007f00) # green
                  receiveFlag = 0
                  
                  while True:
                  
                      time.sleep(8)
                      pycom.rgbled(0x0000ff) # blue
                      id = binascii.hexlify(machine.unique_id())
                  
                      data = lora.stats()
                      print("Stats %s" % data)
                      if (lora.ischannel_free(-120)):
                          s.send("ID: %s" % id)
                          print("Sending ID")
                          pycom.rgbled(0xFF00ff) # something...
                          while (receiveFlag == 0):
                              pycom.rgbled(0xFF0000) # RED
                              data1 = s.recv(128)
                              print("Look for Ack")
                              if (b'%s' % id) in data1:
                                  receiveFlag = 1;
                                  s.send("ID: %s" % id)
                              time.sleep(1)
                      time.sleep(1)
                      pycom.rgbled(0x00ff00) # green
                      receiveFlag = 0
                  

                  This is my receiver.

                  from network import LoRa
                  import socket
                  import time
                  import pycom
                  
                  
                  #NODE A
                  
                  # Please pick the region that matches where you are using the device:
                  # Asia = LoRa.AS923
                  # Australia = LoRa.AU915
                  # Europe = LoRa.EU868
                  # United States = LoRa.US915
                  lora = LoRa(mode=LoRa.LORA, frequency = 915000000, region=LoRa.US915)
                  s = socket.socket(socket.AF_LORA, socket.SOCK_RAW)
                  s.setblocking(False)
                  
                  pycom.heartbeat(False)
                  pycom.rgbled(0x007f00) # green
                  
                  #TX_power is the value that is set on this chip not received.
                  while True:
                  
                      data1 = s.recv(128)
                      if b'ID' in data1:
                          print("ID Received")
                          data = lora.stats()
                          print("Stats %s" % data)
                          print("Content %s" % data1)
                          print("Sending Ack")
                          reply = "Pong %s" % data1
                          s.send(reply)
                          pycom.rgbled(0x0000ff) # blue
                          time.sleep(.5)
                          pycom.rgbled(0x00ff00) # green
                          s.recv(128)
                  

                  Here is it working...
                  0_1535590100312_0389ac66-8f8c-47e5-9f9c-4f042365090c-image.png

                  robert-hhR 1 Reply Last reply Reply Quote 0
                  • robert-hhR Offline
                    robert-hh @Burgeh
                    last edited by robert-hh

                    @burgeh If you init a Lora instance and call is_channelfree() with various value from the REPL, what do you get? Since the test window is pretty short, it is always possible that noise is seen as RF carrier. In my quick test with a LoPy4 I had the following results when calling lora.ischannel_free() with various values:

                    -120dB Always False
                    -110dB Always False
                    -105dB ~50% False, 50% True
                    -100dB About 100% True

                    With a LoPy 1 the 50% point was at -117dB, and -115dB was always True. So it looks as if you have to find the proper value by testing.

                    B 1 Reply Last reply Reply Quote 0
                    • B Offline
                      Burgeh @robert-hh
                      last edited by

                      @robert-hh I've tried -120 and -100, both failed everytime. One issue I noticed is that the first time I call lora.stats() the rssi value is 0. I tried sending first and then checking it, and it remains at 0.

                      Also, this is_channelfree() function the only way to avoid colliding? Because if a unit is just far away, it might not be allowed to send for example.

                      robert-hhR 1 Reply Last reply Reply Quote 0
                      • robert-hhR Offline
                        robert-hh @Burgeh
                        last edited by robert-hh

                        @burgeh lora.stats() returns reasonable values after a packet has sent or received. Avoiding collisions is in general not possible. Looking for another station sending at the same time is more a polite behavior than a robust method. You can only see stations close to your place. Remote stations which also can cause a collision are invisible.

                        B 1 Reply Last reply Reply Quote 0
                        • B Offline
                          Burgeh @robert-hh
                          last edited by

                          @robert-hh So a remote raw lora receiver with a lot of nodes sending it is just inevitable that collisions happen? My current "solution" is to send and wait for it to send back an acknowledge, if not just wait a random period of time.

                          1 Reply Last reply Reply Quote 0

                          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
                          • 1 / 1
                          • First post
                            Last post

                          Pycom on Twitter

                          Pycom