Електроника и Електротехника | Electronics and Electrical Engineering > Аналогово управление | Analog Control

Arduino за стрелки

<< < (21/38) > >>

pavel75:
Ето и кода който съм ползвал. Не е мой. Емо го е дал като пример на по-предна страница. Аз само го нагодих малко и сложих малко по-разбираеми /поне за мен/ имена на константите и променливите:

#include <Servo.h>

// константи за градусите на сервото
const int pravo = 0;
const int diasno = 90;

// константи за пиновете, които ще се използват
const int butonpin = 6;
const int servopin = 5;
const int led_pravo = 7;
const int led_otklonenie = 9;

// константа за периода на забавяне на върнете на сервото
const int period = 100;

//декрарираме сервото
Servo Strelka1;

//променливи за запомняне позицията на сервото
int pos = pravo; // текуща позиция
int pos_old = diasno; // предишна позиция

void setup() {
  // изпълнява се веднъж при пускане на програмата

// декрарираме пиновете, които ще се ползват
pinMode (butonpin,INPUT);
pinMode (led_pravo, OUTPUT);
pinMode (led_otklonenie, OUTPUT);

 // атачваме сервото и го караме да се обърне в права позиция
 Strelka1.attach(servopin); // закача сервото на пин 5
 Strelka1.write(pos); //сервото се обръща в права позиция
 //Strelka1.detach();

 // настройка първоначален статус на светодиодите
 digitalWrite (led_pravo, HIGH);
 digitalWrite (led_otklonenie, LOW);
}

void loop() {
  // изпълнява се постоянно


// с всяко натискане на бутона се променя позицията на сервото

int buton_push = digitalRead(butonpin);

if(buton_push ==HIGH){
  // изключва светодиода за право
  if(pos == pravo){
  digitalWrite (led_pravo, LOW);}
  else{
  digitalWrite (led_otklonenie, LOW);
  }

pos_old = pos; //запазва текущата позиция
 
  if(pos==pravo)
  {pos=diasno;}
  else{pos=pravo;}
 
        //pos=pos==pravo ? diasno:pravo; // променя позицията в обратно състояние
      //Strelka1.attach(servopin);
      if(pos_old<pos){
            for(int i = pos_old + 1; i <=pos; i++){
              Strelka1.write(i); // записва следващата позиция на сервото
              delay(period); // забавяне
             // Strelka1.detach();
            }
           
      }
      //Strelka1.attach(servopin);
      if(pos_old>pos){
       {
              for(int i = pos_old - 1; i >=pos; i--){
              Strelka1.write(i); // записва следващата позиция на сервото
              delay(period); // забавяне
             // Strelka1.detach();
              }
             
            }
      }
            // Светва съответния пин

            if (pos == pravo){
              digitalWrite (led_pravo, HIGH);
            }
            else{
              digitalWrite (led_otklonenie, HIGH);
            }
           
      }
           
}

Както ще видите в кода съм се опитал да закачам и после да откачам сервото при всяка операция, но не се получи. Явно не съм го сложил на правилното място.
Продължавам борбата.

mitko0888:

--- Цитат на: pavel75 link=topic=4987.msg110880#msg110880 date=1519988096 ---
Както ще видите в кода съм се опитал да закачам и после да откачам сервото при всяка операция, но не се получи. Явно не съм го сложил на правилното място.


--- Край на цитат ---

Премести тези detach с един ред надолу (след скобата) и ще стане. Ама и това attach го мръдни да е след първата скоба на if. Пък на втория  if имаш и един комплект излишни скоби.

      if(pos_old<pos){
              Strelka1.attach(servopin);
              for(int i = pos_old + 1; i <=pos; i++){
                  Strelka1.write(i); // записва следващата позиция на сервото
                  delay(period); // забавяне
              }
              Strelka1.detach();
      }
      if(pos_old>pos){
              Strelka1.attach(servopin);
              for(int i = pos_old - 1; i >=pos; i--){
                  Strelka1.write(i); // записва следващата позиция на сервото
                  delay(period); // забавяне
              }
              Strelka1.detach();
      }

pavel75:
Миткооооо.
Велик си. Стана. Работи като часовник.

 :drinks:

pavel75:
Остана сега да реша другия проблем.
Като спра захранването когато е в основното положение, като го включа всичко е точно.
Обаче, когато го изключа в отклонение не става баш добре. Светодиода светва като за направо, защото така е дадено в програмата, но сервото не мърда. Натискам копчето и все едно платката се събужда - прави един бърз ход до положение "право" и после бавно се придвижва до "оклонение" като светва и съответния светодиод.

mitko0888:
Ще трябва да си поиграеш още малко за да го видиш откъде е. Сложи някакъв delay(1000) в началото, преди първия attach, че и още един след него, преди първия write. След това нали има detach? Това всичкото да е в setup()

Навигация

[0] Списък на темите

[#] Следваща страница

[*] Предходна страница

Премини на пълна версия