Недавно я собрал первую версию своего устройства, но не смотря на небольшой срок программа имеет множество изменений, доработок и улучшений. В предыдущей статье я кратко рассказал о том как собрать ESPspectrum https://habr.com/ru/articles/783778/. В этой как и планировалось, я расскажу и работе программы ( т.е. операционной системе ESPspectrum ).

На данном этапе для работы с файлами, я использую SPIFFS. В следующей версии будет SD карты( уже заказал все необходимое ) .

На момент выхода следующих статьей, устройство перейдет на новый уровень и их содержимое станет поинтересней.

Основной файл скетча

В нем объявляются функции и переменные, осуществляется подключение библиотек и загрузка устройства.

void menuOC();
void freereadKeyboard();
void kalculator();
//files
void file_mode();
void file_read();
String filename();
String write_data();
void file_del();
void file_create();
//games
void snake_game(); //можно удалить, работает без этой строчки
void game_menu();
/*==============================================*/
#define CLOCK 16 //D-
#define DATA 17  //D+

const char keymap[] = {
  0, 0,  0,  0,  0,  0,  0,  0,
  0, 0,  0,  0,  0,  0, '`', 0,
  0, 0 , 0 , 0,  0, 'q', '1', 0,
  0, 0, 'z', 's', 'a', 'w', '2', 0,
  0, 'c', 'x', 'd', 'e', '4', '3', 0,
  0, ' ', 'v', 'f', 't', 'r', '5', 0,
  0, 'n', 'b', 'h', 'g', 'y', '6', 0,
  0, 0, 'm', 'j', 'u', '7', '8', 0,
  0, ',', 'k', 'i', 'o', '0', '9', 0,
  0, '.', '/', 'l', ';', 'p', '-', 0,
  0, 0, '\'', 0, '[', '=', 0, 0,
  0, 0, 13, ']', 0, '\\', 0, 0,
  0, 0, 0, 0, 0, 0, 127, 0,
  0, '1', 0, '4', '7', 0, 0, 0,
  '0', '.', '2', '5', '6', '8', 0, 0,
  0, '+', '3', '-', '*', '9', 0, 0,
  0, 0, 0, 0
};

int  lastscan;
String txt_keys;

/*==============================================*/
#include <ESP32Lib.h>
#include <Ressources/Font6x8.h>
#include <Ressources/CodePage437_8x8.h>
#include <Ressources/CodePage437_8x14.h>
#include <Ressources/CodePage437_8x16.h>

// одинаковые резисторы на R G B!!!!!!

//pin configuration
const int redPin = 33;
const int greenPin = 14;
const int bluePin = 12;
const int hsyncPin = 2;
const int vsyncPin = 4;

//VGA Device
VGA3Bit vga;

/*==============================================*/
#include "FS.h"
#include "SPIFFS.h"

// Создаем объект класса «File» для манипуляции с файлом:
File myFile;
/*==============================================*/
void setup()
{
  Serial.begin(115200);
  //initializing vga at the specified pins
  pinMode(CLOCK, INPUT_PULLUP); //пины клавиатуры
  pinMode(DATA, INPUT_PULLUP);

  vga.init(vga.MODE320x240, redPin, greenPin, bluePin, hsyncPin, vsyncPin);

  vga.setFont(CodePage437_8x16);
  vga.setCursor(2, 5);
  vga.println("Starting...");
  vga.setCursor(2, 25);
  vga.println("ESPspectrum V1");
  vga.setFont(CodePage437_8x14);
  vga.setCursor(2, 100);
  vga.println("created on 2023");
  delay(5000);
  vga.clear(vga.RGB(0, 0, 0));
  delay(1000);
  vga.setCursor(0, 0);

   
  if(!SPIFFS.begin(true)){  // Инициализируем / "Ошибка при монтировании SPIFFS"
    Serial.println("Error while mounting SPIFFS"); vga.println("Error while mounting SPIFFS"); 
    delay(2000); vga.clear(vga.RGB(0, 0, 0)); vga.setCursor(0, 0); return; }
    
}

int menu = 0;
void loop() {
  menuOC(); Serial.println(txt_keys);
}

Меню OC

В данной вкладке происходит перемещение по меню: команды, калькулятор, игровое меню, файловое меню и свободная печать. Перемещение происходит при нажатии клавиш 1 - 5.

Если требуется то можно легко добавить еще вкладки.

 void menuOC(){
   vga.setCursor(2, 2);
   vga.println("1 - Work with files");   
   vga.println("2 - Calculator");  
   vga.println("3 - Free printing");
   vga.println("4 - View the commands");
   vga.println("5 - Games");
/*==================================================*/
  int scanval = 0;
  for(int i = 0; i<11; i++)
  {
    while(digitalRead(CLOCK));
    scanval |= digitalRead(DATA) << i;
    while(!digitalRead(CLOCK));
  }
  scanval >>= 1;
  scanval &= 0xFF;
  Serial.println(scanval, HEX);
  if(lastscan != 0xF0 && scanval != 0xF0)
 {
  if(scanval != 0x5A and scanval != 0xE0)
    {
   txt_keys = txt_keys + keymap[scanval];   
   Serial.println(keymap[scanval]);
     }  
     //системные клавиши, чтобы не было напечатано непонятных символов   
          if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);}          
          if(scanval == 0x5A){vga.clear(vga.RGB(0,0,0)); menu = 0;}
          if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0;}
          if(scanval == 0x16){menu = 1;}
          if(scanval == 0x1E){menu = 2;}
          if(scanval == 0x26){menu = 3;}
          if(scanval == 0x25){menu = 4;}
          if(scanval == 0x2E){menu = 5;} 
        //если адрес == "" то переменная меню равна ""
  }
  lastscan = scanval;
/*========================================================*/

   
   if(menu == 0){ txt_keys = ""; }
   //если пересенная меню равна "" то открываем ""
   if(menu == 1){ txt_keys = ""; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); file_mode();}
   if(menu == 2){ txt_keys = ""; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); kalculator();}
   if(menu == 3){ txt_keys = ""; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); freereadKeyboard(); }
   if(menu == 4)
   {
    txt_keys = ""; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); 
    vga.print("instructions for use can be found in the README file");  //инструкция в файле README
    delay(5000); vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); 
   }                                                                                                                                                                                                                                                                                                                                                                                                                         
   if(menu == 5){ txt_keys = "";vga.clear(vga.RGB(0,0,0));  game_menu();}
   
   Serial.print("menu = ");Serial.println(menu);
   }


   

Свободная печать

Режим очень полезен если требуется узнать адрес клавиши или проверить клавиатуру

/*==================================*/
void freereadKeyboard(){   
while(true){
  
  int scanval = 0;
  for(int i = 0; i<11; i++)
  {
    while(digitalRead(CLOCK));
    scanval |= digitalRead(DATA) << i;
    while(!digitalRead(CLOCK));
  }
  scanval >>= 1;
  scanval &= 0xFF;
  Serial.println(scanval, HEX);
  if(lastscan != 0xF0 && scanval != 0xF0)
 {
  if(scanval != 0x5A and scanval != 0xE0)
    {
   txt_keys = txt_keys + keymap[scanval];   
   Serial.println(keymap[scanval]);
   vga.print(keymap[scanval]);
     }  
     //системные клавиши, чтобы не было напечатано непонятных символов   
          if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);}          
          if(scanval == 0x5A){vga.println(""); }
          if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0; return;}
      
  }
  lastscan = scanval;
 }

}

Калькулятор

Первая версия не имеет много возможностей, но простые операции выполняет. Возможна работа с дробными числами.

Работает функция сложения, умножения, вычитания, деления и сравнивания(123,22225 = 123,22 ?)

