Lage en funksjonell datamaskin av en Arduino Uno

Er noen Arduino-entusiaster der ute?

Hei, jeg har tenkt på dette og jo mer jeg tenker på det, jo mer tror jeg at jeg faktisk kan gjøre dette. Tanken min er i utgangspunktet denne: Lag en funksjonell datamaskin av en Arduino Uno-mikrokontroller.

Mitt eneste mål for denne datamaskinen er evnen for å redigere og utføre BASIC-programmer. Det er alt. Jeg vil bare ha det til programmeringen, da det bare er det eneste jeg er interessert i akkurat nå 🙂

Så slik jeg ser det, trenger jeg tre hovedvarekomponenter:

  1. en eller annen form for skjerm (VGA-skjerm eller noe)
  2. en eller annen måte å registrere tastaturinngang, og
  3. en eller annen måte å lagre data i eksternt minne .

Er det noen som vet om noen måte å gjøre dette på? Jeg vet om måter å vise til en skjerm på, men jeg vet ikke en god API / maskinvarekomponent for å registrere tastaturinngang eller lagre eksternt minne.

Jeg trenger mye hjelp med dette. Kan noen hjelpe meg og tilby ideer og nyttige tips og forslag til god maskinvare / et godt open source-bibliotek, eller to, eller tre eller ti?

Lagt til:

Blogg Å lage en Arduino Uno-datamaskin for alle som er interessert.

Kommentarer

  • Dette høres ut som min slags hår-hjerneprosjekt;) Jeg gleder meg til å høre hvordan du fortsetter med det. Jeg håper du ‘ blogger fremdriften din.
  • Jeg ville bare påpeke et lignende prosjekt som kan være av interesse. Parallax Propeller -brikken har sett ganske mye utvikling for BASIC. Det er minst to forskjellige tolker tilgjengelig. I tillegg har den muligheten til å sende signal direkte til en TV på en skjerm.
  • Der ‘ er til og med Demo Board som har VGA, TV, PS / 2-tastatur og mus, lyd og få flere kontakter. Nå vet jeg at du vil gjøre dette med en Arduino, men i det minste kan du bruke brettskjemaene som er presentert der for å få noen grunnleggende tips om hvordan de signaliserte generering og så videre (det ‘ s alt i programvare).
  • Også +1 for å ville gjøre noe som dette! Jeg husker tilbake på barneskolen da vi flyttet fra Orao -datamaskinen til Pentium III-datamaskiner BASIC mistet all sin sjarm.
  • Et alternativ til å bruke en VGA-skjerm er å plukke opp et LCD-skjerm og bruke det til skjermen. Du må kanskje kvise, men grensesnittet med det blir MYE lettere!

Svar

Tastaturet kan være bare ved å bruke et PS / 2-tastatur – det er bare serielt, og det er mange opplæringsprogrammer der ute.

Lagring av data kan bare gjøres på et SD-kort – det er et skjold ute det er allerede for å gjøre det.

Når det gjelder videoen – det er betydelig vanskeligere. Hvis du for eksempel vil at Arduino skal generere et PAL-videosignal, har du jobben din skåret ut for deg. Ja, det er mulig, og noen har laget et Arduino «pong» -spill, men det er veldig tykk grafikk og bare svart og hvitt.

For VGA vil du kreve en eller annen form for grensesnitt for å gjøre jobben for deg. Sparkfun pleide å selge Picaso-skjermkortet som kunne fås til å fungere med Arduino, men akk som er avviklet og det er foreløpig ingen planer om en erstatning .

TBH det beste alternativet er å bruke noe sånt som en Wyse-terminal og kommunisere med Arduino fullstendig ved hjelp av seriell. Mye enklere enn å rote med videosignaler og slikt.

Svar

Jeg ser Olins poeng her – hvis du bare vil redigere / kjøre / lære BASIC bare bruk en PC .

Men hvis målet er utfordringen med å lage en datamaskin som kan kjøre BASIC og lære om maskinvare og implementering på lavere nivå på samme tid, så er dette litt annerledes. Jeg er for ting som dette , det er en fin måte å forbedre kunnskapen på, og er sikker på at du får mye ut av det. Som Steven nevner alle de forvirrende og (for det meste) irrelevante lagene som f.eks. Windows kan fjernes, og etterlate de grunnleggende (ingen ordspill beregnet) konseptene.

