{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "オリジナルの作成:2015/05/05" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2代目GMC4\n", "Arduino勉強会/0E-GMC4をArduinoで作ってみるで紹介したGMC4エミュレータ1号機ですが、 もっと小さくて、電池でも動くGMC4が欲しいということで、 lbeDuinoに電卓シールドを追加して、GMC4を動かしてみました。\n", "\n", "1号機にくらべ、2号機はとてもコンパクトで、電池シールドを載せれば屋外でも 動かせます。\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 電卓シールドをつくる\n", "いつものようにテクノペンで、以下の様に基板をつくりました。 ブザーをD3に接続するため、完成版は下図の結線とは若干異なっています。参考程度にしてください。\n", "\n", "\n", "\n", "### 電卓シールドの動作確認\n", "電卓シールドの動作確認に以下のスケッチを動かしてみました。\n", "\n", "```C++\n", "#include \"lbed.h\"\n", "#include \"AQCM0802.h\"\n", "#include \"Keypad.h\"\n", "\n", "// D8番ピンSDA, D9番ピンSCL\n", "AQCM0802 lcd(D8, D9);\n", "// 圧電スピーカー\n", "Tone buzzer(D3);\n", "// キーパッド\n", "\n", "const byte rows = 5; // 5行\n", "const byte cols = 4; // 4列\n", "char keys[rows][cols] = {\n", " {'S','I','R','T'},\n", " {'C','D','E','F'},\n", " {'8','9','A','B'},\n", " {'4','5','6','7'},\n", " {'0','1','2','3'}\n", "};\n", "PinName rowPins[rows] = {D12, D10, D7, D11, D2};\n", "PinName colPins[cols] = {D4, D5, D6, D13};\n", "Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );\n", "\n", "void setup() {\n", " lcd.setup();\n", " lcd.print(\"I2C LCD\");\n", "}\n", "\n", "void loop() {\n", " char c =keypad.getKey();\n", " if (c) {\n", " buzzer.tone(440, 100);\n", " lcd.locate(0, 1);\n", " lcd.print(c);\n", " }\n", " wait_ms(100);\n", "}\n", "```\n", "\n", "何とか上手く動いているようです。\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## GMC4を動かす †\n", "電卓シールドの確認ができたので、GMC4を動かしてみます。\n", "\n", "キー配置は、以下の通りです。\n", "\n", "\n", "\n", "\n", "### GMC4スケッチ\n", "1号機では、LEDと7セグメントを使って表示していましたが、 2号機は、I2C版のLCD1個なので、表示制御は簡単です。\n", "\n", "GMC4のスケッチは、以下の通りです。\n", "\n", "```C++\n", "#include \"lbed.h\"\n", "#include \n", "#include \n", "#include \"GMC4.h\"\n", "\n", "Display display;\n", "KeyBoard keyBoard;\n", "GMC4 gmc4(&keyBoard, &display);\n", "\n", "\n", "byte lastCode;\n", "byte addr;\n", "byte mode;\n", "byte key;\n", "\n", "void setup() {\n", " Serial.begin(9600);\n", " display.setup();\n", " lastCode = gmc4.resetAll();\n", " display.setAddress(0);\n", " display.setValue(0xF);\n", " mode = PROGRAM;\n", "}\n", "\n", "void readProgram() {\n", " while(Serial.available()) {\n", " key = Serial.read();\n", " if (key >= '0' && key <= '9')\n", " lastCode = key - '0';\n", " else if (key >= 'A' && key <= 'F')\n", " lastCode = key - 'A' + 10;\n", " else if (key == 'T') {\n", " gmc4.longTone();\n", " lastCode = gmc4.reset();\n", " display.setAddress(gmc4.getAddr());\n", " display.setValue(lastCode);\n", " mode = PROGRAM; \n", " }\n", " lastCode = gmc4.incr(lastCode);\n", " display.setAddress(gmc4.getAddr());\n", " display.setValue(lastCode); \n", " }\n", "}\n", "\n", "void loop() {\n", " if (mode == PROGRAM || mode == STEP_LedOffBeepOff || mode == STEP_LedOnBeepOn) {\n", "\n", " if (Serial.available())\n", " readProgram();\n", " else\n", " key = gmc4.getKey();\n", " \n", " if (key != NO_KEY) {\n", " if ((key >= '0' && key <= '9') || (key >= 'A' && key <= 'F')) {\n", " addr = (lastCode > 0) ? lastCode << 4 : 0;\n", " lastCode = gmc4.getCode();\n", " addr += lastCode;\n", " display.setValue(lastCode);\n", " }\n", " else {\n", " switch (key) {\n", " case 'S': // A SET\n", " lastCode = gmc4.addrSet(addr);\n", " display.setAddress(gmc4.getAddr());\n", " display.setValue(lastCode);\n", " break;\n", " case 'I': // INCR\n", " if(mode == PROGRAM) {\n", " lastCode = gmc4.incr(lastCode);\n", " display.setAddress(gmc4.getAddr());\n", " display.setValue(lastCode); \n", " }\n", " else if (mode == STEP_LedOffBeepOff || mode == STEP_LedOnBeepOn) {\n", " mode = gmc4.step();\n", " if (mode == STEP_LedOnBeepOn)\n", " display.setAddress(gmc4.getAddr());\n", " }\n", " break;\n", " case 'R': // RUN\n", " switch (lastCode) {\n", " case 1:\n", " mode = RUN_LedOffBeepOff;\n", " break;\n", " case 2:\n", " mode = RUN_LedOnBeepOff;\n", " break;\n", " case 5:\n", " mode = STEP_LedOffBeepOff;\n", " break;\n", " case 6:\n", " mode = STEP_LedOnBeepOn;\n", " break;\n", " default:\n", " mode = RUN_LedOnBeepOn;\n", " }\n", " gmc4.reset();\n", " display.setAddress(gmc4.getAddr());\n", " gmc4.setMode(mode);\n", " break;\n", " case 'T': // RESET\n", " gmc4.longTone();\n", " lastCode = gmc4.reset();\n", " display.setAddress(gmc4.getAddr());\n", " display.setValue(lastCode);\n", " mode = PROGRAM; \n", " break; \n", " }\n", " addr = 0;\n", " }\n", " }\n", " display.drawValue();\n", " display.drawAddr();\n", " }\n", " else {\n", " mode = gmc4.step();\n", " }\n", " gmc4.draw();\n", "}\n", "```\n", "\n", "スケッチ全体をZipファイルにまとめてました。lbeDuinoと一緒に使ってください。\n", "\n", "- [fileGMC4lbeDuino.zip](data/fileGMC4lbeDuino.zip)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### GMC4を動かしてみる。\n", "例によって、15秒タイマーを動かしてみます。 Arduinoのシリアルモニターから以下の文字列を入力して、送信してください。\n", "\n", "```\n", "A189EC313E9B1F13F02E7F15T\n", "```\n", "\n", "" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 0 }