Вращающийся светодиодный дисплей на Arduino

В этой статье мы рассмотрим создание на основы платы Arduino, светодиодов и электродвигателя постоянного тока вращающегося по кругу светодиодного дисплея (более наглядно этот процесс вы можете посмотреть в видео, приведенном в конце статьи).

Внешний вид вращающегося светодиодного дисплея на Arduino

Принцип работы данного дисплея будет основан на принципах работы светодиодной матрицы, которая содержит 8 светодиодов, упорядоченных в форме матрицы 8х1 (8 строк и 1 столбец). Светодиоды упорядочены в форме лестницы, один поверх другого. С помощью этих светодиодов можно будет показывать любую информацию: текст, числа, символы и т.д. Принцип действия нашего проекта будет основан на эффекте восприятия зрения (POV — Perception of Vision), с помощью которого визуально видимое неподвижное изображение можно получить за счет быстро движущихся изображений.

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

Плата Arduino Uno
Электродвигатель постоянного тока
+3.6V LI-ION battery (литий-ионная батарея)
Светодиоды (8 шт.)
Резисторы 1 кОм (8 шт.)

Конструкция вращающегося дисплея

Вначале нам будет нужно устойчивое основание. В нашем проекте мы использовали старый DVD-привод, но можно использовать, к примеру, деревянную доску. После этого необходимо сделать отверстие в середине DVD-привода (основания) и вставить в него ось электродвигателя постоянного тока. Убедитесь в том, что отверстие достаточно мало чтобы держать двигатель и что двигатель может свободно вращаться.

Внешний вид DVD-привода Установка электродвигателя на DVD-привод

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

Помещаем точечную плату на верх электродвигателя

Прикрепите сверху литий-ионную батарею подходящего размера (если она у вас есть). После этого проверьте все светодиоды на исправность с помощью маленькой батарейки (кнопочной) или любым другим способом. Затем к светодиодам припаяйте резисторы как показано на следующем рисунке.

Спаянные концы светодиодов и резисторовСоедините спаянные светодиоды и резисторы с платой Arduino Uno как показано на следующем рисунке.

Подключение светодиодов к плате Arduino Подключение светодиодов к плате Arduino (с другого ракурса)

Поместите полученную конструкция сверху на электродвигатель постоянного тока и закрепите ее с помощью скотча. Финальный вид получившейся конструкции представлен на следующем рисунке.

Внешний вид получившейся конструкции

Работа схемы

Схема устройства представлена на следующем рисунке.

Схема вращающегося светодиодного дисплея на Arduino

Как видите, схема крайне проста, нам всего лишь нужно соединить 8 светодиодов с платой Arduino Uno:
PORTD, PIN0 —————— LED8 POSITIVE TERMINAL
PORTD, PIN1 —————— LED7 POSITIVE TERMINAL
PORTD, PIN2 —————— LED6 POSITIVE TERMINAL
PORTD, PIN3 —————— LED5 POSITIVE TERMINAL
PORTD, PIN4 —————— LED4 POSITIVE TERMINAL
PORTD, PIN5 —————— LED3POSITIVE TERMINAL
PORTD, PIN6 —————— LED2 POSITIVE TERMINAL
PORTD, PIN7 —————— LED1POSITIVE TERMINAL

Подобно тому как мы добавляли дополнительные столбцы в светодиодной матрице 8х8 чтобы расширить дисплей, в этом проекте вместо добавления светодиодных столбцов мы будем передвигать первый светодиодный столбец на место второго светодиодного столбца с помощью вращения электродвигателя.

Предположим, что мы хотим отобразить букву ‘A’ на нашем вращающемся дисплее. Пусть светодиодная линия (столбец из 8 светодиодов) находится в положении 1 как показано на следующем рисунке.

Светодиодная линия

После этого мы подадим питание на электродвигатель и он начнет вращение своей оси.

В момент времени t=0ms линия будет в позиции 1. На этой позиции на все восемь светодиодов подается питание – от самого верхнего до самого нижнего.

