
Make: Tokyo Meeting 06 (MTM06), standalone LED blinking demo (using PWM) Make: Tokyo Meeting 06 (MTM06)でNXPスタッフの胸(腹?)で光っていたmbed.このコードを使用していました
main.cpp@0:1060d9f7c8f7, 2010-11-21 (annotated)
- Committer:
- okano
- Date:
- Sun Nov 21 06:47:36 2010 +0000
- Revision:
- 0:1060d9f7c8f7
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okano | 0:1060d9f7c8f7 | 1 | #include "mbed.h" |
okano | 0:1060d9f7c8f7 | 2 | |
okano | 0:1060d9f7c8f7 | 3 | PwmOut led1(LED1); |
okano | 0:1060d9f7c8f7 | 4 | PwmOut led2(LED2); |
okano | 0:1060d9f7c8f7 | 5 | PwmOut led3(LED3); |
okano | 0:1060d9f7c8f7 | 6 | PwmOut led4(LED4); |
okano | 0:1060d9f7c8f7 | 7 | |
okano | 0:1060d9f7c8f7 | 8 | PwmOut led[ 4 ] = {led4, led3, led2, led1 }; |
okano | 0:1060d9f7c8f7 | 9 | |
okano | 0:1060d9f7c8f7 | 10 | #define UPDATE_RATE 100.0 |
okano | 0:1060d9f7c8f7 | 11 | |
okano | 0:1060d9f7c8f7 | 12 | class Blinker { |
okano | 0:1060d9f7c8f7 | 13 | public: |
okano | 0:1060d9f7c8f7 | 14 | |
okano | 0:1060d9f7c8f7 | 15 | typedef enum { |
okano | 0:1060d9f7c8f7 | 16 | OFF, |
okano | 0:1060d9f7c8f7 | 17 | ON, |
okano | 0:1060d9f7c8f7 | 18 | STAY, |
okano | 0:1060d9f7c8f7 | 19 | UP, |
okano | 0:1060d9f7c8f7 | 20 | DOWN, |
okano | 0:1060d9f7c8f7 | 21 | UPDOWN |
okano | 0:1060d9f7c8f7 | 22 | } Mode; |
okano | 0:1060d9f7c8f7 | 23 | |
okano | 0:1060d9f7c8f7 | 24 | Blinker( PinName pin ) : |
okano | 0:1060d9f7c8f7 | 25 | output( pin ), |
okano | 0:1060d9f7c8f7 | 26 | mode( UPDOWN ), |
okano | 0:1060d9f7c8f7 | 27 | state( false ), |
okano | 0:1060d9f7c8f7 | 28 | intensity( 0.0 ), |
okano | 0:1060d9f7c8f7 | 29 | rate( 1.0 / UPDATE_RATE ), |
okano | 0:1060d9f7c8f7 | 30 | direction( true ) { |
okano | 0:1060d9f7c8f7 | 31 | t.attach( this, &Blinker::blinker_maintain, 1.0 / UPDATE_RATE ); |
okano | 0:1060d9f7c8f7 | 32 | output.period_ms( 1 ); |
okano | 0:1060d9f7c8f7 | 33 | output = intensity; |
okano | 0:1060d9f7c8f7 | 34 | } |
okano | 0:1060d9f7c8f7 | 35 | |
okano | 0:1060d9f7c8f7 | 36 | void start( void ) { |
okano | 0:1060d9f7c8f7 | 37 | state = true; |
okano | 0:1060d9f7c8f7 | 38 | } |
okano | 0:1060d9f7c8f7 | 39 | |
okano | 0:1060d9f7c8f7 | 40 | void stop( void ) { |
okano | 0:1060d9f7c8f7 | 41 | state = false; |
okano | 0:1060d9f7c8f7 | 42 | } |
okano | 0:1060d9f7c8f7 | 43 | |
okano | 0:1060d9f7c8f7 | 44 | void set_mode( Mode m ) { |
okano | 0:1060d9f7c8f7 | 45 | mode = m; |
okano | 0:1060d9f7c8f7 | 46 | } |
okano | 0:1060d9f7c8f7 | 47 | |
okano | 0:1060d9f7c8f7 | 48 | void set_initial_intensity( float v ) { |
okano | 0:1060d9f7c8f7 | 49 | intensity = v; |
okano | 0:1060d9f7c8f7 | 50 | } |
okano | 0:1060d9f7c8f7 | 51 | |
okano | 0:1060d9f7c8f7 | 52 | void set_frequency( float f ) { |
okano | 0:1060d9f7c8f7 | 53 | rate = f / UPDATE_RATE; |
okano | 0:1060d9f7c8f7 | 54 | } |
okano | 0:1060d9f7c8f7 | 55 | |
okano | 0:1060d9f7c8f7 | 56 | private: |
okano | 0:1060d9f7c8f7 | 57 | void blinker_maintain( void ) { |
okano | 0:1060d9f7c8f7 | 58 | |
okano | 0:1060d9f7c8f7 | 59 | if ( OFF == state ) |
okano | 0:1060d9f7c8f7 | 60 | return; |
okano | 0:1060d9f7c8f7 | 61 | |
okano | 0:1060d9f7c8f7 | 62 | switch ( mode ) { |
okano | 0:1060d9f7c8f7 | 63 | case OFF : |
okano | 0:1060d9f7c8f7 | 64 | intensity = 0.0; |
okano | 0:1060d9f7c8f7 | 65 | break; |
okano | 0:1060d9f7c8f7 | 66 | case ON : |
okano | 0:1060d9f7c8f7 | 67 | intensity = 1.0; |
okano | 0:1060d9f7c8f7 | 68 | break; |
okano | 0:1060d9f7c8f7 | 69 | case STAY : |
okano | 0:1060d9f7c8f7 | 70 | break; |
okano | 0:1060d9f7c8f7 | 71 | case UP : |
okano | 0:1060d9f7c8f7 | 72 | intensity += rate; |
okano | 0:1060d9f7c8f7 | 73 | intensity = (1.0 < intensity) ? 0.0 : intensity; |
okano | 0:1060d9f7c8f7 | 74 | break; |
okano | 0:1060d9f7c8f7 | 75 | case DOWN : |
okano | 0:1060d9f7c8f7 | 76 | intensity -= rate; |
okano | 0:1060d9f7c8f7 | 77 | intensity = (intensity < 0.0) ? 1.0 : intensity; |
okano | 0:1060d9f7c8f7 | 78 | break; |
okano | 0:1060d9f7c8f7 | 79 | case UPDOWN : |
okano | 0:1060d9f7c8f7 | 80 | direction = (intensity <= 0.0) ? true : direction; |
okano | 0:1060d9f7c8f7 | 81 | direction = (1.0 <= intensity) ? false : direction; |
okano | 0:1060d9f7c8f7 | 82 | intensity += direction ? (rate * 2.0) : -(rate * 2.0); |
okano | 0:1060d9f7c8f7 | 83 | break; |
okano | 0:1060d9f7c8f7 | 84 | default : |
okano | 0:1060d9f7c8f7 | 85 | break; |
okano | 0:1060d9f7c8f7 | 86 | } |
okano | 0:1060d9f7c8f7 | 87 | |
okano | 0:1060d9f7c8f7 | 88 | output = intensity * intensity; |
okano | 0:1060d9f7c8f7 | 89 | } |
okano | 0:1060d9f7c8f7 | 90 | |
okano | 0:1060d9f7c8f7 | 91 | PwmOut output; |
okano | 0:1060d9f7c8f7 | 92 | Ticker t; |
okano | 0:1060d9f7c8f7 | 93 | |
okano | 0:1060d9f7c8f7 | 94 | Mode mode; |
okano | 0:1060d9f7c8f7 | 95 | int state; |
okano | 0:1060d9f7c8f7 | 96 | float intensity; |
okano | 0:1060d9f7c8f7 | 97 | float rate; |
okano | 0:1060d9f7c8f7 | 98 | float direction; |
okano | 0:1060d9f7c8f7 | 99 | }; |
okano | 0:1060d9f7c8f7 | 100 | |
okano | 0:1060d9f7c8f7 | 101 | //Blinker b( LED1 ); |
okano | 0:1060d9f7c8f7 | 102 | Blinker b[ 4 ] = { LED4, LED3, LED2, LED1 }; |
okano | 0:1060d9f7c8f7 | 103 | |
okano | 0:1060d9f7c8f7 | 104 | |
okano | 0:1060d9f7c8f7 | 105 | int main() { |
okano | 0:1060d9f7c8f7 | 106 | |
okano | 0:1060d9f7c8f7 | 107 | |
okano | 0:1060d9f7c8f7 | 108 | for ( int i = 0; i < 4; i++ ) { |
okano | 0:1060d9f7c8f7 | 109 | b[ i ].set_frequency( 2 ); |
okano | 0:1060d9f7c8f7 | 110 | b[i].start(); |
okano | 0:1060d9f7c8f7 | 111 | } |
okano | 0:1060d9f7c8f7 | 112 | |
okano | 0:1060d9f7c8f7 | 113 | while ( 1 ) { |
okano | 0:1060d9f7c8f7 | 114 | |
okano | 0:1060d9f7c8f7 | 115 | for ( int i = 0; i < 4; i++ ) { |
okano | 0:1060d9f7c8f7 | 116 | b[ i ].set_mode( Blinker::DOWN ); |
okano | 0:1060d9f7c8f7 | 117 | b[ i ].set_initial_intensity( 0.25 * (float)i ); |
okano | 0:1060d9f7c8f7 | 118 | } |
okano | 0:1060d9f7c8f7 | 119 | |
okano | 0:1060d9f7c8f7 | 120 | wait( 2.0 ); |
okano | 0:1060d9f7c8f7 | 121 | |
okano | 0:1060d9f7c8f7 | 122 | for ( int n = 0; n < 40; n++ ) { |
okano | 0:1060d9f7c8f7 | 123 | for ( int i = 0; i < 4; i++ ) { |
okano | 0:1060d9f7c8f7 | 124 | b[ i ].set_mode( rand() & 0x1 ? Blinker::ON : Blinker::OFF ); |
okano | 0:1060d9f7c8f7 | 125 | } |
okano | 0:1060d9f7c8f7 | 126 | wait( 0.05 ); |
okano | 0:1060d9f7c8f7 | 127 | } |
okano | 0:1060d9f7c8f7 | 128 | |
okano | 0:1060d9f7c8f7 | 129 | for ( int i = 0; i < 4; i++ ) { |
okano | 0:1060d9f7c8f7 | 130 | b[ i ].set_mode( Blinker::DOWN ); |
okano | 0:1060d9f7c8f7 | 131 | b[ i ].set_initial_intensity( 1.0 - (0.25 * (float)i) ); |
okano | 0:1060d9f7c8f7 | 132 | } |
okano | 0:1060d9f7c8f7 | 133 | |
okano | 0:1060d9f7c8f7 | 134 | wait( 2.0 ); |
okano | 0:1060d9f7c8f7 | 135 | |
okano | 0:1060d9f7c8f7 | 136 | for ( int i = 0; i < 4; i++ ) { |
okano | 0:1060d9f7c8f7 | 137 | b[ i ].set_mode( Blinker::UPDOWN ); |
okano | 0:1060d9f7c8f7 | 138 | b[ i ].set_initial_intensity( 0 ); |
okano | 0:1060d9f7c8f7 | 139 | } |
okano | 0:1060d9f7c8f7 | 140 | |
okano | 0:1060d9f7c8f7 | 141 | wait( 2.0 ); |
okano | 0:1060d9f7c8f7 | 142 | |
okano | 0:1060d9f7c8f7 | 143 | for ( int i = 0; i < 4; i++ ) { |
okano | 0:1060d9f7c8f7 | 144 | b[ i ].set_mode( Blinker::UPDOWN ); |
okano | 0:1060d9f7c8f7 | 145 | b[ i ].set_initial_intensity( (i & 0x1) ? 1 : 0 ); |
okano | 0:1060d9f7c8f7 | 146 | } |
okano | 0:1060d9f7c8f7 | 147 | |
okano | 0:1060d9f7c8f7 | 148 | wait( 2.0 ); |
okano | 0:1060d9f7c8f7 | 149 | |
okano | 0:1060d9f7c8f7 | 150 | } |
okano | 0:1060d9f7c8f7 | 151 | |
okano | 0:1060d9f7c8f7 | 152 | } |