Published using Google Docs
Volt Meter 1.0 description
Updated automatically every 5 minutes

Arduino Volt Meter Ver. 1.0

This documenht describes the first version of the Arduino Volt Meter as designed and implemented by Joshua Miele, Alexa Fay Siu, and Rich Morin for the Blind Arduino Project for a workshop presented at the San Francisco LightHouse on June 9, 2018. This device is intended to be able to measure 4 voltage ranges with three modes of output, and is intended to be both a practical tool for blind makers and a demonstration of how to design accessible output systems for qualitative and quantitative feedback. We recognize that the design has a number of potential areas for improvement, and intend the workshop to also serve as a jumping off point for the Blind Arduino community to begin iterative improvements on a set of designs for accessible measurement devices needed by blind makers and hardware enthusiasts.

Output Modes

The volt meter includes three modes of output to provide information about the input voltage. These are:

  1. Text to Speech -- The user can press a button to trigger a spoken voltage value. We used the Emic II module from Parallax, Inc. https://www.parallax.com/product/30016
  2. Sonification -- The value of the voltage is presented using a tone with pitch that covers two octaves with the max and min pitch corresponding to the maximum and minimum voltage for the current range. A voltage of zero corresponds to the pitch in the center of the range with positive voltages being represented by the octave above the zero point and negative voltages being represented by the octave below the zero point. The sonification feature makes no sound when the voltage is steady, only becoming audible when the voltage fluctuates above a certain threshold. This allows the sonification to serve mostly to present information about dynamic voltages. There is also a physical switch on the front of the unit to turn off sonification completely lest it become annoying.
  3. Haptic -- A servo motor is used to drive a pointer around a tactile gauge on the front face of the unit. There are 20 tactile divisions on the gauge covering an arc of 150 degrees with zero being at the center of the scale, and 10 markings to left and right corresponding to negative and positive voltages respectively. The zero point is marked with 3 radial dots, and the plus and minus 5 points are marked with two radial dots. All other divisions are marked with a single dot. See more about the markings and servo mounting in the Project Box section below.

Range Switch

The volt meter has four ranges of values it can (theoretically) measure. These are -1 to 1 volt, -10 to 10 volts, -100 to 100 volts, and -1000 to +1000 volts. The ranges are selected using the four counter-clockwise-most positions of a 2-pole 6-throw (2P6T) rotary switch (two positions are unused). The most counter-clockwise position measures -1 to 1 volt, the next measures -10 to 10 volts, etc. For each range, the sonification and haptic gauge represent the full range, so output must be interpreted according to the current range. For example, in the first position, the haptic gauge represents -1 to 1 volt, so each division represents 0.1 volt. In the second position, each tactile division represents 1 volt, etc.

Project Box

The project box is made from laser-cut craft plywood (3 mm thick) with finger jointed sides, top, and bottom, approximately 7.5 in wide, 3.75 in from front to back, and 2.75 in high. All controls, input binding posts, and the haptic display are mounted through holes cut in the top of the box, with the Arduino power and usb accessed on the back along the right-hand edge. Also on the back of the box is an audio jack for the text-to-speech output.

The top of the box is arranged essentially in three columns:

All holes for screws, switches, buttons, etc. are created in the laser cutting process, including the holes for the servo motor driving the gauge and for the tactile markings. The tactile gauge markings can be small rounded screw heads with nuts on the back side of the screws, or a 3D-printed set of plastic pins that can be attached from the underside of the control panel.

[Link to STL files for box and pins]

[Link to OpenSCAD files]

Parts List

The entire project consists of three circuit boards connected together with jumpers  and wire. Wires etc are not included in the parts list.

Components of the custom board are:

Also used in the project:

For the enclosure:

Connections and Circuit Description

The custom board serves primarily to manage the input voltage and range selection, but also includes a convenient connection point for sonification audio attenuation and for the servo to get power. The TTS board also draws power from the custom board.

Note: The custom board itself draws power from the 5V pin of the Arduino Uno. This is a design issue, as it puts a relatively heavy load on the Arduino’s voltage regulator. Future iterations of the volt meter should have power connecting directly to the custom board with conections to supply the Arduino instead of the reverse as we have here.

Custom Board Layout and Wiring

Board layout:

The custom board is approximately 2X4.5 IN. A ground rail and +5V rail (power) run along the long edges of the board at bottom and top respectively. At the Left end of the board, 4 30K resistors in series connect power to ground. From bottom to top on this chain, label the junctions 0, 1, 2, 3, and 4. With 0 and 4 being at ground and power respectively. This voltage divider serves two purposes: 1) to identify the current range for the Arduino, and 2) to provide a 2.5V anchor point for the input voltage divider, thus allowing inputs of positive and negative voltages.

Connected to Junction 2 is another voltage divider (the input voltage divider) extending to the right with values of 11K, 100K, 1Meg, and 10Meg from left to right. Label the points along this voltage divider from left to right as 2 (already specified above), D, C, B, and A.

Junction 2 connects to the negative input binding post and Point A connects to the positive input binding post.

To the right of point A, but not connected to it, are 2 reverse-biased diodes in series connecting power to ground. Label the point between these two diodes Junction E. These are clamping diodes which keep the input voltage at the Arduino sensor pin within the range 0-5V (approximately). To the right of the diodes, but not connected to them, is a 100 Ohm resistor to reduce sonification loudness.

Along the right-hand edge of the board are three 0.1 IN male header pins for powering and driving the servo. The bottom pin is connected to ground, and the middle pin is connected to power. The top pin will connect to the servo control pin on the Arduino.

Board connections

The following connections connect the custom board to the Arduino, box controls, and the Emic TTS board.

Rotary Switch  -- Let’s label the two sets of connections on the 2P6T switch as 1 and 2, with the Poles and throws of each being denoted by the letters P and T respectively, and the throws being labeled in counter-clockwise order (from the perspective of the knob) as A, B, C, D, E, and F. Thus, P1 connects to T1A, and also P2 connects to T2A when the switch is in its counter-clockwise-most position.

P1 connects to Junction E (between the clamping diodes) and also through a male jumper cable to the Arduino voltage sensor pin (A0).

T1A connects to Junction A

T1B connects to Junction B

T1C connects to Junction C

T1D connects to Junction D

P2 connects to the Arduino Range Pin (A1). We used an unused  solder point on the board to connect a Male jumper cable to “simplify” this connection.

T2A connects to Junction 0

T2B connects to Junction 1

T2C connects to Junction 2

T2D connects to Junction 3

Sonification Wiring:

One end of the 100 Ohm resistor connects through the 1P2T switch to the Arduino sonification output pin (D9). The other end connects through the 8 Ohm speaker to ground.

The Servo:

The top-most header pin on the right-hand end of the board gets soldered to a wire and connects to the Arduino Servo Pin (D6). The servo itself plugs directly into these three header pins, making sure the plug’s orientation matches the connections to the servo.

Power Connections:

The power and ground rails of the custom board connect to, and are fed from, the +5 and ground pins of the Arduino. The male ends of two Male-female jumpers are soldered to the rails and are used to provide power to the Emic TTS board.

TTS Connections:

As noted above, the Emic is powered from the custom board. Two male-female jumper cables connect S-in and S-out from the Emic to Pins TTS serial connections on the Arduino (Pins D10 and D11).

The Arduino’s TTS Request pin (D2) connects through the 1P1T push button to ground.  

The TTS audio connects to a ⅛ in mono audio plug and is wired to a ⅛ IN mono jack connected to the back of the project box. An audio plug with a small sleeve profile should be used because the Emic audio jack is slightly inset from the edge of the TTS board, making a solid connection difficult with a large-diameter plug housing.

Note: This design requires an external amplifier or headphones to hear the TTS. The original intent was to mix the TTS and sonification audio into the built-in speaker, but the TTS audio power is not sufficient to drive the speaker directly. The next iteration of the design should include an audio amplifier for the TTS to allow it to use the project’s internal speaker instead of the external audio jack.

Assembly Instructions

  1. Mount servo and tactile markings
  2. Glue top and sides of project box together
  3. Calibrate input voltage divider (see Calibration section)
  4. Make all connections as described in Wiring section except for binding posts and test. Secure connections to Arduino headers with gaffer’s tape.
  5. Mount binding posts, speaker, sonification switch, and TTS trigger button in box.
  6. Connect input wires to binding posts and mount range selection switch to box
  7. Mount Arduino to box with screws ensuring that power and USB pont toward the back of the box
  8. Use Velcro strips to mount Emic to the rear interior wall of the box, and custom board to front interior wall of the box
  9. Mount pre-soldered audio jack and plug assembly to notch in rear wall of the box and connect to Emic audio jack
  10. Secure the box bottom with gaffer’s tape
  11. Connect power and USB, and complete zeroing process (see Calibration section)

Calibration and Zeroing

The meter requires calibration as several points. This corrects for individual variation in the values of the resistors used in the input voltage divider, as well as for irregularities introduced by the double-use of the range-selection voltage divider to hold the negative input at a constant voltage of 2.5V (more or less). Finally we account for any servo pointer offset due to mounting of the pointer on the servo shaft.

Input Calibration

The points along the Input voltage divider are approximately logarythmic. If we apply a known voltage across the entire divider from junction 2 to Junction A, the measured voltage at Junction B will be approximately one tenth of the input voltage, at Junction C will be one one-hundredth of the input voltage, and at Junction D will be one one-thousandth of the input voltage. Since resistors have variation these percentages need to be measured empirically in order to be able to calculate actual input voltage for the -10 to 10, -100 to 100, and -1000 to 1000 voltage ranges. The measured voltage values are then used to calculate actual conversion factors which are ultimately used to calculate input voltage in the VoltMeter sketch. Note that we need a pre-existing calibration voltmeter to make our new accessible voltmeter. This  is left as a point of recursive pondering for the student. We used manufactured talking voltmeters which are no longer available.

After having assembled the custom board, use alligator-clip leads to connect the negative terminal of a healthy 9-V battery to Junction 2 (negative input), and the positive terminal to Junction A (positive input). Note that the larger snap on the 9V battery is the negative terminal. The following readings are all taken with the negative probe of your calibration voltmeter at Junction 2 (the negative input) while stepping the positive probe of the calibration voltmeter along all junctions from Junction A to Junction D. Measurements can be taken either before or after connection of the 2P6T switch. If done before, you can make your measurements directly at the junctions of the input voltage divider. If done after, you can take readings with the positive probe of your calibration voltmeter directly at P1 of the range switch stepping through the positions starting at the counterclockwise-most position.

In making the following measurements, we recommend measuring voltage at each point several times, waiting for the value to settle in a narrow range, then writing down 3 or 4 values around that range, keeping at least 3 significant figures. For the calculations to follow, use the mean or mode value for each junction’s voltage.

  1. Measure the input voltage at Junction A -- Like everything else, 9V batteries are rarely exactly 9V. Begin by measuring the voltage of your battery by measuring the voltage from Junction 2 to Junction A (first position of the range switch). This value will be the denominator of all the ratios you ultimately calculate.
  2. Voltage at Junction B (0.1) -- The measured voltage at Junction B (the second position of the range switch) should be approximately one tenth  of the input voltage..
  3. Voltage at Junction C (0.01) -- The measured voltage at Junction C (the third position of the range switch) should be approximately one one-hundredth of the input voltage.
  4. Voltage at Junction D (0.001) -- The measured voltage at Junction D (the fourth position of the range switch) should be approximately one one-thousandth of the input voltage.

Input Voltage Calculations:

A 4-element  array in the voltmeter sketch called rangeFactor holds the appropriate factors for each of the 4 voltage ranges. In the original sketch, these values are idealized as [1.00, 0.1, 0.01, 0.001]. From left to right, these correspond to factors for positions 1, 2, 3, and 4 of the range selector switch. Actual values for these factors are calculated by taking the average voltage values measured at Junctions A, B, C, and D (above) and dividing each by the average measured input voltage at Junction a. Thus the first element in rangeFactor should still be 1.00. The second element should be something in the neighborhood of 0.1, the third in the neighborhood of 0.01, and the fourth in the neighborhood of 0.001. Edit your voltmeter sketch so that elements in the rangeFactor array reflect factors calculated from your measured voltage values.

Zeroing the Meter

After  having assembled, tested, and installed all components of the meter in the box you are ready to complete the zeroing process. This makes sure that we use a measured zero point for each of the 4 voltage ranges, and that we account for mechanical placement of the servo pointer.

  1. Short the input terminals by connecting a wire between the input binding posts. This ensures that there is zero voltage difference between them.
  2. Connect the Arduino to your computer with the USB cable and open a terminal emulator to the appropriate communications port at 9600 BAUD.
  3. For each of the 4 range positions, note the displayed value. As with other measurements, for each given position, you will see a small variation in values. Write down the most frequent value produced for each range position and edit the elements of the offset array in the voltmeter sketch to reflect your measured values. Numbers should be approximately in the range from 470 to 535.  Elements in the offset array from left to right correspond to range switch positions 1, 2, 3, and 4.
  4. After updating the values in the offset array, close your terminal emulator and upload the updated sketch to the Arduino.
  5. The servo comes with several arms that fit over the motor capstin. Select the one that extends up to, but not past, the tactile markings. If necessary, clip off any extra material from the arm to make it look pointer-like.
  6. With the voltmeter powered and the input terminals still shorted, press the arm onto the capstin pointing as close to the zero point (vertical) as possible. You may not be able to have it point exactly to zero because the teeth of the capstin only mesh with the teeth of the arm socket at certain positions. Get it as close as you can to vertical. And estimate the number of degrees the pointer is away from the actual zero  marking.
  7. Edit the voltmeter sketch changing the value of the pointerOffset variable to reflect your estimated pointer offset. Use positive values if the pointer is to the right of the zero position, and negative values if the pointer is to the left of the zero position. Pointer offset values are in degrees.
  8. After editing the pointerOffset value, reload the voltmeter sketch and see if the pointer now points to zero. If not, revise your estimate of the pointer offset and try again.

[to be continued