В момент времени t=1ms линия будет в позиции 2. Также, как и на позиции 1, на все восемь светодиодов подается питание – от самого верхнего до самого нижнего.

В момент времени t=2ms линия будет в позиции 3. В этой позиции будут гореть только светодиоды 7,6 и 3, а остальные светодиоды линии будут в выключенном состоянии.

В момент времени t=3ms линия будет в позиции 4. Также, как и в позиции 3, в этот момент времени будут гореть светодиоды 7,6 и 3, а остальные светодиоды линии будут в выключенном состоянии.

В момент времени t=4ms линия будет в позиции 5. Также, как и в позициях 3 и 4, в этот момент времени будут гореть светодиоды 7,6 и 3, а остальные светодиоды линии будут в выключенном состоянии.

В момент времени t=5ms линия будет в позиции 6. В этой позиции на все восемь светодиодов снова подается питание – от самого верхнего до самого нижнего.

В момент времени t=6ms линия будет в позиции 7. В этой позиции все восемь светодиодов продолжат оставаться зажженными.

То есть, зажигая необходимые нам светодиоды в соответствующих позициях линии, мы можем отобразить на вращающемся дисплее нужный нам символ. Если скорость вращения светодиодной линии маленькая, то мы сможем видеть каждый вращающийся светодиодный столбец по отдельности. Но когда скорость вращения электродвигателя будет достаточно большой то мы увидим для рассмотренного нами примера непрерывно горящий символ “A”.

Исходный код программы

Мы запрограммируем плату Arduino таким образом, чтобы при помощи зажигания светодиодов в соответствующие моменты времени на вращающемся дисплее отображался текст “CIRCUIT DIGEST” (в переводе – набор схем).

Запрограммировать работу такого вращающего дисплея несложно. Для начала инициализируем символьный массив 26×8 с помощью инструкции volatile char ALPHA[26][8]. Этот массив будет содержать 8 позиций линии для отображения всего алфавита из 26 символов. То есть 26 строк массива будут представлять 26 символов, а 8 столбцов в каждой строке будут представлять 8 позиций светодиодной линии для отображения этого символа во время вращения. То есть каждый элемент этого массива будет содержать двоичное число, которое будет соответствовать состоянию включен/выключен 8 светодиодов в определенной позиции светодиодной линии. Напоминаем, что линия здесь – это 8 светодиодов, подключенных к плате Arduino в соответствии с приведенной выше схемой.

После этого все, что вам останется сделать, это использовать цикл ‘for’ с 8 итерациями для отображения символа. Если вы хотите отобразить 10 символов, то вам необходимо будет запустить 10 раз цикл ‘for’ с 8 итерациями в каждом. Таким образом, нам для отображения текста CIRCUIT DIGEST потребуется 13 раз запускать цикл ‘for’.

Надеюсь, созданный вами подобным образом вращающийся дисплей будет смотреться красиво. Далее приведен полный текст программы.

volatile char ALPHA[26][8]={{0,0b01111111,0b11111111,0b11001100,0b11001100,0b11001100,0b11111111,0b01111111},
{0,0b00111100,0b01111110,0b11011011,0b11011011,0b11011011,0b11111111,0b11111111},
{0,0b11000011,0b11000011,0b11000011,0b11000011,0b11100111,0b01111110,0b00111100},
{0,0b01111110,0b10111101,0b11000011,0b11000011,0b11000011,0b11111111,0b11111111},
{0,0b11011011,0b11011011,0b11011011,0b11011011,0b11011011,0b11111111,0b11111111},
{0,0b11011000,0b11011000,0b11011000,0b11011000,0b11011000,0b11111111,0b11111111},
{0b00011111,0b11011111,0b11011000,0b11011011,0b11011011,0b11011011,0b11111111,0b11111111},
{0,0b11111111,0b11111111,0b00011000,0b00011000,0b00011000,0b11111111,0b11111111},
{0b11000011,0b11000011,0b11000011,0b11111111,0b11111111,0b11000011,0b11000011,0b11000011},
{0b11000000,0b11000000,0b11000000,0b11111111,0b11111111,0b11000011,0b11001111,0b11001111},
{0,0b11000011,0b11100111,0b01111110,0b00111100,0b00011000,0b11111111,0b11111111},
{0b00000011,0b00000011,0b00000011,0b00000011,0b00000011,0b00000011,0b11111111,0b11111111},
{0b11111111,0b11111111,0b01100000,0b01110000,0b01110000,0b01100000,0b11111111,0b11111111},
{0b11111111,0b11111111,0b00011100,0b00111000,0b01110000,0b11100000,0b11111111,0b11111111},
{0b01111110,0b11111111,0b11000011,0b11000011,0b11000011,0b11000011,0b11111111,0b01111110},
{0,0b01110000,0b11111000,0b11001100,0b11001100,0b11001100,0b11111111,0b11111111},
{0b01111110,0b11111111,0b11001111,0b11011111,0b11011011,0b11000011,0b11111111,0b01111110},
{0b01111001,0b11111011,0b11011111,0b11011110,0b11011100,0b11011000,0b11111111,0b11111111},
{0b11001110,0b11011111,0b11011011,0b11011011,0b11011011,0b11011011,0b11111011,0b01110011},
{0b11000000,0b11000000,0b11000000,0b11111111,0b11111111,0b11000000,0b11000000,0b00000000},
{0b11111110,0b11111111,0b00000011,0b00000011,0b00000011,0b00000011,0b11111111,0b11111110},
{0b11100000,0b11111100,0b00011110,0b00000011,0b00000011,0b00011110,0b11111100,0b11100000},
{0b11111110,0b11111111,0b00000011,0b11111111,0b11111111,0b00000011,0b11111111,0b11111110},
{0b01000010,0b11100111,0b01111110,0b00111100,0b00111100,0b01111110,0b11100111,0b01000010},
{0b01000000,0b11100000,0b01110000,0b00111111,0b00111111,0b01110000,0b11100000,0b01000000},
{0b11000011,0b11100011,0b11110011,0b11111011,0b11011111,0b11001111,0b11000111,0b11000011}};
void setup()
{
DDRD = 0xFF;
//a,b,c,d,e,f,g,...z
}
void loop()
{
for (int i=7;i>0;i--)
{
PORTD = ALPHA[2][i];
delay(1);
PORTD=0;
}
delay(2);
for (int i=7;i>0;i--)
{
PORTD = ALPHA[8][i];
delay(1);
PORTD=0;
}
delay(2);
for (int i=7;i>0;i--)
{
PORTD = ALPHA[17][i];
delay(1);
PORTD=0;
}
delay(2);
for (int i=7;i>0;i--)
{
PORTD = ALPHA[2][i];
delay(1);
PORTD=0;
}
delay(2);
for (int i=7;i>0;i--)
{
PORTD = ALPHA[20][i];
delay(1);
PORTD=0;
}
delay(2);
for (int i=7;i>0;i--)
{
PORTD = ALPHA[8][i];
delay(1);
PORTD=0;
}
delay(2);
for (int i=7;i>0;i--)
{
PORTD = ALPHA[19][i];
delay(1);
PORTD=0;
}
delay(2);
for (int i=7;i>0;i--)
{
PORTD = ALPHA[3][i];
delay(1);
PORTD=0;
}
delay(2);
for (int i=7;i>0;i--)
{
PORTD = ALPHA[8][i];
delay(1);
PORTD=0;
}
delay(2);
for (int i=7;i>0;i--)
{
PORTD = ALPHA[6][i];
delay(1);
PORTD=0;
}
delay(2);
for (int i=7;i>0;i--)
{
PORTD = ALPHA[4][i];
delay(1);
PORTD=0;
}
delay(2);
for (int i=7;i>0;i--)
{
PORTD = ALPHA[18][i];
delay(1);
PORTD=0;
}
delay(2);
for (int i=7;i>0;i--)
{
PORTD = ALPHA[19][i];
delay(1);
PORTD=0;
}
delay(19);
}

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
28 просмотров


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *