Arduino Unoから機能するコンピューターを作る


8

Arduino愛好家はいますか?

ねえ、私はこれについて考えてきました、そしてそれについて考えるほど、私は実際にこれを行うことができると思います。私の考えは基本的にこれです:Arduino Unoマイクロコントローラーから機能するコンピューターを作ります。

このコンピューターの私の唯一の目標は、BASICプログラムを編集および実行する機能です。それで全部です。それが今私が興味を持っている唯一のものであるので、私はプログラミングのためだけにそれを望みます:)

だから私がそれを見ると、私は3つの主要なハードウェアコンポーネントが必要になります:

  1. 何らかの形のディスプレイ(VGA画面など)
  2. キーボード入力を登録する何らかの方法
  3. 外部メモリにデータを保存する何らかの方法。

誰かがこれを行う方法を知っていますか?画面に表示する方法は知っていますが、キーボード入力を登録したり、外部メモリを保存したりするための適切なAPI /ハードウェアコンポーネントがわかりません。

これについては多くの助けが必要です。誰かが私を助けて、優れたハードウェア/優れたオープンソースライブラリ、または2つ、3つ、または10のアイデアと有用なヒントや提案を提供できますか?

追加:

興味のある人のためのArduino Unoコンピューターの作成ブログ


これは私の頭の痛いプロジェクトのように聞こえます;)私はあなたがそれをどのように進めるのか聞くのを楽しみにしています。私はあなたがあなたの進歩をブログに書いてくれることを望みます。
マジェンコ2011

1
興味があるかもしれない同様のプロジェクトを指摘したかっただけです。パララックスプロペラチップは限りBASICに関しては、開発のかなり多くを見てきました。少なくとも2つの異なる通訳が利用可能です。さらに、モニターのテレビに信号を直接出力する機能があります。
AndrejaKo

1
でもありますデモボード VGA、テレビ、PS / 2キーボードとマウス、オーディオ、さらにいくつかのコネクタを備えています。Arduinoでこれを実行したいことはわかっていますが、少なくとも、そこに表示されているボードの回路図を使用して、信号生成などの基本的な指針を得ることができます(すべてソフトウェアで行われます)。
AndrejaKo

このようなことをしたいのも+1!小学校に戻って、オラオのコンピューターからペンティアムIIIのコンピューターに移行したときのことを覚えています。BASICはその魅力をすべて失いました。
AndrejaKo 2011

1
VGAディスプレイを使用する代わりに、LCDシールドをピックアップしてディスプレイに使用することもできます。あなたは目を細める必要があるかもしれませんが、それとのインターフェースははるかに簡単です!
SingleNegationElimination 2011

回答:


11

キーボードはPS / 2キーボードを使用して簡単に行うことができます-それは単なるシリアルであり、そのためのチュートリアルがたくさんあります。

データの保存は、SDカードに簡単に行うことができます-すでにそれを行うためのシールドがあります。

ビデオに関しては-それはかなり難しいです。たとえば、ArduinoでPALビデオ信号を生成する場合は、作業を切り捨てます。はい、可能です。誰かがArduinoの「ポン」ゲームを作成しましたが、それは非常に分厚いグラフィックで、白黒のみです。

VGAの場合、作業を行うために何らかの形式のインターフェースが必要になります。Sparkfunは以前、Arduinoで動作するようにできるPicaso ビデオカードを販売していましたが、残念ながら廃止されており、まだ交換の予定はありません。

TBHあなたの最善の策は、Wyseターミナルのようなものを使用し、完全にシリアルを使用してArduinoと通信することです。ビデオ信号などをいじるよりもはるかに簡単です。


3

ここでOlinの要点がわかります。BASICを編集、実行、学習するだけの場合は、PCを使用するだけです。

ただし、BASICを実行し、同時にハードウェアと下位レベルの実装について学習できるコンピューターを作成することが目標である場合、これは少し異なります。私はすべてこのようなもののためにいます、それは知識を改善するための素晴らしい方法であり、あなたがそれから多くを得ると確信しています。Stevenが言及しているように、たとえばWindowsが持っているすべての紛らわしくて(ほとんど)関連のない層は取り除かれ、基本的な(しゃれた意図はない)概念は残されます。

