LED bus driver on any GPIO pin for addressable RGB LEDs (like NeoPixels or other WS2812 based LEDs)

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?

UserRevisionLine numberNew 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