Аналоговые POV-часы на Arduino Nano: персистенция зрения с 17 светодиодами
Компоненты и материалы
- Arduino Nano R3 — 1 шт.
- Светодиоды (разных цветов для групп) — 17 шт.
- Резисторы 100 Ом — 17 шт.
- Датчик Холла — 1 шт. (синхронизация оборотов)
- DC-мотор 12V — 1 шт.
- Step-up преобразователь (Li-ion → 5V) — 1 шт.
- Li-ion аккумулятор, пайка, механическая конструкция
Принцип POV
Persistence of Vision — светодиоды последовательно зажигаются в определённых углах вращения. Мозг складывает вспышки в непрерывное изображение. Здесь — аналоговое циферблат: часы, минуты, секунды, часовые деления, внутренний круг.
Механика
Светодиоды на радиальной плате, вращаемой мотором. Аккумулятор в центре вращения — иначе вибрация на высоких оборотах. Скорость регулируется лабораторным БП. Значение delayMicroseconds в коде подбирается под обороты.
Распределение светодиодов
- D2–D8 (7 шт.) — часовой/минутный/секундный стрелки (разная длина)
- D9–D11 — продолжение минутной/секундной
- A1–A2 (D12–D13) — часовые деления (каждые 5 мин)
- A3–A4 (D14–D15) — кварцевые деления (12, 3, 6, 9)
- A5 (D16) — минутные метки (каждую минуту)
- A0 — вход датчика Холла (pull-up)
Код
// hobbyprojects // ArduinoNanoPropellerLEDAnalogClock20190403A
int LED[16] = {2,3,4,5,6,7,8,9,10,11,12,A1,A2,A3,A4,A5};
int sensorPin = A0;
unsigned long previousTime = 0;
byte hours = 12, minutes = 15, seconds = 0;
void setup() {
for (int i=0;i<16;i++) pinMode(LED[i], OUTPUT);
pinMode(sensorPin, INPUT_PULLUP);
if (hours == 12) hours = 0;
}
void loop() {
// ожидание прохода магнита (LOW)
while (digitalRead(sensorPin) == LOW);
// синхронизация времени каждую секунду
if (millis() >= previousTime) {
previousTime += 1000;
if (++seconds == 60) { seconds=0; if(++minutes==60){ minutes=0; if(++hours==12) hours=0; } }
}
int propeller_posn = 30; // стартовый угол (подстройка)
for (int n=0; n<60; n++) {
drawMinuteMarker(); // LED16
if (isHourMarker(propeller_posn)) drawHourMarker(); // LED15,14
if (isQuarterMarker(propeller_posn)) drawQuarterMarker();// LED13,12
if (isHourHand(propeller_posn)) drawHoursHand(); // LED1-7
if (propeller_posn == minutes) drawMinutesHand(); // LED1-9
if (propeller_posn == seconds) drawSecondsHand(); // LED1-11
delayMicroseconds(140); // ширина пикселя (подстройка под скорость)
displayClear();
drawInnerCircle(); // LED1 мигает
delayMicroseconds(600); // зазор между пикселями
propeller_posn++; if (propeller_posn==60) propeller_posn=0;
}
while (digitalRead(sensorPin) == HIGH); // ждём следующий оборот
}
// функции отрисовки: установка HIGH на нужных LED
void displayClear() { for(int i=0;i<16;i++) digitalWrite(LED[i],LOW); }
void drawMinuteMarker() { digitalWrite(LED[15],HIGH); }
void drawHourMarker() { digitalWrite(LED[14],HIGH); digitalWrite(LED[13],HIGH); }
void drawQuarterMarker() { digitalWrite(LED[12],HIGH); digitalWrite(LED[11],HIGH); }
void drawHoursHand() { for(int i=0;i<7;i++) digitalWrite(LED[i],HIGH); }
void drawMinutesHand() { for(int i=0;i<9;i++) digitalWrite(LED[i],HIGH); }
void drawSecondsHand() { for(int i=0;i<11;i++) digitalWrite(LED[i],HIGH); }
void drawInnerCircle() { digitalWrite(LED[0],HIGH); delayMicroseconds(30); digitalWrite(LED[0],LOW); }
bool isHourMarker(int p) { return p%5==0; }
bool isQuarterMarker(int p) { return p%15==0; }
bool isHourHand(int p) { return (p == hours*5) || (p==0 && hours==0); }
Настройка: измените delayMicroseconds(140) и 600 под скорость мотора. Начальный propeller_posn=30 — угол от метки Холла до 12 часов.
Схема
Светодиоды через резисторы 100 Ом к пинам. Датчик Холла: сигнал → A0, питание → 5V/GND. Мотор от внешнего БП. Step-up от Li-ion питает Arduino.
Производственный процесс
- Сборка светодиодного секвенсора на таймере 555 и счетчике 4017: деление частоты и устранение дребезга
- Кукушка: история, мастерство и современная эволюция
- Сделай свой LUMAZOID: DIY Arduino музыкальный визуализатор
- Arduino POV-часы: сборка дисплея на эффекте сохранения образа
- Устройство точного измерения давления и расхода воздуха на аналоговом датчике
- Создание рулетки на 37 светодиодов с Arduino Nano
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- 3D RGB Arduclock — Bluetooth-часы на адресных LED с RTC
- Компактное руль-триммер для FlightGear на Arduino Nano
- Интерактивный LED-дисплей в двери с PIR-датчиком — новогоднее приветствие на Arduino