Fletch's Fab Academy 2014 Blog
10. Input Devices
This weeks assignment was to measure something: add a sensor to a
microcontroller board that you've designed and read it. After
Neil's comment that the hall effect sensors were sensative enough to
detect the Earths magnetic field I decided to put this idea to the
test and build a spinning top that displayed text on a radial strip
of LEDs and synchronised the text display to the spin rate of the
top using the Earths magnetic field as an index point.
10.01 Initial Test Design of Fab Spinning Top
I put together a fairly quick test design based on a similar project
I'd seen before, using a circular PCB and a pair of CR2032 cells at
opposite sides of the board to balance it. I then intended to
use a bolt through the middle to provide a pivot point to spin
on. Here are the Eagle schematic
and pcb files for my first
attempt.
The batteries used are Radio Spares part number 597-368.
These were chosen simply because I had some laying around. The
design would benefit from being modified for a pair of standard
CR2032 battery holders.
I made the PCB as big as I could in the free version of Eagle,
around 3 inches diameter. I marked the edge of the board with
a circle in the top copper layer in Eagle before I did the
routing. I placed the batteries on opposite sides of the PCB
to balance it. I arranged the LEDs in a radial strip at the
top of the PCB.
Note that the hall effect sensor is sensitive perpendicular to it's
marked surface, so it actually needs to be mounted vertically on the
PCB, using a small wire leg (see below).
I wanted as many IO pins for LEDs as possible, so I used an
ATTiny44a rather than a ATTiny45. However without multiplexing
or re-using the ISP pins I only had 5 LEDs, so I found this nice little 5
pixel high low res font that I could use.
I put together a couple of test bit of software and the first thing
that I discovered is that in it's basic form the A1302 hall effect
sensor in the fab inventory is no where near sensative enough to
detect the difference between North and South in the Earths magnetic
field. So as a temporary measure I used a strong magnet to
mark an index point. I used on of the built in Timers to
create a ticker that I used to measure the time of each revolution
and then converted that to RPM. Here is a quick video of the spinning top
in action. It's displaying revs per second as it spins.
Fab Academy spinning top
from James Fletcher
on Vimeo.
With the limited FLASH space for the font and time available I
didn't carry on to display complete user programmable messages with
this initial design. Code is here (it ain't
pretty or well commented as it's only test code).
10.02 Sensitivity Issues in Intitial Design
A quick and imperfect analysis of the issues I had with the
sensitivity of the hall effect sensor.
- Earths magnetic field varies from 0.25 to 0.65 Gauss
(according to Wikipedia which is of course always correct!).
- A1302 sensor in inventory has a sensitivity of 1.3 mV / Gauss
(at VCC=5v).
- ADC on ATTiny44a is being used in 10 bit single ended mode
with full scale VRef of VCC, this gives approx 5mV per bit
resolution.
So assuming worst case Earth field strength of +-0.25 Gauss between
North and South we would expect to see approx 0.65mV change on the
ouput of the A1302. We can only measure down to 5mV, so no
where near enough.
10.0.3 Other Issues with Initial Design
The initial design had some other issues that I would address in any
future versions:
- The batteries caught on the strong magnet used as an index
point as the board came to rest att the end of each spin.
This sometimes ripped the batteries from the board as the solder
pads were quite small. In future I'd add a large copper
pad here.
- The connector placement was a bit awkward and I damages all of
the connectors at some point, lifting traces from the PCB.
Hence the large amountss of hot glue in some of the images.
- 5 LED's isn't really enough, I'd multiplex and use more.
- The ATTiny doesn't have anough FLASH to store the whole
font. I'd probably change to an ATMega.
- The batteries are soldered onto the board as these were the
only ones I had available. I would look to get some
holders for CR2032's or use AAA cells on a slightly larger
board.
10.04 Proposed Design Sensitivity Improvement
If I was to use 2 hall effect sensors facing in opposite directions
to maximise the difference in the outputs and then feed this to the
differential inputs of the ADC I could also utilise the built in 20x
gain.
Also the original single ended input voltage was centered around
2.5V, meaning that I had to use an ADC Vref of VCC in order to have
the dynamic range to be able to measure the signal. As my
differential signal is centered around 0V I can now use a much lower
Vref (maybe the built in 1.1V reference) and consequently get a much
greater resolution.
In this case I would very roughly get the following input signal:
+- 0.25 Gauss from each sensor, therefore +0.5
Gauss when facing North and -0.5Gauss when facing South. At
1.3mV/Gauss this gives a signal of +-0.65mV. We may not be
able to measure the negative signal depending on the setup of the
ADC.
ADC sensitivity:
Vref 1.1V gives approx 1mV internal
resolution. 20x Gain gives roughly 0.05mV external resolution.
This should be enough to detect the Earths magnetic field as the top
spins, however it's quite a small signal and will be very prone to
noise!
10.05 Step Response Board
I decided to have aplay with the step response board as this is such
a versatile input device. I redesigned the PCB to add a couple
of LED's (reusing some SPI pins). Here are the Eagle schematic and PCB files. I left
large pads on the PCB to test with rather than add a connector for
external sense pads. I wanted to ultimately make this into
another message spinning device, but this time for a bicycle wheel,
using the step response to detect the chainstays or forks as the
spun past.
The LEDs on the test board are programmed to flash when the user
touches the pads. In order to get enough pins to drive the
LEDS and the sense pads on an ATTiny45 I had to reuse the SPI pins
for the LEDs. Code is here
(again it's only test code so not pretty).
I also modified Neils python code slightly to show separate up /
down values so that I could better understand what's going on.
Python code here.
There is a lot more to investigate with this input device and I plan
to spend more time playing with configurations of sense plates and
the timing of the ADC conversions.
10.06 New Spinning Top Design
With the time left I decided to improve the spinning top design to
see if I could get it to detect the Earths magnetic field. I
added 2 opposing A1302 hall effect sensors and wired them so that I
could test using both the differential input of the ADC as already
described or try looking for zero crossing points using the Analog
Comparator. I also re-used some of the SPI pins for
LEDs. Eagle files sch, brd.
I've milled this board but the traces broke in a few places (see top
of image below, sorry slightly fuzzy). I'm in the process of
modifying and re-milling it.
I've successfully made and populated the PCB for this new spinning
top design, but then run out of time to do anything other than basic
tests with the code. This will be re-visited when I have time
after the end of Fab Academy.