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

Arduino за стрелки

<< < (3/38) > >>

jopeto:
С аруиното може да движиш и стъпкови мотори., може би с тях ще имате по-голям успех от колкото със серво машинка.

stefanoff:
Да споделя моя скромен опит с Ардуино. Не претендирам че съм специалист на тема електроника и програмиране но
имам и се базикам и с трите варианта на контролера или  реплики на оригинала с имената "Нано", "Уно" и "Мега".
IMG_20170725_190745 by Dimitar Stefanoff, on Flickr
Разликата между тях са размерите, броя портове и размера на паметта и процесорите. Имам разни датчици, бутони, превключватели, релета, експериментални "дъски" ,"шилдове"и не на последно място серво и стъпкови мотори - всичко окабелено и стандартизирано.
IMG_20170725_191249 by Dimitar Stefanoff, on Flickr
IMG_20170725_191313 by Dimitar Stefanoff, on Flickr
IMG_20170725_191642 by Dimitar Stefanoff, on Flickr
 Та по темата:
Нямам задвижено на макета нищо за в момета, но експериментирам с програмирането на платките и свързването на елементите. Когато всичко подкарам, тогава ще запоя всичко по шилдовете. На малкия макет си бях направил автоматизация. Управлявах автоматично бариерата когато наближи или се отдалечи влака, влака спираше плавно на перона изчакваше и пак плавно потегляше - "ШИМ" на захранването управлявано от рид-ампули между релсите и магнит на локомотива.
Пограмирам на "miniBloq" това графична среда за програмиране на Ардуино, не може да се сравнява с оригиналния софтуер  но за задачите които имам ми стига. Единственото ограничение което имам там е че не мога да програмирам повече от 3 сервомотора на платка, но съм го решил с увеличаване на броя на платките. Управлението на сърцата на стрелките може да стане според мен с обикновено реле, Ардуино си има готови модули, доста от нещата съм ги прибрал на високо и не можах да ги издиря да снимам. Захранвам с най обикновено зарядно за телефон с USB. Забавно е и е доста идейно след като почнеш. Поздрави.

emilchaushev:
Пример 4:

Тъй като през по- голяма част от времето сервото е в покой, не е необходимо то да бъде контролирано , защото шуми. Именно с цел намаляване на шума, можем след изпълнение на командите, които са ни необходими да детачваме серво контрола. При следваща команда за изпълнение първо атачваме, подаваме команда и пак детачваме.

Кода
=========================
#include <Servo.h>

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

const int servoPin = 2;// декларираме изхода за контрол на сервото

void setup() {
  servo.attach(servoPin); // атачваме сервото за първоначално позициониране
  servo.write(90); // завъртаме го на 90 градуса
  delay(500); //пауза
  servo.detach(); //детачваме сервото да за не шуми
  delay(500); //пауза
}

void loop() {
  servo.attach(servoPin);  //атачваме сервото, като посочваме и пина

  servo.write(60); //завъртаме на 60 градуса
  delay(500); //пауза
  servo.write(120);  //завъртаме на 120 градуса
  delay(500); //пауза
  servo.write(90); // завъртаме на 90 градуса

  servo.detach(); //детачваме
  delay(500); //пауза
}

emilchaushev:
От тук нататък ще пристъпим към използване на бутони/ключета за контрол на сервото, като входни портове.

За да започна обяснението, ще използвам схема, в която имаме два бутона (вариант 1 от описанието от няколко поста по-горе), единия за обръщане на сервото в права, а другия за обръщане в отклонение. Както казах този вариант е доста разхищаваш от гледна точка на използване на портовете, но е най- близо до логиката, която всички ползваме и в момента по пултовете на макетите си. Естествено вместо два бутона , може да се използва (ON)-OFF-(ON) ЦК ключ, при който имаме една стабилна средна позиция, и две незадържащи крайни позиции.

Описание на опитната постановка:

Използвам схемата от картинката, при която на порт 2 връзвам единия ключ, на порт 3 другия. На порт 9 се връзва сервото. Портове 2 и 3 са постоянно подвързани през резистори 1кОм към маса. Това се налага за да гарантираме и осигурим стабилен нисък потенциал на порта в спокойно състояние, което със сигурност да се отличава от +5V, (висок потенциал), които ще подаваме и ще бъде критерий за превключването.




===================
КОД 1: Завъртаме сервото на 0 градуса за право и 180 градуса за отклонение

Трябва да отбележа, че използваме завъртане през 1 градус до достигане на противоположната позиция като след всеки градус изчакваме с по 15 ms с цел по- бавно завъртане.

#include<Servo.h>
int pos = 0;  //декларираме променлива, в която да се записва текущата позиция на завъртането
Servo servo1; //декларираме сервото с име servo1
void setup() {
 pinMode(2, INPUT);  //декларираме порт 2 за входен
 pinMode(3, INPUT);  //декларираме порт 3 за входен
 servo.attach(9);       //декларираме порт 9 за сервото
}
void loop() {
 while (digitalRead(2) == HIGH && pos < 180)
{
   pos++;
   servo1.write(pos);
   delay(15);
 }
 while (digitalRead(3) == HIGH && pos > 0)
{
   pos--;
   servo1.write(pos);
   delay(15);
 }
}


====================
КОД2: Ако искаме например завъртането за право да е на 70 градуса, а за отклонение на 110, като началната инициализация на сервото е на 90 градусова позиция, горния код се преработва до следния:

#include<Servo.h>
int pos = 90;  //декларираме променлива, в която да се записва текущата позиция на завъртането
Servo servo1;  //декларираме сервото с име servo1
void setup() {
 pinMode(2, INPUT);  //декларираме порт 2 за входен за отклонение
 pinMode(3, INPUT);  //декларираме порт 3 за входен за право
 servo.attach(9);       //декларираме порт 9 за сервото
 servo1.write(pos);    //поставяме сервото на 90 градуса
}
void loop() {
 while (digitalRead(2) == HIGH && pos < 110)
 {
   pos++;
   servo1.write(pos);
   delay(15);
 }
 while (digitalRead(3) == HIGH && pos > 70)
 {
   pos--;
   servo1.write(pos);
   delay(15);
 }
}

emilchaushev:
Недостатък или предимство на горните два кода е, че трябва бутона да бъде натиснат през целия ход на сервото. Ако го пуснете преди да е стигнало крайна позиция сервото ще спре.

Ето и видео демонстрация: https://youtu.be/Y6l4wRgkX-w

Навигация

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

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

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

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