Проекты с использованием дополнительных ЖКИ дисплеев меня как то не устраивали, потому что при их использовании требуется дополнительное место установки , лепка рамки и много других трудностей. К тому же у меня в автомобиле уже есть Монитор . Так что осталось состыковать Arduino с моим монитором. Вариант использования микросхемы MAX7456 нашел сразу , а вот протестировать получилось спустя несколько месяцев.
Для чего это нужно?
Для того что бы в случай умирания компа я мог управлять любыми системами автомобиля.
Например:
Панель приборов
Климат контроль
Управление навесным оборудованием, противотуманки, люк, стеклоподьемники и др.
Окочательным решением в пользу использования ArduinoVideioCard стало USB FM Radio(Arduino Radio), в случаи слета операционки или других неполадок я останусь без Радио. Для этого мной также было проделана определенная работа с arduino TouchScreen , так как перспектива использования доп кнопок меня тоже напрягала.
Перехожу к конкретике.
Микросхема OSD MAX7456 умеет накладывать хранящиеся в ней символы на любое изображение. Так же умеет формировать свою синхру и работать без видео источника. Выход микросхемы подключается к свободному видео входу на мониторе AV1 Вложение 8301
Так как я не собираюсь использовать ни каких видео источников , я настроил в скетче автоматическую синхронизацию, то есть у меня будет работать как с видео сигналом идущего с камеры так и без него.
В EEPROM OSD MAX 7456 можно нарисовать и залить любые символы и шрифты. Спасибо aptm за помощь в дорисовывании шрифтов
Заливать можно при помощи ниже выложеного скетча и программы Hiper Terminal. Скачиваеи и распаковываем файлик arduino.mcm , запускаем гипер терминал, выбираем порт на котором сидит Ардуино, скорость порта 9600. В меню программы гипертерминал выбираем пункт send to file и указываем путь к файлу arduino.mcm
PHP код:
// Code to copy a MCM font file to the Arduino + Max7456 OSD
// with PAL
// all VM0_reg commands need bit 6 set
//#define ENABLE_display 0x48
//#define ENABLE_display_vert 0x4c
//#define MAX7456_reset 0x42
//#define DISABLE_display 0x40
// SPCR = 01010000
//interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
//sample on leading edge of clk,system clock/4 rate (4 meg)
SPCR = (1<<SPE)|(1<<MSTR);
spi_junk=SPSR;
spi_junk=SPDR;
delay(250);
// force soft reset on Max7456
digitalWrite(MAX7456SELECT,LOW);
spi_transfer(VM0_reg);
spi_transfer(MAX7456_reset);
digitalWrite(MAX7456SELECT,HIGH);
delay(500);
// set all rows to same character white level, 90%
digitalWrite(MAX7456SELECT,LOW);
for (x = 0; x < MAX_screen_rows; x++)
{
spi_transfer(x + 0x10);
spi_transfer(WHITE_level_90);
}
// make sure the Max7456 is enabled
spi_transfer(VM0_reg);
spi_transfer(ENABLE_display);
digitalWrite(MAX7456SELECT,HIGH);
if (Serial.available() > 0)
{
// read the incoming byte:
incomingByte = Serial.read();
switch(incomingByte) // parse and decode mcm file
{
case 0x0d: // carridge return, end of line
//Serial.println("cr");
if (bit_count == 8 && (ascii_binary[0] == 0x30 || ascii_binary[0] == 0x31))
{
// turn 8 ascii binary bytes to single byte '01010101' = 0x55
// fill in 64 bytes of character data
character_bitmap[byte_count] = decode_ascii_binary();
byte_count++;
bit_count = 0;
}
else
bit_count = 0;
break;
case 0x0a: // line feed, ignore
//Serial.println("ln");
break;
case 0x30: // ascii '0'
case 0x31: // ascii '1'
ascii_binary[bit_count] = incomingByte;
bit_count++;
break;
default:
break;
}
}
// we have one completed character
// write the character to NVM
if(byte_count == 64)
{
write_NVM();
byte_count = 0;
font_count++;
}
// we have burned all 256 characters in NVM
if(font_count == 256)
{
font_count = 0;
// force soft reset on Max7456
digitalWrite(MAX7456SELECT,LOW);
spi_transfer(VM0_reg);
spi_transfer(MAX7456_reset);
digitalWrite(MAX7456SELECT,HIGH);
delay(500);
// display all 256 new internal MAX7456 characters
for (x = 0; x < MAX_font_rom; x++)
{
screen_buffer[x] = x;
}
count = MAX_font_rom;
write_new_screen();
Serial.println("");
Serial.println("Done with file download");
}
}
//////////////////////////////////////////////////////////////
byte spi_transfer(volatile byte data)
{
SPDR = data; // Start the transmission
while (!(SPSR & (1<<SPIF))) // Wait the end of the transmission
{
};
return SPDR; // return the received byte
}
spi_transfer(CMAH_reg); // set start address high
spi_transfer(char_address_hi);
for(x = 0; x < NVM_ram_size; x++) // write out 54 (out of 64) bytes of character to shadow ram
{
screen_char = character_bitmap[x];
spi_transfer(CMAL_reg); // set start address low
spi_transfer(x);
spi_transfer(CMDI_reg);
spi_transfer(screen_char);
}
// transfer a 54 bytes from shadow ram to NVM
spi_transfer(CMM_reg);
spi_transfer(WRITE_nvr);
// wait until bit 5 in the status register returns to 0 (12ms)
while ((spi_transfer(STAT_reg) & STATUS_reg_nvr_busy) != 0x00);
spi_transfer(VM0_reg); // turn on screen next vertical
spi_transfer(ENABLE_display_vert);
digitalWrite(MAX7456SELECT,HIGH);
}
Посмотрел цену на платане за MAX7456 - 1280.00 руб. Прямо скажем не бюджетно. Давно нашел более бюджетный вариант, правда так и не собрал http://www.batsocks.co.uk/products/S...e%20Shield.htm
Он конечно не может накладывать видео, выводит только черно-белое изображение, разрешением 38x25 символов и занимает сом порт на ардуине, но может кому пригодится (тем более, что собрать его можно рублей за 100)
12.04.2010, 18:50
Chip
Re: Видеокарта для Arduino(CarduinoVideioCard).
В ДЕЛЬТА Электронике 660руб.
Странно, я покупал за 250 руб. примерно пол года назад или возможно что-то путаю.
Видеоролик remzibi с польского заинтересовал. Только мне показалось по данным скорости - запаздывание достаточно большое.
Интересно насколько геморно сделать "проходную" железку накладывающую данные с gps приемника на несколько видеоканалов одновременно (для синхронизации роликов, если что ;)), и дающую возможность получать их и программам навигации на компьютере?
13.04.2010, 03:39
(vS)
Re: Видеокарта для Arduino(CarduinoVideioCard).
дуины точно не хвати ;)
13.04.2010, 16:03
SBorovkov
Re: Видеокарта для Arduino(CarduinoVideioCard).
да ладно, ардуина - достаточно быстрая железка. Обработать поток nmea не проблема и делается быстро, отправить текстовые данные раз в секунду на экраны - тоже не долго.
13.04.2010, 16:49
ak1976
Re: Видеокарта для Arduino(CarduinoVideioCard).
Цитата:
Сообщение от Chip
В ДЕЛЬТА Электронике 660руб.
Странно, я покупал за 250 руб. примерно пол года назад или возможно что-то путаю.
В Дельта Электронике 654.14 руб в партиях больше 5 штук, а по одной 1034.71 руб