Статьи » Разработки
Добавить статью

Строим часы на Arduino с использованием сервоприводов

2020-02-09 в 19:32 (последнее изменение 2020-02-29 в 10:06)

Вы мечтаете собрать часы на индикаторных лампах типа "Никси", но те с каждым годом становятся всё дороже, а встречаются - всё реже? Ничего страшного. Существует способ показа цифр, придуманный ещё раньше. Тогда, когда ламп этих даже в проекте не было - он уже существовал. Речь идёт об индикации при помощи колец с цифрами, написанными на их торцах.

Для этого проекта нам понадобиться:
1. Сервоприводы SG90
2. Arduino UNO
3. Модуль часов реального времени DS1307

Давайте вспомним, где применялась и применяется такая индикация. Арифмометры, старые контрольно-кассовые машины, аркадные автоматы, шагомеры, счётчики магнитофонов, одометры... Из нынешнего - водомеры и некоторые электросчётчики (а когда-то - вообще все).

И в отличие от "Никси", для такой индикации не потребуются компоненты, снятые с производства. Так, автор сайта Arduino Project Hub применил в своих часах стандартные сервоприводы SG90, которые выпускаются в огромных количествах, сравнительно недороги и ничуть не дефицитны. Модифицровав код, можно приспособить и другие аналогичные сервоприводы. Свой проект разработчик выложил по адресу https://create.arduino.cc/project....ffset=9 на условиях лицензии GPL версии 3 или выше на ваш выбор. Правда, получилась вещь, почти неотличимая от винтажной?

Первым делом мастер берёт RTC-модуль на микросхеме DS1307 и три сервопривода, которые подключает к Arduino согласно схеме в формате Fritzing: https://hacksterio.s3.amazonaws.com/uploads....X4V.fzz

Электронная часть готова, вот так она проста. Безо всяких дешифраторов с высоковольтными ключами и преобразователей. Но не расслабляйтесь, теперь надо изготовить механическую часть. С нуля, самостоятельно - это вам не готовые "Никси", где до вас все проволоки изогнуты, сетка вырезана, всё это собрано, помещено в баллон, воздух откачан, неон закачан, и так далее. Тут всё по-другому, тут всё своими руками делать надо. Повторяйте за мастером!

Берём, значит, обыкновенную ПВХ-трубу с внутренним диаметром в 76,2 мм, а внешним - в 88,9 мм. Вырезаем, значит, из неё два кольца шириной в 6,35 мм - одно для десятков минут, другое - для единиц.

Для часов (в смысле, не железок, а единиц измерения) делаем одно кольцо побольше - шириной в 25,4 мм, там две цифры ведь в некоторых положениях.

Из чего-нибудь пористого делаем во все кольца вставки, диаметр которых выбираем чуть больше внутреннего, чтобы туго входили.

Приклеиваем переходники для установки колец со вставками на валы сервоприводов.

Помещаем и вклеиваем вставки в минутные кольца так:

А в часовое кольцо - так:

Теперь надо напечатать полоски с числами. Скетч рассчитан на кольца указанных выше размеров и цифры высотой в 18 пунктов, напечатанные в масштабе 1:1, иначе придётся корректировать в программе углы поворота. На часовое кольцо печатаем в столбик числа от 1 до 12, на кольцо десятков минут - от 0 до 5, на кольцо единиц минут - от 0 до 9. Если модифицировать скетч, можно переделать часы в 24-часовые, тогда потребуются четыре сервопривода, и на кольцо десятков часов придётся напечатать числа от 0 до 2, а на кольцо единиц часов - от 0 до 9. Все кольца в этом случае будут одинаковой, малой толщины.

Кольца нужно установить на валы сервоприводов правильно. Привод единиц минут устанавливаем на 0 градусов, десятков минут - на 120, часов - на 132. Устанавливаем кольца:

Далее из листового металла (работаем с ним в перчатках) склеиваем (или спаиваем, если металл поддаётся лужению) такую конструкцию:

Прикручиваем её саморезами к деревянной подставке:

Сервоприводы с вставками и кольцами закрепляем обычными кабельными стяжками:

И наконец, изготавливаем переднюю панель с прорезями и размещаем её перед кольцами:

При желании приобретаем или изготавливаем корпус произвольной конструкции. Заливаем в Arduino скетч:

Код
#include <SPI.h>

#include <Wire.h>
#include "RTClib.h"
#include <Servo.h>  

Servo myservo1;  // single minute servo connects to arduino pin 9           
Servo myservo2;  // tem minute servo connects to arduino pin 8
Servo myservo3;  // hour servo connects to arduino pin 7

int pos1 = 0;     
int pos2 = 0;
int pos3 = 0;

RTC_DS1307 rtc;

void setup() {
   // put your setup code here, to run once:
   myservo1.attach(9);
   myservo2.attach(8);
   myservo3.attach(7);

   Serial.begin(9600);
   if (! rtc.begin()) {
     Serial.println("Couldn't find RTC");
     while (1);
   }

   if (! rtc.isrunning()) {
     Serial.println("RTC is NOT running!");
     // following line sets the RTC to the date & time this sketch was compiled
     rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

   }
}

void loop() {
   DateTime now = rtc.now();

   int h=now.hour();
   int m=now.minute();
   int nm;  // variable used to convert to minute single digit

   // following line converts from 24 hour to 12 hour
   if (h>12) {
     h=h-12;
   }

   Serial.print(h);
   // following lines position the hour disc
   if(h==1){
     pos3=132;
   }
   if (h==2){
     pos3=120;
   }
   if (h==3){
     pos3=108;
   }
   if (h==4){
     pos3=96;
   }
   if (h==5){
     pos3=84;
   }
   if (h==6){
     pos3=72;
   }
   if (h==7){
     pos3=60;
   }
   if (h==8){
     pos3=48;
   }
   if (h==9){
     pos3=36;
   }
   if (h==10){
     pos3=24;
   }
   if (h==11){
     pos3=12;
   }
   if (h==12){
     pos3=0;
   }

   Serial.print(":");
   Serial.print(m);
   //following lines position the minutes discs
   if (m<10){
     nm=(m);
     pos2=120;
   }
   if (m>9){
     nm=(m-10);
     pos2=108;
   }
   if (m>19){
     nm=(m-20);
     pos2=96;
   }
   if (m>29){
     nm=(m-30);
     pos2=84;
   }
   if (m>39){
     nm=(m-40);
     pos2=72;
   }
   if (m>49){
     nm=(m-50);
     pos2=60;
   }

   Serial.println();
   Serial.print(nm);
   pos1=(nm * 12); // this line determines the servo 1 movement
   myservo1.write(pos1);
   myservo2.write(pos2);
   myservo3.write(pos3);

   Serial.println();
   Serial.println();
   Serial.print(pos1);
   Serial.println();
   delay (1000);

}

Время в компьютере перед компиляцией должно быть выставлено правильно, лучше всего - по NTP-серверу, так как оно запишется в RTC в момент пуска скетча. Если RTC "уплывёт", процедуру следует повторить. Проверить, правильные ли получились углы поворота, при необходимости скорректировать.

Осталось позвать в гости кого-нибудь, кто недавно изготовил никси-часы, и показать ему эту штуку. Обратить внимание, что способ индикации более винтажный, но компоненты - доступные. Гость вспомнит, с каким трудом он нашёл дешифраторы и лампы, а результат всё равно вышел менее винтажно выглядящим, чем у вас.


Не пропустите обновления! Подписывайтесь на нашу группу Вконтакте.
Так же у нас есть Telegram канал.
Вам понравился наш материал? Поделитесь с коллегами!

Просмотров: 3206. Оценка статьи: 0.0 из 5. Уже оценило 0 читателей

Об авторе - tormozedison

More by tormozedison

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]