{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "オリジナルの作成:2015/01/17" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## lbeDuino誕生の理由\n", "安く、ソースデバッガーが使えて、豊富なライブラリーが使える開発環境を作ろうと少しずつ開発を進めてきました lbed ですが、Arduinoのシールドを意識しながら、lbeDuinoと言う形で整理してみたいと思います。\n", "\n", "この記事は、鈴木哲哉さんの著書 \n", "[作って遊べるArduino互換機 ](http://www.amazon.co.jp/dp/4883378802/)\n", "に強く影響を受けています。 Arduinoのシールドとの変換シールドを作れば、安くて簡単な万能基板が使えることは、 気軽に電子工作を楽しむ第一歩になると考えたからです。\n", "\n", "lbeDuinoでは、プログラムの開発はLpcExpresso Ver.6以降を使っています。 デバッガには、トラ技のARMデバッガを使用しましたが、LPC-LINK, LPC-LINK2も使えます。\n", "\n", "### beDuinoの作成方針\n", "Arduino勉強会では、ProtoSnap Pro Mini を使っているので、シリアル通信とUSBからの電源供給は、 FTDI USBシリアル変換アダプターを使います。 シリアル変換アダプターを購入されるのなら、 スイッチサイエンスの \n", "[FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き) ](https://www.switch-science.com/catalog/1032/)\n", "が便利かと思います。\n", "\n", "\n", "\n", "ピンの使い方は、mbed LPC1114FN28を参考にしました。\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### lbeDuinoの回路図\n", "手書きで申し訳ありませんが、lbeDuinoの回路を以下に示します。\n", "\n", "回路のミスについて\n", "\n", "- AREFをAnalogInに接続\n", "- 3.3VとGNDにパスコンを追加\n", "- TA48M033Fの1, 3, 2ピンに5V, GND, 3.3Vであり、セラミックコンデンサーは5V, 電解コンデンサーは3.3Vに接続\n", "- D13とD10を入れ替えました(2015/02/08)\n", "\n", "\n", "\n", "### lbeDuinoの組み立て\n", "出来上がったlbeDuinoは、以下の様になりました。\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### lbeDuinoの動作確認\n", "Arduinoの動作確認と言えばblinkなので、lbeDuinoでも以下の様なBlink.cpp作って動作を確認しました。\n", "\n", "今回Arduino版のlbedと同じスケッチが使えるようにサンプルプログラムをArduino風に書きました。\n", "\n", "lbedのArduino版については、Arduino/Arduinoでmbedユーザライブラリーを動かすを参照してください。\n", "\n", "ledをDigitalOutのインスタンスとして作成し、LEDのオン・オフをled = !ledのように書けるところがmbed風 のプログラミングの分かりやすいところです。\n", "\n", "```C++\n", "#include\"lbed.h\"\n", "\n", "DigitalOut led(D13);\n", "\n", "void setup() {}\n", "\n", "void loop() {\n", " led = !led;\n", " wait_ms(1000);\n", "}\n", "```\n", "\n", "## lbedユーザライブラリの動作確認\n", "これまで作ったlbed用のユーザライブラリをlbeDuinoで動かしてみます。\n", "\n", "### テキストLCD(TextLCD)\n", "mbedのTextLCDをlbedで動かしてみます。\n", "\n", "3.3Vで動作するLCDは、オレンジボードに載せたものだけなので、以下の様にオレンジボードと接続して 動作を確認しました。\n", "\n", " | オレンジボード\t | lbeDuino | \n", " |---|---|\n", " | p24(rs)\t | D0 | \n", " | p26(e)\t | D1 | \n", " | p27(d4)\t | D2 | \n", " | p28(d5)\t | D3 | \n", " | p29(d6)\t | D4 | \n", " | p30(d7)\t | D5 | \n", " \n", "動作確認をしたときの画像は、以下の通りです。\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### TextLCDの動作確認\n", "TextLCDの場合も、mbedのTextLCDの例題がそのまま使えます。\n", "\n", "Arduino風に書いたTextLCD.cppは、以下の通りです。リセットするとHello Worldが上手く表示できないので、 少し調整が必要ですが、なんとか動きそうです。\n", "\n", "```C++\n", "#include \"lbed.h\"\n", "#include \"TextLCD.h\"\n", "\n", "DigitalOut led(D13);\n", "TextLCD lcd(D0, D1, D2, D3, D4, D5); // rs, e, d4-7\n", "int count = 0;\n", "\n", "void setup() {\n", " lcd.print(\"Hello World!\");\n", "}\n", "\n", "void loop() {\n", " lcd.locate(0, 1);\n", " lcd.print(\"Count=\");\n", " lcd.print(count++);\n", " led = !led;\n", " wait_ms(1000);\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### シリアル通信\n", "パソコンとのシリアル通信(Serial)をArduinoのシリアルモニタを使ってテストしてみます。\n", "\n", "シリアルを使う時には、FTDI USBシリアル変換アダプターを接続し、Rx, Txのジャンパーを結線します。\n", "\n", "\n", "\n", "### シリアルの動作確認\n", "シリアルの動作確認にSerial.cppを作成し、予めArduinoのシリアルモニターを起動し、 ボーレイトを9600にセットして下さい。\n", "\n", "```C++\n", "#include \"lbed.h\"\n", "\n", "DigitalOut myled(D13);\n", "Serial pc(D0, D1);\n", "\n", "void setup() {\n", " pc.baud(9600);\n", " pc.println(\"Hello World!\");\n", "}\n", "\n", "void loop() {\n", " char c = pc.read();\n", " pc.write(c + 1);\n", " myled = !myled;\n", "}\n", "```\n", "\n", "最初にHello Worldを出力し、次に入力した文字の次の文字を返します。abcefgと入力するとbcdfghと返してきます。\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### DigitalIn\n", "LBEDのLPC1114版ではDigitalIn, AnalogInを実装していなかったので、LPC1343版から移植し、動作を確認しました。\n", "\n", "DigitalInでは、以下のようにタクトスイッチに10KΩの抵抗でプルアップした回路を組み、スイッチを押したときに LEDを点灯するプログラムを作成して、動作を確認しました。\n", "\n", "\n", "\n", "### DigitalInの動作確認\n", "以下のプログラムButtonSwtich.cppを作成し、動作を確認しました。\n", "\n", "```C++\n", "#include \"lbed.h\"\n", "// Pin 13 has an LED connected on most lbeDuino boards.\n", "DigitalOut led(D13);\n", "// Pin 7 has an tact switch on bread board.\n", "DigitalIn sw(D7); // #A\n", "\n", "// the setup routine runs once when you press reset:\n", "void setup() {\n", "}\n", "\n", "// the loop routine runs over and over again forever:\n", "void loop() {\n", " led = !sw; // #B\n", " wait_ms(200); // wait for 200 mili seconds.\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### AnalogIn\n", "AnalogInは、可変抵抗(potensiometer)を使って電圧を変えて動作を確認しました。\n", "\n", "\n", "\n", "### AnalogInの動作確認\n", "AnalogInの動作確認には、電圧が参照電圧ARefの0.1倍になったらLEDを消すプログラムPotensioMeter.cpp を作って確認しました。\n", "\n", "```C++\n", "/*\n", " PotentioMeter\n", " Turns on an LED on when potentiometer > 0.33V(0.1).\n", "\n", " This example code is in the public domain.\n", " */\n", "#include \"lbed.h\"\n", "\n", "// Pin 13 has an LED connected on lbeDuino.\n", "DigitalOut led(D13);\n", "// Pin A0 has a analog input.\n", "AnalogIn sensor(A0); // #A\n", "\n", "// the setup routine runs once when you press reset:\n", "void setup() {\n", "}\n", "\n", "// the loop routine runs over and over again forever:\n", "void loop() {\n", " float value = sensor;\n", " if (value > 0.1) // #B\n", " led = 1;\n", " else\n", " led = 0;\n", " wait_ms(200); // wait for 200 mili seconds.\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Tone\n", "Toneは、PWMを使用しているため、LPC1114で使えるピンが限られます。 D3, D6, A0がToneとして使用できます。\n", "\n", "以下の様にタクトスイッチを押すと圧電ブザーがなるようにブレッドボードで回路を組みます。\n", "\n", "\n", "\n", "\n", "### Toneの動作確認\n", "以下の様なBuzzer.cppを作成し、タクトスイッチを押すとド、レ、ミとなるように します。*2\n", "\n", "```C++\n", "/*\n", " Buzzer\n", " Sound on an buzzer on when button pressed.\n", "\n", " This example code is in the public domain.\n", " */\n", "#include \"lbed.h\"\n", "#include \"Tone.h\"\n", "\n", "int duration = 500;\n", "\n", "// Pin 7 has an tact switch on lbeDuino.\n", "DigitalIn sw(D7);\n", "// Pin 2 has a buzzer on lbeDuino.\n", "Tone buzzer(D3); // #A\n", "\n", "// the setup routine runs once when you press reset:\n", "void setup() {\n", "}\n", "\n", "// the loop routine runs over and over again forever:\n", "void loop() {\n", " if (!sw) { // #B\n", " buzzer.tone(262, duration); // ド, 500 msec\n", " wait_ms(500);\n", " buzzer.tone(294, duration); // レ, 500 msec\n", " wait_ms(500);\n", " buzzer.tone(330, duration); // ミ, 500 msec\n", " }\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### I2C接続のLCD(AQCM0802)\n", "秋月でも販売しているI2C接続のLCD *3 とmbedの AQCM0802のライブラリ をlbedに移植したものを使用しました。\n", "\n", "lbedとの接続は、以下の通りです。\n", "\n", " | lbeDuino\t | AQCM0802ボード | \n", " |---|---|\n", " | 3.3V\t | 1番(VCC)、2(nRESET) | \n", " | GND\t | 5番 GND | \n", " | D8(SDA)\t | 4番(SDA) | \n", " | D9(SCL)\t | 3番(SCL) | \n", " \n", "\n", "\n", "### I2C接続のLCD(AQCM0802)の動作確認\n", "以下のI2cLCD.cppを使ってAQCM0802での動作を確認しました。\n", "\n", "```C++\n", "#include \"lbed.h\"\n", "#include \"AQCM0802.h\"\n", "\n", "// D13番ピンにLEDを接続\n", "DigitalOut led(D13);\n", "// D8番ピンSDA, D9番ピンSCL\n", "AQCM0802 lcd(D8, D9);\n", "// カウンター\n", "int counter = 0;\n", "\n", "void setup() {\n", " lcd.setup();\n", " lcd.print(\"Hello\");\n", "}\n", "\n", "void loop() {\n", " led = !led;\n", " lcd.locate(0, 1);\n", " lcd.print(\"cnt=\");\n", " lcd.print(counter++);\n", " wait_ms(1000);\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## lbeDuinoのソースの取得\n", "ここで紹介しましたlbeDuinoのソースは、以下のGitHubから取得できます。\n", "\n", "- https://github.com/take-pwave/lbed\n", "\n", "lbeDuinoに必要なフォルダーは以下の通りです。\n", "\n", "- CMSISv2p00_LPC11xx\n", "- LBED_lbeDuino\n", "- LBED_lbeDuino_USERLIB\n", "- LBED_lbeDuino_MAIN\n", "\n", "テストプログラムは、LBED_lbeDuino_MAIN/src に置いて下さい。\n", "\n", "サンプルプログラムは、Examplesにあります。\n", "\n", "## lbeDuino2号機\n", "lbeDuinoは思った以上に使えるので、テクノペンとジャンパー線で2号機を作ってみました。\n", "\n", "\n", "\n", "1号機に対して以下の改良をしました。\n", "\n", "- シリアルコネクターをL字型に変更\n", "- LPC-LINKとの接続コネクターを一番端に1つずらした。*4\n", "\n", "テクノペンのパターンとジャンパー線は、以下の通りです。\n", "\n", "\n", "\n", "今回は勇気を出してジャンパー線も公開します。\n", "\n", "\n", "\n", "\n", "## この後\n", "lbeDuinoのシールドについては、\n", "\n", "- Arduino勉強会/0G-lbeDuinoシールドを作る\n", "\n", "lbeDuinoの開発環境構築手順については、\n", "\n", "- Arduino勉強会/0I-lbeDuinoの開発環境構築\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 }