Преди да продължа със следващата стъпка, а именно връзване на светодиодна индикация, трабва да поясня, че входно-изходните пинове на ардуиното имат ограничения по ток, като максималния е 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);
}
}
}// край