Код 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);
}
Кроме того, ни одна из других тем не решает моих проблем.
@Kirill McQuillin, 👍-1
Обсуждение1 ответ
Если вы питаете сервоприводы через Nano (и, следовательно, через USB-порт), это вызовет проблемы. Каждому сервоприводу требуется 500/700 мА (всего > 1 ампер). USB моего ноутбука составляет 500 мА, поэтому вращение двух сервоприводов вызовет падение мощности (напряжение падает из-за потребляемого тока).
по моему опыту использование сервоприводов при подключении к компьютеру/ноутбуку ненадежно. Это произойдет: сервопривод вращается, питание падает, что приводит к перезагрузке микроконтроллера или проблемам (напряжение) для датчика.
Итак, как я буду их заряжать?, @Kirill McQuillin
подключите внешний источник питания 5 В к сервоприводу (PowerBank / зарядное устройство USB / светодиодный драйвер 5 В / что-нибудь 5 В). Подключите этот источник питания к GND сервопривода И плате (важно!). Подключите плату к ноутбуку через USB (теперь плата питается от вашего ноутбука, а сервоприводы - от внешнего источника). Загрузите код и протестируйте, @Harm van Vugt
- avrdude ser_open() can't set com-state
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Какое максимальное энергопотребление Arduino Nano 3.0?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Питание светодиодной ленты - Сколько ампер?
- Arduino nano как клавиатура HID
- Как я могу запитать Arduino Nano от батареи LiPo, желательно 3,7 В
- В чем разница между библиотеками Software Serial? Какая из них совместима с Arduino Nano?
какой аккумулятор вы используете?, @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