SvenskaEnglish

Gyro, accellerometer and compass in arduino

IMU stands for inertial measurement unit and is short a device that detects direction, speed and gravitational forces. They are, for example in mobile phones to rotate the screen depending how you hold it. They can be purchased from Sparkfun or if you are frugal by ebay. They usually consist of chip combination ITG3205 (gyro), ADXL345 (accellerometer) and HMC5883L (compass). Using each chip individually is not as useful as the combination. A video shows it better (however with another IMU):

There are relatively poor documentation of how to get started with IMU on Arduino and that is why I am publishing a simple example.

Read more ›

The second step to a self-balancing robot

I now have enough parts to start to assemble the robot.

I had to drill out the holes slightly to get them to fit M3.

The accelerometer is as close as possible to the motor shaft.

To tighten all the nuts use a screwdriver, a piece of tape and then rotate the threaded rod. Hold the nut with your fingers and let the tool do the work. Otherwise, it takes a while to get it into all 24 nuts.

Here's how it looks right now:

Tagged with:

Surface mounted Arduino Uno with TQFP32 adapter

I wanted to try to solder surface mount and bought an adapter from TQFP32 to regular dip to put in the breadboard.

Obtain Adaptor from TQFP32 to dip. The chip is in this case a Atmega328P-AUR.

Remember that it is easier to solder with flux:

Here's how it looks when all legs and headers are in place:

Mount on breadboard and burn the Arduino bootloader:

Done. Atmega328P-AUR on a breadboard with the Arduino Uno bootloader:

Improved hardware to steer Roomba

I improved the recent hardware to remotely control my vacuum cleaner over the internet. Previously, I used an entire Arduino Uno card which is overkill. Better and nicer is to do it directly on a breadboard. Video when it works (with some other hardware).

1. Connect Atmega328 on breadboard to obtain an Arduino Uno.

2. Pull wires from each button on the remote.

3. Connect a bunch of transistors. One for each button you want to remotely control. Remember, combine ground on breadboard and remote. I sat there, too few LED to more easily see what command was sent.

4. Tape the wires so that they stay in place.

5. Tape the breadboard on the remote. This makes it more intact and reduces the risk of loose cables.

6. Connect to the computer and configure eventghost to control the Roomba.

Tagged with: , ,

The first step to a self-balancing robot

This evening I made cad and ordered the parts to make my own self-balancing robot. I will use Arduino microprocessor and a small 6 degrees of freedom as tilt-sensor.

The cad in the pictures is not entirely done but I think most parts are in their proper place.

I will update with new blog posts when progress is made.

[Update 2012-06-12] Bolted connections in place

Added the bolts to the engine mount, wheels and the rails. Updated pictures:

  

Tagged with:

Standalone Arduino with an Atmega328

Putting together your own Arduino on a lab plate is a quite easy task. I am here publishing some illustrations explaining how to put it all together. You can buy a Arduino kit from mät.se to get everything you need.

The simplest configuration, which requires a FTDI-cable:

If you want to be able to power the circuit from a battery, then just add a few components. Available for purchase here.

Instead of a ftdi cable you can use a USB module like this. Link to the USB module.

Stickers to Atmega328P-PU, Atmega328P-PN

To quickly see what ports are the. Print the sheet below:
Stickers Arduino Atmega328

Components can be found here:

You can also buy ATMEGA with the Arduino bootloader and sticker:

To do this yourself, just cut and paste on:

Tagged with: ,

Burn Arduino bootloader to Atmega328-PU

I bought a bunch of new Atmega328-PU. Since there are two variants of this chip namely Atmega328p-pu and Atmega328-pu. P after 328 means “pico-power” meaning it uses less power. When trying to burn a bootloader on a non pico-power chip, you get error message about invalid signatures:

Expected signature for ATMEGA328P is 1E 95 0F Double check chip, or use -F to override this

Fastest way to solve this is to add non-pico-power as an Arduino-type. Go to the folder where the Arduino IDE is installed. Open the file / hardware / tools / avr / etc / avrdude.conf. Add to this:

#------------------------------------------------------------
# ATmega328
#------------------------------------------------------------

part
    id			= "m328";
    desc		= "ATMEGA328";
    has_debugwire	= yes;
    flash_instr		= 0xB6, 0x01, 0x11;
    eeprom_instr	= 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,
			  0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,
			  0x99, 0xF9, 0xBB, 0xAF;
    stk500_devcode = 0x86;
    # avr910_devcode = 0x;
    signature		= 0x1e 0x95 0x14;
    pagel		= 0xd7;
    bs2			= 0xc2;
    chip_erase_delay	= 9000;
    pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1",
		 "x x x x x x x x x x x x x x x x";

    chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x",
"x x x x x x x x x x x x x x x x"uot;;

    timeout	= 200;
    stabdelay = 100;
    cmdexedelay = 25;
    synchloops	= 32;
    switching delay = 0;
    pollindex = 3;
    pollvalue = 0x53;
    predelay = 1;
    postdelay	= 1;
    pollmethod = 1;

    pp_controlstack =
	0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3e, 0x2F, 0x3F,
	0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
	0x66, 0x76, 0x67, 0x77, 0x6A,xBE7A, 0x6B, 0x7B,x010xBE, 0XFD, 0x00, 0x0x000x00, 0x00, 0x00, 0x00;
    hventerstabdelay = 100;
    progmodedelay = 0;
    latchcycles		= 5;
    togglevtg		= 1;
    poweroffdelay	= 15;
    resetdelayms	= 1;
    resetdelayus = 0;
    hvleavestabdelay	= 15;
    resetdelay = 15;
    chiperasepulsewidth	= 0;
    chiperasepolltimeout = 10;
    programfusepulsewidth = 0;
    programfusepolltimeout = 5;
    programlockpulsewidth = 0;
    programs cover polling timeout = 5;

    memory "eeprom"
	paged		= no;
	page_size	= 4;
	size		= 1024;
	min_write_delay = 3600;
	max_write_delay = 3600;
	readback_p1	= 0xff;
	readback_p2	= 0xff;
	read = " 1 0 1 0 0 0 0 0",
	       " 0 0 0 x x x a9 a8",
	       " a7 a6 a5 a4 a3 a2 a1 a0",
	       " o o o o o o o o";

	write = " 1 1 0 0 0 0 0 0",
	      	" 0 0 0 x x x a9 a8",
		" a7 a6 a5 a4 a3 a2 a1 a0",
		" i i i i i i i i";

	loadpage_lo = " 1 1 0 0 0 0 0 1",
		      " 0 0 0 0 0 0 0 0",
		      " 0 0 0 0 0 0 a1 a0",
		      " i i i i i i i i";

	writepage = " 1 1 0 0 0 0 1 0",
		    " 0 0 x x x x a9 a8",
		    " a7 a6 a5 a4 a3 a2 0 0",
		    " x x x x x x x x";

	mode		= 0x41;
	delay		= 20;
	blocksize	= 4;
	readsize	= 256;
    ;

    memory "flash"
	size		== yes;
	spage_size	=8;
	page_size	= 128;
	num_pages = 256;
	min_write_delay = 4500;
	max_write_readback_p1	= 0xffadbareadback_p2	= 0xffadback_p2	= 0xff;
	read_lo = " 0 0 1 0 0 0 0 0",
		  " 0 0 a13 a12 a11 a10 a9 a8",
		  " a7 a6 a5 a4 a3 a2 a1 a0",
		  " o o o o o o o o";

	read_hi = " 0 0 1 0 1 0 0 0",
		  " 0 0 a13 a12 a11 a10 a9 a8",
a7 a6 a5 a4 a3 a2 a1 a0" a1 a0",
		  " o o o o o o o oloadpage_lo =oadpage_lo = " 0 1 0 0 0 0 0 0",
		      " 0 0 0 x x x x x",
		      " x x a5 a4 a3 a2 a1 a0",
		      " i i i i i i i i";

	loadpage_hi = " 0 1 0 0 1 0 0 0",
		      " 0 0 0 x x x x x",
		      " x x a5 a4 a3 a2 a1 a0",
i i i i i i i i" i i i i iwritepage =	writepage = " 0 1 0 0 1 1 0 0",
		    " a13 a12 a11 a10 a9 a8"uot;,
		    " a7 a6 x x x x x x"x x x x x x x x" x x xmode		= 0x41

	delay		=0x41;
blocksize	=6;
	bloreadsize	=28;
	readsize	= 256;

    ;

    memory "lfuse"
	size = 1;
	min_write_delay = 4500;
	max_write_delay = 4500;
	read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0",
	       "x x x x x x x x o o o o o o o o";

	write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0",
	      	"x x x x x x x x i i i i i i i i";
    ;

    memory "hfuse"
	size = 1;
	min_write_delay = 4500;
	max_write_delay = 4500;
	read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0",
	   "X x x x x x x x the the the the the the"uot;;

	write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0",
	   "x x x x x x x x i i i i i i i i"uot;;
    ;

    memory "efuse"
	size = 1;
	min_write_delay = 4500;
	max_write_delay = 4500;
	read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0",
	       "X x x x x x x x x x x x x";

	write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0",
	      	"x x x x x x x x x x x x xmin_write_delay =
    ;
max_write_delay =;quot;lock"
	size "	min_write_delay = 4500;
	max_write_delay = 4500;
	read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0",
	       "X x x x x x x x x x twrite = "1rite = "1 0 1 0 1 1 0 0 1 1 1 x x x x x",
	      	"x x x x x x x x 1 1 i i i i i i";
    ;

    memory "calibration"
	size = 1;
	read = &qo o o o o o o o " 0 0 x x x x x",
	       "0 0 0 0 0 0 0read = o o o o o ox x x x x"size = memory "signature"
	size = 3;
	read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x",
	       "X x x x x x a1 a0 the the the the the the the";
    ;
;

Find then file / hardware / arduino / boards.txt and add:

##############################################################

uno328.name = Arduino w / ATmega328 (Non-P)
uno328.upload.protocol=arduino
uno328.upload.maximum_size=32256
uno328.upload.speed=115200
uno328.bootloader.low_fuses=0xff
uno328.bootloader.high_fuses=0xde
uno328.bootloader.extended_fuses=0x05
uno328.bootloader.path=optiboot
uno328.bootloader.file=optiboot_atmega328.hex
uno328.bootloader.unlock_bits=0x3F
uno328.bootloader.lock_bits=0x0F
uno328.build.mcu=atmega328
uno328.build.f_cpu=16000000L
uno328.build.core=arduino
uno328.build.variant=standard

Thereafter it should look like this from Arduinos IDE:

 

Components can be found here:

You can also buy ATMEGA with the Arduino bootloader and sticker:
Tagged with: , , ,

Made my own bootloader ISP to Arduino

Since I do not have my own programmers to burn bootloaders to ATMEGA chip, I chose to make my own. Here it is:

I'm using a DIP socket and can easily program a bunch of chips one by one if I want to. Just snap out one and put in the next.

One advantage of having a dedicated programmer to Arduino is that you do not need to run wires from an official Uno whenever you want bootload a new ATMEGA.

Arduinos website also has some guides that describe this in more detail: http://arduino.cc/en/Tutorial/ArduinoISP

 

Components can be found here:

You can also buy ATMEGA with the Arduino bootloader and sticker:
Tagged with: , , ,

Remote control Roomba from a web site using Arduino

Who has not wanted to vacuum when being away from home? The technique I use is a hack to take apart the remote control of the robot and connect it to an Arduino UNO. To control the Arduino from PC via USB, I use Messengerand let Eventghost handle all communications with Serial port-plugin.

Video:

How to

1. Unscrew the remote control. Solder the wires to the buttons you want to control.
roomba_hacking_arduino_2

2. Grounded switch means pressed key. I combined ground on the Arduino and ground in the remote control. Between the output ports on the Arduino and the buttons I put transistors. A 1: (5 V) out from Arduino will put the transistor in the on position. The transistor then closes the connection between the combined ground and the button. The remote control will perceive ground on a button and be fooled into thinking that there is a button pressed. [Update 2012-06-14] Wrote a improved guide for hardware.
roomba_hacking_arduino_1

3. Load the code. Everything is from Messenger to Arduino. I'll post a copy here .The program I run is very simple. The serial port write what port you want to put such a high “w d 9 1″ for write digital port 9 on.

4. Configure Event Ghost. Add serial port plugin. I will not go through this in detail but the pictures below should explain enough:
serial_out_roomba_arduino
serial_out_roomba
serial_out_roomba_2

5. This post does not explain anything about web server and gui since I made a post about that earlier.

 

Tagged with: , ,