Запуск серво кнопкой/микросвитчем

tsvalia
Offline
Зарегистрирован: 03.06.2011

Приветствую.

Прошу сразу не пинать, потому как сам понимаю, что туплю и вопрос у меня совершенно нубский. :)

Имеется плата Arduino Mega, серво. Задача проста как три копейки(на данный момент, дальше больше :))

Никак не могу написать скетч, чтобы серва совершала движение(как в примере sweep) после нажатия микросвитча.

Микросвитч планируется использовать как простейший и дешёвый датчик, если есть идеи, с радостью выслушаю.

Затея сделать мишень, которая после падения поднимается сервой.

Прорыл инет, пересмотрел примеры с миганием диода и сервами. Помогите, плиз.

С уважением.

Дубликат этой темы удалил, дабы не засорять форум. С уважением Adessit

Zaliv
Offline
Зарегистрирован: 05.03.2011

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

tsvalia
Offline
Зарегистрирован: 03.06.2011

Подключаю просто.

На 9-й пин(PWM) серву, на 2-й(Analog In) кнопку.

Вот сырой код, собранный из примеров:

Examples -> Digital -> Button

Examples -> Servo -> Sweep

Насколько я понимаю, я коряво пытаюсь подружить аналоговый выход и цифровой... :)

 

// Sweep
// by BARRAGAN http://barraganstudio.com
// This example code is in the public domain.


#include <Servo.h>

Servo myservo; // create servo object to control a servo
// a maximum of eight servo objects can be created

int pos = 0; // variable to store the servo position
int buttonState = 0; // variable for reading the pushbutton status

// constants won't change. They're used here to
// set pin numbers:
 

const int buttonPin = 2; // the number of the pushbutton pin
const int servoPin = 13; // the number of the servo pin


void setup()
{

myservo.attach(9); // attaches the servo on pin 9 to the servo object
pinMode(servoPin, OUTPUT); // initialize the servo pin as an output:
pinMode(buttonPin, INPUT); // initialize the pushbutton pin as an input:

}

void loop()
{
buttonState = digitalRead(buttonPin);  // read the state of the pushbutton value:
if (buttonState == HIGH) {  // check if the pushbutton is pressed, if it is, the buttonState is HIGH:
digitalWrite(servoPin, HIGH);  // start servo cicle:
}
else {
digitalWrite(servoPin, LOW); // turn servo off:
}
}

for(pos = 0; pos < 120; pos +=1)            // goes from 0 degrees to 180 degrees
{                         // in steps of 1 degree
myservo.write(pos);            // tell servo to go to position in variable 'pos'
delay(6);             // waits 15ms for the servo to reach the position
}
for(pos = 120; pos>=1; pos-=1)      // goes from 180 degrees to 0 degrees
{
myservo.write(pos);    // tell servo to go to position in variable 'pos'
delay(6);      // waits 15ms for the servo to reach the position
}
}

 

Alexander
Offline
Зарегистрирован: 25.04.2010

Для вставки кода есть кнопочка с надписью code. Я уже поправил сообщение, просто в качестве информации. Если ей не пользоваться, код очень тяжело читать и комментировать.

Alexander
Offline
Зарегистрирован: 25.04.2010

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

tsvalia
Offline
Зарегистрирован: 03.06.2011

Спасибо, за поправку. Исправлюсь. :)

Насчёт кода...

Написано на плате Analog In , но на этот же 2-й пин я подключал кнопку и диод, как в скетче-примере. Всё работает... Другого 2-го пина не нашёл, только PWM

Alexander
Offline
Зарегистрирован: 25.04.2010

Так вот и нужно воткнуть где написано PWM Digital, а не там где Analog In. Вам нужен цифровой вход/выход, а не агалоговый вход.

tsvalia
Offline
Зарегистрирован: 03.06.2011

На плате написано PWM и усё....

Alexander
Offline
Зарегистрирован: 25.04.2010

PWM означает, что этот вход/выход может работать в режиме ШИМ. В данном случае это не важно, важно, что он цифровой. Тыкайте туда.

tsvalia
Offline
Зарегистрирован: 03.06.2011

Тыкнул.. Задал в скетче пины. Диод горит постоянно... Балин.

Zaliv
Offline
Зарегистрирован: 05.03.2011

 Я чо-то вообще не могу понять, что ты пытаешься сделать и при чем тут диод, то ты хотел управлять сервой. Теперь диод? у тебя вообще от диода только, объявление константы с номером порта встроенного светодиода (строка 19). В самом коде ты используешь переменную servoPin, которая вообще у тебя никак не объявлена.

 

 

tsvalia
Offline
Зарегистрирован: 03.06.2011

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

Рассказываю идею.

Мишень(в будущем несколько связанных) для эйрсофта. После выстрела падает, серво её поднимает. Для начала сразу, потом буду заморачиваться с таймерами. Движение есть в примере Sweep.

Кнопка нужна, для подачи команды на серву, типа пора поднимать. :) Если есть идеи по-лучше, как воплотить, с удовольствием выслушаю.

 Есть такое дело, servoPin не прописан. Это я скопировал в пост предудыщий вариант...

Zaliv
Offline
Зарегистрирован: 05.03.2011

 Если хочешь зажигать светодиод, то либо зажигай светодиод, т.е. в строках 26, 35 и 38 используй переменную ledPin, которую ты объявил для светодиода, либо в строке 19 измени ledPin на servoPin. Я же уже написал, ты объявляешь одну переменную (строка 19), а используешь другую, необъявленную.

tsvalia
Offline
Зарегистрирован: 03.06.2011

Не хочу я светодиод зажигать, не хочу. :)

Писал же выше, по-ошибке скопировал предыдущий не редактированный код. Сейчас и в посте отредактирую. Неужели в остальном всё правильно?

Буду пробовать

FurLion
Offline
Зарегистрирован: 27.02.2012

Добрый день, не хотелось создавать новую тему, тем более задача схожая. Есть две сервы и несколько кнопок, для первой сервы необходимо, что бы при нажатии на кнопку серва перешла в крайнее левое положение, жмем еще раз - серва возвращается в нейтральное положение, жмем еще раз - серва переходит в крайнее правое положение, дальше по циклу. Вторая серва - жмем 1 раз кнопочку, серва начинает двигаться вправо и влево на определенный угол с какой то скоростью, жмем еще раз, серва увеличила скорость, жмем еще раз серва возвращается в нейтральное положение. Заранее спасибо)))

Mastino
Offline
Зарегистрирован: 03.12.2011

FurLion пишет:

Добрый день, не хотелось создавать новую тему, тем более задача схожая. Есть две сервы и несколько кнопок, для первой сервы необходимо, что бы при нажатии на кнопку серва перешла в крайнее левое положение, жмем еще раз - серва возвращается в нейтральное положение, жмем еще раз - серва переходит в крайнее правое положение, дальше по циклу. Вторая серва - жмем 1 раз кнопочку, серва начинает двигаться вправо и влево на определенный угол с какой то скоростью, жмем еще раз, серва увеличила скорость, жмем еще раз серва возвращается в нейтральное положение. Заранее спасибо)))

first_buttonState = digitalRead(first_buttonPin);
if(first_buttonState != old_first_buttonState){ 
old_first_buttonState = first_buttonState;
count_first_button_presses++;
if(count_first_button_presses >= 7)
{
count_first_button_presses = 1;
}
}
if(count_first_button_presses == 1)
myservo.write(20);
else if(count_first_button_presses == 3)
myservo.write(160);
else if(count_first_button_presses == 5)
myservo.write(90);
}

 

FurLion
Offline
Зарегистрирован: 27.02.2012

Немного не то. Есть 2 нопки и 2 сервы, задача - повесить на кнопки программы для сервомашинок (3 штуки на машинку) включение и отключение естественно должно быть независимым. Думаю делается это через прерывание но пока не разберусь как) 

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

>>Так вот и нужно воткнуть где написано PWM Digital, а не там где Analog In. Вам нужен цифровой вход/выход, а не агалоговый вход.<< 

Все порты МК могут быть как входами так и выходами. Как порт сконфигурируете так он и поплывет.

FurLion
Offline
Зарегистрирован: 27.02.2012

кто может за скромное вознаграждение накидать нужный мне скетч?

Mastino
Offline
Зарегистрирован: 03.12.2011
FurLion
Offline
Зарегистрирован: 27.02.2012

Mastino, именно так  как нужно)) Если  что ICQ для связи 4823286 четыре три.

Mastino
Offline
Зарегистрирован: 03.12.2011

.

leshak
Offline
Зарегистрирован: 29.09.2011

 А кнопка-то как подлючена? Про подтягивающие внешние резисторы не забыли? Судя по коду встроенные вы не используете.

Ну и почему же не дать схему-то? Как изначально просили. Не нужно этого "Подключаю просто.". Раз что-то не работает, то возможно вы в своем "просто" что-то упустили.

Mastino
Offline
Зарегистрирован: 03.12.2011

все работает как видно на видео :)

leshak
Offline
Зарегистрирован: 29.09.2011

 Ну то что работает, это вы уже видимо с FurLion в icq обменивались. Тут оно "не публиковалось". А то что "это в принципе возможно" - и так было известно.

К тому же мой вопрос отностился к скетчу топик-стартера,  а не FurLion. tsvalia тоже хотел разобратся. Просто я не посмотрел "когда это было". Видимо "уже не хочет" ;)

 

 

tsvalia
Offline
Зарегистрирован: 03.06.2011

Приветствую.

Забросил изыскания, т.к. комп сдох и работа сжирала всё время... Сейчас уволился, времени стало по-больше, скоро возьму свежий комп и буду заново копать. :)

Начну сначала и задам принципиально-теоритеческий вопрос.

Чем проще и решить мою задачу?

1. Микросвитчем.

2. Датчиком расстояния.

3. Датчиком освещённости?(хз, правильно ли называю)

 

С уважением.

Mastino
Offline
Зарегистрирован: 03.12.2011

Со всеми просто. Но думаю для начала с микросвитчем.

tsvalia
Offline
Зарегистрирован: 03.06.2011

Как быть с "дребезгом"?

Mastino
Offline
Зарегистрирован: 03.12.2011

с каким дребезгом?

leshak
Offline
Зарегистрирован: 29.09.2011

tsvalia пишет:

Как быть с "дребезгом"?

Два варианта: либо плюнуть, либо боротся.

Плюнуть: либо слюной, либо желчью.

Боротся: либо аппаратно, либо программно.

Выбирайте.

tsvalia
Offline
Зарегистрирован: 03.06.2011

Бум бороться. :)

Mastino
Offline
Зарегистрирован: 03.12.2011

с каким дребезгом?

tsvalia
Offline
Зарегистрирован: 03.06.2011

С тем, который возникает при использовании микросвитча или кнопки... Можно добится от кнопки чётко "0" или "1"?

leshak
Offline
Зарегистрирован: 29.09.2011

 >с каким дребезгом?

Кстати ОЧЕНЬ хороший вопрос. Исходя из изначально поставленной задачи более оптимальным будет именно "плюнуть".

P.S. Кстати, ну неужели гугл ничего говорит про то как с дребезгом боростся? Как-то трудно в это поверить.

tsvalia
Offline
Зарегистрирован: 03.06.2011

Говорит само собой, нато он и гугл. :)

http://www.freeduino.ru/arduino/sample_Buttons.html

"Живое" общение всяко продуктивнее.

Mastino
Offline
Зарегистрирован: 03.12.2011

это типо - Debounce?

http://arduino.cc/it/Tutorial/Debounce

tsvalia
Offline
Зарегистрирован: 03.06.2011

Похоже, что да...

leshak
Offline
Зарегистрирован: 29.09.2011

>"Живое" общение всяко продуктивнее.

Для кого, для вас? А для других?

Вы посмотрите на это с другой стороны. Есть ресурс людей. Он ограничен. Если вам ответили на вопрос, который уже отвечен 1000 раз, значит не ответили на какой-то другой вопрос. Возможно более важный и который не имеет очевидного ответа.

И когда вы дойдете до более сложных вопросов - вам отвечать будет некому. Потому что те кто могут ответить, либо отвечают в 10000 раз на очередной "как по кнопке зажечь диод", либо задолбались и вообще перестали отвечать. Вы думаете интрестно отвечать на одни и те же вопросы? Людям которым лень в гугл заглянуть. Ладно бы "заглянул, попробовал, не получается" - тут само-собой помочь нужно.

С документацией вы так же поступаете? Зачем ее читать - проще спросить. А писали/переводили ее наверное от нечего делать.

P.S. Кстати, вы нашли только один ответ как боротся с дребезгом. Можно и без библиотеки (мне лично даже проще). А есть еще и аппаратное решение.

 

tsvalia
Offline
Зарегистрирован: 03.06.2011

Понятно. Вопросов больше не имею.

leshak
Offline
Зарегистрирован: 29.09.2011

 Вы не обижайтесь. Одно дело "вопросы", а другое дело "лень".

Если что-то непонятно, нужно помочь разобратся, не получается - конечно такие вопросы будут восприняты нормально. Если человек сам прикладывает усилия, то почему бы и не помочь? Все были (и есть) новичками, все чего-то не понимают.

А обида - это не продуктивно. Кроме себя вы этим никого не накажете.

Если показалось обидно - извините. Не  ставил такой цели. Хотел объяснить. Причем лично свое видение (я не могу говорить за все сообщество в целом, может кому-то в кайф отвечать вместо гугла).

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

 С дребезгом бороться делаем (10-100мс).

Можно изменением переменной-флага . С флагом щас пример набросаю. 

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011
int flag=0;

void setup()

{

pinMode(13,OUTPUT)

}



void loop ()



{



if(digitalRead(10)==HIGH&&flag==0)

{

digitalWrite(13,!digitalRead(13));//или любое другое действие

delay(50)

flag=1; 

}

if(digitalRead(10)==LOW)

{

flag=0;

}



}

 

Ксожалению нет возможности проверить (в данный момент) , но работать будет.