カラー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 |
メインプログラム(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 |
メインプログラム(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 |
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.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 | |
---|---|
#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 |