Псевдо устройства на i2c

blacksoul
Offline
Зарегистрирован: 01.03.2016

Добрый день.

Возникла  проблема с подключением i2c устройств. гугл, к сожалению, внятного ответа не дал.

имеется схема Raspberry Pi2, arduino mini pro, гироскоп MPU6050. все подключены между собой по i2c( по факту, закорочены SDA, SCL, GND этих трёх устройств, SDA к SDA, SCL к SCL ). Rpi является мастером, ардуина - слейв, MPU тоже слейв(по умолчанию)

при этом возникает 2 проблемы:

1) MPU отказывается инициализироваться, если RPi выключен(как только включаю, еще до загрузки оси MPU уже начинает работать)

2) после инициализации MPU  на шине забиваются все устройства(смотрю на RPi, т.к. Serial на ардуине не доступен).

если закоментировать mpu.initialize(), на шине 2 утройства (0х4 ардуина и 0х68 MPU). если раскоментировать, то уже через пару секунд будет забит весь пул устройств.

скетч абсолютно простой (под рукой нет, поэтому псевдокод =( )

на RPi запущена только ось. список устройств смотрю командой i2cdetect -y 1


#include <Wire.h>

#include <MPU6050.h>

MPU6050 mpu;

void setup()

{

Wire.begin(0x4);

Mpu.initialize();

}

void loop()

{}

 

Radjah
Offline
Зарегистрирован: 06.08.2014

> уже через пару секунд будет забит весь пул устройств.

Какой такой пул устройств?

blacksoul
Offline
Зарегистрирован: 01.03.2016

имеется ввиду,  после вызова на ардуине mpu.initialize()  "i2cdetect -y 1" на RPi показывает устройство на каждом из возможных адресов. т.е. не 2 устройства, как должно быть(0x4 и 0x68), а все.

 

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Ищи сопли в подключении и глюки в коде. Кто-то отчечает на любой адрес.

blacksoul
Offline
Зарегистрирован: 01.03.2016

из-за плохого контакта можеть быть подобное? в коде, вроде бы, негде косякам спрятаться...

собрано всё на макетке с перемычками, так что контакт может быть и плохой

так же замечено: после каждой перепрошивки датчик лучше ребутнуть по питанию. в этом случае всё ок и косяки появляются только при попытке добавить еще кода. например:

void loop()
{
  int16_t ax, ay, az;
  int16_t gx, gy, gz;
  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  delay(1000); //тут любое значение, на результат не влияет
}

тут уж даже ребут не спасает. всегда и сразу "забиты" все адреса.

Radjah
Offline
Зарегистрирован: 06.08.2014

Почитай про сам протокол i2c и его аппаратную реализацию. Без фильтров и подтягивающий резисторов, там уверенно Маяк можно ловить. :)

blacksoul
Offline
Зарегистрирован: 01.03.2016

Про i2c почитал первым делом. Но это мой первый проект, так что про Маяк пока еще не в курсе =)

резисторы, по идее, не нужны, хотя ведутся ожесточенные споры по поводу необходимости конвертора логических уровней между RPi и arduino. а вот к фильтрам надо присмотреться внимательней.

а нельзя ли как-нибудь сделать, чтоб RPi общался _только_ с ардуиной, а ардуина уже со всей переферией?

Radjah
Offline
Зарегистрирован: 06.08.2014

Я не про делители, а про подтяжку, чтобы на пине было четко LOW или четко HIGH.

blacksoul
Offline
Зарегистрирован: 01.03.2016

судя по всему, дело дествительно в подтяжке. как найду резисторы и попробую, отпишусь. Спасибо.

p.s. еще бы понять, почему не работает при выключенной малинке...

 

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

blacksoul пишет:

 

p.s. еще бы понять, почему не работает при выключенной малинке...

 

А как должно работать без малины , по-вашему? По каким признакам вы  поймете что работает?

blacksoul пишет:

Rpi является мастером, ардуина - слейв, MPU тоже слейв(по умолчанию)

blacksoul
Offline
Зарегистрирован: 01.03.2016

blacksoul пишет:

еще до загрузки оси MPU уже начинает работать

проверяю просто:

добавляю в setup строки

pinMode(13, OUTPUT);
digitalWrite(mpu.testConnection() ? HIGH : LOW);

на RPi еще никакого мастера нет. наверное я немного неправильно выразился. думаю, тут дело именно в питании на соответсвующие пины. а вот почему без этого не заводится MPU - мне не понятно.

Logik
Offline
Зарегистрирован: 05.08.2014

blacksoul пишет:
 а вот почему без этого не заводится MPU - мне не понятно.

А чего непонятного. Ведь

blacksoul пишет:
на RPi еще никакого мастера нет

никто MPU не инитил, вот он и не работает. Боюсь без мультимастера никак.

blacksoul
Offline
Зарегистрирован: 01.03.2016

Logik пишет:

никто MPU не инитил, вот он и не работает. Боюсь без мультимастера никак.

mpu.initialize() я вызываю

эх. видимо придётся разбираться с мультимастером. а то еще где-то пишут, что малина его хардварно не поддерживает.