сервопривод + кнопка.

AlexAferist
Offline
Зарегистрирован: 16.07.2013

Начинаю только работать с Arduino. Хочу узнать, возможна ли работа сервопривода с кнопкой? И как это прописать?

tsostik
Offline
Зарегистрирован: 28.02.2013
AlexAferist
Offline
Зарегистрирован: 16.07.2013

Блин, я в программировании нуб. А кодика нет никакого? чтобы при нажатии кнопки, серва крутилась на 90 градусов

AlexAferist
Offline
Зарегистрирован: 16.07.2013

Может кому понадобится. написал код, все работает.

с одной кнопкой:

#include <Servo.h>
int button = 5; //button pin, connect to ground to move servo
int press = 0;
Servo servo;
boolean toggle = true;

void setup()
{
  pinMode(button, OUTPUT); //arduino monitor pin state
  servo.attach(7); //pin for servo control signal
  digitalWrite(5, LOW); //enable pullups to make pin high
}

void loop()
{
  press = digitalRead(button);
  if (press == HIGH)
  {
    if(toggle)
    {
      servo.write(90);
      toggle = !toggle;
    }
    else
    {
      servo.write(20);
      toggle = !toggle;
    }
  }
  delay(500);  //delay for debounce
}

 

AlexAferist
Offline
Зарегистрирован: 16.07.2013

и с двумя кнопками:

#include <Servo.h>
int button1 = 4; //button pin, connect to ground to move servo
int press1 = 0;
int button2 = 5; //button pin, connect to ground to move servo
int press2 = 0;
Servo servo1;

void setup()
{
  pinMode(button1, OUTPUT);
  pinMode(button2, OUTPUT);
  servo1.attach(7);
  digitalWrite(4, LOW); //enable pullups to make pin high
  digitalWrite(5, LOW); //enable pullups to make pin high
}

void loop()
{
  press1 = digitalRead(button1);
  if (press1 == HIGH)
  {
    servo1.write(160);
  }    
  
  press2 = digitalRead(button2);
  if (press2 == HIGH)
  {
    servo1.write(10);
  }
}

 

временный
Offline
Зарегистрирован: 19.09.2014

Народ, а как в этот скетч с двумя кнопками модернизировать,

Чтоб при двух отпущенных кнопках (или зажатых кнопках) серво возвращалась в нейтральное положение (90град.)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

в конце добавить else servo1.write(90);

временный
Offline
Зарегистрирован: 19.09.2014

Спасибо за подсказку, у меня получилось так

#include <Servo.h>
int button1 = 14; //button pin, connect to ground to move servo
int press1 = 0;
int button2 = 15; //button pin, connect to ground to move servo
int press2 = 0;
Servo servo1;

void setup()

{
  pinMode(button1, OUTPUT);
  pinMode(button2, OUTPUT);
  servo1.attach(3);
  digitalWrite(14, LOW); //enable pullups to make pin high
  digitalWrite(15, LOW); //enable pullups to make pin high
}

 
void loop()
{
if (digitalRead(button1) == HIGH  && digitalRead(button2) == HIGH)
  {
    servo1.write(90);
  }
  else
{
  if(digitalRead(button1)==HIGH) 
  {
    servo1.write(160);
  }
 if(digitalRead(button2)==HIGH) 
  {
    servo1.write(10);
  }
  if (digitalRead(button1) == LOW  && digitalRead(button2) == LOW)
  {
    servo1.write(90);
  }
}
}

 

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

временный пишет:

digitalWrite(14, LOW); //enable pullups to make pin high

digitalWrite(15, LOW); //enable pullups to make pin high }

Бред...

If the pin is configured as an INPUT, digitalWrite() will enable (HIGH) or disable (LOW) the internal pullup on the input pin.

It is recommended to set the pinMode() to INPUT_PULLUP to enable the internal pull-up resistor.

See the digital pins tutorial for more information.

временный
Offline
Зарегистрирован: 19.09.2014

Нуу как-бы (а фиг его знает) вам видней, только void setup как и весь скетч был взят из поста #4, только до пилен под мои нужды.

Симулирован в протеусе, эти строчки и int press2 = 0; и int press1 = 0; были удалены

С ардрунио я ещё  только знакомлюсь 2 или 3 неделю.

 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

не буду плодить темы. стал декодировать сигнал PPM сформированный библиотекой servo

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

myservo.write(0);           //535мкс
myservo.write(90);          //1460мкс
myservo.write(180);         //2385мкс

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

Lexx1981
Offline
Зарегистрирован: 01.01.2015

AlexAferist пишет:

Может кому понадобится. написал код, все работает.

с одной кнопкой:

а не покажите схему подключения сервы?

vvadim
Offline
Зарегистрирован: 23.05.2012

для ленивых, кто не хочет искать http://arduino.ru/forum/obshchii/prezhde-chem-sprosit-pro-servomashinku-servo-posmotri-tut

Lexx1981
Offline
Зарегистрирован: 01.01.2015

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

#include <Servo.h>
int button1 = 4; //button pin, connect to ground to move servo
int press1 = 0;
Servo servo1;

void setup()
{
  pinMode(button1, INPUT);
  servo1.attach(9);
  digitalWrite(4, LOW); //enable pullups to make pin high
}

void loop()
{
  press1 = digitalRead(button1);
  if (press1 == HIGH)
  {
    servo1.write(100);
  }
 else {
   servo1.write(20);
 }
}

 

vvadim
Offline
Зарегистрирован: 23.05.2012

почитай, там есть примеры работы с кнопками, как раз твой случай

http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...

Lexx1981
Offline
Зарегистрирован: 01.01.2015

испортил код немного под себя

#include <Servo.h>
int flag=0; 
Servo servo1;

void setup()    
{     
    pinMode(5, OUTPUT);         
    servo1.attach(9);   
} 
void loop() 
{       
     if(digitalRead(5)==HIGH&&flag==0)
     {       
       digitalWrite(5,!digitalRead(5)); 
       flag=1; 
       servo1.write(100);      
     }       
      if(digitalRead(5)==LOW&&flag==1)/ 
     {  
        flag=0;
     } 
} 

Кнопка на 5 пине серва на 9. при нажатии серва не реагирует, что  я делаю не так?. еще сразу вопрос, при подключении питания серва делает поворот-задержка-возврат в течении 3 сек... это можно убрать? и сразу в догонку третий вопрос: хочу на одну кнопку подключить две сервы, что бы при нажатии обе поворачивали на одинаковый угол но зеркально друг относительно друга, и потом при повторном нажатии возвращались в исходноее положение, это же выполнимо?

vvadim
Offline
Зарегистрирован: 23.05.2012

1. Читайте про кнопки, и про дребезг не забудьте.

2. При подаче питания серва будет дёргаться. Хочете избавится - подавайте питание с задержкой через реле.

3. Выполнимо.

skyspirit
Offline
Зарегистрирован: 27.02.2015

Подскакжите пожалуйста как задать параметр, если нужно чтоб при определенных усовиях, например температура выше 90 градусов и влажность выше 60 то серва срабатывает поварачиваясь на весь ход а при возврате к показаниям ниже указаных серва поварачивается назад.

Применимо для открытия заслонки  печки в бане например :)

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014
skyspirit
Offline
Зарегистрирован: 27.02.2015

Вот проверть будет ли работать, если температура ниже 0 серва поварачивает на 180 если выше 0 стает в исходную позицию?




#include <Servo.h>
#include <OneWire.h> // библиотека датчика температуры
#include <LCD5110_Graph.h> // библиотека экрана
OneWire ds(10);
Servo servo;
LCD5110 myGLCD(2, 3, 4, 6, 5); //выводы экрана 
int led = 13;

extern unsigned char SmallFont[];
extern unsigned char BigNumbers[];

void setup() {
  servo.attach(12); //привязываем привод к порту 12
  pinMode(led, OUTPUT);
  myGLCD.InitLCD(65);//контраст экрана

  myGLCD.setFont(SmallFont);
  myGLCD.setFont(BigNumbers);

Serial.begin(9600); 
}
 
void loop() {
  
byte data[2];
ds.reset(); 
ds.write(0xCC);
ds.write(0x44);
delay(750);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read(); 
data[1] = ds.read();
int Temp = (data[1]<< 8)+data[0];
Temp = Temp>>4;
Serial.println(Temp);
 
  myGLCD.clrScr(); // Очистка экрана
   
  myGLCD.setFont(BigNumbers); //вывод крупных цыфр
  myGLCD.printNumF(Temp,0, CENTER, 23);
  
  if (Temp<0)
  servo.write(180);
  else{
  servo.write(0);
  }
  
  myGLCD.update(); // Вывод вместимого буфера на дисплей
 delay (100); // Задержка 0,1 с
 
}





 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

После if фигурные скобки забыли:

if (Temp<0) {
  servo.write(180);
}
else {
  servo.write(0);
}

 

skyspirit
Offline
Зарегистрирован: 27.02.2015

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

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

В принципе да, скобки можно не ставить, если выполняется только одно действие. Если два и более - скобки нужны обязательно. Но лучше ставить их всегда, чтобы не запутаться и не ошибиться. Хуже от этого не будет.

