MoDulate

A Modular Organization System to Empower Your Ideas Anywhere

Made by Michael, Muhammad Faizan Zafar, shianhey, shianhey, marcgut8712, queenien2000, Ruyao Wu, Mo Zhang, Pedro Mendes, Hanyue Hu and skokate

Modulate is a flexible ecosystem revolutionizing group projects by facilitating a productive environment anywhere. It consists of three components that improve your creative experience.

Created: February 18th, 2015

0
Modulate is a smart and flexible organizational tool that allows for fast group creation, management and idea sharing. It consists of three distinct elements:

The Key stores your ID and interacts with other items so solutions can be customized to you. The Box serves as a hub for group as well as personal work.

By tapping the RFID chip against it, the Box can automatically create groups, keep attendance and record voice and timestamps. By pulling out the top and twisting it to one of four areas of interest, it also allows to share ideas in specific fields and help people find support. If someone would for example have a software related idea, they would pull out the top, twist it so the software area lights up and then speak into it to upload the idea to the cloud.

Last but not least, the Cue is an ambient display that also serves as interior decoration. It communicates the number and area of new ideas communicated through the Box. It thus creates a constant reminder to check the database of ideas uploaded, get inspired and engage with people looking for support.

The smooth integration, low cost and easy setup make modulate a solution that we could foresee to become a reality within less than a year. All the components are readily available and our CMU ID's are already equipped with RFID tags. It is only logical to broaden the range of use cases for these tags. At a reasonably high volume, the cost of a Box could be as low as $20.

As above mentioned, the Key consists of a simple RFID tag although plans could easily modify it into a pager like device that notifies you of upcoming meetings and exams.

The Box consists of a wireless soc (Spark Core), an RFID reader, two potentiometers to read the different states of pulling the module out and select the area of idea. Further, 4 RGB LED's display the area of idea sharing selected by illuminating the translucent top of the modulate.

Finally, the Cue consists of RGB LED strips that are connected to a Spark core via transistors. (The strips need 12v!)


If the RFID reader reads multiple tags within a given time, it automatically creates a new folder on box with all people tapping their tags. Of course more people can be added manually later. If the reader recognizes the group combination, it will automatically take timestamps for the assembled group, record the meeting and upload it. (Due to incompatability issues between Arduino and Spark, this feature could not be implemented)

