Необычные часы со стрелкам-шариками

Не обычные часы сделал мастер-самодельщик с ником 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 принтер

Источник: usamodelkina.ru

Понравилась статья? Поделиться с друзьями:
Добавить комментарий