Mar 172017
 

One of the interesting usage possibilities for the RasPiO InsPiRing system is illuminated signage. What could be better than flashy, blinky, multi-coloured signage? Well, not much really? So I decided to make an arrow out of two straight 8s and a triangle.

I used white depron foam as a base, ordinary headers and jumper wires to connect all the shapes to each other and to the controller. Then a needle and thread and some hot glue to fasten the shapes to the depron. I then darkened the foam with a marker pen. This is what it looks like.

Arrow sign from 2 RasPiO InsPiRing straights and a triangle

Arrow sign from 2 RasPiO InsPiRing straights and a triangle

I got it all working on a Raspberry Pi in Python to begin with, then decided to port the code to Arduino and use a Wemos D1 mini (ESP8266) for my ‘on location’ shoot (just power it up and go – no screen or keyboard required).

Here’s the Python Code

from time import sleep
import apa

numleds = 40    # number of LEDs in our display
delay = 0.04
brightness = 0xFF  # set phasers to MAX

ledstrip = apa.Apa(numleds)

ledstrip.flush_leds()
ledstrip.zero_leds()
ledstrip.write_leds()

levels = [[0,8],[1,9],[2,10],[3,11],[4,12],[5,13],[6,14],[7,15],
          [32,33,34,35,36,37,38,39],[16,31],[17,30],[18,29],
          [19,28],[20,27],[21,26],[22,25],[23,24]]  

def scroll(b,g,r):
    for level in levels:
        for led in level:
            ledstrip.led_values[led] = [brightness, b, g, r]
        ledstrip.write_leds()
        sleep(delay)

try:
    while True:
        scroll(255,0,0)
        scroll(0,255,0)
        scroll(0,0,255)
        scroll(255,255,0)
        scroll(0,255,255)
        scroll(255,255,255)

finally:
    print("/nAll LEDs OFF - BYE!/n")
    ledstrip.zero_leds()
    ledstrip.write_leds()

Here’s the Arduino Sketch Code

This sketch uses the FastLED library which already has a driver for APA102. It can do native SPI on supported devices, but I haven’t managed to get this to work on a Wemos D1 mini, so using bit-banging on pins 7 & 5.

#define FASTLED_ESP8266_D1_PIN_ORDER
#include<FastLED.h>
#define NUM_LEDS 40
#define DATA_PIN 7
#define CLOCK_PIN 5

CRGBArray<NUM_LEDS> leds;

    void setup() { 
        FastLED.addLeds<APA102, DATA_PIN, CLOCK_PIN, BGR, DATA_RATE_MHZ(12)>(leds, NUM_LEDS);
        FastLED.clear();
    }

int delay_ms = 40;
int levels[17][2] = {{0,8},{1,9},{2,10},{3,11},{4,12},{5,13},{6,14},{7,15},{32,33},{16,31},
                    {17,30},{18,29},{19,28},{20,27},{21,26},{22,25},{23,24}
};

void arrow(int red, int green, int blue){    
      for(int i=0; i<17; i++){
          if (i == 8){
            for(int j=32; j<40; j++){
              leds[j].setRGB(red, green, blue);
            }
          }
          else {
            leds[levels[i][0]].setRGB(red, green, blue);
            leds[levels[i][1]].setRGB(red, green, blue);         
          }
          delay(delay_ms);
          FastLED.show();
      }
      FastLED.show();
      delay(delay_ms);
}

void loop() {
      arrow(255,0,0);        //RED
      arrow(0,255,0);        //GREEN
      arrow(0,0,255);        //BLUE
      arrow(0, 125, 255);    //CYAN
      arrow(255, 0, 125);    //MAGENTA
      arrow(255, 125, 0);    //YELLOW
      arrow(255, 125, 125);  //WHITE
RasPiO Inspiring Arrow

RasPiO Inspiring Arrow

If you’d like to build an arrow, the top pledge level includes enough parts to make two arrows and a few more parts. Also, for another 26 hours (until 12pm Saturday), you can get a Pi Zero W in this bundle.

Check out the RasPiO InsPiRing Kickstarter here.

Leave a Reply