Simple 8x8 LED Matrix controller which interfaces with a Processing GUI over serial to display sketches
Dependencies: Multi_WS2811 mbed
Fork of Multi_WS2811_test by
Revision 33:7973b70d4fab, committed 2014-11-15
- Comitter:
- antoniorohit
- Date:
- Sat Nov 15 01:23:58 2014 +0000
- Parent:
- 32:7b60b9add4b5
- Child:
- 34:0f1968ca238a
- Commit message:
- Changed code to drive 8 strips (for an 8x8 matrix); There's some bug in it though. Weird stuff can happen;
Changed in this revision
| Multi_WS2811.lib | Show annotated file Show diff for this revision Revisions of this file |
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/Multi_WS2811.lib Fri Nov 14 08:18:35 2014 +0000 +++ b/Multi_WS2811.lib Sat Nov 15 01:23:58 2014 +0000 @@ -1,1 +1,1 @@ -http://developer.mbed.org/users/antoniorohit/code/Multi_WS2811/#9d9f7bfad0ce +http://developer.mbed.org/users/antoniorohit/code/Multi_WS2811/#8adaf48544cc
--- a/main.cpp Fri Nov 14 08:18:35 2014 +0000
+++ b/main.cpp Sat Nov 15 01:23:58 2014 +0000
@@ -1,64 +1,21 @@
#include "mbed.h"
#include "WS2811.h"
-#include "Colors.h"
-#include "TSISensor.h"
-#include "MMA8451Q.h"
-
-#define MMA8451_I2C_ADDRESS (0x1d<<1)
// per LED: 3 * 20 mA = 60mA max
// 60 LEDs: 60 * 60mA = 3600 mA max
// 120 LEDs: 7200 mA max
unsigned const nLEDs = MAX_LEDS_PER_STRIP;
-// I/O pin usage
-// PTD0 TPM0 CH0 monitor
-// PTD1 TPM0 CH1 monitor
-// PTD2 data output
-// PTD3 debug output
-
-unsigned const DATA_OUT_PIN1 = 2; // PTD2
-unsigned const DATA_OUT_PIN2 = 3; // PTD3
+unsigned const DATA_OUT_PIN1 = 7;
+unsigned const DATA_OUT_PIN2 = 0;
+unsigned const DATA_OUT_PIN3 = 3;
+unsigned const DATA_OUT_PIN4 = 4;
+unsigned const DATA_OUT_PIN5 = 5;
+unsigned const DATA_OUT_PIN6 = 6;
+unsigned const DATA_OUT_PIN7 = 10;
+unsigned const DATA_OUT_PIN8 = 11;
Serial pc(USBTX, USBRX);
-Timer timeRunning;
-
-TSISensor touchSensor;
-MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
-PwmOut rled(LED_RED);
-PwmOut gled(LED_GREEN);
-// LED_BLUE is on PTD1
-
-float touchPercentage;
-unsigned frames;
-
-float const minBrite = 0.2;
-float const maxBrite = 0.5;
-float brite;
-
-void readTouchSensor()
-{
- touchPercentage *= 0.9;
- touchPercentage += touchSensor.readPercentage() * 0.1;
- brite = minBrite + (maxBrite - minBrite) * touchPercentage;
-}
-
-// @brief sets different colors in each of the LEDs of a strip
-// @param strip the light strip
-// @param sat saturation, 0.0 - 1.0
-// @param brite brightness, 0.0 - 1.0
-// @param hueShift shift, 0.0 - 1.0 is equivalent to 0 - 360 degrees
-static void showRainbow(WS2811 &strip, float sat, float brite, float hueShift)
-{
- unsigned nLEDs = strip.numPixels();
- for (unsigned i = 0; i < nLEDs; i++) {
- uint8_t r, g, b;
- float hue = ((float)i / (float)nLEDs) + hueShift;
- HSBtoRGB(hue, sat, brite, &r, &g, &b);
- strip.setPixelColor(i, r, g, b);
- }
- strip.show();
-}
static void clearScreen(WS2811 &strip)
{
@@ -72,47 +29,94 @@
int main(void)
{
pc.baud(9600);
+ WS2811 *lightStrip;
WS2811 lightStrip1(nLEDs, DATA_OUT_PIN1);
WS2811 lightStrip2(nLEDs, DATA_OUT_PIN2);
-
+ WS2811 lightStrip3(nLEDs, DATA_OUT_PIN3);
+ WS2811 lightStrip4(nLEDs, DATA_OUT_PIN4);
+ WS2811 lightStrip5(nLEDs, DATA_OUT_PIN5);
+ WS2811 lightStrip6(nLEDs, DATA_OUT_PIN6);
+ WS2811 lightStrip7(nLEDs, DATA_OUT_PIN7);
+ WS2811 lightStrip8(nLEDs, DATA_OUT_PIN8);
+
lightStrip1.begin();
lightStrip2.begin();
- rled = 1.0;
- gled = 1.0;
-
- float sat = 1.0;
-
- timeRunning.start();
-
+ lightStrip3.begin();
+ lightStrip4.begin();
+ lightStrip5.begin();
+ lightStrip6.begin();
+ lightStrip7.begin();
+ lightStrip8.begin();
uint8_t q = 0;
- char char_buff[6];
+ char char_buff[10];
+ char curr_char = 0;
+
for (;;) {
- if(pc.readable()){
- if(pc.getc()==255){
- while(q < 6){
- while(!pc.readable());
- char_buff[q] = pc.getc();
- pc.putc(char_buff[q]);
- if(char_buff[q] == 254)
- break;
- q++;
- }
+ /* I have defined a custom UART packet protocol
+ * A general packet may look like:
+ * array[0] x-coordinate [0, 31]
+ * array[1] y-coordinate [0, 15]
+ * array[2] R (5-bit)
+ * array[3] G (5-bit)
+ * array[4] B (5-bit)
+ * array[5] 254 (delimiter)
+ */
+ while(curr_char != 255 && q < 7)
+ {
+ /* If there is UART traffic */
+ if(pc.readable())
+ {
+ curr_char = pc.getc();
+ char_buff[q] = curr_char;
+ q++;
+ }
+ }
+
+ if((char_buff[0] == 254) && (q >= 5)){
+ switch(int(char_buff[2])){
+ case 0:
+ lightStrip = &lightStrip1;
+ break;
+ case 1:
+ lightStrip = &lightStrip2;
+ break;
+ case 2:
+ lightStrip = &lightStrip3;
+ break;
+ case 3:
+ lightStrip = &lightStrip4;
+ break;
+ case 4:
+ lightStrip = &lightStrip5;
+ break;
+ case 5:
+ lightStrip = &lightStrip6;
+ break;
+ case 6:
+ lightStrip = &lightStrip7;
+ break;
+ case 7:
+ lightStrip = &lightStrip8;
+ break;
+ default:
+ lightStrip = &lightStrip1;
+ q = 0;
+ break;
+ }
+
+ (*lightStrip).setPixelColor(int(char_buff[1]), int(char_buff[3]), int(char_buff[4]), int(char_buff[5]));
+
+ (*lightStrip).show();
+ pc.putc(48+int(char_buff[0]));
+ }
+ else{
+ //clearScreen(*lightStrip);
+ }
+ q = 0;
+ curr_char = 0;
+ WS2811::startDMA();
- if(q >= 4){
- lightStrip1.setPixelColor(int(char_buff[0])+8*char_buff[1], int(char_buff[2]), int(char_buff[3]), int(char_buff[4]));
- lightStrip1.show();
- }
- else{
- clearScreen(lightStrip1);
- }
- q = 0;
- WS2811::startDMA();
- }
- }
-
-
- frames ++;
}
}
