24.11.2013

ARCAdaptor или Игра в Продукт

Сегодня будет не совсем обычная статья - уважаемый znoxx поделится опытом о том, как проделать путь от макета железки до полноценного коммерческого продукта. Быть может, он найдет единомышленников, или, что будет еще круче, вдохновит кого-то по его примеру поделиться с общественностью своей разработкой. Приятного чтения! -- ведущий блога MK90 - id. 



Наверное, каждый, кто увлекается разработкой различных железок на микроконтроллерах, задавался подобными вопросами:
  • А что дальше? 
  • Как сделать из прототипа законченный продукт?
  • Смогут ли им пользоваться другие люди?
  • Зачем мне вообще всё это?

Будем считать, что вы уже вышли из стадии "because we can" ("потому что можем")  и вам хочется немного большего. В этой статье я хочу рассказать о проекте ARCAdaptor и поделиться опытом выпуска "почти-продукта". Что это такое и почему продукт все-таки "почти" — читайте ниже. 

И да, здесь будут схемы, прошивки, микроконтроллеры и даже платы. И ещё некоторое количество материала, который, Вы, возможно найдете полезным или хотя бы занимательным. Итак, приступим.

Устройство

Сейчас уже тяжело вспомнить, с чего все началось. Но будем считать, что очень хотелось сделать адаптер для подключения панели MAME — Multy Machine Arcade Emulator. В один из праздничных "зимних" дней я наткнулся проект V-USB MAME Panel. Возможность использования ATmega8 в качестве "сердца" устройства грело душу. 

И вот, нулевой прототип:



Breadboard, кусок USB-провода, в общем, всё как всегда.

Как многие могли догадаться, проект базируется на библиотеке V-USB — программной реализации протокола USB для микроконтроллеров AVR. Набор поддерживаемых микросхем очень широкий, есть даже микроконтроллеры семейства ATtiny.

Для реализации устройства достаточно собрать простую цепь из двух стабилитронов, трех резисторов, ну и конечно правильно запрограммированного МК. При этом возможности по "тонкой настройке" контроллера тоже имеются в наличии. Библиотека использует хорошо оптимизированный ассемблерный код, последние реализации очень стабильны.

При подключении к компьютеру Windows бодро рапортует о том, что у нас аж 2 джойстика и одна клавиатура. Замыкаем провода и видим, что всё отзывается, как надо.

Что дальше ?  Чего, так сказать, не хватает ?

Для этого рассмотрим принцип действия чуть подробнее:
  • К пинам ATmega8 подключены размыкаемые контакты - наши "кнопки" и "джойстики" (на самом деле - обычные 4-х контактные манипуляторы, хорошо знакомые всем по ZX-Spectrum, Atari и прочим MSX);
  • Контроллер считывает состояние пинов и формирует пакет для USB, который симулирует нажатие клавиатуры и/или джойстика;
  • Компьютер-хост (планшет, телефон или Raspberry Pi :-)) честно считает это сооружение клавиатурой-джойстиком-HID-устройством и реагирует соответственно.
Однако, чтобы поменять назначение кнопок ("маппинг"), требуется правка исходных текстов, перекомпиляция прошивки и перепрограммирование микроконтроллера.

С другой стороны, ATmega8 имеет специальную энергонезависимую область данных EEPROM, которая может быть прочитана и записана независимо от основной программы. Почему бы нам не использовать ее ? Всего-то требуется  — жалких 17 байт или около того.

Решительно меняем алгоритм работы! Было так:
  1. В RAM формируется табличка в виде массива, куда прописаны коды клавиш и управляющие последовательности джойстика; 
  2. Каждая ячейка соответствует либо кнопке, либо позиции джойстика (или кнопки).
Заменяем на такое:
  1. Копия массива хранится в EEPROM;
  2. Последовательность копируется в RAM при инициализации устройства;
  3. Заставим компилятор генерировать отдельный .eep-файл с содержимым EEPROM для загрузки в устройство.
