Библиотека LoLShieldRus, адаптированная для ArduinoIDE 1.0: LoLShieldRus.tar.gz
Ссылка на github (модификация, кстати, несложная - как и в случае с LiquidCrystalRus - сводится к замене инклуда WProgram.h на Arduino.h).
Напоминаю, что это за зверь: библиотека поддержки шилд-платы LoLShield, представляющей из себя матрицу светодиодов 9х14, соединенных методом хексиплексирования таким образом, что можно управлять засветкой каждого отдельно взятого светодиода. Поддерживаются все полноразмерные Arduino-совместимые платы, включая Mega, а также - русский язык.
Спешу довести до владельцев LoLShield информацию о новой библиотеке - LoLShieldRus. Использовать библиотеку с сайта https://code.google.com/p/lolshield/ сильно не рекомендуется, сейчас объясню, почему.
Сам автор - Джимми Роджерс - давно уже переключился на другие проекты, а доработкой больше всех занимался Matt Mets, который, впрочем, тоже переключался на другие проекты, и вероятно именно поэтому на Google Code можно скачать только версию 0.2 оригинальной библиотеки. Впрочем, Мэтт периодически возвращался и делал какие-то изменения, но - на GitHub:
тогда же - добавил экспериментальные функции изменения яркости (так называемый "grayscale support"), утилиты для конвертации фонтов;
в январе 2011 он удалил массу функций из основной ветки - и яркость, и двойной буфер;
в феврале 2011 он пофиксил ошибку, из-за которой библиотека не работала с ATmega1280/2560;
в июле 2011 немного упорядочил структуру файлов в проекте.
Для поддержки русского языка я решил перенести именно его код в свой проект, но не стал форкаться: есть у меня кое-какие идеи, связанные с будущим развитием и библиотеки, и шилда. Пока же никаких серьезных изменений: присутствует фонт с заглавными русскими символами (для экономии флеш-памяти, идентичные по написанию символы заимствуются из английского алфавита), а также пример для вывода русского текста в виде бегущей строки.
После продолжительных занятий с LoL-Shield осознал нехватку кнопки сброса (да и вообще кнопок - пользовательских). Очередную партию печатных плат я заказал с небольшими изменениями и обозначил как 1.5.1 - на ней теперь есть кнопка сброса и два места для дополнительных кнопок, которые подключены к A2, A3.
Для их использования рекомендую использовать пины в цифровом режиме и включить подтягивающий резистор. Вот пример, распечатывающий состояние кнопок в последовательный порт на скорости 9600:
Как бы рубрика "письма в редакцию" :) Или - смотрите, что можно сделать с 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.9by Andy Dorohttp://andydoro.com/based on FFT library and code from the Arduino forums andthe 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;
voidsetup() {
LedSign::Init(); //Инициализировать LoL-Shield
}
voidloop() {
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
}
// вывод в LoLShieldfor (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
}
}
}
}
На мой вкус, обновлять гистограмму уровней можно было бы чуть реже, уж больно мельтишит. Но тут, как говорится, дело вкуса:
На досуге забил русский знакогенератор в стандартную библиотеку, получилось приблизительно так:
Выкладываю раннюю альфу для тех, кому надо срочно заставить LoL-шилд говорить по-русски. Несколько ограничений:
работает только горизонтальный скроллинг;
буквы могут быть только заглавными.
Автор модуля Font.cpp Benjamin Sonntag оставил в коде забавный коммент "STRANGE BUG : If I put these array too (low-case fonts) the code don't work, and I don't know why ...". Ну что же... зато теперь я могу ответить - Benjamin, try to use flash mem instead of RAM. То бишь, наш французский друг разместил знакогенератор прямо в оперативной памяти, поэтому даже подключение безобидного Serial вызывало железное повисание скетча.
Тестовый скетч занимает после компиляции ~5300 байт, но есть возможности для оптимизации (спасибо Бенжамину ;)
Разберем примеры, которые идут в комплекте с библиотекой LoLShield. Традиционно, они доступны в ArduinoIDE через меню File | Examples.
1. BasicTest
Этот скетч полезно загрузить, чтобы проверить правильность работы всех светодиодов.
Качество видео, конечно, оставляет желать лучшего - но даже на нем видно, что один из светодиодов впаян неправильно.
2. Charli_heart
Смысл этого теста я не очень понимаю, видимо какой-то медитативный:
Словом, матрица какая-то...
3. font_test
Это - пример анимации графики (бегущая строка). Производит наибольшее впечатление на коллег и родственников. Естественно, русский не поддерживается (пока ;)
4. life
Еще одна медитативное развлечение - игра Жызнь ;) если кто в детстве забавлялся с псевдографикой на РК-86 или упражнялся в синклер-бейсике, должен ощутить прилив ностальгии...
Переходим к водным процедурам активным действиям. Если вы уже успели обратить внимание - на шилде выведены два свободных пина - A4, A5. Для полноценного использования их в следующих примерах, придется добыть кнопочку, потенциометр и резистор-подтяжку 10К.
Никогда бы не предположил, что столько положительных эмоций заключено в простой светодиодной матрице! А вот Джимми Роджерсу это удалось не только предположить, но и воплотить в полной мере - именно он является автором LoL Shield:
Что такое LoL Shield? Это матрица индивидуально адресуемых светодиодов 9х14, куда можно выводить все, что душе угодно: начиная с текста и заканчивая изображениями. Принцип действия основывается на т.н. сharlieplexing - в отличие от обычного мультиплексирования, используется свойство микроконтроллеров поддерживать свои выходы в трех состояниях. Наглядно этот эффект можно продемонстрировать на такой схеме:
Когда вы переводите пин MCU в состояние входа, то практически отсоединяете его от схемы. Следовательно, чтобы заставить зажечься светодиоды LED5 или LED6, надо подать разные логические уровни на pin1 и pin3, но чтобы при этом не загорелись остальные - перевести pin2 в состояние входа (иначе говоря - high impendance - высокого сопротивления).
Теоретически, имея в распоряжении N свободных пинов MCU, можно заставить работать Nx(N-1) светодиодов. Сам автор утверждает, что решил не жадничать и использовать только 12 выходов Arduino. И хотя это давало возможность использовать 132 светодиода, по факту на стандартную Shield-плату влезло только 126 трехмиллиметровых - хотя и это неплохо. Схема состоит из блоков следующего вида:
Автор аккуратно объединил их и получил вот такую схему:
К сожалению, соорудить такое при помощи ЛУТ не представляется реальным: во-первых, развести такую плату в чисто односторннем варианте сложно, во-вторых - надо сойти с ума сверлить более 250 отверстий. Поэтому, пришлось брать комплект деталей LoL-Shield с печатной платой:
Размеренная и неторопливая пайка заняла у меня около 2х часов (считаю, великолепно провел время ;), в результате получился работающий шилд. Правда, три светодиода я все-таки впаял неверно, но в целом - проще некуда.
После этого надо скачать последнюю версию библиотеки здесь, загружать примеры смотреть, как это работает. В завершении первой части - видео от автора, где он демонстрирует различные варианты применения своей конструкции:
Возможностей применения индикации у такого шилда - море. Но этому будет посвящена вторая часть, которая - если меня не похоронит под кучей работы как я надеюсь - выйдет скоро.
В статье использованы материалы из Википедии - свободной энциклопедии.