Uansett, vil du kanskje se på noe litt kraftigere som PIC32 for dette, da det skal kunne håndtere all funksjonaliteten (f.eks. grunnleggende VGA) på det er eget.
Her er et Arduino-kompatibelt brett, UNO32
Maximite er en datamaskin med BASIC-tolk basert på en PIC32. Det kan være lurt å se på Design og konstruksjon for noen få ideer.

Kommentarer

  • Gitt spesifikasjonene til PC ‘ som kjører Microsoft Basic under en Z80, bør det ikke være noe reelt problem .

Svar

Din lykke, liksom, for jeg jobber faktisk med en arduino-PC akkurat nå! Det er ikke mye, bare den første modellen. Firmware er også veldig enkel, og har et lite API-sett. Men tingen fungerer! Ikke bra nok til å redigere BASIC (eller hvilket som helst språk unntatt sitt eget), men dette er bare den første modellen. Moboen er ganske enkel, og jeg brukte dette . Her er firmwaren jeg brukte:

 #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 vanskelig å forklare, men koden lagres som rå byte. Jeg burde ha utviklingsprogramvare opp snart … Håper dette hjelper! Hvis du noen gang vil bruke dette til noen prosjekter, DU MÅ HAVE en BIOS.mk8-fil i rotkatalogen til SD, ellers fungerer ikke systemet.

Kommentarer

  • Heldigvis, hvis han har ikke funnet ‘ de tre årene siden han først spurte
  • @ScottSeidman Ja, bra poeng. Også firmwaren er fortsatt i testing, og dette versjonen mangler nøkkelelementer.

Svar

Med all respekt til David Brin (jeg liker tilfeldigvis bøkene hans veldig; Jeg er ikke kvalifisert til å bedømme hvor god han er som astrofysiker), han er verken programmerer eller lærer.

Jeg var rundt og kodet de første dagene av PC-er, og jeg skrev ganske mye BASIC-kode. Og jeg har skrevet kode profesjonelt siden den gang.

Årsaken til at vi brukte BASIC den gangen var at de to alternativene dine var å bruke BASIC eller å skrive i montering, og montering var både vanskeligere å forstå og mye mer tungvint å bruke. Så, GRUNNLEGGENDE.

I 30+ år siden har det vært betydelige forbedringer i programmeringsinstruksjonene. Min kone underviser i en begynnende programmeringskurs som bruker Alice (www.alice.org), og det er langt bedre konseptuelt enn de eldre tilnærmingene.

Jeg synes Brins løsning var ganske elegant. Du kan bygge noe ganske enkelt på en Raspberry PI. På arduinoen tror jeg det vil være utfordrende å fylle alt du trenger i 2K RAM; det må inneholde alt operativsystemet / skjermen du ender med å skrive, en kommandotolker, kode for å gjøre displayet og lagring for selve grunnprogrammet.

nevn det faktum at du må gjøre en hel del vanskelig og tilpasset programmering, slik at du kan skrive kode i et enkelt miljø strykejern.

Svar

Jeg får det ikke. Hvis du bare vil ha et middel til å programmere i Basic, kjør en basic tolk på PC-en din. Jeg forstår ikke hvordan du forventer at Arduino skal hjelpe til med dette. Arduino er en mikrokontroller med mye fancy programvare for å skjule maskinvaredetaljene. En del av kostnadene ved dette er lavere ytelse og mer ressursbruk enn det tilsvarende programmet som kjører på den bare mikrokontrolleren direkte. Nå vil du skrive Arduino-kode for å gjøre den tilbake til en mer generell datamaskin, alt slik at du i sin tur kan kjøre en grunnleggende tolk på den generelle datamaskinen? Dette gir liten mening.

Siden ditt eneste mål er å kunne redigere og utføre grunnleggende programmer (kjøre en Basic-tolk), må du starte med en mer generell databehandlingsplattform, helst til og med en som har allerede en grunnleggende tolk tilgjengelig. PCen din er akkurat en slik plattform. Hvis du vil at dette skal være ekstern maskinvare, høres det ut som en datamaskin med en enkelt bord, som vil hylle dine behov, mye bedre enn en Arduino.

Lagt til:

