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

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?

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