Membuat Komputer Fungsional dari Arduino Uno

8

Adakah penggemar Arduino di luar sana?

Hei, saya sudah memikirkan hal ini dan semakin saya memikirkannya, semakin saya pikir saya bisa melakukan ini. Ide saya pada dasarnya adalah ini: Membuat komputer fungsional dari mikrokontroler Arduino Uno.

Satu-satunya tujuan saya untuk komputer ini adalah kemampuan untuk mengedit dan menjalankan program BASIC. Itu saja. Saya hanya menginginkannya untuk pemrograman, karena hanya itulah satu-satunya hal yang saya minati sekarang :)

Jadi seperti yang saya lihat, saya akan membutuhkan tiga komponen perangkat keras utama:

  1. beberapa bentuk tampilan (layar VGA atau sesuatu)
  2. beberapa cara untuk mendaftarkan input keyboard, dan
  3. beberapa cara untuk menyimpan data ke memori eksternal.

Adakah yang tahu cara untuk melakukan ini? Saya tahu cara menampilkan ke layar, tetapi saya tidak tahu komponen API / perangkat keras yang baik untuk mendaftarkan input keyboard atau untuk menyimpan memori eksternal.

Saya akan membutuhkan banyak bantuan dalam hal ini. Adakah yang bisa membantu saya dan menawarkan ide dan tips serta saran yang berguna untuk perangkat keras yang baik / perpustakaan open source yang bagus, atau dua, atau tiga, atau sepuluh?

Ditambahkan:

Blog Membuat Arduino Uno Computer untuk siapa saja yang tertarik.

Lincoln Bergeson
sumber
Ini kedengarannya seperti proyek saya yang berotak rambut;) Saya berharap dapat mendengar bagaimana Anda melanjutkannya. Saya harap Anda akan mencatat kemajuan Anda di blog.
Majenko
1
Saya hanya ingin menunjukkan proyek serupa yang mungkin menarik. The Parallax Propeller chip yang telah melihat cukup banyak pembangunan sejauh BASIC yang bersangkutan. Setidaknya ada dua penerjemah berbeda yang tersedia. Plus itu memiliki kemampuan untuk langsung mengeluarkan sinyal ke TV monitor.
AndrejaKo
1
Bahkan ada Papan Demo yang memiliki VGA, TV, keyboard dan mouse PS / 2, audio dan beberapa konektor lainnya. Sekarang saya tahu bahwa Anda ingin melakukan ini dengan Arduino, tetapi setidaknya Anda dapat menggunakan skema papan yang disajikan di sana untuk mendapatkan beberapa petunjuk dasar tentang cara mereka menghasilkan sinyal dan seterusnya (semuanya dalam perangkat lunak).
AndrejaKo
Juga memberi +1 untuk yang ingin melakukan sesuatu seperti ini! Saya ingat kembali di sekolah dasar ketika kami pindah dari komputer Orao ke komputer Pentium III, BASIC kehilangan semua pesonanya.
AndrejaKo
1
Alternatif untuk menggunakan layar VGA adalah dengan mengambil perisai LCD dan menggunakannya untuk tampilan. Anda mungkin harus menyipitkan mata, tetapi berinteraksi dengannya akan lebih mudah!
SingleNegationElimination

Jawaban:

11

Keyboard dapat dilakukan hanya dengan menggunakan keyboard PS / 2 - ini hanya serial, dan ada banyak tutorial untuk itu.

Menyimpan data dapat dilakukan hanya dengan kartu SD - ada perisai di luar sana yang sudah melakukannya.

Adapun video - itu jauh lebih sulit. Jika Anda ingin Arduino menghasilkan sinyal video PAL misalnya, maka Anda memiliki pekerjaan yang cocok untuk Anda. Ya, itu mungkin, dan seseorang telah menciptakan gim Arduino "pong", tetapi grafisnya sangat chunky dan hanya hitam putih.

