Создание функционального компьютера из Arduino Uno

8

Есть ли здесь энтузиасты Arduino?

Эй, я думал об этом, и чем больше я думаю об этом, тем больше я думаю, что на самом деле могу это сделать. Моя идея в основном такова: сделать функциональный компьютер из микроконтроллера Arduino Uno.

Моя единственная цель для этого компьютера - возможность редактировать и выполнять программы BASIC. Это все. Я хочу только это для программирования, потому что это единственное, что меня интересует сейчас :)

Поэтому, как я понимаю, мне понадобятся три основных аппаратных компонента:

  1. некоторая форма дисплея (экран VGA или что-то)
  2. какой-то способ регистрации ввода с клавиатуры, и
  3. какой-то способ хранения данных во внешней памяти.

Кто-нибудь знает какой-либо способ сделать это? Я знаю способы отображения на экране, но я не знаю хорошего API / аппаратного компонента для регистрации ввода с клавиатуры или для хранения внешней памяти.

Мне понадобится много помощи по этому вопросу. Кто-нибудь может мне помочь и предложить идеи и полезные советы и предложения для хорошего оборудования / хорошей библиотеки с открытым исходным кодом, или два, или три, или десять?

Добавлено:

Блог Создание компьютера Arduino Uno для всех, кому интересно.

Линкольн Берджесон
источник
Это похоже на мой сумасшедший проект;) Я с нетерпением жду, как вы с этим справитесь. Я надеюсь, вы будете вести блог о своем прогрессе
Majenko
1
Я просто хотел указать на подобный проект, который может представлять интерес. Parallax Propeller чип видел довольно много развития, насколько BASIC обеспокоен. Доступно как минимум два разных переводчика. Плюс он имеет возможность напрямую выводить сигнал на телевизор монитора.
AndrejaKo
1
Есть даже демонстрационная плата с VGA, телевизором, клавиатурой и мышью PS / 2, аудио и еще несколькими разъемами. Теперь я знаю, что вы хотите сделать это с Arduino, но по крайней мере вы могли бы использовать схемы плат, представленные там, чтобы получить некоторые основные указатели на то, как они генерировали сигналы и так далее (все это в программном обеспечении).
AndrejaKo
Также +1 за желание сделать что-то подобное! Я помню еще в начальной школе, когда мы перешли с компьютера Orao на компьютеры Pentium III, Бейсик потерял все свое очарование.
AndrejaKo
1
Альтернативой использованию VGA-дисплея является снятие ЖК-экрана и использование его для дисплея. Возможно, вам придется щуриться, но с ним будет гораздо проще!
SingleNegationElimination

Ответы:

11

Клавиатуру можно сделать просто, используя клавиатуру PS / 2 - она ​​просто последовательная, и для нее есть множество обучающих программ.

Хранить данные можно просто на SD-карте - для этого уже есть щит.

Что касается видео - это значительно сложнее. Если вы хотите, чтобы Arduino генерировал, например, видеосигнал PAL, тогда ваша работа исключена для вас. Да, это возможно, и кто-то создал Arduino-игру «понг», но это очень короткая графика и только черно-белая.

Для VGA вам потребуется какой-то интерфейс, чтобы сделать работу за вас. Sparkfun продавал видеокарту Picaso, которую можно было бы использовать для работы с Arduino, но, увы, он был снят с производства, и пока нет планов его замены.

TBH ваш лучший выбор будет использовать что-то вроде терминала Wyse и общаться с Arduino полностью через последовательный порт. Гораздо проще, чем возиться с видеосигналами и тому подобным.

Majenko
источник
3

Я вижу точку зрения Олина - если вы хотите редактировать / запускать / изучать бейсик, просто используйте компьютер.

Однако, если целью является задача создания компьютера, который может запускать BASIC и одновременно изучать аппаратное обеспечение и реализацию более низкого уровня, то это будет немного иначе. Я за такие вещи, это отличный способ улучшить знания, и я уверен, что вы многое из этого получите. Как Стивен упоминает все запутанные и (в основном) нерелевантные слои, которые есть, например, в Windows, могут быть удалены, оставляя базовые (без каламбура) концепции.

В любом случае, вам, возможно, захочется взглянуть на что-то более мощное, например PIC32, поскольку оно должно иметь возможность самостоятельно справляться со всеми функциями (например, с базовым VGA).
Вот плата, совместимая с Arduino, UNO32
. Maximite - это компьютер с интерпретатором BASIC, основанный на PIC32, вы можете взглянуть на дизайн и конструкцию для нескольких идей.

Оли Глейзер
источник
Учитывая характеристики ПК под управлением Microsoft Basic под Z80, не должно быть никаких проблем.
Маккензм
2

Вам повезло, вроде как, потому что я сейчас работаю на Arduino PC! Это не так много, только первая модель. Прошивка также очень проста и имеет небольшой набор API. Но вещь работает! Недостаточно хорошо для редактирования BASIC (или любого языка, кроме его собственного), но это только первая модель. Мобо довольно прост, и я использовал это . Вот прошивка, которую я использовал:

        #include <LCD4884.h>
#include <SD.h>
#include <SPI.h>
#include <SoftwareSerial.h>

void setup() {   
    lcd.LCD_init();             
    lcd.LCD_clear();
    lcd.LCD_write_string_big(0, 0, "Gilbert", MENU_NORMAL);
    pinMode(10, OUTPUT);
    delay(3000);
}

byte line = 10;
SoftwareSerial FC(8,9);
byte RAM[501];
byte Error = 0;
char tempString[15];

void loop() {
    // <editor-fold defaultstate="collapsed" desc="Initilization">
    FC.begin(4800);
    if (!FC.available()) {
        lcd.LCD_clear();
        lcd.LCD_write_string(0, 0, "FC Failed!", MENU_NORMAL);
        delay(1000);
    }
    int address = 1;
    lcd.LCD_clear();
    lcd.LCD_write_string(0, 0, "SD Init...", MENU_NORMAL);
    if (!SD.begin(10)) {
        lcd.LCD_clear();
        lcd.LCD_write_string(0, 0, "SD Failed!", MENU_NORMAL);
        while (true) {
            ;
        }
    }
    lcd.LCD_clear();
    lcd.LCD_write_string(0, 0, "Loading...", MENU_NORMAL);
    File file;
    file = SD.open("BIOS.mk8", FILE_READ);
    RAM[0] = 53;
    RAM[file.read()] = 8;
    while (file.available()) {
        RAM[address] = file.read();
        address++;
    }
    address++;
    RAM[address] = 55;
    long loops = 0;
    long time1 = 0;
    long time2 = 0;
    address = 0;
    byte instruction = 0;
    int exeaddress;
    byte tempbyte;
    lcd.LCD_clear();
    lcd.LCD_write_string(0, 0, "EMU. Started", MENU_NORMAL);// </editor-fold>
    //emulation loop
    while(true){
        switch(RAM[address]){
            // <editor-fold defaultstate="collapsed" desc="Codes 1-10">
            case 1:
            {//getCycleCount[intvar i]
                tempbyte = (loops) / ((time2 - time1) / 1000);
                convert(address + 1);
                writeInt(exeaddress, tempbyte);
                break;
            }
            case 2:
            {//getTemp[intvar i]
                tempbyte = (((analogRead(A1) / 1024.0) * 5.0) - .5) * 100;
                convert(address + 1);
                writeInt(exeaddress, tempbyte);
                break;
            }
            case 3:
            {//getKey[intvar i]
                //Up 745
                //Down 332
                //Left 0
                //Right 509
                //Center 145
                switch (analogRead(A0)) {
                    case 745:
                    {
                        tempbyte = 1;
                        break;
                    }
                    case 332:
                    {
                        tempbyte = 2;
                        break;
                    }
                    case 0:
                    {
                        tempbyte = 3;
                        break;
                    }
                    case 509:
                    {
                        tempbyte = 4;
                        break;
                    }
                    case 145:
                    {
                        tempbyte = 5;
                        break;
                    }
                }
                convert(address + 1);
                writeInt(exeaddress, tempbyte);
                break;
            }
            case 4:
            {//printLine[variable v]
                if (line > 70) {
                    lcd.LCD_clear();
                    line = 0;
                }
                switch(RAM[address + 1]){
                    case 9:{
                        tempbyte = RAM[address + 1];
                        tempString[0] = char(tempbyte);
                        break;
                    }
                    case 15:{
                        convert(address + 1);
                        break;
                    }
                }
                lcd.LCD_write_string(0, line, tempString, MENU_NORMAL);
                line += 10;
                break;
            }
            case 5:
            {//exe detector
                exeaddress = address;
                break;
            }
            case 7:
            {//lcdClear
                lcd.LCD_clear();
                line = 0;
                break;
            }
            case 10:
            {//declareInteger[string name]
                convert(address + 1);
                tempbyte = 0;
                while (tempbyte != 15) {
                    RAM[address + tempbyte + 1] = tempString[tempbyte];
                }
                break;
            }// </editor-fold>
            case 11:{//getError[intvar i]
                tempbyte = Error;
                Error = 0;
                convert(address + 1);
                writeInt(exeaddress, tempbyte);
                break;
            }
            case 12:{//deadlock
                while(true){;}
                break;
            }
            case 13:{//assignInteger[int value, intvar i]
                tempbyte = RAM[address + 1];
                convert(address + 2);
                writeInt(exeaddress, tempbyte);
                break;
            }
            case 14:{//transferInteger[intvar i1, intvar i2]
                convert(address + 1);
                writeInt(exeaddress, RAM[getIntAddr(exeaddress)]);
                break;
            }
        }
        // <editor-fold defaultstate="collapsed" desc="post loop process">
        address++;
        time2 = millis();
        loops++;
        if (loops < 0) {
            loops = 0;
        }// </editor-fold>
    }
}

void convert(int startAddress){
    byte charadd = 0;
    while(RAM[startAddress] != 6){
        tempString[charadd] = RAM[startAddress];
        charadd++;
        startAddress++;
    }
}

void writeInt(int exeStart, byte value){
    byte count = 0;
    char compare[15];
    while(true){
        if (RAM[exeStart] == 9) {
            exeStart++;
            while (count != 15) {
                compare[count] = RAM[exeStart];
                exeStart++;
                count++;
            }
            if(compare == tempString){
                RAM[exeStart + 2] = value;
                break;
            }else{
                exeStart += 3;
            }
            if(RAM[exeStart] == 8){
                Error = 1;
            }
        }
    }
}

int getIntAddr(int exeStart){
    byte count = 0;
    char compare[15];
    while(true){
        if (RAM[exeStart] == 9) {
            exeStart++;
            while (count != 15) {
                compare[count] = RAM[exeStart];
                exeStart++;
                count++;
            }
            if(compare == tempString){
                return RAM[exeStart + 2];
                break;
            }else{
                exeStart += 3;
            }
            if(RAM[exeStart] == 8){
                Error = 1;
            }
        }
    }
}

Описание метода сложно объяснить, но код хранится в виде необработанных байтов. Я должен скоро разработать программное обеспечение ... Надеюсь, это поможет! Если вы когда-либо захотите использовать это для каких-либо проектов, вы ДОЛЖНЫ ИМЕТЬ файл BIOS.mk8 в корневом каталоге SD, иначе система не будет работать.

Хака
источник
1
К счастью, если он не понял это за три года, с тех пор как он впервые спросил
Скотт Сейдман
@ ScottSeidman Да, хорошая мысль. Также прошивка все еще находится в стадии тестирования, и в этой версии отсутствуют ключевые элементы.
Хака
1

При всем моем уважении к Дэвиду Брину (мне очень нравятся его книги; я не квалифицирован, чтобы судить, насколько он хорош в качестве астрофизика), он не программист и не педагог.

Я был в курсе и программировал в первые дни ПК, и я написал довольно много кода на бейсике. И с тех пор я профессионально пишу код.

Причина, по которой мы тогда использовали BASIC, заключалась в том, что у вас было два варианта - использовать BASIC или писать в сборке, а сборку было сложнее понять и гораздо труднее использовать. Итак, бейсик.

С тех пор за 30 с лишним лет в обучении программированию произошли значительные улучшения. Моя жена преподает начальный класс программирования, который использует Алису (www.alice.org), и это намного лучше концептуально, чем старые подходы.

Я думаю, что решение Брина было довольно элегантным. Вы можете создать что-нибудь довольно простое на Raspberry PI. На Arduino, я думаю, будет сложно собрать все необходимое в 2K RAM; он должен содержать любую ОС / монитор, которую вы в итоге пишете, интерпретатор команд, код для отображения и хранилище для самой базовой программы.

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

Эрик Ганнерсон
источник
0

Я не понимаю Если вы хотите, чтобы у вас были только средства для программирования на Basic, запустите на вашем компьютере базовый переводчик. Я не понимаю, как вы ожидаете, что Arduino поможет с этим. Arduino - это микроконтроллер с множеством модных программ, позволяющих скрыть детали оборудования. Отчасти это связано с более низкой производительностью и большим использованием ресурсов, чем с аналогичной программой, работающей непосредственно на голом микроконтроллере. Теперь вы хотите написать код Arduino, чтобы превратить его в компьютер более общего назначения, и все, чтобы вы в свою очередь могли запустить интерпретатор Basic на этом компьютере общего назначения? Это имеет мало смысла.

Поскольку ваша единственная цель - иметь возможность редактировать и выполнять базовые программы (запускать интерпретатор Basic), начните с вычислительной платформы более общего назначения, предпочтительно даже с уже имеющейся интерпретатором Basic. У вашего ПК именно такая платформа. Если вы хотите, чтобы это было внешнее оборудование, похоже, что готовый одноплатный компьютер будет отвечать вашим потребностям гораздо лучше, чем Arduino.

Добавлено:

Теперь вы говорите, что не хотите запускать на ПК, и разместите эту ссылку о ком-то, кто хочет, чтобы у его ребёнка была базовая строка Basic. По общему признанию, я не читал всю статью (мне не нравятся люди, отвечающие ссылками. Вы должны быть в состоянии изложить свою точку зрения независимо в нескольких предложениях), но я не вижу, как на ПК работает командная строка Базовый интерпретатор не решает вашу проблему. Почему интерпретатор Basic не может работать на ПК, но нормально работать на Arduino? Помните, вы заранее сказали, что ваша единственная цель - редактировать и запускать базовые программы. Ничто в этом утверждении не говорит о том, на каком оборудовании оно должно работать, и ни одно из ваших последующих объяснений не объясняет, почему ПК не будет работать нормально.

Вероятно, есть основные интерпретаторы, которые запускаются в командной строке. Старый QBASIC все еще может работать в режиме совместимости с DOS. Даже если нет, так как вы готовы посвятить этому оборудование, как работает DOS и QBASIC на ПК, а не то, что вы просили?

Олин Латроп
источник
Я хотел сказать, что я не хочу программировать на ПК. Я хочу программировать в аналогичной среде, например, в Texas Instruments TI-84 +. Моя причина для этого? Проверьте следующую ссылку, «Почему Джонни не может кодировать
Линкольн Берджесон
3
Это не совсем ответ. Да, идея ОП может быть немного левее центра, но где бы мы были, если бы никто никогда не пробовал что-то необычное или раздвинуло пределы того, что уже существует? Говорить ОП, что это глупая идея, ни полезно, ни конструктивно. ОП решил, что он хотел бы сделать это, и просит нас помочь с этим. Он не спрашивает, хорошая это идея или нет. Да, это может быть Плохая Идея ™, но ОП узнает огромное количество, когда узнает, что само по себе может быть более ценным, чем конечный результат.
Майенко
@Majenko: То, что я написал, является разумным ответом на то, что первоначально написал ОП. Помните, он сказал: « Моя единственная цель для этого компьютера - возможность редактировать и выполнять программы BASIC ». Это ничего не говорит о том, что он работает на альтернативном оборудовании. Видимо, он хочет простой переводчик командной строки Basic для обучения детей. Как работает такая вещь на ПК не правильный ответ? Разве ПК не работает с QBASIC или что-то, что он просит?
Олин Латроп
1
@ Олин ОП согласен со мной ... Я думаю, вы неправильно поняли вопрос.
Майенко
2
@ Олин - я могу понять, Баттс. Помните домашние компьютеры конца 70-х, начала 80-х? Вы добавили отображение 74LS373 в память, и вы могли контролировать операции ввода-вывода с помощью pokeоператоров. Не нужно устанавливать виртуальные драйверы COM, не подключать USB к каким-либо мостам, не загружать сложные IDE для разработчиков. SBC сопоставимы, но, как правило, не имеют интерфейса клавиатуры / видео (и кассетного хранилища!) Домашних компьютеров.
Стивенвх
0

Мне нравится идея запуска общего приложения, такого как BASIC на Arduino, особенно если вы сами его создали. Мне нравится удобство удобного устройства Arduino с питанием от батареи, на котором работает нужное мне приложение. Если бы это был я, я бы использовал Arduino MEGA, поэтому у меня было бы достаточно контактов для клавиатуры и SD-экрана для хранения.

Я бы выбрал цветной графический ЖК-дисплей или TFT-экран вместо VGA для простоты программирования и подключения, способа отслеживания даты и времени (RTC) и что такое приложение без интернета или сети (экран Ethernet)? Может быть, дополнительные I2C RAM (24LC256)? И несколько I2C MCP223017 на всякий случай, если мне понадобятся несколько дополнительных портов. Как насчет того, чтобы несколько Arduino выполняли параллельное задание? Я уверен, что это улучшит производительность.

Марк Наварро
источник
Ссылки на таблицы приветствуются сообществом. Кроме того, пожалуйста, не используйте слишком много прописных букв и убедитесь, что ваш ответ читается, добавив пробелы.
2
Это очень плохой ответ. Но здесь есть некоторые чувства, которые могут быть полезны, если их почистить и лучше представить.
Крис Страттон