Arduino:Примеры/Гистограмма расстояния с помощью сдвигового регистра 74HC595 и ИК-датчика расстояния
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Черновик |
Гистограмма расстояния с помощью сдвигового регистра 74HC595 и ИК-датчика расстояния
Данный пример демонстрирует как создать гистограмму расстояния с 8-ю светодиодами задействуя только 3 цифровых контакта Arduino и ИК-датчик расстояния. В этом нам поможет сдвиговый регистр 74HC595.
Схема работы кода(o - светодиод не горит, к - красный светодиод горит, з - зеленый светодиод горит, ж - желтый светодиод горит), где справа указаны значения которые мы будет передавать регистру сдвига:
oooooooo 0
oooooooз 1
ooooooзз 3
oooooззз 7
ooooзззз 15
oooжзззз 31
ooжжзззз 63
oжжжзззз 127
кжжжзззз 255
Сдвиговый регистр это синхронное устройство, он принимает данные по нарастающему фронту сигнала. В данном случае, когда мы подаем на вход SH_CP сдвигового регистра 74HC595 высокий уровень сигнала, все значения, хранящиеся в нем сдвигаются на одну позицию и происходит запись в первую ячейку значения которое установлено на входе DS сдвигового регистра 74HC595. Данные из последней ячейки или отбрасываются или передаются на выход Q7"(при каскадном подключении). За восемь тактов мы можем загрузить в регистр сдвига новые значения. При подаче на вход ST_CP сдвигового регистра 74HC595 высокого уровня напряжения, происходит вывод значений, хранящихся в ячейках, на выходы регистра.
В данном примере мы будем использовать встроенную функцию shiftOut для поразрядной выдачи данных на выход Arduino, которая упростит работу со сдвиговым регистром.
Она принимает в качестве аргументов:
- номер контакта Arduino, подключенный к контакту DS ввода последовательных данных сдвигового регистра;
- номер контакта Arduino, подключенный к тактовому контакту SH_CP сдвигового регистра;
- порядок выдачи битов;
- MSBFIRST - старший бит будет отправлен первым;
- LSBFIRST - младший бит будет отправлен первым;
- значение для вывода на выводы сдвигового регистра;
Необходимые компоненты
- Плата Arduino, 1шт.;
- ИК-датчик расстояния Sharp GP2Y0A41SK0F, 1 шт.;
- Сдвиговый регистр 74HC595, 1 шт.;
- Резистор на 220 Ом, 8 шт.;
- Красный светодиод, 1 шт.;
- Желтый светодиод, 3 шт.;
- Зеленый светодиод, 4 шт.;
- Провода-перемычки;
- Макетная плата, 1 шт.;
Схема
Контакты 1-7, 15 | Q0-Q7 | Выходные контакты |
Контакт 8 | GND | «Земля», Vss |
Контакт 9 | Q7’’ | Контакт для вывода последовательных данных |
Контакт 10 | MR | Контакт, позволяющий «очистить» значения на всех выходных контактах и выставить их на LOW (если подать на него LOW) |
Контакт 11 | SH_CP | Тактовый контакт для сдвигового регистра |
Контакт 12 | ST_CP | Тактовый контакт для регистра данных (контакт-защелка) |
Контакт 13 | OE | Контакт, разрешающий вывод данных (если подать на него LOW) |
Контакт 14 | DS | Контакт для ввода последовательных данных |
Контакт 16 | Vcc | Контакт для питания напряжением с положительным зарядом |
Код
#define SER 8 // Контакт для ввода последовательных данных в сдвиговый регистр
#define LATCH 9 // Тактовый контакт для регистра данных (контакт-защелка)
// служит для одновременного вывода полученных последовательных данных
// на параллельные выходы сдвигового регистра
#define CLK 10 // Тактовый контакт для сдвигового регистра
// При подаче HIGH происходит запись одного бита в сдвиговый регистр
#define DIST 0 // Контакт для подключения датчика расстояния
int vals[9] = {0,1,3,7,15,31,63,127,255}; // возможные значения для регистра сдвига
int maxVal = 500; // максимальное значение расстояния
int minVal = 0; // минимальное значение расстояния
void setup()
{
//Установка выводов как выходов
pinMode(SER, OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(CLK, OUTPUT);
}
void loop()
{
int distance = analogRead(DIST); // считываем значение с датчика расстояния
distance = map(distance, minVal, maxVal, 0, 8); // масштабируем значение
distance = constrain(distance,0,8); // накладываем ограничение на диапазон возможных значений
digitalWrite(LATCH, LOW); // устанавливаем LATCH в LOW, чтобы значения на параллельных выходах
// сдвигового регистра не изменялись во время ввода последовательных
// данных
shiftOut(SER, CLK, MSBFIRST, vals[distance]); // ввод последовательных данных в сдвиговый регистр
digitalWrite(LATCH, HIGH); // устанавливаем LATCH в HIGH для вывода значений
// на параллельные выводы сдвигового регистра
delay(10); // задержка 10 мс.
}