Tworzenie funkcjonalnego komputera z Arduino Uno

Czy jest jakiś entuzjasta Arduino?

Hej, myślałem o tym i im więcej o tym myślę, tym bardziej myślę, że mogę to zrobić. Mój pomysł jest w zasadzie taki: Zrobić funkcjonalny komputer z mikrokontrolera Arduino Uno.

Moim jedynym celem dla tego komputera jest umiejętność do edycji i uruchamiania programów w języku BASIC. To wszystko. Chcę go tylko do programowania, ponieważ to chyba jedyna rzecz, która mnie teraz interesuje 🙂

Tak więc z mojego punktu widzenia będę potrzebować trzech głównych komponentów sprzętowych:

  1. jakaś forma wyświetlacza (ekran VGA lub coś w tym rodzaju)
  2. jakiś sposób na rejestrację danych wejściowych z klawiatury i
  3. jakiś sposób na przechowywanie danych w pamięci zewnętrznej .

Czy ktoś wie, jak to zrobić? Znam sposoby wyświetlania na ekranie, ale nie znam dobrego komponentu API / sprzętowego do rejestrowania danych wejściowych z klawiatury lub do przechowywać pamięć zewnętrzną.

Będę potrzebował dużo pomocy w tej sprawie. Czy ktoś może mi pomóc i zaoferować pomysły oraz przydatne wskazówki i sugestie dotyczące dobrego sprzętu / dobrej biblioteki open source, czy trzy czy dziesięć?

Dodano:

Blog Tworzenie komputera Arduino Uno dla każdego, kto jest zainteresowany.

Komentarze

  • To brzmi jak mój typowy projekt;) Nie mogę się doczekać, aby usłyszeć, jak sobie z tym poradzisz. Mam nadzieję, że ' opublikujesz na blogu swoje postępy.
  • Chciałem tylko wskazać podobny projekt, który może być interesujący. Chip Parallax Propeller przeszedł spory rozwój, jeśli chodzi o BASIC. Dostępnych jest co najmniej dwóch różnych tłumaczy. Ponadto ma możliwość bezpośredniego przesyłania sygnału do telewizora lub monitora.
  • Istnieje ' jest nawet Tablica demonstracyjna , która zawiera VGA, telewizor, klawiaturę i mysz PS / 2, audio i kilka innych złączy. Teraz wiem, że chcesz to zrobić za pomocą Arduino, ale przynajmniej możesz użyć przedstawionych tam schematów płytki, aby uzyskać podstawowe wskazówki na temat sposobu generowania sygnału i tak dalej (to ' jest w oprogramowaniu).
  • Również +1 za to, że chcesz zrobić coś takiego! Pamiętam, jak w podstawówce przenieśliśmy się z komputera Orao na komputery Pentium III. BASIC stracił cały swój urok.
  • Alternatywa dla użycie wyświetlacza VGA polega na podniesieniu ekranu LCD i użyciu go do wyświetlacza. Być może będziesz musiał mrużyć oczy, ale interakcja z nim będzie DUŻO łatwiejsza!

Odpowiedź

Klawiaturę można zrobione po prostu za pomocą klawiatury PS / 2 – jest to po prostu szeregowa i istnieje wiele samouczków na ten temat.

Przechowywanie danych można zrobić po prostu na karcie SD – jest tam ekran już to zrobić.

Jeśli chodzi o wideo – jest to znacznie trudniejsze. Jeśli chcesz, aby Arduino generowało na przykład sygnał wideo PAL, masz coś do zrobienia. Tak, to jest możliwe, a ktoś stworzył grę Arduino „pong”, ale jest to bardzo gruba grafika i tylko czarno-biała.

W przypadku VGA będziesz potrzebować jakiejś formy interfejsu, aby wykonać tę pracę za Ciebie. Sparkfun sprzedawał kartę graficzną Picaso , która mogłaby współpracować z Arduino, ale niestety została przerwana i nie ma jeszcze planów wymiany .

TBH najlepiej byłoby użyć czegoś takiego jak terminal Wyse i komunikować się z Arduino całkowicie za pomocą portu szeregowego. O wiele prostsze niż majstrowanie przy sygnałach wideo i tym podobne.

Odpowiedź

Widzę tutaj rację Olina – jeśli chcesz tylko edytować / uruchamiać / uczyć się BASIC-a, po prostu użyj komputera .

Jednak jeśli celem jest wyzwanie stworzenia komputera, który może obsługiwać BASIC i jednocześnie uczyć się o sprzęcie i implementacji niższego poziomu, to jest trochę inaczej. Jestem za takimi rzeczami , to świetny sposób na poszerzenie wiedzy i jestem pewien, że wiele z tego uzyskasz. Jak Steven wspomina o wszystkich zagmatwanych i (w większości) nieistotnych warstwach, które np. Windows może zostać usunięty, pozostawiając podstawowe (niezamierzone) pojęcia.

W każdym razie mógłbyś spojrzeć na coś nieco mocniejszego, takiego jak PIC32, ponieważ powinien on obsługiwać wszystkie funkcje (np. podstawowe VGA) należy do niego.
Oto płyta zgodna z Arduino, UNO32
Maximite to komputer z interpreterem języka BASIC oparty na PIC32, możesz zajrzeć do Projekt i konstrukcja , aby znaleźć kilka pomysłów.

Komentarze

  • Biorąc pod uwagę specyfikację komputerów ' z Microsoft Basic na Z80, nie powinno być żadnego problemu .

Odpowiedź

Masz szczęście, bo tak naprawdę pracuję teraz na komputerze arduino! To nie jest dużo, tylko pierwszy model. Oprogramowanie układowe jest również bardzo proste i ma mały zestaw API. Ale to działa! Nie jest wystarczająco dobre, aby edytować BASIC (lub dowolny inny język oprócz własnego), ale to jest tylko pierwszy model. Mobo jest dość proste i użyłem tego . Oto oprogramowanie, którego użyłem:

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

Opis metody jest trudny do wyjaśnienia, ale kod jest przechowywany jako surowe bajty. Wkrótce powinienem mieć oprogramowanie deweloperskie … Mam nadzieję, że to pomoże! Jeśli kiedykolwiek zechcesz użyć tego w jakimkolwiek projekcie, MUSISZ MIEĆ plik BIOS.mk8 w katalogu głównym SD, w przeciwnym razie system nie będzie działał.

Komentarze

  • Szczęście rzeczywiście, jeśli on hasn ' nie rozgryzł tego w ciągu trzech lat, odkąd po raz pierwszy zapytał
  • @ScottSeidman Tak, dobra uwaga. Ponadto oprogramowanie układowe jest nadal testowane, w wersji brakuje kluczowych elementów.

Odpowiedź

Z całym szacunkiem Davidowi Brinowi (tak się składa, że bardzo lubię jego książki; Nie mam kwalifikacji, by oceniać, jak dobry jest jako astrofizyk), nie jest ani programistą, ani pedagogiem.

Byłem w pobliżu i kodowałem w pierwszych dniach pecetów i napisałem sporo kodu w języku BASIC. Od tamtej pory zajmuję się pisaniem kodu zawodowo.

Powodem, dla którego używaliśmy wtedy języka BASIC, było to, że dwie opcje obejmowały używanie BASICa lub pisanie w asemblerze, a asembler był trudniejszy do zrozumienia i dużo więcej uciążliwe w użyciu. Więc, BASIC.

W ciągu ponad 30 lat od tego czasu nastąpił znaczący postęp w instrukcjach programowania. Moja żona prowadzi początkową lekcję programowania, która używa Alice (www.alice.org), i jest o wiele lepszy koncepcyjnie niż starsze podejścia.

Myślę, że rozwiązanie Brina było całkiem eleganckie. Na Raspberry PI można było zbudować coś całkiem prostego. W arduino myślę, że będzie to trudne włożyć wszystko, czego potrzebujesz do 2K pamięci RAM; to musi pomieścić dowolny system operacyjny / monitor, który piszesz, interpretator poleceń, kod do wyświetlania i pamięć dla samego programu podstawowego.

Nie wspomnij o tym, że będziesz musiał wykonać wiele trudnych i niestandardowych programów, aby móc pisać kod w prostym środowisku prasowanie.

Odpowiedź

Nie rozumiem. Jeśli chcesz mieć tylko środki do programowania w Basicu, uruchom podstawową interpreter na twoim komputerze. Nie rozumiem, jak oczekujesz od Arduino pomocy w tym. Arduino to mikrokontroler z wieloma wyszukanymi programami do ukrywania szczegółów sprzętowych. Częścią tego kosztu jest niższa wydajność i większe zużycie zasobów niż równoważny program działający bezpośrednio na samym mikrokontrolerze. Teraz chcesz napisać kod Arduino, aby przekształcić go z powrotem w komputer bardziej ogólnego przeznaczenia, wszystko po to, aby z kolei uruchomić interpreter Basic na tym komputerze ogólnego przeznaczenia? Nie ma to sensu.

Ponieważ Twoim jedynym celem jest możliwość edytowania i uruchamiania programów w Basicu (uruchamianie interpretera Basica), zacznij od bardziej ogólnego zastosowania platformy komputerowej, najlepiej nawet takiej, która ma już dostępny interpreter Basic. Twój komputer jest właśnie taką platformą. Jeśli chcesz, aby był to sprzęt zewnętrzny, wygląda na to, że zwykły komputer jednopłytowy spełni Twoje potrzeby znacznie lepiej niż Arduino.

Dodano:

Teraz mówisz, że nie chcę uruchamiać na komputerze PC i umieszczać na stronie tego linku o kimś, kto chce, aby jego dziecko mogło uczyć się od podstaw wiersza poleceń. Trzeba przyznać, że nie przeczytałem całego artykułu (nie lubię, gdy ludzie odpowiadają za pomocą linków. Powinieneś być w stanie aby wyrazić swój punkt niezależnie w kilku zdaniach), ale nie widzę, w jaki sposób komputer PC z uruchomionym w wierszu poleceń interpreterem Basic nie rozwiązuje Twojego problemu. Dlaczego interpreter Basic nie może działać na komputerze PC, ale jest w porządku uruchomić na Arduino? Pamiętaj, że na początku powiedziałeś, że Twoim jedynym celem jest edycja i uruchamianie programów Basic. Nic w tym stwierdzeniu nie mówi, na jakim sprzęcie ma działać, a żadne z późniejszych wyjaśnień nie wyjaśnia, dlaczego komputer nie działa dobrze.

Prawdopodobnie istnieją podstawowe interpretery, które działają w wierszu poleceń. QBASIC może nadal działać w niektórych trybach zgodności z DOS. Nawet jeśli nie, skoro chcesz przeznaczyć do tego sprzęt, w jaki sposób uruchomienie DOS i QBASIC na komputerze PC nie zapewnia tego, o co prosiłeś?

Komentarze

  • Chodziło mi o to, że ' nie chcę programować na komputerze PC. Chcę programować w podobnym środowisku, na przykład do Texas Instruments TI-84 +. Mój powód? Sprawdź poniższy link, ” Why Johnny Can ' t Code ” salon.com/technology/feature/2006/09/14/basic/index.html
  • To nie jest tak naprawdę odpowiedź.Tak, idea PO może być nieco na lewo od centrum, ale gdzie byśmy byli, gdyby nikt nigdy nie próbował czegoś niezwykłego lub nie przesuwał granic tego, co już istnieje? Mówienie OP, że ' to głupi pomysł, nie jest ani pomocne, ani konstruktywne. Operator zdecydował, że ' chciałby to zrobić, i prosi nas o pomoc w tym, jak się do tego zabrać. On ' nie pyta, czy to ' to dobry pomysł, czy nie. Tak, może to być zły pomysł ™, ale OP wiele się nauczy, odkrywając to, co samo w sobie może być bardziej wartościowe niż wynik końcowy.
  • @Majenko: To, co napisałem, jest rozsądna odpowiedź na to, co pierwotnie napisał PO. Pamiętaj, powiedział ” Moim jedynym celem dla tego komputera jest możliwość edycji i uruchamiania programów w języku BASIC ” . To nie ' nie mówi nic o tym, że działa na innym sprzęcie. Najwyraźniej potrzebuje prostego interpretera wiersza poleceń Basic do nauczania dzieci. Dlaczego uruchomienie takiej rzeczy na komputerze PC nie jest prawidłową odpowiedzią? Czy nie ' komputer z QBASICem, czy coś takiego, o co ' prosi?
  • @Olin OP się zgadza ze mną … myślę, że źle interpretujesz pytanie.
  • @Olin – rozumiem Butts. Pamiętasz komputery domowe z późnych lat 70-tych i wczesnych 80-tych? Dodałeś pamięć 74LS373 i możesz kontrolować I / O za pomocą instrukcji poke. Żadnych wirtualnych sterowników COM do zainstalowania, żadnego USB do jakichkolwiek mostków, żadnego złożonego IDE dla programistów do załadowania. SBC są porównywalne, ale generalnie brakuje im interfejsu klawiatury / wideo (i miejsca na kasety!) Komputerów domowych.

Odpowiedź

Odpowiedź

Podoba mi się pomysł uruchomienia popularnej aplikacji, takiej jak BASIC na Arduino zwłaszcza jeśli sam ją zbudowałeś. Podoba mi się wygoda posiadania poręcznego, zasilanego bateryjnie urządzenia Arduino, na którym działa moja aplikacja. Gdybym to był ja użyłbym może Arduino MEGA, więc miałbym wystarczającą liczbę pinów dla klawiatury i osłony SD do przechowywania.

Wybrałbym kolorowy graficzny LCD lub ekran TFT zamiast VGA ze względu na prostotę programowania i połączeń, sposób śledzenia daty i czasu (RTC) oraz co to jest aplikacja bez internetu i sieci (osłona Ethernet)? Może dodatkowe pamięci RAM I2C (24LC256)? I kilka I2C MCP223017 na wszelki wypadek, gdybym potrzebował kilku dodatkowych portów. A co powiesz na wiele Arduino wykonujących równoległe zadanie? Jestem pewien, że to poprawiłoby wydajność.

Komentarze

  • Linki do arkuszy danych są cenione przez społeczność. Nie używaj też zbyt dużo wielkimi literami i upewnij się, że Twoja odpowiedź jest czytelna, dodając spacje.
  • W obecnej sytuacji jest to odpowiedź bardzo złej jakości. Ale są tutaj pewne sentymenty, które mogą być warte uwagi, jeśli zostaną wyczyszczone i lepiej przedstawione.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *