Код Arduino работает при подключении к ноутбуку, а не при подключении к аккумулятору или сетевой розетке.

Итак, у меня есть Arduino nano, и я использую два сервопривода SG90, 1 BMP280 и 1 MPU6050. Мой код отлично работает, когда я подключаю свой нано к компьютеру, но когда я подключаю аккумулятор к своему нано, он не работает. Сервопривод перемещается на 90 градусов, но кажется, что он не обнаруживает данные датчика и не двигает сервопривод. Я закомментировал все вызовы Serial. Вот мой код:

/***************************************************************************
  This is a library for the BMP280 humidity, temperature & pressure sensor

  Designed specifically to work with the Adafruit BMP280 Breakout
  ----> http://www.adafruit.com/products/2651

  These sensors use I2C or SPI to communicate, 2 or 4 pins are required
  to interface.

  Adafruit invests time and resources providing this open source code,
  please support Adafruit andopen-source hardware by purchasing products
  from Adafruit!

  Written by Limor Fried & Kevin Townsend for Adafruit Industries.
  BSD license, all text above must be included in any redistribution
 ***************************************************************************/

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>

// МПУ
#include <MPU6050.h>

// Сервопривод
#include <Servo.h>

Servo servoY;
Servo servoX;

MPU6050 mpu;

// Таймеры
unsigned long timer = 0;
float timeStep = 0.01;

// Значения тангажа, крена и рыскания
float pitch = 0;
float roll = 0;
float yaw = 0;


#define BMP_SCK  (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS   (10)

Adafruit_BMP280 bmp; // I2C
//Adafruit_BMP280 bmp(BMP_CS); // аппаратный SPI
//Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);

void pitch_roll_yaw(){
  // Serial.print("Шаг: ");
  // Serial.println(шаг);

  // Serial.print("Roll: ");
  // Serial.println(roll);

  // Serial.print("Yaw: ");
  // Serial.println(рыскание);
  int thsjsojf = 1;
}


void setup() {
  // Сервопривод
  servoY.attach(8);
  servoY.write(90);

  servoX.attach(9);
  servoX.write(90);


  // Serial.begin(115200);
  // в то время как ( !Serial ) задержка (100); // ждем родной usb
  // Serial.println(F("Тест BMP280"));
  unsigned status;
  //status = bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID);
  status = bmp.begin();
  if (!status) {
    // Serial.println(F("Не удалось найти допустимый датчик BMP280, проверьте проводку или "
    // "попробуйте другой адрес!"));
    // Serial.print("SensorID был: 0x"); Serial.println(bmp.sensorID(),16);
    // Serial.print("ID 0xFF, вероятно, означает неверный адрес, BMP 180 или BMP 085\n");
    // Serial.print("ID 0x56-0x58 представляет BMP 280,\n");
    // Serial.print("ID 0x60 представляет BME 280.\n");
    // Serial.print("ID 0x61 представляет BME 680.\n");
    while (1) delay(10);
  }

  /* Default settings from datasheet. */
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */


  // МПУ
  while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
  {
    // Serial.println("Не удалось найти допустимый датчик MPU6050, проверьте проводку!");
    delay(500);
  }
  
  // Калибровка гироскопа. Калибровка должна быть в состоянии покоя.
  // Если вы не хотите калибровать, закомментируйте эту строку.
  mpu.calibrateGyro();

  // Установить порог чувствительности. По умолчанию 3.
  // Если вы не хотите использовать порог, закомментируйте эту строку или установите 0.
  mpu.setThreshold(3);

}

int incrementPitch = 0;
int curAngle = 90;
int incrementPitchDown = 0;

void loop() {
    timer = millis();
    // Чтение нормализованных значений
    Vector norm = mpu.readNormalizeGyro();

    // Расчет тангажа, крена и рыскания
    pitch = pitch + norm.YAxis * timeStep;
    roll = roll + norm.XAxis * timeStep;
    yaw = yaw + norm.ZAxis * timeStep;

    float normalY = norm.YAxis;


    // Serial.print(F("Температура = "));
    // Serial.print(bmp.readTemperature());
    // Serial.println("*C");

    // Serial.print(F("Давление = "));
    // Serial.print(bmp.readPressure());
    // Serial.println("Па");

    // Serial.print(F("Приблизительная высота ="));
    // Serial.print(bmp.readAltitude(1013.25)); /* С учетом местного прогноза! */
    // Serial.println("m");

    // pitch_roll_yaw();


    //TODO: Это работает, но если шаг >gt; 1, а сервопривод уже на максимуме, он не двигается. Исправить.
    // TODO: если шаг < 1. переместите сервопривод в противоположном направлении на 5 градусов. Необходимо отслеживать текущий угол.
    if(pitch>1){
      // Serial.println("ШАГ БОЛЬШЕ++++++ЧЕМ 1, ДВИЖЕНИЕ Y SERVO");
      servoY.write(curAngle+incrementPitch);
      curAngle = curAngle+incrementPitch;
      // Serial.print("Шаг: ");Serial.println(pitch);
      if(curAngle>180){
        // Это просто для того, чтобы мы не печатали текущий угол, если curAngle > 180. Это может быть что угодно.
        int something = 1;
      } else {
        // Serial.print("Текущий угол сервопривода Y:");Serial.println(curAngle);
      }
      incrementPitch+=6;
    } else if(pitch<-1){
      // TODO: если шаг < -1, затем мы перемещаем сервопривод с шагом в 5 градусов, начиная с текущего угла. Прямо сейчас он подскакивает на несколько градусов, проверьте if(pitch>1) на наличие ошибок? ОБЯЗАТЕЛЬНО ИСПРАВИТЬ.
      // Serial.println("Шаг МЕНЬШЕ---------ЧЕМ 1, ДВИЖЕНИЕ Y SERVO");
      servoY.write(curAngle-incrementPitchDown);
      curAngle = curAngle-incrementPitchDown;
      incrementPitchDown+=6;
    }



    // Serial.println();
    delay(200);
}

Кроме того, ни одна из других тем не решает моих проблем.

, 👍-1

Обсуждение

какой аккумулятор вы используете?, @jsotola

@jsotola батарея 9В, @Kirill McQuillin

Вы имеете в виду стандартную блочную батарею на 9 В? ... https://duckduckgo.com/?q=9v+battery&iax=images&ia=images, @jsotola

@jsotola да точно, @Kirill McQuillin

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

Итак, что я должен использовать, чтобы привести его в действие? Я использую свой Arduino в модели ракеты, поэтому она не может быть слишком тяжелой., @Kirill McQuillin

батарея 9 В состоит из шести последовательно соединенных элементов AAAA ... попробуйте шесть элементов AA для тестирования ... возможно, вам придется выбрать другой химический состав батареи для более высокой удельной мощности, @jsotola

Как долго должна работать схема? Вас ограничивает не мощность, а ток. -- Вы можете поискать перезаряжаемую батарею, такую как NiMH или LiIon. Убедитесь, что вы прочитали лист данных и убедитесь, что он может обеспечить достаточный ток. Конечно, вам нужно найти требуемый ток, измерив или прочитав таблицы данных вашего Arduino и других частей, таких как сервопривод., @the busybee


1 ответ


0

Если вы питаете сервоприводы через Nano (и, следовательно, через USB-порт), это вызовет проблемы. Каждому сервоприводу требуется 500/700 мА (всего > 1 ампер). USB моего ноутбука составляет 500 мА, поэтому вращение двух сервоприводов вызовет падение мощности (напряжение падает из-за потребляемого тока).

по моему опыту использование сервоприводов при подключении к компьютеру/ноутбуку ненадежно. Это произойдет: сервопривод вращается, питание падает, что приводит к перезагрузке микроконтроллера или проблемам (напряжение) для датчика.

,

Итак, как я буду их заряжать?, @Kirill McQuillin

подключите внешний источник питания 5 В к сервоприводу (PowerBank / зарядное устройство USB / светодиодный драйвер 5 В / что-нибудь 5 В). Подключите этот источник питания к GND сервопривода И плате (важно!). Подключите плату к ноутбуку через USB (теперь плата питается от вашего ноутбука, а сервоприводы - от внешнего источника). Загрузите код и протестируйте, @Harm van Vugt