Arduino Loop перестает работать, как только включается питание

power loop

Я использую датчик ночного видения MU, который должен приводить в действие шаговый двигатель. Код датчика зрения MU работает. В тот момент, когда я включаю питание для питания шагового двигателя, код останавливается. Я отключил все провода, соединяющие шаговый двигатель с Arduino.... Это все еще останавливает код.

Честно говоря, я не на 100% уверен, что значение fps для датчика MU, но когда он работает, значение остается между 18 и 20. В тот момент, когда я включаю питание источника питания, это значение подскакивает до 500 или 1000, и он останавливается.

Я использую оригинальный Arduino Mega, питающийся через USB от моего КОМПЬЮТЕРА. Нет никакой связи между шаговым двигателем и Arduino. Ниже приведен пример моего кода, но я почему-то не думаю, что это ошибка кода, я думаю, что это какая-то электрическая помеха, может быть?

Дополнительная информация :

Я использую проводку и настройки, как указано на : https://wiki.dfrobot.com/MU_Vision_Sensor_SKU:%20SEN0314#target_3

  1. Датчик Mu Vision работает сам по себе (используя их пример кода) - так что проводка правильная

  2. У меня нет никаких дополнительных проводов, подключенных к Arduino, только USB-кабель от ПК

  3. Последние две строки кода печатают "fps =" и значение.... Когда он работает плавно, он всегда составляет fps=18 (примерно до 20) - когда источник питания включен, он прыгает до fps=500 ... fps=1000, а затем останавливается. Так что это похоже на электрическое вмешательство во внутренние часы.

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

  5. Я собираюсь проверить сейчас на ESP32 и посмотреть, является ли он все еще тем же самым. Я уже переключился с Arduino Mega на UNO и все еще имею тот же результат (сделал это и то же самое происходит с ESP32 - кроме того, ESP32 в основном перезагружается и пытается снова, поэтому код продолжает работать)

  6. Наконец... Я добавил мигающий светодиод, чтобы посмотреть, будет ли он работать, когда код остановится, но светодиод тоже перестанет мигать.

/*
****************************************************
  @brief MU Vision Sensor

   @copyright    [DFRobot](https://www.dfrobot.com), 2016
   @copyright    GNU Lesser General Public License

  @author [WWZ]([email protected])
  @version  V1.0
  @date  2019-03-11

  GNU Lesser General Public License.
  All above must be included in any redistribution
* ***************************************************
*/

#include <Wire.h>

#define MU_ADDRESS    0x60
#define PROTOCOL_VER  0x03
#define VISION_ID     0x05      // body

// register define
#define REG_PROTOCOL_VER  0x01
#define REG_LED1_CONF     0x06
#define REG_LED2_CONF     0x07
#define REG_LED_LEVEL     0x08
#define REG_CAMERA_CONF1  0x10
#define REG_FRAME_CNT     0x1F
#define REG_VISION_ID     0x20
#define REG_VISION_CONF1  0x21
#define REG_PARAM_VALUE5  0x29
#define RESULT_NUM        0x34
#define RESULT_DATA1      0x40
#define RESULT_DATA2      0x41
#define RESULT_DATA3      0x42
#define RESULT_DATA4      0x43
#define RESULT_DATA5      0x44
// color
#define MU_COLOR_BLACK                0x01U
#define MU_COLOR_WHITE                0x02U
#define MU_COLOR_RED                  0x03U
#define MU_COLOR_YELLOW               0x04U
#define MU_COLOR_GREEN                0x05U
#define MU_COLOR_CYAN                 0x06U
#define MU_COLOR_BLUE                 0x07U
#define MU_COLOR_PURPLE               0x08U

// Define Stepper pins

int reverseSwitch = 2;  // Push button for reverse
int driverDIR = 6;    // DIR+ pin
int driverPUL = 7;    // PUL+ pin


// Variables

int pd = 800;       // Pulse Delay period
boolean setdir = HIGH; // Set Initial Direction
int stepsTaken = 0;

