Advertisement
jsmirnio

Arduino RadioShack LED Strip Moving Patterns

Aug 3rd, 2014
1,317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*  HAPPY HOLIDAYS TO ALL ARDUINOS !!! */
  2.  
  3. //modified from http://pastebin.com/wUSVNubd
  4.  
  5. /*
  6. RadioShack RGB Color LED strip light show for TM1803 LED controlled LEDs.
  7. This began with the default code from RS - now with some annotations to help explain
  8. what is happening PLUS several NEW Patterns for July 4th 2014 and a change in the
  9. pulse timing to make it easier to adjust for MCU cycle speed (e.g. 8MHz vs 16 MHz);
  10. */
  11.  
  12. #include <avr/pgmspace.h>
  13. //  This is a "standard" include for the Arduino IDE that provides functions needed (like PROGMEM, etc.)
  14.  
  15. /*
  16. #define DATA_1 (PORTD |= (1<<5)) // Set logic high Pin5 of Port D
  17. #define DATA_0 (PORTD &= ~(1<<5)) // Set Pin5 logic low Pin5 of Port D
  18. #define STRIP_PINOUT DDRD |= (1<<5) // Set Pin5 of PortD as digital output
  19. #define LED_RGB_STRIP
  20. */
  21.  
  22. #define DATA_1 (PORTC |=  0X01)    // DEFINE a value for DATA as 1  // for UNO
  23. #define DATA_0 (PORTC &=  0XFE)    // DEFINE a value for DATA 0   // for UNO
  24. #define STRIP_PINOUT (DDRC=0x3F)  // DEFINE PORTC as OUTPUT // for UNO (change pins 0-5; leave PORTC 6 & 7 alone)
  25.  
  26. #define NOP "nop\n\t"
  27. /*
  28. Each 'nop' statement executes in one machine cycle (at 16 MHz) yielding a 62.5 ns (nanosecond) delay.
  29.   __asm__("nop\n\t");
  30.   __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");// Synatax for multiple Delays
  31. */
  32.  
  33. /*
  34. Create an array of values [xx] by [nn] to control each LED NODE in the standard RadioShack strip.  
  35. [xx] is the number of FRAMES in your sequence and [nn] is the number of NODES for YOUR LED strip, usually 10.
  36.  
  37. PROGMEM stores the data in the AVR chip's PROGRAM memory.  This has much more space than the 2K of variable RAM memory.
  38. The two dimensional array has one value for each one of the 10 TM1803 RGB LEDs - controlling the color.
  39. Each "row" can change the colors assigned.  This is like a FRAME in an animation.  Changing the FRAME's
  40. values and patterns can create the animation effect of motion.
  41.  
  42. We will then read out these values one FRAME (row) at a time to create the 24bit serial pulse train that is OUTPUT to the LED Strip.
  43.  
  44. Each ROW is sent as OUTPUT and it will SET the COLOR for each of the TEN (10) nodes.
  45. Each ROW is a NEW FRAME, changing the colors again and again, creating a pattern.
  46.  
  47. The order of the HEX doublets (bytes) controlling the COLORS is: Green - Blue - Red.
  48. ff is full brightness - so 0xff0000 is full GREEN, 0xx00ff00 is full BLUE, 0x0000ff is full RED
  49. */
  50.  
  51. // In the Radio Shack RGB Strip, the TM1803 controls RED with the last HEX byte
  52. PROGMEM const unsigned long chasing_red[][10]={
  53.   {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  54.   {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  55.   {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  56.   {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  57.   {0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000},
  58.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000},
  59.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000},
  60.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000},
  61.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000},
  62.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
  63. };
  64.  
  65. PROGMEM const unsigned long first_red[][10]={
  66.   {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  67.   {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  68.   {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  69.   {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  70.   {0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000},
  71.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000},
  72.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000},
  73.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000},
  74.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000},
  75.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
  76. };
  77.  
  78. PROGMEM const unsigned long second_red[][10]={
  79.   {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
  80.   {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
  81.   {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
  82.   {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
  83.   {0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x0000f0},
  84.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x0000f0},
  85.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x0000f0},
  86.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x0000f0},
  87.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x0000f0},
  88.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x0000f0},
  89. };
  90.  
  91. PROGMEM const unsigned long first_white[][10]={
  92.   {0xd0d0d0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x0000f0},
  93.   {0x000000,0xd0d0d0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x0000f0},
  94.   {0x000000,0x000000,0xd0d0d0,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x0000f0},
  95.   {0x000000,0x000000,0x000000,0xd0d0d0,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x0000f0},
  96.   {0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x000000,0x000000,0x000000,0x0000f0,0x0000f0},
  97.   {0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x000000,0x000000,0x0000f0,0x0000f0},
  98.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x000000,0x0000f0,0x0000f0},
  99.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
  100.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
  101.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
  102. };
  103.  
  104. PROGMEM const unsigned long second_white[][10]={
  105.   {0xd0d0d0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
  106.   {0x000000,0xd0d0d0,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
  107.   {0x000000,0x000000,0xd0d0d0,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
  108.   {0x000000,0x000000,0x000000,0xd0d0d0,0x000000,0x000000,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
  109.   {0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x000000,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
  110.   {0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
  111.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  112.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  113.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  114.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  115. };
  116.  
  117. PROGMEM const unsigned long first_blue[][10]={
  118.   {0x00f000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  119.   {0x000000,0x00f000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  120.   {0x000000,0x000000,0x00f000,0x000000,0x000000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  121.   {0x000000,0x000000,0x000000,0x00f000,0x000000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  122.   {0x000000,0x000000,0x000000,0x000000,0x00f000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  123.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  124.   {0x00f000,0x000000,0x000000,0x000000,0x000000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  125.   {0x000000,0x00f000,0x000000,0x000000,0x000000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  126.   {0x000000,0x000000,0x00f000,0x000000,0x000000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  127.   {0x000000,0x000000,0x000000,0x00f000,0x000000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  128. };
  129.  
  130. PROGMEM const unsigned long second_blue[][10]={
  131.   {0x000000,0x000000,0x000000,0x000000,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  132.   {0x0000f0,0x000000,0x000000,0x000000,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  133.   {0x000000,0x0000f0,0x000000,0x000000,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  134.   {0x000000,0x000000,0x0000f0,0x000000,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  135.   {0x000000,0x000000,0x000000,0x0000f0,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  136.   {0x0000f0,0x000000,0x000000,0x0000f0,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  137.   {0x000000,0x0000f0,0x000000,0x0000f0,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  138.   {0x000000,0x000000,0x0000f0,0x0000f0,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  139.   {0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
  140. };
  141.  
  142. // In the Radio Shack RGB Strip, the TM1803 controls GREEN with the 1st, BLUE with the 2nd, and RED with the last HEX byte,
  143. PROGMEM const unsigned long red_white_blue[][10]={
  144.   {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  145.   {0xd0d0d0,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  146.   {0x00f000,0xd0d0d0,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  147.   {0x000000,0x00f000,0xd0d0d0,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  148.   {0x000000,0x000000,0x00f000,0xd0d0d0,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000},
  149.   {0x000000,0x000000,0x000000,0x00f000,0xd0d0d0,0x0000f0,0x000000,0x000000,0x000000,0x000000},
  150.   {0x000000,0x000000,0x000000,0x000000,0x00f000,0xd0d0d0,0x0000f0,0x000000,0x000000,0x000000},
  151.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000,0xd0d0d0,0x0000f0,0x000000,0x000000},
  152.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000,0xd0d0d0,0x0000f0,0x000000},
  153.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000,0xd0d0d0,0x0000f0},
  154. };
  155.  
  156.  
  157. // WHITE is ALL HEX bytes (can vary the "color" of white by changing these
  158. PROGMEM const unsigned long chasing_white[][10]={
  159.   {0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  160.   {0x000000,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  161.   {0x000000,0x000000,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  162.   {0x000000,0x000000,0x000000,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  163.   {0x000000,0x000000,0x000000,0x000000,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000},
  164.   {0x000000,0x000000,0x000000,0x000000,0x000000,0xfdfdfd,0x000000,0x000000,0x000000,0x000000},
  165.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xfdfdfd,0x000000,0x000000,0x000000},
  166.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xfdfdfd,0x000000,0x000000},
  167.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xfdfdfd,0x000000},
  168.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xfdfdfd},
  169. };
  170.  
  171. // BLUE is the second HEX byte
  172. PROGMEM const unsigned long chasing_blue[][10]={
  173.   {0x00f000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  174.   {0x000000,0x00f000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  175.   {0x000000,0x000000,0x00f000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  176.   {0x000000,0x000000,0x000000,0x00f000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  177.   {0x000000,0x000000,0x000000,0x000000,0x00f000,0x000000,0x000000,0x000000,0x000000,0x000000},
  178.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000,0x000000,0x000000,0x000000,0x000000},
  179.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000,0x000000,0x000000,0x000000},
  180.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000,0x000000,0x000000},
  181.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000,0x000000},
  182.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000},
  183. };
  184.  
  185. // GREEN is the first HEX byte
  186. PROGMEM const unsigned long chasing_green[][10]={
  187.   {0xf00000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  188.   {0x000000,0xf00000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  189.   {0x000000,0x000000,0xf00000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  190.   {0x000000,0x000000,0x000000,0xf00000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  191.   {0x000000,0x000000,0x000000,0x000000,0xf00000,0x000000,0x000000,0x000000,0x000000,0x000000},
  192.   {0x000000,0x000000,0x000000,0x000000,0x000000,0xf00000,0x000000,0x000000,0x000000,0x000000},
  193.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xf00000,0x000000,0x000000,0x000000},
  194.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xf00000,0x000000,0x000000},
  195.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xf00000,0x000000},
  196.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xf00000},
  197. };
  198.  
  199. // Each ROW changes which LED is bright, creating a moving pattern
  200. PROGMEM const unsigned long pattern_test_comet1[][10]={
  201.   {0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  202.   {0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  203.   {0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  204.   {0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  205.   {0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000},
  206.   {0x000000,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000},
  207.   {0x000000,0x000000,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000},
  208.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000},
  209.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000},
  210.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x111111,0x444444,0xfdfdfd},
  211. };
  212.  
  213. PROGMEM const unsigned long pattern_test_comet2[][10]={
  214.   {0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000},
  215.   {0x444444,0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000},
  216.   {0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000},
  217.   {0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000},
  218.   {0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd},
  219.   {0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000},
  220.   {0x444444,0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000},
  221.   {0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000},
  222.   {0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000},
  223.   {0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd},
  224. };
  225.  
  226. PROGMEM const unsigned long pattern_test_comet3[][10]={
  227.   {0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xfdfdfd},
  228.   {0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xfdfdfd,0x444444},
  229.   {0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0xfdfdfd,0x444444,0x111111},
  230.   {0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0xfdfdfd,0x444444,0x111111,0x000000},
  231.   {0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0xfdfdfd,0x444444,0x111111,0x000000,0x000000},
  232.   {0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0xfdfdfd,0x444444,0x111111,0x000000,0x000000},
  233.   {0x000000,0x000000,0x000000,0xfdfdfd,0x444444,0x444444,0xfdfdfd,0x000000,0x000000,0x000000},
  234.   {0x000000,0x000000,0xfdfdfd,0x444444,0x111111,0x111111,0x444444,0xfdfdfd,0x000000,0x000000},
  235.   {0x000000,0xfdfdfd,0x444444,0x111111,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000},
  236.   {0xfdfdfd,0x444444,0x111111,0x000000,0x000000,0x000000,0x000000,0x111111,0x444444,0xfdfdfd},
  237. };
  238.  
  239. //  Each row changes the color and intensity of the LEDs
  240. PROGMEM const unsigned long rainbow1[][10]={
  241.   {0xfd0000,0xfd7f00,0xfdfd00,0x00fd00,0x0000fd,0x6f00fd,0x8f00fd,0x000000,0x000000,0x000000},
  242.   {0x000000,0xfd0000,0xfd7f00,0xfdfd00,0x00fd00,0x0000fd,0x6f00fd,0x8f00fd,0x000000,0x000000},
  243.   {0x000000,0x000000,0xfd0000,0xfd7f00,0xfdfd00,0x00fd00,0x0000fd,0x6f00fd,0x8f00fd,0x000000},
  244.   {0x000000,0x000000,0x000000,0xfd0000,0xfd7f00,0xfdfd00,0x00fd00,0x0000fd,0x6f00fd,0x8f00fd},
  245.   {0x8f00fd,0x000000,0x000000,0x000000,0xfd0000,0xfd7f00,0xfdfd00,0x00fd00,0x0000fd,0x6f00fd},
  246.   {0x6f00fd,0x8f00fd,0x000000,0x000000,0x000000,0xfd0000,0xfd7f00,0xfdfd00,0x00fd00,0x0000fd},
  247.   {0x0000fd,0x6f00fd,0x8f00fd,0x000000,0x000000,0x000000,0xfd0000,0xfd7f00,0xfdfd00,0x00fd00},
  248.   {0x00fd00,0x0000fd,0x6f00fd,0x8f00fd,0x000000,0x000000,0x000000,0xfd0000,0xfd7f00,0xfdfd00},
  249.   {0xfdfd00,0x00fd00,0x0000fd,0x6f00fd,0x8f00fd,0x000000,0x000000,0x000000,0xfd0000,0xfd7f00},
  250.   {0xfd7f00,0xfdfd00,0x00fd00,0x0000fd,0x6f00fd,0x8f00fd,0x0000fd,0x00fd00,0xfdfd00,0xfdfd00},
  251. };
  252.  
  253. PROGMEM const unsigned long cylon_test_red[][10]={
  254.   {0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000},
  255.   {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000},
  256.   {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000},
  257.   {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000},
  258.   {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000},
  259.   {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000},
  260.   {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000},
  261.   {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000},
  262.   {0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x0000f0,0x000000,0x000000},
  263.   {0x000000,0x000000,0x000000,0x000000,0xf0f0f0,0x000000,0x000000,0x000000,0x000000,0x000000},
  264. };
  265.  
  266. PROGMEM const unsigned long red_cylon_R[][10]={
  267.   {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  268.   {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  269.   {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  270.   {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  271.   {0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000},
  272.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000},
  273.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000},
  274.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000},
  275.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000},
  276.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
  277. };
  278.  
  279. PROGMEM const unsigned long red_cylon_L[][10]={
  280.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
  281.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000},
  282.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000},
  283.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000},
  284.   {0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000},
  285.   {0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000},
  286.   {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  287.   {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  288.   {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  289.   {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
  290. };
  291.  
  292. PROGMEM const unsigned long star_trek_bridge[][10]={
  293.   {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
  294.   {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000},
  295.   {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000},
  296.   {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000},
  297.   {0x000000,0x000000,0x000000,0x000000,0x0000f0,0xf000f0,0x000000,0x000000,0x000000,0x000000},
  298.   {0x000000,0x000000,0x000000,0x000000,0xd000d0,0xd000d0,0x000000,0x000000,0x000000,0x000000},
  299.   {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000},
  300.   {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000},
  301.   {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000},
  302.   {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
  303. };
  304.  
  305. // ***********************************************************************************************************
  306. // *                            INITIALIZE the system on Power Up or after a RESET
  307. // *
  308. // ***********************************************************************************************************
  309. void setup() {              
  310.  
  311.   STRIP_PINOUT; // sets the output pin to control the LED Strip
  312.   reset_strip(); // resets each of the LED nodes to OFF
  313.  
  314. }
  315.  
  316.  
  317. // ***********************************************************************************************************
  318. // *                            Main Program Loop
  319. // *
  320. // ***********************************************************************************************************
  321. void loop()
  322. {
  323.  
  324. /*
  325. This is a TEST PATTERN to show that all of the
  326. segments ("nodes") are working properly.
  327. This Runs Only ONCE ... because the next loop
  328. never finishes.  
  329.  
  330. You could remove the WHILE loop and then these patterns
  331. would run continuously, as long as there is power to the board.
  332. */
  333.  
  334. /* CHASING PRIMARY COLORS */
  335.   int q = 1;
  336.   send_1M_pattern(chasing_green, 10, 50);
  337.   delay(500);
  338.   send_1M_pattern(chasing_blue, 10, 500);
  339.   delay(500);
  340.   send_1M_pattern(chasing_red, 10, 500);
  341.   delay(500);
  342.  
  343. /* CHASING WHITE */
  344.   send_1M_pattern(chasing_white, 10, 500);
  345.   delay(500);
  346.  
  347.   send_1M_pattern(pattern_test_comet1, 10, 70);
  348.   delay(500);
  349.   send_1M_pattern(pattern_test_comet2, 10, 70);
  350.   delay(500);
  351.   send_1M_pattern(pattern_test_comet3, 10, 70);
  352.   delay(500);
  353.  
  354. /* RAINBOW TEST PATTERN */  
  355.   send_1M_pattern(rainbow1, 10, 100);
  356.   delay(1000); // Wait for one second to make you think about the infinite loop
  357.  
  358.  
  359. /* TEN CYCLES OF TREK BRIDGE */
  360.   q = 10;
  361.   while (q>0){
  362.      send_1M_pattern(star_trek_bridge, 10, 50);
  363.     q -= 1;
  364.   }
  365.   delay(500);
  366.  
  367. /*
  368. Use this to control which pattern is sent to the
  369. LED Strip.
  370.  
  371. This loop runs will run continuously inside the "master" loop;
  372. because the value of WHILE (1) never changes.  You may elminate this,
  373. or add your own control program.
  374. */
  375.   while (1)
  376.   {
  377.   send_1M_pattern(chasing_white, 10, 100);
  378.   delay(500);
  379.   send_1M_pattern(rainbow1, 10, 100);
  380.   delay(500);
  381.   send_1M_pattern(chasing_green, 10, 50);
  382.   delay(1000); // Wait for one second to make you think about the infinite loop
  383.  
  384. /* RAINBOW TEST PATTERN */  
  385.   send_1M_pattern(rainbow1, 10, 100);
  386.   delay(1000); // Wait for one second to make you think about the infinite loop
  387.  
  388. /* TEN CYCLES OF CYLON */
  389.   q = 10;
  390.   while (q>0){
  391.     send_1M_pattern(cylon_test_red, 10, 100);
  392.     delay(500);
  393.     send_1M_pattern(red_cylon_R, 10, 70);
  394.     send_1M_pattern(red_cylon_L, 10, 70);
  395.     q -= 1;
  396.   }
  397.   delay(500);
  398.  
  399.  
  400. /* 5 CYCLES OF SIMPLE RED-WHITE-BLUE */
  401.   q = 5;
  402.   while (q>0){
  403.   send_1M_pattern(chasing_red, 10, 100);
  404.   delay(500);
  405.   send_1M_pattern(chasing_white, 10, 100);
  406.   delay(500);
  407.   send_1M_pattern(chasing_blue, 10, 100);
  408.   delay(500);
  409.   q -= 1;
  410.   }
  411.   delay(500);
  412.  
  413. /* FIVE CYCLES OF TREK BRIDGE */
  414.   q = 5;
  415.   while (q>0){
  416.      send_1M_pattern(star_trek_bridge, 10, 60);
  417.     q -= 1;
  418.   }
  419.   delay(500);
  420.  
  421. /* 10 CYCLES CHASING RED-WHITE-BLUE */
  422.     q = 10;
  423.     while (q>0){
  424.      send_1M_pattern(red_white_blue, 10, 100);
  425.     delay(300);
  426.     q -= 1;
  427.     }  
  428. delay(500);
  429.  
  430. /* 10 CYCLES OF RED-WHITE-BLUE BUILD UP */
  431.   q = 10;
  432.   while (q>0){
  433.   send_1M_pattern(first_red, 10, 100);
  434.   delay(500);
  435.   send_1M_pattern(second_red, 10, 100);
  436.   delay(500);
  437.   send_1M_pattern(first_white, 10, 100);
  438.   delay(500);
  439.   send_1M_pattern(second_white, 10, 100);
  440.   delay(500);
  441.   send_1M_pattern(first_blue, 10, 100);
  442.   delay(250);
  443.   send_1M_pattern(second_blue, 10, 100);
  444.   delay(500);
  445.   q -= 1;
  446.   }
  447.   delay(500);
  448.  
  449. /* 10 CYCLES CHASING RED-WHITE-BLUE */
  450.     q = 10;
  451.     while (q>0){
  452.        send_1M_pattern(red_white_blue, 10, 100);
  453.     delay(300);
  454.     q -= 1;
  455.     }  
  456. delay(500);
  457.  
  458.   } // END OF WHILE (1);
  459.  
  460.  
  461. } // END OF VOID LOOP() - In standard C++ otherwise known as MAIN();
  462.  
  463. /*******************************************************************************
  464. * Function Name:    send_1M_pattern
  465. * Description:      Transmit pattern to whole 1 meter strip              
  466. * Input :       Pointer to RAM pattern; pattern length; frame rate              
  467. * Output:       Sends out a serial pulse train using the send_strip function
  468. * Return:       None
  469. *******************************************************************************/
  470. void send_1M_pattern(const unsigned long data[][10], int pattern_no, int frame_rate)
  471. {
  472.   int i=0;
  473.   int j=0;
  474.   uint32_t temp_data;
  475.  
  476. // data[][10] is the name of the ARRAY with the RGB LED pattern values
  477. // Each pattern sends out [x] packets - one for each NODE (RGB LED cluster) in the strip
  478. // pattern_no is the [y] dimension of the array - the number of ROWS in each pattern array series
  479. // frame_rate is the DELAY before transmitting the next ROW in the pattern array
  480.   for (i=0;i<pattern_no;i++)
  481.   {
  482.     noInterrupts(); // Turn OFF Interupts for more precise Pulse Timing using MCU processing cycles
  483.     for (j=0;j<10;j++)
  484.     {
  485.       temp_data=pgm_read_dword_near(&data[i][j]);
  486.       send_strip(temp_data);
  487.     }
  488.     interrupts(); // Turn ON Interrupts after data is sent
  489.  
  490.     delay(frame_rate); // Delay between each pulse train - sets the duration of each FRAME, before the next series is sent;
  491.     /* CONTROLS THE VISUAL SPEED OF THE DISPLAY CHANGES */
  492.  
  493.   }
  494.  
  495. }
  496.  
  497.  
  498. /*******************************************************************************
  499. * Function Name:    send_strip
  500. * Description:      Creates and Transmits a serial train of 24 pulses for the LED strip              
  501. * Input:        24-bit data sets intensity of each color, which will persist until
  502. *           the next cycle makes a change                
  503. * Output:       Sends a train of 24 pulses (bits) representing values of 0 or 1 to the output pin ()
  504. *                       TIMING the OUTPUT pulses using the duration of the MCU NOP @ 16MHz
  505. * Return:       Nothing returned from function
  506. *******************************************************************************/
  507. void send_strip(uint32_t data)
  508. {
  509.   int i;
  510.   unsigned long j=0x800000;
  511.  
  512.   int d;
  513.   for (i=0;i<24;i++)
  514.   {
  515.     if (data & j)
  516.     {
  517.       DATA_1;
  518.       // TM1803 BIT 1 - Set OUTPUT PIN HIGH & HOLD FOR 1.55us or ~ 26 MCU CYCLES = 1.625us;
  519.       // The comparison (d<NN) uses ONE cycle, so the total delay is 2 X d X NOP (62.5 Nanoseconds);
  520.       for (d=1;d<13;d++)
  521.       {
  522.         __asm__(NOP);
  523.       }
  524.       DATA_0; // Set OUTPUT PIN LOW ;
  525.     }
  526.     else
  527.     {
  528.       DATA_1;
  529.      // TM1803 BIT 0 - Set OUTPUT PIN HIGH & HOLD FOR 0.78us or ~ 12 MCU CYCLES = .750us;
  530.      // The comparison (d<NN) uses ONE cycle, so the total delay is 2 X d X NOP (62.5 Nanoseconds);
  531.       for (d=1;d<5;d++)
  532.       {
  533.         __asm__(NOP);
  534.       }
  535.       DATA_0; // Set OUTPUT PIN LOW ;
  536. /*----------------------------*/    
  537.       __asm__(NOP);
  538.       __asm__(NOP);
  539.       __asm__(NOP);    
  540. /*----------------------------*/      
  541.     }
  542.     j>>=1;
  543.   }
  544.  
  545. }
  546. // END of send_strip();
  547.  
  548. /*******************************************************************************
  549. * Function Name:    reset_strip
  550. * Description:      Send a 0 pulse to reset all colors on all NODES of the strip              
  551. * Input:        None            
  552. * Output:       Sends out a looong duration 0 on the OUTPUT PIN to RESET the TM1803 chips
  553. * Return:       None
  554. *******************************************************************************/
  555. void reset_strip()
  556. {
  557.   DATA_0;
  558.   delayMicroseconds(20); // TM1803 specifies >= 24uS; // Arduino delay is actually slightly longer than assembler execution
  559. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement