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
led.cpp
- Committer:
- joseoyola
- Date:
- 2014-12-05
- Revision:
- 8:c06f5046c9f7
- Parent:
- 5:41f28ce7f5a9
- Child:
- 10:9d87a886f066
File content as of revision 8:c06f5046c9f7:
/*
* LED Cube library
* 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 = 0;
// 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 = 10;
unsigned const nCOLs = 10;
// 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_PIN3 = 4; // 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);
WS2811 lightStrip3(nLEDs, DATA_OUT_PIN2);
void readTouchSensor()
{
touchPercentage *= 0.(nCOLs - 1);
touchPercentage += touchSensor.readPercentage() * 0.1;
brite = minBrite + (maxBrite - minBrite) * touchPercentage;
}
void move(deltaX, deltaY, deltaZ) {
//Moving in X direction
if(pos[Y] == 0 || pos[Z] == (nCOLs - 1)) { //Making sure square is "stuck" to panel 1 or 3
if((pos[X] + size + deltaX) < nCOLs && (pos[X] + deltaX) >= 0) {
pos[X] += deltaX;
}
}
//Moving in Y direction
if(pos[X] == (nCOLs - 1) || pos[Z] == (nCOLs - 1)) {//Making sure square is "stuck" to panel 2 or 3
if((pos[Y] + size + deltaY) < nCOLs && (pos[Y] + deltaY) >= 0) {
pos[Y] += deltaY;
}
}
//Moving in Z direction
if(pos[X] == (nCOLs - 1) || pos[Y] == 0) {//Making sure square is "stuck" to panel 1 or 2
if((pos[Z] + size + deltaZ) < nCOLs && (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 == (nCOLs - 1)) {
for(int i = pos[Y]; i < pos[Y] + size; i++) {
for(int j = pos[Z]; j < pos[Z] + size; j++) {
int led = getLedIndex(PANEL2, i, j);
if(on) {
ledStrip2(led, r, g, b);
} else {
ledStrip2(led, 0, 0, 0);
}
}
}
}
//Panel 3
if(pos[Z] + size == (nCOLs - 1)) {
for(int i = pos[X]; i < pos[X] + size; i++) {
for(int j = pos[Y]; j < pos[Y] + size; j++) {
int led = getLedIndex(PANEL3, i, j);
if(on) {
ledStrip3(led, r, g, b);
} else {
ledStrip3(led, 0, 0, 0);
}
}
}
}
}
static int getLedIndex(int panel, int x, int y) {
if (panel == PANEL1) {
if (y % 2 == 0) {
return nCOLs*2 * y + x;
}
else {
return nCOLs*2 * y + nCOLs + ((nCOLs - 1) - x);
}
}
if (panel == PANEL2) {
if (y % 2 == 0) {
return nCOLs*2 * y + nCOLs + x;
}
else {
return nCOLs*2 * y + ((nCOLs - 1) - x);
}
}
if (panel == PANEL3) {
if (y % 2 == 0) {
return nCOLs * y + x;
}
else {
return nCOLs * y + ((nCOLs - 1) - x);
}
}
else return -1;
}
/*
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();
}
*/