Untuk VGA Anda akan memerlukan beberapa bentuk antarmuka untuk melakukan pekerjaan untuk Anda. Sparkfun digunakan untuk menjual kartu video Picaso yang dapat dibuat untuk bekerja dengan Arduino, tetapi sayangnya itu telah dihentikan dan belum ada rencana untuk penggantian.

TBH taruhan terbaik Anda adalah menggunakan sesuatu seperti terminal Wyse dan berkomunikasi dengan Arduino sepenuhnya menggunakan serial. Jauh lebih sederhana daripada mengotak-atik sinyal video dan semacamnya.

Majenko
sumber
3

Saya melihat poin Olin di sini - jika Anda hanya ingin mengedit / menjalankan / mempelajari BASIC hanya menggunakan PC.

Namun jika tujuannya adalah tantangan menciptakan komputer yang dapat menjalankan BASIC dan belajar tentang perangkat keras dan implementasi tingkat yang lebih rendah pada saat yang sama maka ini sedikit berbeda. Saya mendukung hal-hal seperti ini, ini adalah cara yang bagus untuk meningkatkan pengetahuan dan saya yakin Anda akan mendapat banyak manfaat darinya. Seperti Steven menyebutkan semua lapisan membingungkan dan (sebagian besar) tidak relevan yang misalnya Windows telah dapat dilepaskan, meninggalkan konsep dasar (tidak ada kata pun dimaksudkan).

Pokoknya, Anda mungkin ingin melihat sesuatu yang sedikit lebih kuat seperti PIC32 untuk ini, karena harus dapat menangani semua fungsi (misalnya VGA dasar) pada itu sendiri.
Ini adalah papan yang kompatibel dengan Arduino, UNO32
The Maximite adalah komputer dengan penerjemah BASIC yang berbasiskan PIC32, Anda mungkin ingin melihat Desain dan Konstruksi untuk beberapa ide.

Oli Glaser
sumber
Mengingat spesifikasi PC yang menjalankan Microsoft Basic di bawah Z80, seharusnya tidak ada masalah nyata.
mckenzm
2

Anda beruntung, semacam, karena saya benar-benar bekerja pada PC Arduino sekarang! Itu tidak banyak, hanya model pertama. Firmware juga sangat sederhana, dan memiliki satu set API kecil. Tapi, masalahnya berhasil! Tidak cukup baik untuk mengedit BASIC (atau bahasa apa pun kecuali bahasa sendiri), tetapi ini hanya model pertama. Mobo cukup sederhana, dan saya menggunakan ini . Berikut adalah firmware yang saya gunakan:

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

Deskripsi metode sulit dijelaskan, tetapi kode disimpan sebagai byte mentah. Saya harus segera mengembangkan perangkat lunak ... Semoga ini bisa membantu! Jika Anda pernah ingin menggunakan ini untuk proyek apa pun, ANDA HARUS MEMILIKI file BIOS.mk8 pada direktori root SD atau sistem tidak akan berfungsi.

Jaca
sumber
1
Beruntung memang, jika dia belum mengetahuinya dalam tiga tahun sejak dia pertama kali bertanya
Scott Seidman
@ScottSeidman Ya, poin bagus. Selain itu, firmware masih dalam pengujian, dan versi ini tidak memiliki elemen kunci.
Jaca
1

Dengan segala hormat kepada David Brin (kebetulan saya sangat suka buku-bukunya; Saya tidak memenuhi syarat untuk menilai seberapa baik dia sebagai ahli astrofisika), dia bukan seorang programmer atau pendidik.

Saya ada di sekitar dan coding pada hari-hari awal PC, dan saya menulis cukup banyak kode BASIC. Dan saya sudah menulis kode secara profesional sejak saat itu.

Alasan kami menggunakan BASIC saat itu adalah karena dua pilihan Anda adalah menggunakan BASIC atau menulis dalam pertemuan, dan perakitan lebih sulit untuk dipahami dan jauh lebih rumit untuk digunakan. Jadi, DASAR.

