A group assignment to promote the United Nations Sustainable Development Goals with the use of digital fabrication and physical computing.
To make the experience fit your profile, pick a username and tell us what interests you.
We found and based on your interests.
meeting_overall.pdfAdobe Portable Document Format - 389.71 kB - 09/03/2018 at 05:14 |
|
|
UN_SDG_ Final Workroom.pdfAdobe Portable Document Format - 4.12 MB - 09/03/2018 at 03:51 |
|
|
UN_SDG_ Pitch 4.0.pdfAdobe Portable Document Format - 5.03 MB - 09/03/2018 at 03:50 |
|
|
UN_SDG_ Pitch 3.1.pdfAdobe Portable Document Format - 3.85 MB - 09/03/2018 at 03:50 |
|
|
UN_SDG_ Pitch 2.0.pdfAdobe Portable Document Format - 1.18 MB - 09/03/2018 at 03:50 |
|
|
Poverty is closer than you think.
It's crazy to think about how we should have gotten all of this done by Week 13.
At least, according to the initial brief anyway.
The one week extension helped us complete the project much more comfortably. For the first half of the final week, we were preoccupied with final submissions for two other subjects. From Wednesday onwards, it was all hands on deck to complete the whole installation.
On Wednesday itself we went over to the Sunway workshop to put the final “dirt” finishing onto our walls. Poster design for the back walls came underway as well. To keep at it, some of us even stayed overnight at the Fabrication Lab to continue designing/writing and soldering (though mostly it was in solidarity of our fellow classmates).
We had a late start to Thursday from the previous night’s fatigue. We surveyed some prices for finishing materials like the table cloth and clothes basket, then we reviewed the final item and prop list for each of us to bring over for Friday night’s post mall-closure setup.
Met up at Sunway workshop with lecturers and client for Final Review. Everything in order; on the right track. Just need to tie up loose ends:
Final check to confirm video re-shooting schedule over weekend:
import processing.serial.*;
Serial myCommChannel;
import processing.video.*;
Movie Video01;
Movie Video02;
Movie Video03;
Movie Video04;
Movie Video05;
Movie Video06;
Movie Video07;
float startPlayTimeVideo01 = 0.0;
float startPlayTimeVideo02 = 0.0;
float startPlayTimeVideo03 = 0.0;
float startPlayTimeVideo04 = 0.0;
float startPlayTimeVideo05 = 0.0;
float startPlayTimeVideo06 = 0.0;
float startPlayTimeVideo07 = 0.0;
boolean isPlayingVideo01 = false;
boolean isPlayingVideo02 = false;
boolean isPlayingVideo03 = false;
boolean isPlayingVideo04 = false;
boolean isPlayingVideo05 = false;
boolean isPlayingVideo06 = false;
boolean isPlayingVideo07 = false;
boolean isCurrentlyPlaying = false;
char lastSerialInput = 'z';
byte trackID = 0;
void setup() {
fullScreen();
//size(1380, 1220);
printArray(Serial.list());
myCommChannel = new Serial(this, Serial.list()[0], 9600);
Video01 = new Movie(this, "video01.mp4");
Video02 = new Movie(this, "video02.mp4");
Video03 = new Movie(this, "video03.mp4");
Video04 = new Movie(this, "video04.mp4");
Video05 = new Movie(this, "video05.mp4");
Video06 = new Movie(this, "video06.mp4");
Video07 = new Movie(this, "video07.mp4");
myCommChannel.write('1');
}
void draw() {
switch (trackID) {
case 1:
image(Video01, 0, 0, width, height);
checkPlayStatusVideo01();
break;
case 2:
image(Video02, 0, 0, width, height);
checkPlayStatusVideo02();
break;
case 3:
image(Video03, 0, 0, width, height);
checkPlayStatusVideo03();
break;
case 4:
image(Video04, 0, 0, width, height);
checkPlayStatusVideo04();
break;
case 5:
image(Video05, 0, 0, width, height);
checkPlayStatusVideo05();
break;
case 6:
image(Video06, 0, 0, width, height);
checkPlayStatusVideo06();
break;
case 7:
image(Video07, 0, 0, width, height);
checkPlayStatusVideo07();
break;
}
if (isCurrentlyPlaying == false) {
char inputCommandChar = myCommChannel.readChar();
if (inputCommandChar != lastSerialInput) {
switch(inputCommandChar) {
case 'a':
println(inputCommandChar);
isCurrentlyPlaying = true;
lastSerialInput = inputCommandChar;
playVideoFile01();
myCommChannel.clear();
break;
case 'b':
println(inputCommandChar);
isCurrentlyPlaying = true;
lastSerialInput = inputCommandChar;
playVideoFile02();
myCommChannel.clear();
break;
case 'c':
println(inputCommandChar);
isCurrentlyPlaying = true;
lastSerialInput = inputCommandChar;
playVideoFile03();
myCommChannel.clear();
break;
case 'd':
println(inputCommandChar);
isCurrentlyPlaying = true;
lastSerialInput = inputCommandChar;
playVideoFile04();
myCommChannel.clear();
break;
case 'e':
println(inputCommandChar);
isCurrentlyPlaying = true;
lastSerialInput = inputCommandChar;
playVideoFile05();
myCommChannel.clear();
break;
case 'f':
println(inputCommandChar);
isCurrentlyPlaying = true;
lastSerialInput = inputCommandChar;
playVideoFile06();
myCommChannel.clear();
break;
case 'g':
println(inputCommandChar);
isCurrentlyPlaying = true;
lastSerialInput = inputCommandChar;
playVideoFile07();
myCommChannel.clear();
break;
default:
// do nothing
break;
}
}
}
myCommChannel.clear();
}
void movieEvent(Movie m) {
m.read();
}
void playVideoFile01() {
if (isPlayingVideo01 == false ) {
startPlayTimeVideo01 = millis();
isPlayingVideo01 = true;
trackID = 1;
Video01.play();
}
}
void checkPlayStatusVideo01() {
if (isPlayingVideo01 == true) {
if ( (millis() - startPlayTimeVideo01) >= (Video01.duration()*1000) ) {
isPlayingVideo01 = false;
isCurrentlyPlaying = false;
Video01.stop();
println("offVT01");
myCommChannel.write('<');
myCommChannel.write('2');
myCommChannel.write('+');
}
}
}
void playVideoFile02() {
if (isPlayingVideo02 == false ) {
startPlayTimeVideo02 = millis();
isPlayingVideo02 = true;
trackID = 2;
Video02.play();
}
}
void checkPlayStatusVideo02() {
if (isPlayingVideo02 == true) {
if ( (millis() - startPlayTimeVideo02) >= (Video02.duration()*1000) )...
Read more »
#include <Adafruit_NeoPixel.h>
#define trigPin01 12
#define echoPin01 13
#define trigPin02 10
#define echoPin02 11
#define trigPin03 8
#define echoPin03 9
#define trigPin04 6
#define echoPin04 7
#define trigPin05 4
#define echoPin05 5
#define vibrationPin06 3
#define vibrationPin07 2
unsigned char stateInterrupt1 = 0; // pin 3
unsigned char stateInterrupt0 = 0; // pin 2
#define LED01 A5
#define NUM_LED01 176
Adafruit_NeoPixel strip01 = Adafruit_NeoPixel(NUM_LED01, LED01, NEO_GRB + NEO_KHZ800);
void setup() {
Serial.begin(9600);
pinMode(trigPin01, OUTPUT);
pinMode(echoPin01, INPUT);
pinMode(LED01, OUTPUT);
pinMode(trigPin02, OUTPUT);
pinMode(echoPin02, INPUT);
pinMode(trigPin03, OUTPUT);
pinMode(echoPin03, INPUT);
pinMode(trigPin04, OUTPUT);
pinMode(echoPin04, INPUT);
pinMode(trigPin05, OUTPUT);
pinMode(echoPin05, INPUT);
pinMode(vibrationPin06, INPUT);
pinMode(vibrationPin07, INPUT);
attachInterrupt(1, interrupt1, FALLING);
attachInterrupt(0, interrupt0, FALLING);
strip01.begin();
strip01.show();
}
void loop() {
byte incomingByte = '?';
if (Serial.available() > 0) {
incomingByte = Serial.read();
Serial.println(incomingByte);
}
switch (incomingByte) {
case 62: //this should be equivalent to ASCII ">"
turnAllRed();
break;
case 60: //this should be equivalent to ASCII "<"
turnAllOff();
break;
case 43: //this should be equivalent to ASCII "+"
stateInterrupt1 = 0;
stateInterrupt0 = 0;
break;
case 49: //this should be equivalent to ASCII "1"
LEDTurnGreen01();
delay(500);
while (checkVSensor06() == false) {
delay(10); // Sensor is slow in returning response, so add a little delay
}
break;
case 50: //this should be equivalent to ASCII "2"
LEDTurnGreen02();
delay(500);
while (checkVSensor07() == false) {
delay(10); // Sensor is slow in returning response, so add a little delay
}
break;
case 51: //this should be equivalent to ASCII "3"
LEDTurnGreen03();
delay(500);
while (checkSensor01() == false) {
}
break;
case 52: //this should be equivalent to ASCII "4"
LEDTurnGreen04();
delay(500);
while (checkSensor02() == false) {
}
break;
case 53: //this should be equivalent to ASCII "5"
LEDTurnGreen05();
delay(500);
while (checkSensor03() == false) {
}
break;
case 54: //this should be equivalent to ASCII "6"
LEDTurnGreen06();
delay(500);
while (checkSensor04() == false) {
}
break;
case 55: //this should be equivalent to ASCII "7"
LEDTurnGreen07();
delay(500);
while (checkSensor05() == false) {
}
break;
}
}
void interrupt1() {
stateInterrupt1++;
}
void interrupt0() {
stateInterrupt0++;
}
boolean checkSensor01() {
float duration01, distance01;
digitalWrite(trigPin01, LOW);
delayMicroseconds(2);
digitalWrite(trigPin01, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin01, LOW);
duration01 = pulseIn(echoPin01, HIGH, 1000000);
distance01 = (duration01 / 2) * 0.0344;
if (distance01 >= 40 ) {
Serial.print('c');
turnAllRed();
return true;
}
else {
return false;
}
}
boolean checkSensor02() {
float duration02, distance02;
digitalWrite(trigPin02, LOW);
delayMicroseconds(2);
digitalWrite(trigPin02, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin02, LOW);
duration02 = pulseIn(echoPin02, HIGH);
distance02 = (duration02 / 2) * 0.0344;
if (distance02 >= 40) {
Serial.print('d');
turnAllRed();
return true;
}
else {
return false;
}
}
boolean checkSensor03() {
float duration03, distance03;
digitalWrite(trigPin03, LOW);
delayMicroseconds(2);
digitalWrite(trigPin03, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin03, LOW);
duration03 = pulseIn(echoPin03, HIGH);
distance03 = (duration03 / 2) * 0.0344;
if (distance03 >= 40) {
Serial.print('e');
turnAllRed();
return true;
}
else {
return false;
}
}
boolean checkSensor04() {
float duration04, distance04;
digitalWrite(trigPin04, LOW);
delayMicroseconds(2);
digitalWrite(trigPin04, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin04,...
Read more »
User Testing day.
There is a mad rush to complete the following:
We manage to get everything done, albeit a little over the opening 2pm mark. We tested our core experience with our 7 items and accompanying reactable stories, sans our large structure stored in the Sunway workshop.
Collected feedback from the client and other students:
After the user test, the group met up to review the feedback and continue planning next steps for updates and changes.
Final check to confirm video re-shooting schedule over weekend:
DI independent working day.
DI working day.
For one of our reactables, we need an old CRT TV. One of our lecturers offered to bring an old one from his house; however, we found out it wasn't working. Our immediate solution was to replace it with a 'mock' CRT TV made up of a PC screen in a foam board body, however, we were encouraged by another lecturer to keep the search for a working CRT TV going.
We also took a trip to the Sunway workshop to review our blueprints. After the 'ok', we set plans to begin structure building. Set date for construction:
Short meet-up to review shopping list.
Decided that we would not have an official meeting for discussion on Monday, just independent working day.
Current list of work in progress:
Met up for 9th Group Discussion.
Officially commence construction planning.
Master list of questions we asked ourselves to properly map out our project plans on mahjong paper™:
THINGS TO ASK CLIENT
THINGS TO ASK BUILDING CREW
CREATING THE INSTALLATION
A) Mechanism
B) Structure
C) Items
Once everything was mapped out properly, the following two days were dedicated to surveying the items on our shopping list.
AM: Continued shopping list survey online, outlined weekly schedule, begin coding research. HOD's appointed for ease of organisation and execution, though members' obligations are not limited by their appointed work areas.
PM: Visited client's workshop.
Met up for 10th Group Discussion.
Create an account to leave a comment. Already have an account? Log In.
Become a member to follow this project and never miss any updates