А вы ностальгируете по старым дисковым телефонам? Некоторые люди настолько не могут без них жить, что прикрутили телефонный номеронабиратель к современной клавиатуре. Почему бы и нет, в самом деле?
Прошивка
Идея в том, чтобы сделать красиво и функционально. Чтобы с помощью диска действительно можно было вводить цифры. Ещё планировалось удалить числовой ряд клавиатуры, чтобы вместо него поворотный диск работал.
Поворотный диск имеет две основные пары контактов. Одна размыкается, когда диск перемещается на 1 позицию, а другая создаёт характерную серию импульсов при отпускании (один импульс на числовую позицию). Можно было бы использовать прерывание при смене контакта, но шкала времени настолько велика, что ожидание получается приемлемым. Я использовал DFRobot Beetle, так как его встроенный ATMega32u4 имеет родной USB HID.
while (digitalRead(ACTIVE)) // Active-low
{
int count = 0;
while (!digitalRead(ACTIVE))
{
if (digitalRead(PULSE))
{
count += 1;
delay(50);
}
}
if (count >= 2)
{
count /= 2;
count = (count == 10) ? 0 : count;
Keyboard.print(count);
}
}
Кажется, что каждый импульс считывается дважды. Пожалуй, я должен был тщательно его изучить на наличие проблем, но он и так работает вполне адекватно. (В моей первой попытке была задержка всего 10 мс, что эмпирически привело к семикратному считыванию каждого импульса).
Электрика
Для питания этой клавиатуры нужны два кабеля: один для Arduino и один для оригинального контроллера клавиатуры. Меня больше устраивал такой вариант: вставить концентратор USB в клавиатуру, припаяв к нему Arduino и контроллер.
Это позволило мне припаять встроенный USB-порт клавиатуры к восходящему соединению концентратора. Таким образом, когда я подключаю свой самодельный USB-концентратор к компьютеру, сохраняется иллюзия USB-устройства с одним кабелем.
Самый дешевый концентратор с удобным форм-фактором, который я смог найти, был этим дурацким зверем с тремя портами:
Интересно, что верхний порт концентратора действительно совместим с SuperSpeed: пары SSRX+/- и SSTX+/- представляют собой полностью независимый интерфейс от D+/-пары, используемой для Full-Speed или High-Speed USB, и поэтому могут быть направлены непосредственно на порт без промежуточного узла.
Чип, выполняющий всю тяжелую работу в этом концентраторе, является монолитным HS8836A, который предположительно рассчитан на высокоскоростной USB-трафик и имеет впечатляюще малое количество вспомогательных компонентов.
В моём случае нужно было просто аккуратно отпаять существующие порты, чтобы не расплавить микросхему концентратора и подключить USB-сигналы от клавиатуры и Arduino. Обратите внимание, насколько компактна эта плата благодаря HS8836A:
Для подключения данных к Arduino я использовал несколько экранированных дифференциальных линий от проводов дисплея LVDS iMac, потому что они очень удачно валялись среди прочего хлама. Подозреваю, что импеданс полностью выключен, но USB 1.1 удивительно надёжен.
Клавиатура
Чтобы заменить цифровой блок клавиатуры на поворотный диск, мне пришлось удалить все переключатели для неё. Это было легко, так как данная клавиатура имеет одностороннюю печатную плату, а моя присоска для пайки весьма удобна.
Можно было бы разместить основание циферблата поверх печатной платы, но в этом случае сам циферблат находился бы очень высоко.
Потом я понял, что если сделать прорезь под циферблат, то получится расположить его на уровне клавиш, как показано ниже:
Это влечет за собой прорезание дорожек в нижней части печатной платы. Они позволяют клавиатуре сканировать все клавиши, чтобы определить, какие из них были нажаты. Я потратил много времени, исследуя дорожки мультиметром и делая перемычки для их замены.
Из-за моей неосторожности пришлось ещё немного потрудиться - когда я подключил плату, то понял, что сломал кластер клавиш со стрелками. Забавный факт: матрица клавиатуры на этой плате также используется для индивидуального включения светодиодов, поэтому, если клавиатура не может подсветить какую-то клавишу, она также не сможет ее прочитать.
После обработки клавиатуры кольцевой пилой, осциллирующим резаком и дремелем мне удалось прикрепить диск к остаткам клавиатурной платы.
Закончив работу с проводкой USB, я убедиться, что ещё не сжёг ничего важного (обратите внимание, что индикаторы клавиатуры горят — это указывает на то, что, по крайней мере, питание подаётся).
3D-печать
Я решил напечатать на 3D-принтере кожух, чтобы скрыть внутренности циферблата. Всё же мне не хотелось получить совсем уж ужасное детище.
Раньше я ничего не проектировал в 3D CAD, так что пришлось чуть-чуть изучить OpenSCAD - ровно настолько, чтобы все мои друзья-механики с криками разбежались. На самом деле этого было достаточно, чтобы спроектировать базу с цифрами, которая будет крепиться на основание клавиатуры.
Мне кажется, очень здорово иметь функционально определённый язык для создания твёрдых предметов. В любой момент можно немного поменять настройки и параметры, не переделывая всё заново.
(По иронии судьбы я умудрился потерять файл OpenSCAD, поэтому итоговый рендеринг был сделан путём импорта STL в OpenSCAD).
Нужный результат получился не сразу, но в итоге у меня всё получилось с помощью функции экспорта SVG OpenSCAD и многократной печати объекта до получения нужного угла наклона.
Конечно, окончательная напечатанная деталь все ещё была немного смещена, и мне пришлось вырезать в ней выемку, чтобы получить правильный угол.
Кроме того, пришлось немного подрезать металл основания поворотного диска, но после небольшой шлифовки у меня получилось собрать всё вместе. Я использовал сварку трением с перемешиванием, чтобы соединить все три детали вместе, вставив кусок нити в свой дремель и проведя им по швам. Это значительно сложнее, чем кажется, и в тот момент я зауважал людей, которые делают это в промышленных масштабах из нержавеющей стали, например, для топливных баков ракеты SLS.
Параметрический колпачок
Просто выдрать из клавиатуры числовой ряд, чтобы принудительно использовать вместо него поворотный диск, было бы достаточно забавно, но я решил, что будет интереснее напечатать специальный колпачок для клавиатуры 10U, который бы соответствовал профилю существующих клавиш и позволял светодиодам просвечивать сквозь себя. Это стало возможным благодаря невероятному генератору параметрических клавиш для OpenSCAD, который я нашёл на GitHub.
include <./includes.scad>
$stem_positions = [[19.05*-4.5,0], [19.05*-3.5,0], [19.05*-2.5,0], [19.05*-1.5,0], [19.05*-0.5,0], [19.05*0.5,0], [19.05*1.5,0], [19.05*2.5,0], [19.05*3.5,0], [19.05*4.5,0]];
$inset_legend_depth = 3;
$font="Source Code Pro:style=Semibold";
oem_row(1) upside_down() u(10) dishless() legend("THE ROTARY DIAL IS MIGHTIER THAN THE NUMBER KEYS", [0, -0.8], 4.5) key();
Из-за того, что Cura пасует, когда дело доходит до объектов с внутренними вырезами, мне пришлось вручную определить края, чтобы крышка клавиатуры не отслаивалась. Да, проекции OpenSCAD ужасно требовательны к вычислительным ресурсам, но есть лучший способ сделать это:
difference() {
scale([1.07, 1.5])
linear_extrude(height=0.2)
projection(cut=true) oem_row(1) u(10) upside_down() dishless() key();
linear_extrude(height=0.2)
projection(cut=true) oem_row(1) u(10) upside_down() dishless() key();
};
После того, как я установил стабилизирующие клавишные переключатели, я наклеил кусок липкой ленты поверх колпачка клавиш и залил туда остатки суперклея, чтобы заполнить вырезы. Двумя днями позже клей полностью застыл.
Пожалуй, разумнее было бы нанести несколько тонких слоёв, так как суперклей затвердевает под воздействием влаги, и поэтому нижняя часть, та, что ближе к верхней части колпачка, сохла слишком долго.
Да, он действительно печатает “the rotary dial is mightier than the number keys” (поворотный диск мощнее, чем цифровые клавиши) при нажатии. Я подключил все три переключателя, поддерживающие колпачок клавиатуры, параллельно и подключил их к неиспользуемому входному контакту на Arduino.
Окончательная сборка
Мой кожух пришлось приклеить горячим клеем к клавиатуре, который также намертво зафиксировал кучу винтов, скрепляющих клавиатуру. Хорошо, что у меня никогда не будет ошибок в проводке, так ведь? ….Никогда не будет, да?
Ну, я нечаянно обрезал одну из дорожек для клавиши со стрелкой вниз. Не представляю, как это могло произойти. Хотя я утверждаю, что vimkeys должно быть достаточно, нефункциональные клавиши немного смущают, особенно когда клавиатура заклеена.
Я решил эту проблему с помощью отрезного колеса на дремеле. Я разрезал заднюю часть клавиатуры под клавишей со стрелкой вниз и рядом с Arduino, что позволило мне выловить провода от этой клавиши к Arduino и заодно проникнуться уважением к чувакам, которые строят корабли в бутылке. Благодаря одностороннему характеру печатной платы клавиатуры было нетрудно изолировать ножки переключателя от схемы клавиатуры с помощью припоя и термоусадки.
Другая проблема была хуже: я принёс клавиатуру в офис коллеги, пока он был на обеденном перерыве, но подключил его к KVM. К сожалению, KVM прослушивает только HID-устройства, такие как клавиатуры и мыши, а это означает, что мой умный USB-концентратор посередине не был распознан, и, следовательно, клавиатура вообще не работала. Как стыдно…
Реакция коллег была очень разной. От “это действительно работает?” до “господи, неужели у кого-то НАСТОЛЬКО много свободного времени”?
А вот ещё картинки чудо-устройства:
А вы что скажете?
Что ещё интересного есть в блоге Cloud4Y
→ Информационная безопасность и глупость: необычные примеры
→ Как распечатать цветной механический телевизор на 3D-принтере
→ Создание e-ink дисплея с прогнозом погоды
→ Аналоговый компьютер Telefunken RA 770
Подписывайтесь на наш Telegram-канал, чтобы не пропустить очередную статью. Пишем только по делу. А ещё напоминаем про второй сезон нашего сериала ITить-колотить. Его можно посмотреть на YouTube и ВКонтакте.