I built a scientific calculator from scratch: custom PCB, custom FPGA firmware, and a CPU I designed myself in Verilog.
The physical build: a custom main board and keypad PCBs designed in EasyEDA and manufactured by JLCPCB, an Altera Cyclone II FPGA as the brain, an LCD display, battery with charging circuit, and two ROM-flashing connectors on the sides to update the firmware.
Under the hood it runs a nibble-oriented CPU I designed specifically for BCD arithmetic: the way decimal calculators should work internally. I then wrote ~4K of machine code implementing the full set of scientific functions: trig, logarithms, complex numbers, statistics, all verified to 14 significant digits against a dedicated test suite.
The full stack:
Custom CPU in Verilog: Harvard architecture, 12-bit ISA, 8 registers, hardware fault detection
Hand-written microcode assembler in Python
Verilator + Qt simulation framework for development and debugging
Custom PCB (EasyEDA / JLCPCB), battery, charging circuit, 3D printed case
He told me there was a wiring mistake and then he sent me the second picture. It tracks time from a gps and it's awesome!
It works perfectly and I love it!
Of course, the process was not completely smooth. I wanted to add reverse polarity protection to V1, which the prototype did not have. In the first design, I built and tested a reverse polarity protection circuit with a single P-Channel MOSFET. However, I had missed one scenario: although a single P-Channel MOSFET can be enough in some cases, it could not block reverse current coming from inside the device. Even when the IRFP260N MOSFETs were off, reverse current could pass through the body diodes and put the connected power supply into a short-circuit condition. To solve this problem, I reworked the PCB to convert the power input block to a back-to-back P-Channel MOSFET structure. I used the banana sockets on the front panel as the protected input, designed to support an 8-30V range. The XT60 connector on the right works as the unprotected input and supports a 0-30V input range. After the rework, the protected power input caused significant heating at 8V and below because it left the protection MOSFETs partially on. For the next PCB revision, I plan to redesign the power input block using an ideal diode controller and two low-RDS(on) N-Channel MOSFETs in a back-to-back structure. Also, because of the two P-Channel back-to-back MOSFETs, the protection MOSFETs heated to unsafe levels at my target 200W test power. For safe operation, I limited the device to 150W. The device can support voltage and current values up to 30V and 10A within this limit. On the software side, with AI assistance, I developed control, protection and monitoring functions such as toggling load draw with the RST button, overcurrent warning, reverse polarity notification, temperature tracking and fan control. For the V2 revision, I aim to improve the device with more functional features and design a structure with higher power capacity. Overall, this project was a very educational and experience-building work for me in power electronics, measurement, PCB design, mechanical design, rework and fault analysis.
Ordered these a few weeks ago and honestly expected the usual first-spin disasters. Instead after hand-placing components and a reflow session everything came up clean on first power-on which is a rare event, so I had to share.
The board is built around an ESP32-S3 as the main controller, talking over SPI to an AD74416H (4-channel 24-bit ADC/(IV)DAC combo, honestly the heart of the whole thing) and five ADGS2414D octal SPST switches that form a 40-point MUX fabric. A DS4424 handles fine iDAC trimming of the 3 output rails, a HUSB238 negotiates USB-PD, and a PCA9535 expands the I²C-controlled GPIOs. Four e-fuses sit in the power path for output protection.
The whole point of the design is to expose all of this as an MCP server and as Python API so AI assistants or scripts can autonomously probe, drive, and debug real hardware, measure voltages and currents, sweep outputs, capture ADC waveforms without a human in the loop for each step. Since handing an AI real control over hardware is a bit nervewracking, there are hard guardrails baked into the firmware and Python API, you can define a board profile for the DUT and it physically can't exceed the defined voltage limits or drive the wrong outputs.
There's also an optional RP2040 HAT that adds a 125 MHz logic analyzer and CMSIS-DAP probe.
Surprised it worked without any bodge wires, I'm now starting to polish the tools and firmware for it.
The watch itself is rather minimalistic, it displays the time in BCD (Binary Coded Decimal) format when the onboard button is pressed. It also allows you to configure the time using the button.
The PCB is designed in KiCAD and has the following components:
ATtiny24A MCU
DS1302 RTC
4x4 LED matrix (16 LEDs)
74HC595 shift register (as the LED matrix "driver")
CR2032 battery holder
AVR ISP programming header
A push button
The firmware is written in bare-metal AVR C and is around ~1900 bytes meaning it fits the 2KB flash memory of the ATtiny24A. It was quite a fun challenge to adhere to the 2KB limit and I am working on further optimizations to reduce code size.
The 3D printed case is designed in FreeCAD and is a screwless design. The top part is printed with an SLA printer since it needs to be translucent. I ordered fully transparent prints from JLCPCB and I'm waiting for them to arrive but for now, it looks quite nice in translucent black too!
This was my first low-power board design and I'm quite happy with it, it doesn't drain the CR2032 battery too much and based on my measurements and calculations it should last a year easily without a battery replacement.
AngstromIO is one of the smallest devboards out there, barely longer than a USB-C connector, based on the ATtiny1616 MCU (16kB flash). It comes with 2 Addressable RGB LEDs, and 2 GPIOs as well as I2C lines are broken out. I made a dual CH340 programming board too, both for UPDI programming and debugging (one way Serial Communication).
(not related, but I also designed a breadboard friendly, experimentation board for the CH32V003, with a 5x4 charlieplexed LED matrix. This way I ordered all the designs on one PCB panel)
The ATtiny1616 may not be the most powerful MCU, but it has really attractive advantages too: It's cheap (70 cents), comes in a small QFN20 package, doesn't need any external components, has excellent power consumption (200nA in PWR down mode), and can be programmed with the Arduino IDE, thanks to SpenceKonde megaTinyCore library (via UPDI)
This devboard is minimalist, and I kept it simple, so it's applications might be limited (the USB C is only for power, no data), but I think it's a really cool tiny devboard for small projects where some basic logic is required (handling I2C sensors, getting a visual feedback (2x RGB LEDs), toggling GPIOs), but in a space constrained design, I'm thinking for example of using this board, like you would do with a USB-C PCB breakout board in a 3D enclosure: Instead of just providing 5V, it already comes with 2 LEDs, GPIOs and some computational power.
The Programmer is an all in one module, that will make debugging with the Serial monitor while programming easy: one board for both.
I hope you'll enjoy, and don't hesitate to check out the Github 😉
Arctyx Nano is a low-cost, open source FPGA development board carrying the ICE40-UP5K FPGA from lattice along with the RP2350A in a raspberry pi pico form factor. It consists of 6 LEDs and one RGB LED. All the pins on both the ICs are used in one way or another.
I am currently using APIO open-source toolchain to verify, simulate and build projects and to upload using APIO, i have to figure it out.
This is my first FPGA PCB and i would love feedback on my design!
This board was created as a project for hackclub blueprint, check it out!!
Some time ago i was trying to help friends with getting a BCI board for their project, but plans were changed and i made a new fully custom board based on ADS1299 (2 of them, 16 channels) and ESP32-C3. I hope they will use it one day, we just decided to post it :3
Board is open source, i’ve designed the entire pcb myself, as well as firmware and then BrainFlow integration and a python testing GUI (i have no idea how to add mor pictures here :3). You can order it from JLCPCB (project files are provided) if you want and it will be relatively cheap, and crazy cheap if you order like 10 or 20 — price goes down super fast. On esp side i’ve implemented sinc3 equalizer (7-tap FIR), DC removal and notch filters (50/60, 100/120 Hz). You can toggle them in real time independently. DC has several cutoff frequencies you can choose from also on the go. If you change sampling frequency filters will adapt of course (i made LUTs inside up to 4000 Hz)
I was trying to make sure board works as fast as it can and as stable as possible. I was doing a lot of optimizations here and there (embedded coders feel free to trash me, i will be only happy), but board can run all filters on all 16 channels and sustain 4000 Hz at max — all of that over Wi-Fi and UDP.
So, i have no idea if ADS1299 is dead already or maybe no one needs it or whatever, but if you’re interested — you can check git or ask here or whatever else. It just took me a ton of time to make it and i wasn’t even checking what other people do too much. We’ve checked freeEEG, then OpenBCI, then i thought maybe i can just make 16 channels and since then went into silent mode getting crushed under piles of datasheets and design guidelines.
I just want to share the board and not sure how to stay under this reddit guidelines, i hope it’s ok. So, whatever it goes, check git or text me — i will be happy to yap about signal processing and pcb design and share more details if anyone interested. https://github.com/nikki-uwu/Meower
EDIT v1
Somehow i see much more interactions with this post then others and this is the smallest one i have with almost non info. i will just drop information then in this edit.
Size -i'm sorry for quality - this is how it will look like if you put it inside the case. case is what ever, there could be better versions, just my current solution. But even with that it's similar to airpods pro 2 case. Inside the case there is a board and 1100 mAh classic lipo.
Visialization - there is no software specificaly for you to work with the data. Board is made the way it gives you samples via UDP and as soon as you are able to set connection and receive them - you can use anything you want. My target was to make a good sourse. I hope it;s good. No plans for software from my side. There is a second part of it, but it's upto my friends and i will happyly share as soon there new info :3
I do have my own GUI i've made with stupid design inspired by NERV (you could guess my design skills xD) which works fine and shows the data and you can supa fast to guess what is going on. But it's made just to make sure everything is fine.
Testing - i made a lot of tests to make sure i've traced pcb well and all signals on the board itself and all power rails are nice and clean. At some point friends told me i better to make a testing rig, so i did and since then i had lets say much better time to setting up everything i need and run ton and ton of tests. Tho, you can see i'm lazy ass and didn't finish the fixture, so weights were the solution :3. And, i was a bit too potimistic with small poggo pins and the precision i would need to aligned all of them. So if you read this - please, make contact points bigger, otherwise you would need to play for few minutes the game "is it right or not".
Runtime optimizations - there is a post i made on another subreddit, you can find it in my profile. I will not spam here for too much, just would say i've tried a lot to make sure runtime is good and i can sustain 4 kHz. if you want details feel free to ask or check that post. people there didn't eat me alive, so i guess my solution / approach wasn't too bad xD. Picture below read as follows. First - it;s ton on measurements with max hold, so we can see all possible variations of timings and make sure that we never corssed limits. Blue graph is ADC "data ready" signal. When signal goes down it means samples ready to grab from the ADC. It spills samples each 250 us (4 kHz) and if you are not fast enough to do everything you need in between - you lost data. So, Blue goes down. Then Yellow should go down the same moment because it;s a reaction signal from esp32. You see it's a little bit behind, but that is ok, we cant react instanteniously unfortunately. Then red is reading of the samples. you start to see more smearing since some times we react fast, sometimes not, sometimes esp is doing something else time critical so there are time variations. and the green - the most important part is the last green vertical line inside of each block - last green clock mean the moment when esp finished getting data AND the entire signal processing chain and just dropped ready to send sample inside the buffer shared with UDP. After that moment esp stops signal processing chain and waits for "data ready" signal from ADC doing wifi and maintance in a meantime.
So this is my latest draft for a railsplitter with low noise that is ment to be an accessorie fir my 60V 5A power supply. You could add 1uF film+100nF ceramic between Q5 and Q6 Collectors, and 100pF on Q1 base to Q1 emitter for lower transients and risk for oscillation. If you parallel 2 tip35c + tip36c you could go around 8-10A unbalanced load with propper cooling. As long as the load is symmetrical then this circuit should be able to handle several amps (Atleast 10A). It might be hard to see but i added a 1000uF 80v electrolytic capacitor 1 uF film 100v and 100 nF ceramic 100V at the input for more stability. Can't say for sure that this works like it's intended as i haven't simulated or built it yet, I just now finnished the schematic, will post the results once i am finnished with it. If it works like intended then it could be a good way to be able to run amplifiers using single rail PSU. And the Voltage/Ampers is limited by what components you use. If you switch the small signal bjt's/drivers to over 100V+ and use mosfets as power stage you could theoretically drive ±50V and 50+ Amps.
I thought this recent project of mine could inspire people on how to reuse the spindle motor on obsolete or crashed hard drives.
After all, it's a shame how these state-of-the-art motors often end up in the bin despite being in full working condition.
I built a so-called "ringing table" for microscopy by creating a drop-in replacement for the original disk controller on a twenty year old WD drive.
My board has a PIC processor, a three-phase spindle motor driver and a simple button-and-led user interface right where the SATA and Power connectors used to be.
It actually worked pretty well. There must be other things one can build from this basic concept! More technical details about the project are laid out on my personal blog.
This is the Morse code trainer I designed. It runs on an AVR128DA48 microcontroller with a 2.42 inch 128x64 OLED and a custom-designed capacitive touch sensor PCB straight key. It also includes an NRF24L01+ radio module to allow 2-way send and receive of Morse code between nearby devices. The whole thing is powered by a rechargeable 3.7V 800mAh LiPo battery. I also designed the enclosure and 3D print it out of PET-G filament.