Difference between revisions of "Blog 24"

From BitWizard WIKI
Jump to: navigation, search
(The code)
Line 1: Line 1:
== Working with RGB leds on the WS2812 ==
+
== Connecting the WS2812 ==
 +
 
 +
First you just have to connect the WS2812 with a micro-USB cable to your device.
 +
 
 +
You have to use C-kermit or PuTTY:
  
 
For Linux/Raspberry:  
 
For Linux/Raspberry:  
 
  apt-get install ckermit
 
  apt-get install ckermit
  
If you use and other device, or want to know more:
+
If you use an other device, or want to know more:
 
  [http://www.kermitproject.org/ck90.html C-Kermit]
 
  [http://www.kermitproject.org/ck90.html C-Kermit]
  
Line 10: Line 14:
 
  [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuTTY]
 
  [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuTTY]
  
 
+
On a UNIX device, when you want to run the code from the device to the WS2812. You have to type in the terminal:
 
 
=== Connecting with the WS2812 ===
 
 
 
First you just have to connect the WS2812 with a micro-USB cable to your device.
 
 
 
You have to use C-kermit or PuTTY or an other program, which could run the c-program.
 
 
 
On a UNIX device, whebn you want to run the code from the device to the WS2812. You have to type in the terminal:
 
 
  /usr/bin/kermit -l /dev/ttyACM0  
 
  /usr/bin/kermit -l /dev/ttyACM0  
 
It could be that you have to send to/from an other destination.  
 
It could be that you have to send to/from an other destination.  
Line 28: Line 24:
 
  SET CARRIER-WATCH OFF
 
  SET CARRIER-WATCH OFF
  
If you don't want to ask this every time you start up c. You can make a new terminal and write:
+
If you don't want to ask this every time you start up with c. You can make a new terminal and write:
 
  nano .kermrc  
 
  nano .kermrc  
  
That file should only have the code:
+
That file(.kermrc) should only have the code:
 
  SET CARRIER-WATCH OFF
 
  SET CARRIER-WATCH OFF
  
If the carrier-watch is off you have to type c again.  
+
When the carrier-watch is off you have to type c again.  
  
Now you can finally send form an other terminal the information to the ws2812.
 
 
Before you send a code to the ws2812 check it with:
 
Before you send a code to the ws2812 check it with:
 
  gcc -Wall -o randomname randomname.c
 
  gcc -Wall -o randomname randomname.c
  
The random name should be the same.
 
 
After that you can send it to the ws2812 with:
 
After that you can send it to the ws2812 with:
 
  ./randomname > /dev/ttyACM1
 
  ./randomname > /dev/ttyACM1
Line 59: Line 53:
 
The RGB leds:
 
The RGB leds:
 
[[File:RGBTree1.jpg|none|400px]]
 
[[File:RGBTree1.jpg|none|400px]]
On ////J7 a connector is added, also an cable from the J1 was connected on pin 15 with the second pin from J7.
+
The image pretty much explains itself. What you have to do is connect RGB with the 3-pin header.( GND - pin 1  | DO - pin 2 | +5V - pin 3 )
The image further on explains itself.  
+
The pointers of this example RGB strip should be pointing away from the WS2812 usb controller.
You still have to look out, that you let the pointers point away from the usb ws2812.  
 
 
 
  
 
Paper tree:
 
Paper tree:
The paper tree is made by folding a green paper. On the folded green paper I put my RGB led connection. Around the RGB led I draw a Christmas tree. At the point every single RGB led were laying I put a dot with a pencil.
+
The paper tree is made by folding a green paper. On the folded green paper I put my RGB led connection. Around the RGB led I drew a Christmas tree. At the points where every single RGB led were laying I put a dot by using a pencil.
After that I cut the tree and put holes only on paper with the pencil dots. After that I used some scotch tape to bring it all together. The final result:
+
After that I cut the tree out and made holes at the pencil dots. After that I used some scotch tape to bring the front and back paper together. The final result:
 
[[File:RGBTree2.jpg|none|400px]]
 
[[File:RGBTree2.jpg|none|400px]]
 
You can of course go all crazy with the tree by adding glitters and stuff like that.
 
You can of course go all crazy with the tree by adding glitters and stuff like that.
Line 75: Line 67:
 
The full c-program RGBTree.c can be downloaded: [http://bitwizard.nl/source/ here].
 
The full c-program RGBTree.c can be downloaded: [http://bitwizard.nl/source/ here].
  
What the code does in short is this: When starting up it will make the the top led (the peak) white. It will then read the for statement where it goes through all the leds under the peak. Every led will randomly get the color green or red. Then the script will keep fading the colors of the leds from to the opposite color. ( red to green or green to red )     
+
What the code does in short is this: When starting up it will make the the peak RGB led white. It will then read the for statement where it goes through all the RGB leds(Except the peak). Every RGB led will randomly get the color green or red. The script will then keep fading the colors of the RGB leds to the opposite color. ( red to green or green to red )     
  
 
The parts of the script that I will give some explanation:
 
The parts of the script that I will give some explanation:
Line 86: Line 78:
 
  #define BLUE  0x0000ff
 
  #define BLUE  0x0000ff
 
  #define BLACK  0x000000
 
  #define BLACK  0x000000
Because it's RGB ( red green blue ) the first ff is making the red led go to it's maximum. The middle ff is for green and the last for blue. It works in hexadecimals so you can lower or make the density higher or lower. And mix them so that you can get different colors as for example yellow.  
+
Because it's RGB ( red green blue ) the first two zeros can be used for changing the the amount of red color. The middle two zeros are for the amount of green and the last two are for blue. With this you can mix the colors and make different colors.  
  
 
Here the amount of time and steps in milliseconds is given for to make the fading go fluent.  
 
Here the amount of time and steps in milliseconds is given for to make the fading go fluent.  
Line 92: Line 84:
 
  int delayms = 30;  
 
  int delayms = 30;  
 
   
 
   
 
+
In interpolate it will get the values from fadeto three times ( for every color r, g & b )
 +
It will give new values to c1 and c2 it will bit shift it to the right, and give it the value together with 0xff. 
 +
After that it calculates difference between previous color.
  
 
  int interpolate (int c1, int c2, int shift, int pos, int end)
 
  int interpolate (int c1, int c2, int shift, int pos, int end)
Line 104: Line 98:
 
  }
 
  }
 
   
 
   
Here the colors are given. void fadeto recieves the information from int main for example: (5, RED, GREEN).  
+
Void fadeto receives the information from int main for example: (5, RED, GREEN).  
 
It will give the information to every single part of the rgb led. So in this example it would be that red will change from 80 to 00.  
 
It will give the information to every single part of the rgb led. So in this example it would be that red will change from 80 to 00.  
 +
it will keep doing calculations of the steps until it reached 30(nfadesteps).
 +
After that it prints out on the certain RGB led that given color values.
  
 
  void fadeto (int pixnum, int col1, int col2)
 
  void fadeto (int pixnum, int col1, int col2)

Revision as of 18:33, 7 January 2016

Connecting the WS2812

First you just have to connect the WS2812 with a micro-USB cable to your device.

You have to use C-kermit or PuTTY:

For Linux/Raspberry:

apt-get install ckermit

If you use an other device, or want to know more:

C-Kermit

For Windows users it's optional to use:

PuTTY

On a UNIX device, when you want to run the code from the device to the WS2812. You have to type in the terminal:

/usr/bin/kermit -l /dev/ttyACM0 

It could be that you have to send to/from an other destination.

It will then say C-kermit is opened. You then just have to type the letter:

c

It will tell you to turn off carrier watch with:

SET CARRIER-WATCH OFF

If you don't want to ask this every time you start up with c. You can make a new terminal and write:

nano .kermrc 

That file(.kermrc) should only have the code:

SET CARRIER-WATCH OFF

When the carrier-watch is off you have to type c again.

Before you send a code to the ws2812 check it with:

gcc -Wall -o randomname randomname.c

After that you can send it to the ws2812 with:

./randomname > /dev/ttyACM1

RGB lighted paper Tree

Hardware used:

Software used on my linux pc:

  • C-kermit


Making the construction

The RGB leds:

RGBTree1.jpg

The image pretty much explains itself. What you have to do is connect RGB with the 3-pin header.( GND - pin 1 | DO - pin 2 | +5V - pin 3 ) The pointers of this example RGB strip should be pointing away from the WS2812 usb controller.

Paper tree: The paper tree is made by folding a green paper. On the folded green paper I put my RGB led connection. Around the RGB led I drew a Christmas tree. At the points where every single RGB led were laying I put a dot by using a pencil. After that I cut the tree out and made holes at the pencil dots. After that I used some scotch tape to bring the front and back paper together. The final result:

RGBTree2.jpg

You can of course go all crazy with the tree by adding glitters and stuff like that.


The code

The full c-program RGBTree.c can be downloaded: here.

What the code does in short is this: When starting up it will make the the peak RGB led white. It will then read the for statement where it goes through all the RGB leds(Except the peak). Every RGB led will randomly get the color green or red. The script will then keep fading the colors of the RGB leds to the opposite color. ( red to green or green to red )

The parts of the script that I will give some explanation:

Here I made a list of colors(if you also want other colors search for: color table):

#define WHITE  0xffffff
#define YELLOW 0xffff00
#define RED    0x800000
#define GREEN  0x008000
#define BLUE   0x0000ff
#define BLACK  0x000000

Because it's RGB ( red green blue ) the first two zeros can be used for changing the the amount of red color. The middle two zeros are for the amount of green and the last two are for blue. With this you can mix the colors and make different colors.

Here the amount of time and steps in milliseconds is given for to make the fading go fluent.

int nfadesteps = 30;
int delayms = 30; 

In interpolate it will get the values from fadeto three times ( for every color r, g & b ) It will give new values to c1 and c2 it will bit shift it to the right, and give it the value together with 0xff. After that it calculates difference between previous color.

int interpolate (int c1, int c2, int shift, int pos, int end)
{
  c1 >>= shift;
  c2 >>= shift;
  c1 &= 0xff;
  c2 &= 0xff;

  return c1 * (end-pos) / end + c2 * pos / end;
}

Void fadeto receives the information from int main for example: (5, RED, GREEN). It will give the information to every single part of the rgb led. So in this example it would be that red will change from 80 to 00. it will keep doing calculations of the steps until it reached 30(nfadesteps). After that it prints out on the certain RGB led that given color values.

void fadeto (int pixnum, int col1, int col2)
{
   int i; 
   int r, g, b; 

   for (i=0;i <= nfadesteps;i++) {
      r = interpolate (col1, col2, 16, i, nfadesteps);
      g = interpolate (col1, col2,  8, i, nfadesteps);
      b = interpolate (col1, col2,  0, i, nfadesteps);
      printf ("pix %d %06x\n", pixnum, 
	 (r << 16) | (g << 8) | (b << 0)); 

      usleep (delayms*1000);
   }
}


After that the peak led will get white.


int main (int argc, char **argv)
{
  int nleds = 10;
  int *pixels;
  int pixnum, newcolor;
  int i;
  
  if (argc > 1) 
    nleds = atoi (argv[1]);

  pixels = calloc (nleds, sizeof(int));
  
  printf ("pix %d %06x\n", nleds, WHITE);  

The for statements is the first loop that is getting used. It will count from zero till nine. Every time it counts it will get a random number and use a remainder to divide it with. The result could be a zero or an one. If it is zero the color red will be given else it would be green. After that it will directly be printed, so that i can be changed to the next number.

  for (i=0;i < nleds;i++){  
    if (random () % 2 == 0)
       pixels[i] = RED;
    else
       pixels[i] = GREEN;
    printf ("pix %d %06x\n", i, pixels[i]);  
  }

In the while statement it has to choose a random led. It does this by giving a random number and remainder it with nleds. If it then has chosen the certain led it will look if the led is red. If that is true it will say that the newcolor has to become green. Else the opposite will happen, so that the led will become red. The given values will then be sended to fadeto. ( Example: (5, RED, GREEN). After that it will save the newcolour in the previous led color. so pixels[05] would become green.

  while (1) {
     pixnum = random () % nleds; 
     if (pixels[pixnum] == RED) 
	newcolor = GREEN;
     else 
       newcolor = RED; 
     fadeto (pixnum, pixels[pixnum], newcolor);
     pixels[pixnum] = newcolor;
  }
  exit (0);

}
RGBThree.jpg


Resetting the WS2812

Maybe you will get the experience that the ws2812 crashed and has to be resetted. When the RGB leds are still attached they will get a rainbow effect. To reset the WS2812 you have put a male-female cable on pin 5 on the horizontal connector. The male part of the connector should then hit the ground once. After that you can do the previous commands and everything should work fine again.

Useful links