At lave en funktionel computer ud af en Arduino Uno

Er der nogen Arduino-entusiaster derude?

Hej, jeg har tænkt på dette og jo mere jeg tænker på det, jo mere tror jeg, jeg rent faktisk kan gøre dette. Min idé er dybest set denne: Lav en funktionel computer ud af en Arduino Uno-mikrocontroller.

Mit eneste mål for denne computer er evnen at redigere og udføre BASIC-programmer. Det er alt sammen. Jeg vil kun have det til programmeringen, da det næsten er det eneste, jeg er interesseret i lige nu 🙂

Så som jeg ser det, skal jeg bruge tre hovedhardwarekomponenter:

  1. en eller anden form for skærm (VGA-skærm eller lignende)
  2. en eller anden måde at registrere tastaturindgang på, og
  3. en eller anden måde at gemme data på ekstern hukommelse .

Kender nogen nogen måde at gøre dette på? Jeg kender måder at vise på en skærm, men jeg kender ikke en god API / hardwarekomponent til at registrere tastaturindgang eller til gem ekstern hukommelse.

Jeg har brug for en masse hjælp til dette. Kan nogen hjælpe mig med at tilbyde ideer og nyttige tip og forslag til god hardware / et godt open source-bibliotek eller to, eller tre eller ti?

Tilføjet:

Blog Oprettelse af en Arduino Uno-computer til alle, der er interesserede.

Kommentarer

  • Dette lyder som min slags hår-hjerne-projekt;) Jeg ser frem til at høre, hvordan du fortsætter med det. Jeg håber, at du ‘ blogger dine fremskridt.
  • Jeg ville bare påpege et lignende projekt, der kan være af interesse. Parallax Propeller -chippen har set en hel del udvikling for så vidt angår BASIC. Der er mindst to forskellige tolke tilgængelige. Plus det har evnen til direkte at sende signal til et tv på en skærm.
  • Der ‘ er endda Demo Board , som har VGA, TV, PS / 2 keyboard og mus, lyd og få flere stik. Nu ved jeg, at du vil gøre dette med en Arduino, men i det mindste kan du bruge kortskemaerne, der præsenteres der, for at få nogle grundlæggende henvisninger til, hvordan de signalerede generering og så videre (det ‘ s alt i software).
  • Også +1 for at ville gøre noget som dette! Jeg husker tilbage på grundskolen, da vi flyttede fra Orao -computeren til Pentium III-computere BASIC mistede al sin charme.
  • Et alternativ til Brug af en VGA-skærm er at samle et LCD-skjold op og bruge det til skærmen. Du bliver muligvis nødt til at skæve, men grænsefladen med det bliver MEGET lettere!

Svar

Tastaturet kan være gøres simpelthen ved hjælp af et PS / 2-tastatur – det er bare serielt, og der er masser af tutorials derude til det.

Lagring af data kan gøres simpelthen på et SD-kort – der er et skjold derude der allerede for at gøre det.

Hvad angår videoen – det er betydeligt sværere. Hvis du f.eks. vil have Arduino til at generere et PAL-videosignal, har du dit arbejde skåret ud for dig. Ja, det er muligt, og nogen har oprettet et Arduino “pong” -spil, men det er meget klodset grafik og kun sort og hvidt.

For VGA skal du have en eller anden form for interface for at udføre arbejdet for dig. Sparkfun plejede at sælge Picaso-videokortet , der kunne fås til at arbejde med Arduino, men desværre er det afbrudt, og der er endnu ikke planer om en erstatning .

TBH din bedste chance ville være at bruge noget som en Wyse terminal og kommunikere med Arduino fuldstændigt ved hjælp af seriel. Meget enklere end at rode med videosignaler og sådan.

Svar

Jeg ser Olins punkt her – hvis du kun vil redigere / køre / lære BASIC, skal du bare bruge en pc .

Men hvis målet er udfordringen med at skabe en computer, der kan køre BASIC og lære om hardware og implementering på lavere niveau på samme tid, så er det lidt anderledes. Jeg er alt for ting som dette , det er en fantastisk måde at forbedre viden på og er sikker på, at du får meget ud af det. Som Steven nævner alle de forvirrende og (for det meste) irrelevante lag, som f.eks. Windows kan fjernes og efterlader de grundlæggende (ingen ordspil beregnet) koncepter.

Under alle omstændigheder vil du måske se på noget lidt mere kraftfuldt som PIC32 for dette, da det skal kunne håndtere al funktionalitet (f.eks. grundlæggende VGA) på det er eget.
Her er et Arduino-kompatibelt kort, UNO32
Maximite er en computer med BASIC-tolk, der er baseret på en PIC32. Du vil måske se på Design og konstruktion for et par ideer.

Kommentarer

  • I betragtning af specifikationerne på pc ‘ kører Microsoft Basic under en Z80, bør der ikke være noget reelt problem .

Svar

Din held, slags, for jeg arbejder faktisk på en arduino-pc lige nu! Det er dog ikke meget, kun den første model. Firmwaren er også meget enkel og har et lille API-sæt. Men sagen fungerer! Ikke god nok til at redigere BASIC (eller ethvert sprog undtagen dets eget), men dette er kun den første model. Moboen er ret enkel, og jeg brugte dette . Her er den firmware, jeg brugte:

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

Metodebeskrivelsen er svær at forklare, men koden er gemt som rå byte. Jeg burde have udviklingssoftware op snart … Håber det hjælper! Hvis du nogensinde vil bruge dette til projekter, DU SKAL HAVE en BIOS.mk8-fil i rodmappen på SD, ellers fungerer systemet ikke.

Kommentarer

  • Heldigvis, hvis han har ikke fundet ‘ det i de tre år, siden han først spurgte
  • @ScottSeidman Ja, godt punkt. Også firmwaren er stadig i test, og dette version mangler nøgleelementer.

Svar

Med al respekt til David Brin (jeg kan godt lide at lide hans bøger meget; Jeg er ikke kvalificeret til at bedømme, hvor god han er som astrofysiker), han er hverken programmør eller underviser.

Jeg var omkring og kodede i de tidlige dage af pcer, og jeg skrev en hel del BASIC-kode. Og jeg har skrevet kode professionelt siden da.

Årsagen til, at vi brugte BASIC dengang, var at dine to muligheder var at bruge BASIC eller at skrive i montage, og montering var både sværere at forstå og meget mere besværligt at bruge. Så, GRUNDLÆGGENDE.

I mere end 30 år siden har der været betydelige forbedringer i programmeringsinstruktion. Min kone underviser i en begyndende programmeringsklasse, der bruger Alice (www.alice.org), og det er langt bedre konceptuelt end de ældre tilgange.

Jeg synes Brins løsning var ret elegant. Du kunne bygge noget ret simpelt på en Raspberry PI. På arduinoen tror jeg, det vil være udfordrende for at fylde alt hvad du har brug for i 2K RAM; det skal indeholde det OS / Monitor, du ender med at skrive, en kommandortolker, kode til at udføre displayet og lagring til selve det grundlæggende program.

nævne det faktum, at du bliver nødt til at lave en hel masse vanskelig og brugerdefineret programmering, så du kan skrive kode i en simpel env strygning.

Svar

Jeg kan ikke få det. Hvis du kun vil have et middel til at programmere i Basic, skal du køre en basic tolk på din pc. Jeg forstår ikke, hvordan du forventer, at Arduino hjælper med dette. Arduino er en mikrocontroller med en masse fancy software til at skjule hardwareoplysningerne. En del af omkostningerne ved dette er lavere ydelse og mere ressourceforbrug end det tilsvarende program, der kører på den bare mikrocontroller direkte. Nu vil du skrive Arduino-kode for at gøre den tilbage til en mere almindelig computer, alt sammen, så du igen kan køre en grundlæggende tolk på den almindelige computer? Dette giver lidt mening.

Da dit eneste mål er at være i stand til at redigere og udføre grundlæggende programmer (køre en grundlæggende tolk), skal du starte med en mere generel beregningsplatform, helst endda en, der har allerede en grundlæggende tolk tilgængelig. Din pc er netop sådan en platform. Hvis du ønsker, at dette skal være ekstern hardware, lyder det som om en enkelt bordcomputer fra hylden ville opfylde dine behov meget bedre end en Arduino.

Tilføjet:

Du siger nu dig vil ikke køre på en pc og placere dette link om nogen, der ønsker kommandolinje Grundlæggende for hans barn at lære af. Ganske vist læste jeg ikke hele artiklen (jeg kan ikke lide folk, der svarer med links. Du burde være i stand til for at angive dit punkt uafhængigt i nogle få sætninger), men jeg kan ikke se, hvordan en pc, der kører en kommandolinje. Grundlæggende tolk løser ikke dit problem. Hvorfor har Basic-tolk ikke lov til at køre på en pc, men det er OK at køre på en Arduino? Husk, du sagde foran, at dit eneste mål var at redigere og køre Basic-programmer. Intet i denne erklæring siger, hvilken hardware den skal køre på, og ingen af din efterfølgende forklaring forklarer, hvorfor en pc ikke ville klare sig.

Der er sandsynligvis grundlæggende tolke, der kører på kommandolinjen. Den gamle QBASIC fungerer muligvis stadig i en vis DOS-kompatibilitetstilstand. Selvom ikke, da du er villig til at dedikere hardware til dette, hvordan kører DOS og QBASIC på en pc ikke det, du bad om?

Kommentarer

  • Min pointe var, at jeg ikke ‘ ikke vil programmere på en pc. Jeg vil programmere i et lignende miljø som f.eks. En Texas Instruments TI-84 +. Min grund til dette? Tjek følgende link, ” Hvorfor Johnny Can ‘ t Kode ” salon.com/technology/feature/2006/09/14/basic/index.html
  • Dette er ikke rigtig et svar.Ja, ideen om OP kan være en smule venstre for centrum, men hvor ville vi være, hvis ingen nogensinde prøvede noget ud over det sædvanlige eller skubbet grænserne for det, der allerede eksisterer? At fortælle OP, at det ‘ er en fjollet idé, er hverken nyttigt eller konstruktivt. OP har besluttet, at han ‘ gerne vil gøre det, og beder os om hjælp til, hvordan vi kan gøre det. Han ‘ spørger ikke, om det ‘ er en god idé eller ej. Ja, det kan godt være en dårlig idé ™, men OP vil lære en enorm mængde, mens de finder ud af det, hvilket i sig selv kan være mere værdifuldt end slutresultatet.
  • @Majenko: Det jeg skrev er en rimeligt svar på, hvad OP oprindeligt skrev. Husk, han sagde ” Mit eneste mål for denne computer er evnen til at redigere og udføre BASIC-programmer ” . Dette siger ikke ‘ noget om, at det kører på alternativ hardware. Tilsyneladende vil han have en simpel kommandolinje Grundlæggende tolk til undervisning af børn. Hvordan er det ikke et gyldigt svar at køre sådan en ting på en pc? Er ‘ en pc, der kører QBASIC, eller noget præcis, hvad han ‘ beder om?
  • @Olin OP er enig med mig … Jeg tror, du fortolker spørgsmålet forkert.
  • @Olin – Jeg kan forstå Butts. Kan du huske hjemmecomputere i slutningen af 70erne, begyndelsen af 80erne? Du tilføjede en hukommelseskortet 74LS373, og du kunne kontrollere I / Os gennem poke udsagn. Ingen virtuelle COM-drivere at installere, ingen USB til de broer, der er ingen kompleks IDE til at indlæse. SBCer er sammenlignelige, men mangler generelt tastatur- / videogrænsefladen (og kassettelagring!) På hjemmecomputerne.

Svar

Svar

Jeg kan godt lide ideen om at køre en fælles app, såsom BASIC på en Arduino især hvis du selv har bygget det. Jeg kan godt lide bekvemmeligheden ved at have en praktisk, batteridrevet Arduino-enhed, der kører den app, jeg ønskede. Hvis det var mig, ville jeg måske bruge en Arduino MEGA, så jeg ville have nok ben til tastaturet og et SD-skjold til opbevaring.

Jeg ville vælge en farvegrafik-LCD eller en TFT-skærm over VGA for enkelhed i programmering og forbindelser, en måde at holde styr på dato og tid (RTC), og hvad er en app uden internet eller netværk (ethernet skjold)? Ekstra I2C RAMer (24LC256) måske? Og et par I2C MCP223017 bare hvis jeg har brug for et par ekstra porte. Hvad med flere Arduinoer der laver en parallel opgave? Det ville jeg forbedre sikkerheden.

Kommentarer

  • Links til datablade værdsættes af samfundet. Brug heller ikke for meget og sørg for, at dit svar er læsbart ved at tilføje hvide mellemrum.
  • Som det er, er dette et svar af meget dårlig kvalitet. Men der er nogle følelser her, som kan være værd at rydde op og præsentere bedre.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *