Блог

● Проект 9: Матрица светодиодная 8x8

Опубликовано: 23.04.2018
В этом эксперименте мы рассмотрим каскадное подключение нескольких микросхем 74HC595, что позволит, используя 3 вывода Arduino, управлять множеством контактов, что будет продемонстрировано в примере вывода фигур на экран светодиодной матрицы 8×8.

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

контроллер Arduino UNO R3;
плата для прототипирования;
светодиодная RGB матрица 8×8;
• микросхема 74HC595 – 2 штуки;
провода папа-папа.
провода папа-мама.

В светодиодных матрицах светодиоды расположены в определенном порядке, а выводы расположены в удобном для монтажа порядке. Светодиодные матрицы бывают одноцветными, двухцветными и RGB. В эксперименте будем использовать двухцветную светодиодную матрицу FYM-23881BUG-11, которая представляет собой набор из 64 светодиодов зеленого цвета, собранных в матрицу 8×8. Расположение выводов матрицы показано на рис. 9.1.



Для подключения светодиодной матрицы к Arduino будем использовать каскадное подключение 2 микросхем 74HC595. При таком подключении биты из первого регистра будут проталкиваться в следующий в каскаде регистр. Нужно подсоединить вывод QH’ первого регистра к пину DS (MOSI). Схема соединений показана на рис. 9.2.

Arduino проект www.arduino-kit.ru
Рис. 9.2. Схема подключения светодиодной матрицы

Для формирования изображения матрицы будем использовать динамическую индикацию для каждого столбца. Каждые 3 секунды будем менять фигуру для матрицы. Данные фигур хранятся в массиве figure[]. Содержимое скетча показано в листинге 9.1.


// подключение библиотеки SPI
#include <SPI.h>
int ss_pin=8; // пин SS
int pos=0; //
int offfigure=0; // текущая фигура для отображения
unsigned long millis1=0;
// массив с данными фигур для отображения
byte figure[2][8]={
{B10011001,B10011001,B10011001,B10000001,B10000001,B10011001,B10011001,B10011001},
{B10101010,B10101010,B10101010,B10101010,B10101010,B10101010,B10101010,B10101010}
};
void setup()
{
SPI.begin();
// Сконфигурировать контакт SS как выход
pinMode(ss_pin, OUTPUT);
}
void loop()
{
digitalWrite(ss_pin, LOW);
// столбцы
SPI.transfer(B00000001<<pos);
// строки
SPI.transfer(figure[offfigure][pos]);
digitalWrite(ss_pin,HIGH); // вывести данные на выводы 74HC595
delay(1);
pos=(pos+1)%8;
if(millis()-millis1>3000) // через 3 секунды – новая фигура
{
offfigure=(offfigure+1)%2;
millis1=millis();
}
}

Порядок подключения:

1. Подключаем матрицу по схеме на рис. 9.2.
2. Загружаем в плату Arduino скетч из листинга 9.1.
3. Наблюдаем процесс попеременного выводы фигур на экране
матрицы.

Листинги программ скачать
Читать далее

● Проект 8: Микросхема сдвигового регистра 74НС595. Управляем матрицей из 4 разрядов, экономим выходы Arduino

Опубликовано: 23.04.2018
В этом эксперименте мы рассмотрим работу Arduino с микросхемой 74HC595 – расширителем выходов, позволяющей уменьшить количество выводов Arduino для управления 4-разрядной семисегментной матрицей.

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

контроллер Arduino UNO R3;
плата для прототипирования;
4-разрядная семисегментная матрица;
• микросхема 74HC595;
резистор 510 Ом – 7 штук;
провода папа-папа.

Цифровых выводов Arduino Nano и UNO, а иногда даже и Arduino Mega может не хватить, если требуется управлять большим количеством выводов. В этом случае можно использовать микросхему 74HC595. Микросхема 74HC595 – восьмиразрядный сдвиговый регистр с последовательным вводом, последовательным или параллельным выводом информации, с триггером-защелкой и тремя состояниями на выходе. Назначение контактов микросхемы 74HC595 показано на рис. 8.1.
Для управления нам вполне достаточно всего лишь трех выводов: SH_CP, ST_CP и DS. Когда на тактовом входе SH_CP появляется логическая единица, регистр считывает бит со входа данных DS и записывает его в самый младший разряд. При поступлении на тактовый вход следующего импульса все повторяется, только бит, записанный ранее, сдвигается на один разряд, а его место занимает вновь пришедший бит. Когда все восемь битов заполнились, и приходит девятый тактовый импульс, регистр снова начинает заполняться с младшего разряда, и все повторяется вновь.
Чтобы данные появились на выходах Q0…Q7, нужно их ≪защелкнуть≫. Для этого необходимо подать логическую единицу на вход ST_CP. Чтобы мы ни делали с регистром, данные на выходах не изменятся, пока мы вновь не ≪защелкнем≫ их.
Вывод Q7" предназначен для последовательного (каскадного) соединения сдвиговых регистров. При таком подключении биты из первого регистра будут проталкиваться в следующий в каскаде регистр, из него – в следующий и т. д. Таким образом, каскад из двух 8-битных регистров будет работать как один 16-битный. Можно соединить сколько угодно микросхем.
В следующем эксперименте со светодиодной матрицей мы рассмотрим каскадное подключение микросхем 74HC595, в данном эксперименте мы используем только одну микросхему – восемь выводов микросхемы 74HC595 подключены к восьми сегментам матрицы, четыре вывода матрицы для выбора разряда подключены к четырем выводам платы Arduino. Схема подключения представлена на рис. 8.2.
 
Arduino проект www.arduino-kit.ru
Рис. 8.2. Схема подключения 4-разрядного семисегментного индикатора с использованием сдвиговых регистров 74HC595

Приступаем к написанию скетча запуска и останова секундомера 0–999 сек с точностью 0.1 сек. Используем библиотеку Arduino SPI. Поскольку при использовании библиотеки SPI применяются Arduino выводы 11 и 13, для выбора регистров матрицы используем выводы Arduino 4, 5, 6, 7. Содержимое скетча показано в листинге 8.1.
 
// Подключение библиотеки SPI
#include <SPI.h>
// пин SS
int pin_spi_ss=8;
// значения для вывода цифр 0-9
byte numbers[10] = { B11111100, B01100000, B11011010,
B11110010, B01100110, B10110110,B10111110, B11100000, B11111110,B11110110};
// переменная для хранения значения текущей цифры
int number=0;
int number1=0;
int number2=0;
// семисегментного индикатора
int pindigits[4]={4,5,6,7};
// переменная для хранения текущего разряда
int digit=0;
//
unsigned long millis1=0;
void setup()
{
SPI.begin();
// Сконфигурировать контакты как выходы
pinMode(pin_spi_ss,OUTPUT);
for(int i=0;i<4;i++)
{pinMode(pindigits[i],OUTPUT);
digitalWrite(pindigits[i],HIGH);
}
}
void loop()
{
if(millis()-millis1>=100)
{millis1=millis1+100;
number=number+1;
if(number==10000)
number=0;
}
number1=number;
for(int i=0;i<4;i++)
{
  number2=number1%10;
number1=number1/10;
showNumber(number2,i);
for(int j=0;j<4;j++)
digitalWrite(pindigits[j],HIGH);
digitalWrite(pindigits[i],LOW);
delay(1);
}
}
// функция вывода цифры на семисегментный индикатор
void showNumber(int num,int dig)
{
byte maska;
digitalWrite(pin_spi_ss,LOW);
if(dig==1) maska=1;
else maska=0;
SPI.transfer(numbers[num]+maska);
digitalWrite(pin_spi_ss,HIGH);
}
}

Порядок подключения:
 
1. Подключаем семисегментный индикатор по схеме на рис. 8.2.
2. Загружаем в плату Arduino скетч из листинга 8.1.
3. Нажатием кнопки запускаем или останавливаем секундомер.

Листинги программ скачать
Читать далее

● Проект 7: Матрица 4-разрядная из 7-сегментных индикаторов. Делаем динамическую индикацию

Опубликовано: 23.04.2018
В этом эксперименте мы рассмотрим работу Arduino с 4-разрядной семисегментной матрицей. Получим представление о динамической индикации, позволяющей использовать одни выводы Arduino при выводе информации на несколько семисегментных индикаторов.

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

контроллер Arduino UNO R3;
плата для прототипирования;
4-разрядная семисегментная матрица;
резистор 510 Ом – 8 штук;
кнопка;
резистор 10 кОм;
провода папа-папа.

Матрица 4-разрядная из семисегментных индикаторов состоит из четырех семисегментных индикаторов и предназначена для одновременного вывода на матрицу 4 цифр, также есть возможность вывода десятичной точки. Схема 4-разрядной матрицы на 7-сегментных индикаторах показана на рис. 7.1.

Рис. 7.1. Схема 4-разрядной матрицы на 7-сегментных индикаторах

