Picoballoon
Hardware- 4 Devlogs
- 14 Total hours
Hight altitude LoRaWAN radio transmitter (Picoballoon) :D
Hight altitude LoRaWAN radio transmitter (Picoballoon) :D
Picoballoon - DEVLOG 4# 🎈
Hello guys!
I had litlle break last week, but im back at it. 
I’ve finally started to write my final micropython code for the balloon tracker. (hopefully) :D
I will copy and paste the code here. That way you can look trough it/correct me if needed. :)
(I’ve made a labels for each section)
So far code looks like this: 
#Some importing stuff
from machine import Pin, SPI, ADC, deepsleep
import time
import ucryptolib
#channels settings (frequency / spreading factor)
#There are 2 groups of channels.
#1. MIN_CHANNELS - Most important ones. One channel from each region. (in case of power saving mode)
#2. ALL_CHANNELS - All other channels for higher chance of being detected. (when power isn’t a problem:D)
#US spreading factor is set at 10, because of duty cycle limits.
MIN_CHANNELS = [
(868_100000, 12), #EU868 - 1.
(903_900000, 10), #US915 - 2.
(916_800000, 12), #AU915 - 3.
(923_200000, 12), #AS923 - 4.
]
ALL_CHANNELS = [
(868_100000, 12), #EU868 - 1.
(868_300000, 12), #EU868 - 2.
(868_500000, 12), #EU686 - 3.
(903_900000, 10), #US915 - 4.
(904_900000, 10), #US915 - 5.
(916_800000, 12), #AU915 - 6.
(917_600000, 12), #AU915 - 7.
(923_200000, 12), #AS923 - 8.
(923_600000, 12), #AS923 - 9.
]
#Delay between packets transmitions - radio stabilization
INTER_PACKETS_MS = 300 # 0.3s
#Transmition power set by voltage
POWER_HIGH = 16 #dBm 1.
POWER_MID = 14 #dBm 2.
POWER_LOW = 12 #dBm 3.
#VSYS Power levels
VSYS_HIGH = 4.0 #V
VSYS_MID = 3.3 #V
VSYS_LOW = 2.3 #V
#Time between transmitions based on the voltage level
SLEEP_5MINUTES = 5 * 60 * 1000
SLEEP_10MINUTES = 10 * 60 * 1000
SLEEP_15MINUTES = 15 * 60 * 1000
SLEEP_20MINUTES = 20 * 60 * 1000
#LoRaWAN ABP information from TTN console (fill in YOURS - I will replace them with 1) :-)
DEVADDR = bytes([0x11, 0x11, 0x11, 0x11])
APPSKEY = bytes([0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11])
NWKSKEY = bytes([0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11])
#MESSAGE number
FPORT = 1
#communitacion channel between Pico and RFM95W (SPI0) - it needs 3 signal channels (sck,mosi,miso)
spi = SPI(0, baudrate=1000_000, polarity=0, phase=0, sck=Pin(22), mosi=Pin(19), miso=Pin(16))
#Chip select pin (NSS/SS), reset pin, led pin)
cs = Pin(4, Pin.OUT)
cs.value(1)
rst = Pin(15, Pin.OUT)
led = Pin(25, Pin.OUT)
#RFM95W startup reset
rst.value(0)
time.sleep_ms (10)
rst.value (1)
time.sleep_ms(10)
#voltage measuring pin
adc_vsys = ADC(3)
#4 main tools for communication with RFM95W and voltage mesauring
#1. - write into RFM95W register
def write(addr,val):
cs.value(0)
spi.write(bytes([addr | 0x80, val]))
cs.value(1)
#2. - read from RFM95W register
def read(addr):
cs.value(0)
spi.write(bytes[addr & 0x7F]))
val = spi.read(1)
cs.value(0)
return value[0]
#3. - good nigt for the RFM95W (power save)
def RFM95W_sleep():
write(0x01, 0x00)
#4. - Measures capacitor voltage (calculates avarage voltage from 8 measurings - adds up all 8 of them, then divide them by 8 )
def read_vsys():
total = sum(adc_vsys.read_u16() for _ in range (8)) /8
#now convert raw 16bit number to voltage
return total * 3.3 * 3 / 65535
**Hope it will be readable somehow:D **
AI helped me only with minor things ( converting raw 16bit number, RFM95W registers)
Picoballoon - DEVLOG #3🎈
Hi!
Yesterday I’ve finished the power and radio system.
Also decided to use foam cover instead of the 3D printed one. 
Foam one weighs only about 9 grams and has better insulation for the components.
Testing the LoRaWAN connection 
I took a bus to the nearest TTN gateway. With the first testing code helped me Claude a lot, because my coding skills in micropython are pretty poor at this time. :D
I will lock myself in my room until I’m capable of writing it. (because AI micropython code pretty much screwed up the testing)
- The radio was left on the default private-network sync word (0x12) instead of TTN’s public sync word (0x34). So the gateway never had a chance to decode it.
Instead got some basic MAC data from the gateway, at least i know the radio does work. 
I did look kinda funny with the laptop on the street tho. :)
Picoballoon - DEVLOG #2 🎈
Hello!
These 2 hours i’ve been working on the solar power system, antenas, and last devlog. 
Why the solar system again? Because i screwed up first time making it.
But nothing big. I have accidentally put the 2 supercapaticors on top of each other without isolation. 
It was taking down energy so much, that at the end of the circuit was about 0.2 V, instead of 5V.
Now i soldered them next to each other. Everything is well isolated from now. ![]()
Still need to wire them to the solar panel, but that will be easy.
Also wired two 7.5 cm copper antennas on the rf module. The 7.5 cm antenna length is a compromise across all three LoRaWAN frequency bands (EU868, US915, and AS923) 📡
Now the dilemma
Can i count time spent on the devlogs/repo as a project time? If you have any idea, please let me know. :)
Hello!
This month i have been obsessed with picoballoons. 
What is a picoballoon? ⬇️
Picoballoon is a helium/hydrogen balloon carrying light tracker beneath it. If you are lucky/build them correctly, they are capable of flying for couple of days/weeks in stratosphere. 
They are equipped with long range radio transmitter 📻
I will be using LoRaWAN radio protocol (because I don’t have HAM radio license:D) It can send data packets on ISM band to a ground radio station.
(TTN gateway in my case)
I will further explain how it should work in further devlogs/README. 📎
Back to my logged hours. 
First hour
CAD design of tracker case in FUSION 360 (I will maybe not use it, because it is too heavy) I also printed it.
Rest of the time
Soldering hell :D
Accidentally broke 2 pads off on the RF module. (most important 2
) I had to desolder it and i need to replace it.
I didn’t test the solar power system yet. Hope it will work.
I didn’t record drawing the wiring, because I forgot to.
AI helped me by correcting my wiring scheme (I forgot some things while making it) ![]()
I hope my english is readable, thanks for reading!