Arduino Uno로 기능성 컴퓨터 만들기

아두 이노 애호가가 있습니까?

이봐, 나는 이것에 대해 생각하고 있었고 생각하면할수록 실제로 할 수 있다고 생각합니다. 제 생각은 기본적으로 다음과 같습니다. Arduino Uno 마이크로 컨트롤러로 기능적인 컴퓨터를 만듭니다.

이 컴퓨터의 유일한 목표는 능력입니다. BASIC 프로그램을 편집하고 실행하는 것입니다. 프로그래밍을 위해서만 필요합니다. “지금 당장 관심이있는 유일한 것입니다. 🙂

그래서 제가보기에 세 가지 주요 하드웨어 구성 요소가 필요합니다.

  1. 일부 형태의 디스플레이 (VGA 화면 등)
  2. 키보드 입력을 등록하는 방법 및
  3. 외부 메모리에 데이터를 저장하는 방법 .

이 작업을 수행하는 방법을 아는 사람이 있습니까? 화면에 표시하는 방법을 알고 있지만 키보드 입력을 등록하거나 등록하는 데 좋은 API / 하드웨어 구성 요소를 모릅니다. 외부 메모리를 저장합니다.

나는 이것에 대해 많은 도움이 필요합니다. 누구든지 나를 도와주고 좋은 하드웨어 / 좋은 오픈 소스 라이브러리에 대한 아이디어와 유용한 팁과 제안을 제공 할 수 있습니까? 또는 3 개 또는 10 개?

추가됨 :

블로그 관심있는 모든 사람을위한 Arduino Uno 컴퓨터 만들기

댓글

  • 소리 내 종류의 머리가 좋은 프로젝트처럼;) 나는 당신이 그것에 어떻게 대처하는지 듣기를 고대합니다. ‘ 진행 상황을 블로그에 올리시기 바랍니다.
  • 관심을 가질만한 유사한 프로젝트를 지적하고 싶었습니다. Parallax Propeller 칩은 BASIC에 관한 한 많은 발전을 보였습니다. 최소한 두 명의 다른 통역사가 있습니다. 또한 모니터의 TV로 신호를 직접 출력 할 수 있습니다.
  • 데모 보드 . 이제 Arduino로이 작업을 수행하고 싶다는 것을 알고 있지만 적어도 거기에 제시된 보드 회로도를 사용하여 신호 생성 등을 수행하는 방법에 대한 몇 가지 기본 포인터를 얻을 수 있습니다 (it ‘는 모두 소프트웨어에 포함되어 있습니다.
  • 또한 이와 같은 작업을하고 싶은 경우 +1! 초등학교 때 Orao 컴퓨터에서 Pentium III 컴퓨터 BASIC으로 옮겼을 때가 기억납니다. BASIC의 모든 매력을 잃었습니다.
  • 대안 VGA 디스플레이를 사용하는 것은 LCD 실드를 집어 디스플레이에 사용하는 것입니다. 눈을 가늘게 뜨고 연결해야 할 수도 있지만 인터페이스를 사용하는 것이 MUUUCH 더 쉽습니다!

답변

키보드는 PS / 2 키보드를 사용하여 간단하게 수행 할 수 있습니다. 직렬이며 이에 대한 많은 자습서가 있습니다.

데이터 저장은 SD 카드에 간단하게 수행 할 수 있습니다. 이미 그렇게 할 수 있습니다.

비디오는 상당히 어렵습니다. 예를 들어 Arduino가 PAL 비디오 신호를 생성하도록하려면 작업을 잘라 내야합니다. 예, 그렇습니다. 누군가가 아두 이노 “퐁”게임을 만들었지 만, 그래픽이 매우 뭉툭하고 흑백으로 만되어 있습니다.

VGA의 경우 작업을 수행하려면 어떤 형태의 인터페이스가 필요합니다. Sparkfun은 Arduino와 함께 작동하도록 만들 수있는 Picaso 비디오 카드 를 판매했지만 아쉽게도 중단되었으며 아직 교체 계획이 없습니다. .

TBH 가장 좋은 방법은 Wyse 터미널 과 같은 것을 사용하고 직렬을 사용하여 Arduino와 완전히 통신하는 것입니다. 비디오 신호 등을 엉망으로 만드는 것보다 훨씬 간단합니다.

답변

여기에 Olin의 요점이 보입니다. BASIC 만 편집 / 실행 / 학습하려면 PC를 사용하십시오. .

그러나 목표가 BASIC을 실행하는 동시에 하드웨어와 하위 수준의 구현에 대해 배울 수있는 컴퓨터를 만드는 것이라면 이것은 약간 다릅니다. , 그것은 “지식을 향상시키는 좋은 방법이며 당신이 그것으로부터 많은 것을 얻을 수있을 것이라고 확신합니다. Steven이 모든 혼란스럽고 (대부분) 관련없는 레이어를 언급했듯이 Windows는 기본 (말장난이 아닌) 개념을 그대로두고 제거 할 수 있습니다.

어쨌든 PIC32와 같은 좀 더 강력한 것을보고 싶을 수도 있습니다. PIC32가 모든 기능 (예 : 기본 VGA)을 처리 할 수 있어야하기 때문입니다. 여기에 Arduino 호환 보드가 있습니다. UNO32
Maximite 는 PIC32를 기반으로하는 BASIC 인터프리터가있는 컴퓨터입니다. 설계 및 구성 에서 몇 가지 아이디어를 살펴 보시기 바랍니다.

댓글

  • Z80에서 Microsoft Basic을 실행하는 PC ‘의 사양을 고려하면 실제 문제는 없습니다. .

답변

실제로 arduino PC에서 작업하고 있기 때문에 운이 좋습니다! 그다지 많지는 않지만 첫 번째 모델 일뿐입니다. 펌웨어도 매우 간단하고 작은 API 세트가 있습니다.하지만 작동합니다! BASIC (또는 자체 언어를 제외한 모든 언어)를 편집하기에 충분하지 않습니다. 첫 번째 모델 만입니다. mobo는 매우 간단하며 this 를 사용했습니다. 사용한 펌웨어는 다음과 같습니다.

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

메서드 설명은 설명하기 어렵지만 코드는 원시 바이트로 저장됩니다. 곧 개발 소프트웨어가 있어야합니다 …이게 도움이되기를 바랍니다. 어떤 프로젝트 에든 이것을 사용하고 싶다면, SD의 루트 디렉토리에 BIOS.mk8 파일이 있어야합니다. 그렇지 않으면 시스템이 작동하지 않습니다.

댓글

  • ‘ 처음 질문 한 이래 3 년 동안 파악하지 못했습니다.
  • @ScottSeidman 예, 좋은 지적입니다. 또한 펌웨어는 아직 테스트 중입니다. 버전에 핵심 요소가 누락되었습니다.

답변

정중히 David Brin에게 (저는 그의 책을 많이 좋아합니다. 나는 그가 천체 물리학 자로서 얼마나 좋은지 판단 할 자격이 없습니다.) 그는 프로그래머도 교육자도 아닙니다.

저는 PC 초기에 코딩을하고 있었고 상당한 양의 BASIC 코드를 작성했습니다. 그리고 저는 그 이후로 전문적으로 코드를 작성했습니다.

당시 BASIC을 사용한 이유는 두 가지 옵션이 BASIC을 사용하거나 어셈블리로 작성하는 것이었고 어셈블리는 이해하기가 더 어렵고 훨씬 더 많았 기 때문입니다. 사용이 번거 롭습니다. 그래서 BASIC입니다.

그 이후로 30 년 이상 프로그래밍 교육이 크게 향상되었습니다. 제 아내는 Alice (www.alice.org)를 사용하는 초급 프로그래밍 수업을 가르치고 있습니다. 이전 접근 방식보다 개념적으로 훨씬 낫습니다.

Brin의 솔루션이 매우 우아하다고 생각합니다. Raspberry PI에서 매우 간단한 것을 구축 할 수 있습니다. arduino에서는 도전이 될 것이라고 생각합니다. 필요한 모든 것을 2K RAM에 담기 위해 작성하는 OS / 모니터, 명령 인터프리터, 디스플레이를 수행하는 코드 및 기본 프로그램 자체를위한 스토리지를 저장해야합니다.

간단한 환경에서 코드를 작성할 수 있도록 어렵고 사용자 지정 프로그래밍을 많이해야한다는 사실을 언급합니다. 다림질.

답변

잘 모르겠습니다. Basic으로 프로그래밍 할 수있는 방법 만 갖고 싶다면 기본 아두 이노가이 일을 어떻게 도와 줄지 모르겠습니다. Arduino는 하드웨어 세부 정보를 숨기는 멋진 소프트웨어가 많은 마이크로 컨트롤러입니다. 비용의 일부는 베어 마이크로 컨트롤러에서 직접 실행되는 동등한 프로그램보다 성능이 낮고 리소스 사용량이 많다는 것입니다. 이제 Arduino 코드를 작성하여 좀 더 일반적인 목적의 컴퓨터로 되돌리려면이 모든 것이 범용 컴퓨터에서 기본 인터프리터를 실행할 수 있도록 하시겠습니까? 이것은 말이 안됩니다.

당신의 유일한 목표는 기본 프로그램을 편집하고 실행할 수있는 것이므로 (기본 인터프리터를 실행하는 것), 우선보다 범용적인 컴퓨팅 플랫폼으로 시작하십시오. 이미 사용 가능한 기본 통역사가 있습니다. 귀하의 PC는 바로 그러한 플랫폼입니다. 이것이 외부 하드웨어가되기를 원한다면, 기성품 단일 보드 컴퓨터가 Arduino보다 훨씬 더 당신의 요구를 충족시킬 것 같습니다.

추가됨 :

지금 당신은 당신을 말합니다. PC에서 실행하고 싶지 않은 사람에 대한이 링크를 자녀가 배울 수있는 명령 줄 Basic을 원하는 사람에 대한 사이트로 지정합니다. 사실 저는 전체 기사를 읽지 않았습니다 (링크로 대답하는 사람들을 좋아하지 않습니다. 당신의 요점을 몇 문장으로 독립적으로 표현),하지만 “명령 줄 기본 인터프리터를 실행하는 PC가 당신의 문제를 어떻게 해결하지 못하는지 모르겠습니다. 왜 베이직 인터프리터가 PC에서 실행이 허용되지 않지만 괜찮습니다” Arduino에서 실행하려면? 기본 프로그램을 편집하고 실행하는 것이 유일한 목표라고 미리 말씀하셨습니다. 그 성명서에는 어떤 하드웨어에서 실행해야하는지에 대한 설명이 없으며 PC가 제대로 작동하지 않는 이유를 설명하는 후속 설명도 없습니다.

명령 줄에서 실행되는 기본 인터프리터가있을 수 있습니다. QBASIC은 여전히 일부 DOS 호환 모드에서 작동 할 수 있습니다. 그렇지 않더라도 “하드웨어 전용으로 PC에서 DOS 및 QBASIC을 실행하면 요청한 내용을 제공하지 못합니까?

댓글

  • 내 요점은 PC에서 프로그램하고 싶지 않다는 것입니다 ‘. 예를 들어 Texas Instruments TI-84 +와 유사한 환경에서 프로그래밍하고 싶습니다. 내 이유는? 다음 링크를 확인하십시오. ” Johnny Can ‘ t 코드 ” salon.com/technology/feature/2006/09/14/basic/index.html
  • 정답이 아닙니다.예, OP의 아이디어는 약간 왼쪽에있을 수 있지만, 아무도 평범하지 않은 것을 시도하지 않거나 이미 존재하는 것의 한계를 밀어 붙이지 않는다면 우리는 어디에 있을까요? OP에게 ‘ 어리석은 아이디어라고 말하는 것은 도움이되지도 건설 적이지도 않습니다. OP는 ‘이를 수행하기로 결정했으며 해결 방법에 대한 도움을 요청하고 있습니다. 그는 ‘가 ‘가 좋은 생각인지 묻지 않습니다. 예, 그것은 Bad Idea ™ 일 수도 있지만 OP는 그 자체가 최종 결과보다 더 가치있을 수 있다는 것을 알아 내면서 엄청난 양을 배울 것입니다.
  • @Majenko : 제가 쓴 것은 OP가 원래 작성한 것에 대한 합리적인 대답. 그는 ” 이 컴퓨터의 유일한 목표는 BASIC 프로그램을 편집하고 실행하는 것입니다. “라고 말했습니다. . 이것은 ‘ 대체 하드웨어에서 실행되는 것에 대해 아무 말도하지 않습니다. 분명히 그는 아이들을 가르치기위한 간단한 명령 줄 기본 인터프리터를 원합니다. PC에서 그런 일을 실행하는 것이 어떻게 유효한 답이 아닌가? ‘ QBASIC을 실행하는 PC 또는 그가 ‘가 요구하는 것과 정확히 일치합니까?
  • @Olin The OP가 동의합니다. 나와 함께 … 질문을 잘못 해석하신 것 같습니다.
  • @Olin-Butts를 이해할 수 있습니다. 70 년대 후반, 80 년대 초반 가정용 컴퓨터를 기억하십니까? 메모리 매핑 74LS373을 추가했으며 poke 문을 통해 I / O를 제어 할 수 있습니다. 설치할 가상 COM 드라이버, 브리지에 대한 USB,로드 할 복잡한 개발자 IDE가 없습니다. SBC는 비슷하지만 일반적으로 가정용 컴퓨터의 키보드 / 비디오 인터페이스 (및 카세트 저장소!)가 없습니다.

답변

답변

Arduino에서 BASIC과 같은 일반적인 앱을 실행하는 아이디어가 마음에 듭니다. 특히 직접 손으로 만든 경우. 원하는 앱을 실행하는 편리한 배터리 전원 아두 이노 장치의 편리함이 마음에 듭니다. 저라면 Arduino MEGA를 사용하여 키패드 용 핀과 저장 용 SD 쉴드를 사용할 것입니다.

VGA 대신 컬러 그래픽 LCD 또는 TFT 스크린을 선택합니다. 프로그래밍 및 연결의 단순성, 날짜 및 시간 (RTC)을 추적하는 방법, 인터넷 또는 네트워킹이없는 앱 (이더넷 쉴드)은 무엇입니까? 추가 I2C RAM (24LC256)일까요? 그리고 몇 개의 추가 포트가 필요할 경우를 대비하여 몇 개의 I2C MCP223017이 있습니다. 여러 Arduino가 병렬 작업을 수행하는 것은 어떻습니까? 그러면 성능이 향상 될 것입니다.

댓글

  • 데이터 시트 링크는 커뮤니티에서 높이 평가합니다. 또한 너무 많이 사용하지 마세요. 대문자를 사용하고 공백을 추가하여 답을 읽을 수 있는지 확인하세요.
  • 현재 이것은 매우 저질의 답변입니다.하지만 여기에는 정리하고 더 잘 제시하면 가치가있는 몇 가지 감정이 있습니다.
  • li>

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다