Зависает Ардуино. Одновременно с I2C и Потенциометром

Подключаю отдельно потенциометр всё нормально. Включаю передачу по I2C всё нормально. Но если передавать по I2C и вертеть потенциометром, то ближе к крайним точкам потенциометра ардуино зависает. Распаковал новую специально чтобы проверить. Ведёт себя так же.

Что можете посоветовать?

Подключаю Потенциометр 5v, A5, Gnd

код I2C стандартный:
Wire.beginTransmission(8); // Адрес устройства
Wire.write(loadTape); // Отправляем значение loadTape
Wire.write(mHome); // Отправляем значение mHome
Wire.endTransmission(); // Завершение передачи

Для начала - предоставить схему «сего безобразия».

И код, а не огрызок

Код Мастера:

#include <Wire.h>

bool loadTape = true;
bool mHome = false;
byte error;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  Serial.println("I am I2C Master");
  pinMode(A0,INPUT);
}

void loop() {
  Master_Loop();
  delay(150);
}

void Master_Loop() {
 
  Wire.beginTransmission(8); // Адрес устройства
  Wire.write(loadTape);      // Отправляем значение loadTape
  Wire.write(mHome);         // Отправляем значение mHome
  error = Wire.endTransmission(); // Завершение передачи

  if (error == 0) {
    // Serial.println("Успешная передача");
  } else {
    Serial.print("Ошибка: ");
    Serial.println(error);
  }

  Serial.println(analogRead(A0));
}

Код ведомого

#include <Wire.h>
void setup() {
 Wire.begin(8);                /* join i2c bus with address 8 */
 Wire.onReceive(receiveEvent); /* register receive event */
 Serial.begin(9600);           /* start serial comm. */
 Serial.println("I am I2C Slave");
}
void loop() {
 delay(150);
}

void receiveEvent(int howMany) {
 while (0 <Wire.available()) {
    char c = Wire.read();      /* receive byte as a character */
    Serial.print(c);           /* print the character */
  }
}

подключаю по такой схеме

Мастер и ведомый соединены SDA к SDA и SCL к SCL, GND к GND

PS.Ах да через резисторы 5Ком SDA и SCL подтянуты к питанию 5v.

перепутали среднюю точку потенциометра с одной из крайних?

1 лайк

Интересно, какой “character” вы планируете получить, если вы с мастера отправляете true и false?

А в коде и на картинке A0

Не верю. Что именно “нормально” у вас с таким кодом? Где передача значений потенциометра по I2c ?
Или, что более вероятно, на форум вы слили не свой настоящий код, а какую-то дурилку.

Выложите реальный код, чтобы было, что обсуждать.

Обновляю код для ведомого. На самом деле он не важен. Без Потенциометра всё работает.

#include <Wire.h>
void setup() {
 Wire.begin(8);                /* join i2c bus with address 8 */
 Wire.onReceive(receiveData); /* register receive event */
 Serial.begin(9600);           /* start serial comm. */
 Serial.println("I am I2C Slave");
}
void loop() {
 delay(150);
}

void receiveData(int howMany) {
  if (Wire.available() >= 2) {
    bool loadTape = Wire.read(); // Получаем значение loadTape
    bool mHome = Wire.read();    // Получаем значение mHome

    Serial.print("LoadTape: ");
    Serial.println(loadTape ? "true" : "false");
    Serial.print("MHome: ");
    Serial.println(mHome ? "true" : "false");
  }
}

Проверял и на А5 и на А0, код поправил под схему.

Это простой код c сети чуть видоизменённый. Исходный проект огромный и с трудом на Uno помещается. Разве есть смысл выкладывать гкод не отформатированный и не оптимизированный если проблема проявляется и с двумя строками кода с включенным I2C и замкнутым A0 на GND или 5V? :slight_smile:

Висит то где ? Что в логе ???

Ок, в том что вы верно определили средний контакт потенциометра - уверены? Или может потенциометр просто криво сделан и замыкает в крайних положениях. Возьмите DMM и прозвоните.
Это первое, что приходит в голову.

Строка кода выводит сигнал с контакта А0 каждую итерацию.
Serial.println(analogRead(A0));
Если замкнуть А0 на Gnd или на 5v то вывод в порт останавливается, передача по I2C останавливается, если подождать чуть то зависает, если раньше секунды отсоединить контакт от А0 то работа продолжается.

Потенциометр точно не причём, потому что при работе I2C просто замкнув контакт А0 на Gnd или 5V дуина зависает. :slight_smile:



Если у кого то есть возможность повторить, то интересно узнать работает ли у вас.

С тем же кодом?

Добавьте в код вывод отладочной инфы после каждой строки мастера … надо понять где точно висит.

1 лайк

Возможно я чего то не знаю? Есть какой то способ проводить отладку кроме Serial.print? :smiley:

Да, если закомментировать I2C то выводится информация о аналоговом входе (соедини его хоть к 5V хоть к GND). Если не трогать аналоговый вход то код I2C отрабатывает нормально.

Если я правильно понял вы про это.

  Serial.println("Step_1");
  Wire.beginTransmission(8); // Адрес устройства
  Serial.println("Step_2");
  Wire.write(loadTape);      // Отправляем значение loadTape
  Serial.println("Step_3");
  Wire.write(mHome);         // Отправляем значение mHome
  Serial.println("Step_4");
  error = Wire.endTransmission(); // Завершение передачи
  Serial.println("Step_5");

Всегда выводит шаг_4 и зависает.

А зачем I2C и потенциометр на один и тот же пин? Чтобы зависало?

1 лайк

Я возможно не знаю разводку платы. А5 и А4 запараллелены с I2C (SDA, SCL) ?

Всё ясно… :confused:

Что значит “запараллелены”? Это именно они и есть! А4 - это SDA, а A5 - SCL

1 лайк

Может надо подключать : Подключаю Потенциометр 5v, A0, Gnd
Если по вашему то вы SCL шунтируете !!!

Не знаю, в стартовом сообщении

Я оттуда взял.

Теперь понимаю что будет работать с А0. У меня в проекте к А0 и А5 подключены потенциометры. Но какой именно из двух не понятно, длинные запутанные провода, я месяца два назад собирал, уже забыл. Поэтому не концентрировал внимание А5 или А0… Теперь понятно что это был важный момент.