Показаны сообщения с ярлыком Шилд-платы. Показать все сообщения
Показаны сообщения с ярлыком Шилд-платы. Показать все сообщения

07.06.2013

TV-out для Arduino

Если вы когда-нибудь почувствуете, что вашему Arduino-проекту стало тесно на алфавитно-цифровом дисплее 1602, обязательно обратите внимание на проект TellyMate Shield. Он позволяет выводить ту же алфавитно-цифровую информацию на обычный телевизор, через видео-вход.

При определенном везении можно заполучить весьма внушительных размеров дисплей (если телевизор имеет прилично дюймов в диагонали), работающий в режиме телетайпа  38 x 25 знакомест. Впрочем, бросив первый взгляд на схему, ловишь себя на мысли о розыгрыше. В самом деле:


Обычный ATmega8 на тактовой частоте 16 МГц формирует два компонента видеосигнала, которые смешиваются нехитрой схемой из двух резисторов и двух диодов. Группой переключателей S1 устанавливаются режимы работы; согласующий резистор 75 Ом подключается через перемычку и добавлен, скорее, для универсальности (думаю, в большинстве случаев не понадобится).



Arduino выводит информацию для отображения через последовательный порт - пины RX/TX. Если вас смущает, что по ним же происходит загузка скетча и во время этого процесса на экране появляется некая "ерунда", можно уйти на любой пин с помощью библиотеки SoftwareSerial. Поддерживаются разные скорости, а также есть возможность автоопределения. Простейший скетч выглядит так:


        Serial.begin(57600); //57k6 baud
        Serial.println("Hello, world!");


К сожалению, изображение формируется исключительно черно-белое. Зато внутри имеем полноценный знакогенератор кодовой страницы 437, в котором есть псевдографика:


Вы, наверное, заметили, что для вывода видео использован аудио-разъем 3,5мм. На самом деле, это не казус, а вполне осознанный выбор, ограничивающий высоту элементов и делающий возможным стекирование шилдов:


Кроме вывода обычных символов, поддерживаются так называемые ESCAPE-последовательности, которые управляют курсором, удваивавают высоту и/или ширину символов и даже переключают банки шрифтов и переопределяют символы (что, впрочем, возможно только на ATmega328P, где памяти гораздо больше, чем у ATmega8). Таким же образом можно получить версию прошивки и прочую диагностическую информацию.

Чем-то все это напоминает LoL-Shield, особенно приложениями - взгляните на список доступных .ino. Здесь найдется не только классика Life и Snake, но и более изощренные - Maze и даже простейший "графический редактор"!

Поскольку все материалы доступны и открыты для доработки, мы решили немного поэкспериментировать и создать на базе этого шилда русифицированный вариант. Имя "TellyMate", подобно Arduino, является торговой маркой - поэтому пришлось назвать наш вариант Freeduino Teleсhat:


Все детали - PTH, поскольку шилд задумывался изначально в формате кита для самостоятельной сборки - и что может быть лучше, чем собрать всё самостоятельно? ;) Пины RX/TX имеют перемычки под пайку с обратной стороны платы, так что при желании их можно перерезать и подпаять к любым другим пинам. Аналогичным способом  отключается и кнопка сброса - если не хотите, чтобы МК шилда сбрасывался синхронно со  скетчем Arduino.

Краткое руководство по сборке шилда:


Шутка, конечно ;) просто там действительно все элементарно. На howtomakekit.blogspot.ru, как всегда, выложена подробная пошаговая инструкция.

Русифицированный шрифт мы разместили точно таким же способом, что и автор - в виде ссылки на документ в GDocs, копию которого при необходимости можно сохранить у себя. В открытом документе надо зайти на последнюю закладку, генерирующую hex, и скопировать ее содержимое в файл  fontbank0.c, подменив его в исходниках (можно скачать со страницы проекта). После компиляции получите прошивку c поддержкой кодовой страницы 866. Именно она и зашивается в ATmega8, входящие в комплект наборов Freeduino TeleChat. 

Для вывода русского текста потребуется еще кое-что сделать. Как известно, ArduinoIDE хранит все символы в кодировке UTF-8, и для нормальной работы потребуется их транслировать в кодировку 866. Делать это в оригинальной прошивке нам показалось святотатством - авторы очень скрупулезно рассчитали все задержки в коде. Предлагаем самый простой вариант перекодирующей функции:

byte c1 = 0;

void tele_print_char(char cd) {
  byte c = cd;
  if (  c >= 0x80) { // UTF-8 handling
    if (!c1) {
      c1 = c;
    } else {
      if (c1 == 0xd0) { 
       if (c == 0x81) Serial.print(char(0xf0)); // Ё
        else Serial.print( (char) (c - 0x10));
      }
      if (c1 == 0xd1) {
       if (c == 0x91) Serial.print(char(0xf1)); // ё
        else Serial.print( (char) (c + 0x60));
      }
      c1 = 0;
    }
  } else Serial.print(cd);
} 

void tele_print_str(char *s) {
  for(int i=0;i<strlen(s);i++) tele_print_char(s[i]);
}

void setup()
{
  char letter[]="АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
  Serial.begin( 57600 ) ;
  Serial.println( "Hello World!" ) ;
  tele_print_str( "Привет, мир!\n\r" ) ;
  tele_print_str( letter );
}

