Своими руками

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

Механический дисплей с сервоприводамиМеханический дисплей с сервоприводами
Принцип действия предлагаемого дисплея, который изготовил и построил автор 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;
}
}

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

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

admin

Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного. - Альберт Эйнштейн

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Follow us

Don't be shy, get in touch. We love meeting interesting people and making new friends.