РадиоКот :: Вентилятор с анимацией.
Например TDA7294

РадиоКот >Схемы >Цифровые устройства >Игрушки >

Теги статьи: Добавить тег

Вентилятор с анимацией.

Автор: Скворцов Виктор
Опубликовано 14.09.2010

2010

Доброго времени суток уважаемые коты! Предлагаю вашему вниманию мою первую статью. Касается она набирающему в сети популярность Propeller Clock-у. Однако я хочу предложить вам конструкцию не имеющую в своем составе часов. Почему? Отвечу кратко - часы не должны издавать какого-либо шума. С пропеллером бесшумной конструкции не получится, поэтому в качестве отображаемой информации выступают различные картинки и анимация.

Центральной частью конструкции является микроконтроллер ATMega48. Выбор пал на него, из-за его максимальной тактовой частоты - 20МГц. Вывод на светодиоды производится последовательно с помощью сдвиговых регистров 74НС164. Все картинки и анимация хранятся на карте памяти microSD. Так как память контроллера ограничена, то использование библиотек работы с файловой системой становится невозможным, в связи с этим мною был придуман особый алгоритм работы с картой. Заключается он в следующем: находящиеся на карте памяти картинки, МК никак не обрабатывает, передача данных с карточки происходит непосредственно в сдвиговые регистры. Соответственно картинки готовятся специальным образом с помощью программы. МК лишь синхронизирует передачу в зависимости от положения светодиодов.
Перейдем к схеме устройства.

Как и говорилось ранее основа - микроконтроллер АТМега48, карта памяти на 1Гб, сдвиговые регистры 74НС164, светодиоды двухцветные(зеленый-красный) HL40 - красный, HL39 - зеленый, HL38 - красный и т.д. HL40 - расположен по центру вентилятора, HL1 - на краю, фототранзистор от шариковой мышки или любой другой от какой-нибудь открытой оптопары(здесь не подойдут фотоприемники от всяких там телевизоров). Сигнал от фотодатчика подается к МК экранированным проводом. Питание карточки обеспечивает tps76333, согласование уровней с помощью резисторных делителей, токоограничительных резисторов на светодиодах нет, питание для них формируется аппаратным ШИМ, конденсатор в цепи затвора управляющего транзистора нужен для защиты светодиодов при программировании и других форс-мажорных обстоятельств. Система питания реализована с помощью воздушного трансформатора. Задающий генератор собран на 555 таймере. Силовой ключ - полевик IRF630. Сам транзистор расположен на железной планке сзади вентилятора для дополнительного обдува. Первичная и вторичная обмотки содержат примерно по 90-100 витков провода диаметром 0,35мм. В углу корпуса просверлено отверстие под инфракрасный светодиод, марка светодиода - любая. Все элементы приклеиваются термоклеем или суперклеем. Фото конструкции:

Интерфейс программы для создания рабочих файлов показан ниже:

опишу назначение различных элементов:
Импорт - импорт BMP файлов,
Свести - сводит импортированный файл на диск
Очистка - очищает диск
Стрелка - при импорте двигает/масштабирует изображение, в остальных случаях левая кнопка рисует красным, правая - зеленым цветом.
Пипетка - выбирает цвет с помощью левой и правой кнопок мыши на импортируемом изображении для последующего замещения соответственно на зеленый или красный цвет.
Стерка - стирает блок под указателем мыши
Сброс - сбрасывает цвета выбранные пипеткой на дефолтовские(зеленый и красный)
Галочка сохранять позицию и масштаб - если много одинаковых импортируемых картинок(например для анимации), то для того, чтобы каждый раз не подгонять изображение, ставим галочку.
Циферка 15 - процент наложения импортируемой картинки при котором происходит заливка блока.
Библиотека - каталог готовых сведенных картинок, можно загружать и сохранять с помощью соответствующих кнопок открыть и сохранить.
Кнопочка новый - запускает процесс создания выходного файла.
Количество повторов - количество оборотов вентилятора, при которых будет показываться текущая картинка с диска или анимация.
Добавить - добавляет текущую картинку в количестве указанном чуть выше в выходной файл.
Готово - закрывает выходной файл.
Галочка анимация - нужно поставить если хотите создать анимацию.
Добавить - добавляет текущую картинку в качестве очередного кадра анимации.
Повторов одного кадра - количество оборотов вентилятора, при которых будет показываться текущий кадр анимации.
Готово - следует нажать по завершении создания одной анимации.

Выходной файл будет создан в каталоге программы и называться my_file.dat. Этот файл необходимо будет скинуть на карту памяти. Его можно переименовать как угодно. Особенностью работы вентилятора заключается в том, что данные с карточки читаются подряд, границы файлов не воспринимаются, поэтому можно на карточку кидать множество файлов - все они будут отображаться в том порядке, в каком вы их закинули. Для того, чтобы вентилятор смог понять, что ваши картинки кончились и надо начинать чтение с начала, необходимо самым последним закинуть специальный файл - end_flash.dat. Встретив его, чтение начнется сначала. Также хочу заметить, что файл на карте памяти занимает минимум 16Кб, следовательно, для корректной работы необходимо создавать свои файлы кратным 16Кб. Один повтор картинки занимает ровно 1Кб, таким образом, указав 16 повторов одной картинки, или по 8 повторов 2-ух картинок, мы получим необходимый размер. Я думаю вы разберетесь.
Управляющая программа написана в CodeVision, выкладываю полностью проект.
Так как на форумах частенько проскакивают вопросы - а как работать с картой памяти?, то здесь я немного поясню исходный код.
Ставим на входе карты и на CS 1, ждем 10 мс, отправляем 112 тактов, ставим CS в ноль и еще ждем 20мс.

delay_ms(100);
PORTB.3=1;//DI
PORTD.3=1;//CS
delay_ms(10);
for (i=0;i<15;i++) {spi(0xFF);};
PORTD.3=0;
delay_ms(20);

отправляем команду CMD0 пока не получим ответ 0х01:

while (temp!=0x01) {
spi(0b01000000);
spi(0);
spi(0);
spi(0);
spi(0);
spi(0x95);
temp=spi(0xFF);
while (temp==0xFF) {temp=spi(0xFF);};

отправляем команду CMD1, пока не получим ответ 0х00:

while (temp!=0){
spi(0b01000001);
spi(0);
spi(0);
spi(0);
spi(0);
spi(0x95);
temp=spi(0xFF);
while (temp==0xFF) {temp=spi(0xFF);};
};

читаем в MBR номер первого сектора раздела для этого отправляем команду CMD17.
Для простоты команды отправляются следующей процедурой

char command(unsigned char com, unsigned char arg3, unsigned char arg2, unsigned char arg1, unsigned char arg0)
{
while (temp!=0){
spi(0x40+com);
spi(arg3);
spi(arg2);
spi(arg1);
spi(arg0);
spi(0xFF);
temp=spi(0xFF);
while (temp==0xFF) {temp=spi(0xFF);};
};
return temp;
}

поэтому наша команда будет выглядеть так:
command(17,0,0,0,0);
далее посылаем байты 0xFF пока не получим токен 0xFE:
while (temp!=0xFE) {temp=spi(0xFF);};
получив токен приступаем к чтению блока размером в 512 байт + 2 байта CRC:
for (k=0;k<514;k++)
{temp=spi(0xFF);
switch (k)
{case 454: pbr0=temp; break;
case 455: pbr1=temp; break;
case 456: pbr2=temp; break;v case 457: pbr3=temp; break;};
};

считаем адрес первого сектора раздела
pbr_adr=pbr3;
pbr_adr=pbr_adr<<8;
pbr_adr=pbr_adr+pbr2;
pbr_adr=pbr_adr<<8;
pbr_adr=pbr_adr+pbr1;
pbr_adr=pbr_adr<<8;
pbr_adr=pbr_adr+pbr0;
pbr_adr=pbr_adr*0x200;

читаем в PBR количество зарезервированных секторов и кол-во секторов на FAT
command(17,pbr_adr>>24,pbr_adr>>16,pbr_adr>>8,pbr_adr);
while (temp!=0xFE) {temp=spi(0xFF);}; //Token
for (k=0;k<514;k++)
{temp=spi(0xFF);
switch (k)
{case 14: z_sek0=temp; break;
case 15: z_sek1=temp; break;
case 22: count_fat0=temp; break;
case 23: count_fat1=temp; break;};
};

Далее делаем необходимые расчеты

кол-во зарезервированных секторов
z_sek=z_sek1;
z_sek=z_sek<<8;
z_sek=z_sek+z_sek0;

начальный адрес FAT
fat_adr=pbr_adr+z_sek*0x200;

кол-во секторов на FAT
count_fat=count_fat1;
count_fat=count_fat<<8;
count_fat=count_fat+count_fat0;
count_fat=count_fat*2;

начальный адрес записей каталога
dir_adr=fat_adr+count_fat*0x200;

первый сектор области данных
data_adr=dir_adr+0x4000;

data_adr3=data_adr>>24;
data_adr2=data_adr>>16;
data_adr1=data_adr>>8;
data_adr0=data_adr;

Ну вот, мы получили адрес первого сектора данных, с него и необходимо читать наши файлики. Чтение осуществляется командой CMD18. Командой CMD12 производится прерывание чтения и затем можно опять читать карточку сначала.
П.С.: я только начинающий радиолюбитель, прога под виндус вообще мое первое творение, так что возможны ошибки и недочеты, в целом все работает, буду очень рад вашим предложениям по усовершенствованию конструкции и исправлениям ошибок.

Файлы:
Прошивка МК с исходником.
Софт для компостера.
Видео работы девайса (YouTube, 1.29).

Вопросы, как обычно, складываем тут.




Как вам эта статья?

Заработало ли это устройство у вас?

36 0 0
0 4 0