Difference between revisions of "Students/Tung Mach"
Lanceloter (talk | contribs) (→The Midterm Project) |
Lanceloter (talk | contribs) (→Field Research) |
||
(16 intermediate revisions by the same user not shown) | |||
Line 9: | Line 9: | ||
== Electronic Technologies for Art I == | == Electronic Technologies for Art I == | ||
In the quarter of Winter 2010, Lance registered for a class called Electronic Technologies for the Art with Robert Twomey, due to his passion for electronics. Lance finds the class intriguing because he likes the work behind electricity and the process of assembling. Though, Lance doesn't have any knowledge nor previous experience with electronics, he hopes to gain the intelligence to strengthen his creative mind in the art and perhaps acquire a new hobby. | In the quarter of Winter 2010, Lance registered for a class called Electronic Technologies for the Art with Robert Twomey, due to his passion for electronics. Lance finds the class intriguing because he likes the work behind electricity and the process of assembling. Though, Lance doesn't have any knowledge nor previous experience with electronics, he hopes to gain the intelligence to strengthen his creative mind in the art and perhaps acquire a new hobby. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== Midterm Project Proposal == | == Midterm Project Proposal == | ||
Line 32: | Line 15: | ||
When it comes to looks, my first idea would probably look like a CD case, or some kind of box. Being a closed switch, if one was to open it, a button would be released, allowing the circuits to connect to set off the alarm. Upon looking inside the box, you can see all the mechanics that are made up into this anti-theft system. My second idea would simply be a mouse trap, probably with lights and sounds coming out of it. My third idea would probably involve the most work, building a small elevator and having at least two floors with a switch." | When it comes to looks, my first idea would probably look like a CD case, or some kind of box. Being a closed switch, if one was to open it, a button would be released, allowing the circuits to connect to set off the alarm. Upon looking inside the box, you can see all the mechanics that are made up into this anti-theft system. My second idea would simply be a mouse trap, probably with lights and sounds coming out of it. My third idea would probably involve the most work, building a small elevator and having at least two floors with a switch." | ||
+ | http://photos-f.ak.fbcdn.net/hphotos-ak-snc3/hs421.snc3/24329_1288317681297_1030830148_30803190_4434777_n.jpg | ||
== The Midterm Project == | == The Midterm Project == | ||
Line 48: | Line 32: | ||
I will be using Arduino to produce the code that will work with my robot. The robot won't actually have any movement to move, it will be stationary. However, I will controlling the robot's body, like moving the body for an example. I will also probably add lights and sounds to the robot, so a button would probably activate the lights. | I will be using Arduino to produce the code that will work with my robot. The robot won't actually have any movement to move, it will be stationary. However, I will controlling the robot's body, like moving the body for an example. I will also probably add lights and sounds to the robot, so a button would probably activate the lights. | ||
+ | |||
+ | http://photos-a.ak.fbcdn.net/hphotos-ak-snc3/hs401.snc3/24329_1288317641296_1030830148_30803189_5324550_n.jpg | ||
+ | Illustration of Project | ||
+ | http://photos-d.ak.fbcdn.net/hphotos-ak-snc3/hs421.snc3/24329_1288317721298_1030830148_30803191_3231918_n.jpg | ||
== Final Project Documentation == | == Final Project Documentation == | ||
− | + | Presented on March 11 (Thursday), 2010. | |
+ | |||
+ | For my final project, I made a bionic puppet. Instead of controlling a puppet with your hands, you can now control your puppet using a controller. Using the Nintendo Wii Nunchuck as a 3-axis accelerometer, you control the puppet by tilting, rotating, and pushing buttons. Tilting down and up controls the Y-axis, moving the head up and down, and rotating it left and right controls the X-axis, moving the head left and right. Pressing the "C" button will make the puppet beep, pressing the "Z" button will hold the head in its place. I would like to name him Spazzy, because he likes to twitch a lot. | ||
+ | |||
+ | http://hphotos-snc3.fbcdn.net/hs482.snc3/26393_1294431994151_1030830148_30814980_6621906_n.jpg | ||
+ | http://hphotos-snc3.fbcdn.net/hs482.snc3/26393_1294432034152_1030830148_30814981_863787_n.jpg | ||
+ | http://photos-b.ak.fbcdn.net/hphotos-ak-ash1/hs482.ash1/26393_1294432074153_1030830148_30814982_2379686_n.jpg | ||
+ | http://hphotos-snc3.fbcdn.net/hs502.snc3/26393_1294432114154_1030830148_30814983_5056626_n.jpg | ||
+ | http://hphotos-snc3.fbcdn.net/hs502.snc3/26393_1294432154155_1030830148_30814984_2240416_n.jpg | ||
+ | Spazzy: BEEP! BEEP! | ||
+ | |||
+ | Arduino Sketch | ||
+ | <pre> | ||
+ | #include <Wire.h> | ||
+ | #include <string.h> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | uint8_t outbuf[6]; | ||
+ | int cnt = 0; | ||
+ | int ledPin = 13; | ||
+ | int servoPin = 7; // Control pin 7 for servo motor | ||
+ | int servoPin2 = 6; // Control pin 6 for servo motor | ||
+ | int pulseWidth = 0; // Amount to pulse the servo | ||
+ | int pulseWidth2 = 0; | ||
+ | long lastPulse = 0; | ||
+ | long lastPulse2 = 0; | ||
+ | int z_button = 0; | ||
+ | int c_button = 0; | ||
+ | int refreshTime = 20; // The time in millisecs needeed in between pulses | ||
+ | int minPulse = 1000; // Minimum pulse width | ||
+ | int minPulse2 = 500; | ||
+ | int dtime=10; | ||
+ | |||
+ | #define pwbuffsize 10 | ||
+ | long pwbuff[pwbuffsize]; | ||
+ | long pwbuffpos = 0; | ||
+ | long pwbuff2[pwbuffsize]; | ||
+ | long pwbuffpos2 = 0; | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | beginSerial (19200); | ||
+ | Wire.begin (); | ||
+ | nunchuck_init (); | ||
+ | pinMode(servoPin, OUTPUT); // Set servoPin as an output pin | ||
+ | pinMode(servoPin2, OUTPUT); // Set servoPin2 as an output pin | ||
+ | pulseWidth = minPulse; // Set the motor position to the minimum | ||
+ | pulseWidth2 = minPulse2; | ||
+ | Serial.print ("Finished setup\n"); | ||
+ | } | ||
+ | |||
+ | void nunchuck_init() | ||
+ | { | ||
+ | Wire.beginTransmission (0x52); | ||
+ | Wire.send (0x40); | ||
+ | Wire.send (0x00); | ||
+ | Wire.endTransmission (); | ||
+ | } | ||
+ | |||
+ | void send_zero() | ||
+ | { | ||
+ | Wire.beginTransmission (0x52); | ||
+ | Wire.send (0x00); | ||
+ | Wire.endTransmission (); | ||
+ | } | ||
+ | |||
+ | int t = 0; | ||
+ | void loop() | ||
+ | { | ||
+ | t++; | ||
+ | long last = millis(); | ||
+ | if( t == 1) { | ||
+ | t = 0; | ||
+ | Wire.requestFrom (0x52, 6); | ||
+ | while (Wire.available ()) { | ||
+ | outbuf[cnt] = nunchuk_decode_byte (Wire.receive ()); | ||
+ | digitalWrite (ledPin, HIGH); | ||
+ | cnt++; | ||
+ | } | ||
+ | |||
+ | if (cnt >= 5) { | ||
+ | // printNunchuckData(); | ||
+ | int z_button = 0; | ||
+ | int c_button = 0; | ||
+ | if ((outbuf[5] >> 0) & 1) | ||
+ | z_button = 1; | ||
+ | if ((outbuf[5] >> 1) & 1) | ||
+ | c_button = 1; | ||
+ | |||
+ | switch (c_button) { | ||
+ | case 1: | ||
+ | switch (z_button) { | ||
+ | case 0: | ||
+ | break; | ||
+ | case 1: | ||
+ | muovi(); | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | case 0: | ||
+ | switch (z_button) { | ||
+ | case 0: | ||
+ | delay(10000); | ||
+ | break; | ||
+ | case 1: | ||
+ | delay(3000); | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | cnt = 0; | ||
+ | send_zero(); | ||
+ | } // if(t==) | ||
+ | updateServo // Update servo position | ||
+ | delay(dtime); | ||
+ | } | ||
+ | |||
+ | |||
+ | void updateServo() { | ||
+ | |||
+ | if (millis() - lastPulse >= refreshTime) { | ||
+ | digitalWrite(servoPin, HIGH); | ||
+ | delayMicroseconds(pulseWidth); | ||
+ | digitalWrite(servoPin, LOW); | ||
+ | digitalWrite(servoPin2, HIGH); | ||
+ | delayMicroseconds(pulseWidth2); | ||
+ | digitalWrite(servoPin2, LOW); | ||
+ | lastPulse = millis(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | int i=0; | ||
+ | void printNunchuckData() | ||
+ | { | ||
+ | int joy_x_axis = outbuf[0]; | ||
+ | int joy_y_axis = outbuf[1]; | ||
+ | int accel_x_axis = outbuf[2]; // * 2 * 2; | ||
+ | int accel_y_axis = outbuf[3]; // * 2 * 2; | ||
+ | int accel_z_axis = outbuf[4]; // * 2 * 2; | ||
+ | int z_button = 0; | ||
+ | int c_button = 0; | ||
+ | if ((outbuf[5] >> 0) & 1) | ||
+ | z_button = 1; | ||
+ | if ((outbuf[5] >> 1) & 1) | ||
+ | c_button = 1; | ||
+ | if ((outbuf[5] >> 2) & 1) | ||
+ | accel_x_axis += 2; | ||
+ | if ((outbuf[5] >> 3) & 1) | ||
+ | accel_x_axis += 1; | ||
+ | if ((outbuf[5] >> 4) & 1) | ||
+ | accel_y_axis += 2; | ||
+ | if ((outbuf[5] >> 5) & 1) | ||
+ | accel_y_axis += 1; | ||
+ | if ((outbuf[5] >> 6) & 1) | ||
+ | accel_z_axis += 2; | ||
+ | if ((outbuf[5] >> 7) & 1) | ||
+ | accel_z_axis += 1; | ||
+ | Serial.print (i,DEC); | ||
+ | Serial.print ("\t"); | ||
+ | Serial.print ("X: "); | ||
+ | Serial.print (joy_x_axis, DEC); | ||
+ | Serial.print ("\t"); | ||
+ | Serial.print ("Y: "); | ||
+ | Serial.print (joy_y_axis, DEC); | ||
+ | Serial.print ("\t"); | ||
+ | Serial.print ("AccX: "); | ||
+ | Serial.print (accel_x_axis, DEC); | ||
+ | Serial.print ("\t"); | ||
+ | Serial.print ("AccY: "); | ||
+ | Serial.print (accel_y_axis, DEC); | ||
+ | Serial.print ("\t"); | ||
+ | Serial.print ("AccZ: "); | ||
+ | Serial.print (accel_z_axis, DEC); | ||
+ | Serial.print ("\t"); | ||
+ | Serial.print (z_button, DEC); | ||
+ | Serial.print (" "); | ||
+ | Serial.print (c_button, DEC); | ||
+ | Serial.print ("\r\n"); | ||
+ | i++; | ||
+ | } | ||
+ | |||
+ | char nunchuk_decode_byte (char x) | ||
+ | { | ||
+ | x = (x ^ 0x17) + 0x17; | ||
+ | return x; | ||
+ | } | ||
− | + | void muovi (){ | |
− | + | float tilt = (700 - outbuf[3]*2*2); | |
+ | float tilt2 = outbuf[2]*2*2; | ||
+ | tilt = (tilt); | ||
+ | pulseWidth = (tilt * 5) + minPulse; | ||
+ | tilt2 = (tilt2-288); | ||
+ | pulseWidth2 = (tilt2 * 5) + minPulse2; | ||
+ | pwbuff[pwbuffpos] = pulseWidth; | ||
+ | pwbuff2[pwbuffpos2] = pulseWidth2; | ||
+ | if( ++pwbuffpos == pwbuffsize ) pwbuffpos = 0; | ||
+ | if( ++pwbuffpos2 == pwbuffsize ) pwbuffpos2 = 0; | ||
+ | pulseWidth=0; | ||
+ | pulseWidth2=0; | ||
+ | for( int p=0; p<pwbuffsize; p++ ){ | ||
+ | pulseWidth += pwbuff[p]; | ||
+ | pulseWidth2 += pwbuff2[p]; | ||
+ | } | ||
+ | pulseWidth /= pwbuffsize; | ||
+ | pulseWidth2 /= pwbuffsize; | ||
+ | } | ||
+ | </pre> |
Latest revision as of 13:27, 22 September 2011
Tung Mach (January 15, 1989), better known by his preferred name Lance, is a 3rd year undergraduate student at the University of California, San Diego, currently majoring in both Interdisciplinary Computing and the Arts and Computer Science and Engineering.
Contents
Early Life
Lance received his diploma at Alameda High School, where he was involved in many clubs, and was the varsity of the badminton club for all 4 years. After his graduation, he decided to attend a community college in order to shorten his college expenses. In shortly after 2 years, he soon transferred into the University.
Personal Life
Lance was cool. He's still cool. Everyone likes him.
Electronic Technologies for Art I
In the quarter of Winter 2010, Lance registered for a class called Electronic Technologies for the Art with Robert Twomey, due to his passion for electronics. Lance finds the class intriguing because he likes the work behind electricity and the process of assembling. Though, Lance doesn't have any knowledge nor previous experience with electronics, he hopes to gain the intelligence to strengthen his creative mind in the art and perhaps acquire a new hobby.
Midterm Project Proposal
"For this upcoming midterm project, there are a few ideas that came to mind, but I can’t decide yet on which I want to do. My very first idea was an anti-theft device mechanism, which can be installed into a product. If one was to steal and open a product, a sensor would go off, alarming others. My second idea could be a simple mouse trap, where if a mouse gets near one, it would get caught and a loud sensor would go off. This would alert the owner of the house, can quickly dispose of the rat, and reinstall it again. My third idea is a mini elevator, which I could incorporate the knife switch into my project. If I turn the switch up, it would move the elevator up, switching it down would move it down.
When it comes to looks, my first idea would probably look like a CD case, or some kind of box. Being a closed switch, if one was to open it, a button would be released, allowing the circuits to connect to set off the alarm. Upon looking inside the box, you can see all the mechanics that are made up into this anti-theft system. My second idea would simply be a mouse trap, probably with lights and sounds coming out of it. My third idea would probably involve the most work, building a small elevator and having at least two floors with a switch."
The Midterm Project
When I wrote my project proposal, I had a lot of ideas that I wanted to do, but not everything went well. I decided to start off with some new ideas from scratch. Then suddenly, I came up with something. I decided to make a netbook cooler, as no company has made one yet. The purpose of this cooler is to decrease the temperature of the netbook by fanning below . This project is simple, but yet simple. The cooler will have two features, an automatic switch so when a netbook is placed on top, the cooler will automatically start fanning, and a turning knob to adjust the speed of the fan. The cooler was easy to make, I placed the red switch on top of the box, so that way when something is pressed against it, it would connect the circuit all together, making the fan spin. I placed the knob on the back so adjust the volume of the fan, which is also connected to the circuit. The turning knob is also known as a potentiometer, it can be treated as a resistor as you can change the volume of the electricity flowing through the motor that is rotating the fan. The box is actually made out of a cereal box, wrapped with black construction paper. Inside the box, the circuit board is placed in the back, which also connects the wire from the battery, potentiometer (turning knob), and the switch button. Upon use, this product actually works. Though, it will only fit netbooks only, it still cools down the netbook slightly. The unique feature about this cooler is that it doesn't require USB to connect to a netbook, as it could run on either battery for high mobility or simply through AC power.
Front View
Back View
Netbook placed on top of the cooler
Final Project Proposal
For my final, I would like to propose a project that is related to the topic of Bionic Arduino. The definition on bionic means having normal biological capability or performance enhanced by or as if by electronic or electromechanical devices. I would like to get a 3-axis accelerometer that would be able to control a robot by just tilting and or rotating the accelerometer. With the accelerometer, I will be able to measure proper acceleration, detecting magnitude and direction of the acceleration as a vector quantity, and can be used to sense orientation, vibration and shock.
I will be using Arduino to produce the code that will work with my robot. The robot won't actually have any movement to move, it will be stationary. However, I will controlling the robot's body, like moving the body for an example. I will also probably add lights and sounds to the robot, so a button would probably activate the lights.
Illustration of Project
Final Project Documentation
Presented on March 11 (Thursday), 2010.
For my final project, I made a bionic puppet. Instead of controlling a puppet with your hands, you can now control your puppet using a controller. Using the Nintendo Wii Nunchuck as a 3-axis accelerometer, you control the puppet by tilting, rotating, and pushing buttons. Tilting down and up controls the Y-axis, moving the head up and down, and rotating it left and right controls the X-axis, moving the head left and right. Pressing the "C" button will make the puppet beep, pressing the "Z" button will hold the head in its place. I would like to name him Spazzy, because he likes to twitch a lot.
Spazzy: BEEP! BEEP!
Arduino Sketch
#include <Wire.h> #include <string.h> #include <stdio.h> uint8_t outbuf[6]; int cnt = 0; int ledPin = 13; int servoPin = 7; // Control pin 7 for servo motor int servoPin2 = 6; // Control pin 6 for servo motor int pulseWidth = 0; // Amount to pulse the servo int pulseWidth2 = 0; long lastPulse = 0; long lastPulse2 = 0; int z_button = 0; int c_button = 0; int refreshTime = 20; // The time in millisecs needeed in between pulses int minPulse = 1000; // Minimum pulse width int minPulse2 = 500; int dtime=10; #define pwbuffsize 10 long pwbuff[pwbuffsize]; long pwbuffpos = 0; long pwbuff2[pwbuffsize]; long pwbuffpos2 = 0; void setup() { beginSerial (19200); Wire.begin (); nunchuck_init (); pinMode(servoPin, OUTPUT); // Set servoPin as an output pin pinMode(servoPin2, OUTPUT); // Set servoPin2 as an output pin pulseWidth = minPulse; // Set the motor position to the minimum pulseWidth2 = minPulse2; Serial.print ("Finished setup\n"); } void nunchuck_init() { Wire.beginTransmission (0x52); Wire.send (0x40); Wire.send (0x00); Wire.endTransmission (); } void send_zero() { Wire.beginTransmission (0x52); Wire.send (0x00); Wire.endTransmission (); } int t = 0; void loop() { t++; long last = millis(); if( t == 1) { t = 0; Wire.requestFrom (0x52, 6); while (Wire.available ()) { outbuf[cnt] = nunchuk_decode_byte (Wire.receive ()); digitalWrite (ledPin, HIGH); cnt++; } if (cnt >= 5) { // printNunchuckData(); int z_button = 0; int c_button = 0; if ((outbuf[5] >> 0) & 1) z_button = 1; if ((outbuf[5] >> 1) & 1) c_button = 1; switch (c_button) { case 1: switch (z_button) { case 0: break; case 1: muovi(); break; } break; case 0: switch (z_button) { case 0: delay(10000); break; case 1: delay(3000); break; } break; } } cnt = 0; send_zero(); } // if(t==) updateServo // Update servo position delay(dtime); } void updateServo() { if (millis() - lastPulse >= refreshTime) { digitalWrite(servoPin, HIGH); delayMicroseconds(pulseWidth); digitalWrite(servoPin, LOW); digitalWrite(servoPin2, HIGH); delayMicroseconds(pulseWidth2); digitalWrite(servoPin2, LOW); lastPulse = millis(); } } int i=0; void printNunchuckData() { int joy_x_axis = outbuf[0]; int joy_y_axis = outbuf[1]; int accel_x_axis = outbuf[2]; // * 2 * 2; int accel_y_axis = outbuf[3]; // * 2 * 2; int accel_z_axis = outbuf[4]; // * 2 * 2; int z_button = 0; int c_button = 0; if ((outbuf[5] >> 0) & 1) z_button = 1; if ((outbuf[5] >> 1) & 1) c_button = 1; if ((outbuf[5] >> 2) & 1) accel_x_axis += 2; if ((outbuf[5] >> 3) & 1) accel_x_axis += 1; if ((outbuf[5] >> 4) & 1) accel_y_axis += 2; if ((outbuf[5] >> 5) & 1) accel_y_axis += 1; if ((outbuf[5] >> 6) & 1) accel_z_axis += 2; if ((outbuf[5] >> 7) & 1) accel_z_axis += 1; Serial.print (i,DEC); Serial.print ("\t"); Serial.print ("X: "); Serial.print (joy_x_axis, DEC); Serial.print ("\t"); Serial.print ("Y: "); Serial.print (joy_y_axis, DEC); Serial.print ("\t"); Serial.print ("AccX: "); Serial.print (accel_x_axis, DEC); Serial.print ("\t"); Serial.print ("AccY: "); Serial.print (accel_y_axis, DEC); Serial.print ("\t"); Serial.print ("AccZ: "); Serial.print (accel_z_axis, DEC); Serial.print ("\t"); Serial.print (z_button, DEC); Serial.print (" "); Serial.print (c_button, DEC); Serial.print ("\r\n"); i++; } char nunchuk_decode_byte (char x) { x = (x ^ 0x17) + 0x17; return x; } void muovi (){ float tilt = (700 - outbuf[3]*2*2); float tilt2 = outbuf[2]*2*2; tilt = (tilt); pulseWidth = (tilt * 5) + minPulse; tilt2 = (tilt2-288); pulseWidth2 = (tilt2 * 5) + minPulse2; pwbuff[pwbuffpos] = pulseWidth; pwbuff2[pwbuffpos2] = pulseWidth2; if( ++pwbuffpos == pwbuffsize ) pwbuffpos = 0; if( ++pwbuffpos2 == pwbuffsize ) pwbuffpos2 = 0; pulseWidth=0; pulseWidth2=0; for( int p=0; p<pwbuffsize; p++ ){ pulseWidth += pwbuff[p]; pulseWidth2 += pwbuff2[p]; } pulseWidth /= pwbuffsize; pulseWidth2 /= pwbuffsize; }