skyspirit
Offline
Зарегистрирован: 27.02.2015

а так правильно записать если нужно исполнение задачи при определенных параметрах двух источников

if (Temp<0) 

if (h<50)
{
servo.write(180);
 }

else { 
servo.write(0); 
}

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Нет, правильней будет так:

if (Temp<0 && h<5) {
  servo.write(180);
}
else { 
  servo.write(0); 
}

Все условия можно перечислить в одном if. Я уже давал ссылку на логические операторы.

skyspirit
Offline
Зарегистрирован: 27.02.2015

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

if (Temp<0) 
{
digitalWrite(led, HIGH);
servo.write(180);
}

 

sanich82
Offline
Зарегистрирован: 26.05.2016

Lexx1981 пишет:

 при нажатии серва должна поворачиваеть на 90 и ждать, при повторном нажатии поворачивать в обратную сторону. застрял после первого нажатия

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


[code]
#include <Servo.h> 
Servo servo;
int button=5;
int flag=0;
void setup() {
  pinMode(button, INPUT);
 servo.attach(9);
 servo.write(0);
}

void loop() {
  if(digitalRead(button)==HIGH&&flag==0){
    servo.write(180);
    flag=1;
    
  }
  if(digitalRead(button)==LOW&&flag==1)  {
    servo.write(0);
    flag=0;
  }

}
[/code]

 

Lexx1981
Offline
Зарегистрирован: 01.01.2015

я уже забросил эту тему

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

skyspirit пишет:

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

Ошибки бывают двух типов:

- синтаксические - которые может выловить компилятор,

- логические - когда программа написана синтаксически верно, но делает совсем не то, что хочет ее автор.

sanich82
Offline
Зарегистрирован: 26.05.2016

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

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Терминология у Вас неправильная - менялось состояние переменной-флага или светодиода или сервы, а не кнопки. Состояние кнопки Вы меняете, когда физически её нажимаете. Вот на примере вашего кода выше. Немножко по-топорному, что быстро пришло в голову:

#include <Servo.h> 
Servo servo;
int button=5;
int flag=0;
void setup() {
  pinMode(button, INPUT);
 servo.attach(9);
 servo.write(0);
}

void loop() {
  if(digitalRead(button)==HIGH&&flag==0){
    servo.write(180);
    flag=1;    
  }

  if(digitalRead(button)==LOW&&flag==1){
    flag=2;    
  }

  if(digitalRead(button)==HIGH&&flag==2){
    servo.write(0);
    flag=3;
  }

  if(digitalRead(button)==LOW&&flag==3){
    flag=0;    
  }
}

 

sanich82
Offline
Зарегистрирован: 26.05.2016

Да, неправильно выразился... конечно, переменной..

sanich82
Offline
Зарегистрирован: 26.05.2016

Jeka_M Спасибо. работает. я был где-то поблизости но немного не додумал

Алексей321
Offline
Зарегистрирован: 15.01.2017

Я немного не понял. 

Я немогу понять как подключить сервопривод и кнопка. При нажатой кнопки серво на 90 градусов или на другой градус, а если кнопка не нажата то сервомашинка поварачивается на 0.

Подскажите как это сделать.

Евгений56
Offline
Зарегистрирован: 08.06.2022

здравствуйте.помогите с проблемкой. ардуино нано. 3 сервы привязаны каждая к своей кнопке с фиксацией.нажимаем кнопку поворот на 50 градусов.нажимаем еще раз ,возврат в 0.

b707
Offline
Зарегистрирован: 26.05.2017

И в чем проблема?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Евгений56 пишет:

здравствуйте.помогите с проблемкой. ардуино нано. 3 сервы привязаны каждая к своей кнопке с фиксацией.нажимаем кнопку поворот на 50 градусов.нажимаем еще раз ,возврат в 0.

как бы так

Евгений56
Offline
Зарегистрирован: 08.06.2022

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Евгений56 пишет:

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

я не жадный - лови

Евгений56
Offline
Зарегистрирован: 08.06.2022

спасибо конечно, но буду переделывать под тумблер.если получиться :(

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Евгений56 пишет:

спасибо конечно, но буду переделывать под тумблер.если получиться :(

там нечего переделывать, если вместо кнопки поставить тумблер работать будет аналогично, ну разве что под хранение состояния еще одну переменную добавить, "Элементарно Ватсон" жеж...

ЗЫ я поправил на три тумблера! С тебя коньяк )))

sadman41
Offline
Зарегистрирован: 19.10.2016

Тумблер сам по себе "переменная".

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:
Тумблер сам по себе "переменная".

а коньяк?