24.06.2011

DFU

С момента выпуска первой версии Arduino Uno произошло небольшое изменение, связанное с процессом загрузки ATmega8u2 через DFU-бутлоадер. Если раньше надо было сначала замкнуть перемычку DFU и, удерживая ее, замкнуть замкнуть RESET и GND, то теперь надо только замкнуть сброс (ура! ;). На английском языке об этом можно почитать подробнее здесь.

А всего-то надо было добавить резистор-подтяжку 10К к земле:


Работать так действительно удобнее, поэтому на оставшиеся платы Freeduino One тут же были напаяны резисторы 10К 0805 - выглядит это гораздо надежнее и аккуратнее:



Ну и напоследок - немного о том, как изменить прошивку в ATmega8u2.

Для начала потребуется программное обеспечение, способное договориться с DFU-бутоладером о заливании новой прошивки:
При наличии готового .hex-файла, дальнейшие действия сводятся к переводу ATmega8u2 в режим DFU и заливке результата.



При подключенной шине USB аккуратно замыкаем (буквально на секунду) RESET и GND на посадочном месте гребенки программирования ATmega8u2. Далее в syslog наблюдаем отключение устройства /dev/ACM и подключение нового девайса, а Диспетчере Устройств Windows просто можете обратить внимание, что олицетворявший раньше плату Arduino / Freeduino послеодовательный порт пропал.

VID и PID этого устройства одинаковые и для Arduino Uno, и для Freeduino ONE - в противном случае не будет работать FLIP. VID будет ATMEL/0x03EB, а PID соответствует типу МК - для ATmega8u2 это будет 0x2FF7.

Теперь берете hex-файлы (в дистрибутиве ArduinoIDE они обитают в каталоге hardware/arduino/firmwares или берите из github). Дальше - в зависимости от того, чем прошиваете:

Linux

sudo dfu-programmer at90usb82 erase
sudo dfu-programmer at90usb82 flash Arduino-usbserial-uno.hex
sudo dfu-programmer at90usb82 reset

Windows

Тут, как всегда - всё тоже самое, но визуально. Выглядит FLIP приблизительно так:


Если на какой-то фазе что-то пойдет не так - всегда можно проделать это повторно: сам бутлоадер, естественно, никуда не денется. Но настоятельно рекомендую обратить внимание на такую деталь (особенно это касается Windows-пользователей, которым требуется установка .inf-файла с явно пробитыми VID и PID): после заливки hex-файлов из дистрибутива ArduinoIDE, вы получите пару значений VID=0x03EB и PID=0x204B, которые ATMEL от щедрот презентовал LUFA под проект USBtoSerial. Фшика в том, что на этой паре VID/PID могут сидеть разные устройства - для того, чтобы их отличать, используется поле 'release number' (это чем-то напоминает ситуацию с V-USB). И если это по какой-то причине вас не устраивает, рекомендую перед началом экспериментов сохранить оригинальную прошивку командой dump.

Альтернативный вариант - научиться самостоятельно компилировать прошивки ATmega8u2. В принципе - это тоже несложно, скачайте и распакуйте LUFA в каталог с прошивкой, например в  hardware/arduino/firmwares/arduino-usbserial. Найдите и отредактируйте в makefile путь к LUFA таким образом, чтобы он указывал на актуальное местоположение распакованного архива библиотеки, например:

# Path to the LUFA library
LUFA_PATH = ./LUFA

Убедитесь, что библиотека и исходники собираются правильно по make all. Только после этого рекомендую приступать к модификациям - например, VID/PID описаны в файле Descriptors.c.

18.06.2011

Update про microSD

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

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

15.06.2011

Протошилд

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



Сделано на основе protoshield v.5 от ladyada, с небольшими усовершенствованиями:

1. Добавил посадочное место для потенциометра. В половине случаев требуется подключить его к аналоговому входу, поэтому сразу включил его между VCC и GND, а изменяемую точку отвел к analog0.  Если этот проводок аккуратно перерезать, можно использовать произвольно - например, для контрастности HD44780U-совместимого дисплея:


2. Вывел наружу гребенки для I2C и USART. Они нужны чаще, чем можно предположить, и уж место для двух подтягивающих резисторов 5,1К тем более не помешает.



Остальное - как в оригинале, а именно:
  • дублирующая кнопка сброса
  • одна свободная кнопка, два свободных светодиода
  • вилка ICSP
  • посадочное место для SO-14 
  • посадочное место для DIP-20
Пошаговое руководство подробно расписано здесь, купить можно здесь (в двух вариантах, минимальный набор деталей и максимальный: ведь не всем же нужны светодиоды, кнопки, резисторы и потенциометры ;)

05.06.2011

ElectroDroid

Уважаемый Vergellan поделился со мной ссылкой на программу для Android - ElectroDroid.
Твердые пять звезд, что неудивительно, потому что эта программа-справочник умеет довольно много:

  • Цветовая кодировка резисторов (3-6 полос);
  • Цветовая кодировка дросселей;
  • Закон Ома;
  • Расчёт реактивного сопротивления;
  • Делитель напряжения;
  • Сопротивление резисторов в последовательном и параллельном включении;
  • Расчёт заряда конденсатора;
  • Операционный усилитель;
  • Ограничительный резистор для светодиода;
  • Расчёт LM317;
  • Тепловой режим;
  • Расчёт времени работы батареи;
  • Расчёт катушки индуктивности (только в платной версии);
  • Расчёт падения напряжения;
  • Расчёт ширины дорожек печатной платы;
  • Расчёт простых фильтров;
  • Расчёт таймера NE555;
  • Цоколёвка разъёмов (USB, serial, parallel, ethernet, SCART, DVI, HDMI, S-Video, VGA, FireWire, Jack, XLR, RCA, DMX, ATX, Molex, EIDE, SATA);
  • Справочники (Таблица сопротивлений; Таблица стандартных резисторов и конденсаторов; Маркировка конденсаторов; AWG, SWG размеры проводов; Таблица ампеража; Символы и сокращения; Условные графические обозначения; Приставки системы СИ; Информация о батарейках; Теоремы двоичной логики и алгебры; Информация о микросхемах 7400 серии; Кодировка ASCII);
  • Полная поддержка EIA рядов резисторов во всех расчётах;
  • ...и многое другое!


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.