Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: WS2812_out_of_specification_demo
Revision 6:583738208b96, committed 2020-03-20
- Comitter:
- kenjiArai
- Date:
- Fri Mar 20 06:46:11 2020 +0000
- Parent:
- 5:a07522fe36d4
- Commit message:
- Reconsidered input pin and NC pin for SPI. Modified several functions interface and its contents.
Changed in this revision
| WS2812.cpp | Show annotated file Show diff for this revision Revisions of this file |
| WS2812.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/WS2812.cpp Mon Aug 18 13:25:57 2014 +0000
+++ b/WS2812.cpp Fri Mar 20 06:46:11 2020 +0000
@@ -1,20 +1,21 @@
+/*
+ Modified by Kenji Arai / JH1PJL
+ March 20th, 2020
+ */
+
#include "WS2812.h"
-WS2812::WS2812(PinName d, int size) : __spi(d, NC, NC)
+WS2812::WS2812(PinName mosi, PinName miso, PinName sclk, int size)
+ : __spi(mosi, miso, sclk)
{
__size = size;
__spi.format(SPIBPF,0);
__spi.frequency(SPICLK);
- __use_II = 0; // 0=off,1=use global,2=per pixel
- __II = 0xFF; // set global intensity to full
+ __mode = OFF; // 0=off,1=use global,2=per pixel
+ __br = 0xFF; // set global Brightness to full
}
-
-WS2812::~WS2812()
-{
-
-}
-
+WS2812::~WS2812() {;}
void WS2812::write(int buf[])
{
@@ -24,100 +25,80 @@
}
}
-
void WS2812::write_offsets(int buf[], int r_offset, int g_offset, int b_offset)
{
// for each of the data points in the buffer
for (int i = 0; i < __size ; i++) {
-
- unsigned int argb = 0x0;
- // index and extract colour fields from IIRRGGBB buf[]
+ int color_one = 0x0;
+ // index and extract color fields from IIRRGGBB buf[]
// 0 = blue, 1 = green, 2 = red, 3 = brightness
- argb |= (buf[(i+b_offset)%__size] & 0x000000FF);
- argb |= ((buf[(i+g_offset)%__size] & 0x0000FF00));
- argb |= ((buf[(i+r_offset)%__size] & 0x00FF0000));
- argb |= (buf[i] & 0xFF000000);
- __write(argb);
+ color_one |= (buf[(i+b_offset)%__size] & 0x000000ff);
+ color_one |= (buf[(i+g_offset)%__size] & 0x0000ff00);
+ color_one |= (buf[(i+r_offset)%__size] & 0x00ff0000);
+ color_one |= (buf[i] & 0xff000000);
+ __write(color_one);
}
}
-
-
-
-void WS2812::setAll(int colour)
+void WS2812::setAll(int color)
{
+ int color_one = ( __br << 24) | color;
// for each of the data points in the buffer
for (int i = 0; i < __size ; i++) {
- __write(colour);
- }
-}
-
-
-void WS2812::useII(int d)
-{
- if (d > 0) {
- __use_II = d;
- } else {
- __use_II = 0;
+ __write(color_one);
}
}
-
-void WS2812::setII(unsigned char II)
+void WS2812::set_brightness_mode(BrightnessControl mode)
{
- __II = II;
+ __mode = mode;
}
-
+void WS2812::set_brightness(unsigned char br)
+{
+ __br = br;
+}
void WS2812::__write(int color)
{
-
- // Outut format : GGRRBB
- // Inout format : IIRRGGBB
- unsigned char agrb[4] = {0x0, 0x0, 0x0, 0x0};
-
- unsigned char sf; // scaling factor for II
-
- // extract colour fields from incoming
+ // Input format(color) : GGRRBB
+ // Output format(agrb) : IIRRGGBB
+ unsigned char agrb[4];
+ unsigned char sf; // scaling factor for II
+ // extract color fields from incoming
// 0 = blue, 1 = red, 2 = green, 3 = brightness
- agrb[0] = color & 0x000000FF;
- agrb[1] = (color & 0x00FF0000) >> 16;
- agrb[2] = (color & 0x0000FF00) >> 8;
- agrb[3] = (color & 0xFF000000) >> 24;
-
- // set and intensity scaling factor (global, per pixel, none)
- if (__use_II == 1) {
- sf = __II;
- } else if (__use_II == 2) {
+ agrb[0] = (unsigned char)color;
+ agrb[1] = (unsigned char)((color & 0x00ff0000) >> 16);
+ agrb[2] = (unsigned char)((color & 0x0000ff00) >> 8);
+ agrb[3] = (unsigned char)((color & 0xff000000) >> 24);
+ // set and intensity scaling factor (global, per pixel, none = Max)
+ if ( __mode == GLOBAL) {
+ sf = __br;
+ } else if ( __mode == PER_PIXEL) {
sf = agrb[3];
} else {
- sf = 0xFF;
+ sf = 0xff;
}
-
- // Apply the scaling factor to each othe colour components
+ // Input format(agrb[4]) : IIRRGGBB
+ // Output format(agrb[3]) : RR*II, GG*II, BB*II
+ // Apply the scaling factor to each on the color components
for (int clr = 2; clr >= 0; clr--) {
- agrb[clr] = ((agrb[clr] * sf) >> 8);
+ agrb[clr] = (agrb[clr] * sf) >> 8;
}
-
- // For each colour component G,R,B
+ // For each color component G,R,B
// shift out the data 7..0, writing a SPI frame per bit
// green=2,red=1,blue=0,
- for (int clr = 2; clr >= 0; clr--) {
- for (int bit = 7 ; bit >= 0 ; bit--) {
- if (agrb[clr] & (0x1 << bit)) {
+ char bit_ptn[8] = {1, 2, 4, 8, 16, 32, 64, 128};
+ for (int32_t clr = 2; clr >= 0; clr--) {
+ unsigned char dt = agrb[clr];
+ for (int32_t bit = 7 ; bit >= 0 ; bit--) {
+ if (dt & bit_ptn[bit]) {
__spi.write(WS1);
} else {
__spi.write(WS0);
}
+ // debug purpose
+ //wait_us(30);
}
}
}
-
-
-
-
-
-
-
-
--- a/WS2812.h Mon Aug 18 13:25:57 2014 +0000
+++ b/WS2812.h Fri Mar 20 06:46:11 2020 +0000
@@ -1,19 +1,61 @@
/* Copyright (c) 2012 cstyles, MIT License
*
- * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
- * and associated documentation files (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge, publish, distribute,
- * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
*
- * The above copyright notice and this permission notice shall be included in all copies or
- * substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
- * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+/*
+ Modified by Kenji Arai / JH1PJL
+ March 20th, 2020
+
+ Original & Refrence
+ https://os.mbed.com/users/chris/code/ChrisRGB-Ring/
+ https://os.mbed.com/users/chris/code/WS2812/
+ https://os.mbed.com/users/chris/code/PixelArray/
+
+ https://os.mbed.com/users/bridadan/code/WS2812_Example/
+ https://os.mbed.com/users/bridadan/code/WS2812/
+ https://os.mbed.com/users/chris/code/PixelArray/
+
+ */
+
+/*
+ !!!!! This library does NOT follow specification value of the timing !!!!
+ https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf
+ http://akizukidenshi.com/download/ds/adafruit/WS2812B.pdf
+
+ WS2812 -> Interpretation of control timing (Not Grantee but works)
+ Specification
+ T0H 200 to 500ns
+ T1H 550 to 850ns
+ T0L 650 to 950ns
+ T1L 450 to 750ns
+ Reset 50us
+ Interpretation
+ T0H same as above
+ T1H same as above
+ T0L less than 10us
+ T1L Less than 10us
+ Reset over 50uS
+
+ Please refer following web page
+ https://wp.josh.com/2014/05/13/
+ ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/
*/
#ifndef WS2812_H
@@ -21,11 +63,29 @@
#include "mbed.h"
-#define WS1 0x38
-#define WS0 0x30
-#define SPICLK 5000000
-#define SPIBPF 6
-
+#if \
+ defined(TARGET_NUCLEO_F042K6)\
+ || defined(TARGET_NUCLEO_F334R8)\
+ || defined(TARGET_NUCLEO_F401RE)\
+ || defined(TARGET_NUCLEO_F411RE)\
+ || defined(TARGET_NUCLEO_F446RE)\
+ || defined(TARGET_NUCLEO_L053R8)\
+ || defined(TARGET_NUCLEO_L073RZ)\
+ || defined(TARGET_NUCLEO_L152RE)\
+ || defined(TARGET_NUCLEO_L476RG)
+# define WS1 0x0f
+# define WS0 0x0c
+# define SPICLK 8000000
+# define SPIBPF 4
+#elif \
+ defined(TARGET_RZ_A1H)\
+ || defined(TARGET_GR_LYCHEE)\
+ || defined(TARGET_GR_MANGO)
+# define WS1 0x0f
+# define WS0 0x0c
+# define SPICLK 5000000
+# define SPIBPF 8
+#endif
//!Library for the WS2812 RGB LED with integrated controller
/*!
@@ -34,38 +94,35 @@
class WS2812
{
public:
+ enum BrightnessControl {OFF, GLOBAL, PER_PIXEL};
+
//!Creates an instance of the class.
/*!
- Connect WS2812 address addr using SPI MOSI pins
+ Connect WS2812 using SPI MOSI pin(Only use) and MISO&SCLK(NC)
*/
- WS2812(PinName d, int size);
+ WS2812(PinName mosi, PinName miso, PinName sclk, int size);
/*!
Destroys instance.
*/
~WS2812();
- //!Reads the current temperature.
- /*!
- Reads the temperature register of the LM75B and converts it to a useable value.
- */
- void write (int buf[]);
- void write_offsets (int buf[],int r_offset=0, int g_offset=0, int b_offset=0);
- void setAll(int colour);
+ void write(int buf[]);
+ void write_offsets(int buf[], int r_offset = 0,
+ int g_offset = 0, int b_offset = 0);
+ void setAll(int color);
- void useII(int d);
- void setII(unsigned char II);
-
-
+ void set_brightness_mode(BrightnessControl mode);
+ void set_brightness(unsigned char br);
private:
+ SPI __spi;
+
+ void __write (int color);
int __size;
- unsigned char __II;
- int __use_II;
- SPI __spi;
- void __write (int color);
-
+ unsigned char __br;
+ BrightnessControl __mode;
};