Programming Addressable LED Strips

37
Having fun with an Arduino Nano & FastLED By: Andrew Tuline Programming Addressable LED Strips or

description

This presentation is all about having fun with an Arduino Nano & FastLED. It's going to be presented to Scouting Youth in the Fraser Valley of British Columbia.

Transcript of Programming Addressable LED Strips

Page 1: Programming Addressable LED Strips

Having fun with an Arduino Nano & FastLED

By: Andrew Tuline

Programming Addressable LED Stripsor

Page 2: Programming Addressable LED Strips

Overview

• Introductions• Install IDE and check out drivers• Included examples• More examples• Some reference material• Create your own project

If you like, you can go at your own pace

Page 3: Programming Addressable LED Strips

Introduction

Work on your own or with partners, and help each other out.

Page 4: Programming Addressable LED Strips

This Workshop

• Builds upon the previous Arduino workshop• Assumes you’re familiar with .zip files, folders

and basic programming• More C++ programming• We’ll run several cool lighting examples

Page 5: Programming Addressable LED Strips

Installing Arduino Software• On Windows 7• Installs to C:\Program Files (x86)\Arduino• Your programs are in C:\Users\userid\Documents\Arduino

• ‘Tools | Board’ should be changed to say ‘Arduino Nano w/ ATmega328’

• In Device Manager, see ‘Ports (COM & LPT)’• Device drivers in C:\Program Files (x86)\Arduino\drivers\FTDI

USB Drivers

Are you running 32 bit or 64 bit?

Page 6: Programming Addressable LED Strips

Touring the IDE• ‘File | Examples’ includes lots of examples• ‘File | Upload’ is how we compile and upload our program to

the Arduino• ‘Help | Reference’ includes a local copy of the Language

Reference

Make GOOD use of those examples!

Page 7: Programming Addressable LED Strips

Test the Drivers

Declare constants & global variables

One time setup of ports

Continuous loop

Test your drivers by compiling and uploading Blink.ino

Page 8: Programming Addressable LED Strips

Arduino Nano Pinout

• Digital pins (input/output)• Analog pins (input/output)• Vin, Ground pins• 5V, 3.3V pins• Analog out is PWM• Most pins support other functions

This project just uses Vin, 5V, Ground and a digital pin

Page 9: Programming Addressable LED Strips

Addressable LED Strips

• Traditionally, we assign output values to each R, G and B pin on each LED

• This can use up a LOT of pins• Addressable LED strips provide circuitry to

support data being sent over a single pin to multiple RGB LED’s

Page 10: Programming Addressable LED Strips

LED Strip Connections

Page 11: Programming Addressable LED Strips

What is FastLED?

• FastLED is a fast, easy-to-use Arduino library for programming addressable LED strips.

• FastLED is used by thousands of developers.

Do a YouTube search for ‘FastLED’

Page 12: Programming Addressable LED Strips

Downloading FastLED

• The latest version is on GitHub at: https://github.com/FastLED/FastLED

• Download the zip file• Extract the directory FastLED-master• Rename the directory from:

FastLED-master to FastLED• Place that directory into: C:\Program Files(x86)\Arduino\libraries

Page 13: Programming Addressable LED Strips

FastLED Examples

• In the Arduino IDE, select‘File | Examples | FastLED | FirstLight’

• We need to modify the code in order to define the correct data pin.

• We also need to change the number of LED’s we’re using.

Page 14: Programming Addressable LED Strips

FirstLight#include "FastLED.h"

#define NUM_LEDS 10#define DATA_PIN 13uint8_t max_bright = 64;

CRGB leds[NUM_LEDS];

void setup() { delay(2000); FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); FastLED.setBrightness(max_bright);}

void loop() { for (int whiteLed = 0; whiteLed < NUM_LEDS; whiteLed++) { leds[whiteLed] = CRGB::White; FastLED.show(); delay(100); leds[whiteLed] = CRGB::Black; }}

The white LED should march across the array.

// Include the library

// Number of LED’s// Our data pin// Define brightness limiter

// Define the LED array

// Run once// Power up delay for safety// Initialize the LED array// Limit the brightness

// Run continuously// Cycle through each LED in the array// Set the current one white// Show it// Wait for a bit// Set it to black

Page 15: Programming Addressable LED Strips

Setting LED values

• leds[9] = CRGB::Cyan; // Web colours• leds[9].g = 255; // Just set green• leds[0] = CRGB(255,0,0); // CRGB values• leds[0] = 0x0000ff; // Use a hex #

FastLED provides even more ways to assign colours to LED’s

Page 16: Programming Addressable LED Strips

Variable Types & Scope

• You can define a variable to be global or local– Global is good for anywhere in the program– Local to a function or to a loop

• Variable types include:– int (-32768 to 32767 is 16 bit signed)– uint (0 to 65535 is 16 bit unsigned)– uint8_t (0 to 255 is 8 bit unsigned)– long (is 32 bits signed)– and many more. . .

Page 17: Programming Addressable LED Strips

Random Numberslong num = random(); // 32 bituint8_t unum = random8(); // 8 bitint inum = random16(0, 1023); // 16 bit

• The ‘long’ can be used to assign random RGB colours• The ‘uint8_t’ can be used to assign hue, brightness values• It can also refer to LED elements in your strip

random8() and random16() are FastLED functions

Page 18: Programming Addressable LED Strips

If Statements

This example occasionally flashes a random colour on a random LED.

void loop() { uint8_t j = random16(0, 100); // Which LED will we light up if ( j < NUM_LEDS ) { // Only display if that number IS in our array

leds[j] = random(); // 32 bit randomizer for colourFastLED.show();

delay(100); leds[j] = CRGB::Black; // Make that LED black again }}

Page 19: Programming Addressable LED Strips

For LoopsThis example sets each LED a different colour, waits 2 seconds and repeats.

void loop() { for (int i = 0; i < NUM_LEDS; i++) { // Last element is leds[NUM_LEDS-1] leds[i] = random(); // A 32 bit random number } FastLED.show(); delay(2000);}

Page 20: Programming Addressable LED Strips

We’re Just Getting Started

FastLED contains a LOT of functions including:• Random number generation• Fast 8 and 16 bit basic math functions• Fast trigonometry• Setting RGB and HSV values• fill_rainbow, fill_gradient, fading, scaling, blending, noise,

palettes• Power management

We’re talking FAST

Page 21: Programming Addressable LED Strips

Rainbow March#include "FastLED.h"

#define LED_DT 13 // Data pin#define NUM_LEDS 10 // Number of LED's#define COLOR_ORDER GRB // Change the order as necessary#define LED_TYPE WS2812B // What kind of strip are you using?uint8_t max_bright = 64; // How bright do we want to go

struct CRGB leds[NUM_LEDS]; // Initialize our array

uint8_t thisdelay = 8; // A delay value for the sequenceuint8_t thishue = 0; // Starting hue value.int8_t thisrot = 1; // Hue rotation speed. Can be a negative #.uint8_t deltahue = 5; // Difference in hue between LED’s

Use variables where possible

Page 22: Programming Addressable LED Strips

Rainbow March cont’dvoid setup() { LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS); FastLED.setBrightness(max_bright);}

void loop () { rainbow_march(); FastLED.show(); delay(thisdelay);}

void rainbow_march() { thishue = thishue + thisrot; fill_rainbow (leds, NUM_LEDS, thishue, deltahue); // FastLED does the heavy lifting}

Page 23: Programming Addressable LED Strips

More FastLED Demos

• There’s also several 3rd party demos at:https://github.com/atuline/FastLED-Demos

• Unzip and store them in:C:\users\<username>\Documents\Arduino

Page 24: Programming Addressable LED Strips

aatemplate definitions#include "FastLED.h" // FastLED library. Preferably the latest copy of FastLED 2.1. // Fixed definitions cannot change on the fly.#define LED_DT 13 // Serial data pin for the strip.#define COLOR_ORDER GRB // Are they RGB, GRB or what??#define LED_TYPE WS2812B // What kind of strip are you using?#define NUM_LEDS 10 // Number of LED's.

// Initialize changeable global variables.uint8_t max_bright = 255; // Overall brightness definition. It can be changed on the fly.

struct CRGB leds[NUM_LEDS]; // Initialize our LED array.

// Define variables used by the sequences.int twinkrate = 100; // The higher the value, the lower the number of twinkles.uint8_t thisdelay = 20; // A delay value for the sequence(s).uint8_t thisfade = 8; // How quickly does it fade? Lower = slower fade rate.uint8_t thishue = 50; // The hue.uint8_t thissat = 100; // The saturation, where 255 = brilliant colours.uint8_t thisbri = 255; // Brightness of a sequence.

Page 25: Programming Addressable LED Strips

aatemplate setup()void setup() { delay(1000); Serial.begin(57600); LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS); FastLED.setBrightness(max_bright); set_max_power_in_volts_and_milliamps(5, 500);}

Power management is critical for large arrays of LED’s

Page 26: Programming Addressable LED Strips

aatemplate loop

void loop () { ChangeMe(); // Change variable values on the fly. twinkle(); // Call our display sequence. show_at_max_brightness_for_power(); // Power managed display of LED's. delay_at_max_brightness_for_power(2.5*thisdelay); // Power managed FastLED delay. Serial.println(LEDS.getFPS()); // Display frames per second.} // loop()

void twinkle() { if (twinkrate < NUM_LEDS) twinkrate = NUM_LEDS; // Must be at least NUM_LEDS. int i = random16(twinkrate); // Higher number => fewer twinkles. if (i < NUM_LEDS) { leds[i] = CHSV(thishue, thissat, thisbri); // You could randomize these. } for (int j = 0; j < NUM_LEDS; j++) { leds[j].fadeToBlackBy(thisfade); // Use the FastLED 2.1 fade method. }} // twinkle()

Page 27: Programming Addressable LED Strips

aatemplate completevoid ChangeMe() { // A time (rather than loop) based demo sequencer. uint8_t secondHand = (millis() / 1000) % 15; // Change ‘15' to a different value for a longer demo. static uint8_t lastSecond = 99; // Static variable, only defined once. if (lastSecond != secondHand) { // Debounce to make sure we're not repeating. lastSecond = secondHand; if (secondHand == 0) {thisdelay = 20; thishue=0; thissat=255; thisfade=16; thisdelay=50;

twinkrate=20;} if (secondHand == 5) {thisdelay = 20; thishue=128; thisfade=64; thisdelay=10; twinkrate=100;} if (secondHand == 10) {thisdelay = 20; thishue=random16(0,64); twinkrate=40;} if (secondHand == 15) {} if (secondHand == 20) {} if (secondHand == 25) {} if (secondHand == 30) {} if (secondHand == 35) {} if (secondHand == 40) {} if (secondHand == 45) {} if (secondHand == 50) {} if (secondHand == 55) {} }} // ChangeMe()

Page 28: Programming Addressable LED Strips

Try More Demo’s

• Try one_sine_demo• Try pop_fade_demo• Try ripple• Try two_sin_demo• Try noise16_demo• Try three_sin_demo• Try rainbow_march_demo

Page 29: Programming Addressable LED Strips

aalight

• This demo combines several sequences• It can support a microphone• It can support IR control• It supports keyboard commands• It also supports a pushbutton• It supports timed demo modes• Set the starting sequence to 99 in order to

loop through several different sequences.

Page 30: Programming Addressable LED Strips

Google for more FastLED

Page 31: Programming Addressable LED Strips

Arduino Research

• www.fastled.io• github.com• arduino.cc/tutorial• playground.arduino.cc• tronixstuff.com/tutorials• learn.sparkfun.com/tutorials• oomlout.com/a/products/ardx

Don’t forget the examples included with the Arduino software

Page 32: Programming Addressable LED Strips

Inspirational Web Sites

• www.instructables.com• www.tindie.com• www.makershed.com• www.makezine.com

Page 33: Programming Addressable LED Strips

Sources for Parts

• www.robotshop.ca• www.sparkfun.com• www.leeselectronics.com• www.gravitech.us• www.adafruit.com• www.ebay.ca• www.aliexpress.com• www.amazon.com• www.dealextreme.com

All it takes is a VISA card and your imagination

Page 34: Programming Addressable LED Strips

Local Events

• North Delta Luminary Festival• Vancouver Mini Maker Faire• WestSurDel Fun Night• Vancouver Bike Rave• Any night market

Then there’s Burning Man

Page 35: Programming Addressable LED Strips

University

Page 36: Programming Addressable LED Strips

Hardware Hacker

https://diy.org/skills/hardwarehacker

Page 37: Programming Addressable LED Strips

Light Something