Базовое управление самолетом на Arduino
У меня есть задача, в которой мне нужно управлять тягой самолета и направлением высоты (вверх-вниз). Для тяги я подумал об использовании двигателя постоянного тока и сервопривода. Управление сервоприводом будет осуществляться с помощью кнопок, а значение тяги будет передаваться через последовательный порт. (Это не проект реального автомобиля, мне нужно только написать код, остальное — воображаемое.)
Я написал следующий код. Хотелось бы спросить, есть ли какие-то недостатки и как можно дальше улучшить? Заранее спасибо. С уважением...
#include <Servo.h>
Servo servo1;
int pos = 0;
const int buttonSUP = 2;
const int buttonSDOWN = 3;
int buttonStateUP = 0;
int buttonStateDOWN = 0;
int motorPin = 4;
void setup() {
servo1.attach(9);
pinMode( buttonSUP, INPUT);
pinMode( buttonSDOWN, INPUT);
pinMode(motorPin, OUTPUT);
Serial.begin(9600);
while (! Serial);
Serial.println("Speed 0 to 255");
}
void loop() {
buttonStateUP =digitalRead(buttonSUP);
if(buttonStateUP=HIGH){
servo1.write(90);
Serial.println("UP");
}
if(buttonStateDOWN=HIGH){
servo1.write(0);
Serial.println("DOWN");
}
else{
servo1.write(45);
Serial.println("STABLE");
}
if (Serial.available())
{
int speed = Serial.parseInt();
if (speed >= 0 && speed <= 255)
{
analogWrite(motorPin, speed);
Serial.println(speed);
}
}
}
@E.Canberk, 👍-1
Обсуждение1 ответ
while (! Serial);
Не требуется, если у вас есть плата с USB-> чипом последовательного моста (например, Arduino Uno)
if(buttonStateDOWN=HIGH){
}
В каждом условии вы использовали =
вместо ==
. Ваше «условие» фактически присваивает HIGH
buttonStateDOWN
. Если вы хотите сравнить целые числа, используйте ==
.
И судя по вопросу, я думаю, что вы неправильно поняли кнопки скорости (а может и я). Я думаю, они хотят, чтобы вы запрограммировали это так, чтобы при нажатии кнопки или при каждом нажатии кнопки скорость менялась на +1 или -1.
Предполагая, что все остальное работает нормально, может возникнуть проблема с последовательным выводом, поскольку вы просто рассылаете спам-сообщения.
Прочитайте о millis();
, он может помочь вам отправлять что-то только каждые x секунд без использования delay();
Здесь
- Как заставить сервопривод вращаться на угол больше 180°
- 6 + 1 двигательей подключенных к arduino uno?
- Почему сервопривод вращается на 360 градусов?
- Как Arduino Uno может поддерживать до 12 сервоприводов, если у него всего 6 цифровых выводов ШИМ?
- Контакты ШИМ серводвигателей, Arduino Uno
- Как запитать 6 серводвигателей от батареи для создания робота-манипулятора?
- Как повторить код
- Серво не двигается
У вас отключено форматирование, но оно всегда либо НЕПРАВИЛЬНО, либо СТАБИЛЬНО?, @Paul
Я подумал, что сервопривод сместился на 45 градусов так же, как это "<". Поэтому, повернувшись на 90 градусов, я могу переключиться сверху вниз или наоборот., @E.Canberk