int i2c_read8(uint8_t reg) {
  Wire.beginTransmission(MU_ADDRESS);
  Wire.write(reg);
  Wire.endTransmission();

  Wire.requestFrom(MU_ADDRESS, 1);
  return Wire.read();
}
void i2c_write8(const uint8_t reg, const uint8_t value) {
  Wire.beginTransmission(MU_ADDRESS);
  Wire.write(reg);
  Wire.write(value);
  Wire.endTransmission();
}

uint8_t reg[][2] = {
  { REG_VISION_ID,      VISION_ID }, // set vision type = vision_detect
  { REG_VISION_CONF1,   0x21 }, // vision begin
};
uint8_t frame_count_last = 0;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  //pinMode (driverPUL, OUTPUT);
  //pinMode (driverDIR, OUTPUT);
  //attachInterrupt(digitalPinToInterrupt(reverseSwitch), revmotor, FALLING);

  Wire.begin();
  delay(500);

  if (i2c_read8(REG_PROTOCOL_VER) == PROTOCOL_VER) {
    Serial.println("device initialized.");
  } else {
    Serial.println("fail to initialize device! Please check protocol version.");
  }
  for (uint32_t i = 0; i < sizeof(reg) / 2; ++i) {
    i2c_write8(reg[i][0], reg[i][1]);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  long time_start = millis();
  int frame_count = 0;
  // waiting for update
  do {
    frame_count = i2c_read8(REG_FRAME_CNT);
  } while (frame_count == frame_count_last);
  frame_count_last = frame_count;

  i2c_write8(REG_VISION_ID, VISION_ID);
  // read result
  if (i2c_read8(RESULT_NUM) > 0) {
    Serial.println("body detected:");
    Serial.print("y = ");
  } else {
    Serial.println("body undetected.");
  }
  Serial.print("fps = ");
  Serial.println(1000 / (millis() - time_start));
  Serial.println();
}

, 👍-1

Обсуждение

"код останавливается" Останавливается где?, @timemage

` Я отсоединил все провода"... тогда проблема не в этом, @jsotola

Пожалуйста, добавьте схему и/или изображение проводки. Если вы правы, что это скорее электрическая проблема, чем код, то кода самого по себе недостаточно, чтобы люди могли вам помочь. // Я мог бы переместить time_start в глобальный и обновить его с помощью frame count и fps calc перед i2c_write, чтобы он не зависел от loop() // Может быть, потребление энергии заставляет датчик перестать посылать кадры?, @Dave X

обычный подозреваемый-I2C... Это единственная вещь без каких-либо тайм-аутов в нем, и он довольно восприимчив к тупикам, @KIIV

вы отключили провода заземления и vcc? Я уверен, что ваш степпер притягивает слишком много тока и снижает напряжение MCU, даже на короткое время, до точки, когда он выходит из строя., @dandavis

@Dave X - Честно говоря, я не уверен, для чего нужен весь fps calc. НУЖНО ли это вообще? Это часть примерного кода датчика MU Vision Sensor, и документация не очень хорошая., @Heinrich Helmbold

Я добавил больше информации в оригинальном посте об этой проблеме. Я также обнаружил, что это, по-видимому, шаговый драйвер. Когда я отключаю его от источника питания и просто включаю источник питания, код продолжает работать. (опять... все провода отсоединены от Arduino - он работает полностью независимо, и я отодвинул Arduino примерно на метр от шагового драйвера, и он все еще мешает), @Heinrich Helmbold


1 ответ


1

Это не решает проблему, но на данный момент она "исправлена". На интерфейсе I2C драйвер stepper взаимодействует с микроконтроллером, и это должны быть какие-то электрические помехи, если я отключаю шаговый двигатель от драйвера stepper, то он работает. (Просто повторяю... НИЧТО не подключается к Arduino от шагового драйвера или шагового двигателя - так что это чисто электрические / магнитные помехи)

Мне удалось заставить датчик MU работать на UART вместо I2C, и кажется, что здесь нет помех, и он продолжает работать.... скрещенные пальцы

,