An angry barking blue-in-the-face mad proximity sensor - Boldport Club Project #9, November 2016.
Here's a quick video of it in action:
PissOff is the Boldport Club Project #9 (November 2016). It is a collaboration with LuckyResistor.
The core subsystems of the project:
- 3.3V linear regulator provides power for all components
- SD card adapter for audio file retrieval
- an infrared (IR) transmitter and receiver
- audio mixer and low-pass filter
- audio amplifier and speaker
- ARM Cortex-M0+ microprocessor to tie it all together
Ref | Item | Qty |
---|---|---|
IC2 | Kinetis E series, ARM Cortex-M0+ SOIC20 32 bit MCU, NXP MKE04Z8VWJ4 | x1 |
IC1 | Audio power amplifier SOIC8 IC, TI TPA301DR | x1 |
J9 | microSD SMD card socket, MOLEX 1051620101 | x1 |
VR1 | 50KΩ SMD trimmer, Bourns TC33X-2-503E | x1 |
29mm round speaker, Pro-signal ABS-205-RC | x1 | |
3xAAA battery holder with switch, TruPower SBH431-1AS | x1 | |
IC3 | 3.3V LDO voltage regulator, Diodes AP2210K-3.3TRG1 | x1 |
D1 | 5mm IR phototransistor (black lens), Multicomp OFT-5301 | x1 |
D2 | 5mm IR diode (blue lens), Kingbright L-7113F3BT | x1 |
IC4 | n-channel SOT23 SMD MOSFET transistor, ON Semiconductor 2N7002ET1G | x1 |
C4,6 | 0.1µF 0805 SMD ceramic capacitor, Multicomp MC0805B104K500CT | x2 |
C1,2,3,5,7 | 1µF 0805 SMD ceramic capacitor, Multicomp MC0805F105Z160CT | x5 |
R2,3,8,10,12,13,14,15,16,18,19 | 8.2KΩ 0805 SMD resistor, Multicomp MCWR08X8201FTL | x11 |
R4,6,7,22,23 | 1KΩ 0805 SMD resistor, Multicomp MCWR08X1001FTL | x5 |
R9,11,spare | 220Ω 0805 SMD resistor, Multicomp MCWR08X2200FTL | x3 |
R1,5,20,21,24,25,26 | 47KΩ 0805 SMD resistor, Multicomp MCWR08X4702FTL | x7 |
R17 | 33Ω through-hole resistor, Multicomp MF25 33R | x1 |
D3 | Yellow 0805 SMD LED, Kingbright KPT-2012YC | x1 |
20AWG wire, Belden 566-8020 | 14cm |
While you can hand-solder the project, it also presents a nice opportunity to experiment with reflow techniques.
I found this great tutorial from sparkfun, everything I need to know to do a decent job of my first reflow with stencil:
I decided to try my hand at some reflow. I'm using the stencil from OSH Stencils, some 63/37 solder paste and a hand-held hot air gun.
Stencil and board taped down with kapton in an ad-hoc PCB frame:
Solder paste applied, all components mounted:
After reflow with hand-held hot-air gun:
At this stage I did a full continuity check on all soldered components to make sure the reflow had produced reliable connections. I only found two problems:
- one of the capacitors got dislodged at some point and wasn't properly connected on one terminal
- pin 11 of the microprocessor wasn't making a good connection
No problem - couple of dabs of solder paste and reflow - now all good!
Overall, the reflow assembly process worked brilliantly:
- much faster than I could have done it by hand soldering with an iron
- I doubt I could have soldered the SD card socket by hand without a great deal of pain
- the final result looks great - almost like it came out of a factory
Next to final assembly:
- through-hole components with an iron
- hot-glue for the speaker and battery pack attachment
And here it is, ready to test:
The microcontroller comes preloaded with the correct code, and works out of the box. To investigate the sources, or compile a derivitive work, see the source code on GitHub.
First I'll get this started with the preloaded code...
@fuchs has provided a PissOff default disk image with a barking dog sound. The RaspberryPi guide to installing disk images is a good resource for instructions no how to prepare the SD card. I'm using a Mac, so these are the appropriate instructions.
Using Disk Utility to verify and identify the SD card:
I first tried with a very old 128MB microSD card, formatted as "MS-DOS (FAT)" in the MacOSX Disk Utility tool.
Copying the disk image to the device:
$ diskutil list
...
/dev/disk3
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *127.1 MB disk3
1: DOS_FAT_32 UNTITLED 127.1 MB disk3s1
$ diskutil unmountDisk /dev/disk3
Unmount of all volumes on disk3 was successful
$ sudo dd bs=1m if=disk.img of=/dev/rdisk3
0+1 records in
0+1 records out
342016 bytes transferred in 0.026458 secs (12926740 bytes/sec)
$ diskutil eject /dev/disk3
Disk /dev/disk3 ejected
So far so good, but no sound when I try it in the PissOff.
Note: read on for two solutions and the underlying problem finally identified and resolved.
Time to connect up a serial debugger! Serial connections are on J4. The PCB conveniently has offset holes, so a pin header can be simply inserted with press-fit. I'm using a USB Serial adapter with a 3.3v logic level mode. Only 3 wire connections are required:
USD Serial Adapter | J4 |
---|---|
RXD | tx |
TXD | rx |
GND | gnd |
Here is the adapter connected:
The problem is immediately apparent. The disk is mounted but the processor can't read any blocks. The troubleshooting guide is a good reference for the debug interface.
From reports I've seen in the Boldport Slack, not all SD cards work with the PissOff. The main factor seems to be older/smaller capacity cards that probably don't support SDHC correctly.
So I tried again with a newer 64Gb SD card, formatted as "MS-DOS (FAT)" in the MacOSX Disk Utility tool:
$ diskutil list
...
/dev/disk3
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *67.1 GB disk3
1: EFI EFI 209.7 MB disk3s1
2: Microsoft Basic Data TEST 66.9 GB disk3s2
$ diskutil unmountDisk /dev/disk3
Unmount of all volumes on disk3 was successful
$ sudo dd bs=1m if=disk.img of=/dev/rdisk3
0+1 records in
0+1 records out
342016 bytes transferred in 0.026458 secs (12926740 bytes/sec)
$ diskutil eject /dev/disk3
Disk /dev/disk3 ejected
And it works! Here's the serial debug output for an alarm sequence:
Here's why the BoldportClub slack channel rules: the SD card support issue was finally resolved by @pastva:
I found why pissoff can't play files from small cards (2GB).
Serial debug revealed that READ_MULTIPLE_BLOCK (CMD18) returns error code.
I found that SDHC cards are addressed in terms of 512 byte blocks, non SDHC card expects byte address.
To fix it SDcard::startMultiRead method has to multiply startBlock by 512 for non SDHC cards (or << 9).
Then @fuchs created a non-SDHC card image: piss-off-disk-no-hc
I tried this image with the 128Mb SDIO card (that failed in my first attempt), and it works just fine!
Copying the image to the SD card:
$ diskutil list
...
/dev/disk2
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *127.1 MB disk2
1: DOS_FAT_32 UNTITLED 127.1 MB disk2s1
$ diskutil unmountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
$ sudo dd bs=1m if=disk_non_hc.img of=/dev/rdisk2
0+1 records in
0+1 records out
342016 bytes transferred in 0.274037 secs (1248064 bytes/sec)
$ diskutil eject /dev/disk2
Disk /dev/disk2 ejected
Successful initialisation and alarm with the new image on a very old 128Mb SD card:
So it turns out my older (failing) SD cards only supported SDIO, not SDHC.
The schematic is nicely documented on the card includedin the kit. Note two errata:
- the IR LED is labelled D2 on the schematic but D5 on the PCB silkscreen
- IC2 pin labelling is a little off in the schematic: missing PTB4; PTB5,6,7 offset by one and an erroneous "Enable" label inserted
As part of verifying the circuit, I redrew the schematic in Fritzing:
- PissOff - in the Boldport shop
- PissOff - project page
- PissOff - OSH files on GitHub
- PissOff - club community site, packed with resources for the project
- PissOff source code
- PissOff default disk image
- installing disk images
- MicroSD - wikipedia
- SDIO, SDHC, and SDXC - wikipedia
- MKE04Z8VWJ4 datasheet
- TPA301DR datasheet
- AP2210K-3.3TRG1 datasheet
- 2N7002ET1G datasheet
- ..as mentioned on my blog