Чтобы сделать совсем хорошо — ещё и разнесем код, формирующий и обрабатывающий содержимое EEPROM в отдельные файлы, дабы было удобно править.

Пробуем, учим теорию, опять пробуем… Наконец-то видим желаемый результат.

Маленькая победа. Функциональность значительно расширилась. Воодушевленные результатом движемся дальше. Пора освободить bredboard для других амбициозных целей, да и место на столе не резиновое. 

Прототип 1

Про ЛУТ написано много статей, хороших, подробных и разных. Останавливаться на этом не буду, отмечу лишь, что травилось всё в "экологически безопасном" растворе, на основе перекиси водорода, лимонной кислоты и соли. Причем перекись была в таблетках. Подробнее можно посмотреть тут, правда речь о другой плате, ну суть от этого не меняется.

Итак, вот что на выходе:




Плата разводилась в черновом варианте, лишь бы влезло на один слой. Коннекторы с другой стороны, кварц там же. Кстати, для разводки лично я использую FreeRouting. Писан на java, работает с Eagle через скрипт-костыль, но работает. И результаты лучше, чем в Eagle, на мой неискушенный взгляд.

Итак, наш прототип уже не развалится при переносе со стола на стол. Однако на плате есть разъем USB, а для обновления EEPROM по-прежнему требуется программатор. Вот ведь незадача.

Bootloader

Bootloader - это микропрограмма, работающая в строго отведенной области и защищенная от перезаписи. В нашем случае она позволит загружать содержимое Flash и EEPROM без выделенного программатора, прямо как в Arduino.

К сожалению, наличие бутлоадера сокращает доступный размер памяти для основной программы, и в ATmega8 остается 8192-2048 = 6144 байт. Но поверьте, 6 Килобайт — вполне достаточная емкость для написания огромного числа программ. Например, наш проект занимает значительно меньше 

Из всех готовых бутлоадеров мне приглянулся тот, который позволял записывать EEPROM отдельно - им оказался USBAspLoader. После входа в бутлоадер (в исходном тексте настраивается условие - определенный пин замкнут на землю), программа avrdude "понимает" его, как программатор usbasp и ключи для записи EERPOM в командной строке прекрасно работают.

Мало того, мы получили возможность обновлять не только конфигурацию в EEPROM, но  и саму прошивку. 

Можно даже сказать, что мы получили Arduino-совместимую плату, по примеру проекта Metaboard. Правда, пара пинов недоступна (на них работает USB), а один из пинов нужно использовать с осторожностью, ибо он работает как триггер для бутлоадера (просто об этом нужно помнить).

Знаю, что можно было бы клонировать Metaboard, но хотелось осилить "свой путь", не замыкаться на Arduino, как конечном изделии. У нас будет своя плата - "с шахматами и поэтессами".

Схема и прошивка


(кликабельно для увеличения)

Основные отличия от оригинального проекта V-USB MamePanel:
  • схема работает от +5В — убран преобразователь в +3.3В;
  • в связи с этим установлено 2 стабилитрона на D+ и  D- согласно рекомендациям/требованием авторов V-USB;
  • резистор-подтяжка для D- заменен на 1.5 кОм, опять-таки согласно референсной схеме V-USB. Кстати, резистор-подтяжка нужен для определения устройства, как low speed usb device. Если повесить на D+ — Windows, в частности, может пожаловаться, что это устройство "может работать быстрее", но стабильности это не добавляет.
  • разъем X3 имеет 8 контактов. Во-первых оттуда можно брать или подавать питание, во-вторых туда вынесены служебные контакты;
  • наименование контактов осталось прежним и соответствует "дефолтному" маппингу кнопок.
Архив с исходным кодом содержит как бутлоадер, так и непосредственно дефолтную прошивку. Почему она "дефолтная", а также значения lock и fuse битов можно посмотреть в "Руководстве по эксплуатации ARCAdaptor".

