18.02.2010

USB-TTL v.3

На днях разбирался с неким устройством на ATmega128, с целью превращения в Arduino-совместимую платформу.

Но поскольку на нем нет ни COM, ни, тем более, USB-портов, решил использовать свой же собственный USB-TTL конвертер. И все бы хорошо, если бы не пару но:

1. Автосброс - очень удобная вещь, а я не вывел наружу сигнал DTR и тем самым обрек себя на ручной сброс при загрузке каждого нового скетча;

2. Нет резисторов 1К, которые включены последовательно в линии Rx и Tx. Так надежнее, особенно если в скетче есть вероятность манипулирования этими пинами.

Родилась идея создать новую версию переходника с исправлением этих мелких недостатков:



По-прежнему получилось обойтись лишь одной SMD-перемычкой 1206, удлиннив корпус на несколько миллиметров:







Part     Value          Device     Package   

C1       100n           C-EUC0805  C0805    
C2       100n           C-EUC0805  C0805    
C3       100n           C-EUC0805  C0805    
FUSE     500mA          L-EUL1812  L1812    
IC1      FT232RL        FT232RL    SSOP28   
JP1      PWR            JP1E       JP1      
JP2                     PINHD-1X5  1X05     
LED1     TX             LED3MM     LED3MM   
LED2     RX             LED3MM     LED3MM   
R1       330            R-EU_R0805 R0805    
R2       330            R-EU_R0805 R0805    
R3       0              R-EU_M1206 M1206    
R4       1K             R-EU_M0805 M0805    
R5       1K             R-EU_M1206 M1206   
X1       USB            PN61729-S  PN61729-S

Попутно поправил размер контактных площадок - если кто-то уже пробовал изготавливать эту плату, наверняка заклеймил меня нехорошим словом при сверлении отверстий под светодиоды и разъем USB. Хочу принести им свои заочные извинения ;)



Испытания нового экземпляра прошли успешно.

Скачать файл проекта USB-TTL v.3 (лицензия CC-SA).

Внутри вы найдете файлы:
  • со схемой и печатной платой в формате CAD Eagle;
  • для изготовления одной платы по ЛУТ-технологии, в формате EPS;
  • для печати сразу нескольких заготовок на одном листе (для экономии бумаги) - в формате GIMP.
(не хватает gerber274X, разве что ;)

UPD: по поводу "моей любви к огромному USB-разъему"

09.02.2010

Проводник в Seeedстудию

Название: Seeeduino Stalker
Совместимость с ArduinoIDE: да
Совместимость с Shield-платами: да
Домашняя страница проекта: www.seeedstudio.com/depot/seeeduino-stalker-p-600.html?cPath=27
Дата первого упоминания: 22.01.2010

Быть может, появления этого устройства многие ждали. А те, кто не ждали - просто еще не знали, что такое вообще может быть ;)



Итак, Seeedstudio представило нам Seeeduino Stalker. С первого взгляда, это еще одна Arduino-совместимая плата на основе ATmega168 в TQFP-корпусе, но взглянем повнимательнее на начинку:
  • разъем для подключения XBee (тип B" - два ряда по пин с шагом 2 мм);
  • микросхема RTC с батарейкой и кварцем;
  • разъем microSD;
  • I2C-хаб с возможностью питания 3.3/5В;
  • возможность менять роль: Shield-плата или Arduino;
  • пользовательская кнопка и светодиод;
  • гребенки USART, ISP, I2C, кнопка сброса.

Самое примечательное свойство - опциональная возможность работать в виде Shield-платы. Для этого предусмотрено два ряда контактных колодок, и, в зависимости от роли, используются нужные ряды:



(сверху - режим Shield, внизу - режим Arduino).

В режиме Shield общение с основной Arduino-платой идет по интерфейсу I2C, с помощью библиотеки Wire. Таким образом, можно подключить сразу несколько "сталкеров" к Arduino одновременно.

Плата претендует на самую универсальную Arduino-совместимую плату из мне известных. С одной стороны, в формат 5 x 7 см особенно много не поместишь, но с другой - свободное место на Arduino есть, и иногда с сожалением понимаешь, что для счастья не хватает хотя бы небольшой I2C-флешки для хранения данных.

К Stalker-у можно подцепить сеть i2c-датчиков и транслировать их показания через XBee-модуль. А можно установить GPS Bee и записывать на microSD-карту координаты перемещений. В любом случае - простор для фантазии есть, и немаленький.



Стоит это чудо 35 USD, что для такой универсальности не выглядит слишком дорого. Единственный минус - если вы настроены использовать "Сталкера" в качестве ArduinoCompatible-платы, придется обзавестись переходником USB-to-TTL, потому что портов USB и COM на ней, увы, нет.

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

05.02.2010

JTAG на макетке

Микроконтроллеры ATmega можно условно разделить на две категории: те, что программируются только через ISP (шина из проводов MISO, MOSI, SCK + управление сбросом) и те, что имеют в дополнении к этому интерфейс JTAG.

Из набора "горячо любимых" Arduino-контроллеров к первой категории относятся ATmega8, ATmega168, ATmega328P. Но и во второй категории тоже присутствует один экземпляр: ATmega2560, используемый в Arduino/Freeduino MEGA 2560.

JTAG - это механизм, позволяющий автоматически контролировать качество монтажа печатных плат: не закоротилось ли чего или, наоборот, плохо припаялось. Очень полезная вещь в промышленном масштабе, особенно когда на одной плате "счастливо" уживаются микросхемы разных фирм (стандарт IEEE 1149.1, на котором базируется JTAG - открытый). Тем более логично, что многие производители микросхем добавили возможность программирования и отладки своих чипов через все тот же JTAG.

Для чего может потребоваться JTAG в повседневной жизни?

В моем случае - вдруг потребовалось читать и писать содержимое flash ATmega128, а вместо привычной вилочки ISP наружу торчит только JTAG. В этом случае уже простой программатор типа USBasp, увы, не поможет.

Фирменное устройство от ATMEL стоит немало (а я и так уже прикупил нанопаяльник,   денег после этого осталось ноль отрицательное количество):

Что же делать? Я уже говорил, что стандарт - открытый, а процесс программирования через JTAG хорошо документирован - достаточно открыть любой даташит на микроконтроллер ATMEL с JTAG-интерфейсом.

Кстати, когда-то, на заре появления микроконтроллеров фирмы ATMEL, фирма-конкурент Microchip дразнила ATMEL показательно разобрала какой-то инструментальный девайс для разработчика программ микроконтроллеров ATMEL и демонстрировала, что он собран на микроконтроллерах её производства - то бишь, на PIC-ах. Впрочем, было это невероятно давно, мир теперь уже совсем другой (c).

В интернете есть масса вариантов самодельных копий фирменного AVR JTAG ICE. Одну из таких упрощенных до полного безобразия можно найти, например, здесь. Что самое забавное -  работает, хотя состоит практически из одного МК: ATmega16. Оригинальный программатор использует чип, полностью совместимый с ATmega16, что делает возможным заливание в самопальный программатор прошивок от фирменного (правда, новые навряд ли будут появляться, поскольку AVR JTAG ICE дано снят с производства).

Для начала надо достать основной компонент - микроконтроллер ATmega16-16PU и кварц 7.3728 МГц, после чего собрать на макетке минимальную схему для программирования:



Схема - классическая, необходима для запуска ATmega. Напомню, что обычно делают в таком случае:

  • подключают питание -  все GND и VCC (обычно выводов GND не менее двух);
  • ставят между GND и VCC поближе к ножкам ATmega фильтрующий помехи конденсатор 100 нФ (или 0.1 мкФ - кому как больше нравится);
  • подключают между XTAL1 и XTAL2 кварц и соединяют их через два одинаковых конденсатора на землю (разброс номинала указан в документации, не обязательно использовать 22 пФ, можно, например, и 33 пФ);
  • притягивают линию сброса к VCC через резистор 10К и вешают конденсатор 100 нФ на землю, чтобы обеспечить небольшую задержку линии сброса после подачи питания.

Выглядеть это будет приблизительно так (всё благополучно влезает на макетку 300+100):



Соединяем схему через вилку ISP с программатором и запитываем от него же, затем зашиваем прошивку и выставляем фьюз-биты:

avrdude -C avrdude.conf -c usbasp -p m16 -U hfuse:w:0x1f:m -U lfuse:w:0xcf:m

avrdude -C avrdude.conf -c usbasp -p m16 -U flash:w:miniICE.hex

Если операция прошла успешно, полдела сделано. Можно аккуратно удалить ISP-разъем и преобразовать схему к следующему виду:



На макетке это выглядит так:



Наверное, вы обратили внимание, что в схеме я использовал USB-чип последовательного порта - FT232RL. Это гораздо удобнее, чем COM-порт, по многим причинам. Но в макетку SSOP не воткнешь, поэтому я использую самостоятельно изготовленный переходник USB-TTL:



В классическом варианте линий JTAG чуть больше, чем на схеме:



Обязательные сигналы - TCK, TDO, TDI и TMS (тактовая, выход данных, вход данных и управление режимом теста).

NSRST и NTRST - это управление сбросом на шине JTAG. В нашем случае не обязательны, поскольку сброс МК можно инициировать командной последовательностью на линиях обязательных сигналов.

Теперь разберемся с питанием. Желательно, чтобы внутрисхемный программатор питался от программируемой схемы. Этим сразу решается проблема стыковки уровней программируемой схемы и программатора. С другой стороны, если в программаторе есть конвертер уровней сигналов, различие VCC программатора и target уже не является проблемой (не считая усложнение схемы программатора).

С обязательной линии VTref должно подаваться напряжение питания устройства. По идее, он нужен вышеуказанному чипу конвертера уровней, внутри программатора. Но если JTAG ICE планирует питаться от target-а, то используется линия Vsupply. Для простоты, их можно объединить, но это не обязательно.

В зависимости от положения джампера SV2 на схеме ATmega16 будет питаться либо от USB, либо от target-а. Я на макетку ставить переключающий джампер поленился, ибо предполагалось питание только от target. Зато перед включением три раза проверил, что питание с USB не подается. Для надежности, на плате USB-TTL разомкнул джампер подачи питания. Далее контакт M8RX соединяется с ножкой МК RX, M8TX - с TX.

Подключаемся к программатору через AVR Studio, и если все правильно соединено, то можно будет прочитать сигнатуру и прошивку.



(устройство справа я обязательно рассмотрю позже, пока что могу только повторить, что внутри у него ATmega128)

Единственный минус клона AVR JTAG ICE - сравнительно небольшой список поддерживаемых МК:

  • ATmega128
  • ATmega128A
  • ATmega16
  • ATmega162
  • ATmega165
  • ATmega169
  • ATmega16A
  • ATmega32
  • ATmega323
  • ATmega32A
  • ATmega64
  • ATmega64A
Еще, говорят, поддерживается AT90CAN128, но проверить это нет возможности :(

31.01.2010

ArduinoIDE 0018

В пятницу, 29.01.2010 вышел очередной релиз ArduinoIDE 0018. На этот раз, хоть и после длительного перерыва, но никаких грандиозных нововведений. Сплошные грандиозные багфиксы. Традиционно, подтянулись к Processing 1.0.9.

Начнем с куска, который присутствует всегда - с библиотеки-ядра (Arduino core).

1. Теперь последовательный порт умеет выключаться. В самом деле - а вдруг оно больше не пригодится? Поэтому, появилась Serial.end():

void HardwareSerial::end()
{
  cbi(*_ucsrb, _rxen);
  cbi(*_ucsrb, _txen);
  cbi(*_ucsrb, _rxcie);
}

cbi - это аналог avr-gcc-шного макроса сброса бита в управляющем регистре МК. После вызова Serial.end() уже ничто не вызовет передачу или прием данных по последовательному порту.

2. Внутри delayMicroseconds() прерывания больше не запрещаются, перед циклом задержки убран cli(). В принципе, это идеологически верно: ведь в delay() же они тоже не запрещаются. Кстати, это дало возможность нормально работать функции millis(). Также, слегка поправили micros(), чтобы она возвращала корректные данные и внутри прерывания тоже.

3. Теперь можно включить и выключить генерацию акустического тона:

void tone(uint8_t _pin, unsigned int frequency, unsigned long duration);
void noTone(uint8_t _pin);

Под генерацию тона можно использовать какой-либо один пин, зато звук у нас будет аппаратный (фоновый) - соответствующим способом будет запрограммирован свободный таймер и активирован его обработчик прерывания. У MEGA свободных таймеров больше, но пока она также ограничена одним доступным - может быть, это когда-нибудь изменят.

4. В MEGA можно использовать аналоговые пины 8-15. А всего-то надо было заменить в строчке

ADMUX = (analog_reference << 6) | (pin & 0x07); 

..0x07 на 0x0f.

Но, как говорится - все ошибаются, и это нормально.

5. Наконец-то можно выводить вещественные числа с заданной точностью:
void print(double, int = 2);    
void println(double, int = 2);

На существующий код это влияния не окажет, потому что новый параметр (число цифр после точки) объявлен по умолчанию двум. И ведь самое обидное, что это уже  умеет Print::printFloat(double number, uint8_t digits), она остается прежней. Положительный момент - излишество не займет много места в памяти программ.

Небольшие изменения в самой IDE:

  • нажатие Shift во время Upload или Verify/Compile делает вывод ошибок более информативным;
  • чествование Serial Monitor продолжается: теперь у него не только отдельное окно, но и собственная горячая клавиша;
  • сделан очередной шаг по защите базовых каталогов. Теперь можно унести все модификации файлов hardware/arduino в SKETCHBOOK/hardware и больше не перетаскивать их при обновлении ArduinoIDE. Обычно, первым страдает boards.txt.  Но в теперь SKETCHBOOK/hardware/figuino/boards.txt будет благополучно объединена с arduino-0018/hardware/arduino/boards.txt. В целом, это позитивный шаг, облегчающий жизнь Arduino-совместимых плат, например того же Sanguino.

Ну и прочее - багофиксы в Firmata и LiquidCrystal, небольшие улучшения в версии для MacOS.

Как всегда - качайте ArduinoIDE по адресу http://arduino.cc/en/Main/Software и помните: это абсолютно бесплатное программное обеспечение! Но раз уж скачали бесплатно - обязательно что-то сделайте и поделитесь с другими: так вы внесете свой посильный вклад в этот знаменитый проект!

28.01.2010

Сторожевая Собака

Недавно в руки мои попало вот такое чудо:


Позвольте представить: разработка ООО "ЛисКо", сторожевой таймер для платежного терминала LDog.


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

Платежный терминал, как и любой компьютер, может "зависать", доставляя финансовые неприятности хозяину. Основная задача LDog - уметь сбрасывать компьютер по команде или по истечению интервала отклика основной программы. Также, платежный терминал часто имеет выход в сеть через GPRS-модем, который тоже может зависнуть: LDog умеет и его перегружать, ненадолго разрывая цепь питания. Наконец, он оснащен двумя датчиками вскрытия, которые реагируют на разрыв цепи. Конечно, программное обеспечение, работающее на "большом брате" умеет много другого, типа отслеживания баланса на счету контракта GPRS-модема но это уже не особенно интересно.


Плавно подвожу к главному. Внутри LDog притаилась... классическая начинка Arduino! ATmega8-16AU тактируется от кварца 8МГц, а его порт USART подключен к COM-порту через драйвер RS232 от Analog Devices AD232 (тоже самое, что и популярная микросхема MAX232). Есть и гребенка ISP, только классическая 10-ти контактная.

Теперь немного об отличиях. Разумеется, все пины наружу не выведены. Мы ограничены двумя входами, двумя выходами и еще тремя линиями из разъема ISP (MOSI, MISO, SCK). Но зато выходы имеют оптронные развязки, а на одной из них висит MOSFET - специальный полевой транзистор, пропускающий через себя линию питания модема - 12 Вольт. Кстати, питание подается на плату через разъем питания IDE HDD, но есть и место для L7805, в качестве альтернативы.


Лучше один раз увидеть, чем 0x100 раз услышать. Именно поэтому я  нарисовал принципиальную схему:


(кликабельно). Может пригодиться тем, кто занимается постгарантийным ремонтом изделия собственными силами, но учтите: я мог запросто ошибиться. Если найдете ляп - умоляю, черкните комментарий.

Кстати, немного мелких придироккритики. Проводок к сбросу, подпаянный к плате - не самое лучшее решение, у меня он довольно быстро оторвался (правда, я долго вертел ее в руках, пока рисовал схему). Электролит C2 запаян наоборот, несмотря даже на нанесенный на шелкографию значок плюса и квадратную контактную площадку.





А как насчет попрбовать использовать LDog с ArduinoIDE?

Для начала отредактируем файл boards.txt и добавим секцию LDog, созданную на основе Arduino NG or older w/ Atmega8. Меняем тактовую частоту и скорость, на которой bootloader принимает скетч. Измените 16000000L на 8000000L, а 19200 на 9600 или скачайте готовый файл. Не забудьте перезапустить ArduinoIDE, чтобы изменения вступили в силу.

Если содержимое памяти ATmega8 надо сохранить, самое время сделать это (вариант для программатора usbasp):

avrdude -C avrdude.conf -c usbasp -p m8 -U flash:r:ldog.hex:i



Для справки, значения fuses: LFUSE=0xff, HFUSE=0xd9.

Вот теперь можно смело зашивать bootloader через ArduinoIDE. После успешного завершения этой операции мы получили ArduinoCompatible-плату, и можем загружать в нее скетчи.

Итак, с точки зрения Arduino, у нас есть:
  • 3 универсальных цифровых пина: digital 11,12,13;
  • выход digital8 со светодиодом. Обратите внимание, что он притянут к VCC -  "зажигайте" его по команде digitalWrite(8, LOW). Одно непринужденное движение паяльника и мы лишеамся светодиода, но получаем еще один универсальный пин
  • 2 входа: digital2 и digital3;
  • выход digital14 с оптронной развязкой;
  • выход digital15 c оптронной развязкой и хексфетом.
Для проверки загрузите пример Digital|Blink и исправьте в самом начале значение ledPin c 13 на 8. Через 10 секунд после загрузки светодиод  должен начать мигать.

И поскольку некоторое количество пинов утратило свою универсальность, можно заготовить скетч-шаблон для LDog:

void setup() {
  pinMode(14, OUTPUT);
  pinMode(15, OUTPUT);
}

Подведем краткие итоги: устройство создано в России, в 2006 году, является закрытой коммерческой разработкой. Приобрести его можно и по сей день, за 1000 рублей (правда, сразу партией в 10 штук). Совместимость с Arduino кажется забавным и одновременно практичным фактом, позволяющим превратить LDog в то устройство, которое подскажет ваша фантазия (в пределах 8К flash, разумеется ;)

В статье использованы материалы сайтов liscom.ru, watchdogs.ru и фото из статьи журнала "Новости Электроники".