Final Project: Project Update #3

Last week I finished most of the non-electronic aspect of the costume design.

On the performance day, I will wear a white shirt under the outer garment and probably black pants to look like a conductor of an orchestra.

IMG_8775


This week I focused more on codings especially the radio transmission of data used to generate and control sound within a MAX/MSP environment. We switched from bluetooth wireless to radio wireless (as shown in the picture below) as bluetooth had some connection problem with Mac causing the data transmission to be unstable.

nrf24L01-black
The nRF24L01 is a highly integrated, ultra low power (ULP) 2Mbps RF transceiver IC for the 2.4GHz ISM (Industrial, Scientific and Medical) band.

Basically there are two nRF24L01 transceivers with one as the transmitter sending out the data and the other one receiving the data. The transmitter will be connected to Lilypad which is sewn onto the costume. The receiver will be connected to Randall’s Mac and Max software will be extracting data from it to generate sound control.

Following is the code I have developed under the guidance of Naga. It is for both receiver and transmitter. Just change the value of the variable “role” to either “sender” or “receiver” when programming respective boards.

Probably you have noticed the big chunks of “if-else” clauses. They were written to ensure a gradual change of the parameter. As the proximity sensor sometimes gave us very sudden changes of the data, which in turn caused Max software unable to perceive and process it.

/* THIS PROGRAM IS SENDER AND RECEIVER FOR RADIO COMMUNICATION

SENDER HAS THE SENSOR CONNECTED
RECEIVER IS CONNECTED TO LAPTOP

*/

#include <SPI.h>
#include “nRF24L01.h”
#include “RF24.h”
#include “printf.h”

RF24 radio(9,10);
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

typedef enum { SENDER=1, RECEIVER} role_e;
const char* role_name[] = { “invalid”, “SENDER”, “RECEIVER”};

role_e role = SENDER;

int sensor_pin = A0;
int recv_values[3];
int sensor_values[3];
int ack_values[3];
int ar_size = 3;
uint8_t tmp;
uint8_t cnt;
bool read_status = false;
bool write_status = false;
int current_val ;
int previous_val;
int new_distance;
int old_distance;
int diff_distance;
int distance;

//LED section
int led = 8; // the PWM pin the LED is attached to
int brightness = 0; // how bright the LED is
int fadeAmount = 5; // how many points to fade the LED by

void setup()
{

pinMode(sensor_pin, INPUT);
// declare pin 8 to be an output:
pinMode(led, OUTPUT);
Serial.begin(57600);
printf_begin();
Serial.println(role_name[role]);

radio.begin();
radio.setRetries(15,15);
radio.setPayloadSize(sizeof(int)*ar_size);

if(role == SENDER)
{
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);
}
if(role == RECEIVER)
{
radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1,pipes[0]);
}
radio.startListening();
radio.printDetails();
delay(20);

old_distance = analogRead(sensor_pin);
}

void loop()
{

if(role == SENDER)
{
radio.stopListening();
unsigned long time = millis();
//printf(“Now sending %lu…”,time);

new_distance = analogRead(sensor_pin);
diff_distance = new_distance – old_distance;

printf(“%d %d %d”, new_distance, old_distance, diff_distance);

if (diff_distance >=10){ //sudden change in data
//make sudden changes smooth
distance = old_distance;
printf(“%d”,distance);
//for (int counter = 0; counter < diff_distance; counter++) {
distance = distance + int(diff_distance/4);
if (distance <= 12) {
distance = 1;
} else if (distance <= 14){
distance = 2;
} else if (distance <= 16){
distance = 3;
} else if (distance <= 18 ){
distance = 4;
} else if (distance <= 20 ){
distance = 5;
} else if (distance <= 22 ){
distance = 6;
} else if (distance <= 24){
distance = 7;
} else if (distance <= 26){
distance = 8;
} else if (distance <= 28){
distance = 9;
} else if (distance <= 30){
distance = 10;
} else if (distance <= 32){
distance = 11;
} else if (distance <= 34){
distance = 12;
} else if (distance <= 36){
distance = 13;
} else if (distance <= 38 ){
distance = 14;
} else if (distance <= 40){
distance = 15;
} else if (distance <= 42){
distance = 16;
} else if (distance <= 44){
distance = 17;
} else if (distance <= 46){
distance = 18;
} else if (distance <= 48){
distance = 19;
} else if (distance <= 50){
distance = 20;
} else if (distance <= 52){
distance = 21;
} else if (distance <= 54 ){
distance = 22;
} else if (distance <= 56){
distance = 23;
} else if (distance <= 58){
distance = 24;
} else if (distance <= 60){
distance = 25;
} else if (distance <= 62){
distance = 26;
} else if (distance <= 64){
distance = 27;
} else if (distance <= 66){
distance = 28;
} else if (distance <= 68){
distance = 29;
} else if (distance <= 70 ){
distance = 30;
} else if (distance <= 72){
distance = 31;
} else if (distance <= 74){
distance = 32;
} else if (distance <= 76){
distance = 33;
} else if (distance <= 78){
distance = 34;
} else if (distance <= 80){
distance = 35;
} else if (distance <= 82){
distance = 36;
} else if (distance <= 84){
distance = 37;
} else if (distance <= 86 ){
distance = 38;
} else if (distance <= 88){
distance = 39;
} else if (distance <= 90){
distance = 40;
} else if (distance <= 92){
distance = 41;
} else if (distance <= 94){
distance = 42;
} else if (distance <= 96){
distance = 43;
} else if (distance <= 98){
distance = 44;
} else if (distance <= 100){
distance = 45;
} else if (distance <= 102){
distance = 46;
} else if (distance <= 104){
distance =47;
} else if (distance <= 106){
distance = 48;
} else if (distance <= 108 ){
distance = 49;
} else if (distance <= 110){
distance = 50;
}else if (distance <= 112){
distance = 51;
}else if (distance <= 114){
distance = 52;
}else if (distance <= 116){
distance = 53;
}else if (distance <= 118){
distance = 54;
}else if (distance <= 120 ){
distance = 55;
} else if (distance <= 122 ){
distance = 56;
} else if (distance <= 124){
distance = 57;
} else if (distance <= 126){
distance = 58;
} else if (distance <= 128){
distance = 59;
} else if (distance <= 130){
distance = 60;
} else if (distance <= 132){
distance = 61;
} else if (distance <= 134){
distance = 62;
} else if (distance <= 136){
distance = 63;
} else if (distance <= 138 ){
distance = 64;
} else if (distance <= 140){
distance = 65;
} else if (distance <= 142){
distance = 66;
} else if (distance <= 144){
distance = 67;
} else if (distance <= 146){
distance = 68;
} else if (distance <= 148){
distance = 69;
} else if (distance <= 150){
distance = 70;
} else if (distance <= 152){
distance = 71;
} else if (distance <= 154 ){
distance = 72;
} else if (distance <= 156){
distance = 73;
} else if (distance <= 158){
distance = 74;
} else if (distance <= 160){
distance = 75;
} else if (distance <= 162){
distance = 76;
} else if (distance <= 164){
distance = 77;
} else if (distance <= 166){
distance = 78;
} else if (distance <= 168){
distance = 79;
} else if (distance <= 170 ){
distance = 80;
} else if (distance <= 172){
distance = 81;
} else if (distance <= 174){
distance = 82;
} else if (distance <= 176){
distance = 83;
} else if (distance <= 178){
distance = 84;
} else if (distance <= 180){
distance = 85;
} else if (distance <= 182){
distance = 86;
} else if (distance <= 184){
distance = 87;
} else if (distance <= 186 ){
distance = 88;
} else if (distance <= 188){
distance = 89;
} else if (distance <= 190){
distance = 90;
} else if (distance <= 192){
distance = 91;
} else if (distance <= 194){
distance = 92;
} else if (distance <= 196){
distance = 93;
} else if (distance <= 198){
distance = 94;
} else if (distance <= 200){
distance = 95;
} else if (distance <= 202){
distance = 96;
} else if (distance <= 204){
distance = 97;
} else if (distance <= 206){
distance = 98;
} else if (distance <= 208){
distance = 99;
} else if (distance <= 210){
distance = 100;
} else if (distance <= 212){
distance = 101;
} else if (distance <= 214){
distance = 102;
} else if (distance <= 216){
distance = 103;
} else if (distance <= 218){
distance = 104;
} else if (distance <= 220){
distance = 105;
} else if (distance <= 222){
distance = 106;
} else if (distance <= 224){
distance = 107;
} else if (distance <= 226){
distance = 108;
} else if (distance <= 228){
distance = 109;
} else if (distance <= 230){
distance = 110;
} else if (distance <= 232){
distance = 111;
} else if (distance <= 234){
distance = 112;
} else if (distance <= 236){
distance = 113;
} else if (distance <= 238){
distance = 114;
} else if (distance <= 240){
distance = 115;
} else if (distance <= 242){
distance = 116;
} else if (distance <= 244){
distance = 117;
} else if (distance <= 246){
distance = 118;
} else if (distance <= 248){
distance = 119;
} else if (distance <= 250){
distance = 120;
} else if (distance <= 252){
distance = 121;
} else if (distance <= 254){
distance = 122;
} else if (distance <= 256){
distance = 123;
} else if (distance <= 258){
distance = 124;
} else if (distance <= 260){
distance = 125;
} else if (distance <= 262){
distance = 126;
} else if (distance <= 264){
distance = 127;
} else if (distance <= 266){
distance = 128;
} else if (distance <= 268){
distance = 129;
} else if (distance <= 500){
distance = 130;
}

// } //for loop end

old_distance = new_distance;

}else if (diff_distance <= -10) {
//make sudden changes smooth
distance = old_distance;

//for (int counter = 0; counter > diff_distance; counter–) {
distance = distance – int(diff_distance/4);
if (distance <= 12) {
distance = 1;
} else if (distance <= 14){
distance = 2;
} else if (distance <= 16){
distance = 3;
} else if (distance <= 18 ){
distance = 4;
} else if (distance <= 20 ){
distance = 5;
} else if (distance <= 22 ){
distance = 6;
} else if (distance <= 24){
distance = 7;
} else if (distance <= 26){
distance = 8;
} else if (distance <= 28){
distance = 9;
} else if (distance <= 30){
distance = 10;
} else if (distance <= 32){
distance = 11;
} else if (distance <= 34){
distance = 12;
} else if (distance <= 36){
distance = 13;
} else if (distance <= 38 ){
distance = 14;
} else if (distance <= 40){
distance = 15;
} else if (distance <= 42){
distance = 16;
} else if (distance <= 44){
distance = 17;
} else if (distance <= 46){
distance = 18;
} else if (distance <= 48){
distance = 19;
} else if (distance <= 50){
distance = 20;
} else if (distance <= 52){
distance = 21;
} else if (distance <= 54 ){
distance = 22;
} else if (distance <= 56){
distance = 23;
} else if (distance <= 58){
distance = 24;
} else if (distance <= 60){
distance = 25;
} else if (distance <= 62){
distance = 26;
} else if (distance <= 64){
distance = 27;
} else if (distance <= 66){
distance = 28;
} else if (distance <= 68){
distance = 29;
} else if (distance <= 70 ){
distance = 30;
} else if (distance <= 72){
distance = 31;
} else if (distance <= 74){
distance = 32;
} else if (distance <= 76){
distance = 33;
} else if (distance <= 78){
distance = 34;
} else if (distance <= 80){
distance = 35;
} else if (distance <= 82){
distance = 36;
} else if (distance <= 84){
distance = 37;
} else if (distance <= 86 ){
distance = 38;
} else if (distance <= 88){
distance = 39;
} else if (distance <= 90){
distance = 40;
} else if (distance <= 92){
distance = 41;
} else if (distance <= 94){
distance = 42;
} else if (distance <= 96){
distance = 43;
} else if (distance <= 98){
distance = 44;
} else if (distance <= 100){
distance = 45;
} else if (distance <= 102){
distance = 46;
} else if (distance <= 104){
distance =47;
} else if (distance <= 106){
distance = 48;
} else if (distance <= 108 ){
distance = 49;
} else if (distance <= 110){
distance = 50;
}else if (distance <= 112){
distance = 51;
}else if (distance <= 114){
distance = 52;
}else if (distance <= 116){
distance = 53;
}else if (distance <= 118){
distance = 54;
}else if (distance <= 120 ){
distance = 55;
} else if (distance <= 122 ){
distance = 56;
} else if (distance <= 124){
distance = 57;
} else if (distance <= 126){
distance = 58;
} else if (distance <= 128){
distance = 59;
} else if (distance <= 130){
distance = 60;
} else if (distance <= 132){
distance = 61;
} else if (distance <= 134){
distance = 62;
} else if (distance <= 136){
distance = 63;
} else if (distance <= 138 ){
distance = 64;
} else if (distance <= 140){
distance = 65;
} else if (distance <= 142){
distance = 66;
} else if (distance <= 144){
distance = 67;
} else if (distance <= 146){
distance = 68;
} else if (distance <= 148){
distance = 69;
} else if (distance <= 150){
distance = 70;
} else if (distance <= 152){
distance = 71;
} else if (distance <= 154 ){
distance = 72;
} else if (distance <= 156){
distance = 73;
} else if (distance <= 158){
distance = 74;
} else if (distance <= 160){
distance = 75;
} else if (distance <= 162){
distance = 76;
} else if (distance <= 164){
distance = 77;
} else if (distance <= 166){
distance = 78;
} else if (distance <= 168){
distance = 79;
} else if (distance <= 170 ){
distance = 80;
} else if (distance <= 172){
distance = 81;
} else if (distance <= 174){
distance = 82;
} else if (distance <= 176){
distance = 83;
} else if (distance <= 178){
distance = 84;
} else if (distance <= 180){
distance = 85;
} else if (distance <= 182){
distance = 86;
} else if (distance <= 184){
distance = 87;
} else if (distance <= 186 ){
distance = 88;
} else if (distance <= 188){
distance = 89;
} else if (distance <= 190){
distance = 90;
} else if (distance <= 192){
distance = 91;
} else if (distance <= 194){
distance = 92;
} else if (distance <= 196){
distance = 93;
} else if (distance <= 198){
distance = 94;
} else if (distance <= 200){
distance = 95;
} else if (distance <= 202){
distance = 96;
} else if (distance <= 204){
distance = 97;
} else if (distance <= 206){
distance = 98;
} else if (distance <= 208){
distance = 99;
} else if (distance <= 210){
distance = 100;
} else if (distance <= 212){
distance = 101;
} else if (distance <= 214){
distance = 102;
} else if (distance <= 216){
distance = 103;
} else if (distance <= 218){
distance = 104;
} else if (distance <= 220){
distance = 105;
} else if (distance <= 222){
distance = 106;
} else if (distance <= 224){
distance = 107;
} else if (distance <= 226){
distance = 108;
} else if (distance <= 228){
distance = 109;
} else if (distance <= 230){
distance = 110;
} else if (distance <= 232){
distance = 111;
} else if (distance <= 234){
distance = 112;
} else if (distance <= 236){
distance = 113;
} else if (distance <= 238){
distance = 114;
} else if (distance <= 240){
distance = 115;
} else if (distance <= 242){
distance = 116;
} else if (distance <= 244){
distance = 117;
} else if (distance <= 246){
distance = 118;
} else if (distance <= 248){
distance = 119;
} else if (distance <= 250){
distance = 120;
} else if (distance <= 252){
distance = 121;
} else if (distance <= 254){
distance = 122;
} else if (distance <= 256){
distance = 123;
} else if (distance <= 258){
distance = 124;
} else if (distance <= 260){
distance = 125;
} else if (distance <= 262){
distance = 126;
} else if (distance <= 264){
distance = 127;
} else if (distance <= 266){
distance = 128;
} else if (distance <= 268){
distance = 129;
} else if (distance <= 500){
distance = 130;
}

// } //end of for loop

old_distance = new_distance;

} else { //smooth change in data
distance = new_distance;
old_distance = new_distance;
if (distance <= 12) {
distance = 1;
} else if (distance <= 14){
distance = 2;
} else if (distance <= 16){
distance = 3;
} else if (distance <= 18 ){
distance = 4;
} else if (distance <= 20 ){
distance = 5;
} else if (distance <= 22 ){
distance = 6;
} else if (distance <= 24){
distance = 7;
} else if (distance <= 26){
distance = 8;
} else if (distance <= 28){
distance = 9;
} else if (distance <= 30){
distance = 10;
} else if (distance <= 32){
distance = 11;
} else if (distance <= 34){
distance = 12;
} else if (distance <= 36){
distance = 13;
} else if (distance <= 38 ){
distance = 14;
} else if (distance <= 40){
distance = 15;
} else if (distance <= 42){
distance = 16;
} else if (distance <= 44){
distance = 17;
} else if (distance <= 46){
distance = 18;
} else if (distance <= 48){
distance = 19;
} else if (distance <= 50){
distance = 20;
} else if (distance <= 52){
distance = 21;
} else if (distance <= 54 ){
distance = 22;
} else if (distance <= 56){
distance = 23;
} else if (distance <= 58){
distance = 24;
} else if (distance <= 60){
distance = 25;
} else if (distance <= 62){
distance = 26;
} else if (distance <= 64){
distance = 27;
} else if (distance <= 66){
distance = 28;
} else if (distance <= 68){
distance = 29;
} else if (distance <= 70 ){
distance = 30;
} else if (distance <= 72){
distance = 31;
} else if (distance <= 74){
distance = 32;
} else if (distance <= 76){
distance = 33;
} else if (distance <= 78){
distance = 34;
} else if (distance <= 80){
distance = 35;
} else if (distance <= 82){
distance = 36;
} else if (distance <= 84){
distance = 37;
} else if (distance <= 86 ){
distance = 38;
} else if (distance <= 88){
distance = 39;
} else if (distance <= 90){
distance = 40;
} else if (distance <= 92){
distance = 41;
} else if (distance <= 94){
distance = 42;
} else if (distance <= 96){
distance = 43;
} else if (distance <= 98){
distance = 44;
} else if (distance <= 100){
distance = 45;
} else if (distance <= 102){
distance = 46;
} else if (distance <= 104){
distance =47;
} else if (distance <= 106){
distance = 48;
} else if (distance <= 108 ){
distance = 49;
} else if (distance <= 110){
distance = 50;
}else if (distance <= 112){
distance = 51;
}else if (distance <= 114){
distance = 52;
}else if (distance <= 116){
distance = 53;
}else if (distance <= 118){
distance = 54;
}else if (distance <= 120 ){
distance = 55;
} else if (distance <= 122 ){
distance = 56;
} else if (distance <= 124){
distance = 57;
} else if (distance <= 126){
distance = 58;
} else if (distance <= 128){
distance = 59;
} else if (distance <= 130){
distance = 60;
} else if (distance <= 132){
distance = 61;
} else if (distance <= 134){
distance = 62;
} else if (distance <= 136){
distance = 63;
} else if (distance <= 138 ){
distance = 64;
} else if (distance <= 140){
distance = 65;
} else if (distance <= 142){
distance = 66;
} else if (distance <= 144){
distance = 67;
} else if (distance <= 146){
distance = 68;
} else if (distance <= 148){
distance = 69;
} else if (distance <= 150){
distance = 70;
} else if (distance <= 152){
distance = 71;
} else if (distance <= 154 ){
distance = 72;
} else if (distance <= 156){
distance = 73;
} else if (distance <= 158){
distance = 74;
} else if (distance <= 160){
distance = 75;
} else if (distance <= 162){
distance = 76;
} else if (distance <= 164){
distance = 77;
} else if (distance <= 166){
distance = 78;
} else if (distance <= 168){
distance = 79;
} else if (distance <= 170 ){
distance = 80;
} else if (distance <= 172){
distance = 81;
} else if (distance <= 174){
distance = 82;
} else if (distance <= 176){
distance = 83;
} else if (distance <= 178){
distance = 84;
} else if (distance <= 180){
distance = 85;
} else if (distance <= 182){
distance = 86;
} else if (distance <= 184){
distance = 87;
} else if (distance <= 186 ){
distance = 88;
} else if (distance <= 188){
distance = 89;
} else if (distance <= 190){
distance = 90;
} else if (distance <= 192){
distance = 91;
} else if (distance <= 194){
distance = 92;
} else if (distance <= 196){
distance = 93;
} else if (distance <= 198){
distance = 94;
} else if (distance <= 200){
distance = 95;
} else if (distance <= 202){
distance = 96;
} else if (distance <= 204){
distance = 97;
} else if (distance <= 206){
distance = 98;
} else if (distance <= 208){
distance = 99;
} else if (distance <= 210){
distance = 100;
} else if (distance <= 212){
distance = 101;
} else if (distance <= 214){
distance = 102;
} else if (distance <= 216){
distance = 103;
} else if (distance <= 218){
distance = 104;
} else if (distance <= 220){
distance = 105;
} else if (distance <= 222){
distance = 106;
} else if (distance <= 224){
distance = 107;
} else if (distance <= 226){
distance = 108;
} else if (distance <= 228){
distance = 109;
} else if (distance <= 230){
distance = 110;
} else if (distance <= 232){
distance = 111;
} else if (distance <= 234){
distance = 112;
} else if (distance <= 236){
distance = 113;
} else if (distance <= 238){
distance = 114;
} else if (distance <= 240){
distance = 115;
} else if (distance <= 242){
distance = 116;
} else if (distance <= 244){
distance = 117;
} else if (distance <= 246){
distance = 118;
} else if (distance <= 248){
distance = 119;
} else if (distance <= 250){
distance = 120;
} else if (distance <= 252){
distance = 121;
} else if (distance <= 254){
distance = 122;
} else if (distance <= 256){
distance = 123;
} else if (distance <= 258){
distance = 124;
} else if (distance <= 260){
distance = 125;
} else if (distance <= 262){
distance = 126;
} else if (distance <= 264){
distance = 127;
} else if (distance <= 266){
distance = 128;
} else if (distance <= 268){
distance = 129;
} else if (distance <= 500){
distance = 130;
}

} //end of else

sensor_values[0] = distance;
sensor_values[1] = (cnt)%10;
sensor_values[2] = (cnt)%100;
delay(20);
write_status = radio.write( &sensor_values[0], sizeof(int)* ar_size);
printf(“SENSOR VAL %d %d %d \n”, sensor_values[0], sensor_values[1], sensor_values[2]);
if( ! write_status)
{
Serial.println(“ERROR WRITE”);
}

radio.startListening();// Wait here until we get a response, or timeout (250ms)
unsigned long started_waiting_at = millis();
bool timeout = false;
while ( ! radio.available() && ! timeout )
if (millis() – started_waiting_at > 200 )
timeout = true;

brightness = distance * 2;
if (brightness > 255){
brightness = 255;
}
brightness = 255 – brightness;

// set the brightness of pin 8:
analogWrite(led, brightness);

}

if(role == RECEIVER)
{
if(radio.available())
{
read_status = false;
while(!read_status)
{
read_status = radio.read(&recv_values[0], sizeof(int) * ar_size );
delay(100);
}
//printf(“RECEIVED %d %d %d\n”, recv_values[0], recv_values[1], recv_values[2]);
radio.stopListening();
//radio.write( &recv_values[0], sizeof(int)*ar_size );

//Serial.println(recv_values[0]);
Serial.print(recv_values[0], DEC);
Serial.print(” “);
Serial.print(recv_values[1], DEC);
Serial.print(” “);
Serial.print(recv_values[2], DEC);
Serial.print(” “);
Serial.println(“\r”);
radio.startListening();
}
}
}

 

Besides the implementation of wireless transmission, the code contains the control of LED lights in response to the proximity with objects in the environment.

 

One thought on “Final Project: Project Update #3”

  1. Yuhao, you might want to clean up this update because much of it is unreadable. It’s interesting to read about your transition to the wireless for the data transmission, as well as the design of the costume, but what about how it all works together to control the music? Perhaps you are saving that for the final update. I would like your impression of actually using the wireless to conduct the music. Even though we haven’t had a lot of time to rehearse, it is the final outcome of the your project to be a conductor of music. It would be particularly relevant (and perhaps you can expand on this in the final hyperessay) to talk about the changing paradigm of the dancer/conductor controlling the music as opposed to the music followed by the dancer.

Leave a Reply