Unlike old-school mechanical alarm clocks that you have to set
manually, DJ‘s Internet-connected alarm clock provides three
primary features: automatic time setting on power-up,streaming MP3
music, and remote management. The PIC24FJ64-based clock is
connected to an ENC28J60 Ethernet chip, an MP3 decoder chip, an
organic LED graphical display, and a 24LC512 EEPROM for storage.
My wife is a morning person. She gets up at the crack of dawn and
goes to bed early. I‘m more likely to wake at the crack of noon and
work late into the night. What do we have in common? Like most
people, we both use an alarm clock to make sure we get up when we
need to. My old alarm clock was, well, old, and needed to be
replaced. So, I recently designed an alarm clock with features to
suit my high-tech lifestyle (see Photo 1)。
Most alarm clocks use a radio, beeper,or CD player to wake you up.
My clock accesses my MP3 collection on the server in my home office
via an Ethernet port. The network connection enables me to remotely
manage the clock as well. I can easily set alarms and choose music
from my office without waking up my wife. The clock also has a
built-in GUI so I can manage it locally. Its OLED display and
photocell enable it to adapt to different lighting conditions (from
bright sun to pitch black)。
Now you too can build a customized alarm clock. In this
article,I‘ll describe the design process from start to finish.
SYSTEM OVERVIEW
I built my clock around a Microchip Technology PIC24FJ64 processor
(see Figure 1)。 I chose the DIP package for easy prototyping (see
Photos 2a and 2b)。 The Microchip 24LC512 EEPROM chip has sufficient
hardware resources to connect to the Microchip ENC28J60 Ethernet
chip and an STMicroelectronics STA013 MP3 decoder. It has 64 KB of
EEPROM, a 128 × 64 pixel OLED display, seven buttons, volume
control,power control, and a photocell. That‘s a lot of peripherals
for such a small chip, and I use every resource available to talk
to them.


The PIC24FJ64GA002 is a 28-pin chip with 64 KB of instruction
memory and 8 KB of RAM. The 28-pin DIP package is compatible with
breadboards and the evaluation board,which enables you to move
chips between the various stages of development without having to
reprogram them. Every pin is needed, and some serve dual purposes.
The reconfigurable pin feature ensures that no pins are wasted and
that signals can be routed to the closest pin for a clean layout.
For example, the 32-kHz clock circuit is sensitive to switching
noise, so the pin next to it is assigned to a signal that never
changes after the clock starts. Normally, that pin would have been
part of the high-speed oscillator,but I use the internal RC
oscillator to free up two more pins.
I chose the PIC24FJ64 for its large amount of RAM. The MP3 decoder
chip has a small buffer, and you can‘t rely on the TCP stream to
provide data fast enough. Thus, half of the PIC24FJ64's RAM is
dedicated to a buffer for the MP3 stream, leaving 4 KB for the
remaining tasks. The CPU pins are configured to provide two SPI
busses, one I2C bus, three ADC inputs,one serial port, and seven
GPIO pins. The serial port shares pins with the in-circuit
programming jack (with series resistors to protect against shorts),
and one of the ADCs doubles as a mute control.
Most projects are all about doing one thing well. This project is
about doing many things well enough, with the PIC24FJ64 controlling
everything(see Figure 2)。

