Управление 2я сервоприводами

timurtanum
Offline
Зарегистрирован: 15.11.2014

Добрый вечер всем .Прошу помоши так как я только начинаю осваивать Arduino.

Есть задумка написать программу для машинки с HC-SR04 и двумя сервами.написал программу для одной сервы,работает отлично.Когда решил переделать программу для двух серв то я попал в тупик.в программе сервы крутяться по очереди,а я из них хочу сделать эхо локаторы.так вот проблема не могу понять где я написал не правильно код программы и как сделать чтобы они одновременно врашались? подскажите пожалуйста чем сможите.очень большое желание написать программу самому.

#include <Servo.h>
Servo myservo1;     //  назначаем вывод 1 сервы
Servo myservo2;     //   назначаем вывод 2 сервы
 
int pos = 0;
void setup() 
  // устанавливаем пин как вывод управления сервой  
  myservo1.attach(6);  // назначаем порты для первой сервы
  myservo2.attach(5);  // назначаем порты для второй сервы
 
}
  
  void loop() 
  for(pos = 0; pos < 180; pos += 1)  // от 0 до 180 градусов
  {                                  // с шагом в 1 градус 
    myservo1.write(pos);              // 
    delay(15);                       // ждём 15ms пока серва займёт новое положение
  } 
  for(pos = 180; pos>=1; pos-=1)     // от 180 до 0 градусов
                                  
    myservo1.write(pos);               
 
  for(pos = 0; pos < 180; pos += 1)  // от 0 до 180 градусов
  {                                  // с шагом в 1 градус 
    myservo2.write(pos);              // 
   delay(20);  
  
  for(pos = 180; pos>=1; pos-=1)     // от 180 до 0 градусов
  {                                
    myservo2.write(pos);               
  } 
 
}
Araris
Offline
Зарегистрирован: 09.11.2012

Упрощаем :

int pos = 0;

int incdec = 1; // шаг увеличения/уменьшения pos

void loop()
{
pos+=incdec;

if (pos < 0) { incdec = 1; pos=1; }

if (pos > 180) { incdec = -1; pos=179; }

myservo1.write(pos);
myservo2.write(pos);
delay(20);
}

timurtanum
Offline
Зарегистрирован: 15.11.2014

Спасибо вам огромное за помошь! все действительно работает именно как я хотел! меня интересует откуда вы взяли ( =incdec ) я посмотрел в Справочник языка Ардуино там такого не нашел. я просто сейчас думаю как теперь добавить код для измерения расстояния! если вам не трудно можно я напишу программу дальше с ультрозвуковым и сервами а вы просто проверите правильно я направляюсь или нет!?

timurtanum
Offline
Зарегистрирован: 15.11.2014

дописал полностью скетч и при подключении двигатели не крутяться а сервоприводы стали врашаться быстрее когда я приблежаюсь к ультрозвуковому датчику 

вот сама программа 

#define Trig 9
#define Echo 8
#define ledPin 13
#include <Servo.h>
int enableA = 10;
int pinA1 = 2;
int pinA2 = 3;
//Motor B
int enableB = 11;
int pinB1 = 4;
int pinB2 = 5;
 
Servo myservo1;     //  назначаем вывод 1 сервы
Servo myservo2;     //   назначаем вывод 2 сервы
 
int pos = 0;
 
int incdec = 1; // шаг увеличения/уменьшения pos
void setup() 
  // устанавливаем пин как вывод управления сервой  
  myservo1.attach(6);  // назначаем порты для первой сервы
  myservo2.attach(7);  // назначаем порты для второй сервы
  pinMode(Trig,OUTPUT);
  pinMode(Echo,INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(enableA, OUTPUT);
  pinMode(pinA1,OUTPUT);
  pinMode(pinA2,OUTPUT);
  pinMode(enableB,OUTPUT);
  pinMode(pinB1,OUTPUT);
  pinMode(pinB2,OUTPUT);
}
unsigned int impulseTime=0;
unsigned int distance_sm=0;
void loop()
{
  digitalWrite(Trig,HIGH);   /* Подаем импульс на вход trig дальномера */
  delayMicroseconds(10);     // равный 10 микросекундам
  digitalWrite(Trig,LOW);    // отключаем 
  impulseTime=pulseIn(Echo,HIGH); //замеряем длину имульса
  distance_sm=impulseTime/58; //пересчитываем в сантиметры 
  if(distance_sm<10)          //если растояние менее 30 см то ...
  {     
    digitalWrite(pinA1,HIGH);
    digitalWrite(pinB1,HIGH);
 
  }  
  else 
  {   
    digitalWrite(pinA1,LOW); 
    digitalWrite(pinB1,LOW);  
  }   
  {
    pos+=incdec;
 
    if (pos < 0) { 
      incdec = 1; 
      pos=1; 
    }
 
    if (pos > 180) { 
      incdec = -1; 
      pos=179; 
    }
 
    myservo1.write(pos);
    myservo2.write(pos);
    delay(20);
  }
}
 
Araris
Offline
Зарегистрирован: 09.11.2012

1. "Справочник языка Ардуино" смотрели не тот, посмотрите http://arduino.ru/Reference/IncrementCompound

2. "Сервоприводы стали врашаться быстрее когда я приблежаюсь к ультрозвуковому датчику " - это из-за строки impulseTime=pulseIn(Echo,HIGH); //замеряем длину имульса

Почитайте про pulseIn(), будет понятно.

3. "При подключении двигатели не крутяться" - а зачем в скетче enableA и enableB объявлены ?
 
4. Будет правильнее в дальнейшем выкладывать сюда код, как описано в http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
timurtanum
Offline
Зарегистрирован: 15.11.2014

Спасибо за то что помогаете советами. конечно я все просмотрю и постараюсь написать правильно алгоритм который я задумал.просто очень много слов попадаються которые не понятно откуда беруться и для чего они.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Гляньте сюда и решите: а стоит ли ждать ответа от датчика целую секунду ( туда-обратно около 160 метров)

http://arduino.ru/Reference/PulseIn   pulseIn(pin, value, timeout)

timurtanum
Offline
Зарегистрирован: 15.11.2014

Araris пишет:

1. "Справочник языка Ардуино" смотрели не тот, посмотрите http://arduino.ru/Reference/IncrementCompound

2. "Сервоприводы стали врашаться быстрее когда я приблежаюсь к ультрозвуковому датчику " - это из-за строки impulseTime=pulseIn(Echo,HIGH); //замеряем длину имульса

Почитайте про pulseIn(), будет понятно.

3. "При подключении двигатели не крутяться" - а зачем в скетче enableA и enableB объявлены ?
 
4. Будет правильнее в дальнейшем выкладывать сюда код, как описано в http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

в скетче enableA и enableB объявлены для управление скоростью.я просто по тихоньку по кусочку собираю программу.я нашел алгоритм готовый для управление этим шилдом,вот из него по кусочкам вытаскиваю и просматриваю что и для чего служит. так каждую деталь я сначала нахожу для него алгоритм ,а потом уже выписываю то что мне нужно.

timurtanum
Offline
Зарегистрирован: 15.11.2014

trembo пишет:

Гляньте сюда и решите: а стоит ли ждать ответа от датчика целую секунду ( туда-обратно около 160 метров)

http://arduino.ru/Reference/PulseIn   pulseIn(pin, value, timeout)

я если честно не знаю надо ли ждать или нет. я просто только начал изучать поэтому я обратился сюда за советами.вы как видите я стараюсь написать алгоритм и целыми днями собираю по кусочкам. я рад что есть люди которые подсказывают и помогают. заранее спасибо

fenixtat
Offline
Зарегистрирован: 13.06.2017

Добрый день!

Спасибо большое!Ваш скетч очень полезен!

На данный момент делаю серво-манипулят ор, который состоит из 3 сервоприводов. Можно Вас попросить выложить пример скетча, который позволит управлять тремя сервами одновременно.

Например:

1.включение Ардуино Уно

2.Через две секунды, после включения - начинает двигаться СЕРВО1 с 0 до 180 градусов(отложе нный старт, после включения)

3.Через 0,5 секунды после начала движения СЕРВО1 - включается СЕРВО2 и начинает двигаться с 0 до 60 градусов

4.Через 0,5 секунды после начала движения СЕРВО2 - включается СЕРВО и начинает двигаться с 45 до 78 градусов