1

Тема: canny7 и устройства I2c с разными адресами

Здравствуйте
В описании контроллера canny7 значится, что количество интерфейсов I2c - до 5.

Пробую реализовать работу кэнни7 и гироскопа на MPU6050. (Кстати, может есть решение или готовый драйвер?)

Задача следующая - получать от гироскопа данные по i2c шине и выводить на экран 1602. На втором этапе - контролировать порог изменения полученных данных и обрабатывать в диаграмме.

Пока по первому этапу возник вопрос:
Если я правильно понял, то провода SDA SCL - общие для всех устройств и задаются один раз при конфигурировании, а все устройства подключаются параллельно?

Экран и датчик имеют разные адреса, как их заставить работать на одной шине? По времени переключать адреса и длину посылок, к примеру, коммутатором?

Если так - то почему ограничение в 5 устройств i2c для кэнни7 и только одно для нано? - ведь можно опрос и смену адреса делать сколько угодно раз?

Если для питания гироскопа используется 3.3 вольта - нужны ли резисторы поддяжки SDA SDL?

Спасибо.
Как всегда, рассчитываю на вашу помощь

2

Re: canny7 и устройства I2c с разными адресами

Количество интерфейсов и количество подключенных устройств - не одно и то же.

Номера каналов SDA/SDL CANNY 7 можно переназначать в процессе работы диаграммы сколько угодно раз. У CANNY 5 nano - нельзя.

При работе нескольких I2C slave-устройств на одной линии, у них должны быть аппартно установлены разные адреса, см.документацию к устройствам. При обращении к конкретному I2C slave-устройству мастер должен указать в запросе его адрес, см.документацию к устройству и документацию драйвера I2C.

Интерфейсы устройств с разными уровнями (напряжениями) сигнала при подключении друг к другу должны быть электрически сограсованы.

3 (30-06-2017 12:55:36 отредактировано alex_engine)

Re: canny7 и устройства I2c с разными адресами

Адреса разные.
У экрана 0х40, у гироскопа 0х68.

GY-521

This sensor board has a voltage regulator. When using 3.3V to the VCC the resulting voltage (after the onboard voltage regulator) might be too low for a good working I2C bus. It is preferred to apply 5V to the VCC pin of the sensor board. The board has pull-up resistors on the I2C-bus.


Подключил параллельно экрану и питание 5в и линии передачи. Экран работает, стало быть с передачей I2c все ок?

Вот диаграмма
http://i.piccy.info/i9/8580c775b48ac3248e81f335a2bd6c68/1498807963/90504/1149612/canny_800.jpghttp://i.piccy.info/a3/2017-06-30-07-32/i9-11333548/800x337-r/i.gif

По задумке - вручную меняя адрес I2c устройства, опросить гироскоп и вывести на экран данные.

void loop() {
   /* Update all the values */
   uint8_t* data = i2cRead(0x3B,14);   
   accX = ((data[0] << 8) | data[1]);
   accY = ((data[2] << 8) | data[3]);
   accZ = ((data[4] << 8) | data[5]);   
   tempRaw = ((data[6] << 8) | data[7]);   
   gyroX = ((data[8] << 8) | data[9]);
   gyroY = ((data[10] << 8) | data[11]);
   gyroZ = ((data[12] << 8) | data[13]);

вот кусочек программы для ардуино.
Если я правильно понял - от гироскопа можно получить строку данных длинной 14, в которой есть все основные данные.
Адрес самого устройства - 68. 

при нажатии кнопки - красный светодиод светит, строка на экране отображается кракозябрами.

С помощью поиска нашлось много описаний для ардуино. Я далек от программирования, посему могу только догадки строить. Поправьте, если что не так

void setup(){
  Wire.begin();
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  Serial.begin(9600);
}


В регистр 6В надо записать 0, чтобы вывести из сна 6050?
И после этого можно получать данные?

oid loop(){
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU_addr,14,true);  // request a total of 14 registers
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)   
  AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp=Wire.read()<<8|Wire.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
  Serial.print("AcX = "); Serial.print(AcX);
  Serial.print(" | AcY = "); Serial.print(AcY);
  Serial.print(" | AcZ = "); Serial.print(AcZ);
  Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53);  //equation for temperature in degrees C from datasheet
  Serial.print(" | GyX = "); Serial.print(GyX);
  Serial.print(" | GyY = "); Serial.print(GyY);
  Serial.print(" | GyZ = "); Serial.println(GyZ);
  delay(333);
}


И вот снова запрос от регистров. Адрес регистра для опроса как реализовать?
Спасибо

UPD:
http://i.piccy.info/i9/70f7faac25257d5b95ec99850435db88/1498816222/69875/1149612/canny_800.jpghttp://i.piccy.info/a3/2017-06-30-09-50/i9-11333956/800x397-r/i.gif

Вот из даташита. Потихоньку проясняется.

Для получения данных надо сначала послать в нужные регистры нужные посылки (выйти из сна, калибровки)
А потом опросить нужные данные по нужным регистрам?

Прошу подсказки, как в устройство с адресом 0х68 отправить-получить в нужный регистр данные?

Вложений в сообщении

Иконка вложения MPU-6000-Register-Map1.pdf 899.87 кб, скачивался 371 раз, последний раз 2017-06-30 

4

Re: canny7 и устройства I2c с разными адресами

Установка адреса опрашиваемого I2C-slave устройства в соответствующий регистр драйвера I2C CANNY 7 обсуждалась с вами здесь: http://forum.canny.ru/viewtopic.php?pid=5644#p5644

Для адреса 0х68 в регистр должно быть записано значение (0х68 << 1) = 0xD0

Пример отправки/получения данных содержится в документации драйвера I2C: http://wiki.canny.ru/index.php?title=CA … 1.80.D1.8B

Прошу подсказки, как в устройство с адресом 0х68 отправить-получить в нужный регистр данные?

Для ответа требуется изучать документацию MPU6050, но могу предположить что для:

uint8_t* data = i2cRead(0x3B,14);

При условии, что адрес устройства 0х68:

Записать в регистр адреса I2C = 0xD0
Записать в регистр длины передаваемого сообщения I2C = 1
Записать в регистр передаваемого сообщения I2C D1:D0 = 0x003B
Записать в регистр длины принимаемого сообщения I2C = 14

Дать одиночный импульс в Регистр начала передачи I2C.

По появлению 1 в Регистре наличия принятых данных I2C, получить данные из Регистров принятых данных I2C.

5

Re: canny7 и устройства I2c с разными адресами

Cпасибо. Поправил адрес, сделал по алгоритму, как вы подсказали - светодиод "есть данные" активизируется.
Пробую заставить полученные данные отобразить на экране. И вот тут неудача - поскольку экран и гироскоп на одной шине висят,надо как-то организовать очередь отправки-посылки данных, а с этим проблема.
Пробовал просто генератором переключать - не работает.
http://i.piccy.info/i9/9d3797b3c1b7083534ac552eb5b55edc/1499085430/79040/1149612/canny_800.jpghttp://i.piccy.info/a3/2017-07-03-12-37/i9-11342192/800x304-r/i.gif
Вот вариант, где (по задумке) кнопкой переключаются настройки схемы, получаем данные, и после отпускания кнопки - отображаем. Не работает.
Если я правильно понимаю, нужно как-то "вклиниться" в счетчик диаграммы, отвечающей за экран?

Если без экрана диаграмма, то одиночным импульсом "начало передачи" - получается опросить гироскоп. Но если есть экран - "начало передачи" всегда единица, и управлять передачей не получается.

Прошу подсказки, как выйти из ситуации. Как правильно организовать логику переключения параметров схемы?
Благодарю

6

Re: canny7 и устройства I2c с разными адресами

Вывод на экран так и не победил.
Решил зайти с другой стороны
http://i.piccy.info/i9/991f9c9b3608fa01a6d6586d97b0f61a/1499851980/96913/1149612/canny_800.jpghttp://i.piccy.info/a3/2017-07-12-09-33/i9-11369775/800x475-r/i.gif
Зеленый светодиод моргает, если активизация по каналу 10 и светит постоянно, если единицу принудительно подать.
Стало быть данные от гироскопа есть?
Дальше хочу просто обработать полученное. Если после преобразования к десятичному виду, значение меньше 100 - один диод светится, если больше - другой.
По факту, все выходные диоды не активны. Для меня загадка, как так может быть? Ведь значение какое бы не получили, оно или больше ста или меньше?
Или я где-то принципиально не так диаграмму сделал?
Буду очень признателен за подсказки.
Спасибо

7

Re: canny7 и устройства I2c с разными адресами

alex_engine пишет:

...Или я где-то принципиально не так диаграмму сделал?

Да, принципиальная ошибка. Для работы с числами, их значения ни к какому особому виду приводить не надо. Использовать конвертер числа в строку для сравнения с числовыми значениям - ошибка, т.к. в результате получаются не цифры разрядов числа, а коды символов ASCII. Следует работать напрямую со значением, полученным по i2c. Блок конвертера числа в строку также используется не правильно. Принцип работы с ним описано в wiki.

8 (12-07-2017 16:57:59 отредактировано alex_engine)

Re: canny7 и устройства I2c с разными адресами

Благодарю. Ошибки увидел.
Но, насколько я понял, получаю данные в HEX формате, а для математики нужно в DEC.
В который раз тупой вопрос задам - как преобразовать с одной системы исчисления в другую?
Число в строку по основанию 16, а потом строку в число по основанию 10 - так сработает?
Спасибо


Как я могу отобразить данные? Мне много не надо, получить значения, задать порог изменения и событие по превышению порога.

9

Re: canny7 и устройства I2c с разными адресами

Как и было указано в предыдущем сообщении, в процессе работы контроллер получает число, величина которого не зависит от способа ее отображения (представления). Формат отображения (HEX или DEC, и т.п) не влияет на значение числа, т.е. 0x0A (HEX) = 10 (DEC) - это одно и то же число и с ним (в любом формате отображения) можно выполнять математические, логические и др. действия без каких-либо дополнительных преобразований.
Другое дело - строка. Строковые значения не равны значениям отображаемых цифр, а равны ASCII-кодам символов, которыми это число записывается. Перевод в строку мог потребоваться для отображения данных на LCD-экране или в терминале ПК, где отображаются именно символы.

alex_engine пишет:

...Как я могу отобразить данные? Мне много не надо, получить значения, задать порог изменения и событие по превышению порога...

Выделить из данных, полученных по i2c нужную часть (см. datasheet): в полученных 14 байтах есть 7 значений по 2 байта (16-битные значения в диапазоне от 0 до 65535 (dec)), которые, возможно, хорошо укладываются в наши регистры приема.
Похоже, что именованная сеть "data1" - это значение ускорения "accX", только его старший байт стоит на месте байта D0. Нужно поменять байты местами с помощью блока "циклический сдвиг" на 8 (влево или вправо - не важно) и  полученное значение сравнивать с заданным порогом (логические блоки "Больше", "Меньше", и т.п.).

10 (17-07-2017 14:41:38 отредактировано alex_engine)

Re: canny7 и устройства I2c с разными адресами

Здравствуйте
Очередная попытка пока без результатов.
Решил попробовать так: кэнни7 принимает по i2c данные от гироскопа и отправляет по кан шине на нано, который принимает и отображает на экране 1602.
Вот прием i2c и передача в кан:
http://i.piccy.info/i9/a0de1c93af51b553da70ffb4921151c1/1500280104/108987/1149612/canny7_800.jpghttp://i.piccy.info/a3/2017-07-17-08-28/i9-11384019/800x422-r/i.gif
Если подставить константы в регистры установки кан - все работает. Что написал, то получил на экране нано.
Вот нано:
http://i.piccy.info/i9/e9771d88c636a58acae4001d08af7230/1500280603/114422/1149612/nano_800.jpghttp://i.piccy.info/a3/2017-07-17-08-36/i9-11384039/800x412-r/i.gif
Диоды моргают, константы, отправленные от кэнни 7 принимает.

Но как только вместо констант пробую получить живые данные от гироскопа (на картинке выше) - на экране нули. Обмен идет, все светодиоды статусов моргают. Но данных нет.
Пробовал вставлять между блоком принятых сообщений i2c и блоком буфера передачи кан сдвиг на 8 бит в обе стороны - все равно нули.
http://i.piccy.info/i9/38ee3eccf40270f4c29323132179b440/1500281505/111381/1149612/rlr.jpghttp://i.piccy.info/a3/2017-07-17-08-51/i9-11384102/653x319-r/i.gif
Без вашей помощи, как всегда, не могу осилить - где ошибся?
Буду благодарен за подсказку.
В примерах для ардуино есть такой текст
  Wire.begin();
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  Serial.begin(9600);
Если я верно понял, надо послать в 6В ноль для выхода из режима ожидания, а уже потом пытаться получить данные?
Спасибо

UPD

Для адреса 0х68 в регистр должно быть записано значение (0х68 << 1) = 0xD0

этот сдвиг только для адреса устройства надо делать? для доступа ко внутренним регистрам нет? 3В - так и остается для запроса координат?

11

Re: canny7 и устройства I2c с разными адресами

Я понимаю, что мои вопросы давно вышли за рамки поддержки кэнни, но все же прошу подсказки.
http://i.piccy.info/i9/2c71273004746cac26b01fa1a50f8f5b/1500299649/68499/1149612/111_800.jpghttp://i.piccy.info/a3/2017-07-17-13-54/i9-11385070/800x341-r/i.gif

Адрес устройства 68. После смещения получаем 0D.
Дальше работаем с регистрами.
Есть только для чтения, есть чтение-запись. Вот тут я принципиально не могу понять.
Адрес регистра 6В - так и оставляем, или тоже сдвигаем?
Какая логика опроса - записи конкретной позиции в регистре 6В?
Если мне надо считать бит 6? Или записать бит7?

При условии, что адрес устройства 0х68:
Записать в регистр адреса I2C = 0xD0
Записать в регистр длины передаваемого сообщения I2C = 1
Записать в регистр передаваемого сообщения I2C D1:D0 = 0x003B
Записать в регистр длины принимаемого сообщения I2C = 14
Дать одиночный импульс в Регистр начала передачи I2C.


Исходя из этого - адрес регистра задается посылкой в первые два бита? Но ведь там тоже, согласно таблице, могуть быть данные для чтения - приема.
Например, как послать единицу в 6С на позицию D0, если для выбора этого адреса мне нужно туда отправить 0х006С?

Спасибо

12

Re: canny7 и устройства I2c с разными адресами

Сдвиг влево на 1 бит нужен только для адреса самого модуля MCU6050. Адреса регистров модуля задаются как указано в инструкции.
В примерах для Ардуино и других контроллеров (http://forum.easyelectronics.ru/viewtopic.php?p=375396) действительно присутствует первичная настройка (инициализация) модуля MCU6050. В ней действительно в адрес экономии энергии (0х6В) записывается значение 0 - т.е. модуль выводится из состояния сна. Однако прямых указаний в инструкциях на модуль на это нет.
Очевидно MCU6050, после подачи питания, находится в состоянии сна и на запросы контроллера отправляет именно значения "0", т.к. в режиме сна внутренние регистры и регистры последовательного интерфейса работают.

13

Re: canny7 и устройства I2c с разными адресами

alex_engine пишет:

Я понимаю, что мои вопросы давно вышли за рамки поддержки кэнни...

Вопрос не в этом. Для того чтобы дать ответ требуется время для его поиска. Иногда мы изучаем проблему одновременно с нашими пользователями и готовых ответов у нас нет.

alex_engine пишет:

...Адрес устройства 68. После смещения получаем 0D.
Дальше работаем с регистрами....

Все правильно.

alex_engine пишет:

...Исходя из этого - адрес регистра задается посылкой в первые два бита? Но ведь там тоже, согласно таблице, могуть быть данные для чтения - приема.
Например, как послать единицу в 6С на позицию D0, если для выбора этого адреса мне нужно туда отправить 0х006С?

1м байтом контроллер отправляет адрес регистра. Гироскоп устанавливает в этот адрес свой, назовем так, "фокус". Далее все определяется значениями регистров передачи и приема I2C и их сочетанием (см. wiki).
Если в регистре длины передачи I2C - 1, то будет передан только адрес регистра гироскопа. Если в регистре длины приема I2C - 14, то следом, начиная с позиции этого регистра, гироскоп передаст контроллеру 14 байт данных, т.е. значения этого и 13 последующих регистров.

14

Re: canny7 и устройства I2c с разными адресами

Благодарю за ответ

Вот, получается нужно установить в ноль бит 6 в регистре 6В.

http://i.piccy.info/i9/018403d7f8fd153997cc1796ab284bd3/1500359422/260582/1149612/111_800.jpg
По нажатию кнопки 10, устанавливается длинна передачи i2c -8, адрес регистра (D1;D0) - 6В.
Регистр передачи i2c (D7;D6) в двоичном виде 10.  Это запишет в бит7 единицу а в бит 6 ноль? Или как-то иначе надо задать значения записи в пределах регистра?
При отпускании кнопки 10, длинна передачи - 1, адрес 3В. Кнопкой 8 запускается опрос.
Получится так?
Спасибо

15

Re: canny7 и устройства I2c с разными адресами

Драйвер i2c выполняет отправку и прием данных целыми байтами (!!!). Установка длины передачи 8 приведет к передаче 8 байт данных начиная с указанного регистра, т.е. будут затираться и последующие регистры.
Для установки в регистр 0x6B гироскопа значения 0 нужно отправить сообщение содержания D1:D0=0x006B, при длине передачи 2, т.е. будет передан адрес регистра (байт D0) и 1 байт данных (байт D1), содержащий значение 0.
В случае с регистром сна (0x6B), если не требуется более тонких настроек этого регистра, нет смысла работать с отдельными битами. Можно полностью обнулить весь байт, как это делается в примерах Ардуино.

16

Re: canny7 и устройства I2c с разными адресами

Спасибо, попробую

Для установки в регистр 0x6B гироскопа значения 0 нужно отправить сообщение содержания D1:D0=0x006B, при длине передачи 2, т.е. будет передан адрес регистра (байт D0) и 1 байт данных (байт D1), содержащий значение 0.

При этом все биты регистра будут нулями, так?
А если надо отдельный бит в ноль поставить, а другой в единицу? К примеру: 0 1 0 0  0 0 1 0 0 перевожу в hex и отправляю на позиции D1?

17

Re: canny7 и устройства I2c с разными адресами

alex_engine пишет:

..При этом все биты регистра будут нулями, так?

Да.

alex_engine пишет:

..А если надо отдельный бит в ноль поставить, а другой в единицу? К примеру: 0 1 0 0  0 0 1 0 0 перевожу в hex и отправляю на позиции D1?

Да. В двоичном формате устанавливаете нужные биты в "1", остальные оставляете "0" и полученный байт ставите в нужный регистр, в данном случае в D1.

18 (19-07-2017 11:01:21 отредактировано alex_engine)

Re: canny7 и устройства I2c с разными адресами

Спасибо за ответ.
Переделал диаграмму
http://i.piccy.info/i9/f79fecc9602f9758f82c1d29752971e9/1500450348/255189/1149612/111_800.jpg
все равно нули sad

Моргание диода "есть данные i2c" однозначно показывает, что подключение устройства выполнено корректно и обмен есть?
Я попробовал задать другой адрес i2с , заведомо ложный - но диод все равно моргает. Отключил питание гироскопа - диод моргает.
http://i.piccy.info/i9/5d0bbdc8b0e80242a9ef1ef6c9ffcee9/1500451258/179690/1149612/111_800.jpg
Получается, что диод реагирует на отправляемые посылки а не на получаемые?
Как проконтролировать именно наличие принятых сообщений? Есть возможность убедиться, что абонент шины ответил?

Спасибо

19

Re: canny7 и устройства I2c с разными адресами

alex_engine пишет:

...все равно нули sad

Это показывает, что гироскоп либо не отвечает, либо шлет в ответ нули.

alex_engine пишет:

...Моргание диода "есть данные i2c" однозначно показывает, что подключение устройства выполнено корректно и обмен есть?

Нет. Моргание светодиода показывает, что контроллер принял ожидаемое количество байт. Что именно он принял зависит от того, что ему отдавал slave. Контроллер выступает Master-оми управляет обменом данными. Он добросовестно отправляет свои данные (адрес slave, адрес регистра и т.п.) и переходит на прием считывая то что установлено на линии данных, при этом тактирование выполняет сам контроллер и если на линии данных не будет активности, а будет, например, просто потенциал GND контроллер считает нужное ему количество нулей.
Т.е. очевидно, что нет ответа именно от гироскопа. Нужно проверить работоспособность гироскопа и подключение. Также нужно проверить наличие подтяжки линий i2c к 5В.

alex_engine пишет:

...Я попробовал задать другой адрес i2с , заведомо ложный - но диод все равно моргает. Отключил питание гироскопа - диод моргает.

Как написано выше - нет ответа от гироскопа. Можно вообще отключить гироскоп (в том числе линии i2c) - светодиод будет моргать.

alex_engine пишет:

...Получается, что диод реагирует на отправляемые посылки а не на получаемые?

Нет, это не так.

20

Re: canny7 и устройства I2c с разными адресами

..Получается, что диод реагирует на отправляемые посылки а не на получаемые?

Нет, это не так.

Как написано выше - нет ответа от гироскопа. Можно вообще отключить гироскоп (в том числе линии i2c) - светодиод будет моргать.

Так и есть. гироскоп отключен, диод моргает.
Так чего же он моргает, если ничего не получено? Или я не понял совсем. Противоречивость получается.

Нет. Моргание светодиода показывает, что контроллер принял ожидаемое количество байт. Что именно он принял зависит от того, что ему отдавал slave

что он может принять от отключенного слейва? Почему моргает?

Запутался окончательно sad

21

Re: canny7 и устройства I2c с разными адресами

alex_engine пишет:

...Так чего же он моргает, если ничего не получено?...

как написано выше:

Денис, CANNY пишет:

Контроллер выступает Master-оми управляет обменом данными. Он добросовестно отправляет свои данные (адрес slave, адрес регистра и т.п.) и переходит на прием считывая то что установлено на линии данных, при этом тактирование выполняет сам контроллер и если на линии данных не будет активности, а будет, например, просто потенциал GND контроллер считает нужное ему количество нулей.

alex_engine пишет:

...Противоречивость получается... что он может принять от отключенного слейва? Почему моргает?

Никакого противоречия. Пользователь сказал принять 14 байт, контроллер принимает 14 байт. А то что на линии данных висит потенциал GND - может так и надо, т.е. slave передает нули.

С этим пункитом разобрались?

Денис, CANNY пишет:

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

На плате MCU-6050, кажется, есть светодиод. Он как себя ведет?

22 (20-07-2017 11:55:50 отредактировано alex_engine)

Re: canny7 и устройства I2c с разными адресами

Благодарю за подсказки.
Заработало. Данные пошли.
Без посылки "пробуждения" не запускается. Это обязательное условие.
Проблема была в резисторах, в первой схеме я пытался и экран и гироскоп по одной линии заставить работать, не осилил.
Когда разделил - резисторы остались на линии с экраном, а в описании платы гироскопа было, что стабилизатор по питанию и резисторы эти на плате есть.
Диаграмма в ответе 18 работоспособна, циферки на экране имеются.
Осталось обработать данные, с этим еще разбираюсь
Спасибо!!!


П.С.  Один непонятный момент - работает только если кроме 12 вольт на плату SDK  еще и USB подключено. Если USB отключить - опять нули передает. При этом диоды статусов режима работы не меняют. Это еще один момент, который препятствовал запуску. Я был уверен, что наличие 12 вольт на плате обеспечивает питанием кэнни в полной мере.

23

Re: canny7 и устройства I2c с разными адресами

На каком устройстве отображаете данные гироскопа? У устройств участвующих в обмене данными должны быть объединены потенциалы GND ("общая земля").

24 (21-07-2017 17:04:53 отредактировано alex_engine)

Re: canny7 и устройства I2c с разными адресами

Отображаются данные на экране 1602, под управлением кэнни нано. Питается все от одного источника. Массы объединены.
5 вольт взял с платы SDK. От них питается и экран и гироскоп.

Еще есть вопрос: как-то можно реализовать математику для калибровки гироскопа? Данные то я получил, но они абсолютно не информативны.
http://arduino-diy.com/arduino-MPU6050- … la-naklona
Вот есть статья, но там интегрирование применяется, примеры для ардуино повсеместно фильтр Калмана используют.
Дурная затея это все пытаться реализовать диаграммой кэнни? Есть может какой-то более простой способ "причесать" данные, не вдаваясь в математику такой сложности?

void loop() {
  /* Update all the values */
  uint8_t* data = i2cRead(0x3B,14);
  accX = ((data[0] << 8) | data[1]);
  accY = ((data[2] << 8) | data[3]);
  accZ = ((data[4] << 8) | data[5]);
  tempRaw = ((data[6] << 8) | data[7]);
  gyroX = ((data[8] << 8) | data[9]);
  gyroY = ((data[10] << 8) | data[11]);
  gyroZ = ((data[12] << 8) | data[13]);
  /* Calculate the angls based on the different sensors and algorithm */
  accYangle = (atan2(accX,accZ)+PI)*RAD_TO_DEG;
  accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG;
  accXangle = (atan2(accY,accX)+PI)*RAD_TO_DEG; 
  double gyroXrate = (double)gyroX/131.0;
  double gyroYrate = -((double)gyroY/131.0);
  double gyroZrate = -((double)gyroZ/131.0);
  gyroXangle += kalmanX.getRate()*((double)(micros()-timer)/1000000); // Calculate gyro angle using the unbiased rate
  gyroYangle += kalmanY.getRate()*((double)(micros()-timer)/1000000);
   gyroZangle += kalmanZ.getRate()*((double)(micros()-timer)/1000000);

Спасибо.

25

Re: canny7 и устройства I2c с разными адресами

"Причесать" данные, не вдаваясь в математику, скорее всего не получится. Однако данный алгоритм обработки вполне возможно реализовать в функциональной диаграмме.
Про фильтр Калмана на форуме была отдельная тема.