Arduino Tips Tricks and Techniques
Arduino Tips Tricks and Techniques
Arduino Tips Tricks and Techniques
╷
4 │ @import "gist";
│ ^^^^^^
╵
app/assets/stylesheets/application.pdf.scss 4:9 root stylesheet
Arduino Tips, Tricks, and
Techniques
Created by lady ada
https://learn.adafruit.com/arduino-tips-tricks-and-techniques
Last updated on 2024-03-31 03:44:05 PM EDT
Table of Contents
Arduino UNO FAQ
• Arduino Timeline
• New USB Chip
• More 3.3v power!
• UNO R2 and R3
Arduino Libraries
Bootloader
Upgrade
• Introduction
• Replace the Chip
• Download an Arduino IDE with ATmega328 compatibility
3.3V Conversion
• Introduction
• Replace the Regulator
• Replacing the Fuse
Arduino Hacks
• Bumpers
• Free up some RAM
ArduinoISP
• Introduction
• Parts
• Assemble
• Load the Code
• Bonus! Using with AVRdude
Support 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 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 up the Reset button. The bootloader
takes up 2KB of space and runs at 19200 baud. Auto-resetting was also
added which makes life awesomer for everyone.
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.
The Uno has changed that by exchanging the FT232RL chip with an
atmega8u2 chip. There are a few things that are possible with this new chip
but before we discuss that lets make it clear that by default, this chip acts
identically to the FTDI chip that it replaces. It's just a USB-serial port!
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 and Esplora
The code for the 8u2 is based on LUFA, Dean Cameran's totally awesome
USB-AVR library that has great examples and documentation. Its also
completely open source.
Does the Uno use a resonator or a crystal for
the processor clock?
The FT232RL had an internal oscillator whereas the 8u2 does not. That
means there is a 16mhz crystal next to the 8u2 to allow it to keep up with
precise USB timing.
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.
So the Arduino is not as precise, timing-wise?
The short answer is: yes. The long answer is that most things that people are
doing with Arduino do not rely on 20ppm precision timing where 100ppm
would fail. For people who want long term precise timekeeping we suggest
going with a TCXO (temperature compensation crystal oscillator) - but you
would know if you needed that.
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 (https://adafru.it/aUM) 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 (https://adafru.it/aUN) 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?
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.
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
4. Shield compatibility - Every shield that works and plugs into the UNO
R1/R2 should be able to work fine with the R3
5. Driver - the driver is the same
6. Upload speed - same upload speed and technique
If you want to get up an Arduino R3 now, visit the adafruit store (http://
adafru.it/50) and pick up a board or pack!
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 (https://adafru.it/aYM)
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 (https://adafru.it/aV0): 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:
Using Libraries
One of the best features of the Arduino project is the ability to add on pre-
crafted libraries that add hardware support. There's tons of them, and you
can pick and choose which to install. They're only loaded in when the sketch
you're working on needs them, so for the most part you can download and
stash them for future use.
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:
What's in a library?
A library is a folder with some files in it, the files will end in .cpp (C++ code
file) and .h (C++ header file).
There may also be some .o files. The .o files are C++ compiled Objects. If
you end up working on the library and modifying it, be sure to delete the .o
files as that will force the Arduino IDE to recompile the modified .cpp's into
fresh .o's.
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.
It's important to remember!
The structure of the library folder is very important! The .c and .h files must
be in the 'lowest level' of folders. For example, you cant have Arduino/
libraries/WaveHC/WaveHC/file.c or Arduino/libraries/MyLibraries/
WaveHC/file.c - it must be Arduino/libraries/WaveHC/file.c
In v17 and up, the user libraries are now stored in the
ArduinoSketchDirectory/libraries folder. You may need to make the
libraries sub-folder the first time. However, the good thing about this is you
wont have to move & reinstall your libraries every time you upgrade the
software.
Bootloader
This is some advanced bootloader tweaks - 99% of Arduino users should not
mess with their bootloader! Only for the wild at heart!
This version has a few fixes: first it integrates the 'no-wait' and 'no-hang'
fixes below. It also fixes the annoying "missing signature bytes" bug that
freaks out avrdude when programming without the IDE. I also repaired the
EEPROM code so that now you can upload and download the EEPROM
memory as well as flash. Finally, theres a 'upload feedback' using the LED,
for arduino clones that don't have TX/RX leds.
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
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
if (! (ch & _BV(EXTRF))) // if its a not an external reset...
app_start(); // skip bootloader
You can also just grab the source code (https://adafru.it/cnE) and compiled
hex file here (https://adafru.it/cnF).
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 (https://
adafru.it/aVy).
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.
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
3.3V Conversion
Introduction
Arduino UNO's and many other Arduino boards run on 5 volts, which for a
long time was the 'standard' voltage for hobbyist electronics and
microcontrollers. But now the coolest new sensors, displays and chips are
3.3V and are not 5V compatible. For example, XBee radios, and SD cards
and acellerometers all run on 3.3V logic and power. If you tried to connect to
them with 5V you could damage the internals of the accessory.
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.
Replace the Regulator
The default regulator is a 5.0V type, but we want 3.3V out, so we'll need to
replace it. We'll use a 1117-3.3V (there are a few manufacturers of 1117
regulators, just like the 7805 is made by many factories) regulator in a
TO-252-3 package. It looks like this:
You can get these from any electronics component shop, for example here is
the digikey link (https://adafru.it/aLu).
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.
Clean up the tabs and remove any clipped parts still stuck on.
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.
Then do the two legs.
Replacing the Fuse
The next part is a little tricky, the USB jack gives us exactly 5V already, and
normally that is tied to the output of the voltage regulator (essentially, its
got a little circuitry that connects it when the DC jack is not powered).
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.
You can use any power diode, a 1N4001 is perfect (https://adafru.it/cuU) and
only a few pennies.
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.
That's it! You are now 3.3V powered. This is a little lower than the power/
frequency specification for the AVR chips since they ought to have about
3.6V to run 16Mhz but its probably not going to be an issue since AVRs can
be overclocked a little.
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 (https://adafru.it/
aVH) (in large quantities) or Adafruit (http://adafru.it/550)
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.
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 (https://adafru.it/aVI).
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 Arduino bootloaders) to
internal (such as the lilypad).
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 (https://adafru.it/Cc8)
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 (https://adafru.it/clC), just ignore them for now!
Assemble
First up, place the ZIF socket on the proto shield like so:
Solder all 28 pins for a solid connection!
Solder the following wires to the ZIF socket
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
On newer versions of the Arduino IDE, select Arduino as ISP from the
Tools→Programmer menu, then select Burn Bootloader from the Tools
menu.
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.
Support Forums
Support Forums (https://adafru.it/forums)