void kalculator() {  
String sing = "=";
String s1 = "";
String s2 = "";   
int s12 = 1; 
vga.println("Calculator");


 /*==================================================*/
 while(true){   

  int scanval = 0;
  for(int i = 0; i<11; i++)
  {
    while(digitalRead(CLOCK));
    scanval |= digitalRead(DATA) << i;
    while(!digitalRead(CLOCK));
  }
  scanval >>= 1;
  scanval &= 0xFF;
  Serial.println(scanval, HEX);
  if(lastscan != 0xF0 && scanval != 0xF0)
 {
  if(scanval != 0xE0){
  
  if( keymap[scanval] == '='){sing = "=";}
  if( keymap[scanval] == '+'){sing = "+";}
  if( keymap[scanval] == '-'){sing = "-";}
  if( keymap[scanval] == '*'){sing = "*";} 
  if( keymap[scanval] == '/'){sing = "/";}
  
  if( keymap[scanval] == '=' or keymap[scanval] == '+' or keymap[scanval] == '-' or keymap[scanval] == '*' or keymap[scanval] == '/' or scanval == 0x5A ){
    if(s12 == 1){ s1 = txt_keys; txt_keys = ""; s12 = 2;}
    else{s2 = txt_keys; txt_keys = ""; s12 = 1;}   
  }
  else{txt_keys = txt_keys + keymap[scanval];}

  if(scanval != 0xE0 and scanval != 0x5A){ Serial.println(keymap[scanval]); vga.print(keymap[scanval]); }
  
  }  
          //системные клавиши, чтобы не было напечатано непонятных символов   
          if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); vga.println("Kalculator"); s1 = ""; s2 = ""; txt_keys = "";}  
          //ответ        
          if(scanval == 0x5A){vga.println("");
            if(sing == "="){vga.println(s1.toFloat()  == s2.toFloat());}
            if(sing == "+"){vga.println(s1.toFloat() + s2.toFloat() );}
            if(sing == "-"){vga.println(s1.toFloat() - s2.toFloat() );}
            if(sing == "*"){vga.println(s1.toFloat() * s2.toFloat() );}
            if(sing == "/"){vga.println(s1.toFloat() / s2.toFloat() );}  
            s1 = ""; s2 = ""; txt_keys = "";
                  
          }
          if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0; return;}
  }
  lastscan = scanval;
/*========================================================*/   
 Serial.print("s1 = ");Serial.println(s1);
 Serial.print("s2 = ");Serial.println(s2);
 } 
}

Работа с файлами

В этой вкладке есть свое меню действий при работе с файлами: чтение, создание/перезапись, удаление.

Чтобы прочитать файл, надо ввести имя нужного файла. Формат указывать не требуется( пример test1). Для удаления потребуется тоже ввести имя нужного файла. Но чтобы создать или изменить по мимо ввода имени файла требуется ввести содержимое.

String write_data(){
  String str = " <no data> ";
  
while(true){  
  int scanval = 0;
  for(int i = 0; i<11; i++)
  {
    while(digitalRead(CLOCK));
    scanval |= digitalRead(DATA) << i;
    while(!digitalRead(CLOCK));
  }
  scanval >>= 1;
  scanval &= 0xFF;
  Serial.println(scanval, HEX);
  if(lastscan != 0xF0 && scanval != 0xF0)
 {
  if(scanval != 0x5A and scanval != 0xE0)
    {
   txt_keys = txt_keys + keymap[scanval];   
   Serial.println(keymap[scanval]);
   vga.print(keymap[scanval]);
     }  
     //системные клавиши, чтобы не было напечатано непонятных символов   
          if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);  txt_keys = ""; }
                    
          if(scanval == 0x5A){
            str = txt_keys; 
            vga.setCursor(0, 0); 
            vga.clear(vga.RGB(0,0,0)); 
            txt_keys = ""; 
            return(str);
            }
          
          if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);  txt_keys = ""; }
      
  }
  lastscan = scanval;
 }
}


String filename(){
  String str;
while(true){  
  int scanval = 0;
  for(int i = 0; i<11; i++)
  {
    while(digitalRead(CLOCK));
    scanval |= digitalRead(DATA) << i;
    while(!digitalRead(CLOCK));
  }
  scanval >>= 1;
  scanval &= 0xFF;
  Serial.println(scanval, HEX);
  if(lastscan != 0xF0 && scanval != 0xF0)
 {
  if(scanval != 0x5A and scanval != 0xE0)
    {
   txt_keys = txt_keys + keymap[scanval];   
   Serial.println(keymap[scanval]);
   vga.print(keymap[scanval]);
     }  
     //системные клавиши, чтобы не было напечатано непонятных символов   
          if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);  txt_keys = ""; str = "";}
                    
          if(scanval == 0x5A){
            str = "/" + txt_keys + ".txt"; 
            vga.setCursor(0, 0); 
            vga.clear(vga.RGB(0,0,0)); 
            txt_keys = "";  
            return(str);
            }
          
          if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);  txt_keys = ""; str = "";}
      
  }
  lastscan = scanval;
 }
  
}
/*==================== mode =========================*/
void file_mode(){
  int filemode = 0;
  
while(true){    
   vga.setCursor(2, 2);
   vga.println("1 - Read");     
   vga.println("2 - Create new / owerwrite");
   vga.println("3 - Delete");


  int scanval = 0;
  for(int i = 0; i<11; i++)
  {
    while(digitalRead(CLOCK));
    scanval |= digitalRead(DATA) << i;
    while(!digitalRead(CLOCK));
  }
  scanval >>= 1;
  scanval &= 0xFF;
  Serial.println(scanval, HEX);
  if(lastscan != 0xF0 && scanval != 0xF0)
 {
  if(scanval != 0x5A and scanval != 0xE0){ txt_keys = txt_keys + keymap[scanval]; Serial.println(keymap[scanval]);}  
          //системные клавиши  
     
          if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);}          
          if(scanval == 0x5A){vga.clear(vga.RGB(0,0,0)); filemode = 0;}
          if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0; return;}
          if(scanval == 0x16){filemode = 1;}
          if(scanval == 0x1E){filemode = 2;}
          if(scanval == 0x26){filemode = 3;}
          if(scanval == 0x25){filemode = 4;}
          if(scanval == 0x2E){filemode = 5;}
  }
  lastscan = scanval;

   
   if(filemode == 1){ txt_keys = ""; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); file_read(); }
   if(filemode == 2){ txt_keys = ""; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); file_create();}
   if(filemode == 3){ txt_keys = ""; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); file_del(); }
   
   
   Serial.print("filemode = ");Serial.println(filemode);
}
   }



/*===================== read files ==========================*/ 
void file_read() // Читаем содержимое файла:
{
int del = 20;  
char inByte  = 0;
String n = filename(); 

  myFile = SPIFFS.open(n, FILE_READ);  
  
  vga.print("File size:");  
  vga.println(myFile.size()); delay(1000); vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); //size 
  if(myFile.size() == 0){vga.print("an error is likely, press end"); }
       
  while(myFile.available()) {   
   inByte = (char)myFile.read();  
   vga.print((char)inByte); // ascii converter
   delay(del);
  }
  
 delay(500);
 while(true){

  int scanval = 0;
  for(int i = 0; i<11; i++)
  {
    while(digitalRead(CLOCK));
    scanval |= digitalRead(DATA) << i;
    while(!digitalRead(CLOCK));
  }
  scanval >>= 1;
  scanval &= 0xFF;
  Serial.println(scanval, HEX);
  if(lastscan != 0xF0 && scanval != 0xF0)
  {     
     if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0; return;}
  }
  lastscan = scanval;

 delay(100);
 }

  myFile.close();
  vga.clear(vga.RGB(0,0,0));
  vga.setCursor(0, 0);
}
/*================= delete =====================================*/
void file_del()
{
  String n = filename();     
  if(SPIFFS.remove(n)){
    Serial.println("File successfully deleted");
    vga.println("File successfully deleted");          
  }
  else{
    Serial.print("Deleting file failed!");
    vga.print("Deleting file failed!");
             //  "Не удалось удалить файл!"
  }
  delay(2000);  
 
  vga.clear(vga.RGB(0,0,0));
  vga.setCursor(0, 0);
}

/*================= create =====================================*/
void file_create()
{
  String n = filename();    
  String dataf = write_data();
  
  myFile = SPIFFS.open(n, FILE_WRITE);
  
  if (myFile.print(dataf))
  {               
    Serial.println("Message successfully written");  
    vga.print("Message successfully written");           
  }
  else{Serial.print("Writing message failed!!"); vga.print("Writing message failed!!");}
  delay(2500);
  myFile.close();
  
  vga.clear(vga.RGB(0,0,0));
  vga.setCursor(0, 0);
}
 

Игры

Самое сложное в данном компьютере, но при этом очень интересное. Переписать или создать игру это довольно долгое занятие, но оно развивает творчество. Как свою первую игру на это устройство я переделал змейку.

В начале данной вкладки добавляется игра - #include "games/SnakeGame.h"

В меню выбора нужно добавить название новой игры, которая находится по адресу Documents\Arduino\ESPspectrum\ESPspectrum_V1\games. Туда копируется игра.

#include "games/SnakeGame.h"
//#include "games/'название игры'.h"
void game_menu()
{
  int gamemode = 0;
  
while(true){    
   vga.setCursor(2, 2);
   vga.println("1 - Snake");     
   vga.println("2 - Add");
   //печать названия и номера игр


  int scanval = 0;
  for(int i = 0; i<11; i++)
  {
    while(digitalRead(CLOCK));
    scanval |= digitalRead(DATA) << i;
    while(!digitalRead(CLOCK));
  }
  scanval >>= 1;
  scanval &= 0xFF;
  if(lastscan != 0xF0 && scanval != 0xF0)
 {
  if(scanval != 0x5A and scanval != 0xE0){ txt_keys = txt_keys + keymap[scanval]; Serial.println(keymap[scanval]);}  
          //системные клавиши  
     
          if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);}          
          if(scanval == 0x5A){vga.clear(vga.RGB(0,0,0)); gamemode = 0;}
          if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0; return;}
          if(scanval == 0x16){gamemode = 1;}
          if(scanval == 0x1E){gamemode = 2;}
          if(scanval == 0x26){gamemode = 3;}
          if(scanval == 0x25){gamemode = 4;}
          if(scanval == 0x2E){gamemode = 5;}
  }
  lastscan = scanval;

   //если переменная = "" то открываем игру ""
   if(gamemode == 1){ txt_keys = ""; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); snake_game(); }
   
    
   Serial.print("gamemode = ");Serial.println(gamemode);
}
   }

USB

Я нашел вариант с подключением USB а не PC/2 клавиатуры. Код выглядит так

#define CLOCK 16 //D-
#define DATA 17  //D+


const char keymap[] = {
  0, 0,  0,  0,  0,  0,  0,  0,
  0, 0,  0,  0,  0,  0, '`', 0,
  0, 0 , 0 , 0,  0, 'q','1', 0,
  0, 0, 'z','s','a','w','2', 0,
  0,'c','x','d','e','4','3', 0,
  0,' ','v','f','t','r','5', 0,
  0,'n','b','h','g','y','6', 0,
  0, 0, 'm','j','u','7','8', 0,
  0,',','k','i','o','0','9', 0,
  0,'.','/','l',';','p','-', 0,
  0, 0,'\'', 0,'[', '=', 0, 0,
  0, 0,13, ']', 0, '\\', 0, 0,
  0, 0, 0, 0, 0, 0, 127, 0,
  0,'1', 0,'4','7', 0, 0, 0,
  '0','.','2','5','6','8', 0, 0,
  0,'+','3','-','*','9', 0, 0,
  0, 0, 0, 0 };



void setup()
{
  Serial.begin(115200);
  pinMode(CLOCK, INPUT_PULLUP); //пины клавиатуры
  pinMode(DATA, INPUT_PULLUP);
 }

uint8_t lastscan;
uint8_t line = 0, col = 0;


void loop()
{
   uint16_t scanval = 0;
  for(int i = 0; i<11; i++)
  {
    while(digitalRead(CLOCK));
    scanval |= digitalRead(DATA) << i;
    while(!digitalRead(CLOCK));
  }
  scanval >>= 1;
  scanval &= 0xFF;
  Serial.println(scanval, HEX);
  if(lastscan != 0xF0 && scanval != 0xF0)
 {
   Serial.println(keymap[scanval]);
      
  }
  lastscan = scanval;
  
}

Самым лучшим вариантом увидеть как это работает - это собрать самому или связаться со мной на сервере дискорд. А в данной статье я решил показать код программы.

Архив с прошивкой и схемой: https://disk.yandex.ru/d/22eXr-gerhFaXA

Почему esp32 https://www.alexcube.ru/blog/2021/11/53-dnya-do-2022-goda-zx-spectrum-iz-arduino/


Вопросы, помощь проекту: https://discord.gg/nd6K7sbR

Комментарии (59)


  1. Anonym
    03.01.2024 19:28
    +4

    От Спектрума только название.

    Код без слёз читать невозможно.

    За пиар 2, за стремление 5.


    1. Alexandr_Yagupov Автор
      03.01.2024 19:28
      +7

      Не хотел этого говорить, но мне 13 лет. В направлении клонов и компьютеров Spectrum я около двух недель. Опыт небольшой, но желание продолжать, улучшать и делать огромное...


      1. Anonym
        03.01.2024 19:28
        +5

        Я бы посоветовал сменить название проекта. Или вы делаете клон Спектрума, но тогда он должен работать как Спектрум и поддерживать софт Спектрума. Или вы делаете свою поделку, но тогда и назовите ее как-то иначе, чтобы не вводить в заблуждение.

        Ну и выложите на гитхаб что-ли.


        1. Alexandr_Yagupov Автор
          03.01.2024 19:28

          Называется ESPspectrum так как есть схожесть в назначении, а так работает мое устройство совершенно по другому. На гитхаб выложу, но позже(есть что подделать)


          1. voldemar_d
            03.01.2024 19:28
            +4

            Чтобы не вводить людей в заблуждение, где-нибудь в статье добавьте про это, если уж не хотите название проекта изменять.


            1. RomanKu
              03.01.2024 19:28

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


              1. Alexandr_Yagupov Автор
                03.01.2024 19:28

                Я писал, что я пока не могу это сделать сейчас, а позже, если найду этот проигрыватель то постараюсь сделать. Но уже буквально через несколько дней будут чтение SD карт


                1. voldemar_d
                  03.01.2024 19:28

                  Просто для информации - был уже вот такой проект, например:

                  https://habr.com/ru/articles/412325/

                  Вот это можно словом "Спектрум" назвать. В статье всякие полезные ссылки есть.


                  1. tormozedison
                    03.01.2024 19:28

                    Тут автор принципиально хочет отсутствие прослойки в виде эмулятора. Ибо схему взял от железки, где эмулятор изначально был.


                    1. Alexandr_Yagupov Автор
                      03.01.2024 19:28

                      Проект Алекса можно в принципе запустить на ESPspectrum. Я пишу все с нуля так как в отличие от проекта Алекса у меня легко можно поменять содержимое программы. И до эмулятора я еще не дошел


                      1. voldemar_d
                        03.01.2024 19:28

                        Что значит "легко можно поменять содержимое программы"? Перепрошил контроллер - вот и поменял содержимое. Или о чем речь?


                      1. Alexandr_Yagupov Автор
                        03.01.2024 19:28

                        Он прошивал через ЕСП uploader или как то похоже. Прошивка находится в файлах .bin, изменение содержимого будет не таким простым как в ESPspectrum то есть через Arduino ide.


                      1. voldemar_d
                        03.01.2024 19:28

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


                      1. Alexandr_Yagupov Автор
                        03.01.2024 19:28

                        Суть в том что мою версию легко доработать внешними модулями, я сейчас и занят травлением новой платы с возможностью подключить SD карты


                      1. voldemar_d
                        03.01.2024 19:28

                        К любой схеме на любом МК легко добавить что SD shield, что другой внешний модуль.


                      1. Alexandr_Yagupov Автор
                        03.01.2024 19:28

                        Программу вы как в файле .bin поменяете? Я не знаю как это сделать, а Ардуино Ide мне давно знакома....


                      1. voldemar_d
                        03.01.2024 19:28

                        Вы собираетесь весь код, эмулирующий Спектрум, самостоятельно в Arduino IDE на c++ написать?


                      1. Alexandr_Yagupov Автор
                        03.01.2024 19:28

                        Я уже это сделал, в этой статье все есть


                      1. voldemar_d
                        03.01.2024 19:28

                        Что есть? Игра "Змейка" и калькулятор в кодах Z80 исполняются? Хоть одна игра со Спектрума запускается?


                      1. Alexandr_Yagupov Автор
                        03.01.2024 19:28

                        нет, так как я использую библиотеку для VGA подкдючения


                      1. voldemar_d
                        03.01.2024 19:28

                        Есть куча железных эмуляторов Спектрума с VGA-выходом. В современных эмуляторах никто не стремится повторить RGB-выход для подключения к советскому телевизору.


                    1. voldemar_d
                      03.01.2024 19:28

                      Не очень понял, как можно на микроконтроллере запустить Спектрум без эмуляции. Либо я вообще мысль не понял.


                      1. Alexandr_Yagupov Автор
                        03.01.2024 19:28

                        Там нет спектрума вообще. Операционка написана в Arduino ide.


                      1. voldemar_d
                        03.01.2024 19:28

                        А у вас будем прямо Спектрум? С процессором Z80? И что значит "нет Спектрума", если игры со Спектрума запускаются и работают?


                      1. Alexandr_Yagupov Автор
                        03.01.2024 19:28

                        Рекомендую прочитать статьи. ESPspectrum на есп32


                      1. voldemar_d
                        03.01.2024 19:28

                        Звучит как "идите в гугл, там всё есть". Ссылку можете дать на что-то конкретное?



                      1. voldemar_d
                        03.01.2024 19:28

                        Вы про какой проект - на который я дал ссылку выше?


                      1. Alexandr_Yagupov Автор
                        03.01.2024 19:28

                        прочитайте первую статью про ESPspectrum, там рассказано из чего я его сделал


                      1. tormozedison
                        03.01.2024 19:28

                        Так автору и не нужен Спектрум. А нужна платформа с VGA-выходом, которую можно программировать на «ардуинном языке». Потому что это его первый язык программирования.

                        Чем он и отличается от айтишников «свитерно-бородатого» периода, стремящихся приделать к любой железке интерпретатор Бейсика. Или эмулятор чего-нибудь, где интерпретатор Бейсика уже есть. Потому что это их первый язык программирования. Таких проектов десятки уже.


                      1. Alexandr_Yagupov Автор
                        03.01.2024 19:28

                        Да, спасибо что помогли пояснить


                      1. voldemar_d
                        03.01.2024 19:28

                        Из-за того, что в названии есть слово Spectrum, а от самого Спектрума ничего нет, я и не могу понять, что это такое. Тем более, что, действительно, подобных проектов уже много.

                        Что значит "Ардуинный язык", если это c++ (пусть и с ограничениями платформы)?


                      1. Alexandr_Yagupov Автор
                        03.01.2024 19:28

                        Spectrum есть т. к. есть схожее применение. "Ардуинный язык" - упрощенный C++ только для плат Ардуино, espшек и т.д.


      1. tormozedison
        03.01.2024 19:28
        +3

        13 лет, и такой аккуратный ЛУТ - повод только радоваться за вас.

        Разъём VGA так подключён, потому что сверлить не стали?


        1. Alexandr_Yagupov Автор
          03.01.2024 19:28

          да, все верно, на днях еще одну вытравлю, постараюсь сделать с отверстиями


  1. tormozedison
    03.01.2024 19:28
    +2

    Как первый проект, сделанный никуда не подглядывая - пойдёт более чем.


  1. Hasthur
    03.01.2024 19:28
    +3

    13 лет? Серьёзно? Ну тогда всё это очень и очень здорово. Вы молодец! Не останавливайтесь. А сеньоры тут конечно чуть поворчат, но зато может полезное что-нибудь подскажут. На перспективу

    Господа сеньоры, терпимее, пожалуйста )


    1. Alexandr_Yagupov Автор
      03.01.2024 19:28
      +1

      Спасибо!! Полезное подсказывают и прошлую статью с помощью критики доработал


  1. voldemar_d
    03.01.2024 19:28
    +2

    По-английски калькулятор называется всё-таки Calculator.

    Только хотел задать вопрос, при чем тут вообще Спектрум, но выше уже в комментариях отметили, что ни при чем. За начинание респект, удачи в дальнейшей разработке.


  1. CyrK
    03.01.2024 19:28
    +1

    Автор, а не хотите ли создать что-то более полезное. Например, кассовый терминал?


    1. Alexandr_Yagupov Автор
      03.01.2024 19:28

      Будет, но позже. Я на основе ESPspectrum сделаю аппарат для развития детей, который за правильный ответ дает например конфетку.


  1. j-b
    03.01.2024 19:28
    +1

    Дайте вы уже наконец источник-ссылку, от куда вы научились с usb как с rx/tx работать.

    Я уже не поленюсь, и проверю вашу программу. Т.к. у меня в наличии как раз есть 2 клавиатуры, одна с поддержкой ps/2 а вторая чисто usb.


    1. Alexandr_Yagupov Автор
      03.01.2024 19:28

      Источник не найти. Перечитал кучу статей и сделал сам... Заработает на любой Ардуино


      1. j-b
        03.01.2024 19:28

        Мне тоже лень искать конкретный пример для ESP.

        Но вот вам принцип работы PS/2 клавиатуры.

        https://habr.com/ru/articles/693784/

        Для передачи по DATA от клавиатуры в компьютер потребуется соблюсти следующие требования:

        • Ожидать, пока по линии CLOCK не появится логическая «1» в районе 50 мкс, далее, последовательно;

        • Передать по DATA старт-бит (всегда 1);

        • Передать последовательно 8 бит данных;

        • Передать бит четности;

        • Передать стоп-бит (всегда 1).

        Хотя-бы это и ваш кусок кода "for(int i = 0; i<11; i++)" вам о чем нибудь говорят? (1+8+1+1 бит)


      1. j-b
        03.01.2024 19:28

        и да, искать долго не надо:

        https://forum.arduino.ru/t/podklyuchenie-usb-klaviatury-k-arduino/11359

        “There seem to be some newer USB keyboards around, that no more support the PS/2 protocol, though.”


        1. Alexandr_Yagupov Автор
          03.01.2024 19:28

          Эта статья была в основе, но я не копировал полностью, посмотрите


        1. tormozedison
          03.01.2024 19:28

          Из-за того, что USB-клавиатур с обратной совместимостью с PS/2 всё меньше, а настоящий USB реализовать может производительности не хватить, многие разработчики переходят к подключению непосредственно клавиатурных матриц.


          1. Alexandr_Yagupov Автор
            03.01.2024 19:28

            В первой версии ESPspectrum подключение такое как в статьях.


      1. j-b
        03.01.2024 19:28

        И в догонку, https://www.youtube.com/watch?v=WPlPRkPx1_8 вот видосик по работе с USB-HID клавиатурой и мышкой )))


        1. Alexandr_Yagupov Автор
          03.01.2024 19:28

          Спасибо за активность, я учту в следующих версиях


        1. tormozedison
          03.01.2024 19:28

          Оказывается, существует некий CH559 с аппаратным USB-хостом.


          1. Alexandr_Yagupov Автор
            03.01.2024 19:28

            цены на них видели?


            1. tormozedison
              03.01.2024 19:28

              Теперь видел, значит, отпадает.


  1. JordanCpp
    03.01.2024 19:28

    Самым лучшим вариантом увидеть как это работает - это собрать самому или связаться со мной на сервере дискорд. А в данной статье я решил показать код программы.

    А чë так можно было? :)


    1. Alexandr_Yagupov Автор
      03.01.2024 19:28

      Писатель из меня тот еще... Но я научусь ????


    1. Alexandr_Yagupov Автор
      03.01.2024 19:28

      или вы про то что можно связаться?


      1. JordanCpp
        03.01.2024 19:28

        Я о статье на чиле. Типа вот код собирайте.


        1. Alexandr_Yagupov Автор
          03.01.2024 19:28

          ???? Не, писать статью для меня сложнее чем собрать, разработать или придумать


          1. Alexandr_Yagupov Автор
            03.01.2024 19:28

            Но буду рад если кто - то захочет и соберет