Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MMA8451Q Multi_WS2811 NVIC_set_all_priorities TSI cc3000_hostdriver_mbedsocket mbed
Fork of CubicHand by
Revision 5:41f28ce7f5a9, committed 2014-12-05
- Comitter:
- joseoyola
- Date:
- Fri Dec 05 21:40:30 2014 +0000
- Parent:
- 2:45b90e8d7d82
- Child:
- 6:9a6c0c98e694
- Commit message:
- Commiting for Kevin's benefit. Adding functions to led.cpp
Changed in this revision
| led.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/led.cpp Fri Dec 05 20:59:10 2014 +0000
+++ b/led.cpp Fri Dec 05 21:40:30 2014 +0000
@@ -1,13 +1,191 @@
/*
* LED Cube library
- * by Jose Oyola and Robert Bui
+ * by Robert Bui and Jose Oyola
* UC Berkeley 2014
*/
#include "main.h"
#include "mbed.h"
+#include "WS2811.h"
+#include "Colors.h"
+#include "TSISensor.h"
+#include "MMA8451Q.h"
+
+
+#define MMA8451_I2C_ADDRESS (0x1d<<1)
+
+#define X 0
+#define Y 1
+#define Z 2
+
+#define PANEL1 0
+#define PANEL2 1
+#define PANEL3 2
+
+int pos[3];
+int size;
+
+// per LED: 3 * 20 mA = 60mA max
+// 60 LEDs: 60 * 60mA = 3600 mA max
+// 120 LEDs: 7200 mA max
+unsigned const nLEDs = 60;//MAX_LEDS_PER_STRIP;
+unsigned const nROWs = 3;
+unsigned const nCOLs = 20;
+
+
+
+// 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
+
+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 brightness;
+
+
+uint8_t r = 255*0.1;
+uint8_t g = 255*0.1;
+uint8_t b = 255*0.1;
+
+
+WS2811 lightStrip1(nLEDs, DATA_OUT_PIN1);
+WS2811 lightStrip2(nLEDs, DATA_OUT_PIN2);
+
+
+void readTouchSensor()
+{
+ touchPercentage *= 0.9;
+ touchPercentage += touchSensor.readPercentage() * 0.1;
+ brite = minBrite + (maxBrite - minBrite) * touchPercentage;
+}
- void move(deltaX, deltaY, deltaZ) {
- if(pos[Y] == 0 || pos[Z] == 9) {
+void move(deltaX, deltaY, deltaZ) {
+ //Moving in X direction
+ if(pos[Y] == 0 || pos[Z] == 9) { //Making sure square is "stuck" to panel 1 or 3
+ if((pos[X] + size + deltaX) < 10 && (pos[X] + deltaX) >= 0) {
+ pos[X] += deltaX;
+ }
+ }
+
+ //Moving in Y direction
+ if(pos[X] == 9 || pos[Z] == 9) {//Making sure square is "stuck" to panel 2 or 3
+ if((pos[Y] + size + deltaY) < 10 && (pos[Y] + deltaY) >= 0) {
+ pos[Y] += deltaY;
+ }
+ }
+
+ //Moving in Z direction
+ if(pos[X] == 9 || pos[Y] == 0) {//Making sure square is "stuck" to panel 1 or 2
+ if((pos[Z] + size + deltaZ) < 10 && (pos[Z] + deltaZ) >= 0) {
+ pos[Z] += deltaZ;
+ }
+ }
+
+ cubeUpdate();
+}
+
+void cubeUpdate() {
+ updateLEDs(false); //Turn off LEDs from previous state
+ updateLEDs(true); //Turn on new LEDs for new state
+}
+
+void updateLEDs(bool on) {
+ //Panel 1
+ if(pos[Y] == 0) {
+ for(int i = pos[X]; i < pos[X] + size; i++) {
+ for(int j = pos[Z]; j < pos[Z] + size; j++) {
+ int led = getLedIndex(PANEL1, i, j);
+ if(on) {
+ ledStrip1(led, r, g, b);
+ } else {
+ ledStrip1(led, 0, 0, 0);
+ }
+ }
+ }
+ }
+
+ //Panel 2
+ if(pos[X] + size == 0) {
+ for(int i = pos[X]; i < pos[X] + size; i++) {
+ for(int j = pos[Z]; j < pos[Z] + size; j++) {
+ int led = getLedIndex(PANEL1, i, j);
+ if(on) {
+ ledStrip1(led, r, g, b);
+ } else {
+ ledStrip1(led, 0, 0, 0);
+ }
+ }
+ }
+ }
+}
+
+
+
+
+static int matrixtolinear(int x, int y) {
+ int pos;
+ if( x % 2 == 0) {
+ pos = (x*nCOLs) +y;
+ }
+ else {
+ pos = (x*nCOLs) + ((nCOLs-1)-y);
+ }
+ return pos;
+}
+
+
+static void move( int delta_x, int delta_y, int old_size, int new_size)
+{
+ for( int i = pos_y; i < pos_y + old_size; i++){
+ for( int j= pos_x; j < pos_x + old_size; j++){
+ int pos_off = matrixtolinear(i,j);
+ if( pos_off >= nLEDs){lightStrip2.setPixelColor(pos_off-nLEDs, 0, 0, 0);}
+ else
+ {lightStrip1.setPixelColor(pos_off, 0, 0, 0);}
+
+ }
+ }
+ if ( (pos_y + (new_size-1) + delta_y < nROWs) && (pos_y + delta_y ) >= 0 ) {
+ pos_y = pos_y + delta_y;}
+ if ( (pos_x + (new_size-1) + delta_x < nCOLs ) && (pos_x + delta_x ) >= 0) {
+ pos_x = pos_x + delta_x;}
+
+ for( int i = pos_y; i < pos_y + new_size; i++){
+ for( int j= pos_x; j < pos_x + new_size; j++){
+ int pos_on = matrixtolinear(i,j);
+ if( pos_on >= nLEDs){lightStrip2.setPixelColor(pos_on-nLEDs, 0, g, 0);}
+ else
+ {lightStrip1.setPixelColor(pos_on, 0, g, 0);}
+ }
+ }
+
+ lightStrip1.show();
+ lightStrip2.show();
+ lightStrip1.startDMA();
+ lightStrip2.startDMA();
+}
+
+//Set initial position and size
+void init(void) {
+ pos_x = 0;
+ pos_y = 0;
+ size = 2;
}
\ No newline at end of file
