Игровая ТВ-приставка на Arduino. Часть 1

Новый подход к созданию игровой ТВ-приставки на основе платы Arduino. Узнайте, как использовать библиотеку TVOut для вывода информации на экран телевизора.

Как использовать плату Arduino для вывода какой-либо информации  на ТВ?  Оказывается есть такая библиотека TVOut ( статья на сайте >> ), которая позволяет выводить информацию на ТВ по НЧ-кабелю (тюльпан). Правда изображение будет черно-белым, однако  этого будет достаточно для большинства проектов.  

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

Игровая ТВ-приставка на Arduino

Сайт проекта https://nootropicdesign.com/hackvision/index.html
Цена платы $43.95.
 
Создадим свою ТВ-приставку, состоящую из Arduino-платы и 2-хкоординатного джойстика и напишем простенькую игру.
Вот вид нашей приставки

Игровая ТВ-приставка на Arduino

И схема

Игровая ТВ-приставка на Arduino

Ознакомимся с возможностями библиотеки и напишем игру.
Страница библиотеки — https://code.google.com/p/arduino-tvout
Здесь можно скачать библиотеку и посмотреть описание функций.
Библиотека использует следующие выводы Arduino

Плата    SYNC   VIDEO   AUDIO

Decimilia,
Uno, Nano   9   7   11

Mega   11   A7(D29)   10

Рассмотрим основные функции библиотеки.

Функции установки режима

Функция begin() инициализирует вывод видеосигнала (разрешение экрана по умолчанию 128×96)
Синтаксис:

  •    TVOut.begin(mode);
  •    TVOut.begin(mode, x, y);

Параметры:

  •    mode — стандарт видеосигнала:
  •    _PAL — режим PAL;
  •    _NTSC — режим NTSC.

Возвращаемое значение:

  •    0 — в случае удачного соединения, 4 — в случае неудачи (недостаточно памяти для буфера вывода).

Функции задержки

Функция delay() осуществляет задержку выведенного изображения.
Синтаксис:

  •    TVOut.delay(ms);

Параметры:

  •    ms — задержка в мс с точностью: 20 мс для PAL и 16 мс для NTSC.

Функция delay_frame() осуществляет задержку выведенного изображения.
Синтаксис:

  •    TVOut.delay_frame(frames);

Параметры:

  •    frames — количество кадров для задержки..

Функция полезна для сведения к минимуму или устранения на мерцание экрана, вызванные обновлением экрана.

Функции получения параметров

Функция hres() возвращает горизонтальное разрешение экрана.
Синтаксис:

  •    TVOut.hres();

Параметры:

  •    нет.

Возвращаемое значение:

  •    unsigned char — горизонтальное разрешение экрана.

Функция vres() возвращает вертикальное разрешение экрана.
Синтаксис:

  •    TVOut.vres();

Параметры:

  •    нет.

Возвращаемое значение:

  •    unsigned char — вертикальное разрешение экрана.

Функция char_line() возвращает максимально возможное количество символов в одной строке при выводе текстовой информации.
Синтаксис:

  •    TVOut. char_line();

Параметры:

  •    нет.

Возвращаемое значение:

  •    unsigned char — количество символов.

Основные графические функции

Функция set_pixel() устанавливает цвет пикселя экрана в точке с заданными координатами.
Синтаксис:

  •    TVOut.set_pixel(x,y,color);

Параметры:

  •    x,y — координаты пикселя;
  •    color — цвет пикселя:
  •    0 — черный;
  •    1 — белый;
  •    2 — инвертировать цвет.

Функция get_pixel() получает цвет пикселя экрана из точки с заданными координатами.
Синтаксис:

  •    TVOut.get_pixel(x,y);

Параметры:

  •    x,y — координаты пикселя.

Возвращаемое значение:

  •    color — цвет пикселя: 
  •    0 — черный;
  •    1 — белый;
  •    2 — инвертировать цвет.

Функция fill() заполняет  экран заданным цветом.
Синтаксис:

  •    TVOut.fill(color);

Параметры:

  •    color — цвет заполнения: 
  •    0 — черный;
  •    1 — белый;
  •    2 — инвертировать цвет.

Функция clear_screen() очищает  экран, заполняя заданным цветом.
Синтаксис:

  •    TVOut.clear_screen(color);

Параметры:

  •  color — цвет заполнения: 
  •    0 — черный;
  •    1 — белый;
  •    2 — инвертировать цвет.

Функция invert() инвертирует содержимое экрана.
Синтаксис:

  •    TVOut.invert();

Параметры:

  •    нет.

Функция shift_direction() сдвигает содержимое экрана.
Синтаксис:

  •    TVOut.shift_direction(distance, direction);

Параметры:

  •    distance — расстояние для сдвига содержимого экрана.
  •    direction — направление сдвига: 
  •    UP=0 — вверх;
  •    DOWN=1 — вниз;
  •    LEFT=2 — влево;
  •    RIGHT=3 — вправо.

Функция draw_line() соединяет на экране линией две точки.
Синтаксис:

  •    TVOut.draw_line(x0,y0,x1,y1,color);

Параметры:

  •    x0,y0 —  координаты первой точки;
  •    x1,y1 —  координаты второй точки;
  •    color — цвет заполнения: 
  •    0 — черный;
  •    1 — белый;
  •    2 — инвертировать цвет.

Функция draw_row() заполняет строку указанным цветом между двумя точками строки.
Синтаксис:

  •    TVOut.draw_row(row,x0,x1,color);

Параметры:

  •    row —  вертикальная координата строки;
  •    x1,x2 —  горизонтальный координаты точек строки;
  •    color — цвет заполнения: 
  •    0 — черный;
  •    1 — белый;
  •    2 — инвертировать цвет.

Функция draw_column() заполняет строку указанным цветом между двумя точками столбца.
Синтаксис:

  •    TVOut.draw_column(column,y0,y1,color);

Параметры:

  •    column —  горизонтальная координата столбца;
  •    y1,y2 —  вертикальные координаты точек столбца;
  •    color — цвет заполнения: 
  •    0 — черный;
  •    1 — белый;
  •    2 — инвертировать цвет.

Функция draw_rect() рисует на экране прямоугольник.
Синтаксис:

  •    TVOut.draw_rect(x,y,w,h,color);
  •    TVOut.draw_rect(x,y,w,h,color,fillcolor);

Параметры:

  •    x,y —  координаты левой верхней точки;
  •    w,h —  ширина и высота рисуемого прямоугольника;
  •    color — цвет границ прямоугольника: 
  •    0 — черный;
  •    1 — белый;
  •    2 — инвертировать цвет.
  •    fillcolor — цвет заполнения прямоугольника: 
  •    0 — черный;
  •    1 — белый;
  •    2 — инвертировать цвет.

Функция draw_circle() рисует на экране круг.
Синтаксис:

  •    TVOut.draw_ circle(x,y,r,color);
  •    TVOut.draw_ circle(x,y,r,color,fillcolor);

Параметры:

  •    x,y —  координаты центра круга;
  •    r —  радиус круга;
  •    color — цвет границ круга: 
  •    0 — черный;
  •    1 — белый;
  •    2 — инвертировать цвет.
  •    fillcolor — цвет заполнения круга: 
  •    0 — черный;
  •    1 — белый;
  •    2 — инвертировать цвет.

Функция bitmap() выводит на экран растровое изображение.
Синтаксис:

  •    TVOut.bitmap(x,y,bmp,w,h);

Параметры:

  •    x,y —  координаты левого верхнего угла точки вывода;
  •    bmp — указатель на массив памяти, где хранится картинка;
  •    w,h —  ширина, высота выводимого изображения;

Ниже рассмотрим процесс создания кода выводимых растровых изображений. 

Функции вывода текстовой информации

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

  •    font4x6;
  •    font6x8;
  •    font8x8;
  •    font8x8ext.

Функция select_font() выбирает шрифт для вывода текстовой информации.
Синтаксис:

  •    TVOut.select_font(font);

Параметры:

  •    font —  шрифт, подключенный в скетче.

Функция print_char() выводит символ на экран.
Синтаксис:

  •    TVOut.print_char(x,y,char);

Параметры:

  •    x,y —  позиция на экране для вывода символа;
  •    char — символ из текущего шрифта.

Функция set_cursor() устанавливает позицию курсора для вывода текстовой информации на экран.
Синтаксис:

  •    TVOut.set_cursor(x,y);

Параметры:

  •    x,y —  координаты для курсора.

Функция print() выводит на экран строку, символ или число.
Синтаксис:

  •    TVOut.print(x,y,string);
  •    TVOut.print(x,y,char,base);
  •    TVOut.print(x,y,int,base).

Параметры:

  •    x,y —  координаты курсора.
  •    base — формат вывода:
  •    BYTE = 0;
  •    DEC = 10 (default);
  •    HEX = 16.

Функция println() выводит на экран строку, символ или число и в конце символ перевода строки:
Синтаксис:

  •    TVOut.println(x,y,string);
  •    TVOut.println(x,y,char,base);
  •    TVOut.println(x,y,int,base).

Параметры:

  •    x,y —  координаты курсора.
  •    base — формат вывода:
  •    BYTE = 0;
  •    DEC = 10 (default);
  •    HEX = 16.

 

Функции вывода  аудио

Функции вывода звука позволяют отправлять на телевизор через аудиовыход сигнал определенной частоты. 
Функция tone() выдает аудиосигнал определенной частоты.
Синтаксис:

  •    TVOut.tone(frequency,duration);
  •    TVOut.tone(frequency).

Параметры:

  •    frequency —  частота аудиосигнала;
  •    duration — длительность сигнала.

Функция noTone() прекращает выдачу аудиосигнала.
Синтаксис:

  •    TVOut.noTone().

 

Создание собственных шрифтов

Рассмотрим процесс создания пользовательских шрифтов для библиотеки TVOut.

Библиотека позволяет создавать собственные шрифты.
Существуют два вида шрифтов — фиксированной и переменной ширины. Для шрифтов фиксированной ширины первые три байта массива  содержат данные о ширине символа (4), высоте символа (6) и первый печатный символ (32) . Затем идут данные для каждого последующего символа. 

#include «myfont1.h»
PROGMEM const unsigned char myfont1[] = {
4,6,32,
//
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
//
0b01000000,
0b01000000,
0b01000000,
0b00000000,
0b01000000,
0b00000000,
… …
};

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

#include «myfont1.h»

PROGMEM const unsigned char myfont1[] = {
4,6,32,
//
2,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
//
3,
0b01000000,
0b01000000,
0b01000000,
0b00000000,
0b01000000,
0b00000000,
… …
};

Создадим пользовательский шрифт myfont1. Для пользовательского шрифта myfont1 в папке TVOutfonts создаем 2 файла: myfont1.h и myfont1.cpp.
Вот содержимое файла myfont1.h

 

#ifndef MYFONT1_h
#define MYFONT1_h
#include
extern const unsigned char myfont1[];
#endif

 

Теперь для использования библиотекой TVOut нашего пользовательского шрифта myfont1 в скетче необходимо подключить файл 

#include «myfont1.h»

Создание графических примитивов.

Библиотека TVOut позволяет загружать на экран растровые изображения. Рассмотрим создание кода для загрузки растрового изображения функцией bitmap() библиотеки TVOut.

Сначала необходимо создать 1 битное (2-хцветное изображение), например в графическом редакторе Paint.  

Игровая ТВ-приставка на Arduino

Затем нам понадобится программа Image2Code, которая сконвертирует из нашего изображения код. Программу можно скачать по адресу https://sourceforge.net/projects/image2code/files/. Это версия для операционной системы Windows. Скачиваем, запускаем.
 

Игровая ТВ-приставка на Arduino

Нажимаем на кнопку Convert и получаем массив. 

Игровая ТВ-приставка на Arduino

Далее создаем 2 файла. Первый c расширением .h, например MyBitmap1.h.
 

# include
# ifndef MYBITMAP1_H
# define MYBITMAP1_H
extern const unsigned char MyBitmap1[];
#endif

Далее создаем файл MyBitmap1.cpp , в него (в поле данных массива unsigned char MyBitmap1[]) копируем данные конвертации, убирая символы «{» и  «}», и  вставляя в начале ширину и высоту изображения в пикселах.

#include » MyBitmap1.h»
PROGMEM const unsigned char MyBitmap1[] = {
16,16,
0x73,0x8E,
0x8C,0x71,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x97,0x63,
0x94,0x55,
0xB4,0x55,
0xD4,0x67,
0x94,0x45,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0xAA,0xAA,
0x55,0x55,
0x00,0x00
};

Сохраняем файлы MyBitmap1.h и myBitmap.cpp в директории нашего скетча. Для вывода нашего изображения на экран телевизора вызываем функцию TVOut.bitmap():

#include » MyBitmap1.h»
TVOut.bitmap(x,y,MyBitmap);

C библиотекой ознакомились, собрана игровая консоль — теперь можно приступать к написанию игры.

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

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