とにかく、PIC32のようなもう少し強力なものを見たいと思うかもしれません。それはそれ自体ですべての機能(たとえば、基本的なVGA)を処理できるはずだからです。
ここでのArduino互換ボードがあり、UNO32
ザ・Maximiteは、 PIC32の周りに基づいて、BASICインタプリタを持つコンピュータは、あなたが見たいかもしれないです設計・施工いくつかのアイデアのために。


Z80でMicrosoft Basicを実行しているPCの仕様を考えると、実際の問題はないはずです。
mckenzm

2

運がよければ、私は実際にarduino PCで作業しています。それは多くはありませんが、最初のモデルのみです。ファームウェアも非常にシンプルで、APIセットが小さくなっています。しかし、事はうまくいきます!BASIC(またはそれ以外の言語)を編集するには不十分ですが、これは最初のモデルにすぎません。モボは非常にシンプルで、私はこれを使用しました。これが私が使ったファームウェアです:

        #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ファイルがなければなりません。そうでないと、システムは動作しません。


1
実際、ラッキーは、彼が最初に質問してから3年間それを理解していなかった場合
スコットザイドマン'30

@ScottSeidmanええ、良い点です。また、ファームウェアはまだテスト中であり、このバージョンには重要な要素がありません。
Jaca、2014

1

デビッドブリンに敬意を払って(たまたま彼の本は好きです。私は彼が天体物理学者としてどれほど優れているかを判断する資格がありません)、彼はプログラマーでも教育者でもありません。

私はPCの初期の頃にコーディングをしていて、かなりの量のBASICコードを書きました。それから私はプロとしてコードを書き続けています。

当時BASICを使用していた理由は、BASICを使用するか、アセンブリを書き込むかという2つのオプションがあり、アセンブリはどちらも理解が難しく、使用がはるかに面倒だったからです。それで、BASIC。

それから30年以上の間に、プログラミング命令は大幅に改善されました。私の妻は、アリス(www.alice.org)を使用する初級プログラミングクラスを教えており、概念的には古いアプローチよりもはるかに優れています。

ブリンのソリューションはかなりエレガントだったと思います。Raspberry PIでかなりシンプルなものを構築できます。arduinoでは、必要なすべてのものを2KのRAMに詰め込むのは難しいと思います。作成するOS /モニター、コマンドインタープリター、表示を行うコード、および基本的なプログラム自体のストレージを保持する必要があります。

単純な環境でコードを記述できるようにするには、難しいカスタムプログラミングをたくさん行わなければならないということは言うまでもありません。


0

わかりません。Basicでプログラミングする手段だけが必要な場合は、PCでBasicインタープリターを実行します。Arduinoがこれをどのように支援することを期待しているのか理解できません。Arduinoは、ハードウェアの詳細を隠すための多くの豪華なソフトウェアを備えたマイクロコントローラーです。そのコストの一部は、ベアマイクロコントローラーで直接実行している同等のプログラムよりもパフォーマンスが低く、リソース使用量が多いことです。Arduinoのコードを記述して、それをより汎用的なコンピューターに戻す必要があるので、その汎用コンピューターでBasicインタープリターを実行できますか?これはほとんど意味がありません。

あなたの唯一の目標は、ベーシックプログラムを編集して実行できるようにすること(ベーシックインタープリターを実行すること)であるため、最初はより汎用的なコンピューティングプラットフォームから始めます。あなたのPCはまさにそのようなプラットフォームです。これを外部ハードウェアにしたい場合は、既製のシングルボードコンピュータがArduinoよりもはるかに優れてニーズを満たしているように思えます。

追加:

あなたは今、PCで実行したくないと言って、このリンクを、彼の子供が学ぶためにコマンドラインBasicを望んでいる誰かについてサイトします。確かに私は記事全体を読みませんでした(リンクで答えるのが好きではありません。ポイントを数文で個別に述べることができるはずです)が、PCがコマンドラインを実行している様子がわかりません基本インタープリターあなたの問題に対処していません。BasicインタープリターをPCで実行できないのはなぜですか?Arduinoで実行しても問題ないのですか?あなたが唯一の目標は基本的なプログラムを編集して実行することだと前もって言ったのを覚えておいてください。そのステートメントには、どのハードウェアを実行する必要があるかについては何も記載されておらず、以降の説明では、PCがうまく機能しない理由を説明していません。

コマンドラインで実行されるBasicインタープリターがおそらく存在します。古いQBASICは、一部のDOS互換モードでも動作する可能性があります。そうでない場合でも、ハードウェアをこれに専念するつもりなので、PCでDOSおよびQBASICを実行すると、要求したものが提供されません。


私のポイントは、PCでプログラミングしたくないということでした。たとえば、Texas Instruments TI-84 +と同様の環境でプログラミングしたい。この理由は?次のリンク、「なぜジョニーはできませんコード」チェックsalon.com/technology/feature/2006/09/14/basic/index.html
リンカーンBergeson

3
これは本当に答えではありません。はい、OPのアイデアは中心から少し離れているかもしれませんが、誰もが通常のことから何かを試みたり、既存のものの限界を押し上げたりすることがなかった場合、どこにいるでしょうか?愚かなアイデアだとOPに伝えることは、役に立たず、建設的でもありません。OPは、彼がそれを実行することを決定し、それを実行する方法について支援を求めています。彼はそれが良い考えであるかどうか尋ねていません。はい、それはBad Idea™である可能性がありますが、OPはそれを見つける間に大量の学習を行います。それ自体が最終結果よりも価値がある場合があります。
Majenko、2011

@Majenko:私が書いたのは、OPが最初に書いたものに対する合理的な答えです。覚えておいて、彼は「このコンピューターの私の唯一の目標はBASICプログラムを編集して実行する能力だ」と言った。これは、代替ハードウェアで実行されていることについては何も述べていません。どうやら彼は子供たちを教えるためのシンプルなコマンドラインの基本的な通訳を望んでいます。このようなものをPCで実行すると、有効な回答にならないのはなぜですか。QBASICを実行しているPCか、まさに彼が求めているものではありませんか?
Olin Lathrop、2011

1
@Olin OPは私に同意します...質問を間違って解釈していると思います。
Majenko、2009

2
@Olin-私はバッツを理解できます。70年代後半、80年代前半の家庭用コンピュータを覚えていますか?メモリマップされた74LS373を追加し、pokeステートメントを使用してI / Oを制御できます。インストールする仮想COMドライバー、ブリッジへのUSB、ロードする複雑な開発者IDEはありません。SBCは同等ですが、通常、ホームコンピューターのキーボード/ビデオインターフェイス(およびカセットストレージ!)がありません。
stevenvh 2011


0

ArduinoでBASICなどの一般的なアプリを実行するアイデアは、特に自分で作成した場合に気に入っています。便利なバッテリー駆動のArduinoデバイスで、必要なアプリを実行できるという利便性が気に入っています。もしそれが私だったら、Arduino MEGAを使うかもしれないので、キーパッド用の十分なピンとストレージ用のSDシールドが必要です。

プログラミングと接続、日付と時刻(RTC)を追跡する方法、インターネットやネットワークなしのアプリ(イーサネットシールド)を簡単にするために、VGAではなくカラーグラフィックLCDまたはTFTスクリーンを選択しますか?余分なI2C RAM(24LC256)でしょうか?そして、いくつかの追加のポートが必要になる場合に備えて、いくつかのI2C MCP223017 複数のArduinoが並列タスクを実行するのはどうですか?それは確かにパフォーマンスを向上させるでしょう。


データシートへのリンクはコミュニティから高く評価されています。また、大文字を使いすぎないようにしてください。また、スペースを追加して解答を読みやすくしてください。

2
現状では、これは非常に質の悪い答えです。ただし、クリーンアップしてより適切に提示した場合に価値のある感情がいくつかあります。
Chris Stratton、2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.