Схема в формате EagleCAD входит в состав документации на ARCAdaptor (ссылка в конце страницы проекта). Плату придется развести самому или изготовить на макетке. Если нет возможности заниматься травлением, готовую плату, набор для сборки или пустую плату можно купить здесь.

Подведем промежуточный итог: мы получили устройство, которое совмещает в себе следующие возможности:
  • Адаптер для создания "кастомных" клавиатур и джойстиков для компьютера;
  • Отладочная плата на ATmega8;
  • Arduino-совместимая плата;
  • Радиоконструктор :-)
Что же, будем считать, что с прототипом мы закончили. Ничто не мешает собрать такое устройство самому в домашних условиях — хоть на макетной плате. Однако, чтобы довести ее до продукта, надо пройти еще несколько шагов ;-) 

Путь к Продукту

Что нам мешает поделиться работающей "железкой" с единомышленниками?
  1. Не все умеют/желают копаться в исходных текстах. Перекомпиляция проекта — несложный процесс, но все равно требует определенных навыков;
  2. Далеко не все имеют возможность вытравить плату дома. И пусть этот процесс описан в тысячах источников, повторяю, такая возможность есть не у всех.
  3. Человек хочет получить готовый к употреблению продукт, а не нечто из мира Open Hardware, требующее доработки напильником и сборки по кусочкам.
Какие есть пути решения?

  1. Изначально ARCAdaptor позиционируется, как устройство, позволяющее подключить самодельный джойстик или клавиатуру к компьютеру - обычному ПК или планшету с USB портом.  Возможность конфигурировать прошивки есть - можете назначать контакты на конкретные действия — кнопка X будет вызывать нажатие "пробела", а кнопка Y будет, например, изображать движение джойстика "вверх". Однако надо составить правильный образ EEPROM, и для этого мы создадим удобный и наглядный редактор, разместив его прямо на сайте, чтобы пользователь мог самостоятельно составить и скачать образ, не покидая любимого браузера;
  2. Сделаем симпатичные платы на заводе;
  3. Документация решает всё. Распишем доступным русским языком и опубликуем на веб-сайте.

Онлайн-редактор

Появление HTML5 и продвинутых средств разработки, таких как jquery привело к тому, что наша жизнь потихоньку переползает в онлайн. Смартфоны сразу загружают фотки в "облако" — ни тебе проводов, подключений и поиска по устройству. Эта статья пишется в Google Docs.

Так почему бы нам не сделать редактор конфигурации прямо в браузере? От него потребуется:
  • Назначать клавиши, а также  кнопки и контакты джойстика на конкретные контакты ARCAdaptor;
  • Сохранять свое состояние;
  • Выдавать пользователю образ EEPROM прямо в .hex файле, который готов к употреблению — заливке в устройство.



Рабочая область редактора состоит из схематичного шаблонного изображения клавиатуры, двух джойстиков и набора контактов ARCAdaptor (X1, X2 X3).

Взаимодействие протекает предельно просто: цепляете кнопку с экранной клавиатуры или джойстика и тащите на желаемый контакт, который принимает новое значение и подсвечивается. Как только всё переназначено, можно кликнуть по ссылке Get EEPROM Image, чтобы скачать файл конфигурации.

Интересно, что механизм Drag'n'Drop в HTML5 был полностью перенесен из модели, используемой в Internet Explorer. Но, по иронии судьбы — Internet Explorer как раз и не работает с редактором. Ну или редактор с IE, как кому удобнее думать :-).

При нажатии на ссылку "Get EERPOM Image" назначение контактов отсылается на сервер, который в ответ формирует .hex файл. К сожалению, все тонкости реализации, слова "json" и "ajax" лежат совсем за рамками данной статьи. Но если у кому-то интересно — в конце есть способы связи со мной. Попробовать редактор в деле можно незамедлительно.

Заводские платы

