Successful bring up of HaLow on a Raspberry Pi Zero 2W with NAT forwarding!

Hi all,

I’ve been tinkering with the MM6108-based Heltec HT-HC01P SPI module, and I was able to successfully bring up HaLow on the Pi Zero 2W. I’ve set it up to enable NAT forwarding, and I’m using a Heltec dongle as a STA. Notably, on 915.5 with 1MHz bandwidth, I’ve been able to achieve 1-3mbps at some incredible range (ie. through several apartment walls over 300-500m) using just a UF.L patch antenna.

In an attempt to help make this wonderful technology by Morse Micro available to the world, I’ve created a repository with instructions and scripts to replicate my work. It’s based on the most recent driver release (1.16.x) for the Linux 6.12 kernel.

For those interested in replicating, the hardest part is honestly the wiring, upon a successful bring up you should be able to get to this point:

A quick speedtest at 923 MHz w/ 2MHz bandwidth - The device is capable of a faster link but I’m interested in optimizing for range so I haven’t tried pushing the limits with a wider bandwidth and higher SPI clock speed.

My next step is to develop a HAT to make it easier to interface with the Pi, and then to package all of this into a user-friendly interface (all of which of course would be open source) to help bring exposure to this fascinating new technology. As a hobbyist whose career is in healthcare, I see so much potential for this technology to improve communication and peoples’ lives, and I really want to help make this more accessible. Many thanks for reading, and for those of you who would like to replicate my setup, let me know if you have any questions!

8 Likes

The RPi Zero 2W has been a popular ask. Nice work!

1 Like

Thank you! I’m looking forward to updating everyone with progress on the HAT and publishing those files :slight_smile:

Nice! Are you able to use 50MHz for the SPI speed with no issue?

I’ve successfully integrate a Seeedstudio xiao module with RPi Zero 2W, but limited to 10MHz. I suspect my wiring is the cause of the issue.

In my testing I haven’t been able to do 50MHz but I have been stable at 24MHz. I also suspect my wiring as the issue as I’m currently using 20cm dupont cables for my connection. I have a prototype PCB on the way that will have much shorter traces for the data lines. If it works I will upload the KiCad files. Will update the post and share how well it works!

Yes, that sounds like my current setup. Interestingly enough if I enable debug message (debug_mask=1) I am able to do 50MHz, but probably the debug message causes slowdown somewhere.

Sounds good, you beat me to it! Looking forward to hear that update.

1 Like

This is absolutely awesome, will this setup support meshing do you think?

Thank you! Yes, at the driver level it definitely should, I just haven’t gotten a chance to spin up wpa_supplicant and give it a go yet. Putting the scripts in place to make it an easy toggle on/off is one of my next steps.

Hi all,

Just wanted to provide updates for anyone following this project. First off I’m so happy to see that people are using and liking this setup! Instead of AP/STA mode, I updated the scripts to configure mesh on both sides with one side acting as a gateway, and one side acting as a client. This does result in decreased throughput compared to AP/STA but my vision is to develop this into a user friendly, open source product with app support and I sadly only have time to focus on so much right now. If someone wants to submit that functionality to the repo please feel more than welcome.

Right now the mesh mode should be fully functional, in that you should be able to connect the gateway to a home network, set up a hotspot with the client, and access the internet. If anyone has any issues please let me know on the github page and I’ll try to fix ASAP. I’m working now on app support to interface and configure over bluetooth/webserver so users don’t have to deal with the scripts directly. Open to all thoughts, comments, and suggestions!

2 Likes

@yousefk Have you developed a PCB layout for this yet? I would love to talk more with you about a project that could use this.

I have! The KiCad files are here:

I’ve tested it and it works beautifully, even at 50MHz for the SPI clock speed. I’m having them manufactured by PCBway for a product I plan to launch soon. I’d be happy to chat and, if you’re in the US, send you one to see if it works for your project. DM me if interested

2 Likes

@yousefk Very cool project! I am looking to do essentially the same thing. For the Halow module, it says “the host must support level-triggered interrupts” which I understand the Pi Zero 2W does not support. Have you created a work around or is that not a problem in your design? I wonder if this is going to be a problem such as errors or increased latency.

Thanks for the work @yousefk I’m actually going through your repo today and I’ll see how far I get. I tested the prebuilt image and that worked but I’m going to run all the scripts manually as well. May do a slightly different PCB but I also greatly appreciate those files.

EDIT: Zero issues! I did not worry about the web UI and stopped after I had wlan1 up and going. The plan is to use these as extender nodes with my pi5s on the edges of the mesh.

root@pizero2w-halow:~# wpa_supplicant_s1g -D nl80211 -i wlan1 -c test.conf 
Successfully initialized wpa_supplicant
S1G mapped HT channel 122
S1G mapped HT channel 122
wlan1: mesh: ieee80211w:2 PMF:0
Full Channel Information
	Operating Frequency: 918000 kHz
	Operating BW: 4 MHz
	Primary BW: 2 MHz
	Primary Channel Index: 1
wlan1: interface state UNINITIALIZED->ENABLED
wlan1: AP-ENABLED 
wlan1: joining mesh REDACTED
wlan1: CTRL-EVENT-CONNECTED - Connection to 0c:bf:74:11:22:33 completed [id=0 id_str=]
wlan1: MESH-GROUP-STARTED ssid="REDACTED" id=0
wlan1: new peer notification for 3c:22:7f:11:22:33
wlan1: mesh plink with 3c:22:7f:11:22:33 established
wlan1: MESH-PEER-CONNECTED 3c:22:7f:11:22:33

Glad to see continued interest in my project! I did add a line to the device tree overlay for the SPI module #26 ( spi-irq-gpios = <&gpio 25 0>) and I assumed that the interrupt function was built into the SPI drivers for the raspberry pi. I haven’t done much to verify that, however, because I’ve been able to use the HaLow connection without errors, although I can’t speak to whether it’s caused increased latency. Please do let me know if you find more info on this.

1 Like

So glad it’s working for you!! It’s such a beautiful sight to see the wlan1 network successfully brought up. I built in the web UI to try to make it more simple for people just dipping their feet into HaLow - but do you think it would be helpful if I added a section in the GitHub README with instructions on configuring the device without the web UI? Or did you feel like it was pretty intuitive to figure out how to go through the setup process without running the web UI and display scripts?

Being more familiar with setting up Halow on pis and comfortability on the cli, I found it easy because I was looking at the .sh scripts before executing them. You could add a line that says “stop here if you don’t need the UI” but otherwise it was straight forward.

1 Like