Tạo một máy tính chức năng từ Arduino Uno


8

Bất kỳ người đam mê Arduino ngoài kia?

Này, tôi đã nghĩ về điều này và càng nghĩ về nó, tôi càng nghĩ rằng tôi thực sự có thể làm điều này. Ý tưởng của tôi về cơ bản là thế này: Tạo một máy tính chức năng từ một vi điều khiển Arduino Uno.

Mục tiêu duy nhất của tôi cho máy tính này là khả năng chỉnh sửa và thực hiện các chương trình BASIC. Đó là tất cả. Tôi chỉ muốn nó cho lập trình, vì đó chỉ là điều duy nhất tôi quan tâm bây giờ :)

Vì vậy, theo cách tôi thấy, tôi sẽ cần ba thành phần phần cứng chính:

  1. một số dạng của màn hình (màn hình VGA hoặc thứ gì đó)
  2. một số cách để đăng ký đầu vào bàn phím và
  3. một số cách để lưu trữ dữ liệu vào bộ nhớ ngoài.

Có ai biết cách nào để làm điều này? Tôi biết các cách để hiển thị trên màn hình, nhưng tôi không biết một thành phần API / phần cứng tốt để đăng ký đầu vào bàn phím hoặc để lưu trữ bộ nhớ ngoài.

Tôi sẽ cần rất nhiều sự giúp đỡ về điều này. Bất cứ ai có thể giúp tôi ra và đưa ra các ý tưởng cũng như các mẹo và đề xuất hữu ích cho phần cứng tốt / một thư viện mã nguồn mở tốt, hoặc hai, hoặc ba, hoặc mười?

Thêm:

Blog Làm một máy tính Arduino Uno cho bất cứ ai quan tâm.


Điều này nghe có vẻ giống như dự án bện tóc của tôi;) Tôi mong muốn được nghe cách bạn tiếp tục với nó. Tôi hy vọng bạn sẽ viết blog tiến trình của bạn.
Majenko

1
Tôi chỉ muốn chỉ ra một dự án tương tự có thể được quan tâm. Các Parallax Propeller con chip đã chứng kiến khá nhiều sự phát triển như xa như BASIC là có liên quan. Có ít nhất hai thông dịch viên khác nhau có sẵn. Thêm vào đó, nó có khả năng truyền tín hiệu trực tiếp đến TV của màn hình.
AndrejaKo

1
Thậm chí còn có Board Demo có VGA, TV, bàn phím và chuột PS / 2, âm thanh và một vài đầu nối khác. Bây giờ tôi biết rằng bạn muốn làm điều này với Arduino, nhưng ít nhất bạn có thể sử dụng sơ đồ bảng được trình bày ở đó để có được một số gợi ý cơ bản về cách chúng tạo tín hiệu và v.v. (tất cả đều bằng phần mềm).
AndrejaKo

Cũng +1 vì muốn làm một cái gì đó như thế này! Tôi nhớ hồi còn học tiểu học, khi chúng tôi chuyển từ máy tính Orao sang máy tính Pentium III BASIC đã mất tất cả sự quyến rũ của nó.
AndrejaKo

1
Một cách khác để sử dụng màn hình VGA là lấy tấm chắn LCD và sử dụng màn hình đó cho màn hình. Bạn có thể phải nheo mắt, nhưng giao tiếp với nó sẽ dễ dàng hơn!
SingleNegationElimination

Câu trả lời:


11

Bàn phím có thể được thực hiện đơn giản bằng cách sử dụng bàn phím PS / 2 - nó chỉ là nối tiếp và có rất nhiều hướng dẫn dành cho nó.

Lưu trữ dữ liệu có thể được thực hiện đơn giản trên thẻ SD - đã có một lá chắn để thực hiện điều đó.

Đối với video - điều đó khó hơn đáng kể. Nếu bạn muốn Arduino tạo tín hiệu video PAL chẳng hạn thì bạn phải cắt bỏ công việc của mình. Vâng, điều đó là có thể, và ai đó đã tạo ra một trò chơi "pong" Arduino, nhưng đó là đồ họa rất chunky và chỉ có màu đen và trắng.

Đối với VGA, bạn sẽ cần một số hình thức giao diện để thực hiện công việc cho bạn. Sparkfun đã từng bán card màn hình Picaso có thể được sản xuất để hoạt động với Arduino, nhưng than ôi đã bị ngưng và chưa có kế hoạch nào để thay thế.

TBH đặt cược tốt nhất của bạn sẽ là sử dụng một cái gì đó như thiết bị đầu cuối Wyse và giao tiếp với Arduino hoàn toàn bằng cách sử dụng nối tiếp. Đơn giản hơn nhiều so với làm rối với tín hiệu video và như vậy.


3

Tôi thấy quan điểm của Olin ở đây - nếu bạn chỉ muốn chỉnh sửa / chạy / học BASIC, chỉ cần sử dụng PC.

Tuy nhiên, nếu mục tiêu là thách thức tạo ra một máy tính có thể chạy BASIC và tìm hiểu về phần cứng và triển khai cấp thấp hơn cùng một lúc thì điều này hơi khác một chút. Tôi là tất cả những thứ như thế này, đó là một cách tuyệt vời để nâng cao kiến ​​thức và chắc chắn bạn sẽ nhận được rất nhiều từ nó. Như Steven đề cập đến tất cả các lớp khó hiểu và (hầu hết) không liên quan, ví dụ Windows có thể bị loại bỏ, để lại các khái niệm cơ bản (không có ý định chơi chữ).

Dù sao, bạn có thể muốn xem xét thứ gì đó mạnh hơn một chút như PIC32 cho điều này, vì nó có thể xử lý tất cả các chức năng (ví dụ như VGA cơ bản).
Dưới đây là một bảng Arduino tương thích, UNO32
Các Maximite là một máy tính với BASIC thông dịch dựa trên một PIC32, bạn có thể muốn nhìn vào thiết kế và xây dựng cho một vài ý tưởng.


Với thông số kỹ thuật của PC chạy Microsoft Basic theo Z80, sẽ không có vấn đề thực sự.
mckenzm

2

Bạn thật may mắn, vì tôi thực sự đang làm việc trên một PC arduino ngay bây giờ! Nó không phải là nhiều mặc dù, chỉ có mô hình đầu tiên. Phần sụn cũng rất đơn giản và có một bộ API nhỏ. Nhưng, điều này hoạt động! Không đủ tốt để chỉnh sửa BASIC (hoặc bất kỳ ngôn ngữ nào ngoại trừ ngôn ngữ của chính nó), nhưng đây chỉ là mô hình đầu tiên. Mobo khá đơn giản, và tôi đã sử dụng . Đây là phần sụn tôi đã sử dụng:

        #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;
            }
        }
    }
}

Mô tả phương thức khó giải thích, nhưng mã được lưu trữ dưới dạng byte thô. Tôi nên sớm phát triển phần mềm ... Hy vọng điều này sẽ giúp! Nếu bạn muốn sử dụng nó cho bất kỳ dự án nào, BẠN PHẢI CÓ tệp BIOS.mk8 trên thư mục gốc của SD hoặc hệ thống sẽ không hoạt động.


1
Thật may mắn, nếu anh ta không phát hiện ra điều đó trong ba năm kể từ lần đầu tiên anh ta hỏi
Scott Seidman

@ScottSeidman Vâng, điểm tốt. Ngoài ra, phần sụn vẫn đang trong quá trình thử nghiệm và phiên bản này thiếu các yếu tố chính.
Jaca

1

Với tất cả sự tôn trọng dành cho David Brin (tôi rất thích những cuốn sách của anh ấy; tôi không đủ tư cách để đánh giá anh ấy là một nhà vật lý thiên văn giỏi như thế nào), anh ấy không phải là một lập trình viên hay một nhà giáo dục.

Tôi đã ở xung quanh và viết mã trong những ngày đầu của PC, và tôi đã viết một số lượng mã BASIC khá lớn. Và tôi đã viết mã chuyên nghiệp kể từ đó.

Lý do chúng tôi sử dụng BASIC trước đó là vì hai tùy chọn của bạn là sử dụng BASIC hoặc viết trong lắp ráp, và lắp ráp khó hiểu hơn và khó sử dụng hơn nhiều. Vì vậy, CƠ BẢN.

Trong hơn 30 năm kể từ đó, đã có những cải tiến đáng kể trong hướng dẫn lập trình. Vợ tôi dạy một lớp lập trình ban đầu sử dụng Alice (www.alice.org), và về mặt khái niệm tốt hơn nhiều so với các phương pháp cũ.

Tôi nghĩ giải pháp của Brin khá thanh lịch. Bạn có thể xây dựng một cái gì đó khá đơn giản trên Raspberry PI. Trên arduino, tôi nghĩ sẽ rất khó khăn để nhét mọi thứ bạn cần vào 2K RAM; phải giữ bất cứ hệ điều hành / giám sát nào mà bạn kết thúc bằng văn bản, trình thông dịch lệnh, mã để hiển thị và lưu trữ cho chính chương trình cơ bản.

Chưa kể đến việc bạn sẽ phải thực hiện rất nhiều chương trình khó và tùy chỉnh để bạn có thể viết mã trong một môi trường đơn giản.


0

Tôi không hiểu Nếu bạn chỉ muốn có một phương tiện để lập trình trong Basic, hãy chạy trình thông dịch cơ bản trên PC của bạn. Tôi không hiểu làm thế nào bạn mong đợi Arduino sẽ giúp với điều này. Arduino là một vi điều khiển với rất nhiều phần mềm lạ mắt để ẩn các chi tiết phần cứng. Một phần chi phí đó là hiệu năng thấp hơn và sử dụng nhiều tài nguyên hơn so với chương trình tương đương chạy trực tiếp trên vi điều khiển trần. Bây giờ bạn muốn viết mã Arduino để biến nó trở lại thành một máy tính có mục đích chung hơn, tất cả để bạn có thể lần lượt chạy một trình thông dịch cơ bản trên máy tính có mục đích chung đó? Điều này làm cho rất ít ý nghĩa.

Vì mục tiêu duy nhất của bạn là có thể chỉnh sửa và thực thi các chương trình Cơ bản (chạy trình thông dịch cơ bản), nên bắt đầu với một nền tảng điện toán có mục đích chung hơn ở nơi đầu tiên, tốt nhất là ngay cả một chương trình đã có sẵn trình thông dịch cơ bản. PC của bạn chính xác là một nền tảng như vậy. Nếu bạn muốn đây là phần cứng bên ngoài, có vẻ như một chiếc máy tính bảng đơn có sẵn sẽ đáp ứng nhu cầu của bạn tốt hơn nhiều so với Arduino.

Thêm:

Bây giờ bạn nói rằng bạn không muốn chạy trên PC và trang web liên kết này về ai đó muốn dòng lệnh Cơ bản cho con mình học hỏi. Phải thừa nhận rằng tôi đã không đọc toàn bộ bài viết (Tôi không thích mọi người trả lời bằng các liên kết. Bạn sẽ có thể nêu quan điểm của mình một cách độc lập trong một vài câu), nhưng tôi không thấy cách PC chạy trình thông dịch cơ bản dòng lệnh không giải quyết vấn đề của bạn. Tại sao trình thông dịch cơ bản không được phép chạy trên PC nhưng vẫn ổn để chạy trên Arduino? Hãy nhớ rằng, bạn đã nói trước rằng mục tiêu duy nhất của bạn là chỉnh sửa và chạy các chương trình Cơ bản. Không có gì trong tuyên bố đó nói phần cứng nào phải chạy trên đó và không có lời giải thích nào sau đó của bạn giải thích tại sao PC sẽ không hoạt động tốt.

Có lẽ có các thông dịch viên cơ bản chạy trên dòng lệnh. QBASIC cũ vẫn có thể hoạt động ở một số chế độ tương thích với DOS. Ngay cả khi không, vì bạn sẵn sàng dành phần cứng cho việc này, làm thế nào để chạy DOS và QBASIC trên PC không cung cấp những gì bạn yêu cầu?


Quan điểm của tôi là tôi không muốn lập trình trên PC. Tôi muốn lập trình trong một môi trường tương tự, ví dụ như, Texas-TI-84 +. Lý do của tôi cho điều này? Kiểm tra liên kết sau, "Tại sao Johnny không thể viết mã" salon.com/t Technology / feature / 2006/09/14 / basic / index.html
Lincoln Bergeson

3
Đây không thực sự là một câu trả lời. Vâng, ý tưởng về OP có thể là một chút trung tâm, nhưng chúng ta sẽ ở đâu nếu không ai từng thử bất cứ điều gì khác thường, hoặc để đẩy các giới hạn của những gì đã tồn tại? Nói với OP rằng đó là một ý tưởng ngớ ngẩn không hữu ích cũng không mang tính xây dựng. OP đã quyết định rằng anh ấy thích làm điều đó và đang yêu cầu chúng tôi giúp đỡ về cách thực hiện. Anh ấy không hỏi liệu đó có phải là một ý tưởng tốt hay không. Vâng, nó có thể là một ý tưởng tồi ™, nhưng OP sẽ học được một lượng lớn trong khi tìm ra điều đó, bản thân nó có thể có giá trị hơn kết quả cuối cùng.
Majenko

@Majenko: Những gì tôi viết là một câu trả lời hợp lý cho những gì OP ban đầu đã viết. Hãy nhớ rằng, ông nói " Mục tiêu duy nhất của tôi cho máy tính này là khả năng chỉnh sửa và thực hiện các chương trình BASIC ". Điều này không nói bất cứ điều gì về nó chạy trên phần cứng thay thế. Rõ ràng anh ta muốn một trình thông dịch cơ bản dòng lệnh đơn giản để dạy trẻ em. Làm thế nào để chạy một thứ như vậy trên PC không phải là một câu trả lời hợp lệ? Không phải là PC chạy QBASIC hay chính xác những gì anh ta yêu cầu?
Olin Lathrop

1
@Olin OP đồng ý với tôi ... Tôi nghĩ bạn đang hiểu sai câu hỏi.
Majenko

2
@Olin - Tôi có thể hiểu Butts. Nhớ máy tính gia đình cuối thập niên 70, đầu thập niên 80? Bạn đã thêm bộ nhớ ánh xạ 74LS373 và bạn có thể điều khiển I / O thông qua pokebáo cáo. Không có trình điều khiển COM ảo để cài đặt, không có USB cho bất kỳ cầu nối nào, không có IDE nhà phát triển phức tạp để tải. SBC tương đương nhau, nhưng thường thiếu giao diện bàn phím / video (và bộ lưu trữ băng từ!) Của các máy tính gia đình.
stevenvh


0

Tôi thích ý tưởng chạy một ứng dụng thông thường, chẳng hạn như BASIC trên Arduino đặc biệt là nếu bạn tự xây dựng nó. Tôi thích sự tiện lợi khi có một thiết bị Arduino tiện dụng, chạy bằng pin chạy ứng dụng tôi muốn. Nếu là tôi, tôi có thể sử dụng Arduino MEGA vì vậy tôi có đủ chân cho bàn phím và tấm chắn SD để lưu trữ.

Tôi muốn chọn màn hình LCD đồ họa màu hoặc màn hình LCD qua VGA để đơn giản trong lập trình và kết nối, cách theo dõi ngày và giờ (RTC), và ứng dụng nào không có internet hoặc mạng (lá chắn ethernet)? RAM I2C bổ sung (24LC256) có thể? Và một vài I2C MCP223017 chỉ trong trường hợp tôi cần thêm một vài cổng. Làm thế nào về nhiều Arduino đang làm một nhiệm vụ song song? Điều đó sẽ cải thiện hiệu suất tôi chắc chắn.


Liên kết đến datasheets được cộng đồng đánh giá cao. Ngoài ra, vui lòng không sử dụng quá nhiều chữ hoa và đảm bảo câu trả lời của bạn có thể đọc được bằng cách thêm khoảng trắng.

2
Như là, đây là một câu trả lời rất kém chất lượng. Nhưng có một số tình cảm ở đây có thể đáng giá nếu được làm sạch và trình bày tốt hơn.
Chris Stratton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.