Зертханалық жұмыстың мақсаты: Батырмамен жұмысты өңдеу, батырма дірілі және оны жоюдың бағдарламалық әдістерін қарастыру.
Қажетті компоненттер:
Arduino UNO R3 контроллері;
Макеттік тақта;
Батырма;
Жарықдиоды;
резистор 220 Ом;
резистор 10 кОм;
сымдар.
Arduino D2 контактісін кіріс ретінде пайдаланамыз, ол батырманы жобаға нақты уақыт режимінде қосуға мүмкіндік береді. Arduino-ны кіріс ретінде пайдаланғанда Arduino кірісі «белгісіздік» (бұл күйде еркін мәндерді қабылдайды) күйінде болмай, алдын-ала белгілі (0 немесе 1) күйінде болуы үшін pull-up және pull-down резисторлар қолданылады. Pull-up резисторлары кірісті +5В қуат көзіне тартады, pull-down резисторлар кірісті GND-ға тартады. Сондай-ақ pull-up және pull-down резисторлар батырманы басқан кезде +5В пен жер арасында қысқа тұйықталуды болдырмайды. Бұл тәжірибеде батырманы қосу үшін pull-down резисторды пайдаланамыз. Қосылу сызбасы сурет 2.1-де көрсетілген.
Сурет 2.1 Батырма мен жарықдиодын қосу сызбасы
Орындау реті: Жарықдиодының ұзын аяғын (анод) D10 сандық шығуына, екіншісін (катод) 220 Ом резистор арқылы GND шығуына жалғау;
Батырманың бір кірісін +5В-қа, екіншісін 10 кОм резистор арқылы арқылы GND-ға, батырма шығуын D2 кірісіне қосу (сурет 2.1);
Жарықдиодының күйін (қосу/өшіру) батырмаға әр басқан сайын өзгерту.
Листинг 2.2
const int LED=10; // Контакт 10 жарықдиодын қосуға
const int BUTTON=2; // Контакт 2 батырманы қосуға
int curButton = LOW; // Батырманың ағымдағы күйін сақтауға
int prevButton = LOW; // Батырманың алдыңғы күйін сақтауға
boolean ledOn = false; //Жарықдиодының ағымдағы күйі (қосылған/өшірілген)
void setup()
{
// Жарықдиодының контактісін шығысқа конфигурациялау
pinMode (LED, OUTPUT);
// Жарықдиодының контактісін кіріске конфигурациялау
pinMode (BUTTON, INPUT);
}
void loop()
{
curButton=digitalRead(BUTTON);
if (curButton == HIGH && prevButton == LOW)
{
// батырмаға басып жарықдиодын күйін өзгерту
ledOn=!ledOn;
digitalWrite(LED, ledOn);
}
prevButton=curButton;
}
Батырманы басқан кезде жарықдиоды күйін өзгертуі керек, бірақ бұл түймелердің «дірілінен» әрдайым бола бермейді. Батырма - бұл серіппелі байланыс жүйесі бар механикалық құрылғы. Батырманы төмен басқанда, сигнал төменгіден жоғарыға дейін өзгере салмайды, ол бірнеше миллисекунд ішінде контактілер тығыз байланыста болғанша жоғары мән орнатылғанға дейін бір мәннен екіншісіне ауысады. Микроконтроллер барлық осы басуларды тіркейді, өйткені «діріл» батырманы нақты басудан ажыратылмайды. Дірілдің әсерін бағдарламалық түрде жоюға болады. Алгоритмі келесідей:
1. Батырманың алдыңғы күйін және батырманың ағымдағы күйін сақтау (төмен инициализацияланған кезде);
2. Батырманың ағымдағы күйін оқу;
3. Егер батырманың ағымдағы күйі батырманың алдыңғы күйінен өзгеше болса, 5 мс күту, өйткені батырма күйін өзгерткен болуы мүмкін.
4. 5 мс кейін батырманың күйін оқып, оны батырманың ағымдағы күйі ретінде қолдану;
5. Егер батырманың алдыңғы күйі LOW болса және түйменің ағымдағы күйі HIGH болса, жарықдиодының күйін ауыстыру;
6. Батырманың ағымдағы күйі үшін батырманың алдыңғы күйін орнату.
Алгоритм нәтижесінде листинг 2.2-де көрсетілген код шығады.
Листинг 2.2
const int LED=10; // Контакт 10 жарықдиодын қосуға
const int BUTTON=2; // Контакт 2 батырманы қосуға
int curButton = LOW; // Батырманың ағымдағы күйін сақтауға
int prevButton = LOW; // Батырманың алдыңғы күйін сақтауға
boolean ledOn = false; // Жарықдиодының ағымдағы күйі (қосылған/өшірілген)
void setup()
{
// Жарықдиодының контактісін шығысқа конфигурациялау
pinMode (LED, OUTPUT);
// Жарықдиодының контактісін кіріске конфигурациялау pinMode (BUTTON, INPUT);
}
// Дребезгті тегістеу функциясы. Батырманың алдыңғы күйін аргумент ретінде қабылдайды және нақты мәнін береді
boolean debounce(boolean last)
{
boolean current = digitalRead(BUTTON); // Батырма күйін оқу
if (last != current) // егер өзгерсе
{
delay(5); // 5 мс күті
current = digitalRead(BUTTON); // батырма күйін оқу
return current; // батырма күйін қайтару
}
}
void loop()
{
curButton = debounce(prevButton);
if (prevButton == LOW && curButton == HIGH) // егер басылса
{
ledOn = !ledOn; // жарықдиоды күйінің мәнін инвертациялау
}
prevButton = curButton;
digitalWrite(LED, ledOn); // жарықдиоды күйінің статусын өзгерту
}
Скетчті Arduino тақтасына жүктеп, жұмысты тексереміз. Енді жоба дұрыс жұмыс істеуі керек, батырманы басқан сайын жарықдиодының күйі өзгеруі тиіс.