Arduino:Примеры/Гистограмма расстояния с помощью сдвигового регистра 74HC595 и ИК-датчика расстояния

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

Проверка/Оформление/Редактирование: Мякишев Е.А.


Pixel Art Mini Meow Animated.gif Черновик


Гистограмма расстояния с помощью сдвигового регистра 74HC595 и ИК-датчика расстояния

Данный пример демонстрирует как создать гистограмму расстояния с 8-ю светодиодами задействуя только 3 цифровых контакта Arduino и ИК-датчик расстояния. В этом нам поможет сдвиговый регистр 74HC595.

Схема работы кода(o - светодиод не горит, к - красный светодиод горит, з - зеленый светодиод горит, ж - желтый светодиод горит), где справа указаны значения которые мы будет передавать регистру сдвига:

1 oooooooo 0
2 oooooooз 1
3 ooooooзз 3 
4 oooooззз 7
5 ooooзззз 15
6 oooжзззз 31
7 ooжжзззз 63 
8 oжжжзззз 127
9 кжжжзззз 255

Сдвиговый регистр это синхронное устройство, он принимает данные по нарастающему фронту сигнала. В данном случае, когда мы подаем на вход SH_CP сдвигового регистра 74HC595 высокий уровень сигнала, все значения, хранящиеся в нем сдвигаются на одну позицию и происходит запись в первую ячейку значения которое установлено на входе DS сдвигового регистра 74HC595. Данные из последней ячейки или отбрасываются или передаются на выход Q7"(при каскадном подключении). За восемь тактов мы можем загрузить в регистр сдвига новые значения. При подаче на вход ST_CP сдвигового регистра 74HC595 высокого уровня напряжения, происходит вывод значений, хранящихся в ячейках, на выходы регистра.

В данном примере мы будем использовать встроенную функцию shiftOut для поразрядной выдачи данных на выход Arduino, которая упростит работу со сдвиговым регистром.

Она принимает в качестве аргументов:

  • номер контакта Arduino, подключенный к контакту DS ввода последовательных данных сдвигового регистра;
  • номер контакта Arduino, подключенный к тактовому контакту SH_CP сдвигового регистра;
  • порядок выдачи битов;
    • MSBFIRST - старший бит будет отправлен первым;
    • LSBFIRST - младший бит будет отправлен первым;
  • значение для вывода на выводы сдвигового регистра;

Необходимые компоненты

Схема

Arduino uno ledbar ir distance 1.png
Распиновка сдвигового регистра 74HC595
Контакты 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 Контакт для питания напряжением с положительным зарядом
Распиновка ИК-датчика расстояния Sharp GP2Y0A41SK0F

Код

 1 #define SER   8                                      // Контакт для ввода последовательных данных в сдвиговый регистр
 2 #define LATCH 9                                      // Тактовый контакт для регистра данных (контакт-защелка) 
 3                                                      // служит для одновременного вывода полученных последовательных данных  
 4                                                      // на параллельные выходы сдвигового регистра
 5 #define CLK   10                                     // Тактовый контакт для сдвигового регистра
 6                                                      // При подаче HIGH происходит запись одного бита в сдвиговый регистр
 7 #define DIST  0                                      // Контакт для подключения датчика расстояния
 8 
 9 int vals[9] = {0,1,3,7,15,31,63,127,255};            // возможные значения для регистра сдвига    
10 
11 int maxVal = 500;                                    // максимальное значение расстояния
12 int minVal = 0;                                      // минимальное значение расстояния
13 
14 void setup()
15 {
16   //Установка выводов как выходов
17   pinMode(SER, OUTPUT);
18   pinMode(LATCH, OUTPUT);
19   pinMode(CLK, OUTPUT);
20 }
21 
22 void loop()
23 {
24 int distance = analogRead(DIST);                     // считываем значение с датчика расстояния
25 distance = map(distance, minVal, maxVal, 0, 8);      // масштабируем значение
26 distance = constrain(distance,0,8);                  // накладываем ограничение на диапазон возможных значений
27 
28 digitalWrite(LATCH, LOW);                            // устанавливаем LATCH в LOW, чтобы значения на параллельных выходах
29                                                      // сдвигового регистра не изменялись во время ввода последовательных 
30                                                      // данных
31 shiftOut(SER, CLK, MSBFIRST, vals[distance]);        // ввод последовательных данных в сдвиговый регистр
32 digitalWrite(LATCH, HIGH);                           // устанавливаем LATCH в HIGH для вывода значений
33                                                      // на параллельные выводы сдвигового регистра
34 delay(10);                                           // задержка 10 мс.
35 }

См.также

Внешние ссылки