Arduino Tips Tricks and Techniques
Arduino Tips Tricks and Techniques
https://learn.adafruit.com/arduino-tips-tricks-and-techniques
Arduino Libraries 14
• Need Help Installing a Library?
• What is a library?
• Using Libraries
• What's in a library?
• It's important to remember!
• How to install libraries
Bootloader 18
• Bootloader for the Atmega328
• "No-Wait" Bootloader
• No-Hang Bootloader
• Upload Sketches with AVRDUDE
Upgrade 22
• Introduction
• Replace the Chip
• Download an Arduino IDE with ATmega328 compatibility
3.3V Conversion 24
• Introduction
• Replace the Regulator
• Replacing the Fuse
Arduino Hacks 29
• Bumpers
• Free up some RAM
ArduinoISP 30
• Introduction
• Parts
• Assemble
• Load the Code
• Bonus! Using with AVRdude
Support Forums 35
NB this is just our opinion and interpretation of some of the decisions made by
Arduino. We aren't associated with Arduino, and don't speak for them! If you have to
get an Official Response to your Arduino question please contact them directly. Thx!
NB2 Still in progress, we're collecting common questions to answer. If you have more
questions, please post them in our forums ().
Arduino Timeline
But first…some history! First there was the serial Arduino (what's the name of it?) with
RS232 which was not used outside of the Arduino team & friends.
The first popularly manufactured Arduino was called the NG (New Generation, like
Star Trek, yknow?) The NG used the Atmega8 chip running at 16 MHz and an FT232
chip for the USB interface. The bootloader takes up 2KB of space and runs at 19200
baud.
The next version was the Diecimila. The Diecimila updated the chip from the Atmega8
to the Atmega168. The great thing here is double the space and memory (16K instead
of 8K). It still ran at 16MHz. The Diecimila also added two extra header pins for 3.3V
(from the FTDI chip) and the reset pin which can be handy when a shield is covering
In 2009, the Duemilanove was released. This one also upgraded the chip again, to
the Atmega328. Yet another doubling of space and memory! Another upgrade is now
the power is automagically switched between USB and DC-jack which removed the
previous jumper. This makes it easier and faster to move from programming to
standalone and got rid of some confusion. The bootloader takes up 2KB of space and
runs at 57600 baud.
In 2010, we have the Uno! The Uno still uses the 328P chip and the power switcher. It
has a smaller bootloader called OptiBoot (more space for users' projects) that runs at
115K. So even though the chip is the same, you get another 1.5K of extra flash space
that was previously used by the bootloader. The FTDI chip has also been replaced
with a atmega8u2 which allows for different kinds of USB interfaces. Finally, there's an
extra 3.3V regulator (LP2985) for a better 3.3V supply. whew!
The good news about the FT232RL has royalty-free drivers and pretty much just
works. The bad news is that it can -only- act as a USB/Serial port. It can't act like a
keyboard, mouse, disk drive, MIDI device, etc.
One improvement in updating the chip is that, previously, Mac users needed to install
FTDI drivers. The 8u2 imitates a 'generic' CDC serial device. So now, Mac users do
not have to install a driver. Windows users still need to install the .INF file but luckily
there are no drivers. This means there will be fewer problems with new versions of
windows. There is no way to have a serial USB device that doesn't require an INF file
in windows, sadly :(
The big thing that is nice about the 8u2 is that advanced users can turn it into a
different kind of USB device. For example it can act like a keyboard or mouse. Or a
disk driver. Or a MIDI interface, etc. Right now there are no examples of how to do
this, but we hope to post some shortly.
And, finally, going with the 8u2 reduced the price of the board which made up for
some of the other extras.
Right now there are a few Arduino's with a 32u4 chip such as the Leonardo, Micro
On the other hand, the Atmega328p chip that is the core processor in the Arduino
now has a 16mhz ceramic resonator. Ceramic resonators are slightly less precise
than crystals but we have been assured that this one was specified and works
quite well.
A new Bootloader?
There's a new bootloader. It works just like the old one - being an STK500-protocol
compatible but its a quarter of the size! Down from 2K, the new bootloader is a tiny
512b. This gives you more space for your project code! Yay! It's also faster - 115K
instead of 57.6k so you'll be uploading code in 3 seconds.
The Bad News is that you must make sure to select Uno in the Boards menu!!! If
you don't things will be confusing because the bootloader speed is wrong, and you
won't get that extra 1.5K!
Overall, its a good direction, and the chips can be used in older Arduinos just fine
(so you can upgrade your Diecimila or Duemilanove to the Uno by simply replacing
the chip).
For more detailed information about the bootloader, such as source code, please
visit the Optiboot () project page.
If you want to make your own Arduino-compatible board, you have a few choices:
1. Don't use an 8u2, go with an FTDI chip instead that comes with a VID
2. If you're planning to make more than one board for your personal use, you
will have to purchase a VID from USB IF () for a one time $2000 fee
3. If you're making a single board for your own experimentation, you can pick a
VID/PID that doesn't interfere with any devices on your computer and
substitute those in
4. You can purchase licenses for single VID/PID pairs from companies that
develop USB devices (we dont have any specific links at the moment)
However, you can't use the Arduino VID when distributing your own Arduino-
compatibles! If the cost of a VID is too much for you, simply go with an FTDI chip,
K?
Did the Arduino team move from the FTDI chip to the '8u2
to screw over derivative-makers?
While the appearance of a hard-to-get chip coupled with the VID/PID mishegas
may seem to be a little annoying, we don't think that means that the Arduino team
is being malicious or attempting to make life difficult for people who make
derivatives. The move to an '8u2 makes the Arduino more powerful, and easy to
use as there are fewer drivers to install. While there is a shortage now, there will
eventually be plenty of chips on the market.
Some people in the Arduino forum have thought of forming a group that would
purchase a VID for Arduinites to use in personal projects. This is a pretty good idea
and its probably the best way to avoid VID/PID conflicts. Between 65,536 projects,
that comes to under a nickel per PID.
And of course, because they didn't get rid of the bootloader system, you can
always just use an FTDI chip.
One sad thing about older boards is that they had a 3.3v power supply but it was
really just whatever the FTDI chip's internal 3.3v regulator could give. You -could- get
50mA out of it, maybe. But high power stuff like XBees, SD cards, some fast ADC or
DACs could easily drag down the FTDI chip and reset the USB connection. The Uno
solves this problem by adding a new 3.3V regulator the LP2985 which can easily
provide 150mA.
The LP2985 is a very high quality regulator, and will work great for powering stuff and
as a nice solid 1% analog reference.
UNO R2 and R3
During fall of 2011, the Arduino team revealed that there will be a new minor revision
of the classic Arduino, the "UNO R3" (revision 3). A lot of people have asked us about
the R3 so here is everything we know so far.
1. The UNO R3 is not available to resellers until December 1st or so. Really!
Nobody has them until then!
2. The UNO R3 is backwards compatible with the UNO - same driver, same
uploading, same look
There are a few changes in the UNO, here is what they are:
1. The USB controller chip has moved from an atmega8u2 (8K flash) to an
atmega16u2 (16K flash). This does not mean that you have more flash or RAM for
your sketches this upgrade is for the USB interface chip only. In theory this will
mean that it will be easier to have low level USB interfaces such as MIDI/
Joystick/Keyboard available. However these are only theoretical at this time,
there is no example code or firmware which will actually do this.
2. There are three more breakout pins on the PCB, next to the AREF pin there is
are two I2C pins (SDA/SCL) - this is a duplication of the Analog 4 and 5 pins.
There is not an extra I2C interface or anything, its just that they made a copy of
those pins there for future shields since the I2C pins are in a different place on
Mega. There is also an IOREF pin which is next to the Reset pin - this is to let
shields know what the running I/O pin voltage is on the board (for the UNO, its
5V). Again, this is a duplication of the power pin, it does not add voltage level
shifting to the UNO.
3. The RESET button has moved to be next to the USB connector, this makes it
easier to press when a shield is on top.
1. Processor size and speed - its the same ATMega328P running at 16MHz that
we've had since the Duemilanove. Your code will not run faster or better on the
R3
2. Same number of pins - no extra pins are added EVEN THOUGH THERE ARE
MORE BREAKOUTS (see above!)
3. Board size and shape - same size as before
Arduino Libraries
Need Help Installing a Library?
Check out our super-detailed tutorial for all operating systems here:
http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use ()
What is a library?
Libraries are great places, and not yet illegal in the United States! If you ever need to
learn how to do something, like say fix a motorcycle, you can go to your local library
and take out a book. Sure you could buy the book but the library is nice because as a
resource you can get the book whenever you need it, keeping your house
uncluttered.
Software Libraries are very similar. We already studied what a procedure is, in lesson
3 (): a procedure is a list of things to do. A library is a big collection of procedures,
where all the procedures are related! If you, say, want to control a motor, you may
want to find a Motor Control Library: a collection of procedures that have already
been written for you that you can use without having to do the dirty work of learning
the nuances of motors.
For example, this is the Serial Library, which allows the Arduino to send data back to
the computer:
Sketches will often depend on libraries, you can see what they are by looking at the
top of the sketch. If you see something like:
#include <FatReader.h>
That means that you'll need a library called FatReader or a library that contains the file
FatReader. If you dont have it installed you'll get an error:
Two optional files you may see are keywords.txt (this is a hints file to tell the Arduino
IDE how to colorize your sketch and examples folder, which may have some handy
test-sketches. These will show up under the File→Examples→Library dropdown.
For example, here is how it looks when NewSoftSerial is installed in Windows (of
course your username will be different).
Bootloader
This is some advanced bootloader tweaks - 99% of Arduino users should not
mess with their bootloader! Only for the wild at heart!
Please note that the fuses are different for this chip because of the extended memory!
"No-Wait" Bootloader
Here's a bootloader hack that will automatically start the sketch after it has been
uploaded and will also only start the bootloader when the reset button is pressed (so
when you plug in power it will go straight to the sketch).
ch = MCUSR;
MCUSR = 0;
// Check if the WDT was used to reset, in which case we dont bootload and skip
straight to the code. woot.
if (! (ch & _BV(EXTRF))) // if its a not an external reset...
app_start(); // skip bootloader
ch = MCUSR;
MCUSR = 0;
// Check if the WDT was used to reset, in which case we dont bootload and skip
straight to the code. woot.
if (! (ch & _BV(EXTRF))) // if its a not an external reset...
app_start(); // skip bootloader
You can also just grab the source code () and compiled hex file here ().
No-Hang Bootloader
If you are using a Diecimila with auto-reset you may be frustrated when your
communications program accidentally triggers the bootloader. Here is a quick hack to
make the bootloader quit if it doesn't receive a '0' character first (which would
indicate the Arduino software is trying to talk to it.
uint8_t firstchar = 0;
And paste:
Copy:
Paste:
} else if (firstchar == 0) {
// the first character we got is not '0', lets bail!
// autoreset via watchdog (sneaky!)
WDTCSR = _BV(WDE);
while (1); // 16 ms
}
You can also just replace the last two lines with app_start()
Just plug in the USB cable, then press the reset just before you start avrdude. If you
need an avrdude tutorial, check out this page ().
Updating and replacing your Arduino is easy and painless and costs only a few
dollars. Your sketches will work just as before but with a little more breathing room.
In order to perform this upgrade you will have to either purchase a preprogrammed
chip () or program it yourself with a AVR programmer () or by 'bitbanging' it.
Finally, replace the old chip, lining up all the pins and making sure that the notch in
the chip matches the notch in the socket!
If you purchased a chip from Adafruit that shipped before Feb 5, 2009 the chip will
have the baudrate set at 19200 (same as the older Arduinos). After Feb 5 the upgrade
chips were changed to 57600 baud rate (3 times faster!) in order to be compatible
with new Arduinos. If you have a 19200 baud rate chip you will have difficulty
uploading. Simply quit the Arduino application and edit the file in the hardware folder
named boards.txt and change the line from:
atmega328.upload.speed=57600
to:
atmega328.upload.speed=19200
We use chips like the CD4050 to do level conversion () but if you are using a lot of
3.3V devices, maybe you're just better off upgrading the entire Arduino to run from
3.3V!
To do that, we will replace the regulator so that the DC barrel jack goes to a 3.3v type
regulator, not a 5V. And then reconfigure the 5V usb power line so it goes through the
regulator as well.
To start, we'll need to remove the old regulator. The easiest way to do that is to first
clip the two legs.
Then you'll need to heat the tab up to get it liquid so you can lift off the old part.
Although it may seem counter intuitive, its best to add some solder to the tab, melt it
on with your iron, this will improve the heat conduction since the tab is so large.
Now line up the new 3.3V regulator, and solder the tab first, use plenty of solder and
be patient, the tab acts like a heat sink.
The easiest way to make the USB 5V also go through the regulator is to remove the
fuse and solder a diode from the USB output to the regulator input.
The trade off is now there is no 500 mA fuse for the USB jack. The good news is that
computers will have their own fuses on the USB connector (inside the computer) so its
not likely you will destroy your PC. But be aware that you're losing a little safety.
Heat the fuse with your soldering iron, again adding solder may help thermal
conductivity. Since the fuse is very conductive you can probably just heat one side for
a while and both ends will melt.
Clip the diode short and bend the leads over. Solder the side without a stripe (anode)
to the old fuse pad, nearest the board edge. Solder the striped end (cathode) to the
right hand leg of the regulator.
The Arduino will still automatically select whichever power plug is giving you more
power.
Arduino Hacks
Bumpers
Having the conductive traces touch your table is not so great, you can protect your
Arduino by adding bumpers to the bottom.
You can buy these from McMaster Carr part no. 95495K66 () (in large quantities) or Ad
afruit (http://adafru.it/550)
Open up hardware/cores/arduino (or cores/arduino) directory, and edit the file named
wiring_serial.c or HardwareSerial.cpp
Near the top is a #define RX_BUFFER_SIZE 128, which means 128 bytes are used for
the buffer. You can change this to 32 (or even 16!). If you have almost no serial input,
make it as low as you'd like as long as its > 0.
You can also save another 2 bytes by changing rx_buffer_head and rx_buffer_tail
from int to uint8_t
ArduinoISP
Introduction
A lot of people start learning about microcontrollers with an Arduino but then want to
build their own projects without having to sacrifice their dev board. Or maybe they
want to make their own Arduino variant, that is compatible with the IDE. Either way, a
common problem is how to burn the bootloader onto the fresh AVR chip. Since AVRs
come blank, they need to be set up to be Arduino IDE compatible but to do that you
need an AVR programmer (like the USBtinyISP).
The good news is that you can burn bootloader using your existing Arduino with only
a little bit of work. There's even a minitutorial on the arduino.cc site ().
This tutorial is an extention of that tutorial. First we'll show how you can make a
permanent bootloader-burner by soldering a 28-pin ZIF socket (http://adafru.it/382) to
a proto shield (http://adafru.it/51)and use the PWM output line of the Arduino to
generate a clock. This will let you 'rescue' many chips that have been set to the
wrong type of oscillator, or change ones that are set from external oscillator (most
Parts
You will need…
• An Arduino (http://adafru.it/50)
• A proto shield kit (http://adafru.it/51)
• 28-pin ZIF (zero-insertion force) socket (http://adafru.it/382) (you can use a plain
socket but ZIF is ideal)
• Some wire (http://adafru.it/289)
• Blank ATmega328P ()
If you bought the kit from Adafruit, you'll have an extra few items such as a Piezo
beeper, LEDs, buttons, etc. that you can use for the Standalone version of this project
(), just ignore them for now!
Assemble
First up, place the ZIF socket on the proto shield like so:
• Pin 1 to digital 10 - Blue Don't forget to bend the wire over underneath to
connect to the ZIF socket pin when soldering!!!
• Pin 7 to 5V - Red
• Pin 8 to Ground - Black
• Pin 9 to digital 9 - Gray
• Pin 17 to digital 11 - Brown
• Pin 18 to digital 12 - Orange
• Pin 19 to digital 13 - Yellow
• Pin 20 to +5V - Red
• Pin 22 to Ground - Black
Finally, you'll need to solder on the header to allow the shield to be placed on, break
the 0.1" male header and place it into the Arduino sockets. Then place the shield
above on top to solder it in place.
Time to load the sketch! Grab the code from our Github repository and paste it into a
new sketch (). Then upload it to the Arduino.
We have a report that this procedure does not work with Arduino 1.5.2. Use the
latest mainstream Arduino release instead!
Plug the shield on top, lift the latch, pop in the chip and then lower the latch. Make
sure the chip orientation is like so (so with the lever on the left side you can read the
text):
With the USB cable still plugged in (and the same Serial port selected as before)
Select Tools→Burn Bootloader→w/Arduino as ISP
The Green LED will be on during the programming, when its done you'll see this
message and the LED will turn off.
Thats it! Don't forget, you can burn a few different kinds of bootloaders, such as Uno,
Duemilanove, Lilypad so depending on your situation you may want to use one over
the other.
Instead of atmega328 you can also program atmega8 atmega88 atmega48 atmega16
8, etc.
Support Forums
Support Forums ()