This is a school project that follows Urbanscapes Malaysia brief, to create an interactive design related to Malaysia art and culture.
To make the experience fit your profile, pick a username and tell us what interests you.
We found and based on your interests.
Adobe Portable Document Format - 6.63 MB - 12/20/2018 at 14:54 |
|
|
Adobe Portable Document Format - 3.34 MB - 12/20/2018 at 14:53 |
|
|
Adobe Portable Document Format - 114.21 kB - 12/20/2018 at 14:52 |
|
|
DI Pitch2.pdfWe were supposed to choose 3 ideas from Pitch 1 and enhance them. Due to poor content in previous ideas, two of these ideas are brand new idea that start from scratch, and one were improved from the previous presentation.Adobe Portable Document Format - 2.25 MB - 10/05/2018 at 08:18 |
|
|
Pitch 1.pdfThis is our first pitching for 5 rough idea, which none are solid in concept or content. So our team decided to change most of the idea or a enhance some from this pitching.application/pdf - 3.68 MB - 10/05/2018 at 07:26 |
|
|
We get our audio play on trigger by using Processing, and here is the code we used:
Arduino:
const int BtnFanIN = 2;
const int TSHerb1IN = 3;
const int TSHerb2IN = 4;
const int BtnHorseIN = 5;
const int TSDrinks1IN = 6;
const int TSDrinks2IN = 7;
const int BtnFanMOTOR = 8;
//const int TSHerb1AUD = 7;
//const int TSHerb2AUD = 8;
const int BtnHorseMOTOR = 8;
//const int BtnHorseAUD = 10
//const int TSDrinksAUD = 11;
bool TSHerb1_1 = false;
bool TSHerb1_2 = false;
bool TSHerb2_1 = false;
bool TSHerb2_2 = false;
bool TSDrinks1_1 = false;
bool TSDrinks1_2 = false;
bool TSDrinks2_1 = false;
bool TSDrinks2_2 = false;
void setup() {
Serial.begin(9600); // Start serial communication at 9600 bps
pinMode(BtnFanIN, INPUT); // Set pin 0 as an input
pinMode(TSHerb1IN, INPUT);
pinMode(TSHerb2IN, INPUT);
pinMode(BtnHorseIN, INPUT);
pinMode(TSDrinks1IN, INPUT);
pinMode(TSDrinks2IN, INPUT);
digitalWrite(TSHerb1IN,HIGH);
digitalWrite(TSHerb2IN,HIGH);
digitalWrite(TSDrinks1IN,HIGH);
digitalWrite(TSDrinks2IN,HIGH);
pinMode(BtnFanMOTOR, OUTPUT);
//pinMode(TSHerb1AUD, OUTPUT);
//pinMode(TSHerb2AUD, OUTPUT);
pinMode(BtnHorseMOTOR, OUTPUT);
//pinMode(BtnHorseAUD, OUTPUT);
//pinMode(TSDrinksAUD, OUTPUT);
}
void loop() {
if (digitalRead(BtnFanIN) == HIGH) { // If switch is ON,
Serial.println("fanOn");
digitalWrite (BtnFanMOTOR, HIGH);
delay(1800);
//Serial.write(0); // send 1 to Processing
delay(100);
} else {
digitalWrite (BtnFanMOTOR,LOW);
}
if(digitalRead(BtnHorseIN) == HIGH){ // If switch is ON,
Serial.println("horseOn");
analogWrite(BtnHorseMOTOR,50);
Serial.write(1); // send 1 to Processing
delay(100);
} else {
analogWrite (BtnHorseMOTOR,0);
}
if(digitalRead(TSHerb1IN) == HIGH ){
TSHerb1_1 = true;
checkTouch();
TSHerb1_2 = TSHerb1_1;
Serial.println("drawer1");
} else{
TSHerb1_1 = false;
TSHerb1_2 = TSHerb1_1;
}
if(digitalRead(TSHerb2IN) == HIGH ){
TSHerb2_1 = true;
checkTouch();
TSHerb2_2 = TSHerb2_1;
Serial.println("drawer2");
} else{
TSHerb2_1 = false;
TSHerb2_2 = TSHerb2_1;
}
if(digitalRead(TSDrinks1IN) == HIGH ){
TSDrinks1_1 = true;
checkTouch();
TSDrinks1_2 = TSDrinks1_1;
Serial.println("door1");
} else{
TSDrinks1_1 = false;
TSDrinks1_2 = TSDrinks1_1;
}
if(digitalRead(TSDrinks2IN) == HIGH ){
TSDrinks2_1 = true;
checkTouch();
TSDrinks2_2 = TSDrinks2_1;
Serial.println("door2");
} else{
TSDrinks2_1 = false;
TSDrinks2_2 = TSDrinks2_1;
}
}
void checkTouch(){
if(TSHerb1_1 != TSHerb1_2){
Serial.write(2); // send 1 to Processing
Serial.println("MED 1");
}
if(TSHerb2_1 != TSHerb2_2){
Serial.write(3); // send 1 to Processing
Serial.println("MED 2");
}
if(TSDrinks1_1 != TSDrinks1_2){
Serial.write(4); // send 1 to Processing
// ("doorOpen");
Serial.println("DOOR OPEN");
}
if(TSDrinks2_1 != TSDrinks2_2){
Serial.write(4); // send 1 to Processing
// ("doorOpen");
Serial.println("DOOR 2 OPEN");
}
}
Processing:
import processing.sound.*;
import processing.serial.*;
Serial myPort;
int val;
SoundFile BGSound;
SoundFile[] Convos;
void setup() {
printArray(Serial.list());
String portName = Serial.list()[2];
myPort = new Serial(this,portName,9600);
BGSound = new SoundFile(this, "BG.mp3");
Convos = new SoundFile[4];
for (int i = 0; i < Convos.length; i ++) {
Convos[i] = new SoundFile(this, (i + 1)+".mp3");
}
BGSound.loop();
}
void draw() {
//checkSound();
if ( myPort.available() > 0) {
val = myPort.read();
checkSound();
switch(val) {
case 0:
fadeOut();
//BGSound.amp(0.3);
playSound(0);
break;
case 1:
fadeOut();
//BGSound.amp(0.3);
playSound(1);
//BGSound.amp(1.0);
//fadeIn();
break;
case 2:
fadeOut();
playSound(2);
//fadeIn();
break;
case 3:
fadeOut();
playSound(3);
//fadeIn();
break;
//default:
// break;
}
}
}
void playSound(int index) {
for (int i = 0; i < Convos.length; i++) {
if (Convos[i].isPlaying()) {
return;
}
}
...
Read more »
So 13th Dec its the submission day, we really very worry about couldn't finish on time. And also we did apply to stay overnight tonight, but it comes out decline the approver from the department, so we don't have much time . But we will try our very best, and it because of Wednesday Fab Lab is having classes, and everyone is waiting for 3Dprint and Laser cut, so come out we have to wait everybody to finish their stuff then we only can use it.
For the coding part, we only have around 1 week to explore on processing, and we still could not get any audio play by trigger. I could not really get help from my classmates because I'm the only one who are using processing and no one else know how to use it, so we get help from our senior, but at the end it is still not working. We have trouble on checking the code during the whole process because of the unstable connection of Arduino port, but at the end we still could not read signal from Arduino on Processing.
import processing.sound.*;
import processing.serial.*;
int button1;
int button2;
int button3;
int button4;
int buttonLock1 = 0;
Serial myPort;
int[] serialInArray = new int[4];
int serialCount = 0;
boolean firstContact = false;
String val;
SoundFile BGSound;
SoundFile Convo1;
SoundFile Convo2;
SoundFile Convo3;
SoundFile Convo4;
void setup()
{
printArray(Serial.list());
String portName = Serial.list()[2];
myPort = new Serial(this, portName, 9600);
BGSound = new SoundFile(this, "BG.mp3");
Convo1 = new SoundFile(this, "2.mp3");
Convo2 = new SoundFile(this, "3.mp3");
Convo3 = new SoundFile(this, "4.mp3");
Convo4 = new SoundFile(this, "5.mp3");
//BGSound.loop();
//Convo2.play();
}
void draw()
{
//if ( myPort.available() > 0) { // If data is available,
// //val = myPort.readString(); // read it and store it in val
// val = myPort.readString();
// //println(val);
//}
//if (val == "f") {
// println("play");
// Convo1.play();
// Convo2.stop();
// Convo3.stop();
// Convo4.stop();
//}
//if (val == "h") {
// Convo1.stop();
// Convo2.play();
// Convo3.stop();
// Convo4.stop();
//}
//if (val == "H1") {
// Convo1.stop();
// Convo2.stop();
// Convo3.play();
// Convo4.stop();
//}
//if (val == "H2") {
// Convo1.stop();
// Convo2.stop();
// Convo3.stop();
// Convo4.play();
//}
}
void serialEvent(Serial myPort) {
// read a byte from the serial port:
int inByte = myPort.read();
// if this is the first byte received, and it's an A,
// clear the serial buffer and note that you've
// had first contact from the microcontroller.
// Otherwise, add the incoming byte to the array:
if (firstContact == false) {
if (inByte == 'A') {
myPort.clear(); // clear the serial port buffer
firstContact = true; // you've had first contact from the microcontroller
myPort.write('A'); // ask for more
}
} else {
// Add the latest byte from the serial port to array:
serialInArray[serialCount] = inByte;
serialCount++;
// If we have 3 bytes:
if (serialCount > 3 ) {
//xpos = serialInArray[0];
//ypos = serialInArray[1];
button1 = serialInArray[0];
button2 = serialInArray[1];
button3 = serialInArray[2];
button4 = serialInArray[3];
//println(button1);
if (buttonLock1 == 0){
if (button1 == 1) {
println("play");
Convo1.play();
Convo2.stop();
Convo3.stop();
Convo4.stop();
buttonLock1 = 1;
}
}
if (button1 == 0){
buttonLock1 = 0;
}
if (buttonLock1 == 0){
if (button1 == 1) {
println("play");
Convo1.play();
Convo2.stop();
Convo3.stop();
Convo4.stop();
buttonLock1 = 1;
}
}
if (button1 == 0){
buttonLock1 = 0;
}
if (buttonLock1 == 0){
if (button1 == 1) {
println("play");
Convo1.play();
Convo2.stop();
Convo3.stop();
Convo4.stop();
buttonLock1 = 1;
}
}
if (button1 == 0){
buttonLock1 = 0;
}
if (buttonLock1 == 0){
if (button1 == 1) {
println("play");
Convo1.play();
Convo2.stop();
Convo3.stop();
Convo4.stop();
buttonLock1 = 1;
}
}
if...
Read more »
After the beta test, we got a lot of feedbacks from others that have been filled in our survey form, so we know clearly what to improve, what to adjusts. From the survey form, we have to make a small presentation for our users feedbacks, so we gather the questions together, we have many responses, for examples:
Q1: Do you get attracted by the miniature set? Yes
Q2: How do you feel when you saw the miniature set? Cute & Interesting (Familiar)
Q3: Will you use the headphone that are prepared with the set? Yes
Q4. What do you think it is for? BGM
Q5: Will you want to know all this information if it was set in an event? Yes
Q6: In what way you would prefer to get the information. People explaining & Printed Info
Q7: Do you think this setup are related to Kuala Lumpur culture? Yes (more to Malaysia)
Q8: What do you feel after you understand the details of the project? Meaningful, Interesting & Memorable
Q9: What do you suggest us to improve on this project? To make it more fun, interesting and interactive.
Interesting Feedback
After testing MP3Shield for weeks, we still could not get it working, even if it's just a simple play() function. So we decided to get help from our lecturer and tutor.
They help us to test all the MP3Shield we have in our lab, ends up all of them are not working. We are not sure about the reason why is it not working, but two of our classmates have working MP3Shield. So maybe it is just bad luck..
To complete the experience that we wanted, we decided to change to processing, so that the audio can come from the computer and we can get rid of MP3Shield. But it also means we need to explore on a new software and how the code works in it.
29 of November is our Beta Test, we are are kind of rushing for our project, so we have applied to stay-overnight at Fab Lab to finish up everything for tomorrow Beta Test.
We invited fews of our friends to test, and fill up our survey form. And Linyew brought many lecturers to our beta test, and we got so much feedback from them, and knowing what to improve.
Q1: Do you get attracted by the miniature set?
Q2: How do you feel when you saw the miniature set?
Q3: Will you use the headphone that are prepared with the set?
Q4. What do you think it is for?
Q5: Will you want to know all this information if it was set in an event?
Q6: In what way you would prefer to get the information.
Q7: Do you think this setup are related to Kuala Lumpur culture?
Q8: What do you feel after you understand the details of the project?
Q9: What do you suggest us to improve on this project? To make it more fun, interesting and interactive.
We recorded all feedback we got from beta test and analyse them.
User test data:
https://cdn.hackaday.io/files/1616046914065536/User%20Test.pdf
User test analysis:
https://cdn.hackaday.io/files/1616046914065536/Kedai%20Runcit%20-%20User%20Test.pdf
-Keep focus on making all the props. Too much details so we spent a lot of time keep doing all the little miniatures.
-For the mechanism parts, we are still struggling for the audio part, it really not functioning with MP3Shield. We are still exploring how to use the library.
-Besides, the sensor part goes well.
- Keep continue doing our little props.
- Working on the mechanism, testing out the input and output is functioning correctly.
What can we improve?:
Code for Alpha test:
const int BtnSmallMotor = 2;
const int TouchSense = 4;
const int TouchHorse = 12;
const int SmallMotorSpin = 6;
const int LargeMotorSpin = 8;
const int LightUp = 10;
int buttonState = 0;
int touchy =0;
int touchDaHorse =0;
void setup() {
// put your setup code here, to run once:
pinMode (BtnSmallMotor,INPUT);
pinMode (TouchSense,INPUT);
digitalWrite(TouchSense,HIGH);
pinMode (TouchHorse,INPUT);
digitalWrite(TouchHorse,HIGH);
pinMode (SmallMotorSpin,OUTPUT);
pinMode (LargeMotorSpin,OUTPUT);
pinMode (LightUp,OUTPUT);
//digitalWrite(SwitchPin, HIGH); VERY IMPORTANTTTT
Serial.begin (9600);
digitalWrite(LightUp,LOW);
}
void loop(){
buttonState = digitalRead(BtnSmallMotor);
if (buttonState == LOW){
digitalWrite (SmallMotorSpin,LOW);
} else
if (buttonState == HIGH){
digitalWrite (SmallMotorSpin, HIGH);
delay(1800);
}
touchy = digitalRead (TouchSense);
if(touchy == LOW){
digitalWrite(LightUp,LOW);
} else {
digitalWrite(LightUp,HIGH);
}
touchDaHorse = digitalRead (TouchHorse);
if(touchDaHorse == HIGH){
analogWrite(LargeMotorSpin,50);
}
else {
analogWrite (LargeMotorSpin,0);
}
}
// put your main code here, to run repeatedly:
Prototyping progress:
This week we only focus on prototyping. We built up a miniature prototype mini market which called "Kedai Runcit" in Malaysia. Besides, we also built up the exterior and interior too to let us more easily arrange the placements. After that, we continue to made our little props.
-Refining design
-More prototyping, improving the mechanism and interacting part.
-Did some attempts of the measurements of different parts to make sure it is fit.
We did some simple coding for testing the mechanism
void setup() {
// put your setup code here, to run once:
pinMode(3, OUTPUT);
analogWrite(3,30);
}
void loop() {
// put your main code here, to run repeatedly:
}const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin,OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}
void loop() {
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (buttonState == HIGH) {
// turn LED off:
digitalWrite(ledPin, LOW);
} else
if(buttonState == LOW) {
// turn LED on:
digitalWrite(ledPin, HIGH);
}
}
Motor spinnig:
int mot1 = 8;
int mot2 = 9;
int en1 = 10;
int val = 0;
void setup() {
// put your setup code here, to run once:
pinMode(mot1,OUTPUT);
pinMode(mot2,OUTPUT);
pinMode(en1,OUTPUT);
digitalWrite(mot1,HIGH);
delay(5000);
}
void loop() {
}
Prototyping session start soon. We discussed what kind of material we need to use in this project. After that, we went to a shop to buy those materials.
Materials that we bought:
To-Do-List: (prototype)
This week is the final idea confirmation week. We came out again for a long discussion for our ideas, the 2 ideas have been approved but we have to develop more details of the idea, like for examples: core experiences, flowchart, insight, goals, rules, how its works.
What we have done:
We have a final pitch for our idea this week. Only 1 idea will be selected for each team to focus on following weeks. So after the final pitch, we got the comment from lecturer, that actually both of the idea is workable, so between we both have to decide which idea we think that we should go into it, So finally my teammate and I decided to further develop the idea "Kedai Runcit," It's because we both think that it has more possibility, potential and more have fun idea. Moreover, we really like miniature so much.
So for the Kedai Runcit idea, lecturer commented:
Taking account feedback or suggestions received throughout the pitching, for progress last week, we refined our two ideas that got approved.
First idea
Dear Diary: Every Malaysian will go through primary school and secondary school study. We all have very special memory in the school, and we would like to bring them to experience the past again. By using the memorable school booklet which every student used before when they were studying. Combine with the idea of a diary to bring them back into those memories. For this design, we were targeting adults who are tired of working and probably misses their school life.
Second idea
Kedai Runcit (Mini Market): This idea was inspired by Malaysian slang (communication slang between different races), and kedai runcit which are a common place that we would visit. People will thought each race will speak their own language, but we all speak Malaysian slang, which is super local and super original things we have in Malaysia. When interacting with the Kedai Runcit set, people will hear communication between different races, and they were all friendly and nice. The message behind is: even we are born in different races, but we are all Malaysians, who truly speak Malaysian (slang).
First idea:
1. The design of the booklet. We were thinking to make it more cartoon style combined with vintage, to make it more suitable with "childhood memories".
2. Added on user flow.
Second idea:
1. We measured again the measurement of the object(kedai runcit), to let out more spaces for keeping the wires and mechanism stuff.
2. Added on user flow.
3. Sketched out the props or interior contents.
Had a discussion about the script. We decided to make the conversations more fun and interesting by adding in some lively events into the story and adding more slang from different races.
Presentation file linked below:
https://cdn.hackaday.io/files/1616046914065536/Pitch%203.pdf
We received the feedback from lecturer that we need to improve more on our project's interaction part. Example: think that how to make a kedai runcit miniature more lively instead of just a miniature.
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