Подключение Raspberry Pi и Arduino с использованием I2C

09.07.2013 17:57

С Raspberry Pi и коммуникатором I2C мы можем соединить Pi с одним или несколькими платами Arduino. Raspberry Pi имеет только 8 GPIO, так что было бы очень полезно иметь дополнительные входы и выходы, объединив Raspberry Pi и Arduino. Есть много способов связать их, используя USB кабель или последовательное соединение. Почему мы решили использовать I2C? Одной из причин может быть не желание использовать вашу последовательность, USB на Pi. Учитывая тот факт, что есть только 2 USB порта, это, безусловно, большое преимущество. Во-вторых, гибкость. Вы можете легко подключить до 128 вспомогательных устройств с Pi. Также мы можем просто связать их напрямую без Logic Level Converter.

В этой статье я опишу, как настроить устройство и оригинальный Raspberry Pi и Arduino, как дополнительное устройство коммуникатора I2C. Article1 и Article2 если вы не знаете, что такое I2C.

Как это работает? Это безопасно?

Raspberry Pi работает на 3,3 вольт в то время как Arduino работает на 5 вольт. Сейчас мы предлагаем использовать уровень преобразователя для коммуникатора I2C. Этого не требуется, если Raspberry Pi работает как "мастер", а Arduino - как "дополнительное устройство".

Оно работает, потому что Arduino не имеет установленных внешних резисторов, но разъем P1 на Raspberry Pi имеет 1K8 резистора до 3,3 вольт. Данные передаются, проходя по линии 0v, для "высокого" логического сигнала. Для "низкого" логического сигнала, останавливается около уровня уровня напряжения питания.

Обратите внимание, что встроенные резисторы доступны только на I2C pins (Pins 3 (SDA) и 5 (SCL), т.е. GPIO0 и GPIO1 на Rev. 1 board, GPIO2 и GPIOP3 на Rev. 2 board:

На Arduino Uno, I2C штифты контактов A4 ( SDA ) и А5 ( SCL ), на Arduino Mega, они 20 (SDA), 21 (SCL)

Для получения информации о Arduino I2C Configuration и для других моделей Arduino, стоит ознакомится с этой документацией.

Настройка окружающей среды на Raspberry Pi для I2C Communication

Я кратко опишу процесс здесь, но если у вас есть сомнения, более подробно показан процесс здесь и здесь.

Удалить из I2C из черного списка:

$ cat /etc/modprobe.d/raspi-blacklist.conf
# blacklist spi and i2c by default (many users don't need them)
blacklist spi-bcm2708
#blacklist i2c-bcm2708

Загрузить i2c.dev в файле модуля

Добавьте это к окончанию /etc/modules

i2c-dev

Установить I2C Tools

$ sudo apt-get install i2c-tools

Разрешить Pi-пользователю получить доступ к I2C Devices

$ sudo adduser pi i2c

Теперь перезагрузите RPI. После этого вы должны увидеть устройства I2C:

pi@raspberrypi ~ $ ll /dev/i2c*
crw-rw---T 1 root i2c 89, 0 May 25 11:56 /dev/i2c-0
crw-rw---T 1 root i2c 89, 1 May 25 11:56 /dev/i2c-1

Теперь пройдем простой тест, просканируем I2C:

pi@raspberrypi ~ $ i2cdetect -y 1 
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

Подсказка: если вы используете первый пересмотр RPI board, используйте "-y 0" в качестве параметра. Адрес I2C изменился между двумя этими ревизиями.

Установка Python-SMBus

Тут обеспечивается поддержка I2C Python, документацию можно найти здесь. Также, доступна Quck2Wire.

sudo apt-get install python-smbus

Настройка Arduino как Slave Device для I2C

Загрузить этот эскиз на Arduino. Мы определяем адрес для ведомого (в данном случае 4) и функций обратного вызова для передачи данных и приема данных. Когда мы получим число, мы подтвердим, отправив его обратно. Если цифра, случается, '1 ', мы включаем LED.

Эта программа протестирована только с Arduino IDE 1.0.

1
#include <Wire.h>
2
 
3
#define SLAVE_ADDRESS 0x04
4
int number = 0;
5
int state = 0;
6
 
7
void setup() {
8
    pinMode(13, OUTPUT);
9
    Serial.begin(9600);         // start serial for output
10
    // initialize i2c as slave
11
    Wire.begin(SLAVE_ADDRESS);
12
 
13
    // define callbacks for i2c communication
14
    Wire.onReceive(receiveData);
15
    Wire.onRequest(sendData);
16
 
17
    Serial.println("Ready!");
18
}
19
 
20
void loop() {
21
    delay(100);
22
}
23
 
24
// callback for received data
25
void receiveData(int byteCount){
26
 
27
    while(Wire.available()) {
28
        number = Wire.read();
29
        Serial.print("data received: ");
30
        Serial.println(number);
31
 
32
        if (number == 1){
33
 
34
            if (state == 0){
35
                digitalWrite(13, HIGH); // set the LED on
36
                state = 1;
37
            }
38
            else{
39
                digitalWrite(13, LOW); // set the LED off
40
                state = 0;
41
            }
42
         }
43
     }
44
}
45
 
46
// callback for sending data
47
void sendData(){
48
    Wire.write(number);
49
}

Настройка Raspberry Pi как ведущего устройства

Поскольку мы имеем ведомого Arduino, нам теперь нужен I2C master.

Я написал эту программу тестирования в Python. Это то, что она делает: Raspberry Pi попросит вас ввести цифру и посылает ее на Arduino, Arduino признает полученные данные и отсылает их обратно.

В видео я использовал встроенный программный инструмент под названием "IDLE" в Raspberry Pi для компиляции.

1
import smbus
2
import time
3
# for RPI version 1, use "bus = smbus.SMBus(0)"
4
bus = smbus.SMBus(1)
5
 
6
# This is the address we setup in the Arduino Program
7
address = 0x04
8
 
9
def writeNumber(value):
10
    bus.write_byte(address, value)
11
    # bus.write_byte_data(address, 0, value)
12
    return -1
13
 
14
def readNumber():
15
    number = bus.read_byte(address)
16
    # number = bus.read_byte_data(address, 1)
17
    return number
18
 
19
while True:
20
    var = input("Enter 1 - 9: ")
21
    if not var:
22
        continue
23
 
24
    writeNumber(var)
25
    print "RPI: Hi Arduino, I sent you ", var
26
    # sleep one second
27
    time.sleep(1)
28
 
29
    number = readNumber()
30
    print "Arduino: Hey RPI, I received a digit ", number
31
    print

Для получения дополнительной функции чтения/записи, ознакомтесь с этой полезной справочной таблицей для функций.

Подключите ваш Arduino с Raspberry Pi

Наконец, мы должны подключить Raspberry Pi и Arduino на I2C. Соединить их легко:

RPI               Arduino (Uno/Duemillanove)
--------------------------------------------
GPIO 0 (SDA) <--> Pin 4 (SDA)
GPIO 1 (SCL) <--> Pin 5 (SCL)
Ground       <--> Ground

Чтобы убедиться, что это работает, запустите в терминале i2cdetect -y 1, вы должны получить что-то вроде этого. 04 - этот адрес мы определили в эскизе Arduino.

pi@raspberrypi ~ $ i2cdetect -y 1 
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- 04 -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --
 

Источник


mariannax
0 17058
    icon   icon   icon   icon   icon
Комментариев нет

Войдите чтобы оставить комментарий

Лучшие