Du sier nå at du ikke vil kjøre på en PC og nettsted denne lenken om noen som vil ha kommandolinje Grunnleggende for barnet sitt å lære av. Riktignok leste jeg ikke hele artikkelen (jeg liker ikke folk som svarer med lenker. Du burde være i stand til for å si poenget ditt uavhengig i noen få setninger), men jeg kan ikke se hvordan en PC som kjører en kommandolinje Grunnleggende tolk ikke løser problemet ditt. Hvorfor har ikke grunnleggende tolk lov til å kjøre på en PC, men det er OK å kjøre på en Arduino? Husk, du sa foran at ditt eneste mål var å redigere og kjøre grunnleggende programmer. Ingenting i uttalelsen sier hvilken maskinvare den har å kjøre på, og ingen av de etterfølgende forklaringene dine forklarer hvorfor en PC ikke ville klare seg.

Det er sannsynligvis grunnleggende tolker som kjører på kommandolinjen. Den gamle QBASIC kan fortsatt fungere i noen DOS-kompatibilitetsmodus. Selv om ikke, siden du er villig til å vie maskinvare til dette, hvordan kjører DOS og QBASIC på en PC ikke det du ba om?

Kommentarer

  • Poenget mitt var at jeg ikke ‘ ikke vil programmere på en PC. Jeg vil programmere i et lignende miljø som for eksempel en Texas Instruments TI-84 +. Min grunn til dette? Sjekk ut følgende lenke, » Hvorfor Johnny Can ‘ t Kode » salon.com/technology/feature/2006/09/14/basic/index.html
  • Dette er egentlig ikke et svar.Ja, ideen om OP kan være litt igjen av sentrum, men hvor ville vi være hvis ingen noen gang prøvde noe utenom det vanlige, eller for å presse grensene for det som allerede eksisterer? Å fortelle OP at det ‘ er en dum idé er verken nyttig eller konstruktiv. OP har bestemt at han ‘ ønsker å gjøre det, og ber oss om hjelp til hvordan vi kan gjøre det. Han ‘ spør ikke om det ‘ er en god idé eller ikke. Ja, det kan godt være en dårlig idé, men OP vil lære enormt mye mens de finner ut, noe som i seg selv kan være mer verdifullt enn sluttresultatet.
  • @Majenko: Det jeg skrev er en rimelig svar på hva OP opprinnelig skrev. Husk, han sa » Mitt eneste mål for denne datamaskinen er muligheten til å redigere og utføre BASIC-programmer » . Dette betyr ikke ‘ noe om at det kjører på alternativ maskinvare. Tilsynelatende vil han ha en enkel kommandolinje Grunnleggende tolk for å lære barn. Hvordan er det ikke et gyldig svar å kjøre en slik ting på en PC? Er ikke ‘ ta PC som kjører QBASIC eller noe akkurat det han ‘ ber om?
  • @Olin OP er enig med meg … Jeg tror du tolker spørsmålet feil.
  • @Olin – Jeg kan forstå Butts. Husker du hjemmecomputere på slutten av 70-tallet, tidlig på 80-tallet? Du la til et minnekartet 74LS373, og du kunne kontrollere I / Os gjennom poke utsagn. Ingen virtuelle COM-drivere å installere, ingen USB til hvilke broer som helst, ingen kompleks IDE for utvikler å laste inn. SBC-er er sammenlignbare, men mangler generelt tastatur- / videogrensesnittet (og kassettlagring!) På hjemmemaskinene.

Svar

Svar

Jeg liker ideen om å kjøre en vanlig app, for eksempel BASIC på en Arduino spesielt hvis du håndbygde den selv. Jeg liker fordelene med å ha en praktisk, batteridrevet Arduino-enhet som kjører appen jeg ønsket. Hvis det var meg, ville jeg kanskje bruke en Arduino MEGA, så jeg ville ha nok pinner til tastaturet og et SD-skjerm for lagring.

Jeg ville valgt en fargebgrafik LCD eller en TFT-skjerm over VGA for enkelhet i programmering og tilkoblinger, en måte å holde styr på dato og tid (RTC), og hva er en app uten internett eller nettverk (ethernet skjold)? Ekstra I2C-RAM (24LC256) kanskje? Og noen få I2C MCP223017 bare hvis jeg trenger noen ekstra porter. Hva med at flere Arduino gjør en parallell oppgave? Dette vil jeg forbedre. Jeg er sikker på.

Kommentarer

  • Koblinger til datablad er verdsatt av fellesskapet. Ikke bruk for mye og sørg for at svaret ditt kan leses ved å legge til hvite mellomrom.
  • Som det er, er dette et svar av veldig dårlig kvalitet. li>

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *