Instructables
Picture of Raspberry Pi I2C (Python)
In this instructable, I will explain how to use I2C on the Pi, with the examples of the CMPS03 compass module and SRF08 Ultrasonic range, using python. I will explain right through installing the OS, to ensure that the dependencies and everything is installed.

I2C is a communication bus designed by Philips, for chips to communicate with each other on a PCB. It is commonly used, however, for connecting sensors, such as the two examples later in this instructable and port expanders, because you can have multiple devices on the same two pins. 
 
Remove these adsRemove these ads by Signing Up

Step 1: Install R-Pi Image

Picture of Install R-Pi Image
Go to the Raspberry Pi website, and download the latest Raspbian image and follow the instructions burn it to the SD card.

http://www.raspberrypi.org/downloads

There is an easy setup guide on the wiki, just follow it through.

When you have got it installed, run the config tool, and get everything going nicely. In my case, I am running it headless via SSH, which is enabled as default, at pi@192.168.0.X (check on your router to find the IP).

Step 2: Enable I2C

Picture of Enable I2C
On the Pi, I2C is disabled by default. The first thing to do, is run the command sudo nano /etc/modprobe.d/raspi-blacklist.conf . In this file, there is a comment, and two lines. Add a hash before the I2C line, to comment it out.

Original:

# blacklist spi and i2c by default (many users don't need them)

blacklist spi-bcm2708
blacklist i2c-bcm2708


Convert to this:

# blacklist spi and i2c by default (many users don't need them)

blacklist spi-bcm2708
#blacklist i2c-bcm2708
edrandall4 days ago

Where do I find the SDA and SCL lines on my Pi

laffoleyb16 days ago

There is a very simplai I2C level shifter that will save your port.

see for example http://playground.arduino.cc/Main/I2CBi-directionalLevelShifter, you will probably have the pull up resistors on the boards anyway so you probaly just need the two FETs.

pdfsman1 month ago

If I use another sensor for example IMU breakout-LSM9DSO, What is the change in the python file?

Gorgoth2 months ago

Great bit of info got my almost totally unrelated project working as you had all the important stuff

rkhedkar6 months ago

very easy explanation... I easily get confused with Rpi tutorials on web but this one is an exception....

thank you sir... @

AntMan232

sakko3037 months ago

as a lurker who is considering a pi for all sorts of nefarious purposes, I find this very helpful!

kkjensen1 year ago
What purpose does the write(0x51) provide? Is it just activating the module on the i2c bus so values can be read from it?
Nargun kkjensen7 months ago

0x51 is the write register to command data returned in centimeter vales. 0x50 commands values in inches and 0x52 commands values in microseconds (flight time.

See http://spaces.atmel.com/gf/download/frsrelease/228/1344/SRF08%20Ultra%20sonic%20range%20finder.pdf

For the 512mb of ram USE

i2cdetect -y 1

instead of the other.

Thank you! I've been trouble shooting for almost an hour and was about to give up when i saw your post. I thought I had killed my BMP180 while soldering it or that it was broke for some other reason. =)

moshtaghioun10 months ago

TNX for the great instruction but 1 question

i didn't understand if the 5V i2c device has damaged your device or not ,

trollies1 year ago
When you do:

bear2 = bus.read_byte_data(address, 3)
bear = (bear1 << 8) + bear2
bear = bear/10.0
return bear....
why do you divide by 10? I am assuming you have a signed 15 bit number and you are getting rid of the last 0? Why not use >> 1?

john12212 years ago
I could only run i2cdetect with the command "sudo i2cdetect -y 0"
Otherwise it would not run..
dgateley2 years ago
Hey, AntMan. Should you be so inclined, a similar article on how to get i2s (much different than i2c functionally) working on Raspberry Pi would be enormously appreciated. I'd like to attach a Wolfson audio codec but getting up to the configuration point where I could basically do that and begin talking to it is daunting to say the least.
vynylpooh2 years ago
Thank You!
dcastor2 years ago
To make this 'bile better, you might explain in step 1 what I2C is for.
AntMan232 (author)  dcastor2 years ago
Ah, whoops, thanks!
chrimel2 years ago
Would the external GPS cable for a generic Android tablet or an old XM radio possibly work? I have a couple of those that I might be able to part with if they could be made to work.
As a supplement, I have a similar write-up that I buried perhaps a little too deep on the eLinux wiki:

http://elinux.org/RPi_Tutorial_EGHS:Communicating_With_Other_Micro-controllers

Includes: the official (probably overkill) way of interfacing 3.3V and 5V I2C applications, software for a few languages, and kernel considerations.

Range sensor sounds fun, I'll give that a try!
1-big-dog2 years ago
Thanks for a very straight forward step by step explanation!
sparten112 years ago
all we need now is gps and radar. and viola we are ai nav.. kewl. let me know when you get GPS up and running..

AntMan232 (author)  sparten112 years ago
If you give me a GPS module, I will gladly oblige. :D If only I had the money...
syseng2 years ago
Thanks for sharing this,it means i could use my temperature sensors
AntMan232 (author) 2 years ago
Thanks guys, it's nice to be able to help! It geniunely took me about a week to realise that the Adafruit code was overkill, and that it only took one line to read over i2c...
antares722 years ago
Nice and clean examples! You have a new follower.
randofo2 years ago
Thanks for sharing this. This will surely come in handy.