roboforum.ru

Технический форум по робототехнике.

управление сервоприводом нужен ваш совет

управление сервоприводом нужен ваш совет

cako79 » 11 май 2015, 00:03

Добрый день форумчане, нужна ваша объективная оценка кода,это мой первый код.
Суть кода в следующем , есть три режима управление сервоприводом: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);
}

}

}}


Rambler\'s Top100 Mail.ru counter