{
"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
}