2014/02/02からのアクセス回数 7930

来週のArduino勉強会に備えて、mbedライクなクラスライブラリlbedをArduinoに移植してみました。

今回移植したクラスは、以下の通りです。*1

また、ユーザクラスの例として、以下の2つをlbed版から移植してみました。

インストール方法

以下のZIPファイルをダウンロードして、解凍して作成されたlbedフォルダーをArduinoのユーザ用 ディレクトリ(Macの場合には、Document(文書)/Arduino/libraries/に入れる

ライブラリの使い方

まずは、ライブラリの例題を動かしながら、ライブラリの使い方を説明します。

Arduino IDEを起動し、スケッチの例→Lbed→BlinkLEDを選択します。

以下のようなスケッチが表示されます。

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
#include "lbed.h"          // #A
 
// Pin 13 has an LED connected on most Arduino boards.
DigitalOut led(13);        // #B

// the setup routine runs once when you press reset:
void setup() {               
}

// the loop routine runs over and over again forever:
void loop() {
  led = ~led;               // #C
  wait_ms(1000);         // #D
}

次にファイルメニュー→マイコンボードに書き込むを選択して、スケッチをArduinoに書き込みます。

ArduinoのLEDが1秒間隔で点滅すれば成功です。

このようにmbedのDigitalOutクラスを使うと直感に合ったプログラムを書くことができます。

lbedの例題を動かしてみる

次に、 Protosnap Pro Mini

を使ってLbedに付属のサンプルを動かしてみます。

ProtoSnap_Pro_Mini.png

部品とArduino Pro Miniのピンの接続は以下のようになっています。

部品のピンArduino Pro Miniのピン
ボタン7
光センサーA0
緑のLED5
青のLED6
赤のLED3
ブザー2

ボタンスイッチの例

次の例は、ボタンスイッチを押したときにArduinoのLEDを点灯させる例です。

Protosnap Pro Miniがなくてもブレッドボードでタクトスイッチを使って以下の様に 回路を組み立てれば、簡単に動かすことができます。抵抗には10KΩを使って下さい。

ButtonSwitch_bread.png

スケッチは、同様にスケッチの例→Lbed→ButtonSwitchを選択します。

/*
  ButtonSwitch
  Turns on an LED on when button pushed.
 
  This example code is in the public domain.
 */
#include "lbed.h"
 
// Pin 13 has an LED connected on most Arduino boards.
DigitalOut     led(13);
// Pin 7 has an tact switch on Protosanap Pro Mini.
DigitalIn     sw(7);          // #A

// the setup routine runs once when you press reset:
void setup() {               
}

// the loop routine runs over and over again forever:
void loop() {
  led = !sw;                    // #B
  wait_ms(200);               // wait for 200 mili seconds.
}

光センサーの例

光センサーの例題を試してみましょう。

この例題は、AnalogInで光センサーの電圧を取得し、その値でLEDを調整します。 Protosnap Pro Miniを灯りに近づけるとLEDが点灯し、影を作って暗くするとLEDが消灯します。

光センサーが無い場合には、可変抵抗で代用して実験して下さい。

/*
  LightSensor
  Turns on an LED on when light sensor > 0.5V(0.1).
 
  This example code is in the public domain.
 */
#include "lbed.h"
 
// Pin 13 has an LED connected on most Arduino boards.
DigitalOut     led(13);
// Pin A0 has a light sensor on Protosanap Pro Mini.
AnalogIn     sensor(A0);     // #A

// the setup routine runs once when you press reset:
void setup() {               
}

// the loop routine runs over and over again forever:
void loop() {
  if (sensor > 0.1)          // #B
    led = 1;
  else
    led = 0;
  wait_ms(200);               // wait for 200 mili seconds.
}

ブザーの例

次は音の実験です。

Protosnap Pro Miniが無い場合には、圧電ブザーとボタンスイッチ以下の様に接続して実験してください。

Buzzer_bread.png

例題には、スケッチの例→Lbed→Buzzerを選択します。

/*
  Buzzer
  Sound on an buzzer on when button pressed.
 
  This example code is in the public domain.
 */
#include "lbed.h"

int duration = 500;

// Pin 7 has an tact switch on Protosanap Pro Mini.
DigitalIn     sw(7);
// Pin 2 has a buzzer on Protosanap Pro Mini.
Tone          buzzer(2);     // #A

// the setup routine runs once when you press reset:
void setup() {               
}

// the loop routine runs over and over again forever:
void loop() {
  if (!sw) {                         // #B
    buzzer.tone(262, duration);     // ド, 500 msec
    wait_ms(500);
    buzzer.tone(294, duration);     // レ, 500 msec
    wait_ms(500);
    buzzer.tone(330, duration);     // ミ, 500 msec
  }  
}

mbed用のユーザーライブラリーをArduinoで動かす

Aruino版lbedの目的は、mbed用に作成された多くのユーザーライブラリーをArduinoでも使えるようにすることです。

I2Cを使った以下の2例について、Arduino版への移植方法を説明します。

ArduinoのI2Cについて

当初、ArduinoのI2Cのピン番号が分からなかったのですが、以下のサイトで、ArduinoのI2C/TWI端子はSCL(アナログ5番ピン)・SDA(アナログ4番ピン)となっていることをしりました。

I2Cの移植の注意

Arduinoでは、I2C用のWireクラスのsetup後でないとI2Cの初期化ができないので、mbedのI2Cを使った ライブラリーをArduinoに移植する場合には、クラスのコンストラクターの処理をsetupメソッドにまとめ、 スケッチのsetupからユーザライブラリーのsetupをコールするようにします。

LM73の場合

LM73の場合、publicにsetupメソッドを以下の様に追加しました。

LM73.hの変更

class LM73
{
public:
  LM73(PinName sda, PinName scl);


  /* Arduino 固有のメソッド */
  void setup();

LM73.cppのLM73での初期設定をsetupに移します。

LM73::LM73(PinName sda, PinName scl) : i2c(sda, scl)
{
    // setup();
}

void LM73::setup()
{
    i2c.setup();
     char cmd[2];
     // LM73設定
     cmd[0]    = 0x04;     // register 4
     cmd[1]    = 0x60;        // 14bit resolution
     i2c.write( LM73_ADDR, cmd, 2);
     // ポインタを0にしておく(readするだけで温度が読めるようになる)
     cmd[0]    = 0x00;
     i2c.write( LM73_ADDR, cmd, 1);
}

例題にあるスケッチは、以下の通りです。I2Cを使う例では、Wire.hのインクルードが必要になります。

#include "lbed.h"
#include "Wire.h"
#include "LM73.h"

DigitalOut led(13);
LM73  lm73(A4, A5);

void setup()
{
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Serial.println("Hello World");
  lm73.setup();
}

void loop()
{
  led = ~ led;
  float t = lm73.read();
  Serial.print("Temp=");
  Serial.println(t);
  wait_ms(1000);
}

シリアルモニターの出力例

LM73-SerialMonitor.png

I2cLCDの場合

勝さんのI2cLCDも同様に移植しました。

I2cLCD.hの変更

class I2cLCD : public Print {
public:
    I2cLCD(PinName sda, PinName scl, PinName rp);
    // Arduino用に追加
    void setup();

途中省略
protected:
    // 追加 Takemoto
     virtual size_t write(uint8_t c) {
          _putc(c);
          return 1;
     }

I2cLCD.cppの変更

I2cLCD::I2cLCD(PinName sda, PinName scl, PinName rp) :  _i2c( sda , scl ), _rs( rp ) {
    //setup();
}

void I2cLCD::setup() {
    // このタイミングでセットアップする
    _i2c.setup();
    // コンストラクターの処理を以下に移動
    contrast = CNTR_DEF;
    icon = 0;
   
    wait_ms(15); //wait(0.015);
    // reset LOW->HIGH
    _rs = 0;
    wait_ms(10); //wait(0.01);
    _rs = 1;
    wait_ms(50); //wait(0.05);
   
    writeCommand(FUNC_SET1);
    writeCommand(FUNC_SET2);
    writeCommand(INT_OSC);
   
    writeCommand(0x70 | (contrast & 0xF));
    writeCommand(0x5C | ((contrast >> 4) & 0x3));
   
    writeCommand(0x6C);
    wait_ms(300); //wait(0.3);
   
    writeCommand(0x38); // function set
    writeCommand(0x0C); // Display On
   
    cls(); // Clear Display  
}

勝さんの作られたサンプルmainを元に以下のスケッチで動作を確認しました。

// I2cLCD テストスケッチ 勝さんのサンプルプログラムから移植
#include "lbed.h"
#include "I2cLCD.h"
#include "Wire.h"

I2cLCD lcd(A4, A5, 2);  // sda, scl, reset

void setup()
{
    lcd.setup();
    // print TEXT
    lcd.print("Dsp test");
    lcd.locate(0, 1);
    lcd.print("Hello World!");
    // print ICON
    lcd.seticon( I2cLCD::Mark );
    lcd.seticon( I2cLCD::Battery_1 );
    lcd.seticon( I2cLCD::Battery_2 );
    lcd.seticon( I2cLCD::Battery_3 );
    lcd.seticon( I2cLCD::Battery_4 );
    lcd.seticon( I2cLCD::NoSound );
    lcd.seticon( I2cLCD::Lock );
    lcd.seticon( I2cLCD::ArrowDown );
    lcd.seticon( I2cLCD::ArrowUp );
    lcd.seticon( I2cLCD::Input );
    lcd.seticon( I2cLCD::Alarm );
    lcd.seticon( I2cLCD::Tell );
    lcd.seticon( I2cLCD::Antenna );
}

void loop()
{
    lcd.clearicon( I2cLCD::Antenna );
    wait_ms(500); //wait(0.5);
    lcd.seticon( I2cLCD::Antenna );
    wait_ms(500); //wait(0.5);
}

おわりに

とても簡単にmbedのユーザーライブラリーをArduinoに移植できることがお分かり頂けたのではないかと思います。 是非、Arduino版lbedをお試し下さい。

コメント

選択肢 投票
おもしろかった 0  
そうでもない 0  
わかりずらい 0  

皆様のご意見、ご希望をお待ちしております。


(Input image string)

*1 移植と言ってもほとんどArduinoのAPIのラッパーです

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc