カラーLEDを点けてみよう

カラーLEDを④(赤)をp22に270Ωを通してつなげます。同様に②(青)をp23、①(緑)をp24にそれぞれ100Ωの抵抗を介して繋げます。
③はグラウンドに繋げます。一番長い足がグラウンドです。
絶対定格

とにかくLEDを点けてみよう

 各LEDのアノード側green①、blue②、red④には電流制限用抵抗が必要です。
redには270Ω、green, blueには100Ωを取り付けます。
各LEDに流れる電流は次式で求められます。
Red      (3.3-1.85)/270 = 5.4mA
Blue,Green  (3.3-2.75)/100 = 5.5mA
それぞれの電圧値は実測値です。

しかし、大体同じ電流を流したからと言って同じ光の強さで光るとは限りません。従って、ここでは全部100Ωにしてしまいます。

カラーLEDを点滅させるプログラム
#include "mbed.h"

DigitalOut Red(p22);
DigitalOut Blue(p23);
DigitalOut Green(p24);

int main()
{
    while(true)
    {
        Green = 1;
        wait(0.2);
        Green = 0;
        wait(0.2);
    }
}
 1 
 2 
 3 デジタル出力で用いるオブジェクトを作る
 4 それにRedという名前をつける。このオブジェクトには
 5 仕事をするメソッドと記憶データがあります。
 6 
 7 
 8 
 9 
10 
11 Green.write(1);の簡略表記法。p21がHigh(3.3V)になるのでLEDに電流
12 が流れて光ります。0.2秒間待ちます。
13 p21がLow(0.0V)となるのでLEDが消灯する。
14 従って、0と1で点滅を制御します。
15 
16 


微妙な色を作ってみよう

LEDは電流の大きさで光の量をコントロールすることが出来ます。しかし、この回路あるいはプログラムを作るのは面倒で、出来る場合と出来ない場合があります。これを簡単に出来るようにするには、電流は一定で光る時間をコントロールすることです。これは、人間の目が高速の光の変化に追従できなく、その平均値を感じるという特性を利用します。つまり、光っている時間が短ければ暗く、長ければ明るく見えるということです。これを簡単に行うにはPwmOutクラスを用いると出来ます。このPwmOutはmbedのp21からp26まで使えることになっていますが、p21は今サーボモーターのテストに利用している可能性があるので、p22からp24までを使うことにします。
ここではcosの計算をしていますが、この関数はdoubleの数字を扱います。しかしながら、この関数は時間もかかり、メモリも消費します。これをfloatで行ってくれれば理想的な感じがします。これがcosfです。floatの値を引数にして答えもfloatです。

メインプログラム(main.cpp)
#include "mbed.h"
#include <math.h>
#ifndef M_PI
#define M_PI 3.14159265f
#endif
PwmOut red(p22);
PwmOut blue(p23);
PwmOut green(p24);

int main()
{
  float y=2*M_PI/3.0;
  while(true)
  {
    for(float p = 0.0f; p < M_PI*2.0f; p += 0.1f) 
    {
      red =  (cosf(p)+1)/2;
      green= (cosf(p+y)+1)/2;
      blue=  (cosf(p+y*2)+1)/2;
      wait(0.1);
    }
    for(int i=0; i<=8; i++)
    {
      if(i&1) red.pulsewidth_ms(20);
      else    red.pulsewidth_ms(0);
      if(i&2) green.pulsewidth_ms(20);
      else    green.pulsewidth_ms(0);
      if(i&4) blue.pulsewidth_ms(20);
      else    blue.pulsewidth_ms(0);
      wait(0.5);
    }
  }
}
 1 mbed用ヘッダーファイル
 2 sinなどの数学関数を用いる
 3 math.hにM_PIの定義が無かったら
 4 πの定義をする
 5 
 6 赤はp22
 7 青はp23
 8 緑はp24
 9 
10 
11 
12 360度の1/3の位相差でRGBを変化させる
13 永久ループ
14 
15 0~2π(360度)の範囲
16 
17 赤の成分
18 緑の成分
19 青の成分
20 0.1秒表示
21 
22 
23 7色表示する
24 
25 赤の成分
26
27 緑の成分
28 
29 青の成分
30 0.5秒表示
31 
32 
33 


ダウンロード
Code::Blocks用

電子蝋燭を作ってみよう

カラーLEDでろうそくみたいな光り方を作ってみます。回路の接続方法は上記のカラーLEDの項目と同じです。
メインプログラム(main.cpp)
#include "mbed.h"
#include <stdlib.h>
PwmOut red(p22);
//PwmOut blue(p23);
PwmOut green(p24);

int main()
{
  while(true)
  {
    red = ((float)rand()/RAND_MAX/2)+0.5f;
    green = ((float)rand()/RAND_MAX/8)+0.1f;
    wait(0.1);
  }
}
 1 mbed用ヘッダーファイル
 2 乱数rand()が定義されている
 3 赤はp22
 4 青はp23 ここでは使わないのでコメントに
 5 緑はp24
 6 
 7 
 8 
 9 永久ループ
10 
11 赤の成分を乱数で決める
12 緑の成分を乱数で決める
13 0.1秒待つ
14 
15 


蝋燭のチラチラと光るところは乱数を用いてそれらしくします。また、炎が真っ赤は趣が無いので、少し緑をやはり乱数で混ぜます。この混ぜ方などは好みがありますので適当に数字を直してください。
rand()メソッドは1から正の整数型の最大値までの乱数を作ります。
正の整数型の最大値はstdlib.hの中でRAND_MAXとして定義してあります。
従って、(float)rand()/RAND_MAXは0.0~1.0の乱数となります。(float)でキャストしてあるのは整数と整数を割り算すると、答えは整数になるので、この場合最大値で割っているのでほぼ全部ゼロということになってしまい無意味の計算になるからです。

LEDの上にティッシュペーパーなどを配置すると光が分散して趣が良くなります。

ダウンロード
Code::Blocks用

ColorLEDクラスを作る



新しいファイル、ここではColorLED.hを作るには、

  1. プロジェクトを右クリックすると、メニューが出ますので、ここで「New File...」を選択します。


  2. すると、ダイアログのウィンドウが開きますので、ファイル名を入れます。ここでは「ColorLED.h」です。
    ファイル名や、プログラムの中身は大文字、小文字を区別しますので注意してください。



  3. すると、中身のないファイルが開かれるので、下記の内容をコピーして貼り付けます。



ColorLED.h
#ifndef COLORLED_H
#define COLORLED_H

#include "mbed.h"

class ColorLED
{
  public:
    ColorLED();
    ColorLED(PinName r, PinName g, PinName b);
    void setColor(int r, int g, int b);
    void setColor(float r, float g, float b);
    void setPeriod(int time) { Period = time;}
    int  getPeriod() {return Period;}
    void Red(int);
    void Green(int);
    void Blue(int);
    void Red(float);
    void Green(float);
    void Blue(float);
  protected:
  private:
    PwmOut* red;
    PwmOut* blue;
    PwmOut* green;
    int Period;
};

#endif // COLORLED_H
 1 多重定義禁止
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 コンストラクタ
10 引数付コンストラクタ
11 色をintで指定する(0-4095)
12 色をfloatで指定する(0.0-1.0)
13 PWMの周期を設定する
14 PWMの周期を読む
15 赤成分のみをintで変更する(単位はms)
16 緑成分のみをintで変更する(単位はms)
17 青成分のみをintで変更する(単位はms)
18 赤成分のみをfloatで変更する(1.0が1ms)
19 緑成分のみをfloatで変更する(1.0が1ms)
20 青成分のみをfloatで変更する(1.0が1ms)
21 
22 
23 PWMオブジェクトへのポインタ
24 
25 
26 PWMの周期を保持
27 
28 
29 


上記のColorLED.hと同じようにファイル「ColorLED.cpp」を作ります。

ColorLED.cpp
#include "ColorLED.h"

ColorLED::ColorLED()
{
  //ctor
  Period=20;
  red = new PwmOut(p22);
  blue = new PwmOut(p23);
  green = new PwmOut(p24);
  red->period_ms(Period);
  green->period_ms(Period);
  blue->period_ms(Period);
}

ColorLED::ColorLED(PinName r, PinName g, PinName b)
{
  red = new PwmOut(r);
  blue = new PwmOut(g);
  green = new PwmOut(b);
  red->period_ms(Period);
  green->period_ms(Period);
  blue->period_ms(Period);
}

void ColorLED::setColor(int r, int g, int b)
{
  red->pulsewidth_us(r);
  green->pulsewidth_us(g);
  blue->pulsewidth_us(b);
}

void ColorLED::setColor(float r, float g, float b)
{
  float a=Period*1000;
  red->pulsewidth_us(r*a);
  green->pulsewidth_us(g*a);
  blue->pulsewidth_us(b*a);
 }
void ColorLED::Red(int r)
{
  red->pulsewidth_ms(r);
}
void ColorLED::Green(int g)
{
  green->pulsewidth_ms(g);
}
void ColorLED::Blue(int b)
{
  blue->pulsewidth_ms(b);
}
void ColorLED::Red(float r)
{
  red->pulsewidth_us(r*1000);
}
void ColorLED::Green(float g)
{
  green->pulsewidth_us(g*1000);
}
void ColorLED::Blue(float b)
{
  blue->pulsewidth_us(b*1000);
}
 1 
 2 
 3 引数なしコンストラクタ
 4 
 5 ctorはconstructorの意味
 6 PWMの周期は20ms
 7 赤はp22
 8 青はp23
 9 緑はp24
10 
11 
12 
13 
14 
15 引数付きコンストラクタ
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 色を整数で設定する
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50
51
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 

main.cppは始めから、サンプルプログラムが入っているので中身を上書きするだけです。

main.cpp
#include "mbed.h"
#include <math.h>
#include "ColorLED.h"
#ifndef M_PI
#define M_PI 3.14159265f
#endif
ColorLED ColLED = ColorLED();

int main()
{
  float y=2*M_PI/3.0;
  while(true)
  {
    for(float p = 0.0f; p < M_PI*2.0f; p += 0.1f)
    {
      ColLED.setColor((cosf(p)+1)/2,(cosf(p+y)+1)/2,
          (cosf(p+y*2)+1)/2);
      wait(0.1);
    }
  }
}
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 

コンパイルしてmbedに転送して実行してみましょう。

カラーセンサーと連動させる

カラーコピー