Не обычные часы сделал мастер-самодельщик с ником tomatoskins. Конечно идея не совсем его, он ориентировался на часы STORY Clock, но учитывая первый опыт мастера в использовании Ардуино и минимум информации об оригинальны часа, получилось очень даже не плохо.
Анимация
Инструменты и материалы:
-ДСП 33,02 х 33,02 х 5,08 см (склейка);
-ДВП 33,02 х 33,02 см.;
-Ардуино Нано;
-Модуль времени;
-Шаговые двигатели и драйверы;
-Датчики Холла;
-Магниты;
-Кабель;
-АС адаптер;
-Разъем;
-Крепеж;
-3D-печатные части;
-Шпон 30,48 x 30,48 см. (лицевая часть);
-Шпон 101,6 см (полоса);
-Спрей-лак;
-Черная краска-спрей;
-Циркуль;
-Нож;
-Клей;
-Хомуты;
-Ацетон;
-Кисточка;
-ленточнопильный станок с кругорезным приспособлением;
-Ножовка;
-Шлифмашинка;
-Струбцины;
-Линейка;
-Сверла;
-Отвертка;
-Паяльник;
-Клеевой пистолет;
Шаг первый: склейка
Чтобы получить материал нужного размера мастер склеивает три заготовки из ДСП.
Шаг второй: круги
Дальше нужно вырезать пять кругов с диаметром: 30,48 см, 28,57 см, 22,86 см, 17,78 см, 13,65 см.
Шаг третий: 3D-печать
Зубчатые колеса разделены на сегменты, поэтому их можно распечатать на принтере и затем собрать. Все детали были напечатаны в ABS. После печати нужно отшлифовать все края и поверхности деталей.
Напечатать нужно следующее количество деталей:
1 шт. Hour Retaining Ring Segment Stepper Mount.STL
6 шт. Hour Ring Gear Segment Basic.STL
1 шт. Hour Ring Gear Segment Magnet.STL
1 шт. Minute Hall Effect Sensor Holder.STL
6 шт. Minute Retaining Ring Segment Basic.STL
1 шт. Minute Retaining Ring Segment Stepper Mount.STL
7 шт. Minute Ring Gear Segment Basic.STL
1 шт. Minute Ring Gear Segment Magnet.STL
2 шт. Spur Gear.STL
1 шт. Electronics Mount.STL
1 шт. Hour Hall Effect Sensor Holder.STL
6 шт. Hour Retaining Ring Segment Basic
После печати нужно растворить в ацетоне обрезки нити или неудачные детали ABS и с помощью получившейся смеси склеить детали. После отвержения места склейки зашлифовать.
Шаг четвертый: сборка
Установите зубчатые колеса и стопорные кольца в раму и вырежьте отверстие для шаговых двигателей.
Вырежьте во внутреннем кольце прорезь для датчика Холла минутного и для датчика Холла часового.
Склейте наружное кольцо.
Для корректной работы датчика Холла мастер отрезал от болта головку и сделал прорезь. Затем на болт будет наклеен магнит, а сам болт вкручен в корпус напротив датчика.
Дальше мастер вырезает из ДСП круг и приклеивает его к кольцу.
Приклеивает внутренний диск.
Приклеивает полосу из шпона к корпусу.
Вырезает и приклеивает шпон к лицевой панели.
Шлифует корпус с помощью наждачной бумаги 220-600 грит. Покрывает лаком в десять слоев.
Шаг пятый: электроника
В нижней части корпуса сверлит отверстие и устанавливает разъем для питания.
Монтирует шаговые драйверы и часы реального времени на электронную плату.
Согласно схеме, производит монтаж электроники.
Шаг шестой: задняя пластина
Сделайте заднюю пластину, обрезав круг на 2,5 см больше диаметра часов, и кольцо с внутренним диаметром, равным задней части часов. Склейте их.
После высыхания начертите линию на 3 мм больше внутреннего кольца и обрежьте по размеру ленточной пилой. Вырежьте прорезь для подвеса часов на стену. Покрасьте черной аэрозольной краской заднюю часть и прикрутите пластину к корпусу.
Шаг седьмой: код Ардуино
Программа проверяет, соответствует ли текущее время эталонному и производит корректировку один раз в полночь. В полночь шестерни вращаются в положение «полночь», затем ждут, пока время не подойдет к этому значению. В настоящее время часы теряют всего около 5 секунд в течение 24 часов.
Для установки кода понадобятся библиотеки Stepper и RTClib.
Мастер не программист и говорить о том, что при желании и достаточном опыте код можно улучшить.
Скачать код можно ниже.
#include
#include "RTClib.h"
RTC_DS1307 rtc;
#define oneRotation 2038 // the number of steps in one revolution of 28BYJ-48 stepper motor
Stepper hourHand(oneRotation, 3, 5, 4, 6);
Stepper minuteHand(oneRotation, 7, 9, 8, 10);
#define hourStopSensor 12
#define minuteStopSensor 11
int endStep = 0;
// Time dealy for speed of the clock.
int setDelay1 = 168;
int setDelay2 = 166;
int setDelay3 = 5;
// Current time to do math with.
float hr = 0;
float mn = 0;
float sc = 0;
// Set the time of day to reset clock (24 hour format).
int resetHour = 0;
int resetMinute = 0;
// Variables to set correct time at startup and reset.
float setTimeStepHour = 0;
float setTimeStepMinute = 0;
float handDelay = 0;
float hourTest = 0;
float minuteTest = 0;
void setup() {
Serial.begin(115200);
// Setup real time clock and reset hall effect sensors.
pinMode(hourStopSensor, INPUT_PULLUP);
pinMode(minuteStopSensor, INPUT_PULLUP);
rtc.begin();
// Uncomment line below to set time.
// rtc.adjust(DateTime(2020, 2, 19, 23, 40, 30));
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Set top speed of stepper motors.
hourHand.setSpeed(15);
minuteHand.setSpeed(15);
// Loop until minute and hour hand are at noon
while (digitalRead(hourStopSensor) == LOW || digitalRead(minuteStopSensor) == LOW)
{
if (digitalRead(hourStopSensor) == LOW )
{
hourHand.step(2);
}
else
{
delay(3);
}
if (digitalRead(minuteStopSensor) == LOW)
{
minuteHand.step(3);
}
else
{
delay(4);
}
}
while (digitalRead(hourStopSensor) != LOW || digitalRead(minuteStopSensor) != LOW)
{
if (digitalRead(hourStopSensor) != LOW )
{
hourHand.step(2);
}
else
{
delay(3);
}
if (digitalRead(minuteStopSensor) != LOW)
{
minuteHand.step(3);
}
else
{
delay(4);
}
}
// Get current time
DateTime now = rtc.now();
hr = now.hour();
mn = now.minute();
sc = now.second();
// Change to 12 hour format
if (hr >= 12)
{
hr = hr — 12;
}
// See what hand must travel across the face further and use that distance
// to adjust set time accordingly.
hourTest = hr / 12;
minuteTest = mn / 60;
if (hourTest > minuteTest)
{
handDelay = hourTest;
}
else
{
handDelay = minuteTest;
}
// Set current hour
setTimeStepHour = (hr * 498) + (mn * 8.3) + ((sc + (handDelay * 36)) * .1383);
// Set current minute
setTimeStepMinute = (mn * 114) + ((sc + (handDelay * 45)) * 1.9);
// Test which hand will need more steps and set that to the longest step count for the for loop.
if (setTimeStepHour > setTimeStepMinute)
{
endStep = setTimeStepHour;
}
else
{
endStep = setTimeStepMinute;
}
for (int i = 0; i <= endStep; i++)
{
if (i < setTimeStepHour)
{
hourHand.step(2);
}
else
{
delay(3);
}
if (i < setTimeStepMinute)
{
minuteHand.step(3);
}
else
{
delay(4);
}
}
// Set clock running RPM
hourHand.setSpeed(1);
minuteHand.setSpeed(1);
}
void loop() {
// Start clock running loop.
for (int i = 0; i < 22; i++)
{
minuteHand.step(1);
delay(setDelay1);
// Test for reset time, if ready to be reset, break.
if (rtc.now().hour() == resetHour && rtc.now().minute() == resetMinute)
{
break;
}
}
delay(setDelay3);
for (int i = 0; i < 38; i++)
{
hourHand.step(1);
delay(setDelay1);
// Test for reset time, if ready to be reset, break.
if (rtc.now().hour() == resetHour && rtc.now().minute() == resetMinute)
{
break;
}
for (int i = 0; i < 20; i++)
{
minuteHand.step(1);
delay(setDelay2);
// Test for reset time, if ready to be reset, break.
if (rtc.now().hour() == resetHour && rtc.now().minute() == resetMinute)
{
break;
}
}
}
// Reset clock at reset time
if (rtc.now().hour() == resetHour && rtc.now().minute() == resetMinute)
{
// Change speed of clock
hourHand.setSpeed(10);
minuteHand.setSpeed(10);
// Loop till minute and hour hand reach noon.
while (digitalRead(hourStopSensor) == LOW || digitalRead(minuteStopSensor) == LOW)
{
if (digitalRead(hourStopSensor) == LOW )
{
hourHand.step(2);
}
else
{
delay(3);
}
if (digitalRead(minuteStopSensor) == LOW)
{
minuteHand.step(3);
}
else
{
delay(4);
}
}
while (digitalRead(hourStopSensor) != LOW || digitalRead(minuteStopSensor) != LOW)
{
if (digitalRead(hourStopSensor) != LOW )
{
hourHand.step(2);
}
else
{
delay(3);
}
if (digitalRead(minuteStopSensor) != LOW)
{
minuteHand.step(3);
}
else
{
delay(4);
}
}
// Wait here until the reset time has passed.
while (rtc.now().minute() == resetMinute)
{
delay(1000);
}
// Get current time
DateTime now = rtc.now();
hr = now.hour();
mn = now.minute();
sc = now.second();
// Change to 12 hour format
if (hr >= 12)
{
hr = hr — 12;
}
// See what hand must travel across the face further and use that distance
// to adjust set time accordingly.
hourTest = hr / 12;
minuteTest = mn / 60;
if (hourTest > minuteTest)
{
handDelay = hourTest;
}
else
{
handDelay = minuteTest;
}
// Set current hour
setTimeStepHour = (hr * 498) + (mn * 8.3) + ((sc + (handDelay * 36)) * .1383);
// Set current minute
setTimeStepMinute = (mn * 114) + ((sc + (handDelay * 45)) * 1.9);
// Test which hand will need more steps and set that to the longest step count for the for loop.
if (setTimeStepHour > setTimeStepMinute)
{
endStep = setTimeStepHour;
}
else
{
endStep = setTimeStepMinute;
}
for (int i = 0; i <= endStep; i++)
{
if (i < setTimeStepHour)
{
hourHand.step(2);
}
else
{
delay(3);
}
if (i < setTimeStepMinute)
{
minuteHand.step(3);
}
else
{
delay(4);
}
}
hourHand.setSpeed(1);
minuteHand.setSpeed(1);
}
}
От себя: мастер не до конца описал процесс сборки, в частности не понятно установка магнитов. думаю это будет интуитивно понятно в процессе сборке.
Источник (Source)
Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.
Подборки: 3D принтер
Источник: