Realizzare un computer funzionale con un Arduino Uno

Qualche appassionato di Arduino là fuori?

Ehi, ci ho pensato e più ci penso, più penso di poterlo fare davvero. La mia idea è fondamentalmente questa: creare un computer funzionale con un microcontrollore Arduino Uno.

Il mio unico obiettivo per questo computer è labilità per modificare ed eseguire programmi BASIC. Questo è tutto. Lo voglio solo per la programmazione, poiché è quasi lunica cosa che mi interessa in questo momento 🙂

Quindi per come la vedo io, avrò bisogno di tre componenti hardware principali:

  1. una forma di display (schermo VGA o qualcosa del genere)
  2. un modo per registrare linput da tastiera e
  3. un modo per memorizzare i dati nella memoria esterna .

Qualcuno sa come farlo? Conosco modi per visualizzare su uno schermo, ma non conosco un buon componente hardware / API per registrare linput da tastiera o per memorizzare la memoria esterna.

Avrò bisogno di molto aiuto su questo. Qualcuno può aiutarmi e offrire idee e suggerimenti e suggerimenti utili per un buon hardware / una buona libreria open source, o due, o tre o dieci?

Aggiunto:

Blog Realizzare un computer Arduino Uno per chiunque sia interessato.

Commenti

  • Questo suona come il mio tipo di progetto da capello;) Non vedo lora di sentire come te la cavi. Spero che ‘ blog i tuoi progressi.
  • Volevo solo segnalare un progetto simile che potrebbe interessarti. Il chip Parallax Propeller ha visto molti sviluppi per quanto riguarda BASIC. Sono disponibili almeno due interpreti diversi. Inoltre ha la capacità di trasmettere direttamente il segnale alla TV di un monitor.
  • Ci ‘ anche il Scheda demo che include VGA, TV, tastiera e mouse PS / 2, audio e pochi altri connettori. Ora so che vuoi farlo con un Arduino, ma almeno potresti usare gli schemi della scheda presentati lì per ottenere alcuni suggerimenti di base su come hanno generato il segnale e così via (‘ è tutto nel software).
  • Anche +1 per voler fare qualcosa di simile! Ricordo che alle elementari quando ci trasferimmo dal computer Orao ai computer Pentium III BASIC perse tutto il suo fascino.
  • Unalternativa a lutilizzo di un display VGA significa prendere uno schermo LCD e utilizzarlo per il display. Potresti dover strizzare gli occhi, ma interfacciarti con esso sarà MOLTO più facile!

Rispondi

La tastiera può essere fatto semplicemente usando una tastiera PS / 2 – è solo seriale, e ci sono molti tutorial là fuori.

La memorizzazione dei dati può essere fatta semplicemente su una scheda SD – cè uno scudo cè già da fare.

Per quanto riguarda il video, è molto più difficile. Se vuoi che Arduino generi un segnale video PAL, ad esempio, hai il tuo bel da fare. Sì, è possibile, e qualcuno ha creato un gioco “pong” per Arduino, ma ha una grafica molto grossa e solo in bianco e nero.

Per VGA avrai bisogno di una qualche forma di interfaccia per fare il lavoro per te. Sparkfun vendeva la scheda video Picaso che poteva essere fatta funzionare con Arduino, ma purtroppo è stata interrotta e non ci sono ancora piani per una sostituzione .

TBH la soluzione migliore sarebbe usare qualcosa come un terminale Wyse e comunicare con Arduino utilizzando completamente la seriale. Molto più semplice che scherzare con i segnali video e simili.

Risposta

Vedo il punto di Olin qui – se vuoi solo modificare / eseguire / imparare BASIC usa semplicemente un PC .

Tuttavia, se lobiettivo è la sfida di creare un computer in grado di eseguire BASIC e imparare lhardware e limplementazione di livello inferiore allo stesso tempo, allora questo è un po diverso. Sono tutto per cose come questa , è “un ottimo modo per migliorare la conoscenza e sono sicuro che ne trarrai grande vantaggio. Come Steven menziona tutti gli strati confusi e (per lo più) irrilevanti che ad es. Windows può essere rimosso, lasciando i concetti di base (senza giochi di parole).

Ad ogni modo, potresti voler guardare qualcosa di un po più potente come il PIC32 per questo, poiché dovrebbe essere in grado di gestire tutte le funzionalità (ad esempio VGA di base) su è di sua proprietà.
Ecco una scheda compatibile con Arduino, la UNO32
La Maximite è un computer con un interprete BASIC basato su un PIC32, potresti dare unocchiata a Progettazione e costruzione per alcune idee.

Commenti

  • Date le specifiche dei PC ‘ che eseguono Microsoft Basic sotto uno Z80, non dovrebbero esserci problemi reali .

Risposta

Sei fortunato, più o meno, perché in questo momento sto lavorando su un PC arduino! Non è molto, però, solo il primo modello. Anche il firmware è molto semplice e ha un piccolo set di API. Ma la cosa funziona! Non abbastanza buono per modificare BASIC (o qualsiasi altro linguaggio tranne il proprio), ma questo è solo il primo modello. La mobo è abbastanza semplice e ho usato this . Ecco il firmware che ho usato:

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

La descrizione del metodo è difficile da spiegare, ma il codice è memorizzato come byte non elaborati. Dovrei avere presto il software di sviluppo … Spero che questo aiuti! Se mai vorrai usarlo per qualsiasi progetto, DEVI AVERE UN file BIOS.mk8 nella directory principale della SD o il sistema non funzionerà.

Commenti

  • Davvero fortunato, se ‘ non lha capito nei tre anni trascorsi da quando ha chiesto per la prima volta
  • @ScottSeidman Sì, buon punto. Inoltre, il firmware è ancora in fase di test, e questo nella versione mancano elementi chiave.

Risposta

Con tutto il rispetto a David Brin (mi sono piaciuti molto i suoi libri; Non sono qualificato per giudicare quanto sia bravo come astrofisico), non è né un programmatore né un educatore.

Ero in giro e scrivevo codice nei primi giorni dei PC, e ho scritto una buona quantità di codice BASIC. E da allora ho scritto codice professionalmente.

Il motivo per cui usavamo BASIC allora era che le tue due opzioni erano usare BASIC o scrivere in assembly, e lassembly era sia più difficile da capire che molto di più ingombrante da usare. Quindi, BASIC.

Negli ultimi 30 anni da allora, ci sono stati miglioramenti significativi nellistruzione di programmazione. Mia moglie insegna un corso di programmazione per principianti che utilizza Alice (www.alice.org), ed è di gran lunga migliore concettualmente rispetto ai vecchi approcci.

Penso che la soluzione di Brin sia stata piuttosto elegante. Potresti costruire qualcosa di abbastanza semplice su un Raspberry PI. Su arduino, penso che sarà una sfida per inserire tutto ciò di cui hai bisogno in 2K di RAM; che deve contenere qualsiasi sistema operativo / monitor che finisci per scrivere, un interprete di comandi, codice per eseguire la visualizzazione e archiviazione per il programma di base stesso.

Non farlo menziona il fatto che dovrai fare un sacco di programmazione difficile e personalizzata in modo da poter scrivere codice in un semplice env stiratura.

Risposta

Non capisco. Se vuoi solo avere un mezzo per programmare in Basic, esegui un basic interprete sul tuo PC. Non capisco come ti aspetti che Arduino ti aiuti in questo. Arduino è un microcontrollore con molti software fantasiosi per nascondere i dettagli hardware. Parte del costo è una riduzione delle prestazioni e un maggiore utilizzo delle risorse rispetto al programma equivalente in esecuzione direttamente sul microcontrollore nudo. Ora vuoi scrivere codice Arduino per trasformarlo di nuovo in un computer più generico, tutto in modo da poter a sua volta eseguire un interprete di base su quel computer generico? Questo ha poco senso.

Poiché il tuo unico obiettivo è quello di essere in grado di modificare ed eseguire programmi di base (eseguire un interprete di base), inizia con una piattaforma di elaborazione più generica in primo luogo, preferibilmente anche una che ha già un interprete di base disponibile. Il tuo PC è esattamente una piattaforma del genere. Se vuoi che questo sia hardware esterno, suona come un computer a scheda singola pronto per luso soddisferà le tue esigenze molto meglio di un Arduino.

Aggiunto:

Ora dici di te non voglio eseguire su un PC e sul sito questo link su qualcuno che vuole la riga di comando Basic da cui suo figlio impara. Devo ammettere che non ho letto lintero articolo (non mi piace che le persone rispondano con i link. Dovresti essere in grado di per affermare il tuo punto in modo indipendente in poche frasi), ma non vedo come un PC che esegue un interprete di base a riga di comando non risolva il tuo problema. Perché linterprete di base non può funzionare su un PC ma va bene eseguire su un Arduino? Ricorda, hai detto in anticipo che il tuo unico obiettivo era modificare ed eseguire programmi di base. Niente in quella dichiarazione dice su quale hardware deve funzionare e nessuna delle tue spiegazioni successive spiega perché un PC non funzionerebbe bene.

Probabilmente ci sono interpreti di base che girano sulla riga di comando. QBASIC potrebbe ancora funzionare in alcune modalità di compatibilità DOS. Anche se non lo sei, dato che sei disposto a dedicare hardware a questo, come fa lesecuzione di DOS e QBASIC su un PC a non fornire quello che hai chiesto?

Commenti

  • Il punto era che non ‘ voglio programmare su un PC. Voglio programmare in un ambiente simile, ad esempio, a una TI-84 + di Texas Instruments. La mia ragione per questo? Controlla il seguente link, ” Perché Johnny Can ‘ t Code ” salon.com/technology/feature/2006/09/14/basic/index.html
  • Questa non è veramente una risposta.Sì, lidea dellOP potrebbe essere un po a sinistra del centro, ma dove saremmo se nessuno provasse mai qualcosa fuori dallordinario o spingesse i limiti di ciò che è già esistente? Dire allOP che ‘ è unidea sciocca non è né utile né costruttivo. LOP ha deciso che ‘ vorrebbe farlo e ci sta chiedendo aiuto su come procedere. ‘ non sta chiedendo se ‘ è una buona idea oppure no. Sì, potrebbe anche essere una cattiva idea ™, ma lOP imparerà moltissimo scoprendolo, il che a sua volta può essere più prezioso del risultato finale.
  • @Majenko: Quello che ho scritto è un risposta ragionevole a quanto scritto originariamente dallOP. Ricorda, ha detto ” Il mio unico obiettivo per questo computer è la possibilità di modificare ed eseguire programmi BASIC ” . Questo ‘ non dice nulla sul fatto che venga eseguito su hardware alternativo. Apparentemente vuole un semplice interprete di base da riga di comando per insegnare ai bambini. In che modo eseguire una cosa del genere su un PC non è una risposta valida? ‘ non è un PC con QBASIC o qualcosa del genere esattamente quello che ‘ sta chiedendo?
  • @Olin LOP è daccordo con me … penso che tu stia interpretando la domanda in modo sbagliato.
  • @Olin – Posso capire Butts. Ricordi i computer di casa alla fine degli anni 70, allinizio degli anni 80? Hai aggiunto un 74LS373 mappato in memoria e puoi controllare gli I / O tramite le istruzioni poke. Nessun driver COM virtuale da installare, nessuna USB su qualsiasi bridge, nessun IDE per sviluppatori complesso da caricare. Gli SBC sono comparabili, ma generalmente mancano della tastiera / interfaccia video (e cassetta di memoria!) Dei computer di casa.

Risposta

Risposta

Mi piace lidea di eseguire unapp comune, come BASIC su un Arduino soprattutto se lhai costruito a mano da solo. Mi piace la comodità di avere un pratico dispositivo Arduino alimentato a batteria che esegue lapp che volevo. Se fossi in me, userei forse un Arduino MEGA, quindi avrei abbastanza pin per la tastiera e uno scudo SD per larchiviazione.

Sceglierei un LCD grafico a colori o uno schermo TFT su VGA per semplicità di programmazione e connessioni, un modo per tenere traccia di data e ora (RTC) e cosè unapp senza Internet o rete (scudo ethernet)? Forse RAM I2C extra (24LC256)? E un paio di I2C MCP223017 solo nel caso avessi bisogno di alcune porte extra. Che ne dici di più Arduino che eseguono unattività parallela? Ciò migliorerebbe le prestazioni, ne sono sicuro.

Commenti

  • I link ai fogli dati sono apprezzati dalla comunità. Inoltre, non usarne troppo maiuscole e assicurati che la tua risposta sia leggibile aggiungendo spazi bianchi.
  • Così comè, questa è una risposta di pessima qualità. Ma ci sono alcune opinioni che potrebbero essere utili se ripulite e presentate meglio.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *