Урок 68. Практическое программирование OSD-контроллера MAX7456 в системе Ардуино. Создание и загрузка шрифтов, вывод информации на экран.

Программирование MAX7456

Урок посвящен практическому программированию OSD-контроллера MAX7456. Научимся создавать и загружать шрифты, выводить OSD-информацию на экран монитора.

Предыдущий урок     Список уроков     Следующий урок

Для проверки и отладки программ урока я собрал систему из урока 66. Она состоит из:

  • платы Arduino Nano;
  • модуля MAX7456 (схема модуля в уроке 66);
  • видеокамеры;
  • автомобильного монитора;
  • блока питания 12 В.

Собранная система

Плата Ардуино подключена стандартным кабелем к USB компьютера, от которого и получает питание. Модуль MAX7456 получает питание от платы. Видеокамера и автомобильный монитор запитаны от блока питания 12 В.

Должна быть установлена библиотека MAX7456.h. Я использовал исправленный вариант:

 Зарегистрируйтесь и оплатите. Всего 25 руб. в месяц за доступ ко всем ресурсам сайта! 

Он корректно работает с таблицей символов ASCII и русскими шрифтами.

 

Создание файла шрифта.

Перед тем как использовать микросхему MAX7456 в ее EEPROM необходимо загрузить знакогенератор.

От фирмы-призводителя микросхема поступает с таким знакогенератором.

Шрифт

Вряд ли читателей моего сайта устроят надписи в виде иероглифов. Да и остальные символы не соответствуют кодировке ASCII. Некоторые функции библиотеки правильно работать не будут.

Прежде всего, необходимо создать файл шрифтов, которые будут загружены в память знакогенератора. Естественно можно взять готовый.

Для файлов шрифтов OSD-генератора MAX7456 обычно используются два формата: mcm и h.

Файлы mcm формата используются в программном обеспечении фирмы Maxim. Файлы такого типа представляют собой последовательность данных в текстовом двоичном виде.

Формат mcm файла

mcm-файлы используются для загрузки знакогенератора непосредственно от компьютера.

Если знакогенератор загружается из платы Ардуино, то, как правило, применяется заголовочный файл с расширением .h. Он включается в программу загрузчика шрифта (#include "MAX7456_Font.h"). Данные файла при компиляции размещаются в программной памяти (FLASH) микроконтроллера с использованием модификатора PROGMEM. В оперативной памяти просто не хватает места. Об этом способе хранения данных написано в уроке 27.

Далее запускается программа Ардуино и данные шрифта загружаются из программной памяти микроконтроллера в EEPROM знакогенератора MAX7456.

Выглядит содержимое h-файла так.

Формат h файла

Чтобы использовать все возможности MAX7456 необходимо научиться применять готовые файлы форматов mcm и h, конвертировать их друг в  друга и редактировать информацию файлов, т.е. создавать свои собственные символы.

 

Все это с легкостью можно делать с помощью программы MAX7456 Font Editor. Программа с открытым кодом, размещена на GitHub. Можно загрузить исполняемые модули здесь MAX4756Editor.zip.

Программа проста в использовании. Я поясню совсем коротко.

Запускаете файл MaxFontEditor.exe.

Редактор шрифтов

Везде пустые поля.

Кнопкой OPEN можно загрузить файл шрифта в форматах mcm или h. В правом поле появляются изображения символов знакогенератора.

Редактор шрифтов

Правой кнопкой мыши можно выбрать любой символ. Его карта появится в левом поле.

Редактор шрифтов

Выбрав один из цветов в верхнем левом поле,

Выбор цвета

можно задать цвет каждого пикселя карты символа.

  • Синий означает, что пиксель будет прозрачным, те. для него используется фоновое изображение.
  • Белый и черный – цвета отображения пикселя символа.

После редактирования файл шрифта можно сохранить:

  • в формате mcm – SAVE AS MCM;
  • или в формате h – SAVE AS H.

Можно загрузить файл в одном формате, а сохранить в другом. Т.е. конвертировать форматы файлов.

Кнопки IMPORT IMAGE и EXPORT IMAGE позволяют редактировать битовые карты символов в других растровых редакторах и загружать их в MaxFontEditor. Я думаю, что без этой операции можно обойтись.

Исходно в микросхему MAX7456 на заводе изготовителе записан такой знакогенератор.

b.mcm     b.h

Исходный шрифт

Я буду использовать знакогенератор с кириллицей согласно кодировке ASCII.

r.mcm     r.h

Шрифт с кириллицей

 

Загрузка знакогенератора в MAX7456.

Я попробовал для записи шрифта использовать загрузчик фирмы Maxim MAX7456_Font_Updater.rar. Загрузить все символы правильно не удалось ни разу. В 2-5 местах у соседних символов коды повторялись. Программа регулярно сбоила.

Написал свой загрузчик знакогенератора:

 Зарегистрируйтесь и оплатите. Всего 25 руб. в месяц за доступ ко всем ресурсам сайта! 

Работает идеально.

В папке должен находиться, как минимум:

  • файл MAX7456_Font_Loader.ino
  • и файл шрифта в h формате.

Пакет файлов загрузчика

В файле шрифта имя массива данных должно быть fontdata.

PROGMEM const byte fontdata[16384] = {

В загрузчике MAX7456_Font_Loader.ino должен быть включен файл шрифта с нужным именем:

#include "r.h"

Мой пакет настроен на загрузку знакогенератора с кириллическим символами ASCII кодировки r.h

шрифт с кириллицей

Я использую именно этот знакогенератор.

 

Последовательность действий для загрузки знакогенератора MAX7456.

Установить библиотеку max7456-master_1.zip

 Зарегистрируйтесь и оплатите. Всего 25 руб. в месяц за доступ ко всем ресурсам сайта! 

Загрузить, распаковать пакет MAX7456_Font_Loader.zip

 Зарегистрируйтесь и оплатите. Всего 25 руб. в месяц за доступ ко всем ресурсам сайта! 

С помощью Aduino IDE загрузить MAX7456_Font_Loader.ino в плату Ардуино.

Открыть монитор последовательного порта (Ctrl + Shift + M).

На OSD-мониторе отобразится таблица текущего шрифта.

Текущий знакогенератор

В окне монитора последовательного порта будет

Сообщение

Если желание загрузить новый шрифт осталось, то необходимо отправить символ 'y'.

После этого начнется загрузка нового знакогенератора в EEPROM MAX7456.

В окне монитора побегут числа от 0 до 255 и появится надпись Upload finished (Загрузка закончена).

Сообщение загрузчика

На OSD мониторе отобразится новый, только что загруженный шрифт.

Текущий знакогенератор

 

Программирование OSD-дисплея MAX7456.

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

Все достаточно просто и, скорее всего, было понятно и в предыдущем уроке при описании функций библиотеки MAX7456. Я приведу конкретные примеры.

Очистим экран (заполним пробелами), выведем надписи ”mypractic.ru” и “Проверка MAX7456”.

 Зарегистрируйтесь и оплатите. Всего 25 руб. в месяц за доступ ко всем ресурсам сайта! 

#include <SPI.h>
#include <max7456.h>

Max7456 osd;

void setup() {
  SPI.begin();
  osd.init(10);
  osd.activateOSD();

  // очистка экрана (заполнение пробелами)
  for(int i=0; i<480; i++) {
    osd.printMax7456Char(' ', i >> 4, i & 0x0f );
  }
  osd.print("mypractic.ru", 16, 14);

  osd.print("Проверка MAX7456",6,2);
}

void loop() {
}

Проверка вывода текста

Отделим заголовок горизонтальной чертой. Нарисуем ее символами с кодом 0xda.

 Зарегистрируйтесь и оплатите. Всего 25 руб. в месяц за доступ ко всем ресурсам сайта! 

#include <SPI.h>
#include <max7456.h>

Max7456 osd;

void setup() {
SPI.begin();
osd.init(10);
osd.activateOSD();

// очистка экрана (заполнение пробелами)
  for(int i=0; i<480; i++) {
    osd.printMax7456Char(' ', i >> 4, i & 0x0f );
  }
  osd.print("mypractic.ru", 16, 14);

  osd.print("Проверка MAX7456",6,2); // вывод текста

  for(int i=0; i<30; i++) { // подчеркивание
    osd.printMax7456Char(0xda, i, 3 );
  }
}

void loop() {
}

Добавили подчеркивание

Добавим строку с числами.

 Зарегистрируйтесь и оплатите. Всего 25 руб. в месяц за доступ ко всем ресурсам сайта! 

Для этого добавим в конце setup()

// строка с числами
osd.print(12.3456789,2,5, 3, 8);
osd.print(12.3456789,15,5, 2, 1);
osd.print(12.3456789,20,5, 2, 0);

Вывод чисел

Добавим обычную строку, инверсную строку и мигающую строку.

 Зарегистрируйтесь и оплатите. Всего 25 руб. в месяц за доступ ко всем ресурсам сайта! 

osd.print("Обычная строка", 2, 7); // обычная строка
osd.print("Инверсная строка", 2, 9, 0, 1); // инверсная строка
osd.print("Мигающая строка", 2, 11, 1, 0); // мигающая строка

Вывод строк с разными атрибутами

Отключим фоновое изображение. Превратим MAX7456 в обычный видеоконтроллер. Все новые строки добавляем в конце setup().

 Зарегистрируйтесь и оплатите. Всего 25 руб. в месяц за доступ ко всем ресурсам сайта! 

osd.activateExternalVideo(false); // отключение фонового изображения

Отключение фонового изображения

Включим фоновое изображение и отключим OSD-текст.

 Зарегистрируйтесь и оплатите. Всего 25 руб. в месяц за доступ ко всем ресурсам сайта! 

Вместо

osd.activateExternalVideo(false); // отключение фонового изображения

поставим

osd.activateOSD(false); // отключение OSD-текста

Отключение текста

Проверим смещение. Заставим изображение двигаться в горизонтальном и вертикальном направлениях.

 Зарегистрируйтесь и оплатите. Всего 25 руб. в месяц за доступ ко всем ресурсам сайта! 

#include <SPI.h>
#include <max7456.h>

Max7456 osd;

void setup() {
SPI.begin();
osd.init(10);
osd.activateOSD();

  // очистка экрана (заполнение пробелами)
  for(int i=0; i<480; i++) {
    osd.printMax7456Char(' ', i >> 4, i & 0x0f );
  }
  osd.print("mypractic.ru", 16, 14);

  osd.print("Проверка MAX7456",6,2); // вывод текста

  for(int i=0; i<30; i++) { // подчеркивание
    osd.printMax7456Char(0xda, i, 3 );
  }

  // строка с числами
  osd.print(12.3456789,2,5, 3, 8);
  osd.print(12.3456789,15,5, 2, 1);
  osd.print(12.3456789,20,5, 2, 0);

  osd.print("Обычная строка", 2, 7); // обычная строка
  osd.print("Инверсная строка", 2, 9, 0, 1); // инверсная строка
  osd.print("Мигающая строка", 2, 11, 1, 0); // мигающая строка
}

void loop() {
  // проверка смещения
  for(byte n=0; n<3; n++) {
    for( byte i=0; i<32; i++ ) {
      osd.setDisplayOffsets(32, i);
      delay(10);
  }
    for( byte i=31; i!=0; i-- ) {
      osd.setDisplayOffsets(32, i);
      delay(10);
    }
  }

  for(byte n=0; n<3; n++) {
    for( byte i=0; i<64; i++ ) {
      osd.setDisplayOffsets(i, 16);
      delay(10);
    }
    for( byte i=63; i!=0; i-- ) {
      osd.setDisplayOffsets(i, 16);
      delay(10);
    }
  }
}

Качество видео оставляет желать лучшего.

Напишем простейший монитор. Он принимает символы с последовательного порта и выводит их на экран монитора. Из управляющих кодов он обрабатывает коды 13 – возврат каретки и 10 – перевод строки.

 Зарегистрируйтесь и оплатите. Всего 25 руб. в месяц за доступ ко всем ресурсам сайта! 

include <SPI.h>
#include <max7456.h>

Max7456 osd;
int x=0,y=0;

void setup() {
Serial.begin(9600);
SPI.begin();
osd.init(10);
osd.activateOSD();

// очистка экрана (заполнение пробелами)
  for(int i=0; i<480; i++) {
    osd.printMax7456Char(' ', i >> 4, i & 0x0f );
  }
}

void loop() {

  if( Serial.available() != 0 ) {
    byte ccc= (byte)Serial.read();
    if( ccc == 13 ) x=0;
    else if( ccc == 10 ) y++;
    else {
      osd.printMax7456Char(ccc, x, y);
      x++;
      if(x > 29) {
        x=0;
        y++;
      }
    }
  }
}

Монитор

Кириллические символы монитор выводит неправильно. Не соответствует кодировка знакогенератора.

 

Работа MAX7456 с разными системами видеосигналов.

В микросхеме MAX7456 существует возможность выбора системы аналогового видеосигнала: NTSC или PAL. В исходной библиотеке Max7456.h метод для выбора системы отсутствует. Я добавил его в новой версии:

 Зарегистрируйтесь и оплатите. Всего 25 руб. в месяц за доступ ко всем ресурсам сайта! 

Описание в предыдущем уроке.

При неправильно установленной системе OSD-генератор работает некорректно. Может все смещаться на экране, информация может вообще не отображаться.

Еще надо учитывать, что в системе NTSC строк меньше, чем в PAL, значит меньше разрешение экрана. Лучше вывод информации подбирать на конкретной камере и дисплее.

 

 

Надеюсь, я сумел убедить вас, что работать с OSD-контроллером очень просто.

Предыдущий урок     Список уроков     Следующий урок

0

Автор публикации

не в сети 16 часов

Эдуард

2
Комментарии: 1102Публикации: 122Регистрация: 13-12-2015

4 комментария на «Урок 68. Практическое программирование OSD-контроллера MAX7456 в системе Ардуино. Создание и загрузка шрифтов, вывод информации на экран.»

  1. C интересом прочитал незнакомую для меня тему — спасибо за простое и понятное изложение.

    0
  2. Добрый день, Эдуард!

    Ваши уроки — это большой труд, читать их одно удовольствие. Спасибо.

    Тема OSD на мой взгляд достаточно узко специализированная, особенно для PAL/NTSC форматов (стремительно устаревают). В этой связи у меня вопрос, если сочтёте корректным ответить, а как применяет это решение Ваш заказчик, на каком устройстве использует OSD?

    0
    • Здравствуйте!
      Я разрабатывал ему программу для точного сверлильного станка. Выяснилось, что тяжело попадать сверлом в метку для будущего отверстия. С помощью OSD генератора мы сделали электронный прицел. В будущем планируется выводить на этот же экран информацию контроллера станка, которая сейчас отображается на отдельном дисплее.

      0

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *