Arduino 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
Датчик Mu Vision работает сам по себе (используя их пример кода) - так что проводка правильная
У меня нет никаких дополнительных проводов, подключенных к Arduino, только USB-кабель от ПК
Последние две строки кода печатают "fps =" и значение.... Когда он работает плавно, он всегда составляет fps=18 (примерно до 20) - когда источник питания включен, он прыгает до fps=500 ... fps=1000, а затем останавливается. Так что это похоже на электрическое вмешательство во внутренние часы.
Опять... шаговый двигатель работает полностью независимо от Arduino с точки зрения источника питания, и для этого теста у меня нет проводов, подключенных к Arduino, и весь код шагового двигателя был удален.
Я собираюсь проверить сейчас на ESP32 и посмотреть, является ли он все еще тем же самым. Я уже переключился с Arduino Mega на UNO и все еще имею тот же результат (сделал это и то же самое происходит с ESP32 - кроме того, ESP32 в основном перезагружается и пытается снова, поэтому код продолжает работать)
Наконец... Я добавил мигающий светодиод, чтобы посмотреть, будет ли он работать, когда код остановится, но светодиод тоже перестанет мигать.
/*
****************************************************
@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();
}
@Heinrich Helmbold, 👍-1
Обсуждение1 ответ
Это не решает проблему, но на данный момент она "исправлена". На интерфейсе I2C драйвер stepper взаимодействует с микроконтроллером, и это должны быть какие-то электрические помехи, если я отключаю шаговый двигатель от драйвера stepper, то он работает. (Просто повторяю... НИЧТО не подключается к Arduino от шагового драйвера или шагового двигателя - так что это чисто электрические / магнитные помехи)
Мне удалось заставить датчик MU работать на UART вместо I2C, и кажется, что здесь нет помех, и он продолжает работать.... скрещенные пальцы
- Какое максимальное энергопотребление Arduino Nano 3.0?
- Питание светодиодной ленты - Сколько ампер?
- Как запомнить значения переменных после перезагрузки платы Arduino Uno R3
- Power Bank самопроизвольно отключается
- Как я могу запитать Arduino Nano от батареи LiPo, желательно 3,7 В
- Если USB дает 5 В, как Arduino может подавать 5 В на контакт 5 В? (И еще вопрос)
- Могу ли я иметь резервное питание для устройства Arduino?
- Клон Digispark не распознается при подключении
"код останавливается" Останавливается где?, @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