Електроника и Електротехника | Electronics and Electrical Engineering > Аналогово управление | Analog Control
Arduino за стрелки
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] Списък на темите
Премини на пълна версия