As for the idea sharing, the vertical potentiometer puts the Box into the idea sharing mode as soon as it gets pulled. A next twist around the rotary potentiometer sets the field of idea and automatically starts recording. Twisting back and pushing the top in will stop the recording. (Again, compatability issues didn't allow for actual voice recordings) The spark then uploads the idea to the cloud where the spark connected to the Cue reads it and changes the brightness, color and amount of lamps lit up.


0
0
int x_state=1;

int n;

int x;

 

double Selector1 = 0.0;

double Selector2 = 0;

int State1 = 0;

int State2 = 0;

 

//Cards will be read by arduino and get stored here;

 

//LED Pins

 

 

int red1= A0;

int green1= A1;

int red2 =D0;

int green2 = D1;

int red3= A4;

int green3 = A5;

int red4 = A6;

int green4= A7;

 

 

 

int Card1=D0;

int Card2=D1;

int Card3=D2;

 

int ButtonState=0;

int CardNumber=0;

 

char publishString[40];

 

void setup()

{

  // Register a Spark variable here

  Spark.variable("Selector1", &Selector1, DOUBLE);

  Spark.variable("Selector2", &Selector2, DOUBLE);

  Spark.variable("CardDetected", &CardNumber, INT);

 

  Serial.begin(9600);

//Spark.function("SelectorSwitchFunction", "State1");

 

 

  // Connect the temperature sensor to A7 and configure it

  // to be an input

  pinMode(D0, INPUT);

  pinMode(D1, INPUT);

  pinMode(D2, INPUT);

  pinMode(A7, INPUT);

 

 

  pinMode (red1, OUTPUT);

  pinMode (green1, OUTPUT);

  pinMode (red2, OUTPUT);

  pinMode (green2, OUTPUT);

  pinMode (red3, OUTPUT);

  pinMode (green3, OUTPUT);

  pinMode (red4, OUTPUT);

  pinMode (green4, OUTPUT);

}

 

void loop()

{

  int reading1 = 0;

  double voltage1 = 0.0;

 

  // Keep reading the sensor value so when we make an API

  // call to read its value, we have the latest one

  reading1 = analogRead(A3);

 

  // The returned value from the Core is going to be in the range from 0 to 4095

  // Calculate the voltage from the sensor reading

if (reading1 > 0 && reading1 < 1000){  State1 = 1; } // Reading from the selector potentiometer

else if (reading1 > 1000 && reading1 < 2000) { State1 = 2; }

else if (reading1 > 2000 && reading1 < 3000) { State1 = 3; }

else if (reading1 > 3000 ) { State1 = 4 ;}

 

  // Calculate the temperature and update our static variable

  Selector1 = State1;

 

int reading2 = 0;

double voltage2 = 0.0;

 

// Keep reading the sensor value so when we make an API

// call to read its value, we have the latest one

reading2 = analogRead(A2);

 

// The returned value from the Core is going to be in the range from 0 to 4095

// Calculate the voltage from the sensor reading

 

 

if (reading2 > 0 && reading2 < 2000){  State2 = 1; } //Reading from the Button Potentiometer

else if (reading2 > 2000 ) { State2 = 4 ;}

 

 

if(State1==4){

  analogWrite (red1,0);

  analogWrite (red2,0);

  analogWrite (red3,0);

  analogWrite (red4,0);

  analogWrite (green1,255);

  analogWrite (green2,255);

  analogWrite (green3,255);

  analogWrite (green4,255);

} else if(State1==3){

  analogWrite (red1,0);

  analogWrite (red2,0);

  analogWrite (red3,0);

  analogWrite (red4,0);

  analogWrite (green2,0);

  analogWrite (green3,100);

  analogWrite (green4,100);

  analogWrite (green1,0);

} else if(State1==2){

analogWrite (red1,255);

 analogWrite (red2,255);

 analogWrite (red3,255);

 analogWrite (red4,255);

 analogWrite (green1,0);

 analogWrite (green2,0);

 analogWrite (green3,0);

 analogWrite (green4,0);

} else if(State1==1){

  analogWrite (red1,255);

  analogWrite (red2,255);

  analogWrite (red3,255);

  analogWrite (red4,255);

  analogWrite (green1,255);

  analogWrite (green2,255);

  analogWrite (green3,255);

  analogWrite (green4,255);

}

 

  if(State1==1 && x_state>>1){

    n=n+1;

  }

    Serial.print("  State1:");

    Serial.print(State1);

    Serial.print("  x_state:");

    Serial.print(x_state);

    Serial.print("  n:");

    Serial.print(n);

    delay(50);

 

 

    x_state=State1;

 

    x=n%4;

 

 

 

    Serial.print("  x:");

    Serial.println(x);

 

// Calculate the temperature and update our static variable

Selector2 = State2;

if  ( x == 0 ) { Spark.publish("FaizanZafarEventSelectorSwitch1", "0", PUBLIC);}

else if (x == 1) { Spark.publish("FaizanZafarEventSelectorSwitch1", "1", PUBLIC);}

else if (x == 2) { Spark.publish("FaizanZafarEventSelectorSwitch1", "2", PUBLIC);}

else if (x == 3) { Spark.publish("FaizanZafarEventSelectorSwitch1", "3", PUBLIC);}

 

 

//if (Card1==HIGH) { Serial.print("Card 1 detected");  }

//else if (Card2==HIGH) { Serial.print("Card 2 detected");  }

//else if (Card3==HIGH) { Serial.print("Card 3 detected");  }

if (State2 == 4) {

 

Spark.publish("FaizanZafarEvent_GroupMade_Detected", "GroupMembers", PUBLIC);

 

/*if (Card1==HIGH) { CardNumber=1;      */Spark.publish("FaizanZafarEvent_Card1_Detected", "Faizan", PUBLIC);

/*else if (Card2==HIGH) { CardNumber=2;  */Spark.publish("FaizanZafarEvent_Card2_Detected", "MoZhang", PUBLIC);

/*else if (Card3==HIGH) { CardNumber=3;  */Spark.publish("FaizanZafarEvent_Card3_Detected", "Sanika", PUBLIC);

 

int nowTime= millis();

unsigned nowSec = nowTime/1000UL;

        unsigned sec = nowSec%60;

        unsigned min = (nowSec%3600)/60;

        unsigned hours = (nowSec%86400)/3600;

        sprintf(publishString,"%u:%u:%u",hours,min,sec);

        Spark.publish("FaizanZafarEvent_GroupUptime",publishString, PUBLIC);

 

} else if (State2==1) {Serial.print("No Groups Made yet");}

 

 

delay(2000);

 

}
Click to Expand
0
#include <Wire.h>

#include <Adafruit_NFCShield_I2C.h>

 

#define IRQ   (2)

#define RESET (3)  // Not connected by default on the NFC Shield

 

//#define BlackTag 146150168253

//#define MetalTag 107238213236

//#define Tag 5999214236

//#define TagWired 9296A8FD

 

int Card1 = 0;

int Card2 = 0;

int Card3 = 0;

int Group = 0;

int GroupButton = 0;

 

 

String MetalTag= "107238213236";

String BlackTag="146150168253";

String Tag = "5999214236";

 

 

Adafruit_NFCShield_I2C nfc(IRQ, RESET);

String TagSwipe="";

void setup(void) {

  Serial.begin(115200);

  Serial.println("Hello!");

 

  nfc.begin();

 

  uint32_t versiondata = nfc.getFirmwareVersion();

  if (! versiondata) {

    Serial.print("Didn't find PN53x board");

    while (1); // halt

  }

 

  // Got ok data, print it out!

  Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX);

  Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC);

  Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);

 

  // Set the max number of retry attempts to read from a card

  // This prevents us from waiting forever for a card, which is

  // the default behaviour of the PN532.

  nfc.setPassiveActivationRetries(0xFF);

 

  // configure board to read RFID tags

  nfc.SAMConfig();

   

  Serial.println("Waiting for an ISO14443A card");

}

 

void loop(void) {

  boolean success;

  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID

  uint8_t uidLength;                        // Length of the UID (4 or 7 bytes depending on ISO14443A card type)

  String str="";

 

  // Wait for an ISO14443A type cards (Mifare, etc.).  When one is found

  // 'uid' will be populated with the UID, and uidLength will indicate

  // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)

  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);

 

  if (success) {

    Serial.println("Found a card!");

    Serial.print("UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");

    Serial.print("UID Value: ");

    for (uint8_t i=0; i < uidLength; i++)

    {

      Serial.print(" 0x");Serial.print(uid[i]);

      String uidTemp=String(uid[i]);

      str.concat(uidTemp);

    }

    Serial.println("");

    Serial.println(str);

    // Wait 1 second before continuing

    delay(1000);

  }

  else

  {

    // PN532 probably timed out waiting for a card

    Serial.println("Timed out waiting for a card");

  }

  {

 

int counter = 0;

 

  if (str.equals(Tag) == true){

    Serial.println("Tag"); Card1++;

 

  }else if (str.equals(MetalTag) == true){

    Serial.println("MetalTag"); Card2++;

 

  }else if (str.equals(BlackTag) == true){

    Serial.println("BlackTag"); Card3++;

  }

 

  GroupButton = 0;

 

if(GroupButton == 1){

if ( Card1>0) {Serial.print("Card1");}

if(Card2>0){Serial.print("Card2");}

if (Card3>0){Serial.print("Card3");}

}

else if (GroupButton == 0){

  Serial.print("Group Button not pressed");

 

} 

 

 

 delay (1000);

 

}

 

 

}
Click to Expand
x
Share this Project


About

Modulate is a flexible ecosystem revolutionizing group projects by facilitating a productive environment anywhere. It consists of three components that improve your creative experience.