11/28/2007

for our dear husbands :D ------ physical computing final

though Sandra and I, we didn't have husbands, we've heart a lot of interesting stories between couples: how much headache the poor husbands had in terms of dealing with their emotional (or super emotional) wives, how hard wives could control themselves, how careless couples deal with issues of period and the effects of period and physical and psyclogical cycles, and also how difficult to let our dear husbands remember their wives' period cycle, and how poor they could smell whether their wives are in the mood of sex or not... in the mood of choclate, or in the mood of fighting ... :D

so we decided to build a magic clock for them.

for more information: this is our final project blog, a collaborative blog with Sandra .


1, getting motors from a typewriter. that's where our motors come.

where our motors come from

2, wiring the 2 stepper motors. Both of them areunipolar.

The unipolar stepper motor has five or six wires and four coils (actually two coils divided by center connections on each coil). The center connections of the coils are tied together and used as the power connection. They are called unipolar steppers because power always comes in on this one pole. (source: http://www.tigoe.net/pcomp/code/category/code/arduinowiring/51 )

wiring with transistor array

3, connecting the encoder

http://www.nubotics.com/support/index.html

2 steppers to arduino

4, soldering onto little piece of perfboard to make the plug-in modula on arduino

encoder

5, test the encoder, and we got accurate readings: every rotation of the steppers, the encoder increments "62"

stepper motor's tricky counter

6, first version of housing gears, motors and encoder.

housing first version (thanks to mexico clay )

6, final version of housing

DSC02052

7, standing up (here is the tricky thing.the gravity made the gears works a little bit different, when moving towards up, like 9 o clock, the pointer stepping may loose steps, so we did re-housing, making it more secure and stable, and checking motors again)

DSC02066

8, spray the face and mount onto the clock.

DSC02069


http://flickr.com/photos/beyondmeng/tags/final/


this is the final code in arduino

// Variables for calculating PERIOD and SEX pointers
//float speedPointer();

int encoder[108];
//PROGMEM prog_uchar encoder[106];
//prog_uchar encoder[106] PROGMEM;
//unsigned char lastEncoder0Pos;
int displayRead;
int lastEncoder0Pos;
unsigned char encoder0Pos;
int steps;

int timePeriod=60;
int passedDays=15;
int cycleCount;
int gear20=18;
int gear24=96;
int delayRate;
int pointerPos=0;
//int sexPoint=0;
//int reading[107];
int initialSteps;
int delayMillis;
int savedMillis;
int ellapsedMillis;
int displayEncoder;
//int lastEncoder0Pos;
int lastChange;

//Variables for communicating to Processing
int firstByte; // value for Period
int secondByte; // value for Initial Date
int serialInArray[3]; // array for storing 3 bytes as they arrive from processing
int serialCount = 0; // for counting the number of bytes received

// ENCODER Variables
#define encoder0PinA 2
#define encoder0PinB 3
//volatile int encoder0Pos = 0;

// Stepper Motor Variables
int counter=0;
#include
//Motor Steps for Motor 1
#define motor1Steps 24 // change this depending on the number of steps
// Steps fo motor 2
#define motor2Steps 20 // per revolution of your motor
// Pins 4 to 7 for Motor 1
#define motorPin1 8
#define motorPin2 9
#define motorPin3 10
#define motorPin4 11
//Pins 8-11 for Motor 2
#define motorPin5 4
#define motorPin6 5
#define motorPin7 6
#define motorPin8 7
// initialize of the Stepper library:
Stepper myStepper(motor1Steps, motorPin1,motorPin2,motorPin3,motorPin4);
Stepper myStepper2(motor2Steps,motorPin5,motorPin6,motorPin7,motorPin8);

void setup() {
// set the motor speed at 60 RPMS:
myStepper.setSpeed(10);
myStepper2.setSpeed(60);

// Initialize the Serial port:
Serial.begin(9600);
// myStepper.step(10);

//SETUP FOR ENCODER
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // turn on pullup resistor
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // turn on pullup resistor
attachInterrupt(0, doEncoder, CHANGE); // encoder pin on interrupt 0 - pin 2
Serial.begin (9600);
Serial.println(”start”); // a personal quirk
savedMillis=millis();
initialSteps=-106.67*passedDays/timePeriod;
delayMillis=9.375*timePeriod;
myStepper2.step(int(initialSteps));
Serial.println(initialSteps);
}

void loop() {

/*
if (Serial.available() > 0) {
// read the most recent byte (which will be from 0 to 255)
if(Serial.read()==65){
timePeriod = Serial.read();
passedDays = Serial.read();
}
}
*/
/*
serialInArray[serialCount] = Serial.read(); // read a byte sent by processing
serialCount++; // increment number of bytes received
if (serialCount > 2 ) { // when 3 bytes received
firstByte = serialInArray[1]; // get value for PERIOD
secondByte = serialInArray[2]; // get value for INITIAL DATE
serialCount = 0;
}
*/

// delayMillis=0;
// Serial.println(delayMillis);

ellapsedMillis=millis()-savedMillis;
// Serial.println(ellapsedMillis);
if(ellapsedMillis>=delayMillis){
// save the reading
encoder[pointerPos]=encoder0Pos;
Serial.println(”writingwhenmillis-lastChange>=delayMillis”);
Serial.println(pointerPos);
Serial.println(encoder0Pos, DEC);
//Serial.println(ellapsedMillis);
myStepper2.step(-1);
savedMillis=millis();
pointerPos+=1;
// lastChange = millis();
// if (encoder[pointerPos]>0) {
if(cycleCount>0){
Serial.println(”encoder[pointerPos]”);
Serial.println(encoder[pointerPos],DEC);
Serial.println(encoder0Pos, DEC);

steps=int(0.375*encoder[pointerPos]-0.375*encoder0Pos);
Serial.println(steps);
myStepper.step(steps);
}
/*
// if (millis() - lastChange >= delayMillis*0.8) {
if (millis() - savedMillis >= delayMillis*0.8) {
// save the reading
encoder[pointerPos]=encoder0Pos;
Serial.println(”writingwhenmillis-lastChange>=delayMillis”);
Serial.println(pointerPos);
Serial.println(encoder0Pos, DEC);
//prog_uchar encoder[pointerPos]=lastEncoder0Pos;
}
}
*/
if (pointerPos == 106){
cycleCount+=1;
pointerPos=0;
if (cycleCount==3){
myStepper2.step(3);
}
Serial.println(”cycleCount”);
}
}

}

void doEncoder(){
if (digitalRead(encoder0PinA) == HIGH) { // found a low-to-high on channel A
if (digitalRead(encoder0PinB) == LOW) { // check channel B to see which way
// encoder is turning
encoder0Pos = encoder0Pos - 1; // CCW
}
else {
encoder0Pos = encoder0Pos + 1; // CW
}
}
else // found a high-to-low on channel A
{
if (digitalRead(encoder0PinB) == LOW) { // check channel B to see which way
// encoder is turning
encoder0Pos = encoder0Pos + 1; // CW
}
else {
encoder0Pos = encoder0Pos - 1; // CCW
}
}

if(encoder0Pos>64){
encoder0Pos=1;
}
if(encoder0Pos<1){
encoder0Pos=64;
}
// Serial.println (encoder0Pos, DEC); // debug - remember to comment out
}

for more information: this is our final project blog, a collaborative blog with Sandra .

No comments: