LED bus driver on any GPIO pin for addressable RGB LEDs (like NeoPixels or other WS2812 based LEDs)
LEDBus.h@0:1e68c70236a4, 2016-05-10 (annotated)
- Committer:
- koengroener
- Date:
- Tue May 10 20:07:28 2016 +0000
- Revision:
- 0:1e68c70236a4
- Child:
- 2:735bb1b9cfc2
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
koengroener | 0:1e68c70236a4 | 1 | #ifndef _LED_BUS_H_ |
koengroener | 0:1e68c70236a4 | 2 | #define _LED_BUS_H_ |
koengroener | 0:1e68c70236a4 | 3 | |
koengroener | 0:1e68c70236a4 | 4 | #include "mbed.h" |
koengroener | 0:1e68c70236a4 | 5 | |
koengroener | 0:1e68c70236a4 | 6 | #define MICRO_SECOND 1000000.f |
koengroener | 0:1e68c70236a4 | 7 | |
koengroener | 0:1e68c70236a4 | 8 | /** |
koengroener | 0:1e68c70236a4 | 9 | RGB Color |
koengroener | 0:1e68c70236a4 | 10 | */ |
koengroener | 0:1e68c70236a4 | 11 | struct Color { |
koengroener | 0:1e68c70236a4 | 12 | |
koengroener | 0:1e68c70236a4 | 13 | /** |
koengroener | 0:1e68c70236a4 | 14 | Constructor with rgb initializing |
koengroener | 0:1e68c70236a4 | 15 | |
koengroener | 0:1e68c70236a4 | 16 | @param r - the red byte |
koengroener | 0:1e68c70236a4 | 17 | @param g - the green byte |
koengroener | 0:1e68c70236a4 | 18 | @param b - the blue byte |
koengroener | 0:1e68c70236a4 | 19 | */ |
koengroener | 0:1e68c70236a4 | 20 | Color(uint8_t r, uint8_t g, uint8_t b) { |
koengroener | 0:1e68c70236a4 | 21 | red = r; |
koengroener | 0:1e68c70236a4 | 22 | green = g; |
koengroener | 0:1e68c70236a4 | 23 | blue = b; |
koengroener | 0:1e68c70236a4 | 24 | } |
koengroener | 0:1e68c70236a4 | 25 | |
koengroener | 0:1e68c70236a4 | 26 | /** |
koengroener | 0:1e68c70236a4 | 27 | Default constructor |
koengroener | 0:1e68c70236a4 | 28 | */ |
koengroener | 0:1e68c70236a4 | 29 | Color() { |
koengroener | 0:1e68c70236a4 | 30 | } |
koengroener | 0:1e68c70236a4 | 31 | |
koengroener | 0:1e68c70236a4 | 32 | /** |
koengroener | 0:1e68c70236a4 | 33 | Red byte |
koengroener | 0:1e68c70236a4 | 34 | */ |
koengroener | 0:1e68c70236a4 | 35 | uint8_t red; |
koengroener | 0:1e68c70236a4 | 36 | |
koengroener | 0:1e68c70236a4 | 37 | /** |
koengroener | 0:1e68c70236a4 | 38 | Green byte |
koengroener | 0:1e68c70236a4 | 39 | */ |
koengroener | 0:1e68c70236a4 | 40 | uint8_t green; |
koengroener | 0:1e68c70236a4 | 41 | |
koengroener | 0:1e68c70236a4 | 42 | /** |
koengroener | 0:1e68c70236a4 | 43 | Blue byte |
koengroener | 0:1e68c70236a4 | 44 | */ |
koengroener | 0:1e68c70236a4 | 45 | uint8_t blue; |
koengroener | 0:1e68c70236a4 | 46 | }; |
koengroener | 0:1e68c70236a4 | 47 | |
koengroener | 0:1e68c70236a4 | 48 | /** |
koengroener | 0:1e68c70236a4 | 49 | Callback method, supplying a Color struct to edit and the led index |
koengroener | 0:1e68c70236a4 | 50 | */ |
koengroener | 0:1e68c70236a4 | 51 | typedef void (*ColorGenerator)(Color* out, uint32_t index); |
koengroener | 0:1e68c70236a4 | 52 | |
koengroener | 0:1e68c70236a4 | 53 | /** |
koengroener | 0:1e68c70236a4 | 54 | Order of r, g and b bytes |
koengroener | 0:1e68c70236a4 | 55 | */ |
koengroener | 0:1e68c70236a4 | 56 | enum ByteOrder { |
koengroener | 0:1e68c70236a4 | 57 | RGB, |
koengroener | 0:1e68c70236a4 | 58 | RBG, |
koengroener | 0:1e68c70236a4 | 59 | GRB, |
koengroener | 0:1e68c70236a4 | 60 | GBR, |
koengroener | 0:1e68c70236a4 | 61 | BRG, |
koengroener | 0:1e68c70236a4 | 62 | BGR, |
koengroener | 0:1e68c70236a4 | 63 | }; |
koengroener | 0:1e68c70236a4 | 64 | |
koengroener | 0:1e68c70236a4 | 65 | /** |
koengroener | 0:1e68c70236a4 | 66 | LEDBus |
koengroener | 0:1e68c70236a4 | 67 | */ |
koengroener | 0:1e68c70236a4 | 68 | class LEDBus |
koengroener | 0:1e68c70236a4 | 69 | { |
koengroener | 0:1e68c70236a4 | 70 | |
koengroener | 0:1e68c70236a4 | 71 | private: |
koengroener | 0:1e68c70236a4 | 72 | DigitalOut _wire; |
koengroener | 0:1e68c70236a4 | 73 | ByteOrder _byteOrder; |
koengroener | 0:1e68c70236a4 | 74 | |
koengroener | 0:1e68c70236a4 | 75 | unsigned int _delayT1H, _delayT0H, _delayT1L, _delayT0L, _delayReset; |
koengroener | 0:1e68c70236a4 | 76 | |
koengroener | 0:1e68c70236a4 | 77 | void write(uint8_t byte); |
koengroener | 0:1e68c70236a4 | 78 | void delay(unsigned int ticks); |
koengroener | 0:1e68c70236a4 | 79 | protected: |
koengroener | 0:1e68c70236a4 | 80 | |
koengroener | 0:1e68c70236a4 | 81 | public: |
koengroener | 0:1e68c70236a4 | 82 | |
koengroener | 0:1e68c70236a4 | 83 | |
koengroener | 0:1e68c70236a4 | 84 | /** |
koengroener | 0:1e68c70236a4 | 85 | * Initializes the addressable led bus |
koengroener | 0:1e68c70236a4 | 86 | * |
koengroener | 0:1e68c70236a4 | 87 | * @param wirePin - The output pin on wich the addressable leds are connected |
koengroener | 0:1e68c70236a4 | 88 | * @param byteOrder - The order in wich the r, g and b bytes are expected |
koengroener | 0:1e68c70236a4 | 89 | * @param t0h_us - T0H as found in the addressable led datasheet. The duration, in microseconds, the pin will stay high for sending a 0 bit |
koengroener | 0:1e68c70236a4 | 90 | * @param t0l_us - T0L as found in the addressable led datasheet. The duration, in microseconds, the pin will stay low for sending a 0 bit |
koengroener | 0:1e68c70236a4 | 91 | * @param t1h_us - T1H as found in the addressable led datasheet. The duration, in microseconds, the pin will stay high for sending a 1 bit |
koengroener | 0:1e68c70236a4 | 92 | * @param t1l_us - T1L as found in the addressable led datasheet. The duration, in microseconds, the pin will stay low for sending a 1 bit |
koengroener | 0:1e68c70236a4 | 93 | * @param tReset_us - TReset as found in the addressable led datasheet. The duration, in microsecond, the pin will stay low for sending a reset command, |
koengroener | 0:1e68c70236a4 | 94 | */ |
koengroener | 0:1e68c70236a4 | 95 | LEDBus(PinName wirePin, ByteOrder byteOrder, float t0h_us, float t0l_us, float t1h_us, float t1l_us, float tReset_us); |
koengroener | 0:1e68c70236a4 | 96 | |
koengroener | 0:1e68c70236a4 | 97 | ~LEDBus(); |
koengroener | 0:1e68c70236a4 | 98 | |
koengroener | 0:1e68c70236a4 | 99 | /** |
koengroener | 0:1e68c70236a4 | 100 | * Writes the byte buffer directly to the addressable leds |
koengroener | 0:1e68c70236a4 | 101 | */ |
koengroener | 0:1e68c70236a4 | 102 | void write(uint8_t* buffer, unsigned int size); |
koengroener | 0:1e68c70236a4 | 103 | |
koengroener | 0:1e68c70236a4 | 104 | /** |
koengroener | 0:1e68c70236a4 | 105 | * Writes the color buffer translated to bytes directly to the addressable leds |
koengroener | 0:1e68c70236a4 | 106 | * @code |
koengroener | 0:1e68c70236a4 | 107 | * // The led bus control class. |
koengroener | 0:1e68c70236a4 | 108 | * LEDBus ledBus(p9, RGB, 0.5f, 2.0f, 1.25f, 1.25f, 50.0f); |
koengroener | 0:1e68c70236a4 | 109 | * |
koengroener | 0:1e68c70236a4 | 110 | * Color* red = new Color(255,0,0); |
koengroener | 0:1e68c70236a4 | 111 | * Color* green = new Color(0,255,0); |
koengroener | 0:1e68c70236a4 | 112 | * Color* blue = new Color(0,0,255); |
koengroener | 0:1e68c70236a4 | 113 | * |
koengroener | 0:1e68c70236a4 | 114 | * Color* buffer[] = { red, green, blue }; |
koengroener | 0:1e68c70236a4 | 115 | * |
koengroener | 0:1e68c70236a4 | 116 | * ledBus.write(buffer, 3); |
koengroener | 0:1e68c70236a4 | 117 | * @endcode |
koengroener | 0:1e68c70236a4 | 118 | */ |
koengroener | 0:1e68c70236a4 | 119 | void write(Color** buffer, unsigned int size); |
koengroener | 0:1e68c70236a4 | 120 | |
koengroener | 0:1e68c70236a4 | 121 | /** |
koengroener | 0:1e68c70236a4 | 122 | * Updates the leds by using a color generator callback method to generate a color for each led |
koengroener | 0:1e68c70236a4 | 123 | * @code |
koengroener | 0:1e68c70236a4 | 124 | * int offset = 0; |
koengroener | 0:1e68c70236a4 | 125 | * |
koengroener | 0:1e68c70236a4 | 126 | * // Sample generator: |
koengroener | 0:1e68c70236a4 | 127 | * void generate(Color* color, uint32_t index) |
koengroener | 0:1e68c70236a4 | 128 | * { |
koengroener | 0:1e68c70236a4 | 129 | * switch((index+offset)%3) { |
koengroener | 0:1e68c70236a4 | 130 | * case 0: |
koengroener | 0:1e68c70236a4 | 131 | * color->red = 255; |
koengroener | 0:1e68c70236a4 | 132 | * break; |
koengroener | 0:1e68c70236a4 | 133 | * case 1: |
koengroener | 0:1e68c70236a4 | 134 | * color->green = 255; |
koengroener | 0:1e68c70236a4 | 135 | * break; |
koengroener | 0:1e68c70236a4 | 136 | * case 2: |
koengroener | 0:1e68c70236a4 | 137 | * color->blue = 255; |
koengroener | 0:1e68c70236a4 | 138 | * break; |
koengroener | 0:1e68c70236a4 | 139 | * } |
koengroener | 0:1e68c70236a4 | 140 | * } |
koengroener | 0:1e68c70236a4 | 141 | * |
koengroener | 0:1e68c70236a4 | 142 | * int main() |
koengroener | 0:1e68c70236a4 | 143 | * { |
koengroener | 0:1e68c70236a4 | 144 | * // The led bus control class. |
koengroener | 0:1e68c70236a4 | 145 | * LEDBus ledBus(p9, RGB, 0.35f, 1.36f, 1.36f, 0.35f, 50.0f); |
koengroener | 0:1e68c70236a4 | 146 | * |
koengroener | 0:1e68c70236a4 | 147 | * while (1) { |
koengroener | 0:1e68c70236a4 | 148 | * ledBus.update(generate, 3); |
koengroener | 0:1e68c70236a4 | 149 | * offset++; |
koengroener | 0:1e68c70236a4 | 150 | * wait_ms(250); |
koengroener | 0:1e68c70236a4 | 151 | * } |
koengroener | 0:1e68c70236a4 | 152 | * } |
koengroener | 0:1e68c70236a4 | 153 | * @endcode |
koengroener | 0:1e68c70236a4 | 154 | */ |
koengroener | 0:1e68c70236a4 | 155 | void update(ColorGenerator generator, unsigned int numberOfLEDs); |
koengroener | 0:1e68c70236a4 | 156 | |
koengroener | 0:1e68c70236a4 | 157 | }; |
koengroener | 0:1e68c70236a4 | 158 | |
koengroener | 0:1e68c70236a4 | 159 | #endif |