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

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 немного упорядочил структуру файлов в проекте.
Для поддержки русского языка я решил перенести именно его код в свой проект, но не стал форкаться: есть у меня кое-какие идеи, связанные с будущим развитием и библиотеки, и шилда. Пока же никаких серьезных изменений: присутствует фонт с заглавными русскими символами (для экономии флеш-памяти, идентичные по написанию символы заимствуются из английского алфавита), а также пример для вывода русского текста в виде бегущей строки.


01.08.2011

Новый LoL-shield

После продолжительных занятий с LoL-Shield осознал нехватку кнопки сброса (да и вообще кнопок - пользовательских). Очередную партию печатных плат я заказал с небольшими изменениями и обозначил как 1.5.1 - на ней теперь есть кнопка сброса и два места для дополнительных кнопок, которые подключены к A2, A3.



Для их использования рекомендую использовать пины в цифровом режиме и включить подтягивающий резистор. Вот пример, распечатывающий состояние кнопок в последовательный порт на скорости 9600:

void setup() {
  Serial.begin(9600);
  pinMode(A2,INPUT);
  pinMode(A3,INPUT);
  digitalWrite(A2,HIGH);
  digitalWrite(A3,HIGH);
}

void loop() {
  delay(300);
  Serial.print("A2 = ");
  Serial.print(digitalRead(A2));
  Serial.print(" A3 = ");
  Serial.println(digitalRead(A3));
}


Также вместо AREF и GND в правом верхнем углу теперь TX и RX. Мне кажется, это немного логичнее.


Комплекты можно купить здесь (зеленые, красные и желтые светодиоды на выбор).

02.07.2011

Снова о LoL Shield

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





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

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.

10.04.2011

LoL Shield по-русски

На досуге забил русский знакогенератор в стандартную библиотеку, получилось приблизительно так:



Выкладываю раннюю альфу для тех, кому надо срочно заставить 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 байт, но есть возможности для оптимизации (спасибо Бенжамину ;)


29.03.2011

LoL Shield (2)

Продолжение, см начало в LoL Shield(1)

Разберем примеры, которые идут в комплекте с библиотекой LoLShield. Традиционно, они доступны в ArduinoIDE через меню File | Examples.

1. BasicTest

Этот скетч полезно загрузить, чтобы проверить правильность работы всех светодиодов.



Качество видео, конечно, оставляет желать лучшего - но даже на нем видно, что один из светодиодов впаян неправильно.

2. Charli_heart

Смысл этого теста я не очень понимаю, видимо какой-то медитативный:



Словом, матрица какая-то...

3. font_test

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



4. life

Еще одна медитативное развлечение - игра Жызнь ;) если кто в детстве забавлялся с псевдографикой на РК-86 или упражнялся в синклер-бейсике, должен ощутить прилив ностальгии...



Переходим к водным процедурам активным действиям. Если вы уже успели обратить внимание - на шилде выведены два свободных пина - A4, A5. Для полноценного использования их в следующих примерах, придется добыть кнопочку, потенциометр и резистор-подтяжку 10К.


Подключим их следующим образом:

  • нормальноразомкнутую кнопку между A4 и GND;
  • постоянный резистор-подтяжку 10К - между A4 и 5V;
  • потенциометр - традиционно: крайними ногами к GND и 5V, а переменной - к A5 (см. статью про подключение потенциометров на arduino.cc).
Таким образом, у нас появился мини-джойстик. 


5. invader1

Землю атакуют пришельцы, надо отстреливаться и уворачиваться. Тут впервые жалеешь, что поле не цветное и не 100 на 100 ;)



6. tetris

Зато старый добрый тетрис смотрится более, чем органично.


7. pong2

Что касается тенниса, то ракетка в два светодиода длиной - как-то маловато. Но, видимо, если сделать три - играть будет неинтересно (слишком просто).



Я повторяю - количество fun-а, которое генерит этот шилд, меня восхитило. Можно, кстати, сесть и написать модификацию pong3 для игры вдвоем ;)

продолжение обязательно следует! 

13.03.2011

LoL Shield (1)

Никогда бы не предположил, что столько положительных эмоций заключено в простой  светодиодной матрице! А вот Джимми Роджерсу это удалось не только предположить, но и воплотить в полной мере - именно он является автором 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х часов (считаю, великолепно провел время ;), в результате получился работающий шилд. Правда, три светодиода я все-таки впаял неверно, но в целом - проще некуда.

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



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

В статье использованы материалы из Википедии - свободной энциклопедии.

См. продолжение про примеры к LoL Shield (2)