Платотерапия: как я собрал свои Arduino UNO и Digispark с нуля
В последнее время поймал себя на том, что меня успокаивает процесс создания плат, от разводки, до пайки и я какое-то время вынашивал идею, что неплохо было бы сделать какую-то свою отладочную плату, например, с программированием по USB. Но зачем что-то придумывать без веской причины, тогда как можно взять готовый проект, например, Arduino UNO или Digispark и заодно подсмотреть как там все устроено. Поэтому я ухватился за эту идею.
В этой статье пойдет рассказ о создании клонов Arduino UNO и Digispark, а также о создании трех разных плат расширения и тестировании двух купленных.
Попробуем сделать Arduino UNO DIY — свой ответ Arduino UNO Q.
Введение
Признаюсь, что сначала я хотел делать отладочную плату для CH32V003, но долгое время меня сдерживало то, что непонятно как подписывать контакты, чтобы не запутаться. Но вскоре я научился делать достаточно простенькую шелкографию с помощью лазерного принтера и утюга. И для меня этого оказалось достаточно, чтобы приступить к этой задаче.
Вы могли заметить по фотографиям, что платы я аккуратно вырезаю на фрезерном станке, поэтому то, что я буду рассказывать в этой статье не сказать, что универсально, это просто на данный момент мое увлечение и я решил, что раз я этим занимаюсь, то почему бы не попробовать что-то новое. На маркетплейсах я нашел наборчик для сборки под ATmega8. К слову, к нему прилагается принципиальная схема и я думал было его повторить, но решил, что это слишком просто и не интересно, хоть и хорош для разминки. И тогда задумался о Digispark. Начал его делать и тоже понял, что лучше сделать что-то посложнее, тогда и подумал об Arduino UNO.

Наборчик для сборок, который я хотел сначала повторить
Почему выбрал Arduino UNO или Digispark на самом деле просто. Мне хочется приобщиться к этому сообществу побольше, потому что для CH32V003 я делаю платы, а под AVR как-то не очень. Понимаю, что 8-битные микроконтроллеры уже не так актуальны, но для изучения электроники и для решения простых задач они вполне хорошо себя чувствуют, кроме лишь того, что стоят в разы дороже CH32V003, но на этот раз я решил сильно не обращать на это внимания, т.к. это затея больше для развлечения, а для готового устройства я уже буду основательнее выбирать микроконтроллер.
Еще причина попробовать Arduino UNO или Digispark было в том, что это открытые проекты, другими словами профессиональные принципиальные схемы доступны для всех желающих и мне было интересно их изучить, попробовать на основе их что-то сделать свое, а не только изучать спорные или любительские схемы из интернета.
В статье сначала будет рассмотрено создание клона Arduino UNO, затем две купленные платы расширения (LCD Keypad Shield, Multi-Functional Shield) и три самодельные для него (для программирования ATtiny85, для подачи питания и с WiFI). Затем рассмотрим коротко клон Digispark.
На самом деле, в этой статье рассматривать Digispark кажется, что не уместно, но я сделал эту плату до того, как решил делать клон Arduino UNO, поэтому это просто дополнительный бонус.
Дальше в статье будет много принципиальных схем, все они рабочие, точнее некоторые устройства я делал не с первой попытки и все ошибки уже поправил, точнее все мне известные, т.к. устройства функционируют корректно. Кроме, возможно, платы расширения с WiFi, но я про это отдельно напишу еще.
Arduino UNO DIY
Надеюсь мне не придется объяснять, что такое Arduino, поэтому дальше я делаю предположение, что мой читатель уже знаком или имеет какое-то базовое предоставление об этой платформе. В противном случае, даже если я все объясню, моя статья вам окажется бессмысленной, т.к. проще купить готовую плату и не ломать себе голову. Скажу только, что Arduino UNO это одна из первых плат, которые появились для Arduino. Они изначально использовали микроконтроллер в DIP корпусе, поэтому я и захотел повторить именно ее, т.к. она мне хорошо запомнилась. Возможно это была не UNO, а Arduino Diecimila, но это не принципиально.

Arduino Uno R2 из Википедии
Перед разработкой у меня было несколько вопросов: «Как подключать микроконтроллер?», «Где мне взять размеры платы и плат расширения?», «Что делать с программированием по USB?».
Принципиальная схема
Отвечаю на вопрос «Как подключить микроконтроллер?»
К этому проекту я приступил больше месяца назад, поэтому все в деталях не помню, но сейчас могу сказать, что самый лучший ответ на «Как подключить микроконтроллер?» находится на странице MiniCore. Например, вот принципиальная схема с примером подключения оттуда:

Минимальная схема подключения ATmega8/48/168/328
На вопрос «Где мне взять размеры платы и шилдов?», как мне показалось, лучшим способ было подсмотреть в файлах в открытом доступе самой Arduino UNO. Но быстрым поиском по сети я нашел проект Make Your UNO Kit, в котором содержались все нужные мне файлы: принципиальная схема и CAD файлы с размерами платы.

Плата после сборки набора Make Your UNO Kit
По началу принципиальную схему из Make Your UNO Kit я изучал и пытался полностью повторить, но после всего, что делал, скажу, что самая удобная схема это все же из MiniCore и она полностью совместима. Надо добавить, что принципиальная схема Arduino UNO R3 гораздо сложнее выглядит, чем из Make Your UNO Kit. Что-то интересное не нашел, но мне запомнился один момент, это странное подключение светодиода, который используется через BUILTIN_LED
и я его отметил на принципиальной схемы ниже. Кроме как инвертирование сигнала, я не понял зачем он нужен, можно же просто было на землю завести, или нет?

Принципиальная схема из Make Your UNO Kit. Не понял зачем так подключать светодиод

Для сравнения принципиальная схема Arduino UNO R3. Выглядит сложно.
В итоге я сделал также светодиод в своей схеме:

Принципиальная схема Arduino UNO DIY
Если говорить коротко, то моя схема отличается от Make Your UNO Kit тем, что там нет разъема питания, все остальное очень похоже, кроме специфики, например, модуля для подключения к USB. А от разъема питания отказался, потому что его практически никогда не использовал, поэтому подумал, что мне он не нужен.
Размеры платы
Отвечаю на вопрос «Где мне взять размеры платы и плат расширения?»
Но прежде, чем я мог составить эту принципиальную схему, мне нужны были размеры платы. И они очень легко находятся в Make Your UNO Kit, только проблема в том, что они сделаны в Altium Designer, а в открытом доступе конвекторов их в формат например EasyEDA я не нашел. Но самое забавное, что в EasyEDA есть опция импортировать схему из Altium Designer, но нужен ascii формат файлов, а у них был только бинарный. Потом я пробовал импортировать Altium Designer в KiCAD, оно получалось, но как это потом экспортировать в EasyEDA я так и не понял. В общем, ни один способ не работал. В итоге я делать этого не хотел, но “достал” копию Altium Designer, сконвертировал этот бинарный файл в ascii формат, импортировал в EasyEDA и удалил Altium Designer.

Разводка платы Make Your UNO Kit в EasyEDA
На этой плате я подглядел разводку и почти сделал также у себя.

Разводка Arduino UNO DIY
Можете сравнить мою разводку с ихней. Т.к. у меня плата односторонняя, то хорошо укомплектовать компоненты не получилось, у меня вышло в итоге 8 перемычек, они отмечены красным.

Arduino UNO DIY после фрезеровки

Arduino UNO DIY с шелкографией
USB
Отвечаю на вопрос «Что делать с программированием по USB?»
Вы могли заметить в левом углу квадрат отмеченный как U6, так это модуль преобразования USB в UART. Другими словами, через него происходит питание платы и её программирование через среду Arduino IDE. С ним оказалось больше всего не состыковок. Сначала я хотел использовать чип CH340N, т.к. его нашел на Озон и почти тут же купил, но оказалось, что зря, потому что для работы с Arduino UNO нужен сигнал DTR, а в CH340N его нет. Я почитал, говорят, что не для всех плат этот сигнал обязательный, некоторым микроконтроллера могла и подойти CH340N, но мне не подошла. В итоге нужно смотреть то, где есть DTR сигнал. Можете посмотреть на список разных CH340 чипов ниже:

Разные виды CH340
По нему видно, что нам подходят CH340G, CH340C, CH340B, CH340T, CH340K, CH340X. Я выбрал CH340B потому, что в нем есть внутренний генератор. К слову, еще он есть у CH340C, CH340K, другими словами, не у всех.
Вот такая принципиальная схема модуля у меня получилась:

Принципиальная схема CH340B Module

CH340B Module после фрезеровки. Еще нет защитного диода.

CH340B Module с шелкографией
С этим модулем оказалось еще не все законченно, когда я его спаял он не заработал. Я потратил больше двух часов на решение проблемы, а оказалось, что просто ножки плохо спаяны. Потом, когда я решил делать плату расширения питания, то подумал, что надо добавить диод в CH340B Module по питанию (раз питание может быть теперь из двух мест, то нужна получается какая-то защита) и пришлось все перепаивать. А когда перепаивал, то намучился с USB разъемом. Припаял его, проверил мультиметром, все было хорошо, но когда начал тестировать плату, у меня контакты замкнулись и USB кабель повредился. В итоге перепаял еще раз этот разъем и все уже было без проблем. Вот так, захотел поставить защитный диод, а получилось то, что что-то спалил.
Тесты
Вот такая плата у меня получилась:

Собранная Arduino UNO DIY
Еще была особенность при сборке, это разъемы куда вставляются платы расширения или провода. Между ними, можно заметить есть промежутки, так они не стандартные, т.е. нельзя отрезать длинный разъем, например на 20 дырок, а надо делить на два. В итоге я брал один большой, кусачками кромсал его и гравером шлифовал кончики.
Тесты в итоге прошли удачно. Сначала я попробовал MiniCore в Arduino IDE и он завелся без проблем, надо было только прошить через программатор загрузчик в ATmega328, для чего предусмотрен разъем ISP. После того, как загрузчик был зашит, плату можно было прошивать обычным Upload в Arduino IDE. Чем мне нравится микроконтроллер в DIP корпусе так тем, что я заменил его на ATmega8, прошил, и он тоже заработал. Но самое главное, что когда я выбрал Arduino UNO как плату, она также без проблем заработала.
Теперь можем переходить к платам расширения.
Платы расширения
Платы расширения в Arduino называются “шилд” это от английского shield. Интересная технология, которая позволяет расширить функционал основной платы за счет других, например, тех которые могут проигрывать музыку или имеют доступ в интернет или с внешней картой памяти. Просто хочу сказать, что плата расширения может быть достаточно полезными и интересными, но на деле я нашел мало интересных и полезных на маркетплейсах. Точнее я нашел не так много этих плат, может быть у нас они не продаются, но это не важно, этих шилдов в природе очень много, можете посмотреть примеры на сайте со списками, например, Arduino Shield List.
Поэтому мне было интересно сделать такую плату расширения самому. Но для начала давайте рассмотрим те, которые я купил, потому что они мне показались занимательными: LCD Keypad Shield, Multi-Functional Shield, — эти названия были напечатаны на самих платах, т.е. по ним можете их найти в сети.
Готовые платы расширения
Готовые платы расширения, это те, которые я купил. С ними все просто: включаешь и они должны работать. Код тоже очень простой: ищешь в интернете готовую библиотеку и пользуешься. Поэтому я кратко по ним пробегусь. Только хочу сказать, что рассмотреть готовые платы расширения очень важно, чтобы проверить правильно ли у меня получилось развести и собрать плату, т.к. я отказался покупать готовую Arduino UNO, чтобы не соблазняться, но согласился протестировать свою плату на готовых платах расширения. Как только проверю, что они заработали правильно, то значит можно приступать к созданию своих плат расширения.
Multi-Functional Shield
Это плата расширения из сборной солянки. Тут есть кнопочки, пищалка, семисегментный индикатор. Занятная штука. Сначала хотел для неё что-то написать, но потом решил, что лучше воспользуюсь готовым кодом из интернета и пойду дальше по плану. Нашел библиотеку MFShield, взял из неё тестовый пример и запустил его на плате, что вы можете видеть на фотографиях.

Обычное фото платы расширения из сборной солянки

Фото платы расширения из сборной солянки с запущенной программой на Arduino UNO DIY
Нажмите, чтобы посмотреть код примера из MFShield
#include <MFShield.h>
MFShield mfs;
void setup ()
{
Serial.begin (9600);
/* Handle buttons */
mfs.onKeyPress ([](uint8_t button) {
mfs.beep(10); // make sound
mfs.setLed (button, !mfs.getLed(button)); // toggle onboard leds
Serial.println ("Button pressed: " + String(button));
});
}
void loop ()
{
/* Display seconds */
mfs.display (millis() / 1000);
mfs.loop();
/* ^ It's important to insert this loop function in the main loop
* else numeric display wont work
*/
}
LCD Keypad Shield
Эта плата расширения более специализированная с текстовым экраном и кнопочками. В принципе, было достаточно и первой платы расширения, чтобы понять, что все заработало, а размеры с контактами совпали, но у меня уже была эта плата расширения, поэтому можно и ее проверить.

Обычное фото платы расширения с текстовым экраном и кнопочками

Фото платы расширения с текстовым экраном и кнопочками с запущенной программой на Arduino UNO DIY
Нажмите, чтобы посмотреть код базового примера взятого отсюда
#include <Arduino.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#define BTN_UP 1
#define BTN_DOWN 2
#define BTN_LEFT 3
#define BTN_RIGHT 4
#define BTN_SELECT 5
#define BTN_NONE 10
// определяем, какая кнопка нажата (А0)
int detectButton() {
int keyAnalog = analogRead(A0);
if (keyAnalog < 100) {
// Значение меньше 100 – нажата кнопка right
return BTN_RIGHT;
} else if (keyAnalog < 200) {
// Значение больше 100 (иначе мы бы вошли в предыдущий блок результата сравнения, но меньше 200 – нажата кнопка UP
return BTN_UP;
} else if (keyAnalog < 400) {
// Значение больше 200, но меньше 400 – нажата кнопка DOWN
return BTN_DOWN;
} else if (keyAnalog < 600) {
// Значение больше 400, но меньше 600 – нажата кнопка LEFT
return BTN_LEFT;
} else if (keyAnalog < 800) {
// Значение больше 600, но меньше 800 – нажата кнопка SELECT
return BTN_SELECT;
} else {
// Все остальные значения (до 1023) будут означать, что нажатий не было
return BTN_NONE;
}
}
// очищаем вторую строку
void clearLine(int line){
lcd.setCursor(0, 1);
lcd.print(" ");
}
// функция вывода нажатой кнопки на экран и в Монитор порта
void printDisplay(String message){
Serial.println(message);
lcd.setCursor(0, 1);
lcd.print(message);
delay(500);
clearLine(1);
}
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Button");
}
void loop() {
int button = detectButton();
switch (button) {
case BTN_UP:
printDisplay("UP");
break;
case BTN_DOWN:
printDisplay("DOWN");
break;
case BTN_LEFT:
printDisplay("LEFT");
break;
case BTN_RIGHT:
printDisplay("RIGHT");
break;
case BTN_SELECT:
printDisplay("SELECT");
break;
default:
//printDisplay("Press any key");
break;
}
}
Самодельные платы расширения
Теперь, как мне кажется, мы приступаем к самой интересной теме данной статьи — самодельным платам расширения. Они интересны в первую очередь тем, что они являются чем-то уникальным, чего нет в обычной плате, будь это моей самодельной плате (Arduino UNO DIY) или оригинальным платам (правильнее сказать оригинальным клонам, но это не принципиально). Т.е. они по-хорошему должны состоять из логики предметной области, которая в данный момент решается: хотите делать устройство с WiFi — добавляете беспроводную плату расширения и так далее. Второе, чем могут быть интересны платы расширения это тем, что они более универсальны, у кого-то разработчика уже может быть готовая Arduino UNO, но он все же думает о создании своей платы расширения.
Сначала я решил делать одну плату расширения, только для теста, это был ATtiny Shield. Плата расширения для программирования ATtiny85 (и схожих микросхем). Затем я понял, что в моей плате есть один существенный и вопиющий недостаток — не отсутствие разъема питания, а из-за отказа от разъема питания я не заметил как отказался от линии 3.3В, поэтому решил все таки добавить разъем питания и соответственно линию 3.3В. Назвал это Power Shield. А потом я вошел во вкус и решил, что можно сделать ради эксперимента и увеличения сложности самый полезную плату расширения из всех — ESP12F Shield, т.е. плату расширения с WiFi.
ATtiny Shield
Это самая простая плата расширения, которая мне пришла в голову, когда хотел сделать что-то попроще, чтобы понять как все работает. Логика работы очень простая: можно прошивать ATtiny85 с помощью Arduino UNO DIY плюс дополнительная кнопка со светодиодом для тестов.
Это была моя первая плата расширения, поэтому я задавался вопросом как ее лучше сделать. Больше всего меня волновало как крепить разъемы, ведь используется односторонняя плата, поэтому если слой меди находится снизу, то получается сверху не за что крепится. Можно конечно, сделать так, что слой меди находился сверху, тогда можно использовать обычные штырьевые разъемы и припаять на них плату, но это не работает с компонентами для сквозного монтажа, только для поверхностного.
Потом поиском по сети я пытался найти кто как сделал готовые платы расширения и нашел что-то вроде этого:

Пример платы расширения, когда слой меди находится снизу

Пример платы расширения, когда слой меди находится сверху
На картинке с платой расширения, когда слой меди находится снизу, легко видно, что штырьевой разъем надевается сверху и припаивается снизу. Оказывается, простое решение это использовать длинные штырьевые разъемы. Я заказал 15 мм и они подошли ровно-ровно, так что я бы сейчас заказывал бы лучше 17 мм, потому что тогда меньше шансов, что низ платы расширения будет касаться основной платы, а такое может быть!
В итоге у меня получилась вот эта плата:

Первая моя плата расширения

Здесь видно на сколько длинные разъемы по сравнению со стандартными
И она не работала. Не прошивалась. Потому что я просто не увидел как забыл развести линию RESET к контроллеру. Но на самом деле не беда, потому что в какой-то момент, когда искал в сети, то обнаружил, что плату можно уменьшить в двое! Сделать её гораздо меньше, поэтому сразу же начал делать вторую, исправленную плату.
Вот такая в итоге у меня получилась принципиальная схема:

Принципиальная схема ATtiny Tiny Shield
Конечный результат:

ATtiny Tiny Shield

ATtiny Tiny Shield на Arduino UNO DIY
В итоге все очень просто работает. Делаешь из Arduino UNO DIY программатор ISP и прошиваешь ATtiny85, который находится на ATtiny Tiny Shield. Прошивается и светодиод моргает.
Power Shield
С платой расширения питания возникли несколько других сложностей. Первая, в отличие от ATtiny Shield здесь нужен доступ к разъемам у платы снизу, другими словами на плате расширения должны быть тоже штырьевые разъемы-мама. Это, решается просто, в магазинах оказывается уже продаются разъемы предназначенные для плат расширения:

Сквозные разъемы для платы расширения
Вторая проблема это то, что теперь в устройстве, собранного из плат расширения могут быть два и более источника питания. Поэтому я принял волевое решение и добавить диод по питанию в CH340B Module, про что написал в разделе выше. В других местах диоды решил не ставить, потому что иначе напряжение с регуляторов напряжения будет ниже заявленного, а это совсем не то, что нужно. Плюс, это решение я подсмотрел в Make Your UNO Kit, а там нет никаких диодов после регуляторов напряжения.
В итоге у меня получилась эта принципиальная схема:

Принципиальная схема Power Shield
Все бы хорошо, но и эта плата получилась бракованной и проблема была в том, что я поставил не той стороной разъем питания. Т.е. проблема была в разводке. Как только я её собрал и подключил, все у меня заработало. Я даже подключил одновременно USB и питание, ничто не отвалилось и не сгорело.
Со второй попытки у меня получилась эта плата:

Power Shield
В этой плате на самом деле ничего сложного, два регулятора напряжения, один на 5В, другой на 3.3В и диод на вход. Схему подсмотрел в Make Your UNO Kit. Я подумал, раз Make Your UNO Kit подразумевает питание от двух источников и там нет никакой защиты, то не стал её тоже добавлять. Теперь, получается можно сделать бутерброд из Arduino UNO DIY, Power Shield и любой другой платы расширения, которому нужны 3.3В и логика от Arduino UNO DIY. Можно даже обойтись без Arduino UNO DIY.
ESP12F Shield
Теперь наверно самая интересная и полезная плата расширения. Основную идею я подсмотрел у Arduino Wi-Fi Shield using ESP8266. (Правда потом заметил, что перепутал ножки идущие к RX, TX, но т.к. UART используется программный, то оно спокойно разрешилось.) Лишь добавил отдельный регулятор напряжения 3.3В, чтобы можно было не подключать Power Shield. Получившиеся принципиальная схема:

