My Thoughts On Arduino

Many have criticized Arduino for various reasons. Having used Arduino, most of these reasons I tend to disagree with, except the "quality" of many of the end users. Keep in mind that Arduino is designed to be an end user interface for easy hardware design and to get people interested in hardware. Let's have a look under the hood before I make any more user comments.

    Arduino is broken down into 4 main parts:
  1. Hardware Development Boards. They use very common and standard parts. The dev board is AVR specific and not really Arduino specific (besides the labelling). The dev board can be flashed with any AVR project designed for the MCU, not just Arduino stuff. The dev board requires no custom specific Arduino drivers, it just works with the AVR MCU. The official dev boards come with everything already set up and ready to go, just plug it in. The break out pins make prototyping very easy. The onboard voltage regulator makes external power simple. The USB-serial interface (on some Arduinos) allows for easy computer communication, flashing, and multiple boards to be connected to one computer (where traditional PC serial is 4 devices with only 2 active at once). There are easy plans for a USB-serial interface for boards without it. Most DIP based dev boards are socketed allowing for easy changing of the AVR's. The dev board is not really appropriate for permanent designs (it is a "dev" board, BTW), but that isn't a problem since the designs and schematics are open source. It's easy to build your own and permanently solder down parts. DIY is encouraged and there are dozens upon dozens of clone designs available on Internet. Since schematics are available, it's easy to add, remove, or change parts depending on design needs. The official Arduino dev boards even have solder pads for advanced mods. The dev boards (even the official Arduino ones) are cheap compared to other dev boards (even by Atmel). Even home built AVR's are trivial to customize for Arduino use since all that's needed is one of the flashing interfaces.
  2. Boot Loader. This is the custom software allowing easy flashing from the Arduino IDE over the serial connection. It can be easily removed or replaced by reflashing through the ICSP header. ICSP flashing can be done by a cheap parallel port cable or by another readily available AVR board. The ICSP header can also be used for boot loader upgrades or manual program installs (Arduino based or not for either). For finished, standalone applications, the ICSP header can be used to flash the final program into the AVR for faster loading time. Non-Arduino/DIY boards can be flashed just as easily as the official boards. No artifical limitations have been imposed.
  3. Interface Libraries. These can be used with or without the IDE, but are much easier with. There is some bloat here, but is usually much easier and less buggy than doing it all by hand. There are libraries for a number of complex tasks, and the list is constantly growing (various motor control, serial communication, liquid crystal, various sensors, protothreads). Some of the function commands can be bypassed with straight avr-gcc for faster execution by advanced users (some library functions are slower because of safety checks built in, be careful). The libraries are open sourced and can be easily changed and upgraded if needed. It isn't too hard to C++ extend these libraries with your own functions if needed. It isn't too hard to add your own libraries if you don't like the built in ones or need new functionality.
  4. Programming Interface/IDE. This is basically a front end for avr-gcc with some convenient extras. There is some bloat in avr-gcc, but that isn't the fault of Arduino. Since the IDE is written in java, there is no argument that it is slow and bloated. It was chosen to be universal, so there was an understandable trade off. Using C/C++ is far easier than assembler and BASIC. Doing: "long = (float/(int*double))/char+1;" by assembler is nuts. BASIC may be fine for brain dead loops, but hardly addresses the power available in most AVR's. Some would argue that the only true speed comes from assembler. While that may be accurate in some sense, long blocks of assembler are hard to read, difficult to update, and error prone. Using careful command selection in C/C++ will produce about the same code size as assembler and opens up many powerful functions that just aren't practical to do in assembler or BASIC.

When the Arduino setup is broken down and analyzed properly, there is little to find fault with. There are other commercial products both big and small that have far more issues than Arduino. This is what I base most of my support for Arduino on.

The "quality" of many end users. I'll try to make this as polite as possible. The users in question tend to be from hacker spaces and other "scene" places. They tend to be more show about what they can do with flashing blue LED's than any real projects. When they get a pointing blue LED mounted on a servo directionally controlled by a pot, they prominently declare themselves to be an "ub3r l33t h4rdw4r3 haxx0r". They have no desire to move on and study more useful projects. These people deserve the criticism they receive. I will not defend them.

Most of the rest of the Arduino users seem to have an IQ significantly above room temperature. With careful thought, design, and layout, a C/C++ program in an AVR can be incredibly powerful and do things other MCU's cannot even dream of.

Writing all this, a new obnoxious project keeps bouncing around in my head... Parts: Kip Kay AOL CD disco ball, reversable stepper motor to mount the disco ball, flashing white LED's for the disco ball, stereo light organ with red, yellow, green, and blue LED's (add UV and flourescent strips for a bigger "wow" factor?), an 8x8 LED matrix flashing stars and hearts, and a 16x2 LCD for song track readout. While very showy without much substance, a "discotheque" project like this might be useful for learning and acting on triggers from unknown variable timed events. It would also teach paralleled serial-to-parallel shift register matrix operations, LED and matrix driver circuits, op-amp based amplifiers and band pass filters, stepper motor speed control, computer serial interfacing, LCD readouts, intensity gain/trigger control using pots, and basic interleaved multi-tasking. Damn... even in my attempts to be a donkey's behind, I have a lot of useful education built into this that could be launched into other projects. I'm tempted to build it just to stomp on all the "ub3r l33t h4rdw4r3 haxx0rs"... but is being a king of fools really being a king at all???