Монитор от ПК (VGA) как рисовалка

lilik
Offline
Зарегистрирован: 19.10.2017
//// РИСОВАЛКА "КУРСОР"(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 кнопок, маркеры указывают текущий цвет и режим рисовалки.

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А описание добавить слабо ?
А то я вот по заголовку понял, что монитор можно вдруг стало использовать в качестве графического планшета.

lilik
Offline
Зарегистрирован: 19.10.2017

:)

Нет, пальцем так ровно не нарисовать.

Схемку нарисую, выложу - поясню.

lilik
Offline
Зарегистрирован: 19.10.2017

 

lilik
Offline
Зарегистрирован: 19.10.2017

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 меняет виды рисования - пиксельное, отрезками и стирашка-разукрашка.

Iv_
Iv_ аватар
Offline
Зарегистрирован: 06.04.2022

проект игра тетрис
FabGl.

Iv_
Iv_ аватар
Offline
Зарегистрирован: 06.04.2022

Ардуино, может только плохо VGA сигнал выдавать. Esp32, с двумя своими ядрами и то заикается при выдаче VGA 640/200.

lilik
Offline
Зарегистрирован: 19.10.2017

Iv_ пишет:
Ардуино, может только плохо VGA сигнал выдавать. Esp32, с двумя своими ядрами и то заикается при выдаче VGA 640/200.

:)

Цель не в том, чтобы наращивая возможности мк-плат и их число получить опять компьютер, а "шоб припутить" монитор к уно или нано через простенькие поделки - аркадные игры, шкалы-индикаторы, рисовалки. 

Green
Offline
Зарегистрирован: 01.10.2015

Да мало ли для чего. Когда то нужно было моно CGA, так приходилось огород собирать, а тут...)