26.11.2008

Arduino своими руками

Часть I.

Как быть, если надо поэкспериментировать с Arduino, но покупать (по каким-то неуважительным причинам) совершенно не охота? Если вы умеете держать в руках паяльник, не составит большого труда соорудить его самостоятельно. Продвинутые пользователи, имеющие опыт травления печатных плат, могут воспользоваться Severino. Но для начала вполне можно ограничиться "макеткой".

"Сердце" всех плат Arduino - это микроконтроллер ATmega (точнее, ATmega8, ATmega168 или ATmega328P), который требует прошивки, поэтому для начала надо обзавестись программатором. Готовый программатор стоит недорого, но ведь его еще надо заказать и дождаться! Давайте соорудим простейший - на LPT-порту:


Девайс предназначен для программирования контроллера прямо в родной схеме (т.н. In Circuit Serial Programming или ICSP ) - надо организовать на плате гребенку 2x3 контакта, подключить к ней этот программатор и один раз зашить bootloader - специальную короткую программу инициализации, которая принимает по последовательному порту микропрограмму (sketch), прошивает ее в свободную память ATmega, а затем запускает.

Стоимость деталей:
  • разъем DB25 - 10 руб.
  • корпус разъема - 10 руб.
  • три резистора - 1 х 3 = 3 руб.
  • три колодки PBS02 - 2 х 3 = 6 руб.
  • проводки - ну добавьте еще 10 руб.
Итого, 39 рублей. Наверное, вы спросите: где подвох? Не скрою, не без него: на вашей машине должен быть LPT-порт.

Процесс сборки программатора подробно описан в статье на сайте Arduino. Вот что получилось у меня:



Отдельного внимания заслуживает история одинокого желтого проводка.

Как видно из первого рисунка, на оригинальной схеме pin2 разъема ICSP "висит в воздухе". На самом деле, там должно быть Vcc +5В, которое отсутствует в LPT-порту в виде отдельной питающей шины. Авторы предлагают запитать программируемую схему отдельно (я взял +5В с разъема USB того же компьютера, к которому были подключен LPT).

В таком варианте схема работать отказалась, из порта программирования систематически читались 0xff. Когда я снял питание, то с удивлением обнаружил, что контроллер все равно умудрялся что-то высасывать из активных пинов LPT-разъема и - о чудо! - даже начал проявлять признаки жизни: пытался осмысленно отвечать на Power-up sequence. Однако, дальше дело не шло: avrdude удивленно сообщал о том, что обнаруженный процессор имеет нестандартную сигнатуру - 0, 1, 2.

Это натолкнуло меня на мысль покопаться в конфигурационном файле avrdude.conf и внимательно изучить секцию, посвященную моему дешевому программатору:

programmer
id = "dapa";
desc = "Direct AVR Parallel Access cable";
type = par;
vcc = 3;
reset = 16;
sck = 1;
mosi = 2;
miso = 11;


Все элементарно: слева - название сигнала, справа - номер контакта на LPT. Таким образом, предполагается, что программатор использует третий контакт для подачи питающего напряжения Vcc.

Так и появился желтый проводок. Как только я соединил им шину +5В микроконтроллера и DB25 pin3, bootloader для ATMEGA8 прошился на "ура".

Признаюсь, было несколько стремно (перед включением я мысленно помолился за здоровье своего LPT-порта), но, видимо потребность в питании одного-единственного МК в данном случае вполне допустима.

(продолжение следует, Часть II)

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

  1. Во-первых, спасибо зв статью.
    Собрал свой Arduino с ATmega168. Прошивал LPT-программатором. Как и написано на сайте (http://www.arduino.cc/en/Hacking/Bootloader): "The board must be powered by an external power supply or the USB port. ". Видимо, питания от USB-порта не хватало. Я подключил батарейку на 9 вольт к штатной системе питания и всё прошилось отлично (и через avrdude и через ArduinoIDE, которая сама умеет прошивать через параллельный порт).
    P.S. Сомневаюсь, что это могло повлиять, но в схеме аналоговорго напряжения я использовал катушку, а не конденсатор, как того требовала схема.

    ОтветитьУдалить
  2. BTW ArduinoIDE шьет через параллельный порт именно через avrdude ;)

    Жизнеспособность программатора сильно зависит от того, насколько согласован уровень сигналов программирования SPI. Самое правильное, это когда внутрисхемный программатор питается от программируемой схемы. Конечно, если схема несложная и малопотребляющая, можно и наоборот - питать ее от программатора :) Можно наваять специальную согласующую схему на компараторах (не припомню точно, но где-то я такую точно видал).

    Я себе собрал USBasp и, если честно, закинул лаптоп с LPT-портом в кладовку - он теперь не нужен :)

    ОтветитьУдалить