Основная идея проекта – использовать механизм, связанный с движением магнитной головки старого жесткого диска, для создания дисплея, показывающего текущее время (или любую нужную информацию).
Заменив магнитную головку жесткого диска полосой светодиодов и включая светодиоды в нужное время, можно сформировать изображение. В устройстве используются светодиоды с пиксельной адресацией.
На первом фото демонстрируется работа устройства, но в силу особенностей фотографирования, цифры не видно. Лучше всего посмотреть демонстрацию работы устройства на видео.
-Жесткий диск;
-Светодиоды с пиксельной адресацией WS2812B;
-Плата Arduino;
-Транзистор AO3401 – 2 шт;
-Транзистор AO3406;
-Модуль часов реального времени, работающий от 5 вольт;
-Два резистора 100 Ом;
-Два резистора 4700 Ом;
-Один конденсатор (> 220 мкФ,> 10 вольт);
-Два винта M2,5 и гайки;
-3D-принтер;
-Инструмент для разборки жесткого диска;
-Паяльные принадлежности;
-Пружина;
-Магниты;
Шаг первый: разборка
Для своей самоделки мастер использовал старый жесткий диск, как на фото. Механическая часть жестких дисков различны моделей отличается, поэтому, если кто-то решится повторить самоделку, то или нужно искать такой же диск или, опираясь на статью, работать со своим.



Затем нужно переделать рычаг. Головки нужно снять, а на рычаг закрепить деталь, на которую будет крепится светодиодная лента. Эту деталь мастере напечатал на 3D – принтере. Файл для печати можно скачать ниже, но нужно учитывать различные конструкции дисков.
Support.STL


Для работы к светодиодной ленте необходимо подключить три провода: Vcc (5 вольт), GND и провод данных.
Одной из самых деликатных частей проекта является соединение светодиодных полос, поскольку полосы постоянно движутся и вибрируют, сильно нагружая соединения. По этой причине мастер решил использовать оригинальный плоский кабель, который подводит сигналы к головке. Он удалил интегральную схему, присутствующую на голове, и подключил кабели, идущие от светодиодной планки, к трем точкам плоской схемы, подключенной к разъему, который был прикреплен к электронной плате жесткого диска.



Чтобы немного увеличить амплитуду движения рычага, он снял концевые упоры на держателе магнита.


Он прикрепил пружину проволокой к уже имеющемуся винту. Пружина является причиной большого количества шума, и в следующем шаге он ее заменил. Хотя устройство работает и с ней.



Как видно на видео выше, пружина дребезжит при работе. Чтобы убрать шум можно напечатать специальный держатель и установить на его краях по магниту. Еще один магнит устанавливается в деталь, которая крепится к концу рычага.
Для точной регулировки концевые магниты крепятся к винтам и таким образом можно регулировать расстояние между магнитами.
Естественно, что магниты нужно устанавливать так, чтобы они отталкивались друг от друга. Т.е. одинаковыми полюсами друг к другу.
Файлы для печати можно скачать ниже.
Coil_magnet_support.STL
HD_magnet_support.STL
Электроника довольно простая.
Нужна плата микропроцессора, например, arduino-pro mini (мастер использовал клон WAVGAT, но подойдет любая другая плата).
Модуль для управления катушкой жесткого диска без перегрузки микропроцессора. Модуль состоит из двух двухтактных пар, образованных соответственно PMOS и NMOS. Особых требований нет, так как токи достаточно низкие. Важно только то, что MOS переключаются на логические уровни. В частности, я использовал AO3401 и AO3406 которые у него были под рукой. Рекомендуется добавить небольшое сопротивление (например, 100 Ом) последовательно к затвору, чтобы избежать резонансных эффектов, и понижающий резистор (например, 4,7 кОм).
Для контроля времени используется модуль часов реального времени RTC, подключенный к процессору через I2C.Шаг седьмой: код
Обратите внимание, что файл platformio.c необходим только в том случае, если вы используете platformIO, и в этом случае его следует переименовать в platformio.ini. Мне пришлось переименовать его в .c, потому что по неизвестным причинам было невозможно загрузить файл .ini.
Время:
Для генерации управляющих сигналов для катушки он использовал TIMER1 микроконтроллера, запрограммированный на частоту 32 Гц. В коде можно увидеть, что он начинается с 75 Гц, медленно достигая 32 Гц для обеспечения плавного старта. Каждый раз, когда происходит прерывание, сигналы катушек инвертируются, генерируя форму волны с частотой 16 Гц. Это видно на фото.
TIMER2 отвечает за синхронизацию столбца. Он запрограммирован для работы на частоте 2 кГц (период = 0,5 мкс). Таким образом, за период 62,5 мкс (1/16 Гц) мы имеем 125 столбцов (= 62,5 / 0,5). Таймер 2 инициализируется на «92» при переключении таймера 1. Это 92 гарантирует, что количество столбцов не будет таким, чтобы столбец был равен 0 в середине сканирования. Затем столбец увеличивается при каждом прерывании TIMER 2, когда столбец достигает 124 (максимальное количество столбцов -1), он перезапускается с 0. Таким образом, вы можете в основном изменить количество столбцов, варьируя синхронизацию TIMER2 и 124.
Все эти «магические числа» зависят от оборудования и должны быть настроены на конкретный жесткий диск и пружину (в зависимости от диапазона, резонансной частоты системы и т. д.).
Вывод данных:
Отображение выполняется в два прохода: первый проход слева направо, а второй проход справа налево.
В первом проходе отображение начинается в столбце MINCOLUMN и заканчивается в столбце MAXCOLUMN (см. #Define в исходном файле).
Во втором проходе он начинается в столбце MINCOLUMN + DELTA_RETURN и заканчивается в столбце MAXCOLUMN + DELTA_RETURN.
Когда срабатывает TIMER2, он устанавливает метку: newcolumn.
В основном цикле тестируется newcolumn, когда он верен, он сбрасывается и, если диапазон столбцов соответствует диапазону, в котором мы хотим что-то показать, соответственно заполняется массив RGB (функциями copyString, copyLetters, copySeparators) и еще одна метка: newdata is set.
В подпрограмме обслуживания прерывания таймера 2, когда newdata имеет значение true, он сбрасывается, и массив RGB направляется на вывод Led функцией RGB_update_7. Таким образом, выходные данные синхроны с движением рычага.
Мастер не мог использовать стандартную библиотеку (Fastled или neopixel) для управления светодиодами WS2812B, потому что интенсивное использование прерываний несовместимо с такими библиотеками. Вместо этого был использован метод, объясненный Кевином Дарра в видео.
На третьем рисунке подробно показаны данные, управляющие светодиодом.


Данные генерируются, начиная со значений времени, считываемых из RTC по шине I2C. Время обновляется каждые 500 мс. Большой массив Number включает представление (5 * 7) каждого числа. Согласно текущему столбцу, столбец числа, в зависимости от текущего времени, копируется в массив RGB.
Смещение
Когда мастер начинал проект, он думал, что все время можно отобразить за один проход. К сожалению, доступный угол довольно небольшой, поэтому пришлось отображать только часть времени и периодически сдвигать изображение влево и вправо (см. Видео).
Переменная xoffset содержит значение сдвига и альтернативно увеличивается или уменьшается в зависимости от состояния метки offsetincreasing.
main.cpp
platformio.C
Все готово. В дальнейшем мастер планирует произвести некоторые улучшения, но они скорее касаются внешнего вида устройства, т.е. улучшение дизайна.