#391 MilliVoltmeterDIY Custom PCB and Enclosure
Custom PCB and enclosure for the ATmega328-based millivolt meter based on a design by Scullcom Hobby Electronics. Uses an LTC2400 ADC and LT1019 voltage reference
Notes
This is a continuation of LEAP#372 MilliVoltmeterDIY, a circuit based on the Scullcom Hobby Electronics #44 - Millivolt Meter MK2 project.
Previously, I reached the point of modifying the design somewhat, revising the code and having a breadboard prototype working just fine. Since it is such a handy piece of kit, I decided to go the whole hog: make a PCB and mount it in a case.
Update: I’ve added battery by-pass and reverse polarity protection - see the last section of this document.
PCB Design
I’m going to drop an ATmega328P-AU TQFP on the board, rather than use an Arduino module. So let’s get some pin mapping stright first:
Arduino Pin | Connection | ATmega pin |
---|---|---|
D2 | DB7 serial LCD | 32, PD2 |
D3 | DB6 serial LCD | 1, PD3 |
D4 | DB5 serial LCD | 2, PD4 |
D5 | DB4 serial LCD | 9, PD5 |
D6 | E serial LCD enable | 10, PD6 |
D7 | RS serial LCD | 11, PD7 |
D8 | BTN_2_FUNCTION function button | 12, PB0 |
D9 | BTN_PRECISION precision button | 13, PB1 |
D10 | CS - ADC SPI select | 14, PB2 |
D10 | MOSI - ICSP header | 15, PB3 |
D12 | MISO - ADC SPI SDA, ICSP | 16, PB4 |
D13 | SCK - ADC SPI clock, ICSP | 17, PB5 |
A0 | BTN_CAL calibration button | 23, PC0 |
A1 | VBATT_SENSE battery sensor | 24, PC1 |
A4 | SDA optional I²C screen | 27, PC4 |
A5 | SCL optional I²C screen | 28, PC5 |
RESET | ICSP header | 29, PC6 |
VCC | 4, 6 | |
GND | 3, 5, 21 | |
AVCC | 18 | |
XTAL | 7, PB6 | |
XTAL | 8, PB7 |
I decided to provision pin connections for either serial or I²C LCD displays.
After finding that KiCad didn’t have footprints for half the components I wanted to use in the standard library, I decided to try EasyEDA for PCB production:
- the component library is very complete (I didn’t need to create any custom components)
- but the PCB designer is not quite as advanced as KiCad. Workable though.
The EasyEDA project is available here, and I sent the board off to OSHpark. The OSHPark project is available here.
The boards have arrived! All traces and pads check-out perfectly.
Mostly hot-air for surface-mount components, but through-hole for:
- connectors - I decided to use simple male header pins in this build (instead of soldering wires direct to the board)
- ICSP header and shroud
- trim pot
Dang! This is when I realise I forgot the 50Hz/60Hz noise rejection jumper.
Enclosure and Hardware
I’m using a 140mm x 110mm x 42mm black plastic project enclosure. As a bonus it comes with 4 screw-on rubber feet.
I picked this up while browsing in Sim Lim Tower (Singapore). There is no manufacturer identification, but I suspect it may be the Future Kit FB16.
Control Buttons
I’m using some 7mm normally closed momentary push-buttons similar to these from an aliexpress seller
Input Jacks
I decided to use a nice dual banana binding post for the positive and negative test lead connector, like this example from a seller on aliexpress
I have Multimeter Dual Test Hook Clip to Male Banana Plug Cable that matches perfectly.
I’m maybe having second thoughts about this. If I’d used for example some 4mm Banana Female Jack Socket Panel Mount then I could use most of my multimeter test leads with the unit.
DC Socket
On the rear panel I have a 5.5x2.1mm DC Power Socket Connector Round Panel Mounting to take external 9V DC supply (centre positive), and a SPST 2PIN ON/OFF G130 Rocker Switch 3A/250V. There is no reverse polarity protection in the circuit yet, so maybe I should just throw a diode in series. There’s a perfect spot for it: connecting the power to the switch.
Calibration Test Point
I fashioned a loop of copper wire, soldered to a 1x3 piece of protoboard on the rear. It is positioned just next to the positive input jack.
Code and Programming
The unit is programmed with the MilliVoltmeterDIY.ino sketch and associated libraries.
Only one modification was required. As I’m using normally-closed pushbutttons, the button state logic is declared as active-high:
#define BUTTON_LOGIC_ACTIVE_STATE (HIGH)
I used an Arduino as ISP to:
- burn bootloader
- upload the code
See LEAP#068 ATmegaViaArduinoISP for notes on programming with Arduino ISP.
Assembly
There’s lots of room in this enclosure, so it all goes in very well. Immediately I see a few things that could be better if I’d planned the construction properly when designing the board. If I were to do it again:
- I should reverse the LCD serial connectors, so they don’t need to cross when connecting to the LCD
- the push-button connectors would be better positioned on the other side of the board
- mounting holes I made in the PCB should have been larger! The screws provided with the enclosure are a size too big… so I just hot-glued the board in place.
Done and Tested
Calibrating with the 2.5V reference voltage:
- connect the positive input to the 2.5V calibration test point and press the
C
alibrate button. The calibration factor is stored in EEPROM and reloaded on startup.
The function button cycles between 3 display modes on the second line:
- bar graph
- hold value
- raw ADC value
The precision button cycles through the number of significant digits to display.
Rear view:
With a simple voltage-divider test load:
Battery By-pass and Reverse Polarity Mod
After the initial build, there were two enhancements I wanted to make:
- more flexible power supply: internal battery for portable use. The power socket has bypass connector, so this is easy to add.
- reverse polarity protection, to avoid issues with centre-positive/centre-negative connectors
I’ve just added these, having got hold of some 9V battery holders designed for panel mounting…
The battery is wired up with the negative connection to the bypass connector on the panel jack. I added a 1N5819 rectifier diode in series to the power switch for reverse-polarity protection.
All installed:
Rear panel now has power switch, external power supply jack, and 9V battery holder:
Conclusion
All told, this turned out pretty well, though there are a couple of things I would change if I were to do it again:
- some changes to the PCB as mentioned above:
- flip the LCD serial connectors, so they don’t need to cross when connecting to the LCD
- the push-button connectors would be better positioned on the other side of the board
- larger (M3) mounting holes
- I think I’d switch from binding posts to shrouded banana sockets for the input jacks (compatible with most multimeter leads)
- perhaps a mains AC supply adapter built-into the unit
Credits and References
- Scullcom Hobby Electronics #44 - Millivolt Meter MK2 - YouTube
- Millivolt Meter MK2 - more info on on www.scullcom.uk
- LEAP#372 MilliVoltmeterDIY - precursor: details my adaptation of the design and breadboard testing
- schematic and PCB design available here in EasyEDA
- PCB project available here from OSHPark
- Atmel ATmega328P Product Info
- 9V Battery Case Holder Cover Box Replacement for Active Guitar Bass Pickup
- 1N5819 datasheet
- ..as mentioned on my blog