ардуино уно зависает

Есть ли причина, по которой мой Arduino Uno зависает после нескольких минут работы при питании от USB-кабеля, подключенного к моему компьютеру?

#include <GY6050.h>
#include <Wire.h>
#include <VarSpeedServo.h>

#define angle1 20
#define angle2 90

#define Sensor_BL A0
#define Sensor_BR A1

VarSpeedServo servo;

GY6050 gyro1(0x68);
GY6050 gyro2(0x69);

int X = 0;
int Y = 0;

int y1_axis = 0;
int y2_axis = 0;

int sensorBL;
int sensorBR;

int speed = 0;
int angle = 0;

int prev_y1_axis = 0;
int y1_hold = 0;
unsigned long timer;
int start = 1;
byte step = 0;
String steps , laststep;
int freq;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  gyro1.initialisation();
  gyro2.initialisation();
  delay(100);
  servo.attach(8);
  servo.write(90);
}

void loop() {
  y1_axis = gyro1.refresh('A', 'Y');
  y2_axis = gyro2.refresh('A', 'Y');
  sensorBL = analogRead(Sensor_BL);
  sensorBR = analogRead(Sensor_BR);

  //0 справа - 90 по центру - 180 слева

  if (sensorBL > 250) {
    speed = map( sensorBL , 0 , 1023 , 0 , 255);
    if (sensorBL < 700) { //без давления 90+20=110
      servo.write(95 , speed);
      angle = 95;
    }
    else if (sensorBL > 700) { //дополнительно нажмите 90+90 = 180
      servo.write(105 , speed);
      angle = 105;
    }
  }
  else if (sensorBR > 250) {
    speed = map( sensorBR , 0 , 1023 , 0 , 255);
    if (sensorBR < 700) {
      servo.write(95 , speed);
      angle = 95;
    }
    else if (sensorBR > 700) {
      servo.write(105 , speed);
      angle = 105;
    }
  }
  else if ((start == 0 || millis() - timer > 800) && y1_axis > -90 && y1_axis < 20 && y2_axis > -90 && y2_axis < 20 && sensorBL < 10 && sensorBR < 20) //плоский тупик без движения сервопривода - центральное положение - можем ли мы разделить на разные линии датчик давления и ускорение, чтобы я мог установить мертвое конечное значение отдельно для датчика давления и акк ?
  {
    servo.write( 85 , 15);
    //Serial.println("Сервопривод обнуляется");
    start = 1;
    step = 0;
    angle = 0;
    steps = "0";
  }
  else if ((y1_axis < 60 & y1_axis >40) && (step == 0 || step == 2))
  {
    step = 1;
    steps = "1";
  }
  else if ((y2_axis < 55 & y2_axis > 40) && (step == 0 || step == 1))
  {
    step = 2;
    steps = "2";
  }

  if (!steps.equals(laststep)) {

    if ((step == 1 || step == 2) && millis() - timer <= 700) {
      if (freq > 1) {
        servo.write(70 , 20);
        angle = 70;
      }
      else {
        servo.write(78 , 20);
        angle = 78;
      }
      freq++;
    }
    else if ((step == 1 || step == 2 && millis() - timer > 750)) {
      servo.write(78 , 20);
      angle = 78;
      freq = 0;
    }

    timer = millis();
  }
  //Serial.println("Y1: " + String(y1_axis) + " Y2: " + String(y2_axis) + " S1: " + String(sensorBL) + " S2: " + String(sensorBR) + " Millis: " + String(millis() - timer) + " Step: " + String(steps) + " Last: " + String(laststep) + " Angle: " + String(angle));
  Serial.println("Millis: " + String(millis() - timer) + " Angle: " + String(angle));

  laststep = steps;

}

Я использую USB-кабель питания от ПК для питания Arduino, двух акселерометров и одного серводвигателя SG90 для хобби. Будет ли лучший способ включить 1 сервопривод с помощью собственного источника питания?

Какой источник питания вы бы предложили для 1 серводвигателя?

Когда я не подключен к компьютеру, я использую 9-вольтовую батарею для одновременного питания Arduino и одного серводвигателя

спасибо!


Это часть кода для движения вперед и назад в этой системе передвижения, которую я придумал

https://github.com/marcob2178/Arduino-Based-Game-Locomotion

https://www.youtube.com/watch?v=OYTlF2GhXpQ

Датчики крепятся на обувь

, 👍0

Обсуждение

что он делает, когда он работает правильно?, @jsotola

Возможно ли, что серводвигатели потребляют слишком большой ток?, @Michel Keijzers

Является ли ваша батарея 9 В блочной батареей 9 В? Если да, вам следует перейти на другой тип батареи, поскольку блочные батареи 9 В предназначены для приложений с низким энергопотреблением. Они не могут обеспечить большой ток, и любой двигатель (сервопривод также является двигателем) может потреблять большой ток (особенно в остановленном состоянии)., @chrisl

да, это аккумуляторная батарея на 9 В. Будет ли достаточно батареи 6AA 9V для питания arduino uno или mega + 2 акселерометра + 1 серводвигатель?, @Marco Balletta


1 ответ


1

Вы не сказали и не показали, как питается ваш сервопривод, но и источник питания Arduino ограничен, и мощность USB вашего компьютера имеет защитный предел. Вы можете питать любительский сервопривод SG90 от Arduino, но любой более крупный сервопривод нуждается в собственном источнике питания, при этом от Arduino берется только сигнал ШИМ. Если сервопривод (или любое другое устройство или набор устройств) превышает возможности источника питания Arduino, его выходное напряжение упадет. Одним из последствий этого является то, что MCU останавливается. Или, если запас USB-накопителя вашего компьютера исчерпан, он выключится в целях защиты.

Я предполагаю, что вы питаете свой двигатель от Arduino, а это приводит к голоданию микроконтроллера.

,