Так уж вышло, что я по образованию больше программист, чем разработчик железа. Хотя в жизни удалось поучаствовать во многих проектах, но вот как схема превращается в плату — узнал не так давно. То, что я "ваяю" в Eagle, далеко от совершенства: оно одностороннее, не имеет эстетической ценности и, наконец, делается для себя. Тут нужна была консультация специалиста.

Опытным путем выяснилось, что китайские изготовители делают относительно дешево, но на "вход" принимают в основном Gerber-файлы. Их генерация из Eagle предусмотрена, но я, честно говоря, страшился этого шага, так как не знаю, как и что должно там быть. А чувствовать себя неподготовленным студентом в общении с изготовителем не очень хотелось.
Короче, схема была отдана сведущему коллеге, который развел ее в PCAD за пару часов. Была заказана опытная партия, найдена ошибка (не моя :-)), исправлена, и вот заветная партия в руках.



Изготовитель  — отечественный, поэтому не пришлось ждать милости у почты РФ. Из плюсов — принимают документацию в формате этого самого PCAD. 

Часто спрашивают: сколько это стоит. Первоначальный заказ обошелся в сумму около 80 долларов США. Когда фотошаблон готов — стоимость изготовления ниже стоимости доставки. А сколько времени и нервов экономится при "неиспользовании" утюга — и не сосчитаешь.

Документация

При написании документации важно понимать три момента: для кого, как и сколько.

Для кого:

Помните, что вы пишите для людей, поэтому пишите так, чтобы мог понять ваш близкий друг, далекий от электроники. Совсем опускаться до людей с "гуманитарным складом ума" не стоит, но и заумствовать/нагонять тоску противопоказано. Помните, ваша задача — сделать так, чтобы человек дочитал до конца. Желательно по доброй воле, а не от безысходности.

Как:

Вдумчиво. Представьте, что вы открыли коробку со сложным прибором. И не получится им воспользоваться без прочтения фолианта, именуемого "руководство по эксплуатации". Всегда помните о Вашем пользователе. Расшифровывайте термины, сделайте оглавление, сохраняйте логику повествования. Вначале базовые вещи, потом уровень advanced. 

Обязательно найдите "жертву" — пусть это будет Ваш товарищ, друг, коллега, которому интересно то, что вы делаете. Дайте ему на "вычитку" документ. Если хотите максимально использовать "эффект первого прочтения" — пользуйтесь онлайн средствами для совместной работы. Google Docs позволяет оставлять комментарии, не требуют гонять версии по почте или на "флешке".

Используйте стили. Не "жЫрный текст в заголовке", а стиль. Когда вы будете выгружать это на свой веб-сайт или текстовый процессор, они сохранятся и сослужат хорошую службу, ну и оглавление родится почти само.

Не стесняйтесь использовать ссылки — например "подробнее о том, что такое ATmega8 можно почитать тут или тут". 

На самом деле, эффект "первого прочтения" очень важен. Вам сообщат о массе недочетов. Постарайтесь использовать это преимущество. К сожалению, повторить этот эффект можно не раньше, чем через 3 месяца — это свойство человеческой памяти и восприятия.

Сколько:

Столько, сколько нужно. Ориентир один — все связанные с продуктом, устройством или "сервисом" вопросы должны решаться с помощью документации. Вы сэкономите свое время и время Ваших пользователей.

Из личного опыта —  мне задавали совершенно разные вопросы по проекту. На 95% из них я отвечал, просто отсылая к нужному разделу документации.

Вообще, стоит почитать руководства по использованию сложных бытовых приборов "старого образца" из времен СССР. Во многих случаях это отличный пример инженерного мышления.
И напоследок — помните, что в русском языке букву "Ё" никто не отменял. А также, "-" — это "минус", а "—" — это тире. И это хорошие привычки. 

Продвижение

Вебсайт, онлайновый магазин, you name it… Здесь потребуются навыки и дизайнера, и SEO, и разработчика, но не электроники, а www. Говорить об этом можно бесконечно, и для этого есть более другие ресурсы. Главное здесь —  не умножать сущности без необходимости. Помните о том, что Ваше время есть главная ценность. Не стоит его тратить на то, что не принесёт никакого эффекта.

Стоит завести wiki, наполнять faq, узнавать впечатления от использования. Вобщем, поддержать Вашего клиента информационно. Что НЕ стоит делать — Вы поймете сами. Например, участвовать в перепалках на форумах, если речь идет о Вашем продукте. Хейтеры и тролли будут всегда, особенно если продукт хоть чего-то стоит.

Ну и название. ARCAdaptor. Arcade Adaptor. А домен  —  adapto.rs. Вдруг будут ещё какие-нибудь адаптОры :-)

Оргвыводы и планы

Итак, ARCAdaptor оформился от "просто платы" до практически готового продукта. Это был долгий путь. В какой-то момент хотелось бросить всё, а когда-то сидеть всю ночь и думать над очередной формулировкой.

Вот некоторые выводы, которые я лично сделал в процессе работы:

  • Создание конечного продукта — трудный и довольно ресурсоёмкий процесс;
  • "Железо" и "Софт" — это всего лишь 20% от усилий. Остальные 80% — это документация;
  • Для себя вы делаете прототип. Продукт вы делаете для людей;
  • Найдите хотя бы одного из Ваших знакомых, которому интересно то же, что и Вам. Взгляд со стороны — бесценен;
  • Сделайте людям удобно. Это самое главное. По крайней мере, сейчас.
В ближайших планах —  перевод всего, чего можно на GitHub. Это просто нужно сделать :-). 

Далее, сделать поддержку V-USB из среды Arduino (ну не всё же лампочками моргать), тем более это уже частично реализовано с помощью проекта ArduinoUSB. Есть библиотека,  позволяющая полноценно работать из Arduino IDE с устройствами libusb, а также включает в себя пример реализации USB-клавиатуры, как HID устройства.  Сайт проекта не обновлялся довольно давно, но библиотека вполне работающая, хоть и требует некоторого "вмешательства".

Задача - сделать так, чтобы библиотека работала в актуальных версиях Arduino IDE, не требовала усилий по установке (сейчас документация говорит о том, что часть проекта нужно предварительно скомпилировать в объектные файлы - согласитесь, задача не совсем тривиальная, тем более для совсем юных падаванов), ну и конечно же, работала c ARCAdaptor.

Что сделано для этого проекта сейчас:

  • Немного подправлен код;
  • Произведено обновление до последней версии V-USB;
  • Установка может быть выполнена без специальных средств - как для обычной библиотеки (хотя это заслуга нового Arduino IDE, если честно - сборка работает более гуманно);
  • Работают все тестовые примеры (проверялось на  Mac/Linux).
Что будет сделано (когда будет свободная минута):
  • Будет написано краткое руководство по установке;
  • Примеры на Python будут хотя бы задокументированы;
  • Всё это будет опубликовано.
Ну и, конечно, нужно продолжать наполнять базу существующих проектов.

Ниже по ссылкам отзывы пользователей (точнее одного, который был достаточно смел, чтобы рассказать о своем опыте :-) :

Связь

По всем вопросам по поводу проекта ARCAdaptor можно писать в почту contact@adapto.rs
Совсем персональный сайт: http://znoxx.me.
Связаться по другим вопросам можно по почте me@znoxx.me.

Спасибо, что дочитали до конца!

3 комментария:

  1. Выложились на GitHub
    http://adapto.rs/arc/site/news/?post=arcadaptor-github

    ОтветитьУдалить
  2. Наверное где то не дочитал - А чем пользователь будет заливает HEX файл в чип? Какую программу рекомендуете?

    ОтветитьУдалить
    Ответы
    1. В документации... AVRDude. http://adapto.rs/arc/doc/#h.shyoelnrpruo
      Я там даже отдельную сборку выложил с работающими точно дровами даже под Win8

      Удалить