Now let‘s examine each module connected to the PIC24FJ64 and what
the processor does with it.
NETWORK
The ENC28J60 Ethernet chip handles networking (again in a 28-pin
DIP package)。 The magnetics are contained in the RJ-45 jack,
leaving only a 25-MHz crystal oscillator and some discretes to
complete the circuit. Because the two LEDs are inside the cabinet
to avoid light pollution,they're reprogrammed to indicate transmit
and receive traffic instead of link and activity.
The PIC24FJ64 talks to the network chip via a SPI bus running at 4
MHz,which is shared with the MP3 chip. While the Microchip TCP/IP
stack is used, the default parameters (buffer size and timeouts)
weren‘t aggressive enough to smoothly stream MP3 data. The receive
buffer was made much larger (600 bytes) than the transmit buffer
(100 bytes)。 The retry timeout was decreased well below the
"standard" value to 5 ms. If a packet is missed, there may not even
be a gap in the music.
In addition to the MP3 stream,there‘s also a DHCP module to
configure the network stack and an SNTP module to retrieve the
current time. SNTP is the "simple" form of NTP; it requires only
one request packet and one response packet, and can use broadcast
UDP.[1]
DISPLAY
The display for an alarm clock has to work in conditions that most
displays never encounter. It has to be visible in bright
daylight,but shouldn't shine too brightly in a dark room. Most
alarm clocks have seven-segment LED displays, which can be dimmed
as needed. LCDs are either not visible at night or require a
backlight that appears as a grey rectangle at night. I wanted the
advantages of LEDs with the flexibility of LCDs, so I turned to
OLED technology. The OLED display I chose uses a SPI bus,so any
display that uses SPI (OLED,LCD, and VFD) can be used without major
changes in the schematics. If you want to use a display with a
parallel bus,you can use a PIC with more pins.
The OLED display is a matrix of tiny LEDs. Each can be set to one
of 16 brightness levels. In addition, the drive current can be set
to one of three levels. During the day, the drive current is
maximized and the pixel values are used to control the brightness
of the display, according to the photocell readings. At night, in
addition to using the lowest (non-off) pixel value, the drive
current is reduced to its lowest level, resulting in a dim display,
which is suitable for night viewing.
One catch with the OLED display is that you can‘t apply drive power
until the controller chip is running. So, the PIC24FJ64 has one
GPIO that controls a pair of transistors that switch on the 12-V
power for the OLED, after it‘s had time to come out of reset. The
power rail also has extreme current swings, so it is bypassed with
both a large electrolytic capacitor and a low-ESR tantalum.
Note that ceramics can't be used here!Ceramic capacitors are
piezoelectric, so those types of current swings cause the capacitor
to move like a tiny piezo speaker. I wanted to make the clock as
noiseless as possible. It took me a while to find the source of the
noise because I expected the coils in the switching power supply to
be the problem source. If you choose to use an LCD, this power
switch could be used to control the backlight, either as a simple
on-off switch or by reprogramming the PIC pin to be a
pulse-width-modulated output.
The OLED routines write to the display exclusively with bit-blit
(BITBLT:BITwise block transfer) routines, copying font elements or
stored images to the display as needed. (Refer to the oled.c file
on the Circuit Cellar FTP site.) Because the display uses 1 byte
for every two pixels,all images are an even number of pixels wide.
To save space in the EEPROM,all images are compressed, with one of
three run-length compression algorithms. The "main font" used for
the primary time display is stored as a 2-bit- per-pixel image,
with pixel values representing background, foreground, and shadows.
They are dynamically replaced with pixel values based on the
photocell. Thus, the main display‘s brightness depends on the room
brightness.
The other two formats are a 4-bitper- pixel image and a
1-bit-per-pixel image. The format used depends on the image. The
internal functions allow any format for any image.
For debugging, there‘s also a console emulator. It uses the
smallest font to provide an 8 × 21 character screen and a
printf-like function.
MP3
The MP3 chip is an STA013 MP3 decoder, which is actually a custom
DSP chip. It talks over both an I2C bus and a SPI bus. The I2C bus
is used to configure the DSP and control it, such as changing the
volume.
The SPI bus provides only MP3 data. Because it is smart enough to
skip over non-music data, the PIC24FJ64 does not need to interpret
the MP3 stream-it just feeds it to the decoder, so you can use
unmodified MP3 files. There are two such files stored in the
EEPROM. One is a moment of silence to help reset the DSP's
sequencer. The other is the default"beep" sound the alarm uses if
it can‘t contact a music server. The MP3 decoder has the third
crystal oscillator in the project: a 14.318-MHz clock circuit.
The output of the MP3 decoder is a serial digital audio stream,
which is fed into a serial DAC chip. The chip's two outputs are
level-adjusted and fed into a pair of differential-drive
amplifiers,which can provide 5 W into an 8-Ω speaker and will run
off up to 18 V,so no regulator is required. The amplifiers have a
separate volume control pin, so a single voltage reference can
control both channels.
The voltage reference is created by the volume control
potentiometer R307; it is offset to a range of 0.4 to 1.0 V by R306
and R308. This matches the useful range of the amplifier‘s control
pin. The voltage at this point is fed into one of the ADC inputs of
the PIC24FJ64, so it can monitor the volume setting (see Figure 3)。
In addition,the PIC24FJ64 can turn that pin into an output, set it
low, and force the volume control low enough that the amplifier
goes into a low-power standby mode. This gets rid of the tiny
residual noise that the amplifier produces when it's active. The
resulting voltage is buffered by U304, so the load from the
amplifiers doesn‘t distort it.

