Hacer una computadora funcional con un Arduino Uno

¿Algún entusiasta de Arduino por ahí?

Oye, he estado pensando en esto y cuanto más lo pienso, más creo que puedo hacer esto. Mi idea es básicamente la siguiente: hacer una computadora funcional con un microcontrolador Arduino Uno.

Mi único objetivo para esta computadora es la capacidad para editar y ejecutar programas BASIC. Eso es todo. Solo lo quiero para la programación, ya que eso es lo único que me interesa en este momento 🙂

Así que, a mi modo de ver, necesitaré tres componentes principales de hardware:

  1. alguna forma de pantalla (pantalla VGA o algo)
  2. alguna forma de registrar la entrada del teclado, y
  3. alguna forma de almacenar datos en la memoria externa .

¿Alguien sabe alguna forma de hacer esto? Conozco formas de mostrar en una pantalla, pero no conozco un buen componente de API / hardware para registrar la entrada del teclado o almacenar memoria externa.

Voy a necesitar mucha ayuda con esto. ¿Alguien puede ayudarme y ofrecerme ideas y consejos útiles y sugerencias para un buen hardware / una buena biblioteca de código abierto, o dos, ¿o tres, o diez?

Añadido:

Blog Hacer una computadora Arduino Uno para cualquiera que esté interesado.

Comentarios

  • Esto suena como mi tipo de proyecto descabellado;) Espero escuchar cómo te va. Espero que ‘ escribas tu progreso en un blog.
  • Solo quería señalar un proyecto similar que puede ser de interés. El chip Parallax Propeller ha experimentado un gran desarrollo en lo que respecta a BASIC. Hay al menos dos intérpretes diferentes disponibles. Además, tiene la capacidad de enviar la señal directamente al televisor de un monitor.
  • Hay ‘ incluso Placa de demostración que tiene VGA, TV, teclado y mouse PS / 2, audio y algunos conectores más. Ahora sé que desea hacer esto con un Arduino, pero al menos podría usar los esquemas de la placa que se presentan allí para obtener algunos consejos básicos sobre cómo hicieron la generación de señales y así sucesivamente (‘ s todo en software).
  • ¡También +1 por querer hacer algo como esto! Recuerdo que en la escuela primaria cuando nos mudamos de la computadora Orao a computadoras Pentium III, BASIC perdió todo su encanto.
  • Una alternativa a usar una pantalla VGA es tomar una pantalla LCD y usarla para la pantalla. Puede que tenga que entrecerrar los ojos, ¡pero interactuar con él será MUCHO más fácil!

Responder

El teclado puede ser hecho simplemente usando un teclado PS / 2 – es solo serial, y hay muchos tutoriales disponibles para ello.

El almacenamiento de datos se puede hacer simplemente en una tarjeta SD – hay un escudo ya hay para hacer eso.

En cuanto al video, eso es considerablemente más difícil. Si desea que el Arduino genere una señal de video PAL, por ejemplo, entonces tiene mucho trabajo por usted. Sí, es posible, y alguien ha creado un juego «pong» de Arduino, pero tiene gráficos muy gruesos y solo en blanco y negro.

Para VGA necesitarás algún tipo de interfaz para hacer el trabajo por ti. Sparkfun solía vender la tarjeta de video Picaso que podría funcionar con Arduino, pero, lamentablemente, se ha descontinuado y aún no hay planes para reemplazarla. .

TBH, su mejor opción sería usar algo como un terminal Wyse y comunicarse con Arduino completamente usando serial. Mucho más simple que jugar con señales de video y demás.

Respuesta

Veo el punto de Olin aquí: si solo desea editar / ejecutar / aprender BÁSICO, use una PC .

Sin embargo, si el objetivo es el desafío de crear una computadora que pueda ejecutar BASIC y aprender sobre el hardware y la implementación de nivel inferior al mismo tiempo, entonces esto es un poco diferente. Estoy a favor de cosas como esta , es una excelente manera de mejorar el conocimiento y estoy seguro de que sacará mucho provecho. Como Steven menciona todas las capas confusas y (en su mayoría) irrelevantes que, por ejemplo, Windows se puede quitar, dejando los conceptos básicos (sin juego de palabras).

De todos modos, podría querer mirar algo un poco más poderoso como el PIC32 para esto, ya que debería poder manejar todas las funciones (por ejemplo, VGA básico) en es propio.
Aquí hay una placa compatible con Arduino, la UNO32
La Maximite es una computadora con un intérprete BASIC basado en un PIC32, es posible que desee consultar el Diseño y construcción para obtener algunas ideas.

Comentarios

  • Dadas las especificaciones de las PC ‘ que ejecutan Microsoft Basic en un Z80, no debería haber ningún problema real .

Respuesta

¡Estás de suerte, porque estoy trabajando en una PC arduino ahora mismo! Sin embargo, no es mucho, solo el primer modelo. El firmware también es muy simple y tiene un pequeño conjunto de API. Pero, ¡la cosa funciona! No es lo suficientemente bueno como para editar BASIC (o cualquier idioma excepto el suyo), pero esto es solo el primer modelo. El mobo es bastante simple, y usé este . Aquí está el firmware que usé:

 #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 descripción del método es difícil de explicar, pero el código se almacena en bytes sin procesar. Debería tener el software de desarrollo listo pronto … ¡Espero que esto ayude! Si alguna vez quieres usar esto para cualquier proyecto, DEBE TENER UN archivo BIOS.mk8 en el directorio raíz de la SD o el sistema no funcionará.

Comentarios

  • Suerte de hecho, si hasn ‘ t lo descubrió en los tres años desde que preguntó por primera vez
  • @ScottSeidman Sí, buen punto. Además, el firmware todavía está en prueba, y esto a la versión le faltan elementos clave.

Responder

Con el debido respeto a David Brin (resulta que me gustan mucho sus libros; No estoy calificado para juzgar lo bueno que es como astrofísico, no es programador ni educador.

Yo trabajaba y codificaba en los primeros días de las PC, y escribí una buena cantidad de código BASIC. Y he estado escribiendo código profesionalmente desde entonces.

La razón por la que usamos BASIC en ese entonces era que sus dos opciones eran usar BASIC o escribir en ensamblador, y ensamblar era más difícil de entender y mucho más incómodo de usar. Entonces, BÁSICO.

En los más de 30 años desde entonces, ha habido mejoras significativas en la instrucción de programación. Mi esposa enseña una clase de programación para principiantes que usa Alice (www.alice.org), y es mucho mejor conceptualmente que los enfoques anteriores.

Creo que la solución de Brin fue bastante elegante. Podrías construir algo bastante simple en una Raspberry PI. En el arduino, creo que será un desafío para guardar todo lo que necesita en 2K de RAM; eso tiene que contener cualquier SO / Monitor que termine escribiendo, un intérprete de comandos, código para hacer la visualización y almacenamiento para el programa básico en sí.

No para Mencione el hecho de que tendrá que hacer una gran cantidad de programación difícil y personalizada para que pueda escribir código en un entorno simple. planchado.

Respuesta

No lo entiendo. Si solo desea tener un medio para programar en Básico, ejecute un intérprete en tu PC. No entiendo cómo esperas que Arduino te ayude con esto. El Arduino es un microcontrolador con una gran cantidad de software sofisticado para ocultar los detalles del hardware. Parte del costo de eso es un menor rendimiento y más uso de recursos que el programa equivalente que se ejecuta directamente en el microcontrolador. ¿Ahora quiere escribir código Arduino para convertirlo de nuevo en una computadora de propósito más general, todo para que a su vez pueda ejecutar un intérprete básico en esa computadora de propósito general? Esto tiene poco sentido.

Dado que su único objetivo es poder editar y ejecutar programas básicos (ejecutar un intérprete básico), comience con una plataforma informática de propósito más general en primer lugar, preferiblemente incluso una que ya tiene un intérprete básico disponible. Su PC es exactamente esa plataforma. Si desea que este sea un hardware externo, parece que una computadora de placa única lista para usar satisfaría sus necesidades mucho mejor que un Arduino.

Agregado:

Ahora dice que No quiero ejecutar en una PC y colocar este enlace sobre alguien que quiere que su hijo aprenda una línea de comandos básica. Es cierto que no leí el artículo completo (no me gusta que la gente responda con enlaces. Debería poder para expresar su punto de forma independiente en unas pocas oraciones), pero no veo cómo una PC que ejecuta una línea de comandos El intérprete básico no resuelve su problema. ¿Por qué no se permite que el intérprete básico se ejecute en una PC pero está bien para ejecutar en un Arduino? Recuerde, dijo desde el principio que su único objetivo era editar y ejecutar programas básicos. Nada en esa declaración dice en qué hardware debe ejecutarse, y ninguna de sus explicaciones posteriores explica por qué una PC no funcionaría bien.

Probablemente hay intérpretes básicos que se ejecutan en la línea de comandos. QBASIC aún podría funcionar en algún modo de compatibilidad con DOS. Incluso si no, ya que está dispuesto a dedicar hardware a esto, ¿cómo es que ejecutar DOS y QBASIC en una PC no proporciona lo que solicitó?

Comentarios

  • Mi punto es que no ‘ t quiero programar en una PC. Quiero programar en un entorno similar a, por ejemplo, una Texas Instruments TI-84 +. ¿Mi razón para esto? Consulte el siguiente vínculo, » Por qué Johnny Can ‘ t Code » salon.com/technology/feature/2006/09/14/basic/index.html
  • Esta no es realmente una respuesta.Sí, la idea del OP puede estar un poco a la izquierda del centro, pero ¿dónde estaríamos si nadie intentara nada fuera de lo común, o empujar los límites de lo que ya existe? Decirle al OP que ‘ es una idea tonta no es útil ni constructivo. El OP ha decidido que ‘ le gustaría hacerlo y nos está pidiendo ayuda sobre cómo hacerlo. Él ‘ no pregunta si ‘ es una buena idea o no. Sí, bien puede ser una mala idea ™, pero el OP aprenderá mucho mientras lo averigua, lo que en sí mismo puede ser más valioso que el resultado final.
  • @Majenko: Lo que escribí es un respuesta razonable a lo que escribió originalmente el OP. Recuerde, dijo » Mi único objetivo para esta computadora es la capacidad de editar y ejecutar programas BÁSICOS » . Esto no ‘ no dice nada sobre su ejecución en hardware alternativo. Aparentemente quiere un intérprete básico de línea de comandos simple para enseñar a los niños. ¿Cómo ejecutar tal cosa en una PC no es una respuesta válida? ¿No es ‘ una PC con QBASIC o algo exactamente lo que ‘ está pidiendo?
  • @Olin El OP está de acuerdo conmigo … creo que estás interpretando mal la pregunta.
  • @Olin – Puedo entender Butts. ¿Recuerda las computadoras domésticas de finales de los 70 y principios de los 80? Agregó un 74LS373 mapeado en memoria y pudo controlar las E / S a través de instrucciones poke. Sin controladores COM virtuales para instalar, sin USB a ningún puente, sin IDE de desarrollador complejo para cargar. Los SBC son comparables, pero generalmente carecen de la interfaz de teclado / video (¡y el almacenamiento en casete!) De las computadoras domésticas.

Respuesta

Respuesta

Me gusta la idea de ejecutar una aplicación común, como BASIC en un Arduino especialmente si lo construyó usted mismo a mano. Me gusta la conveniencia de tener un dispositivo Arduino que funciona con batería y que ejecuta la aplicación que quería. Si fuera yo, usaría tal vez un Arduino MEGA, así que tendría suficientes pines para el teclado y un protector SD para el almacenamiento.

Elegiría una pantalla LCD con gráficos en color o una pantalla TFT en lugar de VGA para simplificar la programación y las conexiones, una forma de realizar un seguimiento de la fecha y la hora (RTC), y ¿qué es una aplicación sin Internet o redes (escudo ethernet)? ¿RAM I2C adicionales (24LC256) tal vez? Y algunos I2C MCP223017 en caso de que necesite algunos puertos adicionales. ¿Qué tal si varios Arduino hacen una tarea en paralelo? Eso mejoraría el rendimiento, estoy seguro.

Comentarios

  • La comunidad aprecia los enlaces a las hojas de datos. Además, no utilice demasiado mayúsculas y asegúrese de que su respuesta sea legible agregando espacios en blanco.
  • Tal como está, esta es una respuesta de muy mala calidad. Pero hay algunos sentimientos aquí que podrían valer la pena si se limpian y se presentan mejor.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *