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

Arduino за стрелки

<< < (8/38) > >>

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] Списък на темите

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

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

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