Arduino Uno on a Breadboard (With USB Support)

by 8128 in Circuits > Arduino

1743 Views, 3 Favorites, 0 Comments

Arduino Uno on a Breadboard (With USB Support)

user.jpg
IMG_20210328_094335268_HDR.jpg

In this tutorial, we will build an Arduino Uno on a breadboard with USB support. Other people have done this before, but they used FTDI boards or other USB-to-UART boards, and a small part of me feels like this is cheating. This tutorial will use none of these boards, only IC chips, a handful of components, and a USB breakout. To do this, we will use the MCP2221A IC from microchip. This chip will act as a USB to UART bridge, enabling us to program the ATMEGA328P chip. Another bonus of using this chip is that most modern operating systems already have drivers installed for this chip, eliminating the need to struggle over installing drivers.

Supplies

For the barebones version (USB power only), you will need:

  • 1 - ATMEGA328P-PU chip
  • 1 - MCP2221A chip
  • 1 - 16 MHZ Crystal
  • 1 - USB breakout board (and a cable to go with it)
  • 5 - LEDs (various colors; I used 2 red ones, 1 green, 1 yellow, and 1 blue.)
  • 2 - 22pf ceramic capacitors
  • 2 - 0.1 - 1 uf ceramic capacitors (I used 0.1 uf)
  • 1 - 10k resistor
  • 5 - 2k resistor (these are for the LEDs, so they can be anywhere between 220 and 2k, but I like the LEDs dim)
  • 1 - Small pushbutton
  • Jumper wires
  • 1 - Arduino Uno (to program the bootloader onto the ATMEGA328 chip)

If you want to include a 2.1mm power jack for portability, you will also need:

  • 1 - 7805 Linear voltage regulator
  • 2 - 10 uf capacitors (These should be between 25 and 50 volts)
  • 1 - Breadboard friendly 2.1mm power jack

Prepare the Breadboard

IMG_20210328_103123359.jpg

In this step, we will prepare the breadboard.

  • Connect the two power rails
  • Place the ATMEGA328 chip onto the breadboard (about in the middle)
  • If the power rails on your breadboard are split, connect them

Burn the Bootloader

IMG_20210328_103713135.jpg
IMG_20210328_103800320.jpg
IMG_20210328_103557683.jpg

Most ATMEGA328 chips available today do not have the Arduino bootloader on them. (Pre-burned chips are available, but are often rather expensive.) We will need to burn a bootloader onto the chips, using an Arduino Uno. To do this, we will use a sketch from Adafruit. This sketch makes the Arduino do the programming, instead of using the Arduino to act as an intermediator between computer and chip. It is recommended that you read through the github page before continuing.

Hardware Connections:

Connect these pins on the Arduino to the pins on the chip (you can use this image for reference, as the pinout is the same)

  • 5V on Arduino to (+) power rail
  • GND on Arduino to (-) power rail
  • Pin 13 on Arduino to pin 19 on chip
  • Pin 12 on Arduino to pin 18 on chip
  • Pin 11 on Arduino to pin 17 on chip
  • Pin 10 on Arduino to pin 1 on chip
  • Pin 9 on Arduino to pin 9 on chip

For connections on the breadboard, connect:

  • 5V power rail to pin 7 on chip
  • GND power rail to pin 8 on chip
  • 5V power rail to pins 20 and 21 on chip
  • GND power rail to pin 22 on chip

It is also a good idea to add a visual cue for when the programming is complete, so add an LED from analog pin 0 to a 1k resistor going to ground.

Programming the Bootloader:

  • Download the sketch file
  • Extract the compressed folder, if necessary
  • Navigate through the folders until you find the sketch (it will end in ".ino")
  • Right-click on the sketch and choose "Open with Arduino IDE"
    • The other necessary files should load in the sketch under different tabs
  • Upload the sketch to the Arduino
  • At this point, the Arduino should be programming the chip. Wait until the LED shows that the programming is complete (this can take a while).

That's it! You can remove any jumper cables from the Arduino to the breadboard. We are done using the Arduino Uno.

Connections for the ATMEGA328

IMG_20210328_105207303.jpg
IMG_20210328_105353366.jpg
IMG_20210328_110159764.jpg

In the previous step, we made these connections:

  • 5V power rail to pins 7, 20, and 21 on the chip
  • GND power rail to pins 8 and 22 on the chip

Next, add the 16 mhz crystal and the reset button:

  • Connect the two legs of the crystal to pins 9 and 10 on the chip
  • Add two 22 pf ceramic capacitors
    • One going from GND to pin 9, the other from GND to pin 10
  • Place the pushbutton onto the breadboard, to the left of the ATMEGA328 chip
    • Place a jumper wire between pin 1 on the chip to the bottom-right pin on the pushbutton
    • Connect the 10k resistor to pin 1 on the chip to the 5V power rail (This will be a pull-up resistor to prevent the chip spontaneously resetting)
    • Place a jumper wire between the top-right pin on the pushbutton to the GND power rail

The last thing to do is to connect the integrated LED (On an Arduino Uno, this is tied to digital pin 13)

  • Connect a 2k resistor from pin 19 on the chip to a free row on the breadboard
  • Connect the LED between the 2k resistor and the GND power rail

Connections for the MCP2221A

IMG_20210328_112428435.jpg
IMG_20210328_113142035.jpg
IMG_20210328_113506384.jpg

Now we need to add connections for the MCP2221A USB-to-UART bridge and the USB-breakout board.

  • Place the MCP2221A chip to the left of the reset pushbutton
  • Connect the 5V power rail to pin 1 on the MCP2221A chip
  • Connect the GND power rail to pin 14 on the chip
  • Connect the 0.1 uf ceramic capacitor
    • One end should go to pin 11 on the chip, the other should go to the GND power rail
  • Place the USB breakout board to the left of the MCP2221A chip
  • Connect the 5V and GND on the breakout to their respective power rails
  • Connect the D- on the breakout to pin 12 on the chip
  • Connect the D+ on the breakout to pin 13 on the chip
  • If there is an "ID" pin, do not connect anything to it and leave it floating

Those are the basic connections, now let's add some LEDs!

  • First add the green LED. Connect the cathode (short end) to pin 8 on the chip, and a 2k resistor from the anode (long end) to the 5V power rail
  • Repeat above step using red LEDs and connecting to pins 2 and 3 on the chip
  • Add a basic power LED by connecting the cathode to GND, and the anode to a 2k resistor going to 5V

The only thing left now is to connect Tx and Rx for serial UART communication.

  • Connect a 1k resistor between pin 5 on the MCP2221A to pin 3 on the ATMEGA328
  • Connect a 1k resistor between pin 6 on the MCP2221A to pin 2 on the ATMEGA328

Add 2.1mm Barrel Jack and Power Regulation

IMG_20210328_124054300.jpg
IMG_20210328_124517532.jpg
IMG_20210328_124527410.jpg

Barrel jacks and plugs can vary, as well as the pinouts of linear regulators. For this reason, check any datasheets to find the pinout and configuration of your parts.

  • Plug the 2.1mm barrel jack and 7805 linear regulator into the breadboard
  • Connect the GND on the barrel jack to the GND rail
  • Connect the GND of the linear regulator to the GND rail
  • Connect the (+) of the barrel jack to the input of the linear regulator
  • Connect the output of the linear regulator to the 5V power rail

Almost done! The only thing left is to add some capacitors

  • Add a 10 uf capacitor between the unregulated current to ground (this is easiest to do right next to the linear regulator)
  • Add a 10 uf capacitor between the 5V and GND rails (+ on the capacitor goes to 5V)
  • Add a 0.1 uf capacitor between the 5V and GND rails

Review Connections and Connect to Computer

IMG_20210328_124332448.jpg
IMG_20210328_124418352.jpg
IMG_20210328_124439865.jpg

First, review all of your connections. Next, connect the device to your computer, using a USB cable and the breakout board. After a couple of seconds, the green LED (connected to pin 7 on the MCP2221A) will turn on. This means that it is connected as a USB device, and that your computer can 'see' it.

Upload a Program

  • Open the Arduino IDE
  • Open the "Blink" example sketch, or write your own:
void setup() {
//Configure pin 13 as an output, and start the serial communication
	pinMode(13, OUTPUT);
	Serial.begin(19200);
}
void loop() {
//Turn the LED on
	Serial.println("ON");
	digitalWrite(13, HIGH); 
	delay(2000);
//Turn the LED off
	Serial.println("OFF");
	digitalWrite(13, LOW);
	delay(2000);
}
  • Under the "Tools" tab, make sure that the Arduino Uno is selected as the board
  • Upload the sketch
  • Just as it starts uploading, mash the reset button on the breadboard
    • This takes some practice to get used to, and will take a couple of tries to get
    • It should upload with no issues
    • If you get an error: "not in sync", do not worry. You just mistimed your button press! Just try again.
  • This sketch is an adaptation of the basic Blink program. I used it to make sure that the Arduino could communicate with the serial monitor in the Arduino IDE.

Troubleshooting

IMG_20210328_124437580.jpg

My computer cannot find the USB device

  • Make sure that the cable you are using is a "data" cable, some USB cables are "charge-only"
  • If your breakout board has an "ID" pin, make sure this is not connected to anything
  • Make sure the D+ and D- cables are pretty similar in length
  • If none of these work, you may need to install a driver for your OS. This is extremely unlikely, as Windows, Mac, and Linux all have drivers for CDC devices

I can't upload sketches

  • Be sure to press the reset button before you start uploading. Not when the sketch is compiling, but before it uploads.
  • It can take some practice to get the timing right. Don't accept defeat until you have tried uploading at least a dozen times.
  • Make sure that the UART communication resistors are pretty similar in length.
  • Make sure that you have the right board and port selected under the "Tools" tab in the Arduino IDE

Every time I plug the board into my computer, my computer crashes

  • This means you have a short on your board. Inspect all of your connections. For me, I had the 2.1mm power jack wired up wrong. Luckily, I was only using a Raspberry Pi 3, so no harm done.

What Next?

  • I moved the connections between power rails to the other side of my board, so that I had a larger prototyping area
  • You could get a chip to step down the 5V to 3.3V so you have all the options found on an Arduino Uno.