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

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

Как использовать плату Arduino для вывода какой-либо информации на ТВ? Оказывается есть такая библиотека TVOut, которая позволяет выводить информацию на ТВ по НЧ-кабелю (тюльпан). Правда изображение будет черно-белым, однако этого будет достаточно для большинства проектов.
Вот игровая консоль, где используется данная библиотека
arduino77-1
Сайт проекта http://nootropicdesign.com/hackvision/index.html
Цена платы $43.95.
Создадим свою ТВ-приставку, состоящую из Arduino-платы и двухкоординатного джойстика и напишем простенькую игру.
Вот вид нашей приставки
arduino77-2
И схема
arduino77-3
Ознакомимся с возможностями библиотеки и напишем игру.
Страница библиотеки — 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 myfont1.h
extern const unsigned char myfont1[];
#endif

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

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

Библиотека TVOut позволяет загружать на экран растровые изображения. Рассмотрим создание кода для загрузки растрового изображения функцией bitmap() библиотеки TVOut.
Сначала необходимо создать 1 битное (двухцветное изображение), например в графическом редакторе Paint.
arduino77-4

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

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

arduino77-6
Далее создаем 2 файла. Первый c расширением .h, например MyBitmap1.h.
# include MyBitmap1.h
# 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 библиотекой ознакомились, собрана игровую консоль — теперь можно приступать к написанию игры.
Смотрите Часть 2.

6 comments

  1. Интернет-хостинг изображений netpics.org предназначен для того что-бы любой человек каковому потребовалось поделиться собственными изображениями и фотографиями, мог свободно и без особых усилий поместить с помощью нашего онлайн-сервиса netpics.org свои изображения в сети интернет и поделиться гиперссылкой на них.
    С применением хостинга изображений netpics.org сможете свободно делиться изображениями в чатах и письмах электронной почты email. Так же Сервис netpics.org выдает широкий выбор встраевыемых HTML BB кодов для применения на форумах и интернет сайтах для вставки в сообщения или использовании в компонентах дизайна.
    Непосредственно технология размещения фото или изображения очень тривиальна, вам просто надобно подобрать файл тот что вы хотите отправить на сервер netpics.org и нажать кнопку «загрузить», после выгрузки информации вы получите автоматически сгенерированную страницу с ссылкой на ваше изображение, какую вы всегда сможете применять по вашему усмотрению. Наш сервис netpics.org имеет свои очевидные плюсы:
    сервисом сумеет пользоваться любой желающий полностью без затрат;
    для применения хостинга изображений не требуется регистрация;
    срок сбережения изображений на сервере не ограничен временными рамками;
    Высокая скорость работы сервера netpics.org обеспечит вам комфортную работу с вашими изображениями на любом интернет ресурсе;
    Предполагаем что качество нашего сайта вам понравится.

    таблица изображений

  2. Для любителей игр всех возрастов — игровые приставки от детских до продвинутых Sony PlayStation и Microsoft Xbox.

  3. Привет, Хабр! В продолжение постов об истории игровых приставок я решил написать о портативных игровых системах. Я постарался обеспечить вам минутку ностальгии в это воскресенье, так что — добро пожаловать под хабракат.

  4. Привет, Хабр! В продолжение постов об истории игровых приставок я решил написать о портативных игровых системах. Я постарался обеспечить вам минутку ностальгии в это воскресенье, так что — добро пожаловать под хабракат.

  5. Дамс в большинстве случаев оно так и есть!

    ——
    СПб деньги в долг|http://facredit.ru/

  6. Или все же старт? Возможностей и способов использования ТВ – вывода Arduino на самом дела масса, не говоря уже про простое использование Arduino в качестве игровой приставки.

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

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

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>