Arduino Teaches Old Coder New Tricks

Because some of the components I was using do not exist in the
built-in library, I scoured the Internet for contributed symbols,
and in a few cases, I had to design my own symbols. A good source for
contributed symbols and footprints is http://gedasymbols.org. For creating your
own symbols, see David Weber's Online Symbol Creation Tool at
http://EmbeddedToolBox.com. Symbols actually are text files. Figure 3
illustrates a symbol along with a portion of the text file used to draw
it. Symbol files are not just an image. They also hold important pin
definitions and the name of the footprint file that the gEDA PCB program
ultimately will use to represent the component on the circuit board.

Figure 3. Symbol Example 1

A gEDA schematic is a text file interpreted for GUI presentation by gschem,
but it also serves as the source for gEDA's PCB program. An intermediary
helper program named gsch2pcb is used to prepare the schematic file
for use as input to the PCB program. While xgsch2pcb is a GUI version
of gsch2pcb for gsch2pcb, I use the gsch2pcb command-line version. For
example, given the schematic file vt100lcd84.sch as an input, gsch2pcb
creates vt100lcd84.pcb, vt100lcd84.net and vt100lcd84.cmd, all necessary
files for PCB creation. gsch2pcb also displays important instructions as
part of its command-line text output. To make the process a little easier,
I use a file named "project" in the project folder for the current
design. Figure 4 shows my project folder for the vt100lcd84
project, the "project" file and the command line with the gsch2pcb
command just before execution.

Figure 4. Example of gsch2pcb Project File

It is worth noting that the gEDA suite includes circuit simulation
capability (SPICE), enabling virtual design testing. I did not use SPICE
with my VT100-LCD project, but see the Resources for this article if
you are interested.

Software Design

Now that I had the circuitry designed for the project, it was time for
the software. I wrote the software as a simple state machine that parses
each character received on a character-by-character basis, meaning that
there is no buffer. Characters are handled differently based upon the
current state of the machine. If the state is NOTSPECIAL, the
character simply is passed to the LCD screen for display. However,
if the state is GOTESCAPE, GOTBRACKET or INNUM, the character is
processed further. For example, if the state is GOTBRACKET, both an
escape and left-bracket character have been received previously, and the
current character must be parsed in that context. For illustration, the
VT100 sequence for Screen-Clear is \033[2J, and if the current character
being parsed was the 2, the state would be GOTBRACKET, and the
next state would be INNUM (number collection).

This method of parsing has the advantage of simplicity, which is suitable
for the limited-capacity microcontrollers but with the disadvantage of not
being able to scroll the screen due to the absence of a buffer holding a
copy what is on the screen. See Resources for a copy of the software source.
I used Arduino libraries to build the code. Although the
source can be compiled using the Arduino IDE, I used Linux make. Using the
Arduino libraries makes the project extremely easy to build. Most of the
drudgery of low-level code and the bootloader is hidden away within the
Arduino libraries, which freed me to focus solely on my project. Even main()
is hidden away such that Arduino code contains two required routines:
setup() and loop(). Main actually does exist deep in the Arduino directory
structure in ~/arduino/arduino-1.0/hardware/arduino/cores/arduino/main.cpp
and is automatically linked in at compile time.

It didn't take very long to remove the mental cobwebs and get into the elegant simplicity of the Arduino Project. Years ago, when I built microprocessor projects, the underlying system code always was the problem. Before I actually could write my application, I had to develop or adapt systems-level code to interface the application-level code with the underlying hardware. Cleaners London