ArduinoUnoから機能的なコンピューターを作る

Arduinoの愛好家はいますか?

ねえ、私はこれについて考えていて、考えれば考えるほど、実際にできると思います。基本的には、ArduinoUnoマイクロコンピューターで機能するコンピューターを作ることです。

このコンピューターの唯一の目標は能力です。 BASICプログラムを編集して実行します。それだけです。私が今興味を持っているのはプログラミングのためだけです:)

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

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

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

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

追加:

ブログ興味のある人のためにArduinoUnoコンピューターを作成する

コメント

  • 私のような頭のいいプロジェクトのように;)どうやってやっていくのか聞いて楽しみです。 ‘進捗状況をブログに投稿していただければ幸いです。
  • 興味深い可能性のある同様のプロジェクトを指摘したいと思います。 Parallax Propeller チップは、BASICに関する限り、かなり多くの開発が行われています。少なくとも2つの異なる通訳者が利用できます。さらに、モニターのテレビに信号を直接出力する機能もあります。
  • デモボードには、VGA、TV、PS / 2キーボードとマウス、オーディオ、その他いくつかのコネクタがあります。 Arduinoでこれを実行したいことはわかっていますが、少なくとも、そこに示されているボードの回路図を使用して、信号生成などの基本的な指針を得ることができます(it ‘ s all in software)。
  • また、このようなことをしたい場合は+1!小学校に戻って、 Orao コンピューターからPentiumIIIコンピューターに移行したときのことを覚えています。BASICはその魅力をすべて失いました。
  • VGAディスプレイを使用することは、LCDシールドを手に取り、それをディスプレイに使用することです。目を細める必要があるかもしれませんが、それとのインターフェースは非常に簡単になります!

回答

キーボードはPS / 2キーボードを使用するだけで実行できます。これは単なるシリアルであり、チュートリアルがたくさんあります。

データの保存はSDカードに簡単に実行できます。シールドがあります。

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

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

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

回答

ここにOlinのポイントが表示されます-BASICの編集、実行、学習のみを行う場合は、PCを使用してください。

ただし、BASICを実行し、ハードウェアと下位レベルの実装について同時に学習できるコンピューターを作成するという課題が目標である場合、これは少し異なります。私はすべてこのようなものに賛成です。 、それは「知識を向上させるための素晴らしい方法であり、あなたはそれから多くを得ると確信しています。スティーブンが言及しているように、混乱し、(ほとんど)無関係なレイヤーはすべて、 Windowsは、基本的な(しゃれを意図していない)概念を残して、取り除くことができます。

とにかく、PIC32のようなもう少し強力なものを検討したいと思うかもしれません。これは、上のすべての機能(たとえば、基本的なVGA)を処理できるはずだからです。
これはArduino互換ボードである UNO32
Maximiteです。 は、PIC32をベースにしたBASICインタープリターを備えたコンピューターです。いくつかのアイデアについては、設計と構築を参照してください。

コメント

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

回答

運が良かったのですが、私は現在arduinoPCで作業しているからです。それほど多くはありませんが、最初のモデルだけです。ファームウェアも非常にシンプルで、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; } } } } 

メソッドの説明を説明するのは難しいですが、コードはrawバイトとして保存されます。すぐに開発ソフトウェアを起動する必要があります…これがお役に立てば幸いです。これをプロジェクトに使用したい場合は、 SDのルートディレクトリにBIOS.mk8ファイルが必要です。そうしないと、システムが機能しません。

コメント

  • 幸運なことに、彼が’彼が最初に尋ねてから3年でそれを理解していません
  • @ScottSeidmanうん、良い点です。また、ファームウェアはまだテスト中であり、これはバージョンに重要な要素がありません。

回答

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

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

当時BASICを使用した理由は、2つのオプションがBASICを使用するか、アセンブリで記述することであり、アセンブリは理解しづらく、はるかに困難だったためです。使用するのが面倒です。つまり、BASICです。

それ以来30年以上で、プログラミングの指導が大幅に改善されました。妻は、アリス(www.alice.org)を使用した最初のプログラミングクラスを教えています。

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

単純な環境でコードを記述できるようにするには、難しいカスタムプログラミングをたくさん行う必要があるという事実に言及してください。アイロン。

回答

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

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

追加:

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

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

コメント

  • 私のポイントは、PCでプログラミングしたくないということでした。’たとえば、Texas Instruments TI-84 +と同様の環境でプログラミングしたいと思います。私の理由は?次のリンクを確認してください。”ジョニーが’ tコード”

salon.com/technology/feature/2006/09/14/basic/index.html

  • これは実際には答えではありません。はい、OPのアイデアは少し中心から外れているかもしれませんが、誰も異常なことを試みたことがない場合、または既存のものの限界を押し上げるためにどこにいるでしょうか? ‘はばかげた考えだとOPに伝えることは、役に立たず、建設的でもありません。 OPは、彼が’やりたいと判断し、その方法についてサポートを求めています。彼は’それが良い考えかどうかを尋ねていません’。はい、それは悪いアイデア™かもしれませんが、OPはそれを見つけながら膨大な量を学習します。それ自体が最終結果よりも価値がある可能性があります。
  • @Majenko:私が書いたのはOPが最初に書いたことに対する合理的な答え。 ” このコンピューターの唯一の目標は、BASICプログラムを編集および実行できることです ” 。これは、’代替ハードウェアで実行されていることについては何も述べていません。どうやら彼は子供たちを教えるための簡単なコマンドラインの基本的なインタプリタを望んでいます。 PCでそのようなことを実行することはどのように有効な答えではありませんか? ‘ PCはQBASICを実行しているのですか、それとも彼が’求めているものとまったく同じですか?
  • @OlinOPは同意します私と一緒に…あなたは質問を間違って解釈していると思います。
  • @ Olin-私はバッツを理解できます。 70年代後半、80年代前半の家庭用コンピュータを覚えていますか?メモリマップド74LS373を追加し、pokeステートメントを使用してI / Oを制御できました。インストールする仮想COMドライバー、ブリッジへのUSB、ロードする複雑な開発者IDEはありません。 SBCは同等ですが、一般的に家庭用コンピュータのキーボード/ビデオインターフェイス(およびカセットストレージ!)がありません。
  • 回答

    回答

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

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

    コメント

    • データシートへのリンクはコミュニティから高く評価されています。また、あまり使用しないでください。大文字を使用し、空白を追加して回答が読みやすいことを確認してください。
    • 現状では、これは非常に質の低い回答です。ただし、クリーンアップしてより適切に提示すれば価値のある感情がいくつかあります。

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です