Göra en funktionell dator ur en Arduino Uno

Några Arduino-entusiaster där ute?

Hej, jag har funderat på det här och ju mer jag tänker på det, desto mer tror jag att jag faktiskt kan göra detta. Min idé är i grunden denna: Gör en funktionell dator av en Arduino Uno-mikrokontroller.

Mitt enda mål för den här datorn är förmågan för att redigera och köra BASIC-program. Det är allt. Jag vill bara ha det för programmeringen, eftersom det bara är det enda jag är intresserad av just nu 🙂

Så som jag ser det behöver jag tre huvudsakliga hårdvarukomponenter:

  1. någon form av en skärm (VGA-skärm eller något)
  2. något sätt att registrera tangentbordets inmatning och
  3. något sätt att lagra data i externt minne .

Vet någon något sätt att göra detta? Jag vet hur man kan visa det på en skärm, men jag vet inte en bra API / hårdvarukomponent för att registrera tangentbordets ingång eller lagra externt minne.

Jag behöver mycket hjälp med detta. Kan någon hjälpa mig och erbjuda idéer och användbara tips och förslag på bra hårdvara / ett bra open source-bibliotek, eller två, eller tre eller tio?

Tillagt:

Blogg Skapa en Arduino Uno-dator för alla som är intresserade.

Kommentarer

  • Detta låter som min typ av hår-hjärnprojekt;) Jag ser fram emot att höra hur du fortsätter med det. Jag hoppas att du ’ bloggar dina framsteg.
  • Jag ville bara påpeka ett liknande projekt som kan vara av intresse. Parallax Propeller -chipet har sett en hel del utveckling vad gäller BASIC. Det finns minst två olika tolkar tillgängliga. Dessutom har den förmågan att direkt sända signal till en TV på en bildskärm.
  • Det finns ’ även Demokort som har VGA, TV, PS / 2 tangentbord och mus, ljud och några fler kontakter. Nu vet jag att du vill göra detta med en Arduino, men åtminstone kan du använda brädschemat som presenteras där för att få några grundläggande pekare på hur de gjorde signalgenerering och så vidare (det ’ s allt i programvara).
  • Också +1 för att vilja göra något liknande detta! Jag minns tillbaka i grundskolan när vi flyttade från Orao -datorn till Pentium III-datorer BASIC förlorade all sin charm.
  • Ett alternativ till att använda en VGA-skärm är att plocka upp en LCD-skärm och använda den för skärmen. Du kan behöva kisa, men gränssnittet med det blir MYCKET enklare!

Svar

Tangentbordet kan vara görs helt enkelt med ett PS / 2-tangentbord – det är bara seriellt, och det finns gott om tutorials där ute för det.

Lagring av data kan göras helt enkelt på ett SD-kort – det finns en skärm ute finns det redan för att göra det.

När det gäller videon – det är betydligt svårare. Om du till exempel vill att Arduino ska generera en PAL-videosignal så har du jobbat för dig. Ja, det är möjligt, och någon har skapat ett Arduino ”pong” -spel, men det är väldigt tjock grafik och bara svartvitt.

För VGA behöver du någon form av gränssnitt för att göra jobbet åt dig. Sparkfun brukade sälja Picaso-grafikkortet som kunde fås att fungera med Arduino, men tyvärr har det avbrutits och det finns inga planer ännu på en ersättare .

TBH din bästa satsning skulle vara att använda något som en Wyse-terminal och kommunicera med Arduino helt och hållet med seriell. Mycket enklare än att röra med videosignaler och sådant.

Svar

Jag ser Olins punkt här – om du bara vill redigera / köra / lära dig BASIC använder du bara en PC .

Men om målet är utmaningen att skapa en dator som kan köra BASIC och lära sig mer om hårdvara och implementering på lägre nivå samtidigt så är det lite annorlunda. Jag är allt för saker som detta , det är ett bra sätt att förbättra kunskapen och är säker på att du får mycket ut av det. Som Steven nämner alla förvirrande och (mestadels) irrelevanta lager som t.ex. Windows kan avlägsnas och lämnar de grundläggande (inga ordspel avsedda) koncepten.

Hur som helst, du kanske vill titta på något lite kraftfullare som PIC32 för detta, eftersom det borde kunna hantera all funktionalitet (t.ex. grundläggande VGA) på det är eget.
Här är ett Arduino-kompatibelt kort, UNO32
Maximite är en dator med BASIC-tolk baserad på en PIC32, du kanske vill titta på Design och konstruktion för några idéer.

Kommentarer

  • Med tanke på specifikationerna för PC ’ som kör Microsoft Basic under en Z80, borde det inte finnas något verkligt problem .

Svar

Du har tur, ungefär, för jag jobbar faktiskt på en arduino-dator just nu! Det är dock inte mycket, bara den första modellen. Firmware är också väldigt enkel och har en liten API-uppsättning. Men saken fungerar! Inte tillräckligt bra för att redigera BASIC (eller något annat språk än dess eget), men det här är bara den första modellen. Moboen är ganska enkel och jag använde det här . Här är firmware jag använde:

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

Metodbeskrivningen är svår att förklara, men koden lagras som råa byte. Jag borde ha utvecklingsprogramvara snart … Hoppas det hjälper! Om du någonsin vill använda den för några projekt, DU MÅSTE HA EN BIOS.mk8-fil i SD-katalogens rotkatalog, annars fungerar inte systemet.

Kommentarer

  • Lyckligt, om han har inte ’ tänkt på det under de tre åren sedan han först frågade
  • @ScottSeidman Ja, bra poäng. Dessutom är firmware fortfarande testad och detta nyckelelement saknas i versionen.

Svar

Med all respekt till David Brin (jag gillar verkligen hans böcker mycket; Jag är inte kvalificerad att bedöma hur bra han är som astrofysiker), han är varken programmerare eller lärare.

Jag var runt och kodade i början av datorer och jag skrev en hel del BASIC-kod. Och jag har skrivit kod professionellt sedan dess.

Anledningen till att vi använde BASIC då var att dina två alternativ var att använda BASIC eller att skriva i montering, och montering var både svårare att förstå och mycket mer besvärligt att använda. Så, GRUNDLÄGGANDE.

Under de 30+ åren sedan dess har det skett betydande förbättringar i programmeringsinstruktion. Min fru undervisar i en början programmeringskurs som använder Alice (www.alice.org), och det är mycket bättre begreppsmässigt än de äldre tillvägagångssätten.

Jag tycker att Brins lösning var ganska elegant. Du kan bygga något ganska enkelt på en Raspberry PI. På arduino tror jag att det kommer att bli utmanande för att fylla allt du behöver i 2K RAM; det måste hålla vad OS / bildskärm du än skriver, en kommandotolk, kod för att göra displayen och lagring för själva basprogrammet.

Inte för nämna det faktum att du måste göra en hel del svår och anpassad programmering så att du kan skriva kod i ett enkelt miljö strykjärn.

Svar

Jag förstår inte det. Om du bara vill ha ett sätt att programmera i Basic, kör en basic tolk på din dator. Jag förstår inte hur du förväntar dig att Arduino hjälper till med detta. Arduino är en mikrokontroller med mycket snygg programvara för att dölja hårdvaruinformationen. En del av kostnaden för det är lägre prestanda och mer resursanvändning än motsvarande program som körs på den nakna mikrokontrollern direkt. Nu vill du skriva Arduino-kod för att göra den tillbaka till en mer allmän dator, allt så att du i sin tur kan köra en grundläggande tolk på den allmänna datorn? Detta är lite meningsfullt.

Eftersom ditt enda mål är att kunna redigera och köra Basic-program (köra en Basic-tolk), börja med en mer generell datorplattform i första hand, helst till och med en som har redan en Basic-tolk tillgänglig. Din dator är exakt en sådan plattform. Om du vill att det här ska vara extern hårdvara låter det som om en helskärmskomponent skulle möta dina behov mycket bättre än en Arduino.

Tillagt:

Du säger nu att du vill inte köra på en PC och webbplats denna länk om någon som vill ha kommandorad Grundläggande för sitt barn att lära av. Visserligen läste jag inte hela artikeln (jag gillar inte folk som svarar med länkar. Du borde kunna för att ange din poäng oberoende i några meningar), men jag ser inte hur en PC som kör en kommandorad Grundtolk inte tar itu med ditt problem. Varför får Basic-tolk inte köras på en PC men det är OK att köra på en Arduino? Kom ihåg att du sa framåt att ditt enda mål var att redigera och köra Basic-program. Ingenting i detta uttalande säger vilken hårdvara den måste köras på, och ingen av din efterföljande förklaring förklarar varför en dator inte skulle fungera bra.

Det finns förmodligen grundläggande tolkar som körs på kommandoraden. Den gamla QBASIC kan fortfarande fungera i något DOS-kompatibilitetsläge. Även om inte, eftersom du är villig att ägna hårdvara åt detta, hur kör du DOS och QBASIC på en dator inte vad du bad om?

Kommentarer

  • Min poäng var att jag inte ’ inte vill programmera på en PC. Jag vill programmera i en liknande miljö som till exempel en Texas Instruments TI-84 +. Min anledning till detta? Kolla in följande länk, ” Varför Johnny Can ’ t Kod ” salon.com/technology/feature/2006/09/14/basic/index.html
  • Detta är inte riktigt ett svar.Ja, tanken på OP kan vara lite kvar i centrum, men var skulle vi vara om ingen någonsin försökte något ovanligt eller att skjuta gränserna för vad som redan finns? Att säga till OP att det ’ är en dum idé är varken till hjälp eller konstruktiv. OP: n har beslutat att han ’ vill göra det och ber oss om hjälp med hur vi ska göra det. Han ’ frågar inte om det ’ är en bra idé eller inte. Ja, det kan mycket väl vara en dålig idé ™, men OP: n kommer att lära sig enormt mycket samtidigt som den får reda på det, vilket i sig kan vara mer värdefullt än slutresultatet. rimligt svar på vad OP ursprungligen skrev. Kom ihåg att han sa ” Mitt enda mål för den här datorn är möjligheten att redigera och köra BASIC-program ” . Detta säger inte ’ om att den körs på alternativ hårdvara. Tydligen vill han ha en enkel kommandorad Grundläggande tolk för att undervisa barn. Hur är det inte ett giltigt svar att köra en sådan sak på en dator? Är inte ’ en PC som kör QBASIC eller något exakt vad han ’ ber om?
  • @Olin OP: n instämmer med mig … Jag tror att du tolkar frågan fel.
  • @Olin – Jag kan förstå Butts. Kommer du ihåg hemdatorer i slutet av 70-talet, tidigt 80-talet? Du lade till ett minneskartat 74LS373 och du kunde styra I / O genom poke uttalanden. Inga virtuella COM-drivrutiner att installera, ingen USB till alla broar, ingen komplex IDE för utvecklare att ladda. SBC: er är jämförbara men saknar i allmänhet tangentbord / video-gränssnittet (och kassettlagring!) På hemdatorerna.

Svar

Svar

Jag gillar idén att köra en gemensam app, som BASIC på en Arduino speciellt om du själv byggde den. Jag gillar bekvämligheten med att ha en praktisk, batteridriven Arduino-enhet som kör den app jag ville ha. Om det var jag skulle jag kanske använda en Arduino MEGA så jag skulle ha tillräckligt med stift för knappsatsen och en SD-skärm för lagring.

Jag skulle välja en färggrafik-LCD eller en TFT-skärm över VGA för enkelhet i programmering och anslutningar, ett sätt att hålla reda på datum och tid (RTC), och vad är en app utan internet eller nätverk (Ethernet-sköld)? Extra I2C-RAM (24LC256) kanske? Och några I2C MCP223017 bara om jag skulle behöva några extra portar. Vad sägs om flera Arduino gör en parallell uppgift? Det skulle jag förbättra. Jag är säker på.

Kommentarer

  • Länkar till datablad uppskattas av samhället. Använd inte för mycket och se till att ditt svar är läsbart genom att lägga till vita mellanslag.
  • Som det är, är detta ett svar av mycket dålig kvalitet. Men det finns några känslor här som kan vara värda om de rensas och presenteras bättre.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *