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.
The volt meter includes three modes of output to provide information about the input voltage. These are:
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.
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]
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:
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.
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.
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.
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.
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.
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.
[to be continued