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