Добрый день форумчане, нужна ваша объективная оценка кода,это мой первый код. Суть кода в следующем , есть три режима управление сервоприводом:1 режим это изменение положения сервы кнопками,2 режим это изменения положения сервы от реле(реле разомкнуто одно положение сервы, при замкнутых контактах серва переходит в другое положение. 3 режим управление удаленно) код работает ,но коряво..(1. пока не переключишь все режимы, серва плохо отзывается на нажатие кнопок 2. есть дрожание сервы в крайних положениях)Пока на железку не переносил, делал симуляцию в программе Proteus 7.Буду рад дельным советам.
#include <Servo.h>
int angle = 0; //Текущий угол поворота (при запуске программы будет автоматический вставать в указаное положение) int maxAngle = 170; //Максимальный угол поворота сервомотора (градусов) int minAngle = 10; //Минимальный угол поворота сервомотора (градусов) int angleStep = 2; //Угол единичного шага (градусов) int stepSpeed = 15; //Скорость шага (скорость поворота)(задержка шага int valM; //переменная для блютуза подпрограммы
int ButPinR = 7; // Подключаем реле входа к выходу 7
int R_LedPin = 13; // Подключаем красный светодиод к порту 13 int G_LedPin = 12; // Подключаем зеленый светодиод к порту 12 int B_LedPin = 11; // Подключаем синий светодиод к порту 11 int ButPin = 10; // Подключаем кнопку управление режимами к выходу 10 int L = 5; // Подключаем кнопку управление сервой вверх к выходу 5 int R = 4; // Подключаем кнопку к управлению сервой вниз к выходу 4 int flag = 0; // флаг состояния int regim = 0; // Переключалка
int valL = 0; //Переменная вверх кнопки int valR = 0; //Переменная вниз кнопки
Servo servoMain; // название сервомашины int servoPin = 3; // сервомотор подключен на пин 3
void setup() { Serial.begin(9600); servoMain.attach(3); servoMain.write(90); // выставляем начальный угол сервы pinMode(L,INPUT); //Цифровой PIN 2 входной сигнал для кнопки "Влево" pinMode(R,INPUT); //Цифровой PIN 3 входной сигнал для кнопки "Вправо" pinMode(R_LedPin, OUTPUT); pinMode(G_LedPin, OUTPUT); pinMode(B_LedPin, OUTPUT); pinMode(ButPinR,INPUT); // реле }
void loop() { if(digitalRead(ButPin) == HIGH && flag == 0) { regim ++; flag = 1;
if(regim > 3) // Если номер режима превышает требуемого { // то отсчет начинается с нуля regim = 1; } }
if(digitalRead(ButPin) == LOW && flag == 1) { flag = 0; }
// ======= Вполняем задачу при выборе режима =======
// РЕЖИМ 1: R // РЕЖИМ УПРАВЛЕНИЕ СЕРВЫ кнопками if(regim == 1) { digitalWrite(R_LedPin, HIGH); digitalWrite(G_LedPin, LOW); digitalWrite(B_LedPin, LOW);
{ valR=digitalRead(L); //Читает и запоминает положение левой кнопки valL=digitalRead(R); //Читает и запоминает положение правой кнопки
if((valL==HIGH)&&(valR==LOW)) //Если левая кнопка нажата а правая нет тогда: {angle=angle+angleStep; //тогда угол поворота сервомотора меняется по шагово на величину шага (то есть движется влево по 2 градуса до максималтного угла 180 градусов) if(angle>maxAngle) //Если угол поворота достиг максимального равного 180 градусам,тогда: {angle=maxAngle;} //он остается равным максимальному }
if((valL==LOW)&&(valR==HIGH)) //Все тоже самое как для предыдущей функции но с !инверсией {angle=angle-angleStep; // if(angle<minAngle) // {angle=minAngle;} // }
{servoMain.write(angle); delay(stepSpeed);} //Скорость шагов (задержки шагов)
} } // РЕЖИМ 2: G if(regim == 2) // РЕЖИМ УПРАВЛЕНИЕ СЕРВЫ ОТ РЕЛЕ { digitalWrite(R_LedPin, LOW); digitalWrite(G_LedPin, HIGH); digitalWrite(B_LedPin, LOW);
if(digitalRead(ButPinR)==HIGH)//если контакты реле замкнуты ...
{ servoMain.write(5); }
else//если не замкнуты...
{
servoMain.write(90); delay(500); }}
// РЕЖИМ 3: B // РЕЖИМ УПРАВЛЕНИЕ СЕРВЫ ПО COM-порту if(regim == 3) {digitalWrite(R_LedPin, LOW); digitalWrite(G_LedPin, LOW); digitalWrite(B_LedPin, HIGH); if (Serial.available()) { valM = Serial.read();
if (valM == 'W') { servoMain.write(5),Serial.println("серва w "); // При символе "W" серва принимает нулевую позицию }
if ( valM == 'S') { servoMain.write(170),Serial.println("серва s "); //При символе "S" серва принимает 90 градусов позицию delay(250); }
}
}}
|