void loop()
{
    // do nothing!
}


Купить шилд в собранном виде или в виде комплекта деталей можно здесь.

Для тех, кто любит почитать оффлайн - про TellyMate упоминается в книге У. Соммера "Программирование микроконтроллерных плат Arduino/Freeduino".

07.05.2013

Web-термометр

"Погодная станция своими руками" - вот как можно было бы назвать статью, но я решил пока просто рассказать о том, как соорудить web-термометр, подключить его к домашней LAN  и наблюдать показания через браузер ;)

Для этого нам потребуется Arduino-совместимая плата, поддержка Ethernet и несколько температурных датчиков.


01.02.2013

Ethernet Shield своими руками

Классический Ethernet Shield от Arduino на микросхеме Wiznet W5100 появился одним из первых, перенес уже как минимум три существенных ревизии, а также интегрирован в плату Arduino Ethernet.



Тем не менее, использование W5100 - вовсе не единственный способ добавить немного LAN в ваше устройство на основе Arduino. Давным-давно фирма Microchip выпустила Ethernet-контроллер ENC28J60, который изготавливается не только в SMD-исполнении, но и в DIP-корпусе, что сделало его незаменимым для DIY-любителей. От себя замечу, что это единственный Ethernet-контроллер в DIP-е, который вообще попадал мне в руки.



Если сравнивать W5100 и ENC28J60, сразу же выяснится, что их основная общая черта - способность работать по шине SPI и тем самым экономить пины микроконтроллера для других задач. Но по техническим характеристикам ENC28J60 уступает - он не может пощеголять ни аппаратной поддержкой TCP, ни скоростью 100 Мбит.

Но, быть может, вашему проекту оно и не надо?

Когда говорят о скорости 100 Мбит/с, подразумевают скорость работы физического интерфейса (а не скорость поступления полезных данных, которая всегда меньше). К сожалению, Arduino UNO/Mega работает на тактовой частоте 16 МГц и способен выполнять только 16 000 000 операций в секунду (одна инструкция за такт - на то он и RISC ;). Вероятно, он не справится со сложным потоком медиаданных, зато на обмен небольшими порциями управляющей информации - вполне способен. Скорее всего, вы не почувствуете разницу между 10 и 100 Мбит/с, если будете считывать состояние датчиков или давать управляющие команды. Сетевые интерфейсы, способные работать на 100 Мбит/с, как правило, поддерживают и 10 Мбит/с - если только эта скорость не будет запрещена в конфигурации сетевого устройства принудительно каким-то злым маньяком системным администратором.

Что касается аппаратной поддержки TCP, который обеспечивает гарантированную доставку данных для многих протоколов, включая http, то здесь тоже все относительно просто: микросхема W5100 работает с четырьмя соединениями одновременно, обрабатывая перезапросы; в микросхеме ENC28J60 такой возможности нет (хотя она и поддерживает подсчет контрольной суммы, а также имеет буфер на 8 килобайт). То, что не делается аппаратно - приходится реализовывать программно, хоть и нагружая МК Arduino. Для программиста прикладного уровня (читаем - для рядового Arduino-пользователя типа нас с вами) это решается использованием соответствующей библиотеки, с оглядкой на свободную память микроконтроллера. Опытным путем я установил, что разница по объему скетчей хоть и есть, но не такая драматически большая, как мне показалось с первого взгляда.

Что нужно для того, чтобы состыковать ENC28J60 с Arduino? Да практически тоже самое, что и W5100:
  • схема тактирования (кварц 25 МГц + емкости);
  • питание +3,3В;
  • шина SPI c согласованием уровней логических сигналов  (+5В у Arduino и +3,3В у контроллера Ethernet);
  • развязка с линией (трансформатор, разрядник и резисторы - желательно 1%-ые);
  • внешний "точный" (1%-ый) резистор для работы опорного источника напряжения.
Собственно, все эти компоненты вполне реально существуют в выводном исполнении - так почему бы не воспользоваться? Схемы можно найти в изобилие в интернете, например - вот вариант из Instructables.



Автономные модули и шилд-платы с ENC28J60 в SMD-исполнении давно доступны на EBay и у  прочих интернет-магазинов (в особенности, конечно же, в китайских) - но это всего лишь железо, реализация одной и той же, по сути, схемы. Программная часть наиболее грамотно разрабатывается JeeLabs, можно даже найти инструкции по миграции с EthernetShield на EtherCard (так называется их вариант кита для самостоятельной сборки). Идея же представить набор для самостоятельной сборки по праву принадлежит Open Electronics, а библиотеку можно скачать на GitHub.



Основываясь на этой разработке, свет увидела Freeduino EtherCard R1:




Схема оставлена практически без изменений. Вот несколько моментов, которые их отличают:
  1. Шилд подключается по SPI, но через проходную вилку - таким образом, к нему можно подключить еще один SPI-шилд, например MicroSD shield;
  2. Все резисторы, которые требуют повышенной точности, взяты действительно 1%-ые;
  3. Шилд стыкуется с платой максимально компактно - обратите внимание, что в отличие от оригинала, он полностью "сел" на плату (обратите внимание на разъем USB и край печатной платы шилда, чтобы понять, о чем я говорю);
  4. Бочкообразные электролиты несоразмерной емкости 470 мкФ заменены на низкопрофильные.
