Страница 1 из 17 123456711 ... ПоследняяПоследняя
Показано с 1 по 10 из 164

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Видеокарта для Arduino (arduinoVideioCard).

    Проекты с использованием дополнительных ЖКИ дисплеев меня как то не устраивали, потому что при их использовании требуется дополнительное место установки , лепка рамки и много других трудностей. К тому же у меня в автомобиле уже есть Монитор . Так что осталось состыковать Arduino с моим монитором. Вариант использования микросхемы MAX7456 нашел сразу , а вот протестировать получилось спустя несколько месяцев.



    Для чего это нужно?
    Для того что бы в случай умирания компа я мог управлять любыми системами автомобиля.
    Например:
    Панель приборов
    Климат контроль
    Управление навесным оборудованием, противотуманки, люк, стеклоподьемники и др.
    Окочательным решением в пользу использования ArduinoVideioCard стало USB FM Radio(Arduino Radio), в случаи слета операционки или других неполадок я останусь без Радио. Для этого мной также было проделана определенная работа с arduino TouchScreen , так как перспектива использования доп кнопок меня тоже напрягала.

    Перехожу к конкретике.
    Микросхема OSD MAX7456 умеет накладывать хранящиеся в ней символы на любое изображение. Так же умеет формировать свою синхру и работать без видео источника. Выход микросхемы подключается к свободному видео входу на мониторе AV1
    Нажмите на изображение для увеличения. 

Название:	final_misson_96x90_black.jpg 
Просмотров:	2895 
Размер:	34.4 Кб 
ID:	8301

    Так как я не собираюсь использовать ни каких видео источников , я настроил в скетче автоматическую синхронизацию, то есть у меня будет работать как с видео сигналом идущего с камеры так и без него.

    схема ArduinoVideoCard
    Нажмите на изображение для увеличения. 

Название:	max7456.png 
Просмотров:	8204 
Размер:	2.2 Кб 
ID:	8300




    Scetch для Arduino nano

    PHP код:
    #define VSYNC 2 // INT0
    #define DATAOUT 11//MOSI
    #define DATAIN  12//MISO
    #define SPICLOCK  13//sck
    #define MAX7456SELECT 10//ss


    #define DMM_reg   0x04
    #define DMAH_reg  0x05
    #define DMAL_reg  0x06
    #define DMDI_reg  0x07
    #define VM0_reg   0x00
    #define VM1_reg   0x01

    #define VIDEO_BUFFER_DISABLE 0x01
    #define MAX7456_RESET 0x02
    #define VERTICAL_SYNC_NEXT_VSYNC 0x04
    #define OSD_ENABLE 0x08
    #define SYNC_MODE_AUTO 0x00
    #define SYNC_MODE_INTERNAL 0x30
    #define SYNC_MODE_EXTERNAL 0x20
    #define VIDEO_MODE_PAL 0x40
    #define VIDEO_MODE_NTSC 0x00

    #define BLINK_DUTY_CYCLE_50_50 0x00
    #define BLINK_DUTY_CYCLE_33_66 0x01
    #define BLINK_DUTY_CYCLE_25_75 0x02
    #define BLINK_DUTY_CYCLE_75_25 0x03

    #define BLINK_TIME_0 0x00
    #define BLINK_TIME_1 0x04
    #define BLINK_TIME_2 0x08
    #define BLINK_TIME_3 0x0C

    #define BACKGROUND_BRIGHTNESS_0 0x00
    #define BACKGROUND_BRIGHTNESS_7 0x10
    #define BACKGROUND_BRIGHTNESS_14 0x20
    #define BACKGROUND_BRIGHTNESS_21 0x30
    #define BACKGROUND_BRIGHTNESS_28 0x40
    #define BACKGROUND_BRIGHTNESS_35 0x50
    #define BACKGROUND_BRIGHTNESS_42 0x60
    #define BACKGROUND_BRIGHTNESS_49 0x70

    #define BACKGROUND_MODE_GRAY 0x40

    #define CLEAR_display 0x04
    #define CLEAR_display_vert 0x06
    #define END_string 0xff
    #define ENABLE_display 0x08
    #define ENABLE_display_vert 0x0c
    #define MAX7456_reset 0x02
    #define DISABLE_display 0x00


    #define WHITE_level_80 0x03
    #define WHITE_level_90 0x02
    #define WHITE_level_100 0x01
    #define WHITE_level_120 0x00

    #define MAX_screen_size 390
    #define MAX_screen_rows 16

     
    byte spi_junkeeprom_junk;
     
    int x;
    //////////////////////////////////////////////////////////////
    void setup()
    {
      
    Serial.begin(115200);
      
    Serial.flush();

      
    pinMode(MAX7456SELECT,OUTPUT);
      
    digitalWrite(MAX7456SELECT,HIGH); 

      
    pinMode(DATAOUTOUTPUT);
      
    pinMode(DATAININPUT);
      
    pinMode(SPICLOCK,OUTPUT);
      
    pinMode(VSYNCINPUT);

      
    SPCR = (1<<SPE)|(1<<MSTR);
      
    spi_junk=SPSR;
      
    spi_junk=SPDR;
      
    delay(250);

      
    digitalWrite(MAX7456SELECT,LOW);
      
    spi_transfer(VM0_reg);
      
    spi_transfer(MAX7456_reset);
      
    digitalWrite(MAX7456SELECT,HIGH);
      
    delay(500);

      
    digitalWrite(MAX7456SELECT,LOW);
      for (
    0MAX_screen_rowsx++)
      {
        
    spi_transfer(0x10);
        
    spi_transfer(WHITE_level_90);
      }

      
    spi_transfer(VM0_reg);
        
    spi_transfer(VERTICAL_SYNC_NEXT_VSYNC|OSD_ENABLE|VIDEO_MODE_PAL);

      
    spi_transfer(VM1_reg);
      
    spi_transfer(BLINK_TIME_3);

      
    digitalWrite(MAX7456SELECT,HIGH);
      
    delay(100);
    }
     
    /////////////////////////////////////////////////////////////
    void loop()
    {
      
    OSD_write_to_screen("http://compcar.ru"210,1);
      
    OSD_write_to_screen("http://compcar.ru"220,0);
      
    OSD_write_to_screen("Привет!!!"1161,1); 
      
    OSD_write_to_screen("ПРИВЕТ!!!"1171,0);
      
    OSD_write_to_screen("http://compcar.ru"13130,1);
      
    OSD_write_to_screen("http://compcar.ru"13140,0);

      
    delay(5000);
    }
    //////////////////////////////////////////////////////////////
    byte spi_transfer(volatile byte data)
    {
      
    SPDR data;            
      while (!(
    SPSR & (1<<SPIF)))  
      {
      };
      return 
    SPDR;        
    }
    // ============================================================   
    void OSD_write_to_screen(const char s[], byte xbyte ybyte blinkbyte invert){
      
    unsigned int linepos;
      
    byte local_count;
      
    byte settingschar_address_hichar_address_lo;
      
    byte screen_char;

      
    local_count 0;

      
    char_address_hi 0;
      
    char_address_lo 0;

      
    linepos y*30+x;

      
    char_address_hi linepos >> 8;
      
    char_address_lo linepos;

      
    settings B00000001;

      if (
    blink) {
        
    settings |= (<< 4);    
      }

      if (
    invert){
        
    settings |= (<< 3);    
      }


      
    digitalWrite(MAX7456SELECT,LOW);

      
    spi_transfer(DMM_reg); 
      
    spi_transfer(settings);

      
    spi_transfer(DMAH_reg); 
      
    spi_transfer(char_address_hi);

      
    spi_transfer(DMAL_reg); 
      
    spi_transfer(char_address_lo);

      while(
    s[local_count]!='\0'
      {
        
    screen_char s[local_count];
          if(
    screen_char != 208 && screen_char != 209)
          {
            
    spi_transfer(DMDI_reg);
            
    spi_transfer(screen_char);
          }
        
    local_count++;
      }

      
    spi_transfer(DMDI_reg);
      
    spi_transfer(END_string);

      
    spi_transfer(DMM_reg); 
      
    spi_transfer(B00000000);

      
    digitalWrite(MAX7456SELECT,HIGH);

    Последний раз редактировалось Chip; 10.09.2018 в 10:51.

  2. #2
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Видеокарта для Arduino(CarduinoVideioCard).

    В 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

    #define DATAOUT 0x0b//11-MOSI
    #define DATAIN  0x0c//12-MISO 
    #define SPICLOCK  0x0d//13-sck
    #define MAX7456SELECT 0x0a //10-ss
    #define VSYNC 0x02// INT0

    //MAX7456 opcodes
    #define VM0_reg   0x00
    #define VM1_reg   0x01
    #define DMM_reg   0x04
    #define DMAH_reg  0x05
    #define DMAL_reg  0x06
    #define DMDI_reg  0x07
    #define CMM_reg   0x08
    #define CMAH_reg  0x09
    #define CMAL_reg  0x0A
    #define CMDI_reg  0x0B
    #define STAT_reg  0xA0

    //MAX7456 commands
    #define CLEAR_display 0x04
    #define CLEAR_display_vert 0x06
    #define END_string 0xff
    #define WRITE_nvr 0xa0
    // with NTSC
    #define ENABLE_display 0x08
    #define ENABLE_display_vert 0x0c
    #define MAX7456_reset 0x02
    #define DISABLE_display 0x00

    // 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

    #define WHITE_level_80 0x03
    #define WHITE_level_90 0x02
    #define WHITE_level_100 0x01
    #define WHITE_level_120 0x00

    #define MAX_font_rom 0xff
    #define STATUS_reg_nvr_busy 0x20
    #define NVM_ram_size 0x36

    // with NTSC
    #define MAX_screen_rows 0x0d //13

    // with PAL
    //#define MAX_screen_rows 0x10 //16

    volatile byte screen_buffer[MAX_font_rom];
    volatile byte character_bitmap[0x40];
    volatile byte ascii_binary[0x08];

    volatile byte bit_count;
    volatile byte byte_count;
    volatile int font_count;
    volatile int  incomingByte;
    volatile int  count;


    //////////////////////////////////////////////////////////////
    void setup()
    {
      
    byte spi_junk;
      
    int x;
      
    Serial.begin(9600);
      
    Serial.flush();

      
    pinMode(MAX7456SELECT,OUTPUT);
      
    digitalWrite(MAX7456SELECT,HIGH); //disable device

      
    pinMode(DATAOUTOUTPUT);
      
    pinMode(DATAININPUT);
      
    pinMode(SPICLOCK,OUTPUT);
      
    pinMode(VSYNCINPUT);

      
    // 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 (
    0MAX_screen_rowsx++)
      {
        
    spi_transfer(0x10);
        
    spi_transfer(WHITE_level_90);
      }

      
    // make sure the Max7456 is enabled
      
    spi_transfer(VM0_reg);
      
    spi_transfer(ENABLE_display);
      
    digitalWrite(MAX7456SELECT,HIGH);

      
    incomingByte 0;
      
    count 0;
      
    bit_count 0;
      
    byte_count 0;
      
    font_count 0;

      
    //display all 256 internal MAX7456 characters
      
    for (0MAX_font_romx++)
      {
        
    screen_buffer[x] = x;
      }
       
    count MAX_font_rom;
       
    write_new_screen();  

      
    Serial.println("Ready for text file download");
      
    Serial.println("");
      
    delay(100);  
    }

    //////////////////////////////////////////////////////////////
    void loop()
    {
      
    byte x;
      
      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 == && (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 (0MAX_font_romx++)
       {
          
    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
    }

    //////////////////////////////////////////////////////////////
    void write_new_screen()
    {
      
    int xlocal_count;
      
    byte char_address_hichar_address_lo;
      
    byte screen_char;
      
      
    local_count count;
      
      
    char_address_hi 0;
      
    char_address_lo 60// start on third line
     //Serial.println("write_new_screen");   

      // clear the screen
      
    digitalWrite(MAX7456SELECT,LOW);
      
    spi_transfer(DMM_reg);
      
    spi_transfer(CLEAR_display);
      
    digitalWrite(MAX7456SELECT,HIGH);

      
    // disable display
      
    digitalWrite(MAX7456SELECT,LOW);
      
    spi_transfer(VM0_reg); 
      
    spi_transfer(DISABLE_display);

      
    spi_transfer(DMM_reg); //dmm
      //spi_transfer(0x21); //16 bit trans background
      
    spi_transfer(0x01); //16 bit trans w/o background

      
    spi_transfer(DMAH_reg); // set start address high
      
    spi_transfer(char_address_hi);

      
    spi_transfer(DMAL_reg); // set start address low
      
    spi_transfer(char_address_lo);

      
    0;
      while(
    local_count// write out full screen
      
    {
        
    screen_char screen_buffer[x];
        
    spi_transfer(DMDI_reg);
        
    spi_transfer(screen_char);
        
    x++;
        
    local_count--;
      }

      
    spi_transfer(DMDI_reg);
      
    spi_transfer(END_string);

      
    spi_transfer(VM0_reg); // turn on screen next vertical
      
    spi_transfer(ENABLE_display_vert);
      
    digitalWrite(MAX7456SELECT,HIGH);
    }

    //////////////////////////////////////////////////////////////
    byte decode_ascii_binary()
    {
      
    byte ascii_byte;

      
    ascii_byte 0;
      
      if (
    ascii_binary[0] == 0x31// ascii '1'
        
    ascii_byte ascii_byte 128;

      if (
    ascii_binary[1] == 0x31)
        
    ascii_byte ascii_byte 64;

      if (
    ascii_binary[2] == 0x31)
        
    ascii_byte ascii_byte 32;

      if (
    ascii_binary[3] == 0x31)
        
    ascii_byte ascii_byte 16;

      if (
    ascii_binary[4] == 0x31)
        
    ascii_byte ascii_byte 8;

      if (
    ascii_binary[5] == 0x31)
        
    ascii_byte ascii_byte 4;

      if (
    ascii_binary[6] == 0x31)
        
    ascii_byte ascii_byte 2;

      if (
    ascii_binary[7] == 0x31)
        
    ascii_byte ascii_byte 1;

      
    //Serial.print(ascii_byte, HEX);

      
    return(ascii_byte);
    }

    //////////////////////////////////////////////////////////////
    void write_NVM()
    {
      
    byte x;
      
    byte char_address_hichar_address_lo;
      
    byte screen_char;

      
    char_address_hi font_count;
      
    char_address_lo 0;
     
    //Serial.println("write_new_screen");   

      // disable display
      
    digitalWrite(MAX7456SELECT,LOW);
      
    spi_transfer(VM0_reg); 
      
    spi_transfer(DISABLE_display);

      
    spi_transfer(CMAH_reg); // set start address high
      
    spi_transfer(char_address_hi);

      for(
    0NVM_ram_sizex++) // 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);  

    Проконвертировать шрифты можно здесь
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	ArduinoFont.png 
Просмотров:	1275 
Размер:	4.5 Кб 
ID:	11646  
    Вложения Вложения
    Последний раз редактировалось Chip; 08.12.2011 в 20:03.

  3. #3
    Местный
    Регистрация
    04.06.2008
    Сообщений
    120
    Вес репутации
    397

    По умолчанию Re: Видеокарта для Arduino(CarduinoVideioCard).

    Посмотрел цену на платане за MAX7456 - 1280.00 руб. Прямо скажем не бюджетно. Давно нашел более бюджетный вариант, правда так и не собрал http://www.batsocks.co.uk/products/S...e%20Shield.htm
    Он конечно не может накладывать видео, выводит только черно-белое изображение, разрешением 38x25 символов и занимает сом порт на ардуине, но может кому пригодится (тем более, что собрать его можно рублей за 100)

  4. #4
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Видеокарта для Arduino(CarduinoVideioCard).

    В ДЕЛЬТА Электронике 660руб.
    Странно, я покупал за 250 руб. примерно пол года назад или возможно что-то путаю.
    Последний раз редактировалось Chip; 12.04.2010 в 20:13.

  5. #5
    Местный
    Регистрация
    04.06.2008
    Сообщений
    120
    Вес репутации
    397

    По умолчанию Re: Видеокарта для Arduino(CarduinoVideioCard).

    Цитата Сообщение от Chip Посмотреть сообщение
    В ДЕЛЬТА Электронике 660руб.
    Странно, я покупал за 250 руб. примерно пол года назад или возможно что-то путаю.
    В Дельта Электронике 654.14 руб в партиях больше 5 штук, а по одной 1034.71 руб

  6. #6
    Пользователь
    Регистрация
    26.03.2008
    Возраст
    41
    Сообщений
    24
    Вес репутации
    209

    По умолчанию Re: Видеокарта для Arduino(CarduinoVideioCard).

    А MAX7456 можно заменить вот этим?

  7. #7
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Видеокарта для Arduino(CarduinoVideioCard).

    Ну так это и есть MAX7456

  8. #8
    Продвинутый Аватар для aptm
    Регистрация
    01.09.2007
    Сообщений
    341
    Вес репутации
    366

    По умолчанию Re: Видеокарта для Arduino(CarduinoVideioCard).

    Видеоролик remzibi с польского заинтересовал. Только мне показалось по данным скорости - запаздывание достаточно большое.
    Интересно насколько геморно сделать "проходную" железку накладывающую данные с gps приемника на несколько видеоканалов одновременно (для синхронизации роликов, если что ), и дающую возможность получать их и программам навигации на компьютере?
    Последний раз редактировалось aptm; 13.04.2010 в 03:36.

  9. #9
    Гуру Аватар для (vS)
    Регистрация
    18.06.2007
    Возраст
    46
    Сообщений
    1,981
    Вес репутации
    692

    По умолчанию Re: Видеокарта для Arduino(CarduinoVideioCard).

    Цитата Сообщение от Chip Посмотреть сообщение
    Ресурсов вполне хватит, потому как всю работу выполняет MAX7456


    PS
    Еще можно использовать для разметки камеры ЗХ и для индикации растояния парковочного радара
    читай внимательно

    Цитата Сообщение от aptm Посмотреть сообщение
    Видеоролик remzibi с польского заинтересовал. Только мне показалось по данным скорости - запаздывание достаточно большое.
    Интересно насколько геморно сделать "проходную" железку накладывающую данные с gps приемника на несколько видеоканалов одновременно (для синхронизации роликов, если что ), и дающую возможность получать их и программам навигации на компьютере?
    автоMOBILEвый моDDEр
    мой карпутер второй очередной

  10. #10
    Гуру Аватар для (vS)
    Регистрация
    18.06.2007
    Возраст
    46
    Сообщений
    1,981
    Вес репутации
    692

    По умолчанию Re: Видеокарта для Arduino(CarduinoVideioCard).

    дуины точно не хвати
    автоMOBILEвый моDDEр
    мой карпутер второй очередной

Страница 1 из 17 123456711 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 3 (пользователей: 0 , гостей: 3)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •