Encoding NTSC With Your Hands Tied

Generally, when trying to implement some protocol, you are constrained by your hardware and time. But for someone like [EMMIR], that’s not enough. For example, NTSC-CRT is a video signal encoding/decoding simulator with no hardware acceleration, floating point math, or third-party libraries. Just basic C.

While NTSC has officially gone dark in America, people still make their own ATTiny-powered transmitters. NTSC is a bit of a strange standard and is sometimes referred to as never-twice-the-same color, but it does produce a distinct look.

That look is what [EMMIR] was going for. It encodes a message in a ppm format into NTSC and then back in ppm with some configurable noise. It can do this in real-time as an effect in [EMMIR’s] engine or on a rendered image via a CLI. It looks incredible, and there’s something very satisfying. There’s a video after the break showing off the effect. The code is pretty short and easy to read.

Continue reading “Encoding NTSC With Your Hands Tied”

Squeezing GIFs Into Even Tighter Spaces

Showing images on a TFT or OLED display with a small AVR microcontroller can be a challenge as it requires significant storage space. One solution is to compress the images, but then you need more RAM to decompress it, and that’s a whole other problem. [David Johnson-Davies] of Technoblogy couldn’t find a GIF decoder that fit his needs, so he started writing his own.

We had previously seen a minimal GIF decoder aimed at a Cortex-M0+ that required 24 K of RAM, but this technique is running on an AVR with just 12 K of RAM. Along the way, [David] uses little tricks to shave down the requirements. Since the TFT he targets is a 5-6-5 color space, those 3-byte colors become 2 bytes. The LZW lookup table is encoded as 12-bit pointers to earlier entries plus an additional pixel. However, these savings come at a cost. Animated, local color tables, transparency, interlacing, or GIF87a formatted images aren’t supported. But he ports it over to the PyBadge, which is ATSAMD51 based.

[David] provides some sample code to display a GIF from program memory and an SD card. All the code is on GitHub under a CC By 4.0 license.

Giving Your Pets A Digital Squeak

A pet tracker has a particularly grueling set of requirements: small, light, rugged, incredibly long battery life, safe for the pet, and cheap. [Mihai Cuciuc] was looking at the options and wasn’t thrilled with any of them. So as any hacker would, he rolled his own, dubbed Squeak.

It uses an RN2483 module as it is a LoRAWAN module with publically available firmware from Microchip itself. This means [Mihai] could add his code and keep the modem code without having to reverse engineer everything or add a second microcontroller. In addition to the modem, there’s a GPS unit connected via UART. The clever part is the dual voltage regulators — the one powering the GPS is enabled or disabled by the RN2483. In addition, the RAM V_BACKUP line is always powered, which means the RN2483 can power up the GPS and let it get a quick fix (thanks to the RAM backup line).

To maximize the chances of a packet making it through, he made them only have the bare essentials. There are return packets to change the tracker’s mode (such as uplink interval or how often to capture GPS). With some cloud support, [Mihai] created infrastructure to capture the packets and relay them to Telegram. He can request the last location, receive updates, and change modes.

We’ve got you covered if you’re interested in tracking some of your dog’s other habits.

Push ESP32 Over The Air Updates From GitHub

Let’s say you’re working on an ESP32 project to send off to your grandma; something she can just plug in and it will start automatically monitoring her plant’s water levels. But you discover a critical flaw in the firmware and need to update it. Does she send it back? Do you walk her through dropping the update via the Arduino IDE OTA? The easiest way would be to plan and use something like esp_ghota, an OTA framework by [Justin Hammond].

OTA (Over-The-Air) updates are a fantastic feature of the ESP32, and we’ve covered libraries that make it easy. But compared to those earlier projects, esp_ghota takes a different approach. Rather than hosting a web server where someone can drop a binary, it looks at GitHub releases. [Justin] had to include a streaming JSON parser, as GitHub API responses tend to be beefy. The workflow is straightforward, push a new commit to your main branch on GitHub, and the action will trigger, building a few different versions. Your little plant watering reminder at your grandma’s will check every so often to see if a new version has been pushed and can update with rollback on littlefs, fatfs, and spiffs filesystems.

It’s an incredible project that we suspect will be very useful for many folks to update their projects. [Justin] even includes an example GitHub action and a sample ESP32 project.

Roll Your Own WiFi Driver For The Pico W

The Raspberry Pi Pico is a handy little microcontroller that has become a widespread addition to many hackers’ workbench. The Pico W has a CYW4342W module (just like the Pi Zero W) to add WiFi capabilities and [Jeremy Bentham] ported his bare-metal WiFi driver to the Pico W.

The CYW43438 is an SDIO interface, so most of the code ported over from his Zerowi project, but there were a few notable tweaks along the way. Given that the Pi Pico SDK has the complete source code to drive the CYW43439 with an open source TCP/IP stack (lwIP) and the datasheets from Infineon are pretty detailed, why create your own driver?

The short answer is…because why not. But a second answer is to tweak it just how you like it. With his own implementation, [Jeremy] can focus on maximizing throughput and making WiFi a little easier to debug. He deeply delves into the hardware, scope traces, and code samples. It’s a tremendous five-part read over lunch. Some highlights include writing some code for the PIO (Programmable I/O) to interface with the SPI interface, bank switching in the WiFi RAM, handling the 140 different events, connecting to a network, and sending pings.

The PicoWi code is available on GitHub. Perhaps it can be integrated with this PCMIA interface to offer outstanding performance to an older laptop.

Exploded version of the Cistercian display

Serial Cistercian Digit Module

There’s no doubt that the 7-segment display is a gold standard for displaying lighted digits. But what about a throwback to an older system of displaying numbers — Cistercian? With thirty-one 0805 LEDs, [Josue Alejandro] made a simple module displaying a single Cistercian digit (any from 0-9999).

The first iteration used castellated edges and required a significant number of GPIO, so on the next rev, he switched to a serial-to-parallel converted from Lumissil (IS31FL3726A). A diffuser and spacer were printed from PLA and made for an incredibly snazzy-looking package.

Of course, it couldn’t stop there, and a third revision was made that uses SK6812 Neopixels, allowing full RGB capability. All the design documents, layout files, and incredibly detailed drawings are available on GitHub. What makes this incredibly handy is having a module you can easily add to a project. Perhaps even as a component in an escape room in a box that would allow you to flash multiple numbers. Or perhaps as a stylish clock. We’d even go so far as to challenge someone to create a calculator by combining several of these modules with this keypad.

Building Your Own Consensus

With billions of computers talking to each other daily, how do they decide anything? Even in a database or server deployment, how do the different computers that make up the database decide what values have been committed? How do they agree on what time it is? How do they come to a consensus?

But first, what is the concept of consensus in the context of computers? Boiled down, it is for all involved agents to agree on a single value. However, allowances for dissenting, incorrect, or faulting agents are designed into the protocol. Every correct agent must answer, and all proper agents must have the same answer. This is particularly important for data centers or mesh networks. What happens if the network becomes partitioned, some nodes go offline, or the software crashes weirdly, sending strange garbled data? One of the most common consensus algorithms is Raft. Continue reading “Building Your Own Consensus”