Купить шилд в собранном виде или в виде kit-а можно здесь, пошаговая инструкция по сборке доступна здесь.

При использовании библиотеки, не забывайте в инициализации ether.begin дописывать третий параметр - номер пина, к которому подключено разрешение работы. Библиотека по умолчанию предполагает D8, но в этом шилде - D10

Возьмите прилагающийся к библиотеке пример testDHCP и найдите строчки:

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println( "Failed to access Ethernet controller");

Впишите номер пина в конце следующим образом:

  if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0) 
    Serial.println( "Failed to access Ethernet controller");

И все тут же заработает (при наличии подключенной сетки с DHCP-сервером, конечно же ;)

11.01.2013

RelayShield HighPower

С момента выпуска RelayShield прошло около года. По традиции, мы проанализировали  отзывы пользователей и создали новую версию:


Основная идея - реализовать возможность переключения больших токов. Соответственно, место шести реле заняли четыре, зато более мощных (10А,  250VAC или 30VDC). Как и предыдущий вариант, этот тоже никак не соприкасается с Arduino-совместимой платой при стыковке:


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


Управляющие выходы реле находятся на пинах D7, D6, D3 и D4 соответственно. Контактные группы каждого реле обозначены как:

  • NOx - Normal Open, разомкнутый в исходном состоянии контакт;
  • NCx - Normal Close, замкнутый в исходном состоянии контакт;
  • COMx - Common, общий.
Управление несложное - надо перевести пин в режим цифрового выхода при помощи pinMode(N, OUTPUT), затем записать в него соответствующее значение (HIGH или LOW) через digitalWrite:
  • LOW (исходное состояние): замкнуты NCx и COMx, NO ни с чем не соединен;
  • HIGH: замкнуты NOx и COMx, NC ни с чем не соединен.

Купить RelayShield HighPower можно здесь.

08.01.2013

Как подключить шилд к Nano

Все, кто потратил на сравнение Arduino-совместимых плат хотя бы минут десять, успели усвоить простые истины:
  1. Полноразмерные платы типа Arduino UNO удобны для пристыковывания шилдов;
  2. Миниатюрные платы типа Arduino Nano чудо как хороши в комплекте с беспаечной макеткой.
Но что, если требуется ровно наоборот?...

Существуют полноразмерные Arduino-совместимые платы, на которые не напаяны колодки - вместо них можно впаять штыри и воткнуть таким образом в макетку (как правило, на них даже два ряда отверстий - одно для стандартного arduino pinout, второе - на сетке 2,54 мм), хотя по смыслу такое подходит скорее для обычной макетной платы - к которой без паяльника лучше не подходить.

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

Так или иначе, отныне у нас есть вариант шилда-переходника, который быстро и непринужденно превращаются брюки позволяет состыковать Nano с шилд-платами для полноразмерных старших братьев:

Вот что она умеет:
  • изображать arduino pinout 1.0, включая ICSP-вилку для стыковки с последними Ethernet-платами (и прочими вариантами, которые используют для коммуникаций пины с аппаратной поддержкой SPI);
  • разъем питания с защитным диодом и опциональной возможностью запитывания от стабилизированного источника +5В;
  • посадочные места для пинов A6 и A7 - если они все-таки используются в конструируемом вами устройстве;
  • посадочные места для резисторов-подтяжек I2C, если вдруг понадобится;
  • кнопку сброса (хотя она и кажется бесполезной на первый взгляд).
Когда я разводил этот вариант, то довольно скоро сообразил, что поместить Nano сверху не получится из-за недопустимой высоты - она просто не даст возможность нахлобучить шилды , при стандартной высоте колодок в 8 мм.

И хотя вопрос решался увеличением высоты колодок, я решил отказаться от этой затратной со всех точек зрения идеи (стоимость этих экзотических высоких колодок и результирующая высота и прочность конструкции) и поместил Nano с противоположной стороны ;) Иными словами -  колодки для шилдов и для Nano смотрят в разные стороны:


Я, конечно, понимаю - истинный фанат платформы Arduino просто обязан иметь в своем арсенале как минимум Nano, UNO, и Mega, а следовательно - в таком переходнике не нуждается. Тем не менее, по себе знаю, что прототипизация происходит очень спонтанно и результат качественно зависит от того, что оказалось под руками в конкретный момент времени. В результате это может выглядеть так:




Что до меня лично - я, наконец, получил возможность питать и Nano, и UNO от одного блока питания - быть может, эта идея еще кому-то понравится ;)

Купить кит или собранную плату можно здесь. А руководство по сборе кита (поясняющее отдельные моменты конструкции) - прочитать здесь.

07.09.2012

Ангел для Петьки

Сегодня хочу предложить статью Andrew Doynikov - о том, как превратить Angelino в программатор STK-500 by Petka.

Сломался программатор STK500 by Petka. Можно было изготовить новый, но в наличии не оказалось FT232RL, зато был переходник USB-TTL, купленный давно и используемый во многих проектах для тестирования и отладки:


Также под рукой оказалась плата Angelino - самая дешевая, наверное, Arduino-совместимая плата - без USB:


Решено! Будем делать из этого программатор.

Если вниматнльно взглянуть на схему Angelino, практически - это половина программатора. 
Вот что потребуется изменить:
  • кварц 16 МГц надо заменить на тот, что используется в STK500 by Petka, я поставил 14.7456 МГц
  • убрать линию "Автосброса", которая присутствует на всех Arduino-совместимых платах;
  • добавить несколько резисторов, светодиод и разъем для программирования целевого контроллера.


На схеме сохранена нумерация элементов из оригинальной схемы STK500 by Petka, красным отмечены пины Angelino (например, А0 - аналоговый вход, D10 - цифровой).

Дополнительные элементы и разъем программирования было удобно разместить на отдельной Shield-плате, которую я развел в Sprint Layout и изготовил с помощью ЛУТ:



Далее, в Angelino устанавливается контроллер ATmega8-PU, через ICSP-разъем туда загружается прошивка для кварца 14.7456 МГц - от уважаемого Леонида Ивановича, который улучшил и оптимизировал ее. После этого основная плата стыкуется с полученной Shield-платой, подключается USB-TTL переходник (в процессе подключения к Windows может понадобиться установить драйвера FTDI).




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



Подводя итог: после двух часов неспешной работы - получен прекрасный и быстрый программатор. Мои благодарности автору программатора - Petka и Леонид Ивановичу за доработанную прошивку.

Материалы:

17.01.2012

RelayShield

Очередная шилд-плата, на этот раз для управления шестью реле:


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

Наиболее популярными аналогами являются варианты от Seeedstudio и Open Electronics:


Первый вариант хорош тем, что имеет разъем для подключения беспроводного модуля и, соответственно, возможность дистанционного управления - правда только через модули RFBee (не путать с ZigBee - хотя смысл у них один и тот же), однако и содержит на борту всего четыре реле. Второй вариант имеет шесть реле и даже предназначен для самостоятельной сборки, но лишен оптронной развязки - тут авторы особое внимание уделили освещению ;) аж по два светодиода на реле. Таким образом, мой вариант - как бы промежуточный.

У обоих плат есть одно слабое место - они располагают реле над разъемом USB, за что неоднократно подвергались критике (одно неловкое движение, и короткое замыкание в цепи нагрузки). Я постарался учесть этот факт и немного отодвинул клеммники и реле:

  


Старшие товарищи уже раскритиковали примененные пятивольтовые реле (1A, 250VAC  или 30VDC). Утверждается, что они ненадежные и для реальной промышленной автоматики никак не подходят... Так что имейте это ввиду, на всякий случай ;)



Как всегда, купить можно здесь:  http://mk90.ru/store/ru/shields/240-relayshield-v20.html

12.01.2012

LolShieldRus для 1.0

Библиотека LoLShieldRus, адаптированная для ArduinoIDE 1.0: LoLShieldRus.tar.gz

Ссылка на github (модификация, кстати, несложная - как и в случае с LiquidCrystalRus - сводится к замене инклуда WProgram.h на Arduino.h). 

Напоминаю, что это за зверь: библиотека поддержки шилд-платы LoLShield, представляющей из себя матрицу светодиодов 9х14, соединенных методом хексиплексирования таким образом, что можно управлять засветкой каждого отдельно взятого светодиода. Поддерживаются все полноразмерные Arduino-совместимые платы, включая Mega, а также - русский язык. 

См. также все статьи про LoL-shield в моем блоге.

23.09.2011

И снова о LoLShield

Спешу довести до владельцев LoLShield информацию о новой библиотеке - LoLShieldRus. Использовать библиотеку с сайта https://code.google.com/p/lolshield/ сильно не рекомендуется, сейчас объясню, почему.

Сам автор - Джимми Роджерс - давно уже переключился на другие проекты,  а доработкой больше всех занимался Matt Mets, который, впрочем, тоже переключался на другие проекты, и вероятно именно поэтому на Google Code можно скачать только версию 0.2 оригинальной библиотеки. Впрочем, Мэтт периодически возвращался и делал какие-то изменения, но - на GitHub:
  • в июле 2010 он пофиксил ошибку с PROGMEM;
  • тогда же - добавил экспериментальные функции изменения яркости (так называемый "grayscale support"), утилиты для конвертации фонтов;
  • в январе 2011 он удалил массу функций из основной ветки - и яркость, и двойной буфер;
  • в феврале 2011 он пофиксил ошибку, из-за которой библиотека не работала с ATmega1280/2560;
  • в июле 2011 немного упорядочил структуру файлов в проекте.
Для поддержки русского языка я решил перенести именно его код в свой проект, но не стал форкаться: есть у меня кое-какие идеи, связанные с будущим развитием и библиотеки, и шилда. Пока же никаких серьезных изменений: присутствует фонт с заглавными русскими символами (для экономии флеш-памяти, идентичные по написанию символы заимствуются из английского алфавита), а также пример для вывода русского текста в виде бегущей строки.


02.07.2011

Снова о LoL Shield

Как бы рубрика "письма в редакцию" :) Или - смотрите, что можно сделать с LoL-Shield :)





