LED bus driver on any GPIO pin for addressable RGB LEDs (like NeoPixels or other WS2812 based LEDs)
LEDBus.h@3:67e68c46daef, 2017-06-14 (annotated)
- Committer:
- koengroener
- Date:
- Wed Jun 14 20:37:31 2017 +0000
- Revision:
- 3:67e68c46daef
- Parent:
- 2:735bb1b9cfc2
Added LEDArray class, for a more simplistic way of communcation with the LED strip
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
koengroener | 2:735bb1b9cfc2 | 1 | #ifndef _LED_BUS_PIN_H_ |
koengroener | 2:735bb1b9cfc2 | 2 | #define _LED_BUS_PIN_H_ |
koengroener | 0:1e68c70236a4 | 3 | |
koengroener | 0:1e68c70236a4 | 4 | #include "mbed.h" |
koengroener | 2:735bb1b9cfc2 | 5 | #include "Color.h" |
koengroener | 0:1e68c70236a4 | 6 | |
koengroener | 0:1e68c70236a4 | 7 | #define MICRO_SECOND 1000000.f |
koengroener | 0:1e68c70236a4 | 8 | |
koengroener | 0:1e68c70236a4 | 9 | |
koengroener | 0:1e68c70236a4 | 10 | |
koengroener | 0:1e68c70236a4 | 11 | /** |
koengroener | 0:1e68c70236a4 | 12 | Callback method, supplying a Color struct to edit and the led index |
koengroener | 0:1e68c70236a4 | 13 | */ |
koengroener | 0:1e68c70236a4 | 14 | typedef void (*ColorGenerator)(Color* out, uint32_t index); |
koengroener | 0:1e68c70236a4 | 15 | |
koengroener | 0:1e68c70236a4 | 16 | |
koengroener | 0:1e68c70236a4 | 17 | /** |
koengroener | 3:67e68c46daef | 18 | The LEDBus class allows for 'low' level communication to an addressable LED bus/strip |
koengroener | 0:1e68c70236a4 | 19 | */ |
koengroener | 0:1e68c70236a4 | 20 | class LEDBus |
koengroener | 0:1e68c70236a4 | 21 | { |
koengroener | 0:1e68c70236a4 | 22 | |
koengroener | 0:1e68c70236a4 | 23 | private: |
koengroener | 0:1e68c70236a4 | 24 | DigitalOut _wire; |
koengroener | 2:735bb1b9cfc2 | 25 | ColorByteOrder _byteOrder; |
koengroener | 0:1e68c70236a4 | 26 | |
koengroener | 0:1e68c70236a4 | 27 | unsigned int _delayT1H, _delayT0H, _delayT1L, _delayT0L, _delayReset; |
koengroener | 0:1e68c70236a4 | 28 | |
koengroener | 0:1e68c70236a4 | 29 | void write(uint8_t byte); |
koengroener | 0:1e68c70236a4 | 30 | void delay(unsigned int ticks); |
koengroener | 0:1e68c70236a4 | 31 | protected: |
koengroener | 0:1e68c70236a4 | 32 | |
koengroener | 0:1e68c70236a4 | 33 | public: |
koengroener | 0:1e68c70236a4 | 34 | |
koengroener | 0:1e68c70236a4 | 35 | |
koengroener | 0:1e68c70236a4 | 36 | /** |
koengroener | 0:1e68c70236a4 | 37 | * Initializes the addressable led bus |
koengroener | 0:1e68c70236a4 | 38 | * |
koengroener | 0:1e68c70236a4 | 39 | * @param wirePin - The output pin on wich the addressable leds are connected |
koengroener | 0:1e68c70236a4 | 40 | * @param byteOrder - The order in wich the r, g and b bytes are expected |
koengroener | 0:1e68c70236a4 | 41 | * @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 | 42 | * @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 | 43 | * @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 | 44 | * @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 | 45 | * @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 | 46 | */ |
koengroener | 2:735bb1b9cfc2 | 47 | LEDBus(PinName wirePin, ColorByteOrder byteOrder, float t0h_us, float t0l_us, float t1h_us, float t1l_us, float tReset_us); |
koengroener | 0:1e68c70236a4 | 48 | |
koengroener | 0:1e68c70236a4 | 49 | ~LEDBus(); |
koengroener | 0:1e68c70236a4 | 50 | |
koengroener | 0:1e68c70236a4 | 51 | /** |
koengroener | 0:1e68c70236a4 | 52 | * Writes the byte buffer directly to the addressable leds |
koengroener | 0:1e68c70236a4 | 53 | */ |
koengroener | 0:1e68c70236a4 | 54 | void write(uint8_t* buffer, unsigned int size); |
koengroener | 0:1e68c70236a4 | 55 | |
koengroener | 0:1e68c70236a4 | 56 | /** |
koengroener | 0:1e68c70236a4 | 57 | * Writes the color buffer translated to bytes directly to the addressable leds |
koengroener | 0:1e68c70236a4 | 58 | * @code |
koengroener | 0:1e68c70236a4 | 59 | * // The led bus control class. |
koengroener | 0:1e68c70236a4 | 60 | * LEDBus ledBus(p9, RGB, 0.5f, 2.0f, 1.25f, 1.25f, 50.0f); |
koengroener | 0:1e68c70236a4 | 61 | * |
koengroener | 2:735bb1b9cfc2 | 62 | * Color* led1 = new Color(255,0,0); |
koengroener | 2:735bb1b9cfc2 | 63 | * Color* led2 = new Color(0,255,0); |
koengroener | 2:735bb1b9cfc2 | 64 | * Color* led3 = new Color(0,0,255); |
koengroener | 0:1e68c70236a4 | 65 | * |
koengroener | 2:735bb1b9cfc2 | 66 | * Color* buffer[] = { led1, led2, led3 }; |
koengroener | 0:1e68c70236a4 | 67 | * |
koengroener | 0:1e68c70236a4 | 68 | * ledBus.write(buffer, 3); |
koengroener | 0:1e68c70236a4 | 69 | * @endcode |
koengroener | 0:1e68c70236a4 | 70 | */ |
koengroener | 0:1e68c70236a4 | 71 | void write(Color** buffer, unsigned int size); |
koengroener | 0:1e68c70236a4 | 72 | |
koengroener | 0:1e68c70236a4 | 73 | /** |
koengroener | 0:1e68c70236a4 | 74 | * Updates the leds by using a color generator callback method to generate a color for each led |
koengroener | 0:1e68c70236a4 | 75 | * @code |
koengroener | 0:1e68c70236a4 | 76 | * int offset = 0; |
koengroener | 0:1e68c70236a4 | 77 | * |
koengroener | 0:1e68c70236a4 | 78 | * // Sample generator: |
koengroener | 0:1e68c70236a4 | 79 | * void generate(Color* color, uint32_t index) |
koengroener | 0:1e68c70236a4 | 80 | * { |
koengroener | 0:1e68c70236a4 | 81 | * switch((index+offset)%3) { |
koengroener | 0:1e68c70236a4 | 82 | * case 0: |
koengroener | 0:1e68c70236a4 | 83 | * color->red = 255; |
koengroener | 0:1e68c70236a4 | 84 | * break; |
koengroener | 0:1e68c70236a4 | 85 | * case 1: |
koengroener | 0:1e68c70236a4 | 86 | * color->green = 255; |
koengroener | 0:1e68c70236a4 | 87 | * break; |
koengroener | 0:1e68c70236a4 | 88 | * case 2: |
koengroener | 0:1e68c70236a4 | 89 | * color->blue = 255; |
koengroener | 0:1e68c70236a4 | 90 | * break; |
koengroener | 0:1e68c70236a4 | 91 | * } |
koengroener | 0:1e68c70236a4 | 92 | * } |
koengroener | 0:1e68c70236a4 | 93 | * |
koengroener | 0:1e68c70236a4 | 94 | * int main() |
koengroener | 0:1e68c70236a4 | 95 | * { |
koengroener | 0:1e68c70236a4 | 96 | * // The led bus control class. |
koengroener | 0:1e68c70236a4 | 97 | * LEDBus ledBus(p9, RGB, 0.35f, 1.36f, 1.36f, 0.35f, 50.0f); |
koengroener | 0:1e68c70236a4 | 98 | * |
koengroener | 0:1e68c70236a4 | 99 | * while (1) { |
koengroener | 0:1e68c70236a4 | 100 | * ledBus.update(generate, 3); |
koengroener | 0:1e68c70236a4 | 101 | * offset++; |
koengroener | 0:1e68c70236a4 | 102 | * wait_ms(250); |
koengroener | 0:1e68c70236a4 | 103 | * } |
koengroener | 0:1e68c70236a4 | 104 | * } |
koengroener | 0:1e68c70236a4 | 105 | * @endcode |
koengroener | 0:1e68c70236a4 | 106 | */ |
koengroener | 0:1e68c70236a4 | 107 | void update(ColorGenerator generator, unsigned int numberOfLEDs); |
koengroener | 0:1e68c70236a4 | 108 | |
koengroener | 0:1e68c70236a4 | 109 | }; |
koengroener | 0:1e68c70236a4 | 110 | |
koengroener | 0:1e68c70236a4 | 111 | #endif |