[[Arduino勉強会]]
[[Arduino勉強会]]

#contents

2015/05/05からのアクセス回数 &counter;

** 2代目GMC4 [#ic48f574]
[[Arduino勉強会/0E-GMC4をArduinoで作ってみる]]で紹介したGMC4エミュレータ1号機ですが、
もっと小さくて、電池でも動くGMC4が欲しいということで、
lbeDuinoに電卓シールドを追加して、GMC4を動かしてみました。

1号機にくらべ、2号機はとてもコンパクトで、電池シールドを載せれば屋外でも
動かせます。

&ref(GMC4-2.png);



*** 電卓シールドをつくる [#r386489e]
いつものようにテクノペンで、以下の様に基板をつくりました。
ブザーをD3に接続するため、完成版は下図の結線とは若干異なっています。参考程度にしてください。

&ref(CalculatorShield_sch.png);






*** 電卓シールドの動作確認 [#od6f59d9]
電卓シールドの動作確認に以下のスケッチを動かしてみました。

#pre{{
#include "lbed.h"
#include "AQCM0802.h"
#include "Keypad.h"

// D8番ピンSDA, D9番ピンSCL
AQCM0802     lcd(D8, D9);
// 圧電スピーカー
Tone          buzzer(D3);
// キーパッド

const byte rows = 5; // 5行
const byte cols = 4; // 4列
char keys[rows][cols] = {
  {'S','I','R','T'},
  {'C','D','E','F'},
  {'8','9','A','B'},
  {'4','5','6','7'},
  {'0','1','2','3'}
};
PinName     rowPins[rows] = {D12, D10, D7, D11, D2};
PinName     colPins[cols] = {D4, D5, D6, D13};
Keypad     keypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );

void setup() {
     lcd.setup();
     lcd.print("I2C LCD");
}

void loop() {
     char c =keypad.getKey();
     if (c) {
          buzzer.tone(440, 100);
          lcd.locate(0, 1);
          lcd.print(c);
     }
     wait_ms(100);
}
}}

何とか上手く動いているようです。

&ref(CalculatorSheild.png);



** GMC4を動かす [#b54c96db]
電卓シールドの確認ができたので、GMC4を動かしてみます。


キー配置は、以下の通りです。


&ref(keylayout.png);






*** GMC4スケッチ [#z7b7fb2d]
1号機では、LEDと7セグメントを使って表示していましたが、
2号機は、I2C版のLCD1個なので、表示制御は簡単です。

GMC4のスケッチは、以下の通りです。

#pre{{

#include "lbed.h"
#include <AQCM0802.h>
#include <Keypad.h>
#include "GMC4.h"

Display   display;
KeyBoard  keyBoard;
GMC4      gmc4(&keyBoard, &display);


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

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

void readProgram() {
  while(Serial.available()) {
    key = Serial.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();
      display.setAddress(gmc4.getAddr());
      display.setValue(lastCode);
      mode = PROGRAM; 
    }
    lastCode = gmc4.incr(lastCode);
    display.setAddress(gmc4.getAddr());
    display.setValue(lastCode);           
  }
}

void loop() {
  if (mode == PROGRAM || mode == STEP_LedOffBeepOff || mode == STEP_LedOnBeepOn) {

    if (Serial.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;
        display.setValue(lastCode);
      }
      else {
        switch (key) {
          case 'S':  // A SET
            lastCode = gmc4.addrSet(addr);
            display.setAddress(gmc4.getAddr());
            display.setValue(lastCode);
            break;
          case 'I':  // INCR
            if(mode == PROGRAM) {
              lastCode = gmc4.incr(lastCode);
              display.setAddress(gmc4.getAddr());
              display.setValue(lastCode);       
            }
            else if (mode == STEP_LedOffBeepOff || mode == STEP_LedOnBeepOn) {
              mode = gmc4.step();
              if (mode == STEP_LedOnBeepOn)
                display.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();
            display.setAddress(gmc4.getAddr());
            gmc4.setMode(mode);
            break;
          case 'T':  // RESET
            gmc4.longTone();
            lastCode = gmc4.reset();
            display.setAddress(gmc4.getAddr());
            display.setValue(lastCode);
            mode = PROGRAM; 
            break;       
        }
        addr = 0;
      }
    }
    display.drawValue();
    display.drawAddr();
  }
  else {
    mode = gmc4.step();
  }
  gmc4.draw();
}
}}

スケッチ全体をZipファイルにまとめてました。lbeDuinoと一緒に使ってください。

- &ref(GMC4lbeDuino.zip);

*** GMC4を動かしてみる。 [#zb4f410b]
例によって、15秒タイマーを動かしてみます。
Arduinoのシリアルモニターから以下の文字列を入力して、送信してください。
#pre{{
A189EC313E9B1F13F02E7F15T
}}

&ref(Run_GMC4lbeDuino.png);



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


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

スパム防止に画像の文字列も入力してください。
#comment_kcaptcha

*** 補足 [#m1039628]
Arduino版では、パワーダウンスリープを入れて試したが、スリープ時間が20秒を超えるとRTCからの割込を上手く捉えることができない。
また、WDTを使って定期的にWakeupするようにしるとRTCとの割込の区別が付かなくなった。
ネット調べるとArduinoの割込関数は使いにくいみたい!


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc