Прошлая часть рассказывает почему я решил делать полностью свою клавиатуру и как получена была раскладка, а в этой же будут выбраны и заказаны материальные детали для воплощения идеи в нечто работающее. Итак, мне нужна низкопрофильная клавиатура. Насколько низким должен быть профиль? Какие свичи дадут приятный тактильный отклик? Это самые сложные вопросы на которые надо будет найти ответ. Гуглинг помог найти: Cherry MX Low Profile  с ходом в 3.2мм при 11.9мм полной высоты. Cherry MX Ultra Low Profile с ходом всего 1.8мм и высотой в 3.5мм —  звучит настолько хорошо, что их всё ещё нельзя заказать нигде. Kailh Choc v2 свичи с ходом в 3.0мм и высотой 11мм (8мм от платы). Kailh X свичи с ходом в 2.5мм и высотой 6.5мм (6мм от платы). Так так так. Я точно хочу слим, короткий ход... Получается, надо брать либо Kailh X либо Cherry Ultra Low Profile. Вторые купить нельзя, остаются первые — но они недавно на рынке: нет плат с образцами, нет стабилизаторов, нет крышек (помимо простых 1u)... Выходит что с ними будет очень много возни, чтобы получить то что я хочу. Оставляем зарубку для следующей версии клавиатуры. Если выбирать между MX Low Profile и Choc, у последних короче ход и они сами ниже, так что я выбрал их. И заказал Kailh Choc Switch Tester. Когда тестовый набор приехал, я прокликал их все и отобрал Brown как приятные на нажим, не шумные и с достаточно коротким ходом. С приложенной в комплекте крышкой MBK они и выглядят достаточно низкопрофильно чтобы двигаться дальше. Заказал штангенциркуль и промерил свою Microsoft Sculpt: глубина хода около 2.5мм, так что можно надеяться, что 3мм свичи должны не очень-то отличаться. Учитывая что точка срабатывания 1.5мм, при желании можно будет просто сделать ограничитель на 2.5мм хода. Если он будет ощущаться не оч... То дизайн второй версии точно будет на базе Kailh X. Вдруг на рынке уже появятся крышки и стабилизаторы на них? Свичи заказать можно во множестве мест — пробежавшись по разным, я заказал там где было то что мне нужно по самой низкой цене. На chosfox.com заказал пакет Kailh Choc Switch Brown / 110 и набор низкопрофильных крышек. В наборе не все нужные мне крышки и не все правильных размеров — но их больше чем нужно чтобы собрать клавиатуру и попробовать как есть. К этому моменту раскладка и свичи уже выбраны, пришла пора разбираться дальше: какой взять процессор и как всё вместе соединять — навесным монтажом или на плату. Основным требованием к процессорному модулю — количество GPIO ног. В моей раскладке 6 рядов, у левой половина в самом длинном ряду 8 клавиш и 42 всего, у правой длиннейший ряд из 10 и всего 54 клавиши. Это означает, что голова должна быть 6+8=14ю ногами для левой половиной и 18ю для правой. Плюс две ноги на последовательный порт (или одну на i2c). Еще можно скреативить и разрисовать матрицу 7*8 = 15 ног, что с ногой для I2C влезет в 16-ногий головной модуль. Получается что надо 16 GPIO ног минимум, желательно 18. Лишние ноги лишними не будут (вдруг захочется лампочку статуса на капслок повесить). Итак, что было на рынке на момент поисков?   Pro Micro — 18 ног + еще 2 ноги если отпаять набортные диоды, по цене от ~9 CHF с доставкой с Али. Elite-C — 24 ноги, ~15$ + доставка + нет в наличии. Puchi-C — 24 ноги, 19 евро + доставка. Pi Pico RP2040 — 26 ног, 5 евро + доставка. Bluepill — 33 ноги, ~$7 с доставкой, и непонятно что с наличием. Выходит, что за счет разломанности ноги не являются проблемой, но вот стоимость... Пилюля (Bluepill) вроде дешевле всех, вот только с доступностью её было не очень. А еще к ним надо программатор. Всё вместе выходит по цене как у RP2040, так что брать решил его. Заказал из местного магазинчика три штуки по цене 4.75 за каждый + 6.40 доставка, итого где-то по 7 франков/штука. А три их надо для N+1, я не очень хорош в пайке. На что еще надо обратить внимание? RP2040 доступен в варианте Pico с портом MicroUSB, еще есть под Type-C порт, но если Pico можно припаять напрямую на плату то Type-C вариант требует ножек так же как Bluepill или Pro Micro. И разумеется, цены и рынок надо просматривать перед каждым заказом! Прямо сейчас дефицит микросхем похоже спал — пилюли в наличии от $4 с доставкой. А еще появился RP2040-Zero по цене $25 за 5 штук с доставкой, который явно лучше чем Pico, так как площадь модуля микроскопическая (18*23.55 мм), 20 припаеваемых ног плюс еще 9 ног на брюшке. Определённо мой выбор для следующей версии клавиатуры. Для сборки клавиатуры надо собрать свичи в матрицу и подключить ряды-колонки матрицы к процессору. Это можно сделать навесным монтажом или изготовить печатную плату. Решение не всегда тривиальное, поскольку за и против не всегда выражаются в измеряемой форме. Навесной монтаж потребует жесткой основы в которой будут закреплены свичи: например, заказать лазерную резку рамы, куда они вставляются (builder.swillkb.com рисует как раз такую) а затем надо будет припаять провода и диоды к каждому из свичей в согласно выбранной схеме. Если ошибиться где-нибудь, потребуется перепайка, которая требует определённого навыка. Если один из свичей помрёт (или окажется что приехал уже мертвый), его замена опять же потребует перепайки. Если потребуется собрать еще одну клавиатуру, матрицу надо будет спаивать опять аналогичным образом. Однако же навесной монтаж это единственный способ собрать не плоскую клавиатуру, для которой можно распечатать на 3D принтере корпус, навроде curved ergodox или dactyl manuform). Альтернатива — печатная плата — является жесткой основой сама по себе, так что корпус может быть упрощен. Плата обеспечит воспроизводимость матрицы, здесь сложнее ошибиться. Исправление/перепайка, если что-то пойдёт не так, потребует бОльше навыка чем отпаивание отдельного провода. Наиболее вероятными ошибками при сборке платы будут: перепутанная полярность диода или непропай какой-либо ноги. Учитывая почти 500 точек на пропайку и ожидаемый 1% ошибок = 5 точек точно придётся перепаять. Изготовление печатной платы потребует либо кучу сверловки вручную (по пять отверстий на каждый свич) да еще и разными диаметрами плюс разрисовывание платы или ЛУТ — и развлечение с химикатами дома; либо заказ платы на одном из сервисов по производству плат, и все популярные сервисы (NextPCB, JLC PCB, PCBWay) изготавливают платы от пяти копий. Еще вариант на выбор: можно паять свич напрямую, или взять hotswap сокеты, которые позволят менять свичи без перепайки. Их можно использовать что с навесным, что с наплатным монтажом. На заметку: сокеты на плате держат свичи менее жестко, чем если их впаять — поэтому без стабилизаторов использовать широкие клавиши сложно. Взвесив всё разом, я для себя решил сделать плату используя hotswap сокеты — я смогу легко менять свичи без перепайки, а еще это позволит мне делать перерыв в распайке платы без необходимости вспоминать где же я остановился. Всё, со свичами и как их крепить решено. На рынке несколько вариантов сокетов, я взял простейшие недорогие hotswap слоты — не самый лучший вариант, но для первого прототипа сойдут. Для клавиш от 2u и шире нужны стабилизаторы (а на самодельных крышках я добавляю крепление начиная с 1.75u). Я заказал набор Stabilizers large set (7x2U + 1x6.25U) – стабилизатор на 6.25u (большой пробел) конечно же не потребуется. Важно: эти стабилизаторы НЕ для крепления на печатную плату, как я выяснил позднее. В следующей версии я использую другие стабилизаторы. Поскольку я не хочу покупать десяток контактов и обжимку и кучу метров провода чтоб они все лежали в подвале годами, я заказал наборчик JST SH 1.00 connectors + wire set. Это уже обжатые кабеля плюс разъёмы к ним — дёшево, удобно, и ровно то, что надо. А, конечно же не забыть купить SMD diodes 100x. Еще один из выборов которые надо сделать: SMD диоды или обычные. Обычные проще припаивать, но под них надо отверстия на плате, гнуть выводы. SMD диодам отверстия не нужны, но они меньше и для удобства пайки требуется лупа. (Совет: можно заказать производство платы прямо с напайкой диодов!) У меня достаточно дома USB кабелей (и MicroUSB и Type-C), чтобы не потребовалось покупать специально, однако купить что-нибудь закрученное может быть хорошей идеей. Надо заготовить схему соединения. Плюс мне хотелось получить готовую плату. Есть несколько сервисов, превращающих раскладку от keyboard-layout-editor в плату: https://github.com/jeroen94704/klepcbgen — не поддерживает повороты клавиш. https://github.com/adamws/kicad-kbplacer — требует сперва подготовить схему. http://keyboard-tools.xyz/ — генерирует базовый дизайн и размещение свичей. https://kb.xyz.is/ — показывает предложенную матрицу и позволяет ее поправить перед генерацией. Поскольку раскладка у меня слегка изогнута, генератор с keyboard-tools.xyz выдал какую-то дикую в моём понимании матрицу, поэтому воспользовался kb.xyz.is. Генерация проста: копируем содержимое вкладки "raw data" из KLE, вставляем в поле ввода на сайте, получаем матрицу: Выбираем капслок слева, меняем столбец на "1", делаем то же самое с шифтом, контролом и матрица уже лучше: Сохраняем картинку матрицы: она пригодится если есть желание заниматься навесным монтажом. В случае навесного монтажа схему печатаем и поверх неё подписываем на какие ноги процессора подключим потом для воспроизведения результата. Нажимаем "Compile". Если планируем делать плату -- скачиваем сгенерированный zip файл. В любом случае сохраняем #define который нам выдали в отдельном месте -- он понадобится позднее для создания прошивки. Повторяем процесс для второй половины. Пора делать разводку.   Я буду расписывать что надо сделать в мельчайших подробностях так, чтоб читатель (и будущий я сам) смог повторить без особого опыта в использовании соответствующего софта. Скачиваем последний KiCAD (на момент написания — 6.0) и открываем keyboard.pro из сгенерённого архива. Затем доустанавливаем необходимые плагины и библиотеки: Меню Tools → Plugin and Content Manager, на вкладке "Plugins" находим и помечаем "PCBWay Plug-in for KiCad" а со вкладки "Libraries" помечаем "Keyswitch Kicad Library". Жмем "Apply changes" и KiCAD поставит всё выбранное. Нам еще понадобится плагин kicad-kbplacer. Он был не совместим с 6м KiCAD'м плюс мне понадобилось несколько правок к нему поверх. Скачиваем kicad-kbplacer.zip, идем опять в "Plugin and content manager" и ставим его используя "Install from file". Следуем инструкциям по ссылке KiCad-RP-Pico для установки элементов RPi Pico. Зарубка на будущее: для RP2040 Zero неплохая библиотека тут. Еще может потребоваться дополнительная библиотека для стабилизаторов. Не сегодняшний день я не знаю какая именно! Я использовал наплатный стабилизатор для PG1350 из набора Keebio parts но с ними выяснились проблемы, про которые и преодолении которых я расскажу в следующих частях (tl;dr: они не подходят для размещения на печатной плате, так что потребовалось распечатать адаптеры...) Вот теперь всё готово. Начинаем с открытия keyboard.sch двойным кликом в списке файлов проекта — нам надо добавить на схему процессорный модуль. Исходная схема после генератора выглядит так: Нажимаем “A” (Place → Add symbol), фильтруем список по "Pico" и добавляем модуль из списка. Перемещаем по схеме нажатием “M”, перемещением мыши куда надо а потом подтверждаем Enter. Отменяем режим добавления элементов нажатием Esc. Двойным кликом открываем свойства добавленного модуля, редактируем поле "Reference", где меняем "U?" на "Pico0". Еще нужно подключить матрицу к процессору — я ленивый, поэтому просто занимался копипастой маркеров сети (это такие пятиугольнички помеченные col0/row1 и т.п.) прямо на ножки процессора. Делается это так: клик на маркер, ctrl+c, ctrl+v, повернуть с помощью “r” если надо, переместить так чтоб стрелочка коснулась ноги. Повторить для каждого маркера. Результат: О! Потребуется же еще связь со второй половиной. Добавляем еще один элемент — "Conn_01x04". Так же двойным кликом заходим в свойства, делаем его "Reference" равным "Link0". Подключаем к разъёму линии VSYS, GND и TX/RX от какого-либо UART порта. Какие ноги могут работать портами можно посмотреть на схеме RPi Pico pinout. Полученная схема теперь выглядит так Сохраняем схему и через "Open PCB in board editor" переключаемся в редактор платы (ну либо закрываем редактор схем и двойным кликом в списке файлов проекта открываем pcb файл). Да, свичи не повернуты, сдвинуты куда-то за край, площадки для свичей другого типа. Исправляем: выбираем и удаляем рамку вокруг блока свичей (не забываем еще удалить малозаметные точки в углах). Теперь выбираем один из свичей (щелчком где-то рядом с его именем вида "K_24") так что выделяется весь свич. Edit → Change Footprints. Ставим радиокнопку на "Change footprints with library id", щелкаем на символ библиотеки рядом с "New footprint library id". В поле поиска вводим "Switch", выбираем строку "Hotswap_Kailh". Из второго списка выбираем символ подходящего размера свича. То есть правильная замена для исходно "MX_Alps_Hybrid:MX-1U-NoLED" будет "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_Choc_V1V2_1.00u". Нажимаем "Change": Теперь на плате все свичи этого типа стали правильными. Повторяем для остальных размеров. Следом надо добавить стабилизаторы для клавиш которые их требуют (я их добавил для клавиш от размера 1.75 и выше — но сомневаюсь что 2u стабилизаторы будут хорошо работать для 3u клавиш или больше). Чтобы добавить их опять идём в Place → Add Footprint, выбираем "Stab-PG1350-2u", размещаем его так, чтобы центральное отверстие совпало с центральным отверстием площадки свича. Двойным щелчком в свойствах меняем "Reference" на "ST_XX" (где XX совпадает с номером клавиши — то есть для клавиши K_21 стабилизатор должен быть ST_21). Проходимся по всем большим клавишам. (Еще западня с этими стабилизаторами: у них есть два возможных размещения. Одно размещение когда центр между большими квадратами на уровне отверстия свича, при этом нижний квадрат получается ниже нижней границы свича — это расположение подразумевает что крестовины стабилизации на крышках должны быть отцентрованы по вертикали. При втором размещении нижняя граница нижнего квадрата находится на уровне нижней границы свича, при этом крестовины стабилизации на крышках должны быть смещены немного вверх – крышки на которые я дал ссылки выше как раз такие). Как только все необходимые элементы размещены на плате можно поправить расположение. Для этого потребуется отконвертировать json, скачанный с KLE, во внутренний формат который понимает KeyAutoPlace. Сконвертировать можно на keyboard-tools.xyz раздел "KLE converter", грузим JSON из KLE и скачиваем сконвертированный. Возвращаемся в редактор плат, Tools → External Plugins → KeyAutoPlace. Выбираем сконвертированный Json файл в 1е поле, правим "key annotation format string" ⇒ "K_{}", "stabilizer annotation format string" ⇒ "ST_{}" и "diode annotation format" ⇒ "D_{}". Снимаем галочку "add tracks" и ставим "0-based numeration". Жмем OK ⇒ вуаля! (игнорируем болтающиеся по экрану линии, их там нет :) Добавляем еще два элемента для "Pico0" процессора и "Link0" разъёма. Для этого опять пользуем Place → Add footprint ищем "RPi-Pico_SMD_TH", размещаем, двойным кликом меняем "Reference" на "Pico0". Добавляем 4-ногий разъём по своему усмотрению. Как я говорил выше, я уже заказал JST разъём: "JST_SH_SM04B-SRSS-TB_1x04-1MP_P1.00mm_Horizontal". Меняем его "Reference" на "Link0". Теперь надо просинхронизовать схему и платы чтобы появились соединения к модулям и разъёму. Нажатием на F8 (или через меню Tools → Update PCB from Schematic) открываем диалог, убеждаемся что стоит крыжик "Re-link" а крыжики "Delete" и "Replace" сняты, жмем "Update PCB". Ошибок быть не должно (предупреждения будут). После этого на экране обновятся все связи между свичами, процессором и разъёмом. Но надо сперва еще просинхронизовать в обратную сторону, от платы к схеме. Жмем в меню Tools → Update schematic from PCB. Должна быть только ругань на стабилизаторы — просто игнорируем. Нажимаем "Update Schematic". Так как нужна матрица соединений, простейший вариант её отрисовки это нарисовать ряды и колонки на разных сторонах платы. А для этого потребуются переходные отверстия, а я же решил использовать hotswap слоты, которые крепятся на одну сторону платы. Не вопрос, зумимся на какую-либо кнопку и выделяем кликом первый контакт hotswap слота (тот на котором нарисовано "1" и "col0"), двойным кликом заходим в настройки и меняем  тип площадки с "SMD" на "Through-hole", а для "Hole size X" ставим что-нибудь разумное — я выбрал 1.2мм. После "OK" площадка поменялась на отверстие. Один готов, еще 41 поменять :) выбираем (через shift+click) все первые площадки всех свичей, идём в меню правой кнопки мыши и выбираем Paste Default Pad Properties to Selected. Готово, рисуем матрицу. Заходим в меню File → Board setup, идем в Net Classes и ставим ширину дорожки по умолчанию в 1мм (если очень хочется можно и 0.25мм оставить — для клавиатуры это совершенно неважно). Я еще добавил два заготовленных размера в 0.75мм и 0.5мм. Жмем "ok" и можем приступать к рисованию! Выбираем слой. Так как диоды на обратной стороне, слой B.Cu будет используется для строк и диодов, а F.Cu для столбцов (переходные отверстия были как раз для него заготовлены). так что выбираем слой F.Cu, кликаем на начало дорожки, жмем “X” (Route → Route Single Track), ведём к следующей точке, где либо кликаем мышью чтобы закончить либо жмем “X” опять чтобы продолжать. Как все столбцы отрисованы, выбираем B.Cu слой  (не обязательно: так как диоды и вторые ножки на обратной стороне, при попытке нажать “X” для отрисовки дорожки, слой B.Cu выберется автоматически). Я сперва подключил все диоды и потом соединил ряды матрицы. Вот как выглядит результирующая матрица: Следующим шагом надо определиться с размером платы — контроллер стоит разместить на границу, чтобы подключать кабель было удобно. Так что рисуем прямоугольник на слое Edge.Cuts и перемещаем контроллер и разъём на границу. Совершенно не обязательно подключать линии именно к тем ножкам которые были определены ранее на схеме — всегда можно подвести куда удобно, переключиться на схему, переместить подключение к новой ноге, сохранить и в редакторе платы через F8 обновить карту соединений. Я еще добавил элементы "Mounting Hole" размером в 2.2мм по углам. Первый блин вышел комом — не следовало проводить дорожки по границе платы, стоило просто внять где-нибудь из середины про подключать ближе. В общем, разводка на левой и правой половине ощутимо разная, но расстояние между верхним свичом до границы платы выдержано одинаковым в 6мм, так что рамка будет однаковая. Финальный вид платы: Затем надо через Inspect → Design Rules Checker проверить на ошибки дизайна. У меня были следующие: Дублирование сверловки в элементе свича. Наверное, можно и проигнорировать, но я прошелся по всем свичам для каждого нажимая Ctrl+E, щелкнуть по отверстию, из выпадашки выбрать одно из них и удалить нажатием на "Del", сохранить. Дублирование сверловки от стабилизатора. Тот же подход — выбрать стабилизатор, Ctrl+E, удалить центральное отверстие. Непрорисованые линии (диод не подключен коротким хвостом) либо дублированные линии либо линии нулевой толщины. Пройтись по всем и дорисовать либо удалить лишнее. Как только DRC не выдаёт ни ошибок ни замечаний — всё готово!   Важно не забыть: для соединения левой и правой половин я купил кабель с прямой обжимкой, поэтому назначения ног в разъёме идут наоборот (то есть 1-2-3-4 получается подключен к 4-3-2-1). Поэтому важно убедиться что +5 на одной стороне идёт к +5 на другой стороне с учетом этого, GND к GND а последовательные ноги идут RX к TX и наоборот. На гитхабе лежат итоговый проект и архивы через которые я заказывал платы. Как только дизайн обеих половин готов — заказываем. Для этого я воспользовался плагином от PCBWay который подготавливает ZIP файл в нужном наборе и загружает его на PCBWay чтобы показать стоимость. Оттуда его можно сразу же скачать и загрузить на другие сервисы для сравнения. Я попробовал все три самых популярных: PCBWay, JLCPCB и NextPCB, сравнил стоимость и сроки изготовления и доставки. В моем случае JLCPCB победил, обе половины были заказаны тут. В следующей части собраны вместе аппаратная и програмная части и стало можно печатать. 4я часть предназначена для корпусирования клавиатуры. А в последней, 5й, части я расскажу о разработке и изготовлении крышек. Эта часть доступна на английском на Medium и LinkedIn.  Программист / сисадмин (Sr. SRE)