Fazendo um computador funcional com o Arduino Uno

Algum entusiasta do Arduino por aí?

Ei, estive pensando sobre isso e quanto mais penso sobre isso, mais acho que posso realmente fazer isso. Minha ideia é basicamente esta: fazer um computador funcional a partir de um microcontrolador Arduino Uno.

Meu único objetivo para este computador é a capacidade para editar e executar programas BASIC. Isso é tudo. Só quero isso para a programação, já que essa é a única coisa em que estou interessado no momento 🙂

Então, a meu ver, vou precisar de três componentes de hardware principais:

  1. alguma forma de display (tela VGA ou algo assim)
  2. alguma maneira de registrar a entrada do teclado e
  3. alguma forma de armazenar dados na memória externa .

Alguém sabe de alguma maneira de fazer isso? Eu sei de maneiras de exibir em uma tela, mas não conheço um bom componente de API / hardware para registrar entrada de teclado ou armazenar memória externa.

Vou precisar de muita ajuda nisso. Alguém pode me ajudar e oferecer idéias e dicas úteis e sugestões para um bom hardware / uma boa biblioteca de código aberto, ou dois, ou três ou dez?

Adicionado:

Blog Fazendo um computador Arduino Uno para qualquer pessoa interessada.

Comentários

  • Isso parece como meu tipo de projeto cabeludo;) Estou ansioso para saber como você está lidando com isso. Espero que você ‘ coloque seu progresso no blog.
  • Eu só queria apontar um projeto semelhante que pode ser do seu interesse. O chip Parallax Propeller teve bastante desenvolvimento no que diz respeito ao BASIC. Existem pelo menos dois intérpretes diferentes disponíveis. Além disso, ele tem a capacidade de enviar o sinal diretamente para a TV de um monitor.
  • Existem ‘ s até o Placa de demonstração que possui VGA, TV, teclado e mouse PS / 2, áudio e mais alguns conectores. Agora eu sei que você deseja fazer isso com um Arduino, mas pelo menos você poderia usar o esquema da placa apresentado lá para obter algumas dicas básicas de como eles geraram o sinal e assim por diante (it ‘ s em software).
  • Também +1 por querer fazer algo assim! Lembro-me da escola primária quando mudamos do computador Orao para computadores Pentium III BASIC perdeu todo o seu encanto.
  • Uma alternativa para usar um monitor VGA é pegar um escudo LCD e usá-lo para o monitor. Você pode ter que apertar os olhos, mas a interface com ele será MUITO mais fácil!

Resposta

O teclado pode ser feito simplesmente usando um teclado PS / 2 – é apenas serial, e há muitos tutoriais por aí para isso.

O armazenamento de dados pode ser feito simplesmente em um cartão SD – há uma proteção externa já existe para fazer isso.

Quanto ao vídeo – é consideravelmente mais difícil. Se você quiser que o Arduino gere um sinal de vídeo PAL, por exemplo, terá um trabalho difícil para você. Sim, é é possível, e alguém criou um jogo “pong” Arduino, mas seus gráficos são muito robustos e apenas em preto e branco.

Para VGA, você precisará de alguma forma de interface para fazer o trabalho para você. Sparkfun costumava vender a placa de vídeo do Picaso que poderia ser feita para funcionar com o Arduino, mas infelizmente foi descontinuado e ainda não há planos para uma substituição .

TBH, sua melhor aposta seria usar algo como um terminal Wyse e se comunicar com o Arduino completamente usando serial. Muito mais simples do que mexer com sinais de vídeo e tal.

Resposta

Eu vejo o ponto de Olin aqui – se você deseja apenas editar / executar / aprender BASIC, use um PC .

No entanto, se o objetivo é o desafio de criar um computador que possa executar BASIC e aprender sobre o hardware e a implementação de nível inferior ao mesmo tempo, então isso é um pouco diferente. Eu sou totalmente a favor de coisas assim , é uma ótima maneira de aprimorar o conhecimento e tenho certeza de que você aproveitará muito isso. Como Steven menciona todas as camadas confusas e (principalmente) irrelevantes que, por exemplo, O Windows pode ser removido, deixando os conceitos básicos (sem trocadilhos).

De qualquer forma, você pode querer olhar para algo um pouco mais poderoso como o PIC32 para isso, já que deve ser capaz de lidar com todas as funcionalidades (por exemplo, VGA básico) em é própria.
Aqui está uma placa compatível com Arduino, a UNO32
A Maximite é um computador com intérprete BASIC baseado em um PIC32, você pode querer dar uma olhada em Projeto e construção para algumas ideias.

Comentários

  • Dadas as especificações de PC ‘ s executando o Microsoft Basic em um Z80, não deve haver nenhum problema real .

Resposta

Você está com sorte, mais ou menos, porque estou trabalhando em um PC arduino agora! Não é muito, porém, apenas o primeiro modelo. O firmware também é muito simples e tem um pequeno conjunto de APIs. Mas, a coisa funciona! Não é bom o suficiente para editar BASIC (ou qualquer linguagem exceto a sua própria), mas isso é apenas o primeiro modelo. O mobo é bastante simples e usei este . Aqui está o firmware que usei:

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

A descrição do método é difícil de explicar, mas o código é armazenado como bytes brutos. Devo ter o software de desenvolvimento pronto em breve … Espero que ajude! Se você quiser usar isso para qualquer projeto, VOCÊ DEVE TER um arquivo BIOS.mk8 no diretório raiz do SD ou o sistema não funcionará.

Comentários

  • Sorte mesmo, se ele não ‘ não percebi nos três anos desde que perguntou pela primeira vez
  • @ScottSeidman Sim, bom ponto. Além disso, o firmware ainda está em teste, e isso faltam elementos-chave na versão.

Resposta

Com todo o respeito a David Brin (gosto muito dos livros dele; Não estou qualificado para julgar o quão bom ele é como astrofísico), ele não é nem um programador nem um educador.

Eu estava por aí e codificando nos primeiros dias dos PCs e escrevi uma boa quantidade de código BASIC. E tenho escrito código profissionalmente desde então.

A razão de usarmos BASIC naquela época era que suas duas opções eram usar BASIC ou escrever em assembly, e assembly era mais difícil de entender e muito mais complicado de usar. Então, BASIC.

Nos mais de 30 anos desde então, houve melhorias significativas na instrução de programação. Minha esposa dá uma aula de programação para iniciantes que usa Alice (www.alice.org), e é muito melhor conceitualmente do que as abordagens mais antigas.

Acho que a solução de Brin era muito elegante. Você poderia construir algo bem simples em um Raspberry PI. No arduino, acho que será um desafio para colocar tudo que você precisa em 2K de RAM; isso tem que conter qualquer SO / Monitor que você acabar escrevendo, um interpretador de comandos, código para fazer a exibição e armazenamento para o próprio programa básico.

Não para mencione o fato de que você terá que fazer muita programação difícil e customizada para que possa escrever código em um ambiente simples ironment.

Resposta

Não entendi. Se você só quer ter meios de programar em Basic, execute um básico intérprete no seu PC. Não entendo como você espera que o Arduino ajude com isso. O Arduino é um microcontrolador com muitos softwares sofisticados para ocultar os detalhes do hardware. Parte do custo disso é desempenho inferior e mais uso de recursos do que o programa equivalente executado diretamente no microcontrolador vazio. Agora você deseja escrever o código do Arduino para transformá-lo novamente em um computador de uso geral, tudo para que possa, por sua vez, executar um interpretador Basic nesse computador de uso geral? Isso faz pouco sentido.

Já que seu único objetivo é ser capaz de editar e executar programas básicos (executar um intérprete básico), comece com uma plataforma de computação de uso mais geral em primeiro lugar, de preferência até mesmo uma que já tem um intérprete básico disponível. Seu PC é exatamente essa plataforma. Se você quiser que seja um hardware externo, parece que um computador de placa única disponível no mercado atenderia muito melhor às suas necessidades do que um Arduino.

Adicionado:

Agora você diz que não quero executar em um PC e colocar este link sobre alguém que deseja uma linha de comando Básica para seu filho aprender. É verdade que não li o artigo inteiro (não gosto de pessoas respondendo com links. Você deve ser capaz para afirmar seu ponto de forma independente em algumas frases), mas não vejo como um PC executando uma linha de comando interpretador Basic não resolve o seu problema. Por que o interpretador Basic não tem permissão para ser executado em um PC, mas está tudo bem executar em um Arduino? Lembre-se de que você disse de antemão que seu único objetivo era editar e executar programas básicos. Nada nessa declaração diz em qual hardware ele deve ser executado, e nenhuma de suas explicações subsequentes explica por que um PC não funcionaria bem.

Provavelmente, há interpretadores básicos que são executados na linha de comando. O QBASIC ainda pode funcionar em algum modo de compatibilidade do DOS. Mesmo se não, já que você está disposto a dedicar hardware para isso, como rodar o DOS e o QBASIC em um PC não fornece o que você pediu?

Comentários

  • Meu ponto é que eu não ‘ não quero programar em um PC. Quero programar em um ambiente semelhante a, digamos, por exemplo, uma Texas Instruments TI-84 +. Minha razão para isso? Confira o seguinte link, ” Por que Johnny pode ‘ t Code ” salon.com/technology/feature/2006/09/14/basic/index.html
  • Isso não é realmente uma resposta.Sim, a ideia do OP pode ter saído um pouco do centro, mas onde estaríamos se ninguém jamais tentasse nada fora do comum, ou forçar os limites do que já existe? Dizer ao OP que é ‘ uma ideia tola não é útil nem construtivo. O OP decidiu que ‘ gostaria de fazê-lo e está nos pedindo ajuda para fazer isso. Ele ‘ não está perguntando se ‘ é uma boa ideia ou não. Sim, pode muito bem ser uma má ideia ™, mas o OP aprenderá muito ao descobrir isso, o que pode ser mais valioso do que o resultado final.
  • @Majenko: O que escrevi é um resposta razoável ao que o OP escreveu originalmente. Lembre-se, ele disse ” Meu único objetivo para este computador é a capacidade de editar e executar programas BASIC ” . Isso não ‘ não diz nada sobre a execução em hardware alternativo. Aparentemente, ele quer um intérprete básico de linha de comando simples para ensinar crianças. Como executar tal coisa em um PC não é uma resposta válida? Não é ‘ um PC executando QBASIC ou algo exatamente o que ele ‘ está pedindo?
  • @Olin O OP concorda comigo … Acho que você está interpretando a pergunta de forma errada.
  • @Olin – Eu posso entender Butts. Lembra dos computadores domésticos no final dos anos 70, início dos 80? Você adicionou uma memória 74LS373 mapeada e pode controlar I / Os por meio de instruções poke. Sem drivers COM virtuais para instalar, sem USB em quaisquer pontes, sem IDE de desenvolvedor complexo para carregar. SBCs são comparáveis, mas geralmente não possuem a interface de teclado / vídeo (e armazenamento de cassete!) Dos computadores domésticos.

Resposta

Resposta

Gosto da ideia de executar um aplicativo comum, como BASIC em um Arduino especialmente se você mesmo o construiu à mão. Gosto da conveniência de ter um dispositivo Arduino prático, alimentado por bateria, executando o aplicativo que desejo. Se fosse eu, talvez usasse um Arduino MEGA para ter pinos suficientes para o teclado e um escudo SD para armazenamento.

Eu escolheria um LCD gráfico colorido ou uma tela TFT em vez de VGA para simplificar a programação e as conexões, uma maneira de controlar a data e a hora (RTC), e o que é um aplicativo sem internet ou rede (escudo ethernet)? RAMs I2C extras (24LC256) talvez? E alguns I2C MCP223017 apenas no caso de eu precisar de algumas portas extras. Que tal vários Arduino fazendo uma tarefa paralela? Isso melhoraria o desempenho, tenho certeza.

Comentários

  • Links para planilhas são apreciados pela comunidade. Além disso, não use muito letras maiúsculas e certifique-se de que sua resposta seja legível adicionando espaços em branco.
  • Como está, esta é uma resposta de qualidade muito baixa. Mas há alguns sentimentos aqui que poderiam valer a pena se limpos e melhor apresentados.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *