Question

In: Computer Science

How do you set up a Raspberry Pi 3 Model B as a master in an...

How do you set up a Raspberry Pi 3 Model B as a master in an I2C protocol?
Please explain this process thoroughly, as well as the code you would use, if any

Solutions

Expert Solution

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.

Step 1: 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.

website link is here: http://www.raspberrypi.org/downloads

There is an easy setup, 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 [email protected] (check on your router to find the IP).

Step 2: 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

Step 3: Enable Kernel I2C Module

The next thing to do is add the I2C module to the kernel. Run the command sudo nano /etc/modules .You should see the following file:

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.

snd-bcm2835

This should have the line i2c-devadded to the end.

Final file:

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.

snd-bcm2835
i2c-dev

Step 4: Install Necessary Packages

There are a few packages that will need installing to use I2C. The first command to run is sudo apt-get install i2c-tools. If this fails, try running sudo apt-get update and try again, else run crying to your nearest nerd. The other package needed can be installed by running sudo apt-get install python-smbus.

To configure the software, we will add the Pi user to the I2C access group, by running the command sudo adduser pi i2c.
Now run sudo reboot to reboot, and test the new software.

To test the software, run the command i2cdetect -y 0 to see if there is anything connected. On my setup, it returned this output, because there was nothing connected:

0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Step 5: Example 1: CMPS03 Compass Module

We now have everything ready to start using I2C!

To use the CMPS03 compass module, connect the power to V+ and 0V, from the Pi. I used the 5V line, which they recommend not doing because it might damage your pi, It worked for me, and has caused now damage, but I am not responsible if your's fries.

Then, connect the SDA and SCL lines to the Pi SDA and SCL, and you are ready to roll. The wiring diagram is shown at http://www.robot-electronics.co.uk/htm/cmps3tech.htm.

When you have connected it, run the command "i2cdetect -y 0". In my case, this returned:

0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: 60 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

This shows that the module is on address 0x60. You then need the following python file:

import smbus
import time
bus = smbus.SMBus(0)
address = 0x60

def bearing255():
bear = bus.read_byte_data(address, 1)
return bear

def bearing3599():
bear1 = bus.read_byte_data(address, 2)
bear2 = bus.read_byte_data(address, 3)
bear = (bear1 << 8) + bear2
bear = bear/10.0
return bear

while True:
bearing = bearing3599() #this returns the value to 1 decimal place in degrees.
bear255 = bearing255() #this returns the value as a byte between 0 and 255.
print bearing
print bear255
time.sleep(1)

This program should be saved as anything, but add ".py" on the end. Then, run the command with sudo python whateveryoucalledit.p and you should get values written to your screen in a long list.

Step 6: SRF08 Range Sensor

The second example is the SRF08 range sensor, with built in light sensor.

Wire it in in exactly the same way as before, with power, SDA and SCL connected to the Pi. I found that this sensor would not work off 3.3V, but again, I bear no responsibility for you putting 5V through your Pi pins. You can even leave the compass module in as well, because I2C can handle multiple devices on one line. The wiring diagram can be seen here: http://www.robot-electronics.co.uk/htm/srf08tech.shtml .

Run i2cdetect -y 0

0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: 60 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: 70 -- -- -- -- -- -- --

Note that I have left the compass module connected.

You will then need the following python file. It is more complex, becuase you have to write a command to the sensor to get it to begin reading.

import smbus
import time
bus = smbus.SMBus(0)
address = 0x70

#SRF08 REQUIRES 5V

def write(value):
bus.write_byte_data(address, 0, value)
return -1

def lightlevel():
light = bus.read_byte_data(address, 1)
return light

def range():
range1 = bus.read_byte_data(address, 2)
range2 = bus.read_byte_data(address, 3)
range3 = (range1 << 8) + range2
return range3

while True:
write(0x51)
time.sleep(0.7)
lightlvl = lightlevel()
rng = range()
print lightlvl
print rng


This will print the light level on the built in light sensor and the current range, in cm.


Related Solutions

How do you do this? How do you set it up? One mole of a ideal...
How do you do this? How do you set it up? One mole of a ideal gas initially at temp To=0C undergoes an expansion at a constant pressure of 1atm to four times it original volume. (a) calculate the new temp Tf of the gas. (b) calulate the wok done by the gas during the expansion.
How do you set up a business or set of businesses that capture revenues related to...
How do you set up a business or set of businesses that capture revenues related to real estate?
How do you set up & determine the results of a dyhybrid cross?
How do you set up & determine the results of a dyhybrid cross?
GBP depreciates against USD for the next 3-6 months, how do you set up a trading...
GBP depreciates against USD for the next 3-6 months, how do you set up a trading strategy to take advantage of this knowledge? (please elaborate, very confused.)
3. Consider the Cournot Duopoly model. a. Set up the model in general form using qi...
3. Consider the Cournot Duopoly model. a. Set up the model in general form using qi , qj instead of q1 , q2 b. Solve for the equilibrium quantity that each firm would produce. (This means as a function of exogenous variables - so not just the reaction functions.) c. Solve for the comparative static - how does each firm’s quantity change for a change in their own marginal cost and how does it change for a change in the...
Writing a statically allocated linked list in ARM assembly (raspberry pi). Step 1: You will statically...
Writing a statically allocated linked list in ARM assembly (raspberry pi). Step 1: You will statically allocate some space for your link list elements. You need to make 5 elements, each elements should have two components, the next pointer first then the value stored. First initialize next pointer to NULL. The value stored at the address will be a string pointer. Step 2: You will then write a function that links the statically allocated linked list elements together. Step 3:...
What is a pilot cell? What purpose does it serve? How do you set up a...
What is a pilot cell? What purpose does it serve? How do you set up a pilot cell?
How do you compare the Capital asset pricing model to the 3 factors fama french model...
How do you compare the Capital asset pricing model to the 3 factors fama french model and 5 factor fama french model?
How do you compare the Capital asset pricing model to the 3 factors fama french model...
How do you compare the Capital asset pricing model to the 3 factors fama french model and 5 factor fama french model?
explain clearly 1) the set-up of the Job Search Model, 2) how it is possible in...
explain clearly 1) the set-up of the Job Search Model, 2) how it is possible in such a setting that firms make more profit than predicted in the perfectly competition model, and 3) how this model may explain the finding in wages paid to similarly productive workers differ across industries and firms is in line with the standard labour market model with perfect competition?
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT