Category: Electronics

  • It’s not just Radio, it’s Meshtastic!

    My latest interest in microcontrollers has me learning all about Meshtastic mesh radio devices.
    The Meshtastic website puts it concisely – “An open source, off-grid, decentralized, mesh network built to run on affordable, low-power devices”.
    A lot to unpack right there but definitely within my Venn diagram of interests. As I dig in to this niche community of RF enthusists I realize there is almost limtless applications, reason for use, and areas to expand or learn about.

    Essentially these are text-based walkie-talkies operating on an open band of radio frequency that go much farther than WiFi.
    They bounce or “hop” off other similar nearby devices on the same channel, each called a “Node” to travel great distances in some cases.
    If you have two nodes, and they are close enough to communicate, you can send text messages or other string data between them.

    Configured correctly that message can be encrypted or you can choose to chat on the public default channel. The Citizens Band Radio – “Breaker Breaker 1-9”.

    Some nodes have screens, GPS or other sensors but much of Meshtastic can be used or configured through a phone app UI.

    I have used LoRa, or Long-Range radios on microcontrollers in the past but that involved sending and parsing raw packets with the RFM95 series of radios. I enjoyed seeing just how far I could transmit and recieve data. (Not that far)

    Meshtastic is messy but moving quickly. Old documentation or tutorials online might not reflect the latest UI or experience. These radios are not inherently reliable and there are many variations.
    Your experience will be directly related to your device’s functions, app version, the number of Meshtastic nodes in your area, distance, and line of sight to another node.

    I started in the mountains with no other users. But I had two radios so I could ping each other and get an good understanding of how it all works. Occasionally another node will show up on weekends when tourists are traveling into town.

    When I travelled into Vancouver, driving with default notifications on Android, I learned that “New Node Seen” notifications were a bad idea.

    Not enough nodes or too many nodes, each has it’s own issue. Dense populations such as Vancouver have switched modem settings from the default to get better experiences.

    On top of the radio hardware and phone app there is also an optional connection to the internet using MQTT. Maps, dashboards, and every other conceivable web based project has used MQTT to connect the data from the radio network such as location, radio type etc.

    Antenna design, 3D printed enclosures, solar and battery setup, different sensors or microcontrollers… You can see that there is plenty for gear-heads, hams, EE’s, and software developers.
    The Meshtastic Discord is super-busy with lots of info flying. Good to lurk and look back to see related issues and discussions.

    Recent changes mean less data or telemetry being pushed out from each radio by default so you might not see any others right away. Given some time you will eventually see other nodes if they are in range.

    With the use of SDR, or Software Defined Radio, you can also view this radio communication in real time. In North American this is in the open 915MHz frequency.

    Each country has it’s own rules so be sure to check local regulations.
    If interested, make sure to buy two devices to start.
    10-4 good buddy – OVER

  • Old man shakes fist at cloud animation

    My Arduino UNO Q arrived today and I eagerly unboxed and admired the board layout. The north-south resister “cities” contrasting with the led matrix 45 degree slant. New chips but all of the pin layout of classic Arduino boards. Lots of business going on underneath which is also new.

    Now if you haven’t aready, please read my previous post.

    Sucks that the first thing you need to do is read another article.

    Well..

    The first thing Arduino App Lab asked me to do was flash the board after installing a CLI (Command Line Interface) tool. This is not just the update software upon arrival we’ve all come to experience. That would also come later. This requires female to female jumper cables to short two pins. Not exactly beginner friendly.

    I understand these are early days and there will be some bumps to get user friendly software and hardware.

    Unfortunately I choose “Get Flasher Tool” instead of “Skip” which I abandoned, then got stuck in a set-up loop. After restarting App Lab App, I now had a choice between two boards? Because I was stuck after setting up the Wifi, it showed two UNO Q boards. “USB” and “Network” being the only difference.

    Now the update… 15 minutes wha?

    Board name however cannot be the default…

    errr U”NOpe”Q.

    Way too much friction during onboarding for my liking.

    I did manage to get in and duplicate the Weather demo, update the location string found on the Arduino side of things, and get it running.

    Some interesting stuff with this unique Python/Arduino setup is that it uses a newer version of Python than I currently have installed when it creates a virtual environment.

    The most annoying thing right now is the Arduino App Lab 0.1.28 for Mac window blink. It randomly looks like the window is gaining and losing focus. Purple – Grey, Grey – Purple etc. Some mouse hover seems to trigger it briefly but not reproducible.

    I tried to take a look at App Lab source seeing as it is open source to see if I could contribute in any way but found a bunch of TypeScript and SCSS.
    Fine for someone who hates the web and builds “Apps” not “Web Pages” but not my monkeys, not my circus.

    I’m a bit more familiar with UI now but I think the Learn > First Setup would be a good onboarding option during the users first UNO-Q connection.

    My real vision for this board will be to combine the use of low power microcontroller to trigger more powerful Linux abilities.
    “is there a face? > Run Facial recognition” etc.
    Sensors running on microcontroller can be tied directly to webserver. Lots of ideas with this dual combination, each with their own strengths.

    Next steps will test some I2C sensors.

  • Qualcomm Acquires Arduino

    At todays “blink to think” event a new Arduino board was released, the Arduino Q, however perhaps most important was the announcement that chipmaker Qualcomm had acquired Arduino for an undisclosed amount.

    After watching the entire two hours of announcements I’m not crazy about this but I remain cautiously optimistic.

    My first Arduino was the 2009 Duemilanove followed by multiple other boards, Uno R3, R4, Mega, leonardo, lilypad, Mini, Sense, etc.

    I still have my first breadboarded “Arduino” while getting really into electronics in about 2010.


    Full upfront disclosure: At the time of writing, this author has a very minor holding in Qualcomm shares, purchased in April 2025, shortly after their acquisition of Edge Impulse.

    You see, for years I have been a huge fan of both Arduino and Edge Impulse. I truly believe in AI “at the edge” or on device. TinyML as it was once known ran on select Arduino boards, and has expanded to larger more capable models run on beefed-up dedicated accelerator hardware as well. Large or small, Edge Impulse makes collecting data, training small AI models, and running inference easy. It runs on a bunch of different boards/chips, and that has not changed so far after 6 months under Qualcomm. The founders remain to this date, and this is what I hope for Arduino.
    The Edge Impulse service had been built into the Arduino IDE a while ago in a slick software white labelling which is why todays news seems to make sense to me.

    And while this reads as huge chip conglomerate absorbing a beloved open-source hardware company and community, they didn’t need to buy. They could have just taken, like many clone or knock-off arduino boards, it’s all open and free to do so.

    Some of the community reaction has been negative. Phillip Torrone aka PT of Adafruit has written about, advocated, and contributed to open source hardware for years. There may be literally no one more qualified to talk about open source.
    Recently critical of Arduino’s closed source “Pro” boards and VC funding, he writes about “Turning Maker Dreams into Shareholder Value“. With hints of 2014 documentary Print the Legend as a recent blueprint, I really respect Phil’s views.

    Here is where I feel there might be some hope…

    First, Edge Impulse has so far been allowed to continue independently and continue to support competing silicone.

    Arduino vows to continue to support and add other future vendors.

    Today’s hardware announcement from Arduino runs Debian Linux, runs Zephyr RTOS. The Qualcomm accelerator chip supports OpenGL ES. Qualcomm has a Director of Software – Open Source. The CEO Fabio Violante says there is Gerber files and schematics coming soon for the Arduino Q.
    It supports Qwiic I2C connection made popular by both Sparkfun and Adafruit.

    They seem to really align with many open source initiatives at this point.

    Sure this could change at any time. Time will tell.

    I’ve got two on pre-order.


    Like I said, at this point I’m cautiously optimistic.

  • CircuitPython in 2025

    This post is a wishlist for CircuitPython in 2025. Each year Adafruit asks the community to contribute their thoughts or requests for the open source microcontroller language as outlined on the Adafruit blog.

    In 2025 I would like a library for working with vectors, similar to that of p5.js Vector.

    Early this year I spent some time re-visiting the MatrixPortal M4, specifically trying to reproduce some of the examples found in the excellent book Nature of Code by Daniel Shiffman on two 64×32 RGB LED panels.

    This latest book uses JavaScript, and the p5.js library to simulate natural systems. A rewrite of the original book using Processing.
    I had some success getting the first few examples to work with DisplayIO and CircuitPython.

    Particles created with a random vector and magnitude, affected by “gravity”.

    I was able to do some of the basic matrix addition / subtraction / multiplication etc. with custom functions but where I started to run in to some difficulty was with some of p5.Vector handy methods:
    limit() – Limits a vector’s magnitude to a maximum value.
    heading() – Calculates the angle a 2D vector makes with the positive x-axis.
    rotate() – Rotates a 2D vector by an angle without changing its magnitude.

    Looking back this year at some of my CircuitPython projects, I definitely levelled up on displayio and enjoyed the Live streams of FoamyGuy, JP’s workshop, and of course Adafruit’s Show & Tell.
    I appreciate the contributions from all the Adafruit developers as well as the community.

    My commitment this year will be to “Use what you have” and hopefully contribute if I can.

    #circuitpython2025

  • RGB Input Range Sliders

    0 20 0

    A fun little challenge to myself this week was putting together these HTML input range type sliders to control the color of an LED.
    Each color channel change triggers an update to read the value, convert it to a hex code (eg. #FF0000), update the output element value, and finally update the color picker swatch. The color input can also be used as a standard color picker. When a color is selected and the user clicks off the picker, the three sliders get updated appropriately.

    Now, input range type sliders have been notoriously difficult to style in the past and I’ll admit I’m running this on Chrome only for myself.
    As these sliders in Chrome are normally blue I only needed to style two simply with accent-color: red;accent-color: green;

    On my local network I’m running a webserver on a tiny mircocontroller. When a client posts the form data, the LED on the ESP32-S3 changes color. That color persists and any new connections open the page with the latest assiged color.

    Adafruit QTPY ESP32-S3

    [EDIT: The slider broke after a browser update. Turns out setting height is now required. The final CSS is:
    input[type="range"] { writing-mode: vertical-lr; direction: rtl; appearance: slider-vertical; height: 6rem; vertical-align: bottom; margin: 1rem 0rem;}]