2015年04月16日

マイコン

GROVE スターターキット for mbed の使い方(スイッチ,ブザ−,ボリューム編)

こんにちは。Arduinoやmbed、3Dプリンタなどの登場とともに、ラピッドプロトタイピングという言葉をよく目にするようになりました。
ラピッドプロトタイピングとは製品の試作を短時間に行う製品開発手法です。mbedやArduinoといった製品は、マイコン電子工作に本来必要なはんだづけやプログラミングの手間を減らし、ラピッドプロトタイピングの支援を行っています。GROVE Systemもその一つです。

GROVE Systemとは

258821

 

GROVE SystemとはSeed Studio社が開発したラピッドプロトタイピングを支援するシステムであり、モジュール化されたセンサやスイッチを簡単にマイコンで扱うことができます。モジュールの着脱は、マイコン側に装着したBaseボードとモジュール間を4本線のケーブル(GROVE-Cable)で接続して行います。はんだづけは一切必要ないので、とても簡単に扱えます。

今回ご紹介するGROVE スターターキット for mbedは、GROVE Systemをmbedで使用するためのスターターキットです。このキットには以下のモジュールが同梱されています。

  • 1 x Grove – Button
  • 1 x Grove – Buzzer
  • 1 x Grove – Rotary Angle Sensor
  • 1 x Grove – Temperature Sensor
  • 1 x Grove – Light Sensor
  • 1 x Grove – Infrared Emitter
  • 1 x Grove – Infrared Receiver
  • 1 x Grove – Chainable RGB LED
  • 1 x Grove – 3-Axis Digital Accelerometer(±1.5g)
  • 1 x Grove – 4 Digit Display
  • 1 x Base Shield
  • 1 x Infrared remote control
  • 5 x Grove Cable (24mm)
  • 5 x Jumper Wire

以降、これらのモジュールの使い方について、回を分けて解説をしていきます。
今回は、ボタン(Button)、ブザー(Buzzer)、ボリューム(Rotary Angle Sensor)、3色LED(Chainable RGB LED)の4つについて説明します。

 

GROVE スターターキット for mbed 対応mbedボード

Base ShieldはArduino Shieldの形状をしているので、対象mbedボードはArduino互換ピンヘッダを持ったものになります。つまり、該当するマイコンは 以下のSTマイクロ社のNucleoシリーズと、Seeed StudioのSeeeduino Archシリーズです。 (その他Arduino互換ピンヘッダを持ったmbedでも使用できるはずですが、こちらでは確認できていません)

今回は手元にあったNucleo F401REを使い、Windowsマシン上で開発を行います。

 

ブザー(Buzzer)の使い方

grobe0416_IMG_2817

ブザーは電圧を加えると音が鳴るだけの、単純なモジュールです。最初はこのブザーから説明します。

 

1. ブザーを接続する

ブザーはBase Shieldのデジタル出力に接続して使用するので、 Base ShieldのD2〜D8のどこかに接続します。 今回はD2に接続しました。
その後、ブザーと接続したBase Shieldは、NucleoのArduinoピンヘッダに差し込んでください。

 

2. プロジェクトを作る

mbedのオンラインIDE上で プログラムを作るには、最初にプロジェクトの作成が必要です。

grobe0416_mbed_new

mbedのオンラインIDEの画面左上にある「New」ボタンを押して、新規プロジェクトを作成します。

grobe0416_mbed_create

新規プロジェクト作成ウィンドウが出てくるので、Templateから「Blinky LED test for the ST Nucleo boards」を選択してOKを押します。するとプロジェクトが作成され、中にはLED点滅サンプルコードが書かれた「main.cpp」ファイルができます。

 

3. プログラムを作る

先ほど作成したLED点滅サンプルコードを修正して、ブザーを鳴らすプログラムを作成します。

ブザーはデジタル出力で制御するので、DigitalOutの出力ピン設定を変更するだけで利用できます。(※ DigitalOutクラスの詳細はこちらを参照してください)

Base Board上に書かれたD2〜D8とA0〜A3は、Arduinoピンヘッダの番号と対応しています。

grobe0416_pinout

例えば、今回のようにブザーをD2に接続した場合は、プログラムで指定するピンもD2となります。

以下に、完成した1秒毎にブザーをON/OFFするコードを示します。

 

#include “mbed.h”
DigitalOut buzzer(D2);

int main() {
while(1) {
buzzer = 1;
wait(1.0);
buzzer = 0;
wait(1.0);
}
}

このプログラムをmain.cに書いたあと、オンラインIDE上の「Compile」ボタンを押すとコンパイルが行われ、 マイコンへ書き込む .bin ファイルがダウンロードされます。

 

4. プログラムを書き込む

NucleoをUSBケーブルで接続すると、NUCLEOという外部メディアが認識されます。 ここに先ほどダウンロードした .bin ファイルを書き込むと、プログラムが書き込まれ、 動作を開始します。

 

ボタン(Button)の使い方

grobe0416_IMG_2818

次は非常に単純なスイッチである、押しボタンの使い方について説明します。

 

1. ボタンを接続する

ボタンはデジタル入力で扱うので、ブザーと同じくD2〜D8のどこかに接続します。 今回はD3に接続しました。

 

2. プログラムを作る

ボタンはデジタル入力で制御するので,入力ピンを指定したDigitalInクラスのインスタンスを生成して、利用します。(※ DigitalInクラスの詳細はこちらを参照してください)

ボタンからの入力は、離した状態で0、押した状態で1となります。

以下にサンプルとして、ボタンを押している間にブザーが鳴るプログラムを示します。

#include “mbed.h”

DigitalOut buzzer(D2);
DigitalIn sw(D3);

int main() {
while(1) {
if(sw == 1){
buzzer = 1;
}
else{
buzzer = 0;
}
}
}

 

ボリューム(Rotary Angle Sensor)の使い方

grobe0416_IMG_2819
次はつまみを回すと抵抗値が変化するボリューム(可変抵抗器)の使い方を説明します。

 

1. ボリュームを接続する

ボリュームはアナログ入力で扱うので、Base Boardのサイドにある A0 ~ A3 ポートのどこかに接続します。 今回はA0に接続しました。

 

2. プログラムを作る

mbedでアナログ入力を扱うには、ピン番号を指定したAnalogInクラスのインスタンスを用いて行います。 (※ AnalogInクラスの詳細はこちらを参照してください)

以下にAnalogInを用いてボリュームのアナログ値を取得し、シリアル通信で出力するサンプルを示します。

#include “mbed.h”

AnalogIn analog_value(A0);
Serial pc(USBTX, USBRX);

// Calculate the corresponding acquisition measure for a given value in mV
#define MV(x) ((0xFFF*x)/3300)

int main() {
pc.baud(115200);
while(1) {
uint16_t meas = analog_value.read_u16(); // Converts and read the analog input value
float per = meas * 100.0 / 0xffff;
pc.printf(“%d / %d = %02.1f \%\n”, meas, 0xffff, per);
wait(0.5); // 500 ms
}
}

Base BoardのA0~A3ポートはNucldeoのArduino互換ピン(A0〜A3)に対応しているので、 AnalogInへのピン指定は次のように A0 を指定します。

AnalogIn analog_value(A0);

ADコンバータで変換されたデジタル値は、read_u16メソッドで読み取れます。

uint16_t meas = analog_value.read_u16();

read_u16メソッドから返ってくる値は、0×0000から0xffffまでの整数です。
0.0から1.0までの小数を得たい場合は、read_u16メソッドの代わりにreadメソッドを用います。

float meas_f = analog_value.read();

以上のサンプルを動かし、ボリュームのつまみを回すと、シリアルコンソールに値が表示されます。

grobe0416_adc

※ ボリュームを動かしていない間も、少し値がブレることがあります。

 

3色LED(Chainable RGB LED)の使い方

grobe0416_IMG_2841

次に3色LEDについて説明します。

 

1. 3色LEDを接続する

grobe0416_IMG_2844

この3色LEDはChainable――つまり複数モジュールをつないで制御が可能なLEDです。最初の1モジュールのIN側をマイコン側に繋いだ後、OUT側をもう片方のIN側に接続していくことで、数を増やしていくことができます。しかし、今回は1個しか扱わないので、3色LEDののIN側とマイコン側のデジタルポートに接続するだけでよいです。

注意としまして、この3色LEDの制御にはクロック線とデータ線の2ポートを使用するので、Dnポートに接続した場合は隣り合うD(n+1)ポートも使用済みとして使えなくなります。例えば、今回私はD4ポートに接続を行ったので、D4とD5ポートが使用済みとなり、使えません。

 

2. プログラムを作る

3色LEDの制御はライブラリを用いて行います。 以下のURLからライブラリをダウンロードして下さい。

// grove_chainableLED.zip のアップロードとリンクの掲載をお願いします。

このzipファイルを解凍し、中に入っているファイルをすべてmbedのプロジェクトに追加してください。 そして、このライブラリを使用するプログラムの頭に
<br>

#include “ChainableLED.h”

を書き足せば、ライブラリのインストールは完了です。

ライブラリの使い方は簡単で、DigtalOutなどと同じように

ChainableLED cled(D4,D5,1);

このように書いてインスタンス作った後、

cled.setColorRGB(0, 0,255,0);

とすると、指定した色が出力されます。

最初のインスタンス生成部、

ChainableLED cled(D4,D5,1);

の引数は左から順に、クロックポート、データポート、LED接続数を設定します。 今示している例は、D4ポートに1モジュールだけ接続した場合の例です。

出力を行うsetColorRGBメソッド

cled.setColorRGB(0, 0,255,0);

の引数は左から順に、対象LED番号、赤色(R)、緑色(G)、青色(B)を設定します。 色に設定できる値は 0 から 255 までの256段階です。 今示している例は、0番目のLEDを緑色にします。

最後に、サンプルコードの全体を示します。

#include “mbed.h”
#include “ChainableLED.h”ChainableLED cled(D4,D5,1);int main() {
while(1) {
// cled.setColorRGB(LED番号, 赤, 緑,青);
cled.setColorRGB(0, 0,255,0);
}
}

 

 

組み合わせ:ボリューム+3色LED(Chainable RGB LED)

せっかくなのでボリュームと3色LEDを組み合わせて、「明るさを換えられる白色LEDライトもどき」を作ってみましょう。

作り方は非常に簡単で、ハードの接続は

・ボリュームをアナログポート(今回はA0)に接続する
・3色LEDをデジタルポート(今回はD4)に接続する

以上を行うだけです。

プログラムの方は、

・ボリュームの値(16bit値)を255で割り、値の範囲を 0 から 255(8bit値)にする
・変換した値を3色LEDにセットする

を行うだけです。

3色LEDの色を白色にするには、光の三原色(赤、緑、青)を均一に混ぜると白になることを用います。 つまり、ボリュームの値を変換した8bit値を3色LEDの赤、緑、青、全てにセットすれば、「明るさを換えられる白色LEDライトもどき」が作れます。

以上を実際に実装したコードを以下に示します。

#include “mbed.h”
#include “ChainableLED.h”DigitalOut myled(LED1);

ChainableLED cled(D4,D5,1);
AnalogIn analog_value(A0);int main() {

while(1) {
// アナログボリュームの値を取得
uint16_t meas = analog_value.read_u16();
uint8_t red,green,blue;

// RGBをセット
red = meas / 0xff;
green = red;
blue = red;

// LEDに出力
cled.setColorRGB(0, red,green,blue);
wait(0.05);
}
}

実際に動かしてみると、以下のようになります。ボリュームを回すと、明るさが変化します。

grobe0416_IMG_2849

 

 

 

おわりに

今回はGroveモジュールの以下のモジュールの使い方を解説しました。

  • ブザー
  • スイッチ
  • ボリューム
  • 3色LED

最初の3つは最も基本的な部品なので、これが使えるだけでも工作の幅が広がるのではと思います。
3色LEDは各色の出し方を工夫して、色が変化してくような物が作れると、面白いかもしれません。

次回はちょっと発展して、赤外線モジュールと赤外線リモコンの使い方を解説したいと思います。

 

 

作者

作者: 西永俊文

Twitter: tnishinaga

協力: マルツエレック株式会社

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 – 改変禁止 4.0 国際 ライセンスの下に提供されています。

ページトップへ