Електроника и Електротехника | Electronics and Electrical Engineering > Аналогово управление | Analog Control
Arduino за стрелки
emilchaushev:
Преди да продължа със следващата стъпка, а именно връзване на светодиодна индикация, трабва да поясня, че входно-изходните пинове на ардуиното имат ограничения по ток, като максималния е 40 мА, но се препоръчва да не надвишаваме 20мА
Ето една кратка схема за ограниченията както на отделните портове, така и на групите от портове:
Повече подробности за любопитните: https://playground.arduino.cc/Main/ArduinoPinCurrentLimitations
Следващия пример е следствие на последния- управление с един бутон, но с два изхода за светодиоди- единия за право, другия за отклонение. Връщайки се на първия пост в темата отново напомням, че това не е оптималния вариант, защото се хабят излишно портове на Ардуиното. (само лека забежка- моментна, която ще разяснявам в следващи постове- има няколко варианта за използване на един изход , който с логически елемент 74хх да разклоняваме и инвертираме, за да пестим портове на Ардуино)
Ето и опитната постановка:
Разчитаме на резисторите на изходите за ограничаване на тока, като дори да използваме от старите светодиоди, можем да направим сметка при 5V и 17мА ток какъв резистор да си сложим
===============
КОД
#include <Servo.h>
// константни променливи използвани за ъглите на сервото в градуси
const int straight = 90;
const int divergent = 110;
// Константни променлилви за пиновете, които се използват
const int divergent_led = 6;
const int straight_led = 7;
const int buttonpin = 8;
const int servopin = 9;
// константа със стойност за забавяне на движението на сервото в милисекунди
const int step_delay = 70;
// декларираме сервото
Servo myservo;
// глобални променливи за запомняне позицията на сервото
int pos = straight; // current
int old_pos = pos; // previous
void setup()
{
// настройване (инициализация) на режима на пиновете, които ще се ползват
pinMode(buttonpin, INPUT);
pinMode(straight_led, OUTPUT);
pinMode(divergent_led, OUTPUT);
// инициализация на сервото
myservo.attach(servopin); // attach to the servo on pin 9
myservo.write(pos); // set the initial servo position
// настройка на първоначалния статус на светодиодите
digitalWrite(straight_led, HIGH);
digitalWrite(divergent_led, LOW);
}
void loop()
{
// всяка итерация започва с промяна на състоянието на бутона
// при натиснат бутон (reads HIGH), се премества сервото
int button_state = digitalRead(buttonpin);
if(button_state == HIGH){
// Изключва LED-а
if(pos == straight){
digitalWrite(straight_led, LOW);
} else {
digitalWrite(divergent_led, LOW);
}
old_pos = pos; // запазваме текущата позиция
// променя позицията в обратното състояние
pos = pos == straight ? divergent: straight;
// премества сервото до новата позиция
if(old_pos < pos){ // ако новия ъгъл е по- голям
//завърта (увеличава) серво позицията от старото до новото състояние
for(int i = old_pos + 1; i <= pos; i++){
myservo.write(i); // записва следващата позиция на сервото
delay(step_delay); // пауза
}
} else { // обратно новия ъгъл е по- малък и ли равен
// завърта (намалява) серво позицията
for(int i = old_pos - 1; i >= pos; i--){
myservo.write(i); // записва следващата позиция на сервото
delay(step_delay); // пауза
}
}
// Запалва съответния LED.
if(pos == straight){
digitalWrite(straight_led, HIGH);
} else {
digitalWrite(divergent_led, HIGH);
}
}
}// край
pach:
Митко, съжалявам за езика там....но така пишат понякога хамершканците. Още повече, щото смятат, че те са целия свят!!!
"Голяма работа", че например ние не знаем нито кой е Рик Флин,
нито какъв е другия клуб от който са взели макета и какво по дяволите е "Стъфи" дето не работел достатъчно много по него....
Примера по-горе е от план А (в момента са на план С) и съм го
дол само са се види, че едно ардуиното модулче има капацитета и
може да управлява до три стрелки и тъчскрийн цветен дисплей от 5 см.
Както написах и под снимката - останалото е въпрос на графика и код за по-приятно вид. Както и това е важно - вместо евтините китайски драйвири, могат да се сложат всякакви други, които да
врътката коректно сервомашинки. Емчо също по-горе уточнява, че вероятно ще слага разширение в изходите, за да подобри възможностите за натоварването им.
Нали разбираш, че план С, вероятно ще си остане в хамершканците и едва ли ще го споделят със света (дето не го и знаят), така че, излишно си се мъчил да си превеждаш текста - той само казва какво правят, но не и начина по който (ще) става!
:drinks:
А сега като "зарибих" и други за дисплей (и тъчскрийн),
ще следя с интерес темата и уроците от Чаушев!
:hi:
pach:
Не знам Емчо докъде е докарал проекта ...лято...море... отпуски!!!
:drinks: bg&flag :beach:
Но докато сме на страничната тема за тъч дисплей :victory:
ето едно мноооого приятно възможно решение:
https://youtu.be/E0iDrJERb98
Въпрос на проектиране и всичко което се полага, за да стане
един красив "екранопулт" за управление заедно с ардуйно-то на десет машинки ( разклонения)!
... примерно!!!
Редактора е много готин, но си иска и един тъч на ръка, за да се експериментира все пак за пълните му възможности.
Но за това, като го докарате до екран-а!!!
:hi:
pavel75:
--- Цитат на: emilchaushev link=topic=4987.msg108558#msg108558 date=1501244503 ---.......
===============
КОД
#include <Servo.h>
// константни променливи използвани за ъглите на сервото в градуси
const int straight = 90;
const int divergent = 110;
// Константни променлилви за пиновете, които се използват
const int divergent_led = 6;
const int straight_led = 7;
const int buttonpin = 8;
const int servopin = 9;
// константа със стойност за забавяне на движението на сервото в милисекунди
const int step_delay = 70;
// декларираме сервото
Servo myservo;
// глобални променливи за запомняне позицията на сервото
int pos = straight; // current
int old_pos = pos; // previous
void setup()
{
// настройване (инициализация) на режима на пиновете, които ще се ползват
pinMode(buttonpin, INPUT);
pinMode(straight_led, OUTPUT);
pinMode(divergent_led, OUTPUT);
// инициализация на сервото
myservo.attach(servopin); // attach to the servo on pin 9
myservo.write(pos); // set the initial servo position
// настройка на първоначалния статус на светодиодите
digitalWrite(straight_led, HIGH);
digitalWrite(divergent_led, LOW);
}
void loop()
{
// всяка итерация започва с промяна на състоянието на бутона
// при натиснат бутон (reads HIGH), се премества сервото
int button_state = digitalRead(buttonpin);
if(button_state == HIGH){
// Изключва LED-а
if(pos == straight){
digitalWrite(straight_led, LOW);
} else {
digitalWrite(divergent_led, LOW);
}
old_pos = pos; // запазваме текущата позиция
// променя позицията в обратното състояние
pos = pos == straight ? divergent: straight;
// премества сервото до новата позиция
if(old_pos < pos){ // ако новия ъгъл е по- голям
//завърта (увеличава) серво позицията от старото до новото състояние
for(int i = old_pos + 1; i <= pos; i++){
myservo.write(i); // записва следващата позиция на сервото
delay(step_delay); // пауза
}
} else { // обратно новия ъгъл е по- малък и ли равен
// завърта (намалява) серво позицията
for(int i = old_pos - 1; i >= pos; i--){
myservo.write(i); // записва следващата позиция на сервото
delay(step_delay); // пауза
}
}
// Запалва съответния LED.
if(pos == straight){
digitalWrite(straight_led, HIGH);
} else {
digitalWrite(divergent_led, HIGH);
}
}
}// край
--- Край на цитат ---
Имаме следният случай - сервото е на позиция 90 градуса, когато схемата се изключва.
При следващо включване при инициализацията /отбелязаното в тъмно/ е дадено сервото да се завърти на 90 градуса.
Реално то е на тези градуси. Какво ще се случи? - Сервото няма да мръдне или ще направи движение?
pach:
Няма да мръдне!
То си е изравнило исканите показания и подава
обратно, че Е на 90 градуса.
Навигация
[0] Списък на темите
Премини на пълна версия