Автор этих композиций - Юрий, любезно согласился поделиться скетчем ко второй из них. Только учтите, что музыка просто наложена, хотя кажется, что она попадает в такт движениям бешеной палочки ;)

18.06.2011

Update про microSD

В статье про microSD shield от libellium, я по неопытности так и не смог вычислить, что за чип используется для подачи на microSD-карточку напряжения +3,3В.  

И вот, перебирая схемы и разводки, я неожиданно понял, что это - LP2985-33BVR - тот самый, который теперь используется на Arduino Uno и Mega2560 в качестве источника +3,3В. Да и схему они наконец опубликовали:

31.05.2011

Индикатор уровня на Arduino и LoL-shield

Если вы уже знакомы с LoL-shield - до этой идеи просто невозможно не додуматься. Сначала она была озвучена мне Юрием Соловьевым, а затем показана в реализации Andy Doro.

Итак, аудио-сигнал поступает с выхода проигрывающего устройства (плеер, телефон или даже выход звуковой карты на компе) и подается на аналоговый вход Arduino / Freeduino. Далее, он оцифровывается и выводится в виде гистограммки на LoL-Shield.

Библиотека LoL-Shield имеет  базовую функцию, которая позволяет зажигать и гасить один светодиод прямым заданием координат, так что здесь все просто.

А вот для преобразования аналоговых отсчетов в спектрограмму можно воспользоваться классическим алгоритмом БПФ (быстрого преобразования Фурье, или FFT - Fast Fourier transform), для которого тоже существует библиотека. Правда, она до сих пор жила в треде форума, но кто его знает - может быть к моменту прочтения этой статьи она уже будет в составе ArduinoIDE.

Берем стандартный 3,5мм аудио-разъем (обрабатывать будем только один канал, так что можно и монофонический) и подключаем центр к свободному analog5, а землю к GND - все эти линии очень удачно выведены на LoL-Shield.



Теперь надо написать скетч, как я уже говорил - понадобится две библиотеки:
Для установки надо распаковать их в каталог sketchbook/libraries и перезапустить ArduinoIDE.

Библиотека FFT разбивает аудио-диапазон на 64 спектральные полосы, поэтому нам надо как-то трансформировать это в 14 столбцов и 9 уровней по размеру матрицы LoL-Sheild. В целом это выглядит приблизительно так:

/*
FFT for LoL Shield v0.9
by Andy Doro
http://andydoro.com/

based on FFT library and code from the Arduino forums and
the Charlieplexing library for the LoL Shield.
*/

#include <Charliplexing.h>
#include <fix_fft.h>

#define AUDIOPIN 5

char im[128], data[128];
char data_avgs[14];
int i=0,val;

void setup() {
  LedSign::Init();            //Инициализировать LoL-Shield
}

void loop() {

  for (i=0; i < 128; i++){                                     
    val = analogRead(AUDIOPIN);                                    
    data[i] = val;                                       
    im[i] = 0;                                                     
  };

  fix_fft(data,im,7,0);

  for (i=0; i< 64;i++){                                      
    data[i] = sqrt(data[i] * data[i] + im[i] * im[i]);  // получаем абсолютное значение от значения из массива, дальше имеем дело только с положительными числами
  };     
  
  for (i=0; i<14; i++) {
    data_avgs[i] = data[i*4] + data[i*4 + 1] + data[i*4 + 2] + data[i*4 + 3]; // усредняем соседние значения
    data_avgs[i] = map(data_avgs[i], 0, 30, 0, 9); // масштабируем значения под LoL
  }
 
  // вывод в LoLShield
  
  for (int x=0; x < 14; x++) {
   for (int y=0; y < 9; y++) {
     if (y < data_avgs[13-x]) { // 13-x меняет порядок строк так, чтобы частоты от низких к высоким показывались слева направо.
       LedSign::Set(x,y,1);        // set the LED on
     } else {
       LedSign::Set(x,y,0);       // set the LED off
     }
   } 
  }
}


На мой вкус, обновлять гистограмму уровней можно было бы чуть реже, уж больно мельтишит. Но тут, как говорится, дело вкуса:



Скачать скетч и библиотеки одним архивом:

При подготовке статьи использованы материалы c сайтов forum.arduino.cc, jimmieprodgers.com, instructables.com.

20.05.2011

Новости Arduinoстроения

В комментах к статье о Freeduino One пользователь Сергей справедливо обращает внимание на лишние элементы в схемах тактирования, добавленные в Uno и Mega 2560:


Речь про R1 1М и R3 27Ом. Дело в том, что согласно родному ATMEL-овскому даташиту "AVR042: AVR Hardware Design Considerations", эти элементы и так уже есть внутри МК, причем R3 нужен для отдельно взятого случая - если используется резонатор 32758 кГц:



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

Замечу, что именно начиная с Arduino Uno был применен ATmega8u2 и миниатюрный керамический резонатор 16МГц - раньше такого у итальянцев не было (только в Nano v.3, но ее выпускала американская Gravitech).

Что же в итоге? Один из побочных эффектов такого решения - надежное, но зато несколько замедленное возбуждение резонатора после подачи питания, что для домашних Arduino-поделок вроде как вполне приемлемо. Я вот, например, вообще не заметил никаких побочных эффектов - Freeduino ONE работает безупречно.

Но, как говорится, время шло. Вслед за появлением знаменитой Arduino UNO на ATmega328 в DIP, появилась версия на SMD:


Объяснили это очень просто: производство ATMEL не справляется, возник дефицит чипов в DIP-корпусе. Охотно верю - в России SMD-версию достать проще и дешевле. Но если уж на то пошло - в корпусе TQFP32 ножек больше, и появляется целых два лишних входа (digital I/O или АЦП), что является просто находкой для тех, кому надо иметь чуть больше пинов и из-за этого приходится использовать MEGA. Но, увы - идея вывести их на какие-нибудь дополнительные контактные площадки или дырки авторов не посетила :(

Спустя некоторое время появилась и вторая версия Arduino UNO, схему в PDF можно скачать на все той же страничке.

Что изменилось в UNO rev.2

  • теперь уже окончательно керамический резонатор закреплен за основным МК, а нормальный кварц - за ATmega8U2 (альтернативных посадочных мест для вариантов нет);
  • токоограничительный резистор 27 Ом в схеме тактирования - убрали! Зато параллельный 1М - оставили. Видимо, эксперименты продолжаются;
  • линия сброса DTR притянута к земле резистором 1K, который "оторвали" от светодиода L (там было два и один явно лишний - поскольку он является частью микросборки из четырех штук - авторы просто решили пристроить его к делу ;) Получился как бы классический фильтр высоких частот, и смысл этого решения человечеству еще предстоит осознать ;) 
  • четыре ранее неиспользованных вывода ATmega8u2 - PB7, PB6, PB5 и PB4 выведены под вилку 2x2, что-то мне это напомнило о пропавшей X3 для bitbang-а - возможно, скоро нас ждет новая прошивка, которая будет уметь изображать что-то подобное;
  • операционный усилитель LM358 теперь может быть установлен не только в классическом корпусе SO-8, но и в SSOP - миниатюризация продолжается!
Изменения коснулись и EthernetSD shield, появилась rev.06 - и одно изменение там, прямо скажем - революционное: плата подготавливается к поддержке PoE (стандарт IEEE 802.3af). Это такая технология, которая позволяет дистанционно питать устройство по линии Ethernet, для чего в природе существуют специальные PoE-инжекторы и "питающие" коммутаторы. Поддержка требуется также и на стороне самого устройства - для Ethernet Shield это будет специальный PoE-модуль, отделяющий питающее напряжение (+48В DC) от сигнала витой пары перед тем, как подать его на интерфейсную микросхему W5100. 



Arduino с таким шилдом и модулем PoE может питаться дистанционно - теоретически, можно отдалиться по кабелю от источника до 100 метров. Сразу оговорюсь - это решение промышленное (используем по работе в своих аппаратных решениях с 2001 года). Кроме того, Ethernet-shield на чипе W5100 с PoE давно уже существует - разработан компанией Freetronics.


Всё остальное - мелкие изменения:

  • микросхема-сборка триггеров Шмидта в схеме сброса W5100 заменена на один маленький триггер в корпусе SOT23-5 - логично, занимает меньше места, нет избыточности;
  • окончательно отказано в праве на монтаж полноразмерному SD-слоту - по сути, он всё это время просто занимал лишнее место; 
  • резистивные делители для коммуникации с SD-картой заменены на буферные микросхемы 74LVC1G125DBV, что тоже логично - работать они будут стабильнее, потреблять - меньше;
  • исключен из схемы светодиод COLL, который должен был показывать коллизии на интерфейсе Ethernet. В защиту такого решения говорит то, что зажигаться он может при подключении через хаб, но где теперь можно найти Ethernet-хаб?!
  • светодиод FULLD вынесен за пределы платы. То есть он как суслик из ДМБ - как бы есть, но на самом деле - его нет.
Последний пункт тем более загадочен тем, что на реальной плате на фото светодиода FULLD нет, а в CAD-файлах он "завис" ни к чему не подключенный. Да и сами brd-файлы с разводкой содержат две воздушные перемычки - недвусмысленный намек на незавершенность и наличие ошибок. В этой связи, конечно, напрашивается вопрос о том, не выйдет ли вскоре еще одна версия. Ну, поживем - увидим ;)

23.04.2011

Arduino + Ethernet + mircoSD

После выхода новой Arduino Ethernet Shield 05 прошло довольно много времени, но недавно  мне случилось снова обратиться к этой теме, изучая возможности платы Freeduino EthernetSD Shield:




Отправная точка для ее создания сходна с Freeduino One - попытка собрать ограниченную партию для собственных нужд из доступной комплектации. Но попутно выяснилось много маленьких, но интересных фактов.

Например - каким образом новая плата оказалась совместима с Mega?

Напомню историю проблемы: в Arduino обмен с Ethernet-чипом W5100 происходит по шине SPI, и сначала сигналы на Arduino Ethernet Shield были разведены прямо от колодки цифровых входов 11,12 и 13, к которым и был привязан аппаратный SPI на ATmega168/328. Но после триумфального выхода Arduino Mega все вдруг с опозданием спохватились, что аппаратный SPI "переехал" на 50,51 и 52 - и это стало причиной несовместимости MEGA не только с EthernetShield, но и вообще со всеми шилдами, использовавшими аппаратный SPI.

Именно в результате этого недоразумения SPI теперь принято разводить с колодки ICSP, которая, к огромному счастью, сохранила свое позиционное расположение во всех оригинальных платах Arduino. Заглянем на обратную сторону EthernetSD шилда:



Таким образом, SPI-сигналы MISO, MOSI и SCK будут всегда правильными:
  • в обычных (не-MEGA) платах будут использоваться digital 11,12,13;
  • в Mega и Mega2560 - 50,51,52.
Единственный сигнал, которого нет на вилке ICSP - это SS (Slave Select). Низким уровнем он выбирает ведомое устройство на шине SPI, с которым будет общаться ведущее (в нашем случае - ATmega):
  • для выбора Ethernet используется digital 10;
  • для выбора SD-карты используется digital 4.
Соответственно, использовать digital 10 и 4 в схемах с EthernetSD Shield для какого-то другого применения - нельзя.


Ради интереса можете сравнить решение по доступу к SD с вариантом от libellium, котрое я разбирал в статье MicroSD Shield (в основе - тот же резистивный делитель для согласования уровней сигналов). В старой версии Ethernet Shield разъем SD никогда не напаивался (лишь гордо блестели залуженные площадки из-под маски, напоминая о былых ошибках и вселяя ложную надежду в сердца тех, кто рассчитывал напаять разъем и получить какие-то дополнительные функции) - то ли из-за отсутствия согласования сигналов по уровню 3,3В, а может - из-за отсутствия программной поддержки. Да и сигналы эти были разведены на другие пины. Но теперь SD и Ethernet физически разделяют одну шину SPI, одинаково используя преимущества аппаратной поддержки в ATmega.

Отсюда, кстати, вытекает второй нюанс: в случае необходимости работать и с SD-картой, и с Ethernet, между ними придется попеременно переключаться. В принципе, это вполне возможно, особенно в режиме TCP - если данные все-таки потеряются по приему, TCP перезапросит пропущенный фрагмент и автоматически уменьшит окно. Ну, по крайней мере, мне в это хочется верить ;) 

На оригинальной схеме Arduino Ethernet Shield 05 сигналы детекта карты и защиты от записи почему-то оказались не разведены на разъем microSD, но сохранены для полноразмерного SD-разъема (они даже имеют подтяжки 10К к Vcc). Я некоторое время колебался - но в итоге оставил эту странность в покое ради полной совместимости. Ведь представьте себе - установка/изъятие SD-карты влечет изменение уровня на analog0 и автоматически приводит к невозможности его использования для других целей.

Авторы по прежнему сохраняют разорванную перемычку INT, которая может соединить выход прерывания W5100 c digital2 и использовать для ввода/вывода механизм прерываний. Однако, поддержка прерываний с W5100 так до сих пор и не реализована: библиотека работает традиционным для Arduino методом пулинга (постоянного опроса состояния буфера из скетча).



Схема сброса с дополнительным супервизором и триггером Шмидта в придачу сразу сняла все непонятные глюки, которые у меня наблюдались с первой версией платы. Жить стало проще и веселее (с) ;)

Заслуживает нескольких слов и программная поддержка, над которой сообщество также изрядно потрудилось.

Когда-то я мучительно плодил классы для работы с UDP, в конечном итоге добиваясь возможности синхронизации времени по протоколу NTP. Но прогресс не стоит на месте и теперь UDP включен в библиотеку вEthernet в составе ArduinoIDE 0022, ничего изобретать не надо. Кроме того, энтузиастами написана поддержка следующих возможностей:

  • EthernetDHCP, позволяет получать IP-адрес динамически, поддерживается блокирующий и неблокирующий режим вызова функций; есть возможность обновления lease (и перехода на другой IP, если его поменяют "на лету"). Более, чем достаточно!
  • EthernerDNS, позволяет преобразовывать символические имена в реальные IP-адреса. Необходимо только знать IP-адрес своего DNS-сервера - например, взять из DHCP lease (см. выше);
  • EthernetBonjour,  поддержка протокола Bonjour/Zeroconf, реализующего MulticastDNS и DNS Service Discovery - при помощи него вы можете донести до остальных пользователей информацию о том, какие сервисы запущены на вашем Arduino (поклонники Apple быстрее остальных поймут, о чем речь ;)
  • WebDuino, библиотека с каркасом для построения веб-серверов на основе Arduino - включает в себя парсинг URL и прочие полезные функции. Почему-то напомнила CGI.pm ;)
  • RadiusClient, библиотека для поддержки авторизации по протоколу Radius (видимо, Diametr должен быть на подходе ;)
  • UdpNtpClient, пример из стандартной библиотеки, запрашивающий по NTP время и расшифровывающий ответ в виде ЧЧ:ММ:СС. Что я могу сказать... весьма грубо усеченный, но рабочий вариант.
Недавно мне задали вопрос: "Насколько сложно программировать для EthernetSD Shield?" В качестве демонстрации ответа, приведу решение задачи, которую один мой знакомый сформулировал так: "у меня есть компьютер с портом RS232, надо дать к нему доступ через Internet". При этом от предложений на основе PC+Linux он отказался в пользу Arduino+Ethernet Shield. Учтите, выставлять в public internet сервер Telnet - чистое безумие не совсем безопасно! Так что используйте на свой страх и риск:


//  Copyright (C) 2011 Ilya Danilov
//  http://mk90.blogspot.com
//
//  TelnetServer is free software: you can redistribute it and/or modify
//  it under the terms of the GNU Lesser General Public License as
//  published by the Free Software Foundation, either version 3 of
//  the License, or (at your option) any later version.
//
//  TelnetServer is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU Lesser General Public License for more details.
//
//  Illustrates how to make simple Telnet Server based on Ethernet Shield.

#if defined(ARDUINO) && ARDUINO > 18
#include <SPI.h>
#endif
#include <Ethernet.h>
#include <EthernetDHCP.h>
#include <SD.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEC };

#define MAXPASSLEN  16
#define READ_TIMEOUT_IN_MS 60000L
char enteredPassword[MAXPASSLEN];
char cardPassword[MAXPASSLEN];

Server server(23);

// Just a utility function to nicely format an IP address.
const char* ip_to_str(const uint8_t* ipAddr)
{
  static char buf[16];
  sprintf(buf, "%d.%d.%d.%d\0", ipAddr[0], ipAddr[1], ipAddr[2], ipAddr[3]);
  return buf;
}

void setup()
{
  pinMode(10, OUTPUT);
  pinMode(4, OUTPUT);
  digitalWrite(10, HIGH);
  digitalWrite(4, HIGH);
  
  SD.begin(4);
  digitalWrite(4, HIGH);
    
  Serial.begin(9600);
  
  Serial.println("Attempting to obtain a DHCP lease...");
  EthernetDHCP.begin(mac);

  const byte* ipAddr = EthernetDHCP.ipAddress();
  const byte* gatewayAddr = EthernetDHCP.gatewayIpAddress();
  const byte* dnsAddr = EthernetDHCP.dnsIpAddress();
  
  Serial.println("A DHCP lease has been obtained.");

  Serial.print("My IP address is ");
  Serial.println(ip_to_str(ipAddr));
  
  Serial.print("Gateway IP address is ");
  Serial.println(ip_to_str(gatewayAddr));
  
  Serial.print("DNS IP address is ");
  Serial.println(ip_to_str(dnsAddr));
  
  server.begin();
}


boolean authenticateClient(Client &client) {
  int i=0, k=0;
  unsigned long timeoutTime;
  
  delay(500);
  client.flush(); // kill telnet handshake junk
  memset(enteredPassword,0,sizeof(enteredPassword));
  
  for (i=0;i<3;i++) {
    client.println("Password:");
    k = 0;
    timeoutTime = millis() + READ_TIMEOUT_IN_MS;
    while ( (k<MAXPASSLEN) && client.connected() && (millis() < timeoutTime) ) {
      char ch = client.read();
      if (ch != -1) {
        if (ch == '\r') continue;
        if (ch == '\n') break;
        enteredPassword[k++] = ch;
      } else delay(10);
    }
    
    if (millis() >= timeoutTime) return false;  
    if (!client.connected()) return false;  
        
    // read password from SD
    if (enteredPassword[0]) {
      if (SD.exists("passwd")) {
        memset(cardPassword,0,sizeof(cardPassword));
        k = 0;
        File f = SD.open("passwd"); 
        while (f.available() && k<MAXPASSLEN ) {
          char ch = f.read();
          if (ch == '\r') continue;
          if (ch == '\n') break;
          cardPassword[k++] = ch;
        }
        f.close();
        digitalWrite(4, HIGH);
        
        // compare
        if (!strcmp(cardPassword,enteredPassword)) 
          return true;
        else {
          client.println("Password mistmatch, try again!"); 
        }
      } else {
        client.println("Password file not found\n");
      } 
    } 
  } 
  return false;
}

void loop()
{
  boolean authenticated = false;
  //EthernetDHCP.maintain();
  
  // listen for incoming clients
  Client client = server.available();
  if (client) {
    while (client.connected()) {
      if (!authenticated) {
        if (!authenticateClient(client)) {
          client.println("Authorization failed.");
          client.stop();
          break;
        } else authenticated = true;
      } else { //auth passed
        if (client.available()) {
          char c = client.read();
          Serial.print(c);
        }
        if (Serial.available() >0 ) {
          char c = Serial.read();
          client.print(c);
        }
      }
    }
  }
}



После старта Arduino получает адрес динамически и выводит его через Serial-порт, чтобы было понятно, на какой IP ломиться telnet-клиентом. По входящему соединению выдается запрос "Password:", полученная в ответ комбинация символов сравнивается с содержимым простого текстового файла passwd, который располагается в корне SD-карты (внутри файла просто пароль, не путать с /etc/passwd :).

И как водится во всех сказках, на ввод правильного пароля дается три попытки ;)

Если выкинуть авторизацию, скетч займет один экран. Сложно? Не думаю, хотя для серьезных задач потребуется изучение нюансов. В итоге: после компиляции скетч занял 23К в памяти, переключение между SD-картой и Ethernet работает нормально.

Как всегда, часть плат пока еще доступна здесь.