Wire endtransmission error

Решаем проблему не рабочей I2C связи для LCD 1602

Дисплеи Winstar на контроллере hd44780 довольно популярны, но их стандартное подключение к контроллеру по 16-и линиям не совсем удобно — масса проводов занимает драгоценные пины.

В данной ситуации есть выход — модуль I2C переходника. Подключается он всего по двум проводам. Но есть небольшие проблемы.

Сначала нужно скачать и установить библиотеку для работы с I2C дисплеем LiquidCrystal_I2C. Далее нужно задать адрес дисплея, указывается он в этой строке:

Адрес 0x27 стандартен для большинства модулей, но бывают и исключения из этого правила. Иногда он определяется как стандартный, но дисплей с ним не работает. Проверить адрес можно довольно просто, загрузив нижеприведенную программу (I2Cscanner) в плату Arduino:

#include <Wire.h>
void setup() {
Wire.begin();

Serial.begin(9600);
while (!Serial);
Serial.println("nI2C Scanner");
}

void loop() {
byte error, address;
int nDevices;

Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ ) {
Wire.beginTransmission(address);
error = Wire.endTransmission();

if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address < 16) Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if ( error == 4) {
Serial.print("Unknow error at address 0x");
if (address < 16) Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices foundn");
else
Serial.println("donen");

delay(5000);
}

Далее нужно открыть Serial Monitor и посмотреть считанный адрес. Но, как и говорилось ранее, иногда модуль по какой-то причине не работает с адресом 0x27. Что же делать?

В таком случае на плате модуля I2C существуют перемычки для переключения на другой адрес. На рисунке они обозначены как A0, A1, A2:

Замыкая какую либо из них, мы получаем новый адрес и все начинает работать. Например, замкнем A0. Загрузим скетч сканера на плату получим следующее:

Прописываем адрес в программу загружаем и видим, что всё работает нормально:

Ардуино библиотека Wire используется для связи микроконтроллера с устройствами и модулями через интерфейс I2C. Об этом интерфейсе я рассказывал в уроке посвященном I2C. Там мы подробно рассмотрели пример подключения и работы с I2C устройствами. I2C интерфейс для передачи данных использует множество устройств.

Для связи по I2C используется всего два контакта: линия данных (SDA) и линия тактового сигнала (SCL). К соответствующим разъемам Arduino можно подключить до 120 устройств, поддерживающих интерфейс I2C. Для обмена данными с такими устройствами и нужна Arduino библиотека Wire.

Расположение пинов SDA и SCL на разных платах Arduino может отличаться. Смотрите описание вашей платы микроконтроллера, что бы не допустить ошибку при подключении. В списке ниже расписано расположение пинов I2C популярных плат Ардуино.

  • Arduino Nano: A4-SDA A5-SCL
  • Arduino Uno: A4-SDA A5-SCL продублированы рядом с разъемом AREF (только версия R3)
  • Arduino Mega: 20-SDA 21-SCL продублированы рядом с разъемом AREF (только версия R3)
  • Arduino Pro Mini: A4-SDA A5-SCL
  • Arduino Leonardo: 2-SDA 3-SCL и пины рядом с разъемом AREF (второй канал)

В этой статье я подробно распишу функции библиотеки Wire.

Скачать Arduino библиотеку Wire.h

Wire идет в комплекте стандартных библиотек и устанавливается вместе с Arduino IDE. Но ее можно скачать и отдельно по ссылке ниже.

Скачать Ардуино библиотеку Wire

Для установки библиотеки просто распакуйте zip архив в папку «C:Program Files (x86)Arduinolibraries» или в то место, где у васт установлена среда разработки Arduin IDE. Если у вас запущена программа Arduino IDE, то для работы с новой библиотекой её необходимо перезапустить.

begin()

Инициализирует библиотеку Wire и подключается к шине I2C как ведущий (мастер) или ведомый.

Синтаксис

Wire.begin(address);

Параметры

address — Необязательный параметр. 7-битный адрес ведомого устройства; если не задан, плата подключается к шине как мастер.

Возвращаемые значения

Нет

#include <Wire.h> // Подключаем библиотеку
void setup() {
  Wire.begin(); // Подключаемся к шине i2c
}

void loop() {

}

requestFrom()

Отправляет запрос на определенное количество байтов от ведущего устройства к ведомому.

Синтаксис

Wire.requestFrom(address, quantity, stop);

Параметры

address — Обязательный параметр. 7-ми битный адрес устройства к которому посылается запрос.

quantity — Обязательный параметр. Количество запрашиваемых байт.

stop — Необязательный параметр. Тип данных boolean. true — после запроса отправляет STOP, освобождая шину I2C. false — после запроса отправляет RESTART. Шина не освобождается и можно отправлять дополнительные запросы. По умолчанию — true.

Возвращаемые значения

Количество байт, возвращенных от устройства.

#include <Wire.h>

byte val = 0;

void setup()
{
  Wire.begin();        // подключиться к шине i2c (адрес для мастера не обязателен)
  Serial.begin(9600);  // настроить последовательный порт для вывода
}

void loop()
{
  Wire.requestFrom(2, 6);    // запросить 6 байтов от ведомого устройства #2

  while(Wire.available())    // ведомое устройство может послать меньше, чем запрошено
  { 
    char c = Wire.read();    // принять байт как символ
    Serial.print(c);         // напечатать символ
  }

  delay(500);
}

beginTransmission()

Открывает канал связи по шине I2C с ведомым устройством.

Синтаксис

Wire.beginTransmission(address);

Параметры

address — Обязательный параметр. 7-ми битный адрес устройства к которому посылается запрос.

Возвращаемые значения

Нет

endTransmission()

Отправляет данные, которые были поставлены в очередь методом write() и завершает передачу.

Синтаксис

Wire.endTransmission(stop)

Параметры

stop — Необязательный параметр. Тип данных boolean. true — после запроса отправляет STOP, освобождая шину I2C. false — после запроса отправляет RESTART. Шина не освобождается и можно отправлять дополнительные запросы. По умолчанию — true.

Возвращаемые значения

byte, который указывает на состояние передачи:
0: успешная передача;
1: Объем данных для передачи слишком велик;
2: принят NACK при передаче адреса;
3: принят NACK при передаче данных;
4: другие ошибки.

#include <Wire.h>

byte val = 0;

void setup()
{
  Wire.begin(); // подключиться к шине i2c
}

void loop()
{
  Wire.beginTransmission(44); // передача на устройство #44 (0x2c) адрес устройства задан в техническом описании
  Wire.write(val);            // отправить байт значения  
  Wire.endTransmission();     // остановить передачу
}

write()

Ставит данные в очередь для передачи.

Синтаксис

Wire.write(data, length);

Параметры

data — Обязательный параметр. Байт, срока или массив байтов для передачи.

length - Необязательный параметр. Длинна передаваемого массива данных. Используется только при передаче массива в первом параметре.

Возвращаемые значения

Количество записанных байт

#include <Wire.h>

byte val = 0;

void setup()
{
  Wire.begin(); // подключиться к шине i2c
}

void loop()
{
  Wire.beginTransmission(44); // передача на устройство #44 (0x2c) адрес устройства задан в техническом описании
  Wire.write(val);            // отправить байт значения  
  Wire.endTransmission();     // остановить передачу
}

available()

Возвращает количество байт, доступных для чтения.

Синтаксис

Wire.available();

Параметры

Нет

Возвращаемые значения

Количество байт доступных для считывания

#include <Wire.h>

byte val = 0;

void setup()
{
  Wire.begin();        // подключиться к шине i2c (адрес для мастера не обязателен)
  Serial.begin(9600);  // настроить последовательный порт для вывода
}

void loop()
{
  Wire.requestFrom(2, 6);    // запросить 6 байтов от ведомого устройства #2

  while(Wire.available())    // ведомое устройство может послать меньше, чем запрошено
  { 
    char c = Wire.read();    // принять байт как символ
    Serial.print(c);         // напечатать символ
  }

  delay(500);
}

read()

Считывает байт переданной информации.

Синтаксис

Wire.read();

Параметры

Нет

Возвращаемые значения

Принятый байт

#include <Wire.h>

byte val = 0;

void setup()
{
  Wire.begin();        // подключиться к шине i2c (адрес для мастера не обязателен)
  Serial.begin(9600);  // настроить последовательный порт для вывода
}

void loop()
{
  Wire.requestFrom(2, 6);    // запросить 6 байтов от ведомого устройства #2

  while(Wire.available())    // ведомое устройство может послать меньше, чем запрошено
  { 
    char c = Wire.read();    // принять байт как символ
    Serial.print(c);         // напечатать символ
  }

  delay(500);
}

Синтаксис

Параметры

Возвращаемые значения

setClock()

Устанавливает тактовую частоту обмена данными по I2C интерфейсу.

Синтаксис

Wire.setClock(clockFrequency);

Параметры

clockFrequency — Обязательный параметр. Новое значение частоты обмена данными в герцах. Доступные значения:
10000 — медленный режим
100000 — стандартное значение
400000 — быстрый режим
1000000 — быстрый режим плюс
3400000 — высокоскоростной режим
Необходимо убедится, что выбранный режим поддерживается вашим процессором, обратившись к документации от производителя.

Возвращаемые значения

Нет

onReceive()

Добавляет функцию обработчик, которая будет выполняться при получении данных от ведущего устройства.

Синтаксис

Wire.onReceive(handler);

Параметры

handler — Имя функции, которая будет выполняться когда ведомое устройство принимает данные. Функция должна принимать один параметр int и ничего не возвращать.

Возвращаемые значения

Нет

#include <Wire.h>

void setup() 
{
  Wire.begin(8);                // подключиться к i2c шине с адресом #8
  Wire.onReceive(receiveEvent); // зарегистрировать обработчик события
  Serial.begin(9600);           // настроить последовательный порт для вывода
}

void loop() 
{
  delay(100);
}

//   функция, которая будет выполняться всякий раз, когда от мастера принимаются данные
//   данная функция регистрируется как обработчик события, смотрите setup()
void receiveEvent(int howMany) 
{
  while (Wire.available()) { 
    char c = Wire.read();    // принять байт как символ
    Serial.print(c);         // напечатать символ
  }
}

onRequest()

Добавляет функцию обработчик, которая будет выполняться при получении запроса от ведущего устройства.

Синтаксис

Wire.onRequest(handler);

Параметры

handler — Имя функции, которая будет выполняться когда ведомое устройство получает запрос от ведущего. Функция не принимает параметров и ничего не возвращает.

Возвращаемые значения

Нет

#include <Wire.h>

void setup() 
{
  Wire.begin(8);                // подключиться к i2c шине с адресом #8
  Wire.onRequest(requestEvent); // зарегистрировать обработчик события
}

void loop() 
{
  delay(100);
}

//   функция, которая будет выполняться всякий раз, когда мастером будут
// запрошены данные
//   данная функция регистрируется как обработчик события, смотрите setup()
void requestEvent() 
{
  Wire.write("hello "); // ответить сообщением
}

ТехнарьКто


  • #26

Вижу, что мысль о важности первоначальных проверок, просто пролетела у всех мимо ушей.

Коротко поясню.

Какие бывают Linux?

Бывают для аппаратной части процессоров
1) x86 операционные системы 32bit
2) x86 операционные системы 64bit
3) ARM операционные системы 32bit
4) ARM операционные системы 64bit.

Для x86 это всем привычные
1) настольные компьютеры
2) ноутбуки
Для процессоров ARM
3) смартфоны (телефоны)
4) планшеты
5) ноутбуки
6) всякие Raspberry.

Для телефонов соответственно IDE могут быть разные, например глюкавое ArduinoDroid.

IDE для Linux теоретически может быть любое для C, С++ но скетчи под это дело надо переделывать в нормальный код, это уже не ArduinoIDE для новичков.

Eclipse
Bluefish
NetBeans
Komodo IDE
Anjuta
MonoDevelop
CodeLite
Kdevelop
и еще много всякого. А вот что умудрился использовать вопрошающий, загадка.

Может быть использовано и ArduinoIDE но работать будет не на всех Linux.

Для ArduinoIDE разных версий, совместимость скетчей отсутствует, почему так происходит придумайте сами.
Например на совершенно рабочий скетч ArduinoIDE стала выдавать ошибку компиляции «‘prog_char’ does not name a type», оказывается просто изменили ‘prog_char’ и теперь надо просто ‘char’. А формально оба скетча рабочие, просто прошиваться будут только на разных версиях ArduinoIDE. И это относиться не просто к скетчам, а и к библиотекам. Взяли скрестили новую версию библиотеки со старым ArduinoIDE или наоборот старую библиотеку с новой версией ArduinoIDE и работать скетч уже не будет. Поэтому. Установили в какой-то операционной системе какую то IDE. Написали по какому то примеру какой то скетч, а не работает. То ли с железом проблема. То ли программы сорятся. То ли ошибок в скетче понаделали. Если скетч старый и рабочий, а у Вас стоит ArduinoIDE с новыми правилами написания скетчей, все равно формально скетч рабочий — просто факт.
И какая ситуация конкретно у спрашивающего, форуму не ведомо. Для начинающих. Установили в чем-то какой-то IDE. Запускаете из примеров Blink. Меняете частоту вспышек. Убеждаетесь, что эти изменения вызваны Вашими действиями. Это Важный шаг. Не надо этот шаг пропускать, типа и так все понятно и просто. Если лампочки на ардуинке мигают то это говорит о том, что какой то процесс идет. Но не говорит о том, что все правильно сделано. При этом может и не работать. Шаг следующий. Устанавливаете или используете установленную библиотеку. Запускаете примеры из этой библиотеки. Разбираетесь почему не работает. И только после того, как убедитесь, что Ваше устройство (в данном случае дисплей) работает на примерах из библиотеки, начинаете с этим делать что то свое. И не раньше. А вопросы не работает стандартное, совсем другая тема.
Если хотите адекватный ответ, пишите операционную систему полностью. Версию IDE полностью. Версию использованной библиотеки полностью. Работала ли первоначальная проверка вспышкой и стандартные примеры на используемой библиотеке.

PS Когда захотел помочь. Получилось как обычно. Думаешь одно, а все совсем иначе. А вопрошающий считает, что вокруг одни экстрасенсы и всю дополнительную информацию про него обязаны знать.

  • #27

@ТехнарьКто, понял о чем говорите, но при проблемах совместимости обычно даже компиляция не проходит, а здесь все успешно компилируется и загружается.
Что касается «проверки на примере из библиотеки», так это он и есть, за исключением выводимого текста и дополнительного мигания.

прямоугольники могут появиться только в 3 случаях:
1. на дисплей не приходят данные
2. контрастность на максимуме
3. контроллер запрограммирован на их вывод

3 — в коде этого нет
2 — уже проверено
остается только 1 вариант

ТехнарьКто


  • #28

@ТехнарьКто, понял о чем говорите, но при проблемах совместимости обычно даже компиляция не проходит, а здесь все успешно компилируется и загружается.

С чего Вы так решили?

Что касается «проверки на примере из библиотеки», так это он и есть, за исключением выводимого текста и дополнительного мигания.

Если мигает светодиод, не значит, что прошивается. И даже если вдруг прошивается, откуда у Вас уверенность, что ArduinoIDE совместима с библиотекой, а скетч использует синтаксис требуемый для версии IDE топикстартера?

прямоугольники могут появиться только в 3 случаях:
1. на дисплей не приходят данные
2. контрастность на максимуме
3. контроллер запрограммирован на их вывод

3 — в коде этого нет
2 — уже проверено
остается только 1 вариант

Не хочу показаться грубым, но прямоугольники в простейшем случае просто признак успешного внутреннего теста дисплея. Подключите только питание на LCD1602 I2C и полюбуйтесь прямоугольниками. По Вашему будет вариант1. А уж из за чего появился этот вариант, мне не ведомо. Провода включены не туда, версия IDE не та, версия библиотеки не та. Синтаксис скетча не под то. Полный ХЗ.

Скетч прекрасно работает на том, что я приводил выше, но это только для окошек (windows). Дал заведомо работающую сборку но мне гордо заявили про Linux. Мне это заявление про Linux говорит только о том, что человек понятия не имеет, что Linuх-ов очень много и они сильно разные.

  • #29

Избыточное цитирование

@ТехнарьКто, автор пишет о мигающей подсветки дисплея, которая есть в коде, т.е. отсюда вывод что все успешно компилируется и прошивается и версии/компиляторы совместимы.

Не хочу показаться грубым, но прямоугольники в простейшем случае просто признак успешного внутреннего теста дисплея. Подключите только питание на LCD1602 I2C и полюбуйтесь прямоугольниками. По Вашему будет вариант1. А уж из за чего появился этот вариант, мне не ведомо. Провода включены не туда, версия IDE не та, версия библиотеки не та. Синтаксис скетча не под то. Полный ХЗ.

Прямоугольники говорят о запуске контроллера дисплея и готовности принимать данные с контроллера, соответственно раз запрограммированные строки не появляются — данные на дисплей не приходят, т.е. вариант 1.
Провода подключены куда надо, т.к., повторюсь, подсветка дисплея мигает.
Ошибки синтаксиса компилятор бы не пропустил.

Исходя из вышесказанного склоняюсь к версии о плохой пайке/неотмытом флюсе между платой дисплея и модулем i2c

ТехнарьКто


  • #30

автор пишет о мигающей подсветки дисплея, которая есть в коде, т.е.

Откуда уверенность про подсветку? Возможно оно мигает из за пропадающего контакта в куче лишних соединений, когда автор шевелит все подряд в надежде, а вдруг заработает.

Вот работа скетча автора без каких либо изменений в момент включения подсветки..
1.jpg

Вот так у него должно выглядеть, если бы было то, что Вы предполагаете. Два ряда прямоугольников.
2.jpg

Изменено: 19 Июл 2021

  • #31

@ТехнарьКто, в корне не верно, если данные не приходят — будет 1 строка с прямоугольниками, а 2 строки с прямоугольниками будут только если данные приходят и контрастность на максимуме(2 вариант который отпал, когда автор проверил мультиметром и я заметил вывод 2 строк, а не 1 как в базовом примере).
Так что, повторюсь, здесь 1 вариант — данные на дисплей не приходят.

ТехнарьКто


  • #32

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

О да, конечно. Вот этот кусок кода

lcd.backlight();
Flash(500);
lcd.noBacklight();
Flash(500);

Так что, повторюсь, здесь 1 вариант — данные на дисплей не приходят.

Другими словами Вы считаете, что управление подсветкой на дисплей по интерфейсу I2C приходит в виде каких то других данных и по какому то другому интерфейсу I2C ? 😂

  • #33

О да, конечно. Вот этот кусок кода

lcd.backlight();
Flash(500);
lcd.noBacklight();
Flash(500);

правильно! именно этот кусок кода и отвечает за мигание подсветки.

Другими словами Вы считаете, что управление подсветкой на дисплей по интерфейсу I2C приходит в виде каких то других данных и по какому то другому интерфейсу I2C ? 😂

Прочитайте внимательнее.
Я говорил про данные, передаваемые МЕЖДУ модулем i2c и дисплеем, а не между ардуиной и i2c модулем.
Сам i2c модуль подключается к дисплею через параллельный интерфейс, вот в нем и может заключаться проблема.

для наглядности:
ардуино —————-> I2C Module ——-Error——>Display

@SarmatK, предположу еще точнее, на фото у контакта D0 нету отблеска припоя снизу, похоже именно он и не припаялся
1626654044363.png

Изменено: 19 Июл 2021

ТехнарьКто


  • #34

предположу еще точнее, на фото у контакта D0 нету отблеска припоя снизу, похоже именно он и не припаялся

:)

@SarmatK,

Пропаивай контакт D0. IamNikolay по фото определил причину, как бы смешно на техническом форуме это не звучало.

Закрываем тему.

  • #35

@ТехнарьКто, для 100 % уверенности необходимо прозвонить контакт, как я автору и предлагал ранее. А так, визуально — проблема именно там.

Пропаивай контакт D0. IamNikolay по фото определил причину, как бы смешно на техническом форуме это не звучало.

Чтобы смешно не звучало — нужно уточнить что фото неработающей платы, а не ✋:)

  • #36

Вот это очень зря. Дисплей у тебя подключен к +5 ардуины, а он идет напрямую и поэтому он мог вполне не выдержать такого издевательства.

Не, от 5 до 15V я подавал на Vin.

1. Вы почему-то считаете, что мы тут экстрасенсы?
2. Сначала прошиваете стандартный блинк «Blink» из примеров. Если светодиод мигает. Это подтвердит, что Вы смогли правильно настроить порт и научились прошивать простейшие скетчи.
3. Затем прошиваете «Здравствуй мир» в примерах это «Hello World». Вот когда это у Вас получиться, тогда и поговорим.
4. Пусть научиться запускать стандартные примеры из стандартных библиотек, а не любит мозг сообществу самодельными скетчами.

1. А какая разница, на на какой ОСи я работаю? На сайте arduino.cc английским по белому написано, что продукт — кроссплатформенный. Я им верю пока. :)
2. Blink у меня заработал за день до того, как я перешел к примеру «Здравствуй мир».
3 и 4: «Здравствуй мир» не самодельный, он взят из примеров. Его модификации я делал только для того, чтобы проверить доходят ли команды до дисплея.
Вижу я Вас чем-то задел, приношу свои извинения; даже в мыслях этого не имел!

1. А вот что умудрился использовать вопрошающий, загадка.
2. Для начинающих. Установили в чем-то какой-то IDE. Запускаете из примеров Blink. Меняете частоту вспышек. Убеждаетесь, что эти изменения вызваны Вашими действиями.

1. Я понял из Ваших слов, что продукт этот не такой уж кроссплатформенный. Что ж, если это так важно, я буду указывать все версии. Вы главное не кипятитесь — опыт же дело наживное… :)
2. Если посмотреть на скетч, то можно увидеть, что за полцикла свечения подсветки должен проходить полный цикл свечения (0/1) светодиодов — так и есть на практике.

Если мигает светодиод, не значит, что прошивается.
Откуда уверенность про подсветку? Возможно оно мигает из за пропадающего контакта в куче лишних соединений, когда автор шевелит все подряд в надежде, а вдруг заработает.

Блинк я заставлял передавать «Hello world!» азбукой Морзе, так что — прошивается, прошивается… :)

@SarmatK, Пропаивай контакт D0. IamNikolay по фото определил причину, как бы смешно на техническом форуме это не звучало.

Контакт там нормальный, просто на фото этого не видно. Чтобы не допускать чудес, прозвонил и пропаял — результат тот же. :(

Я тоже решил попробовать параллельным интерфейсом работать (как тут выше советовали), но пока другого дисплея не имею.

Всем большое спасибо за участие в решении! :)

__________________________________________________
++: Версии ПО (упросил товарища поставить на своей выни Arduino IDE):
Arduino IDE v2:1.0.5+dfsg2-4 / Ubuntu 16.04 LTS
Arduino IDE 1.8.15 / Windows 8.1 PRO (Build 9600)

Результат из под винды тот же самый. :(

Либа взята отсюда — https://gitlab.com/tandembyte/LCD_I2C

Изменено: 23 Июл 2021

  • #37

Контакт там нормальный, просто на фото этого не видно. Чтобы не допускать чудес, прозвонил и пропаял — результат тот же. :(

а остальные контакты?
D0 отличался визуально, но это не значит что с остальными все хорошо.
проблема явно в параллельном интерфейсе там и флюс(возможно токопроводящий) не отмыт + неизвестно что там между платами, с таким количеством флюса припой мог затечь и замкнуть контакты.

  • #38

… с таким количеством флюса припой мог затечь и замкнуть контакты.

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

ТехнарьКто


  • #39

Результат из под винды тот же самый. :(

Вы меня неправильно поняли. Или я Вам плохо пояснил.
1) Сборку которую я Вам предложил надо просто распаковать на компьютере с виндовс. Установки не требует. Библиотеки содержит. Если при заливке скетча используя эту сборку у Вас появяться надписи на дисплее, значит искать ошибку надо в программном обеспечении. Если надписи не появяться, а будет как было, значит ошибку надо искать в аппаратуре. Аппаратную ошибку Вы тут и без меня активно обсуждаете. Мое предложение просто помогло бы Вам быстро определить, в чем причина.
2) Кросплатформеность не подразумевает полную и безоговорочную совместимость разных версий Arduino IDE c любыми библиотеками, поскольку правила написания скетча изменялись со временем .
3) Работа на линукс ранее подразумевала высокие знания. Теперь увы, даже писать на какой платформе работает линукс стало не модно. А работа на стационарном компе x86 или raspberry pi ARM подразумевает разные архитектуры и разный набор глюков, что многократно затрудняет возможность помочь.

Успехов.

  • #40

@ТехнарьКто, можно сделать гораздо проще: если все еще полагаете что проблема в софте — скиньте скомпилированную прошивку, она либо зальется либо нет — будет сразу видно

  • #41

Есть у меня lcd дисплей, спаял его, и он может выключаться и включаться(система видит его. он на пути 0x27). Но текст не показывает. В чем может быть проблема?

ТехнарьКто


  • #42

  • 3.5 KB
    Просмотры: 16

ТехнарьКто


  • #43

Чтобы понять, какой всё-таки адрес у модуля, подключаемого к плате Ардуино, нужно просто «постучаться» по каждому из возможных адресов. Если кто-то ответит, значит адрес рабочий!

#include <Wire.h>
 
void setup(){
    Wire.begin();
 
    Serial.begin(9600);
    while (!Serial);
    Serial.println("nI2C Scanner");
}

void loop(){
    byte error, address;
    int nDevices;
 
    Serial.println("Scanning...");
 
    nDevices = 0;
    for(address = 8; address < 127; address++ ){
        Wire.beginTransmission(address);
        error = Wire.endTransmission();
 
        if (error == 0){
            Serial.print("I2C device found at address 0x");
            if (address<16)
                Serial.print("0");
            Serial.print(address,HEX);
            Serial.println(" !");
 
            nDevices++;
        }
        else if (error==4) {
            Serial.print("Unknow error at address 0x");
            if (address<16)
                Serial.print("0");
            Serial.println(address,HEX);
        }
    }
    if (nDevices == 0)
        Serial.println("No I2C devices foundn");
    else
        Serial.println("donen");
 
    delay(5000);
}

Загружаем программу на Ардуино, подключаем тестируемое устройство к I2C шине и открываем монитор последовательного порта. Если все подключено правильно, то появится примерно такой отчет:
111.jpg
Это значит, что мой дисплей имеет адрес 0x3Eв шестнадцатеричной системе счисления. Скетч скомпилирован для адреса
0x27. Если у Вас другой адрес, то надо менять адрес в скетче на правильный, чтобы все заработало.

  • #44

Чтобы понять, какой всё-таки адрес у модуля, подключаемого к плате Ардуино, нужно просто «постучаться» по каждому из возможных адресов. …

Это я делал — на неверном адресе подсветка не мигала.
Насколько я понял, IamNikolay имел ввиду загрузить не скетч, а именно прошивку, чтобы загрузить её в ардуинку и увидеть где проблема — в программе, или в железке.

ТехнарьКто


  • #46

Нужен дисплей для работы. Есть код(ниже), и в нем работает только мигание дисплея. Текст не показывает.

#include <LiquidCrystal_I2C.h>  // подключаем библу
#include <Wire.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);  // адрес, столбцов, строк
void setup()
{
  lcd.init(); 
  lcd.setCursor(1, 0);  // столбец 1 строка 0
  lcd.print("Hello, world!");
  lcd.setCursor(4, 1);  // столбец 4 строка 1
  lcd.print("GyverKIT");   
} 

void loop()
{
    lcd.backlight();
  delay(500);
  lcd.noBacklight();
  delay(500);
}

  • #47

Спасибо!
Оказалось, что плата интерфейса неисправна — 12-я нога PCF7584 (P7) не соединена со входом D7 дисплея. Напаял проводок сверху и все заработало. Но — ненадолго.:mad: Плата эта постоянно глючит, плюс провода для брэдборды плохо контачат — чуть повернешь что-нибудь, возьмешь в руки или положишь обратно на стол, как тут же все перестает включаться/работать.
Напоминает попытку сделать что-либо из говна и палок. Наверное нужно покупать комплектующие у других продаванов. Знать бы еще у кого… :(

++: А нет ли у кого схемы этого адаптера I2C->LCD, чтобы легче было с ним разбираться?

Изменено: 30 Июл 2021

  • #48

@SarmatK, как и предполагал ранее…
по поводу проводов — подключите напрямую без макетки
1627649792037.png

  • #49

@SarmatK, как и предполагал ранее…

Да, Вы всё верно вычислили! :) Спасибо большое!

Нашел еще один косяк в плате адаптера, теперь всё работает нормально. :)

Всех благодарю за поддержку! (y)

___________________________________
P.S. Всё же, не откажусь от схемы адаптера. Если есть у кого — поделитесь, плиз.

Изменено: 30 Июл 2021

ТехнарьКто


  • #50

Всё же, не откажусь от схемы адаптера.

Схем много. Выбирай, какая будет понятнее. По сути, схемы одинаковые.
sxem.jpg
sxem-big.jpg
Бывает, что на резисторах подтяжки от VCC к A0, A1, A2 китайцы экономят, не ставят. Номиналы резисторов от VCC к SCL, SDA на китайских платах могут отличаться от схемы в широких пределах. Стоять могут резисторы от единиц до десятков кОм. Адресное пространство состоит из двух частей, фиксированной и изменяемой. Изменяемая часть последние три знака в двоичной системе A0, A1, A2 устанавливаются пользователем. Первые цифры адреса в двоичном коде можно посмотреть в datasheet-е на PCF8574. В зависимости от буквы, первая часть адреса определена в микросхеме.
adres.jpg
Для PCF8574 если A2, A1, A0 в «1» то адрес будет 0100111 это 0x27
Для PCF8574A если A2, A1, A0 в «1» то адрес будет 0111111 это 0x3F

PS Чем мог, помог.

0 / 0 / 0

Регистрация: 13.06.2011

Сообщений: 41

1

29.11.2015, 23:29. Показов 5913. Ответов 9


Всем привет!

Купил Arduino Pro Mini на Aliexpress и потребовалось использовать его для передачи данных по i2c, но вот тут возникла проблема — этот arduino никого и ничего не видит. При попытке передачи всегда выдаёт вторую ошибку (NACK при передаче адреса на ВСЕХ адресах). Пробовал его цеплять и к своей микросхеме и к точно такой же ардуинке — внешне немного отличаются, но по сути одно и тоже.

Может кто-нить подсказать что и как — мб я не прав. Цепляюсь к выходам A4 и A5.

Надеюсь на вашу помощь!

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



techpriest

634 / 213 / 57

Регистрация: 27.02.2014

Сообщений: 1,180

30.11.2015, 00:13

2

Всё правильно А4, А5. Там стандартный atmega328.

Подтягивающие резисторы на выводах установлены?
Другая ардуинка работает нормально?

Если сами выводы работают нормально, то аппаратная неисправность контроллера крайне мало вероятна.



0



0 / 0 / 0

Регистрация: 13.06.2011

Сообщений: 41

30.11.2015, 00:15

 [ТС]

3

Во-первых, там вроде бы есть свои подтягивающие резисторы.
Во-вторых, я пробовал и с резисторами и без — результат одинаковый, подтягивал и до 3.3В, и до 5В



0



techpriest

634 / 213 / 57

Регистрация: 27.02.2014

Сообщений: 1,180

30.11.2015, 00:24

4

А другая ардуинка с точно таким же кодом работает корректно?



0



0 / 0 / 0

Регистрация: 13.06.2011

Сообщений: 41

30.11.2015, 00:25

 [ТС]

5

я проверял связки
pro mini №1 + ЦАП I2C
pro mini №2 + ЦАП I2C
pro mini №1 + pro mini №2
и все не работают



0



techpriest

634 / 213 / 57

Регистрация: 27.02.2014

Сообщений: 1,180

30.11.2015, 00:32

6

Ну, тогда давайте код… Раз все не работают, значит, видимо, дело в коде.



0



GooG2e

0 / 0 / 0

Регистрация: 13.06.2011

Сообщений: 41

30.11.2015, 00:55

 [ТС]

7

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <Wire.h>
 
#include <NewPing.h>
 
#include <OneWire.h>
 
#include <DallasTemperature.h>
 
 
//-------Authors and Version
String author_str="GooG2e(c) 2015";
String ver="0.1";
//-------Authors and Version
 
String com_buf;
char char_buf;
OneWire sensor_bus(A0);
DallasTemperature sensor(&sensor_bus);
NewPing sonar(6,7,20);
 
void setup() {
  Serial.begin(9600);
  pinMode(A3,OUTPUT);
  digitalWrite(A3,1);
  pinMode(5,OUTPUT);
  digitalWrite(5,1);
  pinMode(A2,INPUT);
  //pinMode(3,OUTPUT);
 
  sensor.begin();
  Wire.begin();
}
 
void loop() {
  serialEvent(); 
}
 
void execute_com()
{
  if(com_buf=="*IDN?")
  {
    Serial.println(author_str+" Current version:"+ver);
  }
  else if(com_buf=="rc_tmp")
  {
    sensor.requestTemperatures();
    Serial.println(sensor.getTempCByIndex(0));
  }
  else if(com_buf=="rc_rng")
  {
    Serial.println(sonar.ping_cm());
  }
  else if(com_buf=="tst_dac")
  {
    Serial.println("Testing DAC");
    for(int addr=0; addr<127;addr++)
    {
      Serial.print("Testing addr:");
      Serial.println(addr);
      Wire.beginTransmission(addr);
      int error=Wire.endTransmission(true);
      if(error==0)
      {
        Serial.print("Found device on address:");
        Serial.println(addr);
      }
      else
      {
        Serial.print("Error at address:");
        Serial.print(addr);
        Serial.print(" Error:");
        Serial.println(error);
      }
      //Wire.write(0b01000000);
      //Wire.write(0b00000000);
      //Wire.write(0b00100000);
      
    }
    Serial.println("Finished");
    
  }
  else
  {
    Serial.println(com_buf);
  }
  com_buf="";
}
 
void serialEvent()
{
  while(Serial.available()>0)
  {
    char_buf= (char) Serial.read();
    if(char_buf!='n' && char_buf!='r')
    {
      com_buf+=char_buf;
    }
    else
    {
      if(com_buf.length()>0)
      {
        execute_com();
      }
      
    }
  }
}

Основная часть, когда приходит по serial команда tst_dac — проверка всех портов.
Когда пишу endTransmission пробовал и с параметром и без. Просто сейчас висит с true

Добавлено через 8 минут
Я не знаю с какого перепугу, но поставил false при endTransmission и всё начало работать…
Сейчас ещё с ЦАП проверю

Добавлено через 11 минут
С ардуинкой другой сработало, а вот с цап не получается..

Добавлено через 36 секунд
В любом случае мб можете подсказать — мне нужно как-то на выходе иметь возможность генерить напряжение от 0 до 10В. Какие варианты есть?



0



techpriest

634 / 213 / 57

Регистрация: 27.02.2014

Сообщений: 1,180

30.11.2015, 01:25

8

Интересно, что с Wire.endTransmition(false) у меня находит какое-то устройство, хотя ничего не подключено. .
А собственно, как приёмник сконфигурирован был, когда удалось осуществить соединение?

Wire.endTransmition(true), по идее, передает на шину stop.
Вообще как-то странно отлаживаться на пустом сообщении. Может что-нибудь ввести в буфер. Вам, наверное виднее, но ИМХО, так делать не стоит … И прежде чем сканировать порты, хорошо бы убедиться в корректности передачи на заранее известный адрес.



0



0 / 0 / 0

Регистрация: 13.06.2011

Сообщений: 41

30.11.2015, 01:28

 [ТС]

9

просто висел на восьмом адресе.
Проверил работает и без подтягивающих резисторов внешних. — главное, чтобы питание и земля были общие с микросхемой. Сейчас разбираюсь в протоколе передачи.. Как-то всё не совсем просто..
http://www.nxp.com/documents/d… DA8444.pdf

Если подскажете что по коду, то буду рад.
P.S. Микросхема эта может менять свой адрес на шине и я проверили оно реально меняет найденный адрес. Осталась главная проблема с установкой значения этого цапа



0



15 / 15 / 8

Регистрация: 17.06.2013

Сообщений: 209

30.11.2015, 14:43

10

GooG2e,
Залей в одну из дуин любой i2c скетч. Главное, чтобы адрес выставлялся.
Во вторую залей код с этой ссылки.
Проверь для начала работоспособность интерфейса



1



I’m new to Arduino and Stack Exchange. I’ve been building a fitness tracker and am receiving a certain error in the serial monitor. The accelerometer seems the work, but it seems to go to sleep after a while. I’m using an Arduino Uno (for the time being), a Bluetooth HC-05 module and an MPU6050 accelerometer. I connect it to an app, Retroband to monitor the steps taken and calories burnt.

I’ve wired it like this:

Accelerometer:

 SDA-A4
 SCL-A5
 VCC-3.3v
 GND-GND

Bluetooth:

 VCC-3.3v
 GND-GND
 TX-2
 RX-3

Here is the code I’m using:

#include <math.h>
#include <Wire.h>
#include <SoftwareSerial.h>


/* Bluetooth */
SoftwareSerial BTSerial(2, 3); //Connect HC-06. Use your (TX, RX) settings

/* time */
#define SENDING_INTERVAL 1000
#define SENSOR_READ_INTERVAL 50
unsigned long prevSensoredTime = 0;
unsigned long curSensoredTime = 0;

/* Data buffer */
#define ACCEL_BUFFER_COUNT 125
byte aAccelBuffer[ACCEL_BUFFER_COUNT];
int iAccelIndex = 2;

/* MPU-6050 sensor */
#define MPU6050_ACCEL_XOUT_H 0x3B // R
#define MPU6050_PWR_MGMT_1 0x6B // R/W
#define MPU6050_PWR_MGMT_2 0x6C // R/W
#define MPU6050_WHO_AM_I 0x75 // R
#define MPU6050_I2C_ADDRESS 0x68

typedef union accel_t_gyro_union {
  struct {
    uint8_t x_accel_h;
    uint8_t x_accel_l;
    uint8_t y_accel_h;
    uint8_t y_accel_l;
    uint8_t z_accel_h;
    uint8_t z_accel_l;
    uint8_t t_h;
    uint8_t t_l;
    uint8_t x_gyro_h;
    uint8_t x_gyro_l;
    uint8_t y_gyro_h;
    uint8_t y_gyro_l;
    uint8_t z_gyro_h;
    uint8_t z_gyro_l;
  } reg;

  struct {
    int x_accel;
    int y_accel;
    int z_accel;
    int temperature;
    int x_gyro;
    int y_gyro;
    int z_gyro;
  } value;
};



void setup() {
  int error;
  uint8_t c;

  Serial.begin(9600);
  Wire.begin();
  BTSerial.begin(9600);  // set the data rate for the BT port

  // default at power-up:
  // Gyro at 250 degrees second
  // Acceleration at 2g
  // Clock source at internal 8MHz
  // The device is in sleep mode.
  //
  error = MPU6050_read (MPU6050_WHO_AM_I, &c, 1);
  Serial.print(F("WHO_AM_I : "));
  Serial.print(c,HEX);
  Serial.print(F(", error = "));
  Serial.println(error,DEC);

  // According to the datasheet, the 'sleep' bit
  // should read a '1'. But I read a '0'.
  // That bit has to be cleared, since the sensor
  // is in sleep mode at power-up. Even if the
  // bit reads '0'.
  error = MPU6050_read (MPU6050_PWR_MGMT_2, &c, 1);
  Serial.print(F("PWR_MGMT_2 : "));
  Serial.print(c,HEX);
  Serial.print(F(", error = "));
  Serial.println(error,DEC);

  // Clear the 'sleep' bit to start the sensor.
  MPU6050_write_reg (MPU6050_PWR_MGMT_1, 0);

  initBuffer();
}

void loop() {
  curSensoredTime = millis();

  // Read from sensor
  if(curSensoredTime - prevSensoredTime > SENSOR_READ_INTERVAL) {
    readFromSensor();  // Read from sensor
    prevSensoredTime = curSensoredTime;

    // Send buffer data to remote
    if(iAccelIndex >= ACCEL_BUFFER_COUNT - 3) {
      sendToRemote();
      initBuffer();
      Serial.println("------------- Send 20 accel data to remote");
    }
  }
}

/**************************************************
 * BT Transaction
 **************************************************/
void sendToRemote() {
  // Write gabage bytes
  BTSerial.write( "accel" );
  // Write accel data
  BTSerial.write( (char*)aAccelBuffer );
  // Flush buffer
  //BTSerial.flush();
}

/**************************************************
 * Read data from sensor and save it
 **************************************************/
void readFromSensor() {
  int error;
  double dT;
  accel_t_gyro_union accel_t_gyro;

  error = MPU6050_read (MPU6050_ACCEL_XOUT_H, (uint8_t *) &accel_t_gyro, sizeof(accel_t_gyro));
  if(error != 0) {
    Serial.print(F("Read accel, temp and gyro, error = "));
    Serial.println(error,DEC);
  }

  // Swap all high and low bytes.
  // After this, the registers values are swapped,
  // so the structure name like x_accel_l does no
  // longer contain the lower byte.
  uint8_t swap;
  #define SWAP(x,y) swap = x; x = y; y = swap
  SWAP (accel_t_gyro.reg.x_accel_h, accel_t_gyro.reg.x_accel_l);
  SWAP (accel_t_gyro.reg.y_accel_h, accel_t_gyro.reg.y_accel_l);
  SWAP (accel_t_gyro.reg.z_accel_h, accel_t_gyro.reg.z_accel_l);
  SWAP (accel_t_gyro.reg.t_h, accel_t_gyro.reg.t_l);
  SWAP (accel_t_gyro.reg.x_gyro_h, accel_t_gyro.reg.x_gyro_l);
  SWAP (accel_t_gyro.reg.y_gyro_h, accel_t_gyro.reg.y_gyro_l);
  SWAP (accel_t_gyro.reg.z_gyro_h, accel_t_gyro.reg.z_gyro_l);

  // Print the raw acceleration values
  Serial.print(F("accel x,y,z: "));
  Serial.print(accel_t_gyro.value.x_accel, DEC);
  Serial.print(F(", "));
  Serial.print(accel_t_gyro.value.y_accel, DEC);
  Serial.print(F(", "));
  Serial.print(accel_t_gyro.value.z_accel, DEC);
  Serial.print(F(", at "));
  Serial.print(iAccelIndex);
  Serial.println(F(""));

  if(iAccelIndex < ACCEL_BUFFER_COUNT && iAccelIndex > 1) {
    int tempX = accel_t_gyro.value.x_accel;
    int tempY = accel_t_gyro.value.y_accel;
    int tempZ = accel_t_gyro.value.z_accel;
    /*
    // Check min, max value
    if(tempX > 16380) tempX = 16380;
    if(tempY > 16380) tempY = 16380;
    if(tempZ > 16380) tempZ = 16380;

    if(tempX < -16380) tempX = -16380;
    if(tempY < -16380) tempY = -16380;
    if(tempZ < -16380) tempZ = -16380;

    // We dont use negative value
    tempX += 16380;
    tempY += 16380;
    tempZ += 16380;
    */
    char temp = (char)(tempX >> 8);
    if(temp == 0x00)
      temp = 0x7f;
    aAccelBuffer[iAccelIndex] = temp;
    iAccelIndex++;
    temp = (char)(tempX);
    if(temp == 0x00)
      temp = 0x01;
    aAccelBuffer[iAccelIndex] = temp;
    iAccelIndex++;

    temp = (char)(tempY >> 8);
    if(temp == 0x00)
      temp = 0x7f;
    aAccelBuffer[iAccelIndex] = temp;
    iAccelIndex++;
    temp = (char)(tempY);
    if(temp == 0x00)
      temp = 0x01;
    aAccelBuffer[iAccelIndex] = temp;
    iAccelIndex++;

    temp = (char)(tempZ >> 8);
    if(temp == 0x00)
      temp = 0x7f;
    aAccelBuffer[iAccelIndex] = temp;
    iAccelIndex++;
    temp = (char)(tempZ);
    if(temp == 0x00)
      temp = 0x01;
    aAccelBuffer[iAccelIndex] = temp;
    iAccelIndex++;
  }

  // The temperature sensor is -40 to +85 degrees Celsius.
  // It is a signed integer.
  // According to the datasheet:
  // 340 per degrees Celsius, -512 at 35 degrees.
  // At 0 degrees: -512 - (340 * 35) = -12412
//  Serial.print(F("temperature: "));
//  dT = ( (double) accel_t_gyro.value.temperature + 12412.0) / 340.0;
//  Serial.print(dT, 3);
//  Serial.print(F(" degrees Celsius"));
//  Serial.println(F(""));

  // Print the raw gyro values.
//  Serial.print(F("gyro x,y,z : "));
//  Serial.print(accel_t_gyro.value.x_gyro, DEC);
//  Serial.print(F(", "));
//  Serial.print(accel_t_gyro.value.y_gyro, DEC);
//  Serial.print(F(", "));
//  Serial.print(accel_t_gyro.value.z_gyro, DEC);
//  Serial.println(F(""));
}

/**************************************************
 * MPU-6050 Sensor read/write
 **************************************************/
int MPU6050_read(int start, uint8_t *buffer, int size)
{
  int i, n, error;

  Wire.beginTransmission(MPU6050_I2C_ADDRESS);

  n = Wire.write(start);
  if (n != 1)
    return (-10);

  n = Wire.endTransmission(false); // hold the I2C-bus
  if (n != 0)
    return (n);

  // Third parameter is true: relase I2C-bus after data is read.
  Wire.requestFrom(MPU6050_I2C_ADDRESS, size, true);
  i = 0;
  while(Wire.available() && i<size)
  {
    buffer[i++]=Wire.read();
  }
  if ( i != size)
    return (-11);
  return (0); // return : no error
}

int MPU6050_write(int start, const uint8_t *pData, int size)
{
  int n, error;

  Wire.beginTransmission(MPU6050_I2C_ADDRESS);

  n = Wire.write(start); // write the start address
  if (n != 1)
    return (-20);

  n = Wire.write(pData, size); // write data bytes
  if (n != size)
    return (-21);

  error = Wire.endTransmission(true); // release the I2C-bus
  if (error != 0)
    return (error);
  return (0); // return : no error
}

int MPU6050_write_reg(int reg, uint8_t data)
{
  int error;
  error = MPU6050_write(reg, &data, 1);
  return (error);
}


/**************************************************
 * Utilities
 **************************************************/
void initBuffer() {
  iAccelIndex = 2;
  for(int i=iAccelIndex; i<ACCEL_BUFFER_COUNT; i++) {
    aAccelBuffer[i] = 0x00;
  }
  aAccelBuffer[0] = 0xfe;
  aAccelBuffer[1] = 0xfd;
  aAccelBuffer[122] = 0xfd;
  aAccelBuffer[123] = 0xfe;
  aAccelBuffer[124] = 0x00;
}

This is the error I got in serial monitor:

    WHO_AM_I : 0, error = 2
PWR_MGMT_2 : 0, error = 2
Read accel, temp and gyro, error = 2
accel x,y,z: -26357, -26367, -3840, at 2
Read accel, temp and gyro, error = 2
accel x,y,z: -26357, -26367, 31488, at 8
Read accel, temp and gyro, error = 2
accel x,y,z: 2969, 409, 123, at 14
Read accel, temp and gyro, error = 2
accel x,y,z: -26357, -26367, 31488, at 20
Read accel, temp and gyro, error = 2
accel x,y,z: 2969, 409, 123, at 26
Read accel, temp and gyro, error = 2
accel x,y,z: -26357, -26367, 31488, at 32
Read accel, temp and gyro, error = 2
accel x,y,z: 2969, 409, 123, at 38
Read accel, temp and gyro, error = 2
accel x,y,z: -26357, -26367, 31488, at 44
Read accel, temp and gyro, error = 2
accel x,y,z: 2969, 409, 123, at 50
Read accel, temp and gyro, error = 2
accel x,y,z: -26357, -26367, 31488, at 56
Read accel, temp and gyro, error = 2
accel x,y,z: 2969, 409, 123, at 62
Read accel, temp and gyro, error = 2
accel x,y,z: -26357, -26367, 31488, at 68
Read accel, temp and gyro, error = 2
accel x,y,z: 2969, 409, 123, at 74
Read accel, temp and gyro, error = 2
accel x,y,z: -26357, -26367, 31488, at 80
Read accel, temp and gyro, error = 2
accel x,y,z: 2969, 409, 123, at 86
Read accel, temp and gyro, error = 2
accel x,y,z: -26357, -26367, 31488, at 92
Read accel, temp and gyro, error = 2
accel x,y,z: 2969, 409, 123, at 98
Read accel, temp and gyro, error = 2
accel x,y,z: -26357, -26367, 31488, at 104
Read accel, temp and gyro, error = 2
accel x,y,z: 2969, 409, 123, at 110
Read accel, temp and gyro, error = 2
accel x,y,z: -26357, -26367, 31488, at 116

I’m not too good at Arduino, and any help will be immensely appreciated.

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Wipefs error dev sdb probing initialization failed device or resource busy
  • Wipe data error
  • Winzip self extractor header corrupt ошибка как исправить
  • Winzip self extractor header corrupt possible cause bad disk or file transfer error
  • Winx club ошибка msvcp71 dll решение

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии