[[Arduino勉強会]]

#contents

2014/12/29からのアクセス回数 &counter;

** GMC-4との出会い [#q5215626]
私が最初にマイコンを見たのが、「秋葉原のBIT-INN」に展示されていたTK-80でした。
((Wikiペディアの画像を引用))

&ref(http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/TK-80.jpg/400px-TK-80.jpg);

この基板の上にテンキーと7セグメントLEDが8個付いたのが、コンピューターかと思われるかも
知れませんが、初期のマイコンはテンキーを使って直接マシン語を打ち込んでプログラムを
入力していました。
((友人の浜野君が、これからはマイコンの時代が来ると言ったので、大学に入るなりすぐにプログラミングの勉強をしたのを覚えています。))

2009年6月に学研の[[「大人の科学Vol.24」>http://otonanokagaku.net/magazine/vol24/]]
にTK-80を思わせる4-bitマイコンGMC-4が付録に付いてきたので、すぐに購入しました。

&ref(GMC-4.jpg);



そこで、GMC-4用にC言語ライクな簡易言語コンパイラーを作った記事が
[[GMC-4コンパイラー]]
です。

この時は、アセンブラからマシン語に手で変換して、プログラムを組むことが大変だと思って
簡易言語のコンパイラーを1日仕事で作って公開しました。

** Arduinoを使ってGMC-4を作る [#sc72cd2f]
Arduino勉強会で何を作りたいかと聞かれ、とっさに「GMC-4をArduinoで作ってみたい」と答えた
のは、GMC-4を子供たちが作って、キーボードからプログラムを入力したら、マイコンのイメージ
が変わるのではないかと思ったからです。

*** Arduino版GMC-4の部品 [#r5f40b68]
Arduino版GMC-4には、1個の7セグメントLEDと7個のLED、そして20個のタクトスイッチに
2個のトランジスタと10個の抵抗をユニバーサル基板に載せただけのとても簡単なものです。
後はArduinoのプログラムですべて処理します。

&ref(GMC4-Arduino.png);



*** 回路図 [#w78baf96]
7セグメントの接続が画像と異なりますが、KiCADの練習で回路を書きました。

- &ref(GMC-4_sch.pdf);

ついでに、プリント基板のパターンを作りました。

- &ref(GMC4-Keyboard_ptrn.png);



現バージョンのボードの配線は、以下の通りです。

&ref(GMC4-Brd.png);



*** キーボードは配線だけ [#d4a5ce54]
Arduinoのライブラリにkeypadがあり、これはタクトスイッチを以下の様に配線するだけで
マトリックスキーボードを作ることができる素晴らしいクラスです。((配線図は、ikkei blogの[[4×4のキーパッドを試してみた>http://blog.goo.ne.jp/jh3kxm/e/0a71a45afbed826346d605347b83ded0]]から引用しました。))

&ref(Keypad_pattern.jpg);




** スケッチの作成 [#je4914e7]
ハードは下手くそでもソフトなら大丈夫ということで、以下のクラスを用意しました。((本来ならC++のクラスヘッダとクラス本体を分けるのですが、Arduinoのタブで使うことを考えてヘッダファイルだけで、クラスを作りました。))


- キーボード: KeyBoard.h
- 7セグメントLED: LED7Seg.h
- LEDアレイ: LEDArray.h


*** KeyBoard.h [#we13c9c0]
KeyBoard.hでは、Keypadに渡す、キーマップと、入力文字から値を取り出すgetCode、キーが押されているかどうか
調べるisPressedメソッドを用意しました。

- &ref(KeyBoard.h);

*** LED7Seg.h [#r30c4a12]
7セグメントLEDとLEDアレイは、交互に表示するため、on、offのメソッドと値をセットするdrawメソッド
用意しました。

- &ref(LED7Seg.h);

*** LEDArray.h [#ze9bbd64]
LEDアレイは、アドレスを表示するために使用するので、setAddressとgetAddressメソッドで値の読み書きをしています。

- &ref(LEDArray.h);

*** GMC4.h [#lb2082f7]
GMC4をシミュレーションしているのが、GMC4.hに定義されているGMC4クラスです。
この中の、stepメソッドが1命令毎に処理するメソッドです。

GMC4.hの処理を理解するには、[[FX-マイコン・全マニュアル>http://otonanokagaku.net/magazine/vol24/pdf/vol24manual.pdf]]
を参照してください。
((命令の簡単な説明は、[[GMC-4コンパイラー]]にもあります。))

- &ref(GMC4.h);

*** メインのスケッチ [#b4cd56ab]
メインのスケッチだけ、ソースをそのまま示します。
処理としては、キーボードからの入力に対する処理の切替をしているだけですが、
一つだけオリジナルのGMC4と異なる点があります。

それは、Arduinoのシリアルモニターを使ってGMC4用の機械語をパソコンから入力できることです。
これによってプログラムの確認がとても簡単になりました!

#pre{{
#include <Keypad.h>
#include <SoftwareSerial.h>
#include "GMC4.h"

SoftwareSerial mySerial(0, 11); // RX, TX

LEDArray  ledArray;
LED7Seg   led7Seg;
KeyBoard  keyBoard;
GMC4      gmc4(&keyBoard, &ledArray, &led7Seg);


byte lastCode;
byte addr;
byte mode;
byte key;

void setup() {
  mySerial.begin(9600);
  lastCode = gmc4.resetAll();
  ledArray.setAddress(0);
  led7Seg.setValue(0xF);
  mode = PROGRAM;
}

void readProgram() {
  while(mySerial.available()) {
    key = mySerial.read();
    if (key >= '0' && key <= '9')
      lastCode = key - '0';
    else if (key >= 'A' && key <= 'F')
      lastCode = key - 'A' + 10;
    else if (key == 'T') {
      gmc4.longTone();
      lastCode = gmc4.reset();
      ledArray.setAddress(gmc4.getAddr());
      led7Seg.setValue(lastCode);
      mode = PROGRAM; 
    }
    lastCode = gmc4.incr(lastCode);
    ledArray.setAddress(gmc4.getAddr());
    led7Seg.setValue(lastCode);           
  }
}

void loop() {
  if (mode == PROGRAM || mode == STEP_LedOffBeepOff || mode == STEP_LedOnBeepOn) {
    if (mySerial.available())
      readProgram();
    else
      key = gmc4.getKey();
   
    if (key != NO_KEY) {
      if ((key >= '0' && key <= '9') || (key >= 'A' && key <= 'F')) {
        addr = (lastCode > 0) ? lastCode << 4 : 0;
        lastCode = gmc4.getCode();
        addr += lastCode;
        led7Seg.setValue(lastCode);
      }
      else {
        switch (key) {
          case 'S':  // A SET
            lastCode = gmc4.addrSet(addr);
            ledArray.setAddress(gmc4.getAddr());
            led7Seg.setValue(lastCode);
            break;
          case 'I':  // INCR
            if(mode == PROGRAM) {
              lastCode = gmc4.incr(lastCode);
              ledArray.setAddress(gmc4.getAddr());
              led7Seg.setValue(lastCode);       
            }
            else if (mode == STEP_LedOffBeepOff || mode == STEP_LedOnBeepOn) {
              mode = gmc4.step();
              if (mode == STEP_LedOnBeepOn)
                ledArray.setAddress(gmc4.getAddr());
            }
            break;
          case 'R':  // RUN
            switch (lastCode) {
              case 1:
                mode = RUN_LedOffBeepOff;
                break;
              case 2:
                mode = RUN_LedOnBeepOff;
                break;
              case 5:
                mode = STEP_LedOffBeepOff;
                break;
              case 6:
                mode = STEP_LedOnBeepOn;
                break;
              default:
                mode = RUN_LedOnBeepOn;
            }
            gmc4.reset();
            ledArray.setAddress(gmc4.getAddr());
            gmc4.setMode(mode);
            break;
          case 'T':  // RESET
            gmc4.longTone();
            lastCode = gmc4.reset();
            ledArray.setAddress(gmc4.getAddr());
            led7Seg.setValue(lastCode);
            mode = PROGRAM; 
            break;       
        }
        addr = 0;
      }
    }
  }
  else {
    mode = gmc4.step();
  }
  gmc4.draw();
}
}}

GMC4のスケッチは、以下のファイルをダウンロードしてください。

- &ref(GMC4Main.zip);


*** デバッグの方法 [#zf9d8c67]
GMC4のようなシミュレータをArduinoで作る場合、デバッグがとても大変になります。

GMC4.hのデバッグは、MacOSのEclipseでダミーのKeyBoard, LED7Seg, LEDArrayを用意して
行いました。

参考として以下にソースを置いておきます。

- &ref(GMC4_Mac.zip);

*** 動作確認 [#u03aec3d]
プログラムの動作を確認するため、FX-マイコン・全マニュアルの以下のサンプルで動作を確かめました。

- No. 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
- No. 43, 44, 45, 46, 47, 48, 49, 50, 67, 68, 69, 70, 71, 72, 73

以下に大人の科学のProgram1 15秒カウンタを動かしたときの画像とFacebookの動画のURLを
示します。

GMC4のプログラムは、以下の通りです。

| アドレス | 命令記号 | 命令コード |h
| 01 | TIY | A |
| 01 | 1 | 1 |
| 02 | TIA | 8 |
| 03 | 9 | 9 |
| 04 | CAL | E |
| 05 | TIMR | C |
| 06 | CY | 3 |
| 07 | AO | 1 |
| 08 | CY | 3 |
| 09 | CAL | E |
| 0A | SHTS | 9 |
| 0B | AIY | B |
| 0C | 1 | 1 |
| 0D | JUMP | F |
| 0E | 1 | 1 |
| 0F | 3 | 3 |
| 10 | JUMP | F |
| 11 | 0 | 0 |
| 12 | 2 | 2 |
| 13 | CAL | E |
| 14 | ENDS | 7 |
| 15 | JUMP | F |
| 16 | 1 | 1 |
| 17 | 5 | 5 |

最後に、Resetボタンを押します。

Arduinoのシリアルモニターから入力する場合には、上記の命令コードを並べて入力し、最後にTを付けます。
#pre{{
A189EC313E9B1F13F02E7F15T
}}


実行するには、Runボタンを押します。

&ref(15秒タイマー.png);

URL
- https://www.facebook.com/video.php?v=721780911262271&pnref=story


** lbeDuinoを使った2号機 [#c609d56a]
lbeDuinoを使った2号機の記事を以下にまとめました。
- [[Arduino勉強会/0L-lbeDuinoで2代目GMC4を作ってみる]]

** コメント [#w9c4effa]
#vote(おもしろかった[9],そうでもない[0],わかりずらい[0])
#vote(おもしろかった[10],そうでもない[0],わかりずらい[0])


皆様のご意見、ご希望をお待ちしております。勉強会で分からなかったこと等、お気軽に問い合わせて下さい。

スパム防止に画像の文字列も入力してください。
- 回路図とプリント基板のパターンを追加しました。 -- [[竹本 浩]] &new{2014-12-31 (水) 12:30:33};

#comment_kcaptcha

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc