Проблема связи I2C с двумя ведомыми устройствами (atlas Scientific) и одним Nano (официальным)
Я работаю над проектом, используя Arduino Nano (официальный) и два периферийных устройства от Atlas Scientific (pH и DO), обменивающихся данными через i2c. Все работает нормально, когда я использую питание USB, подключенное к ПК или к адаптеру 5 В (обычно зарядное устройство для телефона).
Я хочу использовать батарею 12 В и адаптер 12 В постоянного тока 1,5 А для питания моей системы, но проблема в том, что некоторое время (от 30 до 40 секунд) она работает нормально, а затем у pH начинаются проблемы со связью и светодиод становится красным, а светодиоды TX / RX от Arduino (которые ни к чему не подключены) начинают сходить с ума. Я использую подтягивающие резисторы 4,7 кОм и регулятор напряжения L7805ACV для перехода от 12 к 5 В.
Прикрепите часть схемы системы.
Если у вас есть какие-либо идеи, начинаю терять идеи
EDIT: Вот часть программы, касающаяся связи i2c:
#include "Wire.h"
/*********************************************************************************************************
* Address
*********************************************************************************************************
*/
int pH_address = 99;
int DO_address = 97;
/*********************************************************************************************************
* i2C CONFIGURATION
*********************************************************************************************************
*/
byte received_from_computer = 0;
char sensor_data[20];
byte in_char_sensor = 0;
byte j = 0;
byte code = 0;
int time_ = 850;
void setup()
{
Wire.begin();
}
void loop()
{
pH = Get_i2C(pH_address);
delay(200);
DO = Get_i2C(DO_address);
delay(200);
}
/**********************************************************************************************************
* i2C
* ********************************************************************************************************
*/
float Get_i2C(int address)
{
char computerdata = 'R';
Wire.beginTransmission(address);
Wire.write(computerdata);
Wire.endTransmission();
delay(time_);
Wire.requestFrom(address, 16, 1);
code = Wire.read();
while (Wire.available())
{
in_char_sensor = Wire.read();
sensor_data[j] = in_char_sensor;
j += 1;
if (in_char_sensor == 0)
{
j = 0;
break;
}
}
return atof(sensor_data);
}
1 ответ
Лучший ответ:
Две идеи.
1: Подсчитайте свои основания. Если вы считаете больше 1, у вас проблемы. В вашей системе должно быть единое заземление, поэтому ЛЮБОЕ соединение на каждом компоненте с маркировкой GND должно быть подключено к земле.
Причина, по которой множественное заземление является проблемой, заключается в том, что ваши сигналы (кроме дифференциальных сигналов) измеряются относительно земли, поэтому, если два компонента имеют разные представления о том, что такое «земля», они начинают расходиться во мнениях относительно того, что составляет 1 и 0.
2: Выберите источник питания. Убедитесь, что ваш источник питания 5 В по-прежнему обеспечивает 5 В. Возможно (хотя и маловероятно), что L7805ACV не может обеспечить достаточный ток, и ваша система выходит из строя. Если возможно, посмотрите с помощью осциллографа, чтобы проверить наличие шума в источнике питания 5 В.
На ваших платах уже должны быть развязывающие конденсаторы, но добавление еще одного не повредит, поэтому попробуйте также добавить конденсатор 0,1 мкФ между 5 В и GND, чтобы устранить любые помехи.
- Как перевести Arduino Nano в спящий режим с низким энергопотреблением (<0,05 мА)
- MAX30100 не работает
- Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
- Библиотека I2C MIFARE RC522
- Не удалось выделить SSD1306 при добавлении константы
- Сброс адреса I2c — MLX90614
- SSD1306 распознается сканером I2C, но не может его отобразить
- Могу ли я соединить вместе несколько плат Arduino Nano ?
Спасибо за ваш ответ. Для первой идеи: каждая земля соединена вместе. Что касается второго, я тоже об этом подумал, поэтому теперь я питаю свой nano от 12 В для адаптера, а два i2C являются источниками питания с 5 В от nano. Остальное CO2 + HC05 с 5V L7805ACV., @Hugo Vernier-Lambert
И все еще есть проблема ... я могу попробовать добавить развязывающий конденсатор. Что-то действительно странное заключается в том, что светодиоды TX / RX начинают мигать, но к ним ничего не подключено, когда возникает проблема., @Hugo Vernier-Lambert
@HugoVernier-Lambert Это действительно странно. Все, что я могу предложить, это удалять детали, пока вы не увидите решение проблемы. Это может, по крайней мере, дать вам представление о том, в какой части может быть проблема. В противном случае исследуйте каждый сигнал. Вы также можете предоставить нам копию своего кода. Звучит маловероятно, но что-то там может быть., @ForgeMonkey
Я отредактировал вопрос с помощью программы i2c., @Hugo Vernier-Lambert
Я попытался добавить немного развязывающего конденсатора или перейти с 5 В Arduino на 3,3 В, у которого уже больше развязывающего конденсатора, чем у 5 В, но ничего, все та же проблема., @Hugo Vernier-Lambert
Проблема связана с модулем pH (красный), но я прокомментировал периферийное устройство DO i2C, и модуль pH работал нормально при любом источнике питания. И то же самое, если я прокомментирую периферийное устройство pH i2C, DO работает нормально. Проблема в том, что я использую его "одновременно", на самом деле один за другим, но оба подключены и используются программой., @Hugo Vernier-Lambert
Обсуждая проблему с другим инженером-электронщиком, он сказал мне, что L7805ACV перегревается, вызывая некоторое падение напряжения, что приводит к перезагрузке Arduino снова и снова. И поскольку светодиоды TX/RX мигают один раз при перезагрузке при запуске, мы видим, что они мигают все быстрее и быстрее. Я попытаюсь получить радиатор, чтобы охладить этот регулятор напряжения., @Hugo Vernier-Lambert