Arduino controlled Dual Mono AK4490 DAC (part 1)


This article is the first of a series detailing the design and build process of an Arduino controlled Dual Mono AK4490 DAC by DimDim:

The design goal was to do a dual mono design so as to maximize SNR and channel separation. A 4-layer PCB design was chosen so as to have a very solid, low impedance ground plane as well as proper power and signal planes. The I2S, audio signals and power after the local LDO regulators are routed on the top layer, the 2 middle layers are ground and power planes, and the bottom layer serves to route I2C signals and some power lines.

See the full post here, Dimdim’s blog.

ESP32 (27) – GPS

In today’s post I’ll show you how to interface the esp32 chip to a GPS receiver to receive the actual position, speed and more…

GPS receiver

On the Internet and in electronic stores you can find different GPS receivers… thanks to the spread of navigators, smartphones and multicopters you can now buy one for few euros. For this tutorial, I used a GPS receiver sold by Banggood and based on the u-blox NEO-M8 chip:

gps-010 gps-011

Almost all the GPS receivers offer a serial interface, you can therefore connect them to an esp32 chip using one of its UART controllers, as I explained in a previous article. Sometimes it’s not easy to identify the various pins and it may be necessary – as in my case – to open the plastic case that contains the chip to read the PCB silk screen:

gps-001 gps-002

From the photos above you can understand the pinout of my receiver:

  • GND (ground) -> black cable
  • VCC (power supply) -> red cable
  • TXD (transmit) -> green  cable
  • RXD (receive) -> yellow cable

I decided to use the UART1 controller of my esp32 chip, with pins 4 (TX) and 16 (RX). I therefore connected all the cables, paying attention to connect the TX pin of the receiver to the RX pin of the chip and viceversa:



GPS receivers send data following the NMEA 0183 standard (often called just NMEA).

NMEA is based on strings (sentences) composed by a maximum of 80 characters with an ending CRLF. Each string has the following format:

$PREFIX,data1,data2 ... dataN-1,datoN*CHECKSUM

The prefix (5 chars) defines the type of device (for GPS receiver is GP) and the type of sentence (the following 3 chars). Each sentence includes a checksum (XOR) that allows the receiver to validate the data received.

The NMEA standard defines many types of sentences and each manufacturer can add proprietary types to communicate specific data. A complete list of NMEA sentences is available at this website. Let’s analyze one GGA (Global Positioning System Fix Data) sentence:


The receiver is sending the actual position (latitude 38°77.038′ NORTH and longitude 77°02.110′ WEST), obtained at 18:36:19 thanks to 8 satellites. The fix (position) quality is GPS Fix (1).

To be able to get data from the GPS receiver your program must therefore “understand” the NMEA sentences it receives. I found a very good library, minmea, developed in C and able to parse the most important NMEA sentences.

You only need to copy the two source files (minmea.c e minmea.h) in a subfolder of the components folder of your project and to create a file as it follows:


I had to add the highlighted flag because of the esp framework does not include the timegm() function and therefore, as explained also in the README of the library, you need to tell the compiler to use the more common mktime() instead.


In my Github repository you can find the program I developed for this tutorial. Let’s analyse the most important pieces of code:

To use the minmea library, include its header file:

#include "minmea.h"

Read a line from the UART1 controller and pass it to the library to be parsed:

char *line = read_line(UART_NUM_1);
switch (minmea_sentence_id(line, false)) {

Finally verify if the new parameters are different from the ones already saved and, if so, print them on the screen:

float new_latitude = minmea_tocoord(&frame.latitude);
if((new_latitude != NAN) && (abs(new_latitude - latitude) > 0.001)) {
  latitude = new_latitude;
  printf("New latitude: %f\n", latitude);

I added a threshold value (0.001) to avoid printing a lot of small updates, due to disturbances or oscillations on received data.

Here’s the program running on my laptop:


App note: Intelligent power switches for 48 V battery applications


Application note on controling Intelligent Power Switches (IPS) from STMicroelectronics. Link here (PDF)

For the last 15-20 years, the automotive electronics market has been moving from electromechanical relays to solid state components for driving all kind of loads.

It is obvious why: solid state components are smaller in size, lighter, silent, easy to mass produce because they are housed in SMD packages, and they boast an unrivaled number of switching activations. On top of this, the solutions based on silicon components have a much higher electrical efficiency and offer useful types of diagnostics such as short-circuit, overload and thermal protections, they can supply an actual image of the current flowing into the load, and so on. In fact, they are called “Intelligent Power Switches (IPS)” or “Smart Power MOSFETs” for good reasons. The key “switching” element is an N-MOSFET, with the relevant charge pump. Around the N-MOSFET, logic interfaces and other elements contribute to the protection of the MOS and they generate and manage diagnostic data.

MickMake Mail #21: IkaScope, Tindie goodies & appliance hacking.

A bunch of goodies arrived. The IkaLogic guys sent me one of their IkaScopes to review, a bunch of Tindie goodies for the MickMake/Tindie competition and a few appliances that I really need to hack. IkaScope Hardware The probe tip has a nice solid click feel to it letting you Continue reading MickMake Mail #21: IkaScope, Tindie goodies & appliance hacking.

Posted by Mick on MickMake - Live. Learn. Make.

Teardown of a BK precision 1696 programmable switching power supply


Kerry Wong did a teardown of a BK Precision 1696 programmable switching power supply:

My original plan was to find a replacement LCD and restore the unit to its original full functionality. But the LCD used in this unit is likely specifically made for the 169X series of power supplies and through some initial research I realized it would be extremely difficult to get hold of unless I could find a donor unit with a functional LCD inside. After I received the power supply, I realized that it had more issues than just the broken LCD itself. During my initial testing, I found that the output would not reach higher than 10 to 11 volts even with the over voltage protection set to the maximum value (20.5V). So clearly I have more homework to do, and for the time being let’s simply strip it down and see what’s inside.

See the full post on his blog.

Check out the video after the break.

Fascinating details of Waveshare e-paper displays


Erich Styger has a nice write-up on Waveshare e-paper displays:

I have used E-Ink displays in projects three years ago, but from that time the technology has greatly evolved. That time displays were hard to get, expensive and difficult to use. Now things seem to change with e-ink displays available to the maker market :-). I’m able to get a 128×296 pixel e-paper display for $10! And for little more money I can have displays with black/white/red colors!

More details at MCU on Eclipse homepage.