Для вывода цифры необходимо зажечь нужные светодиоды на контактах A–G и DP и выбрать нужную матрицу подачей LOW на вывод 6, 8, 9 или 12.
Подключим контакты матрицы к плате Arduino и будем выводить цифры на различные разряды матрицы. Для подключения нам понадобятся 12 выводов Arduino. Схема соединений для подключения 4-разрядной матрицы к плате Arduino показана на рис. 7.2. При подключении контактов используются ограничительные резисторы 510 Ом.

Arduino проект www.arduino-kit.ru
Рис. 7.2. Схема подключения 4-разрядной матрицы к Arduino

Напишем скетч последовательного вывода цифр (0–9) на произвольный регистр матрицы. Для выбора случайного значения из диапазона будем использовать функцию random(). В массиве numbers[] хранятся значения, соответствующие данным для отображения цифр 0–9 (старший разряд байта соответствует метке сегмента A индикатора, а младший – сегменту G), в массиве pins[] – значения контактов для сегментов A–G и DP, в массиве pindigits[] – значения контактов для выбора разряда матрицы. Содержимое скетча показано в листинге 7.1.

// список выводов Arduino для подключения к разрядам a-g
// семисегментного индикатора
int pins[8]={9,13,4,6,7,10,3,5};
// значения для вывода цифр 0-9
byte numbers[10] = { B11111100, B01100000, B11011010,
B11110010, B01100110, B10110110,
B10111110, B11100000, B11111110,
B11110110};
// переменная для хранения значения текущей цифры
int number=0;
// семисегментного индикатора
int pindigits[4]={2,8,11,12};
// переменная для хранения текущего разряда
int digit=0;
void setup()
{
// Сконфигурировать контакты как выходы
for(int i=0;i<8;i++)
pinMode(pins[i],OUTPUT);
for(int i=0;i<4;i++)
{pinMode(pindigits[i],OUTPUT);
digitalWrite(pindigits[i],HIGH);
}
}
void loop()
{
number=(number+1)%10;
showNumber(number); // DS
for(int i=0;i<4;i++)
digitalWrite(pindigits[i],HIGH);
digit=random(0,4);
digitalWrite(pindigits[digit],LOW);
delay(3000);
}
// функция вывода цифры на семисегментный индикатор
void showNumber(int num)
{
for(int i=0;i<7;i++)
{
if(bitRead(numbers[num],7-i)==HIGH) // зажечь сегмент
digitalWrite(pins[i],HIGH);
else // потушить сегмент
digitalWrite(pins[i],LOW);
}
}

Порядок подключения:

1. Подключаем семисегментный индикатор по схеме на рис. 7.3.
2. Загружаем в плату Arduino скетч из листинга 7.2.

// список выводов Arduino для подключения к разрядам a-g
// семисегментного индикатора
int pins[8]={9,13,4,6,7,10,3,5};
// значения для вывода цифр 0-9
byte numbers[10] = { B11111100, B01100000, B11011010,
B11110010, B01100110, B10110110,
B10111110, B11100000, B11111110,
B11110110};
// переменная для хранения и обработки текущего значения
int number=0;
int number1=0;
int number2=0;
// семисегментного индикатора
int pindigits[4]={2,8,11,12};
// переменная для хранения текущего разряда
int digit=0;
// для отмеривания 100 мс
unsigned long millis1=0;
// режим 1 - секундомер работает
mode=0;
const int BUTTON=14; // Контакт 14(A0) для подключения кнопки
int tekButton = LOW; // Переменная для сохранения текущего состояния кнопки
int prevButton = LOW; // Переменная для сохранения предыдущего состояния
// к нопки
boolean ledOn = false; // Текущее состояние светодиода (включен/выключен)
void setup()
{
// Сконфигурировать контакт кнопки как вход
pinMode (BUTTON, INPUT);
// Сконфигурировать контакты как выходы
for(int i=0;i<8;i++)
pinMode(pins[i],OUTPUT);
for(int i=0;i<4;i++)
{pinMode(pindigits[i],OUTPUT);
digitalWrite(pindigits[i],HIGH);
}
}
void loop()
{
tekButton = debounce(prevButton);
if (prevButton == LOW && tekButton == HIGH) // если нажатие...
{
mode=1-mode; // изменение режима
if(mode==1)
number=0;
}
if(millis()-millis1>=100 && mode==1)
{millis1=millis1+100;
number=number+1;
if(number==10000)
number=0;
}
number1=number;
for(int i=0;i<4;i++)
{
number2=number1%10;
number1=number1/10;
showNumber(number2,i);
for(int j=0;j<4;j++)
digitalWrite(pindigits[j],HIGH);
digitalWrite(pindigits[i],LOW);
delay(1);
}
}
// функция вывода цифры на семисегментный индикатор
void showNumber(int num,int dig)
{
for(int i=0;i<8;i++)
{
if(bitRead(numbers[num],7-i)==HIGH) // зажечь сегмент
digitalWrite(pins[i],HIGH);
else // потушить сегмент
digitalWrite(pins[i],LOW);
}
if(dig==1) // десятичная точка для второго разряда
digitalWrite(pins[7],HIGH);
}
// Функция сглаживания дребезга. Принимает в качестве
// аргумента предыдущее состояние кнопки и выдает фактическое.
boolean debounce(boolean last)
{
boolean current = digitalRead(BUTTON); // Считать состояние кнопки,
if (last != current) // если изменилось...
{
d elay(5); // ж дем 5 м с
current = digitalRead(BUTTON); // считываем состояние кнопки
return current; // возвращаем состояние кнопки
}
}


3. Нажатием кнопки запускаем или останавливаем секундомер.

Arduino проект www.arduino-kit.ru
Рис. 7.3. Схема подключения для секундомера


Листинги программ скачать
Читать далее

● Проект 6: Семисегментный индикатор одноразрядный. Выводим цифры

Опубликовано: 23.04.2018
В этом эксперименте мы рассмотрим работу с семисегментным светодиодным индикатором, которая позволяет Arduino визуализировать цифры.

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

контроллер Arduino UNO R3;
плата для прототипирования;
одноразрядный семисегментный индикатор;
резистор 510 Ом – 7 штук;
 • провода папа-папа.

Светодиодный семисегментный индикатор представляет собой группу светодиодов, расположенных в определенном порядке и объединенных конструктивно. Светодиодные контакты промаркированы метками от a до g (и дополнительно dp – для отображения десятичной точки), и один общий вывод, который определяет тип подключения индикатора (схема с общим анодом ОА, или общим катодом ОК). Зажигая одновременно несколько светодиодов, можно формировать на индикаторе символы цифр. Схема одноразрядного семисегментного индикатора показана на рис. 6.1.

Рис. 6.1. Схема одноразрядного семисегментного индикатора

Для подключения одноразрядного светодиодного индикатора к Arduino будем задействовать 7 цифровых выводов, каждый из контактов a–g индикатора подключается к выводу Arduino через ограничительный резистор 470 Ом. В нашем эксперименте мы используем семисегментный индикатор с общим катодом ОК, общий провод подсоединяем к земле. На рис. 6.2 показана схема подключения одноразрядного семисегментного индикатора к плате Arduino.

Arduino проект www.arduino-kit.ru
Рис. 6.2. Схема подключения семисегментного индикатора к Arduino

Приступим к написанию скетча. Мы будем на семисегментный индикатор в цикле выводить цифры от 0 до 9 с паузой 1 секунда. Сформируем массив значений для цифр 0–9, где старший разряд байта соответствует метке сегмента a индикатора, а младший – сегменту g.

byte numbers[10] = { B11111100, B01100000, B11011010, B11110010, B01100110,
B10110110, B10111110, B11100000, B11111110, B11110110};

Для преобразования значения цифры в данные для вывода значения на выводы Arduino будем использовать битовые операции языка Arduino:

bitRead(x,n); // получение значения n разряда байта x

Скетч эксперимента представлен в листинге 6.1.

// список выводов Arduino для подключения к разрядам a-g
// семисегментного индикатора
int pins[7]={2,3,4,5,6,7,8};
// значения для вывода цифр 0-9
byte numbers[10] = { B11111100, B01100000, B11011010, B11110010, B01100110,
B10110110, B10111110, B11100000, B11111110, B11100110};
// переменная для хранения значения текущей цифры
int number=0;
void setup()
{
// Сконфигурировать контакты как выходы
for(int i=0;i<7;i++)
pinMode(pins[i],OUTPUT);
}
void loop()
{
showNumber(number);
delay(1000);
number=(number+1)%10;
}
// функция вывода цифры на семисегментный индикатор
void showNumber(int num)
{
for(int i=0;i<7;i++)
{
if(bitRead(numbers[num],7-i)==HIGH) // зажечь сегмент
digitalWrite(pins[i],HIGH);
else // потушить сегмент
digitalWrite(pins[i],LOW);
}
}

Порядок подключения:

1. Подключаем семисегментный индикатор по схеме на рис. 6.2.
2. Загружаем в плату Arduino скетч из листинга 6.1.
3. Наблюдаем вывод цифр на экран семисегментного индикатора.

Листинги программ скачать
Читать далее

Главное меню

Каталог

Полезные ссылки

Цена
от
до