- 追加された行はこの色です。
- 削除された行はこの色です。
[[Arduino勉強会]]
#contents
2015/01/25からのアクセス回数 &counter;
ここは、
[[Arduino勉強会/0F-lbeDuino誕生]]で紹介した
LPC1114FN28を使ったmbedライクなクラスライブラリLBEDとArduinoのようなピン配置をもつ
lbeDuino用のシールド作成ページです。
** バッテリーシールドを作る [#ud0e6045]
[[作って遊べるArduino互換機 >http://www.amazon.co.jp/dp/4883378802/]]
でも最初に紹介されているのがバッテリー(移動用電源)シールドです。
これまであまり必要性を感じていなかったのですが、作ってみると「あると便利だなぁ」
と感じました。
&ref(battery_shield_I2cLCD.png);
バッテリーシールドの回路を
[[作って遊べるArduino互換機 >http://www.amazon.co.jp/dp/4883378802/]]
図5−4から引用します。
&ref(battery_shield_sch.png);
*** 必要な部品 [#c08471ad]
lbeDuinoは、3.3Vで動くので、HT7750Aの代わりにHT7733Aを使用しました。
データシートの回路はHT7750Aと同じでした。
| 品名 | 秋月コード | 数量 | 備考 |h
| DC/DCコンバータ HT7733A | I-02799 | 1 | 4個入り |
| 整流用ショットキーダイオード 1S4 | I-00127 | 1 | |
| 電解コンデンサー47μF | P-03120 | 1 | |
| 電解コンデンサー22μF | P-03177 | 1 | 今回は10μFを2個で代用 |
| 積層セラミックコンデンサー0.1μF | P-04064 | 1 | 10個入り |
| 小型スライドスイッチ | P-02736 | 1 | 4個入り |
| インダクター(47μH1.2A) | P-04047 | 1 | 4個入り|
| 電池ボックス 単4x2本用 | P-02245 | 1 | |
| ピンソケット 1x6 | C-04045 | 2 | |
| ピンソケット 1x8 | C-04046 | 2 | |
| 両面スルホール・ガラス・ユニバーサル基板 Cタイプ | P-00189 | 1 | |
*** テクノペンで配線 [#z30e8567]
lbeDuinoをユニバーサル基板のCタイプと同じサイズにしたのには、
[[テクノペン>http://akizukidenshi.com/catalog/g/gT-06356/]]
を使って配線したいと考えていました。
((テクノペンは、冷蔵庫で保管して下さい))
秋月から両面スルホール・ガラス・ユニバーサル基板の画像をダウンロードし、プリンターで印刷した紙に回路を
描いて、テクノペンで同じようになぞって、ドライヤーで乾燥(稼働中のファンヒーターで代用)すると基板の完成です。
&ref(technopen.png);
*** 部品を付けたバッテリーシールド [#aa5aeadc]
基板に部品をハンダ付けして、完成したバッテリーシールドです。
&ref(battery_shield.png);
*** 電池1本でも大丈夫 [#b9266aa6]
データシートに0.7Vから変換するとあったので、電池1本で試してみました。
当たり前ですが、ちゃんと3.3Vがでています。これなら電池付きの試作に使えます。
&ref(one_battery.png);
** I2C LCDとボタンの入出力シールド [#k0809038]
lbeDuinoの基板では、通常のLCDは載らないので、
[[ストロベリーリナックスのI2C LCD>https://strawberry-linux.com/catalog/items?code=27001]]
を使って入出力シールドを作ります。
((変換基板でユニバーサル基板で使えるようになっているのがありがたい))
必要な部品は以下の通りです。
((抵抗は、470Ω、1KΩ、4.7KΩ、10KΩを買っておくと便利です))
| 品名 | 秋月コード | 数量 | 備考 |h
| I2C低電圧キャラクタ液晶モジュール(16x2行) | | 1 | ストロベリーリナックス |
| タクトスイッチ(白)| P-03648 | 1 | |
| タクトスイッチ(黒)| P-03647 | 1 | |
| 抵抗4.7KΩ| R-25472 | 2 | 100本入り |
*** ピン配置 [#xa76f29a]
最初に部品の配置と接続するピンを決め、ジャンパーする線を探します。
以下のスケッチの青線がジャンパー線です。
&ref(I2cLCDShield_sketch.png);
*** ブレッドボードで動作を確認 [#b6a85956]
回路が正しく動くかブレッドボードで確認します。
&ref(I2cLCDShield_brd.png);
テストに使うプログラムI2cLCDShield.cppは、以下の通りです。
#pre{{
#include "lbed.h"
#include "AQCM0802.h"
// D13番ピンにLEDを接続
DigitalOut led(D13);
// D8番ピンSDA, D9番ピンSCL
AQCM0802 lcd(D8, D9);
// タクトスイッチ
DigitalIn sw1(D2);
DigitalIn sw2(D3);
void setup() {
sw1.mode(PullUp);
sw2.mode(PullUp);
lcd.setup();
lcd.print("I2C LCD");
}
void loop() {
led = !led;
lcd.locate(0, 1);
if (!sw1) {
lcd.print("SW1 On ");
}
else if (!sw2) {
lcd.print("SW2 On ");
}
else {
lcd.print("All Off");
}
wait_ms(1000);
}
}}
*** ユニバーサル基板の配線パターン [#l79b4833]
次に秋月の両面ユニバーサル基板の画像に配線図を書き込みます。
&ref(I2cLCDShield_pattern.png);
*** 部品を載せて完成 [#v2482fee]
テクノペンで描いた配線の上から部品の載せます。
タクトスイッチを押すと下の行にSW1 Onと表示します。
&ref(I2cLCDShield_Test.png);
** Arduino-lbeDuino変換シールド [#l16d5577]
[[Arduino勉強会/0H-アイロンプリントのすすめ]]で作成したArduino-lbeDuino変換シールドは、とても重宝しています。
特にlbeDuino用に作ったシールドがそのまま3.3VのUncompatinoでも使えます。以下の図は3.3V Uncompatinoの上に、
Arduino-lbeDuino変換シールを載せ、その上にバッテリーシールドを載せている場面です。
&ref(change_battery.png);
** SDカードシールド [#o280960c]
[[作って遊べるArduino互換機 >http://www.amazon.co.jp/dp/4883378802/]]
に倣って、秋月電子で販売されているマイクロSDカードスロットAE-MIXCRO-SD-DIPを使って、
lbeDuino用のSDカードシールドを作ってみました。((ここでもArduino-lbeDuino変換シールドが活躍しています。))
&ref(SD_Card_shield.png);
テクノペンを使った配線は、以下の通りです。
&ref(SD_Card_shield_brd.png);
*** Arduinoで動作確認 [#ha36f081]
最初は、Arduinoのスケッチを使って、動作確認をしました。
Arduino IDEでファイル→スケッチの例→SD→Dataloggerを選択します。
スケッチをすべてコピー&ペーストで、新規のスケッチに複製します。
29行目のchipSelectを4にします。
#pre{{
const int chipSelect = 4;
}}
Arduinoにスケッチをアップロードすると、
SDカードにアナログピンの数値をどんどん書き込んでいきますので、途中でSDカードを抜いてやります。
&ref(SD_logger_output.png);
SDカードをPCに入れると、DATALOG.TXTというファイルができており、内容が上記のような値になっています。
これで、SDカードシールドが正しく動作することが確認できました。
*** SDライブラリの移植 [#oe5868ed]
別途紹介する予定ですが、ArduinoのSDライブラリをlbeDuino用に移植しました。
((最初のバージョンは、chipSelectをD4に固定しております。))
&ref(lbeDuino_SDCard.png);
以下のSDCard_Info.cppを作成して、SDカードの情報をシリアルモニターに表示します。
#pre{{
#include "lbed.h"
#include "SD.h"
const int chipSelect = D4;
void setup() {
/*
SD.begin(chipSelect);
File dataFile = SD.open("test.txt", FILE_WRITE);
// if the file is available, write to it:
if (dataFile) {
dataFile.println("test");
dataFile.close();
}
*/
Serial pc(D0, D1);
pc.baud(9600);
pc.print("\nInitializing SD card...");
Sd2Card card;
SdVolume volume;
SdFile root;
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
pc.println("initialization failed. Things to check:");
pc.println("* is a card is inserted?");
pc.println("* Is your wiring correct?");
pc.println(
"* did you change the chipSelect pin to match your shield or module?");
return;
} else {
pc.println("Wiring is correct and a card is present.");
}
// print the type of card
pc.print("\nCard type: ");
switch (card.type()) {
case SD_CARD_TYPE_SD1:
pc.println("SD1");
break;
case SD_CARD_TYPE_SD2:
pc.println("SD2");
break;
case SD_CARD_TYPE_SDHC:
pc.println("SDHC");
break;
default:
pc.println("Unknown");
}
// Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
if (!volume.init(card)) {
pc.println(
"Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
return;
}
// print the type and size of the first FAT-type volume
uint32_t volumesize;
pc.print("\nVolume type is FAT");
pc.print(volume.fatType(), DEC);
pc.println();
volumesize = volume.blocksPerCluster(); // clusters are collections of blocks
volumesize *= volume.clusterCount(); // we'll have a lot of clusters
volumesize *= 512; // SD card blocks are always 512 bytes
pc.print("Volume size (bytes): ");
pc.print(volumesize);pc.println();
pc.print("Volume size (Kbytes): ");
volumesize /= 1024;
pc.print(volumesize);pc.println();
pc.print("Volume size (Mbytes): ");
volumesize /= 1024;
pc.print(volumesize);pc.println();
pc.println("\nFiles found on the card (name, date and size in bytes): ");
root.openRoot(volume);
// list all files in the card with date and size
root.ls(LS_R | LS_DATE | LS_SIZE);
}
void loop() {
}
}}
Mac OSXの場合、SDカードにゴミ箱やスポットライトの情報が隠れファイルとして作成されているため、
以下の様に出力されました。
&ref(SD_Info_monitor.png);
** 非接触温度計TMP006シールド [#hcc2aca4]
[[作って遊べるArduino互換機 >http://www.amazon.co.jp/dp/4883378802/]]
で紹介されているTMP006シールドをlbeDuino用に作成しました。
&ref(th_TMP006_shield.jpg);
いつものようにテクノペンで基板のパターンをかきました。
&ref(TMP006_shield_brd.png); &ref(TMP006.png);
テストに使用するライブラリは、mbedの
[Sam Kirsch氏のTMP006_lib>http://developer.mbed.org/users/sammacjunkie/code/TMP006_lib/]]
をlbeDuinoに移植して使いました。
((インクルードファイルをmbed.hからlbed.hに変えるだけです))
最初、値が正しく求まりませんでした。この原因はLBEDのI2C.readのバグでした。
温度を表示するスケッチは、以下の通りです。
#pre{{
#include "lbed.h"
#include "TMP006.h"
#include "AQCM0802.h"
#define Address (0x40<<1)
// D8番ピンSDA, D9番ピンSCL
TMP006 sensor(D8, D9, Address);
AQCM0802 lcd(D8, D9);
void setup() {
lcd.setup();
sensor.config(Address, 8);
}
void loop() {
lcd.locate(0, 0);
lcd.print("DieTemp: ");
lcd.print(sensor.readDieTempC(Address), 2);
lcd.locate(0, 1);
lcd.print("ObjTemp: ");
lcd.print(sensor.readObjTempC(Address), 2);
wait_ms(1000);
}
}}
** コメント [#dfc025b7]
#vote(おもしろかった[2],そうでもない[0],わかりずらい[0])
#vote(おもしろかった[3],そうでもない[0],わかりずらい[0])
皆様のご意見、ご希望をお待ちしております。勉強会で分からなかったこと等、お気軽に問い合わせて下さい。
スパム防止に画像の文字列も入力してください。
- Arduino-lbeDuino変換シールドとマイクロSDカードシールドを追加しました。 -- [[竹本 浩]] &new{2015-02-14 (土) 11:31:25};
- I2C.readに大きなバグがありました。lbeDuinoのI2C, LM73は修正済みですが、他の版は未対応です。ご注意ください。 -- [[竹本 浩]] &new{2015-02-22 (日) 11:36:26};
- LM73の再テストを行い動作を確認しました -- [[竹本 浩]] &new{2015-02-23 (月) 20:47:02};
#comment_kcaptcha