aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/feature_rgblight.md229
1 files changed, 108 insertions, 121 deletions
diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md
index e0918d11b..d48941a04 100644
--- a/docs/feature_rgblight.md
+++ b/docs/feature_rgblight.md
@@ -1,131 +1,46 @@
1# RGB Lighting 1# RGB Lighting
2 2
3If you've installed addressable RGB lights on your keyboard you can control them with QMK. Currently we support the following addressable LEDs on Atmel AVR processors: 3QMK has the ability to control RGB LEDs attached to your keyboard. This is commonly called *underglow*, due to the LEDs often being mounted on the bottom of the keyboard, producing a nice diffused effect when combined with a translucent case.
4 4
5* WS2811 and variants (WS2812, WS2812B, WS2812C, etc) 5![Planck with RGB Underglow](https://raw.githubusercontent.com/qmk/qmk_firmware/3774a7fcdab5544fc787f4c200be05fcd417e31f/keyboards/planck/keymaps/yang/planck-with-rgb-underglow.jpg)
6* SK6812RGBW
7
8Some keyboards come with RGB LEDs pre-installed. Others have to have LEDs installed after the fact. See below for information on modifying your keyboard.
9
10## Selecting Colors
11
12QMK uses Hue, Saturation, and Value to set color rather than using RGB. You can use the color wheel below to see how this works. Changing the Hue will cycle around the circle. Saturation will affect the intensity of the color, which you can see as you move from the inner part to the outer part of the wheel. Value sets the overall brightness.
13
14<img src="gitbook/images/color-wheel.svg" alt="HSV Color Wheel" width="250">
15
16If you would like to learn more about HSV you can start with the [Wikipedia article](https://en.wikipedia.org/wiki/HSL_and_HSV).
17 6
18## Configuration 7Some keyboards come with RGB LEDs preinstalled. Others must have them installed after the fact. See the [Hardware Modification](#hardware-modification) section for information on adding RGB lighting to your keyboard.
19 8
20Before RGB Lighting can be used you have to enable it in `rules.mk`: 9Currently QMK supports the following addressable LEDs on AVR microcontrollers (however, the white LED in RGBW variants is not supported):
21 10
22 RGBLIGHT_ENABLE = yes 11 * WS2811, WS2812, WS2812B, WS2812C, etc.
12 * SK6812, SK6812MINI, SK6805
23 13
24You can configure the behavior of the RGB lighting by defining values inside `config.h`. 14These LEDs are called "addressable" because instead of using a wire per color, each LED contains a small microchip that understands a special protocol sent over a single wire. The chip passes on the remaining data to the next LED, allowing them to be chained together. In this way, you can easily control the color of the individual LEDs.
25 15
26### Required Configuration 16## Usage
27 17
28At minimum you have to define the pin your LED strip is connected to and the number of LEDs connected. 18On keyboards with onboard RGB LEDs, it is usually enabled by default. If it is not working for you, check that your `rules.mk` includes the following:
29 19
30```c 20```make
31#define RGB_DI_PIN D7 // The pin the LED strip is connected to 21RGBLIGHT_ENABLE = yes
32#define RGBLED_NUM 14 // Number of LEDs in your strip
33``` 22```
34 23
35### Optional Configuration 24At minimum you must define the data pin your LED strip is connected to, and the number of LEDs in the strip, in your `config.h`. If your keyboard has onboard RGB LEDs, and you are simply creating a keymap, you usually won't need to modify these.
36
37You can change the behavior of the RGB Lighting by setting these configuration values. Use `#define <Option> <Value>` in a `config.h` at the keyboard, revision, or keymap level.
38
39| Option | Default Value | Description |
40|--------|---------------|-------------|
41| `RGBLIGHT_HUE_STEP` | 10 | How many hues you want to have available. |
42| `RGBLIGHT_SAT_STEP` | 17 | How many steps of saturation you'd like. |
43| `RGBLIGHT_VAL_STEP` | 17 | The number of levels of brightness you want. |
44| `RGBLIGHT_LIMIT_VAL` | 255 | Limit the val of HSV to limit the maximum brightness simply. |
45| `RGBLIGHT_SLEEP` | | `#define` this will shut off the lights when the host goes to sleep |
46
47
48### Animations
49
50If you have `#define RGBLIGHT_ANIMATIONS` in your `config.h` you will have a number of animation modes you can cycle through using the `RGB_MOD` key. You can also `#define` other options to tweak certain animations.
51
52| Option | Default Value | Description |
53|--------|---------------|-------------|
54| `RGBLIGHT_ANIMATIONS` | | `#define` this to enable animation modes. |
55| `RGBLIGHT_EFFECT_BREATHE_CENTER` | 1.85 | Used to calculate the curve for the breathing animation. Valid values 1.0-2.7. |
56| `RGBLIGHT_EFFECT_BREATHE_MAX` | 255 | The maximum brightness for the breathing mode. Valid values 1-255. |
57| `RGBLIGHT_EFFECT_SNAKE_LENGTH` | 4 | The number of LEDs to light up for the "snake" animation. |
58| `RGBLIGHT_EFFECT_KNIGHT_LENGTH` | 3 | The number of LEDs to light up for the "knight" animation. |
59| `RGBLIGHT_EFFECT_KNIGHT_OFFSET` | 0 | Start the knight animation this many LEDs from the start of the strip. |
60| `RGBLIGHT_EFFECT_KNIGHT_LED_NUM` | RGBLED_NUM | The number of LEDs to have the "knight" animation travel. |
61| `RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL` | 1000 | How long to wait between light changes for the "christmas" animation. Specified in ms. |
62| `RGBLIGHT_EFFECT_CHRISTMAS_STEP` | 2 | How many LED's to group the red/green colors by for the christmas mode. |
63
64You can also tweak the behavior of the animations by defining these consts in your `keymap.c`. These mostly affect the speed different modes animate at.
65
66```c
67// How long (in ms) to wait between animation steps for the breathing mode
68const uint8_t RGBLED_BREATHING_INTERVALS[] PROGMEM = {30, 20, 10, 5};
69
70// How long (in ms) to wait between animation steps for the rainbow mode
71const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[] PROGMEM = {120, 60, 30};
72
73// How long (in ms) to wait between animation steps for the swirl mode
74const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {100, 50, 20};
75
76// How long (in ms) to wait between animation steps for the snake mode
77const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {100, 50, 20};
78 25
79// How long (in ms) to wait between animation steps for the knight modes 26|Define |Description |
80const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {127, 63, 31}; 27|------------|---------------------------------------------|
28|`RGB_DI_PIN`|The pin connected to the data pin of the LEDs|
29|`RGBLED_NUM`|The number of LEDs connected |
81 30
82// These control which colors are selected for the gradient mode 31Then you should be able to use the keycodes below to change the RGB lighting to your liking.
83const uint16_t RGBLED_GRADIENT_RANGES[] PROGMEM = {360, 240, 180, 120, 90};
84```
85 32
86### LED Control 33### Color Selection
87 34
88Look in `rgblights.h` for all available functions, but if you want to control all or some LEDs your goto functions are: 35QMK uses [Hue, Saturation, and Value](https://en.wikipedia.org/wiki/HSL_and_HSV) to select colors rather than RGB. The color wheel below demonstrates how this works.
89 36
90```c 37<img src="gitbook/images/color-wheel.svg" alt="HSV Color Wheel" width="250"/>
91// turn all lights off (stored in EEPROM)
92rgblight_disable();
93// turn lights on, based on their previous state (stored in EEPROM)
94rgblight_enable();
95
96// turn all lights off (not stored in EEPROM)
97rgblight_disable_noeeprom();
98// turn lights on, based on their previous state (not stored in EEPROM)
99rgblight_enable_noeeprom();
100
101// where r/g/b is a number from 0..255. Turns all the LEDs to this color (ignores mode, not stored in EEPROM).
102rgblight_setrgb(r, g, b);
103// HSV color control - h is a value from 0..360 and s/v is a value from 0..255 (stored in EEPROM)
104rgblight_sethsv(h, s, v);
105// HSV color control - h is a value from 0..360 and s/v is a value from 0..255 (not stored in EEPROM)
106rgblight_sethsv_noeeprom(h, s, v);
107
108// Sets the mode, if rgb animations are enabled (stored in eeprom)
109rgblight_mode(x);
110// Sets the mode, if rgb animations are enabled (not stored in eeprom)
111rgblight_mode_noeeprom(x);
112// MODE 1, solid color
113// MODE 2-5, breathing
114// MODE 6-8, rainbow mood
115// MODE 9-14, rainbow swirl
116// MODE 15-20, snake
117// MODE 21-23, knight
118// MODE 24, xmas
119// MODE 25-34, static rainbow
120
121rgblight_setrgb_at(r,g,b, LED); // control a single LED. 0 <= LED < RGBLED_NUM
122rgblight_sethsv_at(h,s,v, LED); // control a single LED. 0 <= LED < RGBLED_NUM
123```
124You can find a list of predefined colors at [`quantum/rgblight_list.h`](https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight_list.h). Free to add to this list!
125 38
126## RGB Lighting Keycodes 39Changing the **Hue** cycles around the circle.
40Changing the **Saturation** moves between the inner and outer sections of the wheel, affecting the intensity of the color.
41Changing the **Value** sets the overall brightness.
127 42
128These control the RGB Lighting functionality. 43## Keycodes
129 44
130|Key |Aliases |Description | 45|Key |Aliases |Description |
131|-------------------|----------|--------------------------------------------------------------------| 46|-------------------|----------|--------------------------------------------------------------------|
@@ -146,25 +61,97 @@ These control the RGB Lighting functionality.
146|`RGB_MODE_KNIGHT` |`RGB_M_K` |"Knight Rider" animation mode | 61|`RGB_MODE_KNIGHT` |`RGB_M_K` |"Knight Rider" animation mode |
147|`RGB_MODE_XMAS` |`RGB_M_X` |Christmas animation mode | 62|`RGB_MODE_XMAS` |`RGB_M_X` |Christmas animation mode |
148|`RGB_MODE_GRADIENT`|`RGB_M_G` |Static gradient animation mode | 63|`RGB_MODE_GRADIENT`|`RGB_M_G` |Static gradient animation mode |
149|`RGB_MODE_RGBTEST `|`RGB_M_T` |Red,Green,Blue test animation mode | 64|`RGB_MODE_RGBTEST` |`RGB_M_T` |Red, Green, Blue test animation mode |
150 65
151note: for backwards compatibility, `RGB_SMOD` is an alias for `RGB_MOD`. 66?> For backwards compatibility, `RGB_SMOD` is another alias of `RGB_MOD`.
152 67
153## Hardware Modification 68## Configuration
154 69
155![Planck with RGB Underglow](https://raw.githubusercontent.com/qmk/qmk_firmware/3774a7fcdab5544fc787f4c200be05fcd417e31f/keyboards/planck/keymaps/yang/planck-with-rgb-underglow.jpg) 70Your RGB lighting can be configured by placing these `#define`s in your `config.h`:
71
72|Define |Default |Description |
73|---------------------|-------------|-----------------------------------------------------------------------------|
74|`RGBLIGHT_HUE_STEP` |`10` |The number of steps to cycle through the hue by |
75|`RGBLIGHT_SAT_STEP` |`17` |The number of steps to increment the saturation by |
76|`RGBLIGHT_VAL_STEP` |`17` |The number of steps to increment the brightness by |
77|`RGBLIGHT_LIMIT_VAL` |`255` |The maximum brightness level |
78|`RGBLIGHT_SLEEP` |*Not defined*|If defined, the RGB lighting will be switched off when the host goes to sleep|
79
80## Animations
81
82Not only can this lighting be whatever color you want, if `RGBLIGHT_ANIMATIONS` is defined, you also have a number of animation modes at your disposal:
83
84|Mode |Description |
85|-----|---------------------|
86|1 |Solid color |
87|2-5 |Solid color breathing|
88|6-8 |Cycling rainbow |
89|9-14 |Swirling rainbow |
90|15-20|Snake |
91|21-23|Knight |
92|24 |Christmas |
93|25-34|Static gradient |
94|35 |RGB Test |
95|36 |Alternating |
96
97Check out [this video](https://youtube.com/watch?v=VKrpPAHlisY) for a demonstration.
98
99The following options can be used to tweak the various animations:
100
101|Define |Default |Description |
102|------------------------------------|-------------|-------------------------------------------------------------------------------------|
103|`RGBLIGHT_ANIMATIONS` |*Not defined*|If defined, enables additional animation modes |
104|`RGBLIGHT_EFFECT_BREATHE_CENTER` |`1.85` |Used to calculate the curve for the breathing animation. Valid values are 1.0 to 2.7 |
105|`RGBLIGHT_EFFECT_BREATHE_MAX` |`255` |The maximum brightness for the breathing mode. Valid values are 1 to 255 |
106|`RGBLIGHT_EFFECT_SNAKE_LENGTH` |`4` |The number of LEDs to light up for the "Snake" animation |
107|`RGBLIGHT_EFFECT_KNIGHT_LENGTH` |`3` |The number of LEDs to light up for the "Knight" animation |
108|`RGBLIGHT_EFFECT_KNIGHT_OFFSET` |`0` |The number of LEDs to start the "Knight" animation from the start of the strip by |
109|`RGBLIGHT_EFFECT_KNIGHT_LED_NUM` |`RGBLED_NUM` |The number of LEDs to have the "Knight" animation travel |
110|`RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL`|`1000` |How long to wait between light changes for the "Christmas" animation, in milliseconds|
111|`RGBLIGHT_EFFECT_CHRISTMAS_STEP` |`2` |The number of LEDs to group the red/green colors by for the "Christmas" animation |
112
113You can also modify the speeds that the different modes animate at:
156 114
157Here is a quick demo on Youtube (with NPKC KC60) (https://www.youtube.com/watch?v=VKrpPAHlisY). 115```c
116// How long (in milliseconds) to wait between animation steps for each of the "Solid color breathing" animations
117const uint8_t RGBLED_BREATHING_INTERVALS[] PROGMEM = {30, 20, 10, 5};
158 118
159For this mod, you need an unused pin wiring to DI of WS2812 strip. After wiring the VCC, GND, and DI, you can enable the underglow in your Makefile. 119// How long (in milliseconds) to wait between animation steps for each of the "Cycling rainbow" animations
120const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[] PROGMEM = {120, 60, 30};
160 121
161 RGBLIGHT_ENABLE = yes 122// How long (in milliseconds) to wait between animation steps for each of the "Swirling rainbow" animations
123const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {100, 50, 20};
124
125// How long (in milliseconds) to wait between animation steps for each of the "Snake" animations
126const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {100, 50, 20};
162 127
163In order to use the underglow animation functions, you need to have `#define RGBLIGHT_ANIMATIONS` in your `config.h`. 128// How long (in milliseconds) to wait between animation steps for each of the "Knight" animations
129const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {127, 63, 31};
164 130
165Please add the following options into your config.h, and set them up according your hardware configuration. These settings are for the `F4` pin by default: 131// These control which hues are selected for each of the "Static gradient" modes
132const uint16_t RGBLED_GRADIENT_RANGES[] PROGMEM = {360, 240, 180, 120, 90};
133```
166 134
167 #define RGB_DI_PIN F4 // The pin your RGB strip is wired to 135## Functions
168 #define RGBLED_NUM 14 // Number of LEDs 136
137If you need to change your RGB lighting in code, for example in a macro to change the color whenever you switch layers, QMK provides a set of functions to assist you. See [`rgblight.h`](https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight.h) for the full list, but the most commonly used functions include:
138
139|Function |Description |
140|-----------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
141|`rgblight_enable()` |Turn LEDs on, based on their previous state |
142|`rgblight_enable_noeeprom()` |Turn LEDs on, based on their previous state (not written to EEPROM) |
143|`rgblight_disable()` |Turn LEDs off |
144|`rgblight_disable_noeeprom()` |Turn LEDs off (not written to EEPROM) |
145|`rgblight_mode(x)` |Set the mode, if RGB animations are enabled |
146|`rgblight_mode_noeeprom(x)` |Set the mode, if RGB animations are enabled (not written to EEPROM) |
147|`rgblight_setrgb(r, g, b)` |Set all LEDs to the given RGB value where `r`/`g`/`b` are between 0 and 255 (not written to EEPROM) |
148|`rgblight_setrgb_at(r, g, b, led)` |Set a single LED to the given RGB value, where `r`/`g`/`b` are between 0 and 255 and `led` is between 0 and `RGBLED_NUM` (not written to EEPROM) |
149|`rgblight_sethsv(h, s, v)` |Set all LEDs to the given HSV value where `h` is between 0 and 360 and `s`/`v` are between 0 and 255 |
150|`rgblight_sethsv_noeeprom(h, s, v)`|Set all LEDs to the given HSV value where `h` is between 0 and 360 and `s`/`v` are between 0 and 255 (not written to EEPROM) |
151|`rgblight_sethsv_at(h, s, v, led)` |Set a single LED to the given HSV value, where `h` is between 0 and 360, `s`/`v` are between 0 and 255, and `led` is between 0 and `RGBLED_NUM` (not written to EEPROM)|
152
153Additionally, [`rgblight_list.h`](https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight_list.h) defines several predefined shortcuts for various colors. Feel free to add to this list!
154
155## Hardware Modification
169 156
170You'll need to edit `RGB_DI_PIN` to the pin you have your `DI` on your RGB strip wired to. 157If your keyboard lacks onboard underglow LEDs, you may often be able to solder on an RGB LED strip yourself. You will need to find an unused pin to wire to the data pin of your LED strip. Some keyboards may break out unused pins from the MCU to make soldering easier. The other two pins, VCC and GND, must also be connected to the appropriate power pins.