Как выяснил нормальной библиотеки для обмена информацией между ардуино не существует.
Стандартная Wire.h зависает когда не получит ответа.
А сторонние типа I2C.h, работают только на прием, на передачу увы никак.
Неужели спрос на данный тип передачи данных настолько мал, что никто не переписал библиотеку или не поправил библиотеку Wire.h.
Может совместными усилиями напишем свою библиотеку, на прием и передачу данных.
LytYS написал(а):
зависает когда не получит ответа.
Нажмите для раскрытия…
Функции блокирующие.
I2C dev?
Un_ka написал(а):
I2C dev?
Нажмите для раскрытия…
Не разобрался как использовать для обмена информацией 2-х ардуино, есть примеры?
Поискал -«i2c no block arduino»
Нашёл вот такую. Заявляется, что она не блокирующие методы использует.
Там примеры как раз есть.
Реакции:
kostyamat, Старик Похабыч и LytYS
Un_ka написал(а):
Поискал -«i2c no block arduino»
Нашёл вот такую. Заявляется, что она не блокирующие методы использует.
Там примеры как раз есть.Нажмите для раскрытия…
Супер это то что нужно, библиотека действительно рабочая, Спасибо огромное.
В недрах Wiring есть базовая часть twi.h, twi.c — вполне нормальный пакет для I2C работающий на базе аппаратного драйвера. Есть в моей теме «Ардуино как лего» в проектах, выложенная реализация полноценного драйвера, работающего без Wiring вообще, способного работать в стиле автоматного программирования, кроме того, его ещё можно и собирать под нужды, размер зависит только от количества подключенных режимов, скорость передачи до 880кГц включительно .
Arhat109 написал(а):
скорость передачи до 880кГц
Нажмите для раскрытия…
Это не скорость передачи, как таковая. Это частота SCL.
Un_ka написал(а):
Это не скорость передачи, как таковая. Это частота SCL.
Нажмите для раскрытия…
Пока на шине один slave все работает, но стоит добавить устройств и ESP8266 начинает виснуть с перезагрузкой. Либа wire.h иногда не корректно завершает чтение, а slave не закончив передачу вешает SDA на землю и ждет от мастера SCL, чтоб отдать оставшийся кусок байта. Драйвер написан так, что он об этом ничего не знает и начинает передавать на этот или следующий slave новое сообщение. Устройства ничего не получают тк наш slave удерживает SDA. Либа ничего не получив начинает растягивать SCL. Когда растягивать уже некуда, главный цикл встает колом. Через ~3 секунды, после остановки loop(), срабатывает WDT и модуль перегружается.
Arduino сообщество и модераторы форума esp8266.ru морозились:
Такое чувство, что они все на заплате у Espressif. Помучившись нескольких месяцев и покурив официальный datasheet на i2c переписал драйвер и библиотеку обертку под Arduino. Теперь ничего не виснет и работает стабильно. Тестировал на скоростях шины 10KHz, 15KHz, 25KHz, 50KHz 100KHz, 200KHz, 250KHz, 300KHz, 400kHz и частоте камня 80MHz.
Забирать тут.
UDP: Официальный стандарт на i2c шину здесь.
UDP2: Народ разучился читать read.me поэтому продублирую тут.
Скопируйте и замените twi.h и core_esp8266_si2c.cpp в папке %USERPROFILE%\AppData\Local\Arduino15\pa
Скопируйте и замените Wire.h и Wire.cpp в папке %USERPROFILE%\AppData\Local\Arduino15\pa
Цифры 2.5.2 могут отличаться, зависят от версии установленного ядра. Заменить значит удалить старый и на его место записать новый. Если вы хотите сохранить исходные файлы — просто измените расширение файла например так — twi.h.OLD и т. д. Если изменить только имя файла, вы получите ошибку во время компиляции. Потому что линковщик работает с тем что внутри файлов *.h и *.cpp, а не с именами. Это вам не windows!!!
UDP3: Похоже многие свалились с луны и не знают, что для нормальной работы i2c шины линии SDA и SCL должны быть подтянуты к питанию. Почему, читаем тут и тут.
UDP4: Для сенсорных панелей и длинных проводов добавил кучу медленных скоростей: 10KHz, 15KHz, 25KHz, 50KHz. Парочку быстрых для разгона: 250KHz, 300KHz, 600KHz. Например экран на PCF8574 легко взял отметку в 600KHz. Скорость меняется так — Wire.setClock(15000), где число в герцах. По умолчанию, библиотека не получив вовремя ответ, начинает растягивать SCL до 250 микросекунд, временно уменьшая частоту до 4KHz. По совету gihub юзера добавил нулевой значение. Теперь если в setup() сразу после декларации ВСЕХ устройств на I2C вписать Wire.setClockStretchLimit(
Tags: #arduino, #esp8266, arduino, esp8266
Subscribe
Arduino наконец выкатили финалочку Arduino IDE 2.0. Я повелся, снес предыдущий релиз и долго матерился. Оказывается все предыдущие plugin не…
Пишу библиотеку для CM1107. Хочу прикрутить к CO2Meter. Брал когда-то б/у за $5 на алишечке. Как и SCD30 тоже двухлучевой, на этом сходства…
Потихоньку прикручиваю Sensirion SCD30. В этот раз отказался от тормозного Chart.js в пользу легкого и быстрого dygraphs. Судя по графику, щелей…
Photo
Hint http://pics.livejournal.com/igrick/pic/000r1edq
Previous
← Ctrl
← Alt
Next
Ctrl →
Alt →
Arduino наконец выкатили финалочку Arduino IDE 2.0. Я повелся, снес предыдущий релиз и долго матерился. Оказывается все предыдущие plugin не…
Пишу библиотеку для CM1107. Хочу прикрутить к CO2Meter. Брал когда-то б/у за $5 на алишечке. Как и SCD30 тоже двухлучевой, на этом сходства…
Потихоньку прикручиваю Sensirion SCD30. В этот раз отказался от тормозного Chart.js в пользу легкого и быстрого dygraphs. Судя по графику, щелей…
23 просмотра (последние 30 дней)
7 ноября 2020 г.
Здравствуйте, в моем текущем проекте мне нужно разработать некоторые драйверы устройств для Arduino Due. Драйверы должны быть включены в библиотеку проводов, потому что устройства подключены к шине I2C Arduino Due. Каждый драйвер устройства должен быть собственным блоком Simulink с входами или выходами. Для этой части я уже нашел подробное пошаговое руководство (https://de.mathworks.com/matlabcentral/fileexchange/39).354-устройства-драйверы), что мне здорово помогает. Для моих требований я не могу использовать готовый блок I2C, который уже существует. Поэтому я должен сам реализовать интерфейс i2c. Я не знаю, какие библиотеки действительно необходимы. С #include Wire.h файлы не найдены. С помощью #include «../../libraries/Wire/Wire.h» в средстве просмотра диагностики появляются предупреждения, такие как: «предупреждение: неопределенная ссылка на `Wire'»
Может быть, у кого-то есть идея, какие библиотеки являются правильными один и где они расположены?
С уважением и благодарностью, Джулиан
Вы решили эту проблему? У меня тоже проблемы по этому поводу
У меня тоже такая же проблема, вы ее решили?
Спасибо
У меня возникла та же проблема, когда я пытался использовать драйвер для устройства IMU MPU6050 для Uno. Я обнаружил, что следующие файлы должны находиться на том же уровне папки, что и модель, которую вы пытаетесь запустить:
Wire.h
Wire.cpp
twi.h
twi.c
Раньше я хранил их в другой папке с помощью s-функции MPU6050 (хотя все еще в том же проекте и в пути)
Это не очень удовлетворительное решение хотя, возможно, есть параметр пути, который мне не хватает?
Произошла ошибка
Невозможно выполнить действие из-за изменений, внесенных на страницу. Перезагрузите страницу, чтобы увидеть ее обновленное состояние.
Выберите веб-сайт
Выберите веб-сайт, чтобы получить переведенный контент, где он доступен, и посмотреть местные события и предложения. В зависимости от вашего местоположения мы рекомендуем вам выбрать: .
Вы также можете выбрать веб-сайт из следующего списка:
Обратитесь в местный офис
но при компиляции я получаю
Compiling .pio\build\seeed_xiao\lib856\Adafruit GFX Library\Adafruit_GrayOLED. cpp.o
Compiling .pio\build\seeed_xiao\lib856\Adafruit GFX Library\glcdfont9 из .pio\libdeps\seeed_xiao\Adafruit BusIO/Adafruit_BusIO_Register.h:9:0,
из .pio\libdeps\seeed_xiao\Adafruit BusIO\Adafruit_BusIO_Register.cpp:1:
.pio\libdeps\seeed_xiao\Adafruit BusIO/ICDevice. h:5:10: фатальная ошибка: Wire.h: нет такого файла или каталога
Я включил майский заголовок в main.cpp
#include#include #include #include
, но никаких изменений не видно
почему не удается найти wire.h? видел другие подобные посты и пробовал шаги, предложенные
Дэвид
datkins47
#2
91.11.1 to lib_deps
и выполнение src/main.