Dalam 30+ tahun sejak itu, ada peningkatan yang signifikan dalam instruksi pemrograman. Istri saya mengajar kelas pemrograman awal yang menggunakan Alice (www.alice.org), dan secara konsep jauh lebih baik daripada pendekatan yang lebih lama.

Saya pikir solusi Brin cukup elegan. Anda dapat membangun sesuatu yang sangat sederhana di Raspberry PI. Di Arduino, saya pikir akan sulit untuk memasukkan semua yang Anda butuhkan ke dalam 2K RAM; yang harus menahan OS / Monitor apa pun yang akhirnya Anda tulis, penerjemah perintah, kode untuk melakukan tampilan, dan penyimpanan untuk program dasar itu sendiri.

Belum lagi fakta bahwa Anda harus melakukan banyak pemrograman yang sulit dan kustom sehingga Anda dapat menulis kode dalam lingkungan yang sederhana.

Eric Gunnerson
sumber
0

Saya tidak mengerti. Jika Anda hanya ingin memiliki sarana untuk memprogram di Basic, jalankan juru bahasa dasar pada PC Anda. Saya tidak mengerti bagaimana Anda berharap Arduino membantu ini. Arduino adalah mikrokontroler dengan banyak perangkat lunak mewah untuk menyembunyikan detail perangkat keras. Bagian dari biaya itu adalah kinerja yang lebih rendah dan penggunaan sumber daya lebih banyak daripada program setara yang dijalankan pada mikrokontroler telanjang secara langsung. Sekarang Anda ingin menulis kode Arduino untuk mengubahnya kembali menjadi komputer tujuan umum, semua sehingga Anda dapat menjalankan interpreter dasar pada komputer tujuan umum itu? Ini tidak masuk akal.

Karena satu-satunya tujuan Anda adalah untuk dapat mengedit dan menjalankan program-program Dasar (menjalankan penerjemah Dasar), mulailah dengan platform komputasi tujuan yang lebih umum, terutama salah satu yang sudah memiliki juru bahasa Dasar yang tersedia. PC Anda adalah platform yang persis seperti itu. Jika Anda ingin ini menjadi perangkat keras eksternal, kedengarannya seperti komputer rak tunggal akan memenuhi kebutuhan Anda jauh lebih baik daripada Arduino.

Ditambahkan:

Anda sekarang mengatakan Anda tidak ingin berjalan di PC dan situs tautan ini tentang seseorang yang ingin belajar baris perintah Dasar untuk anaknya. Memang saya tidak membaca seluruh artikel (saya tidak suka orang-orang menjawab dengan tautan. Anda harus bisa menyatakan pendapat Anda secara independen dalam beberapa kalimat), tetapi saya tidak melihat bagaimana PC menjalankan baris perintah Penerjemah dasar tidak mengatasi masalah Anda. Mengapa penerjemah dasar tidak diizinkan untuk berjalan di PC tetapi tidak apa-apa untuk dijalankan pada Arduino? Ingat, Anda mengatakan di muka bahwa satu-satunya tujuan Anda adalah mengedit dan menjalankan program-program Dasar. Tidak ada dalam pernyataan itu yang mengatakan perangkat keras apa yang harus dijalankan, dan tidak ada penjelasan selanjutnya yang menjelaskan mengapa PC tidak berfungsi dengan baik.

Mungkin ada penerjemah dasar yang berjalan pada baris perintah. QBASIC lama mungkin masih berfungsi di beberapa mode kompatibilitas DOS. Bahkan jika tidak, karena Anda bersedia mendedikasikan perangkat keras untuk ini, bagaimana menjalankan DOS dan QBASIC pada PC tidak memberikan apa yang Anda minta?

Olin Lathrop
sumber
Maksud saya adalah saya tidak ingin memprogram pada PC. Saya ingin memprogram dalam lingkungan yang mirip dengan, misalnya, Texas Instruments TI-84 +. Alasan saya untuk ini? Lihat tautan berikut, "Mengapa Johnny Can't Code" salon.com/technology/feature/2006/09/14/basic/index.html
Lincoln Bergeson
3
Ini sebenarnya bukan jawaban. Ya, ide OP mungkin agak tertinggal dari pusat, tetapi di mana kita akan berada jika tidak ada yang pernah mencoba sesuatu yang luar biasa, atau untuk mendorong batas apa yang sudah ada? Memberitahu OP bahwa itu ide yang konyol tidak membantu atau membangun. OP telah memutuskan bahwa dia ingin melakukannya, dan meminta bantuan kepada kami tentang bagaimana melakukannya. Dia tidak bertanya apakah itu ide yang bagus atau tidak. Ya, itu mungkin Ide Buruk ™, tetapi OP akan belajar banyak sekali sambil mencari tahu, yang mana itu sendiri bisa lebih berharga daripada hasil akhirnya.
Majenko
@Majenko: Apa yang saya tulis adalah jawaban yang masuk akal untuk apa yang awalnya ditulis OP. Ingat, katanya, " Satu-satunya tujuan saya untuk komputer ini adalah kemampuan untuk mengedit dan menjalankan program-program BASIC ". Ini tidak mengatakan apa-apa tentang hal itu berjalan pada perangkat keras alternatif. Rupanya ia menginginkan garis perintah sederhana juru bahasa untuk mengajar anak-anak. Bagaimana menjalankan hal seperti itu di PC bukan jawaban yang valid? Bukankah PC yang menjalankan QBASIC atau sesuatu yang persis seperti yang ia minta?
Olin Lathrop
1
@ Olin OP setuju dengan saya ... Saya pikir Anda salah menafsirkan pertanyaan.
Majenko
2
@Olin - Saya bisa mengerti Butts. Ingat komputer di rumah akhir 70-an, awal 80-an? Anda menambahkan memori yang dipetakan 74LS373 dan Anda dapat mengontrol I / Os melalui pokepernyataan. Tidak ada driver COM virtual untuk diinstal, tidak ada USB ke jembatan apa pun, tidak ada IDE pengembang yang kompleks untuk dimuat. SBC sebanding, tetapi umumnya tidak memiliki antarmuka keyboard / video (dan penyimpanan kaset!) Dari komputer rumah.
stevenvh
0

Saya suka ide menjalankan aplikasi umum, seperti BASIC di Arduino terutama jika Anda membuatnya sendiri. Saya suka kenyamanan memiliki perangkat Arduino yang bertenaga baterai yang menjalankan aplikasi yang saya inginkan. Jika saya, saya akan menggunakan mungkin Arduino MEGA jadi saya akan memiliki cukup pin untuk keypad dan perisai SD untuk penyimpanan.

Saya akan memilih LCD grafis warna atau layar TFT daripada VGA untuk kesederhanaan dalam pemrograman dan koneksi, cara melacak tanggal dan waktu (RTC), dan apa itu aplikasi tanpa internet atau jaringan (ethernet shield)? RAM I2C tambahan (24LC256) mungkin? Dan beberapa I2C MCP223017 kalau-kalau saya perlu beberapa port tambahan. Bagaimana dengan beberapa Arduino yang melakukan tugas paralel? Saya yakin itu akan meningkatkan kinerja.

Tandai Navarro
sumber
Tautan ke lembar data dihargai oleh komunitas. Selain itu, jangan gunakan terlalu banyak huruf besar dan pastikan jawaban Anda dapat dibaca dengan menambahkan spasi putih.
2
Seperti, ini adalah jawaban kualitas yang sangat buruk. Tetapi ada beberapa sentimen di sini yang bisa bermanfaat jika dibersihkan dan disajikan dengan lebih baik.
Chris Stratton