IxLab Midterm Project: Individual Report
Project Title: Crossing Boundaries
Artist: Andy Ye & Jason Xia
Instructor: Margaret Minsky
Project Description
The blue button is for crossing the road. The green button is for turning the traffic light green. Do you know when we can let that person cross the road? Easy question, isn’t it? Now, close your eyes, can you still tell the answer? However, the situation is what blind people are experiencing every time. In this project, we designed the shifting of information to convert the light signals into sound signals. We hope through this project, the users will be conscious of the inconvenience of disabled people and push the popularization of city facility construction that is designed for disabled people.
Context and Significance
Through my previous research, I got the inspiration for this project. In the group research, we went further on an assistant robot that can help the petrified people to do their daily routines. Through our performance, acting as a petrified person, I saw the inconvenience when part of the body can’t be controlled by myself. And this is exactly what these disabled people are experiencing at the moment. This is the very first idea of this project.
Then, when specifying the details of the project, my partner and I found a big problem which is that the interaction with disabled people is under limits. Hence, we turned the purpose of our project into another dimension: educational meanings. We hope that our project can make people conscientious of helping and caring for these disabled people around us.
Concept and Design
Another incident makes me get the idea of crossing the road. Once I was crossing Century Avenue, I saw an old man crossing the road with an old lady. I heard that old man tell the old lady: “I heard that the traffic is silent, has the light turned green?” At that moment, I got the idea that shifting the information to different carriers to make disabled people can receive the information.
After a short discussion with my partner, we started to design the project. We intended to make a miniature crossroads and a crossing road person. As for the interaction design, the buttons are the main method to interact with the project. We also designed a sensor that can let the processor know the exact position of the person.
[Brief drawing] (draw by Jason)
We also spent a lot of time designing its transmission mechanism. At the very beginning, we’ve design the 1st version:
[left: V1, right: V2] (draw by Jason)
However, after we finished the fabrication of the rotating shaft and the flexible wires, we abandoned this idea. We found that the flexible wires can hardly make the movement fluent since the force provided by the wire highly depends on the distance of elongation. Also, fixing the wire is much harder than we thought.
[more details about V2] (draw by Jason)
Then we turn to the 2nd version (the right one in the above screenshot). In this version, we don’t need to pay much attention to the wires. Also, we both think that this version contains more beauty in mechanism structures. So we finally adapt this structure as the final version.
[design for the gear] (draw by Jason)
We’ve also considered using the gear to transmit the power. However, the volume of the whole structure is quite too big which is not quite suitable for our project.
Fabrication and Production
We both agree with making the transmission mechanism the first priority of our project since the volume and the scale of our project greatly depend on how much space the structure will cost. After deciding the scale of the project and the mechanism, we start our procedure of production. We divided the labor quickly, while Jason was making the shell, I’ll responsible for the transmission part. I glue the rotation shaft but since we decided to use V2 as our final mechanism I have to abandon the work. Then we make the simple structure of the latch together.
Our experiment told us this may work well but is somehow greatly influenced by friction. We didn’t treat this as a big problem and kept making the structure. Then we meet another problem: the intensity of the cardboard is too weak to push the object to run following the rail. We glued two chopsticks on the cardboard to reinforce it. However, after we’ve glued, another problem appeared. Since the chopsticks are much heavier than the cardboard, the latch will fall from the servo by itself.
In order to solve the new appeared problem, we use a piece of cardboard glued under the support column of the moving person to support the latch. Till now, everything seems to work well. So I started to write the code for the servo.
Firstly, I use the sample code to test if the servo can work properly. Then I found that we don’t know the exact number of the servo angle. Since we need to make sure the initial position of the person is on the left side of the rail, I think I need to know the exact position of the servo to adjust the parameters. However, after many experiments, I find the angle of the servo is an absolute position and the servo will turn to that position every time I give the number. In this case, the only thing that I need to do is to measure the position and set it as a fixed one in the program.
So we need to install the servo first.
In order to make the servo can perfectly work with the latch together, we need to put it at a specific height. So Jason use a strip of cardboard to fix it. But it was not that stable. So we use tape to stick it on the cardboard, then glued the cardboard on the shell. In this case, the servo has been fixed well.
[servo pics]
After fixing the servo, I can measure the exact number of angles and write the code:
for (pos = pos; pos <= 100; pos += 1) { // goes from pos degrees to 95 degrees myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15 ms for the servo to reach the position } ppStatus = LOW; //Change the ppStatus } else if (ppStatus == LOW) { for (pos = pos; pos >= 5; pos -= 1) { // goes from pos degrees to 10 degrees myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15 ms for the servo to reach the position }
The code works quite well but sometimes the connector will disconnect from the servo. In this case, we turn to strengthen the supporting part of the latch. We use a strip of cardboard under the latch at the rail side to support it. After building this, the stability of the servo and the latch is much better.
After simply completing the transmission system, we started to make the circuits. One of the most important parts is the traffic light. I selected 3 different color LEDs in my toolkit and ironed each of them with a 220R resistors. And since we need to put the LEDs away from the breadboard and the Arduino board, I have to iron them with extended wires.
[LEDs pic]
Then is the switch. I ironed the switch with the extended wire too. After a simple test of the switch and the led, to make sure they work well, We put everything in place and connect the circuits.
Let’s Coding!
Then is the procedure of writing the code.
void loop() { digitalWrite(13, gLight); //greenLight D13 digitalWrite(12, yLight); //yellowLight D12 digitalWrite(11, rLight); //redLight D11 b1Status = digitalRead(5); b2Status = digitalRead(6); ...
In the code, I utilize the loop to set the status of the LEDs as a variable. In this case, we don’t need to write a whole output code when the LED changes the status, we only need to change the parameter between LOW and HIGH.
if (b1Status == HIGH && pastB1Status == LOW) { // button1 is pressed if (gLight == HIGH) { //situation under green light if (ppStatus == HIGH) { //LOW means LEFT; HIGH means RIGHT for (pos = pos; pos <= 100; pos += 1) { // goes from pos degrees to 95 degrees myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15 ms for the servo to reach the position } ppStatus = LOW; //Change the ppStatus } else if (ppStatus == LOW) { for (pos = pos; pos >= 5; pos -= 1) { // goes from pos degrees to 10 degrees myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15 ms for the servo to reach the position } ppStatus = HIGH; } }
Also, I defined the ppStatus which indicates the position of the person, LOW means left while HIGH means right. This can let the Arduino knows where the person is in order to better give orders to the servo. The pastStatus and the currentStatus of the button are also used in the code. By applying these codes, the button will only input once when the user pressed it for a long time.
if (rLight == HIGH) { //situation under red light for (int thisNote = 0; thisNote < 3; thisNote++) { // to calculate the note duration, take one second divided by the note type. //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc. for (int i = 0; i <= 1; i++) { //repeat 2 times int noteDuration = 1000 / noteDurations[thisNote]; tone(8, melody[thisNote], noteDuration); // to distinguish the notes, set a minimum time between them. // the note's duration + 30% seems to work well: int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); // stop the tone playing: noTone(8); } }
These codes were mostly copied from the sample code of the buzzer. We use these codes to make a sound so that our users can receive the sonic information.
if (b2Status == HIGH && pastB2Status == LOW) { //button2 is pressed count = 1; if (rLight == HIGH) { digitalWrite(11, LOW); //Redlight digitalWrite(12, HIGH); //yellowLight light up digitalWrite(13, LOW); //greenlight delay(500); TurnGreen(); } else if (gLight == HIGH) { for (int thisNote2 = 0; thisNote2 < 3; thisNote2 ++) { // to calculate the note duration, take one second divided by the note type. //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc. //repeat 1 times int noteDuration2 = 1000 / noteDurations[thisNote2]; tone(8, melody2[thisNote2], noteDuration2); // to distinguish the notes, set a minimum time between them. // the note's duration + 30% seems to work well: int pauseBetweenNotes = noteDuration2 * 1.30; delay(pauseBetweenNotes); // stop the tone playing: noTone(8); } } } if (count % 2000 == 0) { if (gLight == HIGH) { TurnRed(); } else if (rLight == HIGH) { TurnGreen(); } }
Here the logic is that when the light is red, pressing the button will make the light turn green. When the light is green, pressing the button will make the buzzer start to buzz. I wrote the variable count which is for letting the light can automatically turn green and red. And when the user has pressed the turning button, the count will be restored to 1 thus the automatic turning will not influence the user’s operation. I also wrote the function of TurnRed() and TurnGreen().
Here are the functions:
void TurnRed() { digitalWrite(11, LOW); //Redlight digitalWrite(12, HIGH); //yellowLight light up digitalWrite(13, LOW); //greenlight delay(500); rLight = HIGH; gLight = LOW; yLight = LOW; } void TurnGreen() { // Serial.println("Green"); rLight = LOW; gLight = HIGH; yLight = LOW; }
There’s a tiny difference between these two functions. We all know that when the light turns red from green there is a direct shift. However, when the light is turning red from green, the yellow light will light up. So in the TurnRed() function, the yellow light will light up for 0.5sec (Our original parameter is 3000ms however we found that it will confuse our user when user-testing so we shorten the time).
User Test and Improvement
The initial test ran fluently, it seems worked very well.
After mostly finishing the coding part, we started to color it. In the very beginning, we use paint to paint. But we met 2 problems at once:
1. Our user has reported that they are confused by the coloring since it’s more like a piano but not a street scene.
2. The paint on the surface increased the friction force between the surface and the stand of that person, it can’t move fluently and is usually stuck in the middle of the road.
Also in the user test, we received many suggestions and we mostly listen to the users and make the adjustment accordingly.
So we have to make a difference. We first turn to solve the sticking problem. We change the structure of the stand and use two pieces of cardboard at the bottom to support the person and canceled the stand on the surface. In this case, it won’t be influenced by the paint and the surface.
As for the appearance, we first change the way we decorate the project. We gave up the paint and choose to buy some stuff on Taobao. As for the surface of the rail, it has to be smooth and flat. We decided to print down the texture of the road and sidewalk on two A4 papers and stick them on the surface.
Here comes the final result:
Conclusions
In conclusion, the project can achieve almost the goals. It can make the audience feel the care for disabled people with the project description. It indeed mentioned a way for helping the blind cross the road. However, it also has some points that can be improved. For instance, if we can provide an eye mask for the audience, they can have a more immersive experience. Also, I received an opinion from a deaf mute. He mentioned some advice that is very valuable: the project can be adapted to more disabled people like adding some light signals on the zebra crossing signs. In this case, deaf people can more clearly see the signal and feel the environment. In addition, we can add more interactive elements to the project like using more sensors and giving the user a higher level of experience of interaction.
To wrap up, the world needs care for the disabled. The interaction also needs to adapt to their needs. When society cares more about them, when we completely eliminate discrimination, I believe that we can bring the whole human society a better world.