The audio module also uses the greatest range of power sources. The
STA013 runs off 3.3 V, but it needs an isolated supply for its PLL,
which is provided by two 4.7-Ω resistors R303 and R304 and bypass
capacitor C306. These form a high-current low-pass filter. The DAC
chip runs off 5 V so it can produce an output of sufficient
amplitude. The amplifiers run off the raw power from the wall wart,
which ranges from 16 V at idle to 12 V under full load.
ADC
Three ADC inputs are used to monitor the ambient light, volume
setting,and push buttons. The photocell is used with R110 to
produce a light-sensitive voltage divider. More light increases the
reference voltage, which is read as a higher value by the ADC. Each
ADC input includes a small capacitor to keep the ADC's sample and
hold circuitry from distorting the input signal.
In addition to the photocell and volume control, the ADC is also
used to monitor the seven push buttons. To save on pins, each
switch connects a different valued resistor into a resistor
divider. The resistor values were carefully selected so the ADC
values produced are evenly spaced and halfway between multiples of
64. Thus, I can simply use the high 8 bits as the "switch number."
For debouncing,there are two mechanisms. First, capacitor C101 acts
as a low-pass filter. Its value is small enough that the signal can
pass through each switch‘s "zone" within one cycle of the ADC.
Second, the software requires the same switch reading multiple
times in a row. Only a stable value is used to trigger a button
event. The mounting of the switches was somewhat of a challenge. I
use tactile switches, which have a small range of motion but a good
"feel." To adjust their spacing relative to the wooden buttons
activating them, I mounted them on a circuit board, and held that
board with two nuts on a screw (see Photo 3)。 The screw head is
epoxied to the case. The nuts can be adjusted to control the
spacing between the board and the case accurately.

MEMORYThe alarm clock has five different types of memory. In addition to
the 64 KB of flash memory and 8 KB of RAM in the PIC24FJ64, there
is a small buffer in the MP3 decoder (it holds only one MP3 frame
at a time) and 8 KB of RAM in the Ethernet chip. However, I needed
somewhere to store the alarm settings, fonts, images, and other
data. I chose a 24LC512 EEPROM, which holds 64 KB of data. The
design allows for two EEPROMs, in case I need more room for MP3s,
but so far I've needed only one. These EEPROMs live on the I2C bus.
There‘s a table of contents at the beginning of the memory, which
holds the size and location of each block of data in the chip.
There's a block for each font, a block for alarm settings, a block
for each music source, a block for URLs, and more.
Because the EEPROM is 64 KB,addresses are 2 bytes, which is
convenient. In addition to providing data to the various routines
in the clock,the EEPROM module listens on a TCP port for remote
management. The protocol is simple. The remote program can simply
read or write blocks of data to the EEPROM. This allows an
arbitrary range of remote management software, from downloading
fonts to alarm settings (see Table 1)。
POWERMost people plug in a wall wart and forget about power. However,
this project requires a range of power sources, each with varying
requirements for efficiency and quality.
There are three separate regulators. The input is an unregulated 12
V DC from a wall wart. What most people don‘t realize is that
"unregulated" means"could be anything." In reality, the voltage
ranges from 17 V at no load to 12 V at its rated current. Mine can
provide up to 1 A, so it is normally providing about 15 V when the
clock is running. A Schottky diode prevents damage from incorrect
wiring, and a 220-μF capacitor guards against problems due to
contact glitches in the power jack. This raw voltage is used for
the amplifiers and feeding the other regulators.
The main power bus is the 3.3 V. Because this is a large voltage
drop and it is heavily used, a high-efficiency switching regulator
is used to produce it. L400/C402 and L402/C405 form lowpass filters
that help keep the high-frequency switching noise away from
the other circuits, and D401 guards against switching transients
leaking to the other regulators. D401 probably isn't needed,but
inductors can generate wild spikes in unusual circumstances, so I
kept it to satisfy my paranoia.
The 5-V supply for the DACs must be as ripple-free as possible, so
it is produced using a standard linear regulator with a large
output filter capacitor. The OLED needs a 12- to 15-V supply, so
there‘s an optional 12-V low-dropout regulator for when the input
voltage exceeds 15 V. It can be bypassed if the input voltage is
regulated to 12 V regardless of load.
Because the unregulated input can drop below 12 V when the
amplifiers are running, the carefully selected 12-V regulator has a
low drop-out voltage. In addition, it acts like a shunt if the
input voltage drops below 12 V. As a result, the display continues
to operate,although dimmer, rather than blinking off when the music
is loud.
SOFTWAREThe PIC24FJ64 handles many tasks,and it uses a main polling loop to
manage them. Each task has a poll function,which gets called
repeatedly from main()。 The main loop also calls the GUI each time
a button is pressed.
A modified Microchip TCP/IP stack checks for incoming packets and
timeouts, looking for requests to connect to the remote management
ports and manage the MP3 streams. The real-time clock module
manages the NTP requests and updates the time display and snooze
and sleep timers.
The ADC is configured to run in Auto-Poll mode. This means all
three channels are continuously sampled and one of two buffers is
filled with the results. The ADC task checks to see if a new buffer
is ready. If so, it reads the data and converts it into useful
ranges, including debouncing the button channel and smoothing the
photocell channel.
The MP3 task is a bit complicated,because it needs to keep track
not only of what it‘s doing, but also of what it's supposed to be
doing. First and foremost,if data can be moved from the PIC24FJ64‘s
RAM to the MP3 chip's buffer, it is. The task also checks for new
incoming connections on the MP3 port,processes incoming data for
currently open ports (which is stored in the PIC24FJ64‘s RAM
buffer), and checks for time outs. If MP3 data stops showing up but
the alarm is supposed to be on, the internal "beep" sound is used
instead.
The EEPROM task manages the remote EEPROM socket. When a remote
computer connects to the clock to update its settings, the EEPROM
task checks for data on that socket and acts on it, reading and
writing the EEPROM and sending the results back.
The alarm task is responsible for setting up connections to the
remote web servers to obtain MP3 data. This includes looking up IP
addresses and handling the HTTP protocol. The triggering of alarms
happens as part of the RTC task. At the start of each minute, the
alarm module is called to check for new alarms and update the
snooze timer. If a new alarm is triggered,the alarm task starts
setting up the TCP connection for it.
The volume task watches for significant changes in the volume
control setting (from the ADC task)。 If it changes, the main
display is changed to show a bar graph of the volume setting. If it
stops changing, the main display reverts. Because the muting can be
controlled via the GUI, this enables you to set the volume without
needing to have music playing.
As you can see, it's not about doing one complex task, but many
simple ones.
One of the unique features of the PIC24FJ64 is its ability to map
most of the pins to many of the internal peripherals. However, this
also means that you have to configure all of those mappings,as well
as all of the peripherals you‘re using. This is done in config.c.
To keep things straight, I configured the pins in numerical order.
The first time a peripheral was connected to a pin, I configured it
as well. This file also has the global configuration bits and sets
the internal clock. While there are three crystals in this project,
none of them run the PIC24FJ64 itself-it runs off its internal RC
oscillator and has a 32-kHz crystal for keeping track of the time
of day.
To help keep track of the pin mappings,the pins.h file has macros
for each function that map to the pins it's assigned to. When I
built the prototype,I assigned pins as I needed them. Later, when I
laid out the circuit board, I remapped all of the pins to keep the
layout clean. I just had to update config.c and pins.h.
Once the PIC24FJ64 is configured,the next step is to reset and
power up the remainder of the board. The GPIO assigned to reset is
pulsed. After a delay, the OLED‘s power is enabled. Next, each
module is initialized: the OLED, timer, TCP/IP stack, Ethernet
chip, MP3 decoder, and real-time clock.
TIMEOf course, the most important feature of an alarm clock is the
clock. I use the built-in real-time clock to keep the 32.768-kHz
oscillator)。 One of the configuration bytes in the EEPROM is the
calibration setting for the RTC, so you can adjust the "speed" of
the clock, if needed.
Rather than expect the user to set the clock each time power is
applied(or reapplied after a blackout), the clock uses SNTP to get
the current time. SNTP enables you to request the time with a
single UDP packet sent to your network‘s broadcast address. A
single reply packet gives you the time without having to configure
an NTP client or keep track of the state of the protocol. The clock
checks the time at 30 s past each minute, keeping it within 1 s of
the correct time.
The clock does not know about time zones. Another configuration
byte keeps track of the offset from SNTP's UTC zone, but you could
have your SNTP server update that byte as needed, without any user
interaction. Based on the SNTP time and time zone, the RTC module
is updated.
The RTC module interrupts the PIC24FJ64 once per second, sets a
flag,and decrements the sleep timer. The next time the RTC‘s task
runs, it checks the flag to see if the time needs updating. The
SNTP socket is always checked. The sleep timer and its display are
updated every second. If the minute also changes, the main display
is updated and the alarm module is called. In addition, if the
photocell value has changed, that forces a main display update.
This way, the clock can respond to ambient light changes
quickly,without wasting time to redraw the display when it's not
needed. Even though the PIC24FJ64 always runs at full speed, it‘s
important to leave as much processing power available as possible
for streaming the MP3 data.
ALARMS
Once a minute, the list of alarms is scanned to see if any of them
match the current time. Each alarm setting uses 7 bytes of the
EEPROM, for a maximum of about 7,000 alarms with my current EEPROM
load. The bytes are: hour (0-23, BCD encoded),minute, a weekday
mask, month(1-12), day (1-31), and the address of a web site
descriptor. The weekday mask has 1 bit set for each day of the week
for which the alarm is enabled. One extra bit as a global "enable"
bit,so you can disable the alarm without erasing it. If the month
byte is zero,the day-of-week mask is used to enable the alarm;
otherwise, the month and day are used and the weekday mask is
ignored. This way,you can have an alarm that goes off only on
weekdays, plus alarms that go off on specific days.
Each alarm indexes into a table of web sites, or "destinations."
Each entry includes a pointer into a string table for the MP3
stream's URL, and a second pointer for a descriptive string. The
GUI lets you choose from the list of destinations for each alarm,
but to change the list of URLs itself, you need to use the remote
management protocol.
GUI
The clock uses a simple GUI to manage the clock locally. This
includes setting the alarms (and silencing them!),using the snooze
and sleep features,and listening to music. Each time the ADC module
determines that a button has been pressed, the GUI is called to
handle that button.
The GUI uses a simple state machine to keep track of where it
is,without having to stop the main loop. I use a feature of GCC
where you can assign the address of a local label to a variable.
There‘s a GOTO(x) macro that stores the address of the given label
into a static variable and then returns. The next time the GUI is
called, it jumps to the given label to perform the next step. You
can also use a standard goto if you need to jump to a common setup
routine for a screen, which would use GOTO(x) to set up the next
state.
As each screen is set up, icons are drawn next to each button so
you know what they're used for. Some buttons have common meanings,
such as the upper-right button is always"off" or "cancel." Others,
such as the lower buttons, have different meanings for each screen,
so the icons are needed. Depending on the screen, the GUI can tell
the RTC module how (or if) the time (wall time or sleep time) is to
be displayed on the screen. This way, the GUI can decide where to
put it but let the RTC module maintain it.
When the ADC determines that no button has been pressed in a while,
it pretends you pressed "timeout." This gives the GUI an
opportunity to time out and reset back to the main display.
REMOTE PROTOCOLSThe alarm clock includes useful remote management features. There
are two TCP sockets that the clock listens on. The first is an MP3
socket. A remote computer can connect to this socket and send MP3
data that the clock will play. This lets you have"alarms," which
are determined by the remote computer, rather than triggered by the
clock itself. The remote stream can be terminated by the same
button that ends a local alarm.
The second socket allows for EEPROM access by the remote
machine(see Table 1)。 This lets you do everything from remote
reprogramming to checking the time zone and setting alarms. The
protocol is a simple read/write protocol. To read a range of EEPROM
addresses, send an "R" character followed by 2 bytes of address(LSB
first) and a 1-byte count (0 255)。
The clock responds by sending bytes back:
R addrL addrH count
....
To write to the EEPROM, send a W followed by the address and
count,followed by bytes. The clock sends back a NUL byte when it‘s
done:
W addrL addrH count
....
NUL
As long as the remote program knows the format of the EEPROM, this
lets it read or modify pretty much anything in the EEPROM.
CONSTRUCTION & PACKAGING
The schematics for this project were created using the gschem
program from the gEDA suite (S. Brorson, "Optical Proximity Sensor
for Robots Part 1: Simple PCB Design with the gEDA Suite," Circuit
Cellar 188, 2006)。 The board was designed using the pcb program(S.
Brorson, "Optical Proximity Sensor for Robots Part 2: Open-Source
PCB Layout Editor," Circuit Cellar 189, 2006)。
While the board is a four-layer board,there are a number of PCB
fabrication companies that offer affordable four-layer boards, such
as PCB-Pool, Advanced Circuits,and Sierra Proto Express, some of
which advertise in Circuit Cellar.
I chose to use a four-layer board for this project because I wanted
solid ground and power planes for reliability and simplicity. With
prototype fab prices dropping regularly, there‘s little excuse for
avoiding four-layer boards when the project calls for them. Having
a solid ground plane under the majority of the signals helps reduce
crosstalk and provide cleaner power to the chips. However, there
are some exceptions to this. There is no ground plane under the
switching power supply because you don't want the ground plane to
pick up the spikes from it. The three crystal circuits have no
ground plane either, both to avoid stray capacitance and to keep
noise on the ground plane from getting into the clock circuits.
The power plane is divided into the 3.3-V region and the raw
"15-V"region. The raw power region passes under each of the
regulators to provide full power to those, as well as to each
amplifier. The 3.3-V region passes under everything else, except of
course the crystals and switcher.
The traces used for the switcher are large and close together. This
reduces their inductance and the "loop area."The circuitry forms a
crude antenna,so reducing its area reduces the amount of noise it
transmits.
To prepare for debugging and potentially modifying the circuit, I
made sure that all of the vias were untented. This means that
they‘re not covered with solder resist, so they can be soldered to
later, and the hole size is just right for wire wrap wire. I also
laid out a number of bare grids on the back where SOIC and
0603-sized components can be soldered in case more parts needed to
be added later.
Contrary to popular belief, soldering SMT parts is not hard. Once
you get used to it, it's easier than through-hole because you don‘t
have to keep flipping the board over. My technique is to use a
stencil to apply solder paste to the right parts of the circuit
board,manually place all of the SMT parts,and use an electric
hotplate to reflow the solder. I got this idea off of the Internet,
but it's proven to be easy and reliable. If there are any solder
bridges,it‘s easy to use copper desoldering braid to remove them.
After all of the SMT parts on the top are soldered this way,the SMT
parts on the bottom can be added using solder paste as before, but
using your iron to reflow the paste. To do this, apply the iron to
the board and/or part and let the heat melt the paste under the
part. Lastly, the through-hole parts are added.
SMART COMBINATIONS
Complexity is what you get out of a project, not what you put into
it. Each hardware module connects to some other module via one of
the busses,and each software module performs its task. It's when
you put all of these together to perform coordinated tasks that it
appears to be doing something complex. This project is an example
of this. The MP3 decoder module is fairly simple, but when you
coordinate it with the TCP module, alarm module,and GUI, you get an
MP3 alarm clock. Each peripheral in the PIC24FJ64 is simple by
itself, but by combining them you get a complex set of
functionality in a simple package.
Having the ability to choose PIC24FJ64 peripherals and the pins
they‘re assigned to-combined with a new era in EDA tools and
services and software development tools-will enable you to create
interesting projects with little investment other than your own
time. I Editor's note: Additional schemtics,diagrams, and photos
for this project are available at www.circuitcellar.com/
microchip2007/winners/second.html.
DJ Delorie (dj@delorie.com) holds an E.C.E. degree from Clarkson
University. He has experience designing PC motherboards and network
management software. DJ now writes embedded development tools for
Red Hat. He is also the creator of DJGPP and a contributor to the
gEDA project. Visit his blog at www.delorie.com/electronics/
alarmclock.
PROJECT FILES
To download code and additional files,go to ftp://ftp.circuitcellar.com/pub/Circuit_Cellar/2008/216.
REFERENCE
[1] D. Mills, "RFC2030: Simple NetworkTime Protocol (SNTP) Version
,"ww.rfc.net/rfc2030.html.
RESOURCES
S. Brorson, "Optical Proximity Sensor for Robots Part 1: Simple PCB
Design with the gEDA Suite," Circuit Cellar 188, 2006.
---, "Optical Proximity Sensor for Robots Part 2: Open-Source PCB
Layout Editor," Circuit Cellar 189, 2006. gEDA Project,
www.geda.seul.org.
Microchip Technology, Inc., "ENC28J60 Data Sheet: Stand-Alone
Ethernet Controller
with SPI Interface," DS39662C,2008.
---, "MCP6001/1R/1U/2/4: 1 MHz,Low-Power Op Amp," DS21733G,2007.
---, "PIC24FJ64GA004 Family Data Sheet: 28/44-Pin General
Purpose,16-Bit Flash Microcontrollers,"DS39881C, 2008.
---, "24AA512/24LC512/24FC512:512K I2C CMOS Serial EEPROM,"
DS21754H, 2007.PJRC, "How To Use The STA013 MP3 Decoder Chip," www.pjrc.com/mp3/sta013.html.
SOURCES
ENC28J60 Ethernet chip,PIC24FJ64GA002 microcontroller, and 24LC512
EEPROMMicrochip Technology, Inc.
www.microchip.com
STA013 MP3 Decoder STMicroelectronics
www.st.com