Монитор от ПК (VGA) как рисовалка
- Войдите на сайт для отправки комментариев
Втр, 14/06/2022 - 19:27
//// РИСОВАЛКА "КУРСОР"(3 режима)
#include <VGAX.h>
VGAX vga;
byte x = 60; //переменные координат курсора
byte y = 30; //
byte xx = x; //переменные координат предыдущего положения курсора
byte yy = y; //
byte xxx = x; // переменные координат первого конца отрезка
byte yyy = y; //
byte cvet = 3; //
byte k = 0; //
byte ris = 1; //
int t = 30; //
void setup() {
vga.begin();
vga.clear(0);
digitalWrite(A1, HIGH);// включить подтягивающий резистор (курсор вправо) комбинация клавиш вправо-влево это смена режимов курсор (не рисовать)- рисовать
digitalWrite(A2, HIGH);// включить подтягивающий резистор (курсор вверх) комбинация клавиш вверх-вниз это смена цвета рисования
digitalWrite(A3, HIGH);// включить подтягивающий резистор (курсор влево)
digitalWrite(A4, HIGH);// включить подтягивающий резистор (курсор вниз)
digitalWrite(A5, HIGH);// включить подтягивающий резистор (смена режимов рисовалок - пиксели,отрезки,полосы)
}
void loop() {
if (!digitalRead(A5)) {
ris++; //смена режимов рисовалок
k = 0;
if (ris > 3) {
ris = 1;
} if (ris == 2) {
xxx = x;
yyy = y;
} vga.delay(10 * t);
}
vga.fillrect(0, 0, 2, 4, cvet); //маркер режима цвета
vga.fillrect(3, 0, 2, 4, ris); //маркер режима рисования пикселями
/////
if (ris == 1) {
kursor_1();
}
if (ris == 2) {
kursor_2();
}
if (ris == 3) {
kursor_3();
}
}
/////////////////////////////////////////////////////////
/////// базовая функция рисования точками по следу курсора
void kursor_1()//
{
xx = x; yy = y;
if (!digitalRead(A1) && !digitalRead(A3)) {
k = !k; // смена режимов курсор (не рисовать)-рисовать
vga.delay(10 * t);
}
if (!digitalRead(A2) && !digitalRead(A4)) {
cvet++; // смена цвета рисования
if (cvet > 3) {
cvet = 1;
} if (cvet < 1) {
cvet = 3;
} vga.delay(10 * t);
}
//////
if (!digitalRead(A1) && x != 119) {
x++;
}
if (!digitalRead(A3) && x != 0) {
x--;
}
vga.delay(t);
if (!digitalRead(A2) && y != 0) {
y--;
}
if (!digitalRead(A4) && y != 59) {
y++;
}
vga.delay(t);
if (xx != x || yy != y) {
vga.putpixel(xx, yy, k * cvet);
}
vga.putpixel(x, y, 3);
vga.delay(t);
}
///////////////////////////////////////////////////////////
/////// базовая функция рисования отрезками
void kursor_2()//
{
xx = x; yy = y;
if (!digitalRead(A1) && !digitalRead(A3)) {
line_(x, y, xxx, yyy, cvet); // рисование нового отрезка от конца предыдущего до точки курсора
xxx = x;
yyy = y;
vga.delay(10 * t);
}
if (!digitalRead(A2) && !digitalRead(A4)) {
cvet++; // смена цвета рисования
if (cvet > 3) {
cvet = 1;
} if (cvet < 1) {
cvet = 3;
} vga.delay(10 * t);
}
//////
if (!digitalRead(A1) && x != 119) {
x++;
}
if (!digitalRead(A3) && x != 0) {
x--;
}
vga.delay(t);
if (!digitalRead(A2) && y != 0) {
y--;
}
if (!digitalRead(A4) && y != 59) {
y++;
}
vga.delay(t);
if (xx != x || yy != y) {
vga.putpixel(xx, yy, 0);
}
vga.putpixel(x, y, 3);
vga.delay(t);
}
///////////////////////////////////////////////////////////
/////// базовая функция рисования отрезка по координатам концов заданным цветом
void line_(float x1, float y1, float x2, float y2, int c) {
int divisions = int(1.1 * 1 * sqrt(pow((y2 - y1), 2) + pow((x2 - x1), 2)));
for (int i = 0; i <= divisions; i++) {
int x = int(x1 + i * (x2 - x1) / divisions);
int y = int(y1 + i * (y2 - y1) / divisions);
if (x > 0 && x < VGAX_WIDTH && y > 0 && y < VGAX_HEIGHT) {
vga.putpixel(x, y, c);
}
}
}
///////////////////////////////////////////////////////////
/////// базовая функция рисования набором точек по следу курсора
void kursor_3()//
{
xx = x; yy = y;
if (!digitalRead(A1) && !digitalRead(A3)) {
k = !k; // смена режимов курсор (не рисовать)-рисовать
vga.delay(10 * t);
}
if (!digitalRead(A2) && !digitalRead(A4)) {
cvet++; // смена цвета рисования
if (cvet > 3) {
cvet = 1;
} if (cvet < 1) {
cvet = 3;
} vga.delay(10 * t);
}
//////
if (!digitalRead(A1) && x != 119) {
x++;
}
if (!digitalRead(A3) && x != 0) {
x--;
}
vga.delay(t);
if (!digitalRead(A2) && y != 0) {
y--;
}
if (!digitalRead(A4) && y != 59) {
y++;
}
vga.delay(t);
if (xx != x || yy != y)
{
//vga.putpixel(xx,yy,k*cvet);
vga.fillrect(xx, yy, 4, 4, k * cvet);
}
vga.putpixel(x, y, 3);
vga.delay(t);
}
///////////////////////////////////////////////////////////

Управление - всего 5 кнопок, маркеры указывают текущий цвет и режим рисовалки.

А описание добавить слабо ?
А то я вот по заголовку понял, что монитор можно вдруг стало использовать в качестве графического планшета.
:)
Нет, пальцем так ровно не нарисовать.
Схемку нарисую, выложу - поясню.
http://www.gammon.com.au/forum/?id=11608
теория : генерация цветного видео Ника Гэммона
https://github.com/smaffer/vgax
практическая реализация теории :библиотека VGAX
https://www.instructables.com/VGA-Tetris-With-Arduino-Uno/
проект игра тетрис
По данной цепочке решил попробовать не игры делать а рисовалку на кнопках.
Навигация простая: отдельное и попарное нажатие кнопок 1-4 задаёт 8 направлений движение курсора, пара "вверх-вниз" перебирает цвета, их 4, пара "вправо-влево" перебирает режимы рисовать-не рисовать. Кнопка 5 меняет виды рисования - пиксельное, отрезками и стирашка-разукрашка.
проект игра тетрис
FabGl.
Ардуино, может только плохо VGA сигнал выдавать. Esp32, с двумя своими ядрами и то заикается при выдаче VGA 640/200.
:)
Цель не в том, чтобы наращивая возможности мк-плат и их число получить опять компьютер, а "шоб припутить" монитор к уно или нано через простенькие поделки - аркадные игры, шкалы-индикаторы, рисовалки.
Да мало ли для чего. Когда то нужно было моно CGA, так приходилось огород собирать, а тут...)