mbed(NUCLEO-L152RE )のデジタルIOを制御したいと思います。
printfでPCにメッセージを送信
デジタルIOの制御といいましたが、先ずはパソコンで動作の状態を確認できるようにしましょう。簡単な方法にprintf関数でメッセージをパソコンに送る方法があります。
プロジェクトの作成方法はこちらのサイトを確認してください。
mbedを始めましょう!(“Let’s get started!” in Japanese)
main.cppとmbedライブラリを追加してください。main.cppに以下のプログラムを書いてみましょう。
#include "mbed.h" int main() { while(1) { printf("Hello\r\n"); wait(1); } return 0; }
このプログラムは1秒毎に「Hello」というメッセージをパソコンに送ります。
mbedコンパイラでコンパイルを行ってみてください。正常にコンパイルが完了すれば、binファイルがダウンロードされるはずです。
binファイルができたら、あとはmbedに書き込むだけです。
mbedとパソコンをUSBケーブルで接続してください。すると、新しいドライブが追加されると思います。そのドライブに先ほど作成したbinファイルをドラッグ&ドロップすればプログラムの書き込みは完了です。
ちなみに書き込みを行うと、mbed(NUCLEO-L152RE )のUSBケーブル差し込み口横のLEDが一時的に点滅します。
パソコンでmbedからのメッセージを受信
さて、次はパソコンでどうやって確認をするかですね。今回は「Tera Term」というアプリを使用します。
こちらのサイトから最新版をダウンロードすることができます。
Tera Term
Tera Termを起動すると「新しい接続」という画面が開くと思います。もし開かない場合、メニューのファイルにある「新しい接続」を選択してください。
新しい接続の画面の下に「シリアル」というラジオボタンがあると思います。それを押し、ポートをmbedと接続しているポートに変更してください。
ポートの選択が完了したらOKを押してください。するとmbed(NUCLEO-L152RE )とつながります。
プログラム、プログラムの書き込み、mbedとパソコンとの接続が正常に行われていれば、以下のように「Hello」というメッセージが表示され続けます。
プログラムについて
プログラムについて簡単に説明します。と言ってもそれほどの中身はありませんが。
#include "mbed.h" int main() { while(1) { printf("Hello\r\n"); wait(1); } return 0; }
マイコンなのでwhileなどを使用して永久ループにしています。ちなみに永久ループにしないと1回動作して終了します。
6行目がパソコンにメッセージを送っている部分ですね。何も設定せず初期のまま使用すると、printf関数の出力先は、USBで接続しているパソコンへのシリアル出力になります。ここでは改行に\r\n(ソース上では\はバックスラッシュ)を使っています。\rがないとTera Termでは行の先頭に戻らないため、そのようにしています。よく意味が解らない場合、実際に動かした方が早いと思いますので、\rを削除してプログラムを動かしてみてください。
7行目のwait(1)というのは1秒間処理を停止ということです。これがないとあまりに早くメッセージが来てしまい大変なことになります。
実際の組み込みプログラムの場合、このようなwaitを入れることはしませんが、今回は確認しやすくするために入れています。
このプログラムをコンパイルすると、10行目の処理が実行されないよ、と警告が出ると思いますが、特に問題ないので無視します。
ここから本題のデジタルIOの制御(まずは入力)
デジタルIOの制御をする為に、今回はPICを使用してテストをしたいと思います。以下のPICは一定間隔でハイとローを繰り返すようになっています。なのでPICの出力をmbedのデジタル入力に接続することで、がハイとローを繰り返すことを確認できます。
PICを使わなくても、ピンに手動で3.3Vとグランドをつなげたり外したりすれば同様のことは可能です。
使用するピン
mbed(NUCLEO-L152RE )で今回使用するピンはPC_8(写真の右下の白いケーブルが繋がっているピン)にします。理由はわかりやすい位置にあるからです。
PICと接続する場合、mbed(NUCLEO-L152RE )の3.3V出力とグランドに接続します。デジタル入力の確認をするために、PICのRA2とmbed(NUCLEO-L152RE )のPC_8をつなげます。
デジタル入力の状態をパソコンへ送る
パソコンへデジタル入力の状態を送るプログラムを作る必要があります。以下がそのプログラムです。
#include "mbed.h" int main() { DigitalIn dIn(PC_8); while(1) { printf("In[%d]\r\n", dIn.read()); wait(0.1); } return 0; }
5行目が、PC_8のピンをデジタル入力に設定するということになります。PC_8をdInという名前でデジタル入力に設定ということです。
8行目がパソコンに出力している部分です。デジタル入力の値を読み込むread関数の戻り値を入れています。read()は0か1をint型で返してくれる関数です。
9行目のwaitは、今回は100ミリ秒周期にする為に0.1としています。
実行すると以下の画面の様に、0と1を繰り返します。どうやらデジタル入力は正常に行えたようですね。
続いてデジタル出力の制御
デジタル入力は問題なくできたということで、次はそのデジタル入力を使用しながら、デジタル出力の確認を行いたいと思います。
PC_9をデジタル出力にし、PC_8と接続します。PC_9をハイにすると、PC_8もハイになり、ローにするとローになるということです。サクッとジャンパーピンで接続してみましょう。
プログラムは先ほどのデジタル入力のプログラムを少し変更し、デジタル出力部分を追加します。以下がそのプログラムです。
#include "mbed.h" int main() { DigitalIn dIn(PC_8); DigitalOut dOut(PC_9); while(1) { if (dIn.read() == 0) { dOut = 1; } else { dOut = 0; } printf("In[%d]\r\n", dIn.read()); wait(0.1); } return 0; }
6行目が、デジタル出力の設定になります。PC_9をdOutという名前でデジタル出力に設定ということです。
デジタル出力の変数に0を入れればロー、1を入れればハイを出力するようになります。
そこで、PC_8のデジタル入力の値がハイの場合はPC_9のデジタル出力をローに、逆に入力がローの場合はハイを出力するようにしました。
9~13行目がその処理になります。
このプログラムを実行すると以下のように0と1を繰り返すようになります。
さて、本当にデジタル出力してるの?と思った場合は、PC_9とPC_8の接続を切ってみましょう(ジャンパーピンを抜いてみましょう)。すると、抜くタイミングによって0か1に変わりそのままになるはずです。
また、PC_8に3.3[V]またはグランドを接続してみても確認できます。ただ、他のピンと接触しないように注意してください。
以上、mbed(NUCLEO-L152RE )のデジタル入出力完了です。
更新履歴
版 | 更新日 | フォームバージョン | mbedライブラリ | 説明 |
新規作成 | 2017/1/25 | V2.J28.M16 | 124:2241e3a39974 |