Ручнаяя мастерская

Механический дисплей с сервоприводами

Механический дисплей с сервоприводамиМеханический дисплей с сервоприводами
Принцип действия предлагаемого дисплея, который изготовил и построил автор Instructables под ником alstroemeria, состоит в следующем: выдвинутые сервоприводами сегменты отбрасывают тень, отчего становятся видимыми. Остальные же сегменты, расположенные в одной плоскости с фоном, сливаются с ним.
Понятно, что самоделка оказывается недешёвой, ведь для неё мастер приобретает целых 28 таких сервоприводов:

Механический дисплей с сервоприводамиМеханический дисплей с сервоприводами
И модуль управления ими, который подключает к Arduino вот так:

Механический дисплей с сервоприводами
Модуль часов реального времени (RTC) на этом фоне кажется совсем незначительной затратой.

Механический дисплей с сервоприводами
Приобретя все необходимые компоненты, мастер пока откладывает их, чтобы поработать над шаблонами для изготовления механической части дисплея. У него получаются четыре файла: 1, 2, 3, 4. Мастер выводит на режущий плоттер файлы 1 и 3 по два раза, а 2 и 4 — по одному, все в масштабе 1:1, и получает шесть деталей, некоторые из которых чем-то напоминают старые перфокарты. Можно и распечатать, также в масштабе 1:1 и в тех же количествах, и вырезать вручную.

Механический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводами
Нарезает дремелем полые металлические штыри длиной по 20 мм и трубки с внетренним диаметром чуть больше внешнего диаметра штыря длиной по 10 мм:

Механический дисплей с сервоприводамиМеханический дисплей с сервоприводами
Склеивает слои толстым двухсторонним скотчем, добавляет трубки:

Механический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводами
Добавляет подвижные сегменты, приклеенные к пропущенным через трубки штырям, с обратной стороны приклеивает к тем же штырям толкатели из стальной проволоки, вот тут-то и приогождается то, что штыри полые:

Механический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводами
Загибает толкатели, приклеивает сервоприводы и соединяет с ними:

Механический дисплей с сервоприводами
Закрывает сервоприводы оставшимся перфорированным листом:

Механический дисплей с сервоприводамиМеханический дисплей с сервоприводамиМеханический дисплей с сервоприводами
Модуль управления сервоприводами подключает по схеме, приведённой в начале статьи. Сами приводы подключает к модулю в порядке, соответствующем стандартным обозначениям сегментов:

Механический дисплей с сервоприводами
Модуль RTC подключает так: SDA — вывод 4 Arduino , SCL — вывод 5, плюс питания и общий провод — параллельно соответствующим линиям Arduino. Вот что получается в итоге:

Механический дисплей с сервоприводамиМеханический дисплей с сервоприводами
Мастер выставляет время в модуле RTC таким скетчем (нужна библиотека RTClib):

Механический дисплей с сервоприводами Скетч здесь#include
#include "RTClib.h"

RTC_DS1307 RTC;

void setup () {
Serial.begin(57600);

Wire.begin();

RTC.begin();

if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
RTC.adjust(DateTime(__DATE__, __TIME__));
}
}

Затем заливает основной скетч, требующий той же библиотеки:

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

RTC_DS1307 RTC;

short segA = 0; //Display pin 14
short segB = 1; //Display pin 16
short segC = 2; //Display pin 13
short segD = 3; //Display pin 3
short segE = 4; //Display pin 5
short segF = 5; //Display pin 11
short segG = 6; //Display pin 15

short segA_OUT = 110;
short segB_OUT = 110;
short segC_OUT = 110;
short segD_OUT = 110;
short segE_OUT = 110;
short segF_OUT = 110;
short segG_OUT = 110;

short segA_IN = 90;
short segB_IN = 90;
short segC_IN = 90;
short segD_IN = 90;
short segE_IN = 90;
short segF_IN = 90;
short segG_IN = 90;

int TIME = 2000;

DateTime datePast;
DateTime dateNow;

//house keeping
void setup() {
Serial.begin(9600);
Wire.begin();
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__));
datePast = RTC.now();
}

//main loop
void loop() {
dateNow = RTC.now();
if(!(datePast.hour() == dateNow.hour() && datePast.minute() == dateNow.hour() ))
{
displayNumber(dateNow.hour()*100+dateNow.minute());
datePast = dateNow;
}
}

//Given a number, we display 10:22
//After running through the 4 numbers, the display is left turned off
void displayNumber(int toDisplay) {
for(int digit = 4 ; digit > 0 ; digit—) {
lightNumber(toDisplay % 10, digit);
toDisplay /= 10;
}

//start movement
Serial.print(" T");Serial.println(TIME);
}

void move(int servo, int position) {
Serial.print("#");
Serial.print(servo);
Serial.print(" P");
Serial.print(position);
}

//Given a number, turns on those segments
//If number == 10, then turn off number
void lightNumber(int numberToDisplay, int segment) {

int offset = (segment — 1)*7;
switch (numberToDisplay){

case 0:
move(segA + offset, segA_OUT);
move(segB + offset , segB_OUT);
move(segC + offset , segC_OUT);
move(segD + offset , segD_OUT);
move(segE + offset , segE_OUT);
move(segF + offset , segF_OUT);
move(segG + offset , segG_IN);
break;

case 1:
move(segA + offset , segA_IN);
move(segB + offset , segB_OUT);
move(segC + offset , segC_OUT);
move(segD + offset , segD_IN);
move(segE + offset , segE_IN);
move(segF + offset , segF_IN);
move(segG + offset , segG_IN);
break;

case 2:
move(segA + offset , segA_OUT);
move(segB + offset , segB_OUT);
move(segC + offset , segC_IN);
move(segD + offset , segD_OUT);
move(segE + offset , segE_OUT);
move(segF + offset , segF_IN);
move(segG + offset , segG_OUT);
break;

case 3:
move(segA + offset , segA_OUT);
move(segB + offset , segB_OUT);
move(segC + offset , segC_OUT);
move(segD + offset , segD_OUT);
move(segE + offset , segE_IN);
move(segF + offset , segF_IN);
move(segG + offset , segG_OUT);
break;

case 4:
move(segA + offset , segA_IN);
move(segB + offset , segB_OUT);
move(segC + offset , segC_OUT);
move(segD + offset , segD_IN);
move(segE + offset , segE_IN);
move(segF + offset , segF_OUT);
move(segG + offset , segG_OUT);
break;

case 5:
move(segA + offset , segA_OUT);
move(segB + offset , segB_IN);
move(segC + offset , segC_OUT);
move(segD + offset , segD_OUT);
move(segE + offset , segE_IN);
move(segF + offset , segF_OUT);
move(segG + offset , segG_OUT);
break;

case 6:
move(segA + offset , segA_OUT);
move(segB + offset , segB_IN);
move(segC + offset , segC_OUT);
move(segD + offset , segD_OUT);
move(segE + offset , segE_OUT);
move(segF + offset , segF_OUT);
move(segG + offset , segG_OUT);
break;

case 7:
move(segA + offset , segA_OUT);
move(segB + offset , segB_OUT);
move(segC + offset , segC_OUT);
move(segD + offset , segD_IN);
move(segE + offset , segE_IN);
move(segF + offset , segF_IN);
move(segG + offset , segG_IN);
break;

case 8:
move(segA + offset , segA_OUT);
move(segB + offset , segB_OUT);
move(segC + offset , segC_OUT);
move(segD + offset , segD_OUT);
move(segE + offset , segE_OUT);
move(segF + offset , segF_OUT);
move(segG + offset , segG_OUT);
break;

case 9:
move(segA + offset , segA_OUT);
move(segB + offset , segB_OUT);
move(segC + offset , segC_OUT);
move(segD + offset , segD_OUT);
move(segE + offset , segE_IN);
move(segF + offset , segF_OUT);
move(segG + offset , segG_OUT);
break;

case 10:
move(segA + offset , segA_IN);
move(segB + offset , segB_IN);
move(segC + offset , segC_IN);
move(segD + offset , segD_IN);
move(segE + offset , segE_IN);
move(segF + offset , segF_IN);
move(segG + offset , segG_IN);
break;
}
}

Всё работает:

Механический дисплей с сервоприводами
Вот и готов механический дисплей нетривиальной конструкции.

Присоединяйтесь!

Не стесняйся, общайся. Мы любим встречать интересных людей и заводить новых друзей.