ワークショップ用リファレンスページ
このページについて
このページは,mbedの基本的な使い方を解説するためのワークショップを開催するにあたり作成しました.
依頼者の意向により,デジタル入出力,アナログ入力,シリアル出力までの動作確認ができることを目標としました.
開催時間として(mbed.orgに登録済みの状態から)45分以内で完了することを目標に組まれています.
このページの内容はワークショップの補助的な内容となっています.
各サンプルプログラムへのリンクとハードウェアの結線方法を示すのが本来の目的で,その他は参考情報です.
このようなページへのリンクをワークショップ会場で配布するのは若干面倒ですが,実際の会場では以下の様な内容のファイルを"ws.htm"という名前で作成し,mbedストレージ内に保存しておくと,その手間を省くことができます (^^)
<!-- mbed Microcontroller Website Shortcut --> <html> <head> <meta http-equiv="refresh" content="0; url=http://developer.mbed.org/users/okano/notebook/ws/" /> <title>mbed WS Website Shortcut</title> </head> <body></body> </html>
このページの利用について
この資料は,独自に開催するハンズオン・セミナーや別資料への引用など,ご自由にお使いください.
また,お気づきの点など(不明点,誤り,改善案,その他)ありましたら,ご連絡いただければ嬉しいです.
変更や改良を加えた資料を作成する際には,後の利用者の便宜のため,このページへのリンク(https://developer.mbed.org/users/okano/notebook/ws/
)を明記するように願います.この他には特に制限事項はありません.
0. はじめに
mbedについての,いろいろな基本的なこと.
2009年に最初に発売されたmbed LPC1768は多くの資料が用意されており,mbedを使う上での事実上のリファレンスとなっています.基本的な使い方を習得したり,あるいはコードを(プラットフォーム非依存を前提とした)ライブラリとして公開する際には,この動作を基本に考えるのが良いでしょう.
mbedの情報は,日本語を含む様々なものがhttp://mbed.org内で公開されています.これからmbedを始める人にとっては次のリンクが良い情報源となるでしょう.
1. 準備
mbed.orgでユーザ登録をしましょう.
自分の名前,メールアドレスの情報,mbed.org内で使うユーザ名,パスワードを入力し,規約を読んで同意した後に登録を行います.
ユーザはアカウントにログインした状態で自分のコードを書いたり,そのコードやその他の情報を公開・共有できるようになります.アカウントを作るまでのステップは次のリンクに詳しく書かれてあります.
ワークショップの準備のための簡単なユーザ登録ガイドも用意されています.このガイドにしたがって登録を行えば,mbed LPC1768でプログラムを作成する準備が整います.
mbedのハードウェアが動作する仕組み
ハードウェアが動作する仕組みについては,次のリンクで公開されているプレゼン資料の10ページ以降をご覧ください.
『mbedって?』(ワークショップ用資料.PDF,8MB)
2. プログラムを書いてみる
ではさっそく,プログラムを書いて動作をさせてみましょう.
2.1 デジタル出力
最も簡単なプログラムの例です.
コンパイラページで「New program」を実行すると「ひな形」プログラムが作成されます.
一部のマイコン向けには違った名前のひな形が用意されている場合がありますが,ここでは最も基本的な「mbed_blinky」を選択します(デフォルトで選択されています)
#include "mbed.h" DigitalOut myled(LED1); int main() { while(1) { myled = 1; wait(0.2); myled = 0; wait(0.2); } }
mbed_blinkyプログラムを作成すると,そのプログラムの中にはmain.cppとmbedライブラリが入っています.mbedライブラリは「mbed-SDK」とも呼ばれる,マイコンの様々な機能を抽象化したAPIが用意されています.mbedでのプログラミングはこの機能を利用することにより,直感的で移植の用意なコードが書けるようになっています. このプログラムはmbed基板上のLEDを点滅させる,俗にいう「LEDチカチカ(Lチカ)」の非常に単純な例ですが,mbedの特徴を非常によく表したものになっています.
この例ではまず"mbed.h"
をインクルードしてmbedライブラリに必要な宣言を行なっています.これで上記のAPIが使えるようになります.
次にDigitalOut
クラスのインスタンスが宣言されます.mbedはC++で書かれており,多くのライブラリはクラスとして提供されています.クラスとはC言語でいう「型」のようなもので,このクラスからインスタンス(C言語での変数のようなもの)を作成しています.
myled
がインスタンスの名前です.その後ろに括弧が付けられ,LED1という文字が入っていますが,これはmyled
をLED1
という識別子で初期化しています.
LED1
はmbed LPC1768をUSBコネクタを上にして見た場合,下に並んだ4個のLEDの一番左側を指しています.これらのLEDにはLED1〜LED4の名前が付けられています.LED1
を,たとえばp5
のように書き換えると,5番ピンを指定したことになります.
LEDやピンの指定にはPinout図の青地で示されたラベルが使えます.ピン指定の詳細はこちらのソースをご覧ください(mbed LPC1768の場合).
main関数内ではmyled
へ「0」と「1」の代入が繰り返し,wait()
関数を用いて0.2秒の間隔を開けて行われています.これによりLEDに接続されたピンにHIGHとLOWが出力され,点滅となります.
2.2 バス出力
いくつかのデジタル出力をまとめて扱うことができます.
BusOut
クラスを用いれば,複数のLEDやピンをまとめることができます.
インスタンスleds
はLED4〜LED1の4つのLEDをまとめた4ビットの出力となります.ここに値を代入すると,その2進値がLEDに表示されます.
#include "mbed.h" BusOut leds( LED4, LED3, LED2, LED1 ); int main() { int count = 0; while(1) { leds = count++; wait( 0.1 ); } }
上のコード例を試すには,これをタイプしたりコピペする必要はありません.
次のプログラムへのリンクを使って,インポートしてコードを確認し,実行してみましょう.
Import program__BusOut_sample
sample code for workshop
2.3 デジタル入力
p5
〜p30
までのピンは入出力ピンであるため,これを入力として使うこともできます.
DigitalIn
クラスを使えば,宣言したピンが入力となります.
次のサンプルコードは,まずp5のピンを入力として宣言します.
main関数内でそのピンにマイコン内蔵のプルアップ抵抗を接続しています.
ループ内では,読んできたp5の信号を反転してLEDの状態に反映させます.
ボタンが押された時にLOWが入力されるので,それを反転してLEDに出力させれば,ボタン押下げ時にLEDが点灯することになります.
#include "mbed.h" DigitalOut myled( LED1 ); DigitalIn input( p5 ); int main() { input.mode( PullUp ); while(1) { myled = !input; wait( 0.1 ); } }
ワイヤー付き押しボタンスイッチを次のように接続します.
回路は次のような構成になっており,ボタンが押されるとp5はHIGH→LOWになります.
Import program__DigitalIn_sample
sample code for workshop
参考:ワイヤー付き押しボタンスイッチと,その接続
適当な長さのビニール線をスイッチの端子にハンダ付け.もう一方の側にQIコネクタ※を取り付けてあります.QIコネクタにはmbedのピンが挿さります.
通常はこのような部品の接続は,ブレッドボードを用いるのが普通ですが,ブレッドボードの説明に割く時間を省くためにこのような実験治具を用意しました.
※ QIコネクタは共立電子や千石電商などの主な部品店で購入できます.
2.4 アナログ入力
アナログ入力も非常に簡単に使えます.
ただし,使えるピンには制限があります.p15
〜p20
の6つのピンが使えます.
アナログピンには0V〜3.3Vまでの電圧を入力できます.
AnalogIn
クラスのインスタンスからは0Vを0.0,3.3Vを1.0とした正規化された値を読むことができます.
このサンプルコードでは,AnalogInのインスタンスai
から読んできた値に15.0を掛けて,4ビットの0〜15の値に変換し,4個のLEDでその状態を確認できるようにしてあります.
#include "mbed.h" BusOut leds( LED4, LED3, LED2, LED1 ); AnalogIn ai( p20 ); int main() { while(1) { leds = (int)(ai * 15.0); wait( 0.01 ); } }
ワイヤー付き可変抵抗は次のように接続します.
回路は次のような構成になっており,可変抵抗のツマミを回すとp20にかかる電圧が0V〜3.3Vの間で変化します.
Import program__AnalogIn_sample
sample code for workshop
参考:ワイヤー付き可変抵抗と,その接続
適当な長さのビニール線を可変抵抗の端子にハンダ付け.もう一方の側にQIコネクタを取り付けてあります.
ワイヤの色に気をつけて接続してください.
参考:LED点灯パターン・バリエーション
このプログラムにはリビジョン管理機能を用いて,アナログ入力値を別形態の表示に切り替えることもできるようになっています. デフォルトではRevision1が使われますが,Revision0に切り替えると,可変抵抗の状態がLED1〜LED4にバーグラフ的に表示されます.これは時間に余裕があれば"リビジョン管理機能の紹介"としてデモしても良いでしょう.
2.5 シリアル出力
上の「アナログ入力」サンプルコードにシリアル出力を追加してみたコード例です.
Serial
クラス・インスタンスを作成し,そのメンバ関数として用意されているprintf
を使うだけでシリアルへの出力が可能です.stdio.hで宣言されている入出力用の関数が揃っているので,シリアルの入出力を非常に簡単に使うことができます.
#include "mbed.h" BusOut leds( LED4, LED3, LED2, LED1 ); AnalogIn ai( p20 ); Serial ser( USBTX, USBRX ); int main() { while(1) { leds = (int)(ai * 15.0); ser.printf( "voltage = %.2f\r\n", ai * 3.3 ); wait( 0.5 ); } }
Import program__Serial_sample
sample code for workshop
PCでmbedのシリアル出力を見るには
Windows編
Windowsマシンでmbedのシリアル出力を見るには,mbedのシリアルドライバがインストールされていなくてはなりません.
次のリンクからドライバをダウンロードし,インストールしてください.
ドライバ・ダウンロード
(ドライバの詳細はこちら)
さらにターミナルソフトも必要です.既にお使いのターミナルソフトがインストールされていればそれを.されていなければ次のリンクからCoolTermをダウンロードしてインストールしてください.
Mac編
Macではドライバのインストールは必要ありません.
ターミナルソフトもコマンドラインから使える「screen」コマンドが使えます.
あるいはMacでもCoolTermが使えます.screenコマンドの扱いに慣れていない方には,こちらの使用をお薦めします.
CoolTermの使い方
まず,接続先を選択します.
※ Windowsの場合は,接続先は「COM..」のような名前で現れます.
あとはConnectボタンを押すだけです.
mbedのピンに,シリアルを直接出力する
この例ではmbedのUSBインターフェースが持っているCDC(USBのコミュニケーション・デバイス・クラス)を通してシリアル通信を行わせていますが,このUSBTX
,USBRX
を(シリアル・インターフェースで使える)ピン名に変更すれば,ピンに直接シリアル通信を行わせることが可能です.
たとえば
Serial ser( p9, p10 );
のような宣言に変更すると,シリアルのASCIIデータが9番ピンに現れます.
2.6 シリアル出力(その2)
「2.3 デジタル入力」で使用した回路で,ボタン状態をターミナルに表示させるシリアル出力プログラム.
#include "mbed.h" DigitalOut myled( LED1 ); DigitalIn input( p5 ); Serial ser( USBTX, USBRX ); int main() { input.mode( PullUp ); while(1) { myled = !input; ser.printf( "switch is %s\r\n", input ? "OFF" : "ON" ); wait( 0.5 ); } }
Import program__Serial2_sample
code sample for workshop
3. 応用 (おまけ情報)
3.1 他のmbedで試してみるには
mbedコンパイラはmbed LPC1768(青mbed)以外のマイコンにも使えます.
今回使用した青mbedはUSBのホスト/デバイスやEthernet機能もついた豪華版ですが,デジタル入出力やシリアルなどの比較的簡単な処理であれば,より安価なマイコンで対応可能です.
たとえばスイッチサイエンスが開発・販売しているmbed LPC824は,より小さい基板で手頃な価格で販売されています.これを使う場合には,このプラットフォームの解説ページで,オンラインコンパイラに登録を行うだけですぐに使うことができます.
あるいはmbed LPC1114FN28は単体で100円〜200円前後で販売されているDIPパッケージのLPC1114をベースに作られています.このmbedの便利なところは,プログラムの書き込みを行ったマイコンを取り外して,そのチップだけを別基板に取り付けて動作させることができる点にあります.
LPC1114でシリアルを使う場合は,上のピン配置図でSerialを使えるピンを確認し Serial ser( dp16, dp15 );
のようなピン宣言に変更するだけで移植が済んでしまいます.
3.2 いろんな周辺ハードウェアを試してみたい
mbedでは部品さえ用意できれば,すぐに動作を試せるような環境が整っています.
mbedチームやユーザが作成した数多くのライブラリが,mbed.org内で公開されています.
mbedでは外付けのハードウェアも,非常に簡単に使うことができます.
たとえばテキスト表示を行う液晶パネルも,線を繋いでサンプルコードをインポート・実行するだけで表示ができてしまいます.
#include "mbed.h" #include "TextLCD.h" TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD20x4); // rs, e, d4-d7 int main() { lcd.printf("Hello World!\n"); }
非常に多くの周辺デバイス用ライブラリが用意されています.これらの情報はmbedサイト内を検索したり(mbedページ内,あるいはGoogleで「site:mbed.org ◯◯◯◯」のような検索),情報が纏められているCookbookやComponentsページから得ることができます.
このような部品ライブラリを閲覧することで,新しい製品アイデアを得ることも可能かもしれません.
3.3 便利な機能
mbedのオンライン環境では,コードがサーバ側に置かれていますが,この環境を利用してリビジョン管理を行ったり,公開したり,あるいは他のユーザと共同作業を行うことも可能です.
サーバに置いてあるコードは,他のユーザから見える?
いいえ.
サーバに置いてあるコードは公開しない限り,他のユーザから見ることはできません.
mbedのオンライン環境では「リビジョン・コントロール」機能が使えます.作成中のプログラム/ライブラリの各時点での状態を保存しておくことができます.
保存するには「Commit」ボタンを押します.
「Commit」ボタンを押す度に「これはどういう状態を保存するのか?」と聞かれます.後から履歴を辿る時の参考になる情報を残すためなので,これがどういう作業を行ったものなのかをメモしておきましょう.
Information
保存した状態(リビジョン)は「Revisions」ボタンを押すことで閲覧できます.またリスト表示されたリビジョンを選択しておき,「Switch」ボタンを押すとソースコードとライブラリを細んされた状態に切り替えることができます.
コミットしたコードは公開できます.公開の方法は3種類の中から選べます.
- 広く一般に公開する方法
- URLを知っている人のみがアクセスできるように公開する方法
- 個人やチーム内だけで公開する方法
チーム
グループで開発を行う場合には,チームを作成してそこに複数のユーザを登録して協業することができます.
チームではこの他,コードやWikiページなどをチーム名義で公開することも可能です.
3.4 万が一に備えて
mbedはとても使いやすい環境ですが,サーバやネットワークに障害が発生した時の備えを持つことをお薦めします.
mbedのオンライン環境で作成したコードはエクスポートして自身のPCに持ってくることができます.このとき,どのような環境にエクスポートするのかを選択すれば,オフラインで動く開発環境でそのままつかうことができます.
- エクスポートする際のターゲットマイコンによって,サポートされるオフライン環境に違いがあるので注意してください.
- オフラインで動く環境にはOSに依存するものもあるので,この点も注意が必要です.
Windowsユーザで小さなコードを作成しているのであれば,MDK-ARMが良いでしょう.mbedのオンラインコンパイラと同じARM純正コンパイラが使えます.ただしオンライン版と違って,フリー版では作成するバイナリが32KBまでに制限されています.
http://developer.mbed.org/users/MACRUM/notebook/uvision4_debug/
より大きなバイナリを作成する,あるいはMacやLinuxでオフライン環境を動かす場合にはLPCXpressoが使えるかもしれません.LPCXpressoへのエクスポートが可能なターゲットの種類は少ないですが,先述のOSサポートと256KBまでのバイナリ作成がフリーで行える点がこのツールの利点です.
デバッガが使えます
オンライン環境ではデバッガが使えないため,それが必要な場合,LEDの点滅やprintf,はたまた念力を駆使しなければなりませんでした.オフライン環境ではmbedのインターフェース・チップがサポートしているCMSIS-DAPを介して,デバッガを使うことができます.
3.5 困ったときは
mbedを使っていて困ったことが起きた場合には,mbed.org上で聞いてみることができます.
Q&Aのページが用意されており,ここで質問をするとコミュニティからの回答が得られる仕組みができています.多くは英語で書かれていますが,日本語の質問でも問題ありません.日本語のユーザで回答可能な内容であれば答えが得られるでしょう.
mbed.orgは英国ARM社が運用しているため,英語の情報が多いわけですが,日本のユーザも活発に活動しています.日本語の情報はmbed.org内で日本語で検索をかけたり,日本語フォーラムを覗いてみることで得られるでしょう.
Q&Aやフォーラムへの書き込みの際は..
mbed.orgへのの書き込みはWikiフォーマットが使えるようになっています.
通常の文章の入力なら問題はありませんが,たとえばコードを貼り付けるような場合には,そのまま貼り付けるとインデントなどが乱れますが,この下のようなタグを使うとうまく表示できます.
<<code>> int max(int x, int y) { return (x > y) ? x : y; } <</code>>
この他,様々な書法が用意されています.
これについてはこちらのページ(Wiki Syntaxページ)で確認することができます.
またmbed.org内だけではなくTwitterなどでも多くの情報交換が行われています.「#mbed」のハッシュタグでつぶやくことにより,仲間も増えると思います.
さらに,NXPのマイコンに関しては,多くの日本語情報が発信されています.是非NXPのマイコンのページも御覧ください.
さらに最新の情報に触れるには:「mbed祭り」のご案内
mbedのユーザが一堂に会するmbed祭りが一年に数回,不定期に開催されています.
mbedの最新情報や制作事例,実機デモ,さらに初めての人向けのハンズオン・コーナーもある,初心者からヘビーユーザまでをカバーする楽しいイベントです.
mbed祭りのコミュニティ・サイトに登録しておけば,次回のmbed祭りの開催日時や参加申込開始の案内をいち早く受け取ることができます.
是非このコミュニティに登録いただき,コミュニティの最新情報に触れてください.
Please log in to post comments.