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

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

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

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

И схема

Ознакомимся с возможностями библиотеки и напишем игру.
Страница библиотеки — http://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.  

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

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

Далее создаем 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 не будет опубликован.