Принципиальная схема ESP12F Shield
Здесь важно залезть в даташит ESP12F и увидеть такую таблицу:

Режимы загрузки ESP12F
По которой видно какие примерно должны быть установленны уровни.
Вот такая плата у меня получилась:

ESP12F Shield сверху

ESP12F Shield снизу
Но есть нюанс, что работать придется по UART с помощью AT команд. Их достаточно много и все я не объясню, но у меня получилось без проблем сделать простые запросы по 80-му порту, т.е. по HTTP, а вот по HTTPS ничего не работало. Я долго думал и для себя решил, что если найти нужную прошивку, то запросы по HTTPS должны заработать. Кстати, вот те две кнопки BOOT и RESET как раз нужны для загрузки новой прошивки: нажимаешь BOOT, затем RESET, держишь BOOT и отпускаешь RESET, затем BOOT — микроконтроллер входит в режим загрузки.
Сначала я попробовал последнюю официальную прошивку, но она не заработала. Я не понял почему, но решил искать дальше. И тут наткнулся на репозиторий esp-at-binaries, там была вот такая сноска:

Сноска об изменениях в прошивке
Оказывается, прошивка не заработала, потому что они изменили пины! Нехорошо как-то это, но что поделать, просто кто будет этим заниматься, имейте в виду. Я поставил прошивку из esp-at-binaries, она заработала, но HTTPS нет. Поэтому я стал искать дальше, потому что даже в последней официальной прошивке, та которая у меня не завелась, было написано в руководстве, что поддержка SSL есть. И я нашел репозиторий ESP_ATMod.
Эта прошивка оказалась проблемной, UART плохо определялся, но HTTPS заработал и данные приходили без ошибок. Поэтому я остановился в своих поисках, но правильно было бы переделать плату расширения и добавить входы на новые ножки, чтобы официальная прошивка заработала.
Нажмите, чтобы посмотреть код примера для ESP12F Shield
#include <SoftwareSerial.h>
#include "credentials.h"
SoftwareSerial ESP(11, 12);
void sendCommand(String command, int timeout) {
ESP.print(command);
ESP.print("\r\n");
long time = millis();
while ((time + timeout) > millis()) {
while (ESP.available()) {
Serial.print((char)ESP.read());
}
}
}
void setup() {
Serial.begin(9600);
Serial.println("Start");
ESP.begin(115200);
ESP.println("AT+UART_CUR=9600,8,1,0,0");
delay(100);
ESP.begin(9600);
delay(100);
sendCommand("AT+CWMODE=1", 1000);
sendCommand("AT+CWJAP=\""+ WIFI_SSID +"\",\""+ WIFI_PASSWORD +"\"", 6000);
sendCommand("AT+CIPMUX=0", 2000);
sendCommand("AT+CIPSTART=\"SSL\",\"m039.ru\",443", 2000);
sendCommand("AT+CIPSEND=64", 2000);
sendCommand("GET /hello-world.txt HTTP/1.1\n"
"Host: m039.ru\n"
"Accept: text/html\n", 7000);
}
void loop() {
}

Лог программы для ESP12F Shield
Выводы после эксплуатации

Вы только сравните. Вывод сам напрашивается
Все это, конечно, замечательно и весело, но давайте поговорим про то, что в итоге получилось.
Arduino UNO DIY это по сути урезанная версия оригинальной платы Arduino UNO, возможно одно существенное преимущество, это наличие USB Type-C разъема, но и такую плату тоже можно найти сейчас в продаже, поэтому спорно. Во всем остальном одни минусы: отсутствие линии 3.3В и разъема питания. Это те выводы, которые можно сделать при беглом осмотре платы, но как по мне есть один существенный минус, который все перекрывает, это нет металлизированных отверстий, из-за чего разъемы для крепления плат расширения могут отвалиться, очень и очень легко. Поэтому один раз будешь долго делать такую плату, а потом она развалится в руках.
А вот с платами расширения никаких проблем и нет, нужна плата расширения под конкретную задачу — делаешь и не важно, кто что подумает, потому что такой до этого момента платы расширения не было. Кроме готовых плат расширения, здесь, конечно, все выводы выше тоже применимы, потому что оно сильно уступает промышленному производству.
Но действительно ли это важно? На самом деле нет, все эти минусы с лихвой окупаются полученным опытом и удовольствием. В крайнем случае, если возникнет желание сделать плату промышленного качества, то можно ее развести заново и заказать, а все основные моменты уже протестированы. При этом, что не мало важно, это скорость прототипирования, сделанные платы вручную не надо ждать две недели или месяцы, она готова в течении дня.
Бонус: Digispark DIY
В моей прошлой статье про программный USB для CH32V003 я упомянул Digispark. Это плата с микроконтроллером ATtiny85, которая может прикидываться USB клавиатурой используя программный USB. Я про неё немного говорил, но на самом деле у меня её нет, она правда стоит не дорого и мне тоже захотелось её у себя иметь, только мне больше хочется её сделать самому, а не покупать. Точнее у меня есть клон Digispark, она ищется как ATtiny85 Development Board, куда можно вставить ATtiny85 в DIP корпусе.

Слева Digispark, справа её клон, ATtiny85 Development Board
Вначале я хотел сделать её такой же маленькой, поэтому решил использовать SMD компоненты, она получилась небольшой, но все равно в несколько раз больше оригинала, поэтому странная затея, возможно имело смысл стараться сделать её как можно меньше. Но если честно, я не хотел этого, просто хотел сделать такую же плату, которая работала с программным USB.
Плата делается очень и очень просто, потому что по первому запросу в сети находятся готовые схемы, которые очень легко читаются. Например, эта:

Схема Digispark из сети
В этой схеме основная особенность, это наличие стабилитронов. Есть еще регулятор напряжения, но как и с Arduino UNO DIY я решил, что мне он не нужен.
Еще возможно кто-нибудь мне объяснит почему диод направлен катодом к USB порту, как на схеме? Разве схема не будет работать или разве таким образом USB порт компьютера будет менее защищен? Возможно его надо поставить в противоположную сторону, но точно не знаю, раз это официальная схема. Я хотел задать вопрос на Stack Overflow, но не успел еще этого сделать.
В итоге у меня получилась вот эта принципиальная схема:

Схема Digispark DIY
На ней можно заметить, что я, как всегда, добавил кнопку и светодиод, даже два, но еще добавил разъем для ISP. Если убрать светодиоды, ISP и кнопку, то наверно можно было сделать очень компактное устройство.

Разводка Digispark DIY. На ней видно 2 красные перемычки

Digispark DIY после фрезеровки

Digispark DIY с шелкографией

Digispark DIY. Для сравнения поставил две платы вместе
Работать с ней оказалось очень просто. Устанавливаем ATTinyCore, а он уже устанавливает все нужные драйверы для работы по USB с этой платой. Через ISP разъем программатором зашиваем загрузчик работающий по USB (плата “ATtiny85 (Micronucleous / DigiSpark)”), затем подключаем плату через USB, нажимаем Upload, вытаскиваем плату и вставляем её обратно, надо успеть за 60 секунд, после чего она по USB прошивается. Возможно надо было добавить кнопку RESET или похожую, чтобы упростить этот процесс, но что-то сразу не догадался.
Нажмите, чтобы посмотреть пример кода для Digispark DIY
#include <EasyHID.h>
void setup() {
HID.begin();
pinMode(1, OUTPUT);
pinMode(0, INPUT_PULLUP);
}
bool buttonState;
void loop() {
bool bs = digitalRead(0) == 1;
if (bs != buttonState) {
buttonState = bs;
if (!bs) {
Keyboard.click(KEY_A);
}
}
HID.tick();
}
Заключение

Все платы в сборе
Не могу сказать, что в этой статье рассказывал что-то принципиально новое, это уже очень давно всем известно. Arduino UNO в том виде, в котором я здесь её рассматривал, существует очень давно, но я не пробовал до этого создавать на основе её платы с нуля, причем в чистом виде отладочный платы тоже (с чипами CH340), поэтому мне было интересно это изучить. Надеюсь что мои приключения вам тоже были интересны.
Если вам интересно то, что я делаю можете зайти в мою группу ВК, не удивляйтесь сильно, т.к. она была большей частью посвещена играм, а теперь электронике, но вести мне её сложно, т.к. нет никакой активности. Но если будет какая-то активность, то мне будет смысл это делать, например, освещать промежуточные процессы разработки.
Все схемы и исходники находятся в проекте avr-playground.