← Секундомер | Оглавление | Комнатный термометр →
В этом эксперименте мы выводим на семисегментный индикатор количество нажатий на кнопку (единицы).
Список деталей для эксперимента
- 1 плата Arduino Uno
- 1 беспаечная макетная плата
- 1 тактовая кнопка
- 1 выходной сдвиговый регистр 74HC595
- 1 семисегментный индикатор
- 7 резисторов номиналом 220 Ом
- 24 провода «папа-папа»
Для дополнительного задания
- 1 фоторезистор
- 1 резистор номиналом 10 кОм
- еще 1 провод
Принципиальная схема
Схема на макетке
Обратите внимание
- В этом эксперименте мы впервые используем микросхему, в данном случае — выходной сдвиговый регистр 74HC595. Микросхемы полезны тем, что позволяют решать определенную задачу, не собирая каждый раз стандартную схему.
- Выходной сдвиговый регистр дает нам возможность «сэкономить» цифровые выходы, использовав всего 3 вместо 8. Каскад регистров позволил бы давать 16 и т.д. сигналов через те же три пина.
- Перед использованием микросхемы нужно внимательно изучить схему ее подключения в datasheet’е. Для того, чтобы понять, откуда считать ножки микросхемы, на них с одной стороны есть полукруглая выемка. Если мы расположим нашу 74HC595 выемкой влево, то в нижнем ряду будут ножки 1—8, а в верхнем 16—9.
- На принципиальной схеме нашего эксперимента ножки расположены в другом порядке, чтобы не вышло путаницы в соединениях. Назначения выводов согласно datasheet’у подписаны внутри изображения микросхемы, номера ножек — снаружи.
- Напомним, что на изображении семисегментного индикатора подписаны номера его ножек и их соответствие сегментам.
Скетч
- p140_seven_segment_clicker.ino
-
#define DATA_PIN 13 // пин данных (англ. data)#define LATCH_PIN 12 // пин строба (англ. latch)#define CLOCK_PIN 11 // пин такта (англ. clock)#define BUTTON_PIN 10 int clicks =; boolean buttonWasUp =true; byte segments[10]={0b01111101, 0b00100100, 0b01111010, 0b01110110, 0b00100111, 0b01010111, 0b01011111, 0b01100100, 0b01111111, 0b01110111}; void setup(){ pinMode(DATA_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(LATCH_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP);} void loop(){// считаем клики кнопки, как уже делали это раньшеif(buttonWasUp &&!digitalRead(BUTTON_PIN)){ delay(10);if(!digitalRead(BUTTON_PIN)) clicks =(clicks +1)%10;} buttonWasUp = digitalRead(BUTTON_PIN);// для записи в 74HC595 нужно притянуть пин строба к земле digitalWrite(LATCH_PIN, LOW);// задвигаем (англ. shift out) байт-маску бит за битом,// начиная с младшего (англ. Least Significant Bit first) shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, segments[clicks]);// чтобы переданный байт отразился на выходах Qx, нужно// подать на пин строба высокий сигнал digitalWrite(LATCH_PIN, HIGH);}
Пояснения к коду
- Обратите внимание, что в этом эксперименте кодировки символов отличаются от кодировок из эксперимента «Секундомер».
- Для того, чтобы передать порцию данных, которые будут отправлены через сдвиговый регистр далее, нам нужно подать
LOW
на latch pin (вход STcp микросхемы), затем передать данные, а затем отправитьHIGH
на latch pin, после чего на соответствующих выходах 74HC595 появится переданная комбинация высоких и низких уровней сигнала. - Для передачи данных мы использовали функцию
shiftOut(dataPin, clockPin, bitOrder, value)
. Функция ничего не возвращает, а в качестве параметров ей нужно сообщить- пин Arduino, который подключен ко входу DS микросхемы (data pin),
- пин Arduino, соединенный со входом SHcp (clock pin),
- порядок записи битов:
LSBFIRST
(least significant bit first) — начиная с младшего, илиMSBFIRST
(most significant bit first) — начиная со старшего, - байт данных, который нужно передать. Функция работает с порциями данных в один байт, так что если вам нужно передать больше, придется вызывать ее несколько раз.
Вопросы для проверки себя
- Для чего нужны микросхемы? Для чего нужен выходной сдвиговый регистр?
- Как найти ножку микросхемы, на которую отправляются данные?
- Что нужно сделать до и после отправки собственно данных на 74HC595?
- Сколько данных можно передать с помощью
shiftOut()
и как управлять порядком их передачи?
Задания для самостоятельного решения
- Заставьте
shiftOut()
отправлять биты, начиная со старшего, и измените код так, чтобы счетчик по-прежнему показывал арабские цифры. - Замените кнопку на датчик света (фоторезистор в схеме делителя напряжения) и переделайте программу так, чтобы индикатор цифрой показывал уровень освещенности.
← Секундомер | Оглавление | Комнатный термометр →
—>Arduino. Эксперимент 14. Счётчик нажатий
В этом эксперименте мы выводим на семисегментный индикатор количество нажатий на кнопку (единицы). СПИСОК ДЕТАЛЕЙ ДЛЯ ЭКСПЕРИМЕНТА— 1 плата Arduino Uno;— 1 беспаечная макетная плата;— 1 тактовая кнопка;— 1 выходной сдвиговый регистр 74HC595;— 1 семисегментный индикатор;— 7 резисторов номиналом 220 Ом;— 24 провода «папа-папа».ДЕТАЛИ ДЛЯ ДОПОЛНИТЕЛЬНОГО ЗАДАНИЯ— 1 фоторезистор;— 1 резистор номиналом 10 кОм;— еще 1 провод.ПРИНЦИПИАЛЬНАЯ СХЕМАСХЕМА НА МАКЕТНОЙ ПЛАТЕОБРАТИТЕ ВНИМАНИЕ
СКЕТЧскачать скетч для Arduino IDE
ПОЯСНЕНИЯ К КОДУ
ВОПРОСЫ ДЛЯ ПРОВЕРКИ СЕБЯ
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО РЕШЕНИЯ
С оригиналом статьи вы можете ознакомиться на сайте Amperka.ru ЭКСПЕРИМЕНТ 13 | ОГЛАВЛЕНИЕ | ЭКСПЕРИМЕНТ 15 |
—>Категория—>:Простые эксперименты | —>Добавил—>:Decay_Dance (15.03.2016) |
—>Просмотров—>:5323 | | |
—>Используемые источники:
- http://wiki.amperka.ru/конспект-arduino:счетчик-нажатий
- http://virtuallab.by/publ/programmiruem_vmeste/prostye_ehksperimenty/arduino_ehksperiment_14_schjotchik_nazhatij/36-1-0-267