Joel Edem
banner
immortal-mind.bsky.social
Joel Edem
@immortal-mind.bsky.social
Probably out somewhere, reinventing the wheel
First power up! 💯% probably of crashing into a million pieces. Hope this ends better than v1
#Micropython #python #PicoPlane
October 20, 2025 at 3:48 PM
I had this idea while writing the a PIO driver for the touch. If you don’t wire the touch interrupt pin, you could do just store threshold in one of the SM scratch registers and then trigger dma /interrupt if the value changes . But you’ll need 1 SM for each axis but this works fine
October 14, 2025 at 3:43 AM
Finally added some menus and brought up the touch sensor. It’s starting to feel like “real”. Micropython 💪🏾
October 14, 2025 at 3:43 AM
I cheated a bit with the 3d render. Had to go back to C. Sorry but there are no sane libraries in python to do headless rendering. I even tried Godot but it doesn’t render in headless mode. I ended up using @tsoding.bsky.social Olive.c cos I thought it was funny. Gonna replace it with raylib soon
August 26, 2025 at 11:47 PM
I feel like I literally leveled up my python skills during this project. I was so tempted to just write v2 in C, after v1s memory issues. glad I stuck to micropython. It has been a blast.
August 26, 2025 at 11:06 PM
I think I’ll call it PicoPlane. A Micropython/Python controller and flight computer
August 24, 2025 at 8:39 PM
IMO, You should ALWAYS write async code for microcontrollers. Not a fan of interrupts. Async is the way to go , except for strict timing applications. I try to use hardware to service interrupts whenever possible. There’s even a sick Async API in the C SDK. I just can’t help myself. This is the way
August 24, 2025 at 1:12 AM
I see, I think you’ll need digital io expanders like the pcf8574. Since buttons are either pressed or released, you don’t need analog pins for those . In my current project , I use the pcf8574 to read button and toggle switch states . The buttons emit single press, double press or long press events
July 31, 2025 at 11:40 AM
2/2.. applications in constrained environments . It’s also super neat writing once and running on full phat desktop python and micropython with no changes.
I’ve only had to patch a couple of simple methods like sleep . Just created a blog so to share the lessons I learned, so stay tuned 👍🏾
July 31, 2025 at 10:24 AM
Building a controller, flight computer and ground station from scratch in python has been quite the project.
I remember trying out the micropython driver for the ili9351 and run out of memory clearing the screen😂. This has a fun journey in optimization and memory management in python for real time
July 31, 2025 at 10:24 AM
2/2 I do something similar on multicore microcontrollers usually with no Gil . I have an app that runs on the other core and accepts tasks to process they can be long running using generators or just a single call .The api interfaces with that in either sync/ async. You can spawn more threads on pc
July 26, 2025 at 6:00 PM
I think you need to structure your code accordingly to make reasoning about what tasks are doing, even if you don’t hold a handle to them. Ensure that tasks are well defined with clear startup and fail or stop conditions. You don’t have that with a preemptive setup plus overhead
July 26, 2025 at 4:05 PM
I wholeheartedly disagree with this take. I think python has the best implementation of async await of all the languages out there.
Async *can* make it hard to reason about control flow once a task is created but it doesn’t have to . I’ve got async + threads all playing nicely with tkinkers loop
July 26, 2025 at 4:05 PM
Streaming orientation data from micropython to python on the desktop running good old tkinter .
July 24, 2025 at 7:58 AM
Why did I add so many inputs. Love how smooth and responsive they are. Not bad micropython, not bad
July 9, 2025 at 1:36 AM
I spent too much time working on this toggle animation that only lasts a few ms so I thought I’d post about it. It’s hard to pick one color.

It’s Probably time for me to invest in a decent tripod. #micropython
July 9, 2025 at 1:09 AM
Nice work🙌🏾. It’s so convenient.
July 7, 2025 at 4:27 PM
Never thought I'd say this but.... Safari ftw?
July 7, 2025 at 2:06 PM
my go to site! I just wish they had it in an upside down orientation tho. I found this on reddit the other day. Nice to have
July 7, 2025 at 1:04 PM
I use the extra DMAs through a buffer is to ensure alignment since we need to wrap at fixed sizes. eg we could store the counts as 1 byte values but that means we cant wrap because the lowest ring size is 2bytes. we want to avoid reconfiguring the channel each trigger.
June 26, 2025 at 2:19 AM
The cpu sends the compressed data to the dma and sets up the display. One DMA channel reads a count, another reads the pixel at the idx. that triggers another channel to load the config to the final channel which actually writes to the display, then triggers the first channel all without the cpu.
June 26, 2025 at 2:19 AM
🧵Fact: Side tracks are always more fun than the main track. A "quick refactor" of my frame buffer turned into, I could probably add this feature since Im here, turned into a weekend of juggling bytes in Micropython on the Pico 2. The animations are decompressed and rendered entirely by DMA!
June 26, 2025 at 2:19 AM
I copied the same prompt to ChatGPT and It was hilariously bad, literally. All these unnecessary quips to gas you up, while wasting your time and mining your data.
June 13, 2025 at 7:58 AM
Sidebar: "Ai" is still trash, even at the simplest of tasks that doesn't involve spitting out existing code. Nothing but glorified google. I gave it all the help It needed and it still failed. I wrote forward loop and asked Gemini Ai to complete the reverse. It kept making up Instructions.
June 13, 2025 at 7:58 AM
Here the A DMA channel is reading a pattern from memory, into a PIO state machine which controls the pace. The new DMA channels on the RP250 can be configured to run endlessly or repeat after set cycles.
June 13, 2025 at 7:58 AM