CEB Control Code
Introduction
The latest code as of 4.22.10 is;
//Notes: In every WHILE loop, shut off solenoids explicitly after //escaping from the loop. Orientation is defined by machine user //facing the control panel. 2 magnets (sensor actuators) are used //for main cylinder, 4 magnets for soil drawer, and 2 magnets are //are used for soil grate shaker. Copyright April 2010, Creative //Commons CC-BY-SA-compatible OSE License, by Marcin Jakubowski, //Ph.D., for OSE. This code and other documentation is available //at the Open+Pario project management site under the CEB Project, //under Documents - Liberator Beta 2.0 Control Code, //http://openpario.net/projects/OSE?
Code - Liberator Beta v2.0
//Notes: In every WHILE loop, shut off solenoids explicitly after //escaping from the loop. Orientation is defined by machine user //facing the control panel. 2 magnets (sensor actuators) are used //for main cylinder, 4 magnets for soil drawer, and 2 magnets are //are used for soil grate shaker. Copyright April 2010, Creative //Commons CC-BY-SA-compatible OSE License, by Marcin Jakubowski, //Ph.D., for OSE. This code and other documentation is available //at the Open+Pario project management site under the CEB Project, //under Documents - Liberator Beta 2.0 Control Code, //http://openpario.net/projects/OSE?
int val; int val2; unsigned long startcounter; unsigned long counter; unsigned long startcounter2; unsigned long counter2;
//0. Initialization.
void setup(){
Serial.begin(9600);
pinMode(19,INPUT);//Digital 19 is Analog 5.
pinMode(18,INPUT);//Digital 18 is Analog 4.
pinMode(3,OUTPUT);//Pins 3 and 5 are up and down motion,
pinMode(6,OUTPUT);//respectively.
pinMode(9,OUTPUT);//Pins 9 and 10 are right and left.
pinMode(10,OUTPUT);
counter=0;
counter2=0;
val=analogRead(5);//Read the sensor.\
val2=analogRead(4);
Serial.println("Main cylinder state:");
Serial.println(val);
Serial.println("Drawer cylinder state:");
Serial.println(val2);
//1. Move big cylinder down all way to identify bottom point (+).
while (val<500){
digitalWrite(3, LOW);//Move main cylinder down.
digitalWrite(6, HIGH);//Control solenoids in pairs to keep track.
val=analogRead(5);
Serial.println("moving down");
Serial.println(val);
// delay(500); }
digitalWrite(3, LOW);//Turn solenoids off. digitalWrite(6, LOW);
Serial.println("Waiting for approval..."); // delay(4000);
//2. Move drawer left - all way to brick ejection position.
val2=analogRead(4);
Serial.println("Drawer State reading:");
Serial.println(val2);
// Serial.println("Waiting 5 seconds for next step..."); // delay(5000);
while(val2 < 500){
digitalWrite(9, LOW);//Move left.
digitalWrite(10, HIGH);//Solenoids are controlled in pairs.
val2=analogRead(4);
Serial.println("Moving left");
Serial.println(val2);
//Need to keep reading state of sensor.
};//stop upon reaching left (magnet at LEFT induces + state)
digitalWrite(9, LOW);
digitalWrite(10, LOW);
val2=analogRead(4);
Serial.println("Finished left. Drawer state:");
Serial.println(val2);
// Serial.println("WAITING FOR APPROVAL..."); // delay(4000);
//3. Calibrate main cylinder/eject.
val=analogRead(5);
startcounter=millis();
while(val > 500){
digitalWrite(3, HIGH);//Start upward motion.
digitalWrite(6, LOW);
Serial.println("Time during motion (ms):");
Serial.println(millis()-startcounter);
val=analogRead(5);
};
digitalWrite(3, LOW);//stop motion
digitalWrite(6, LOW);
counter=millis()-startcounter;
Serial.println("Time after leaving loop:");
Serial.println(counter);
val=analogRead(5);
Serial.println("Finished calibrations. Main cylinder state:");
Serial.println(val);
Serial.println("Waiting for approval.");
// delay(40000);
//4. Calibrate drawer
val=analogRead(4);
startcounter2=millis();
while(val2 > 500){
digitalWrite(9, HIGH);//Start upward motion.
digitalWrite(10, LOW);
Serial.println("Time during motion (ms):");
Serial.println(millis()-startcounter2);
val2=analogRead(4);
};
// digitalWrite(9, LOW);//stop motion // digitalWrite(10, LOW);
counter2=millis()-startcounter2;
Serial.println("Time after leaving loop:");
Serial.println(counter2);
val=analogRead(4);
Serial.println("Finished calibration 2. Drawer cylinder state:");
Serial.println(val2);
//5. Continue moving for the calibrated duration // digitalWrite(9, HIGH); // digitalWrite(10, LOW);
delay(counter2);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
Serial.println("Moved into soil loading position.");
} //**************************** END OF INITIALIZATION
void loop(){
//8. Lower main cylinder.
val=analogRead(5);
Serial.println("Main cylinder state:");
Serial.println(val);
while(val < 500){;//Sensor is low at start.
digitalWrite(3, LOW);//Move main cylinder down.
digitalWrite(6, HIGH);//Control solenoids in pairs to keep track.
val=analogRead(5);
Serial.println("moving down");
Serial.println(val);
};//stop upon reaching bottom (magnet at bottom induces high state)
digitalWrite(3,LOW);
digitalWrite(6,LOW);
//9. Close compression chamber. Needs timing.
digitalWrite(9, LOW);//Move left.
digitalWrite(10, HIGH);//Solenoids are controlled in pairs.
Serial.println("Moving left");
delay(counter2*.84);//.75 is the exact factor
digitalWrite(9, LOW);//Stopping by timing only.
digitalWrite(10, LOW);
Serial.println("Finished left. Drawer state:");
Serial.println(val2);
//10. Begin pressing cycle with main cylinder, and then release
// pressure by moving 1/2 sec down.
digitalWrite(3, HIGH);// Start cycle, and time motion.
digitalWrite(6, LOW);// Start from bottom cylinder position.
delay (counter/2);//Go up half way. Time counted in milliseconds.
Serial.println("PRESSING...UP TO TIME OF (ms):");
Serial.println(counter/2);
digitalWrite(3, LOW);// Stop motion.
digitalWrite(6, LOW);
val=analogRead(5);
Serial.println("Main cylinder State:");
Serial.println(val);
//****************************************************** RELEASE CYCLE
digitalWrite(3, LOW);//Release, by time.
digitalWrite(6, HIGH);//
delay (counter/100);
Serial.println("Releasing...");
digitalWrite(3, LOW);// Stop motion.
digitalWrite(6, LOW);
val=analogRead(5);
Serial.println("State:");
Serial.println(val);
//11. Open compression chamber by moving drawer left.
val2=analogRead(4);
Serial.println("Drawer State reading:");
Serial.println(val2);
// Serial.println("Waiting 5 seconds for next step..."); // delay(5000);
while(val2 < 500){
digitalWrite(9, LOW);//Move left.
digitalWrite(10, HIGH);//Solenoids are controlled in pairs.
val2=analogRead(4);
Serial.println("Moving left");
Serial.println(val2);
//Need to keep reading state of sensor.
};//stop upon reaching left (magnet at LEFT induces + state)
digitalWrite(9, LOW);
digitalWrite(10, LOW);
val2=analogRead(4);
Serial.println("Finished left. Drawer state:");
Serial.println(val2);
//12. Push brick up.
val=analogRead(5);
while (val > 500){;//Complete motion up to sensor.
digitalWrite(3, HIGH);//Complete up motion.
digitalWrite(6, LOW);
val=analogRead(5);
Serial.println("Pushing brick up...");
Serial.println("Main cylinder State:");
Serial.println(val);
}
digitalWrite(3, LOW);
digitalWrite(6, LOW);
//13. Eject brick from machine by moving drawer to the right.
val=analogRead(4);
startcounter2=millis();
while(val2 > 500){
digitalWrite(9, HIGH);//Start upward motion.
digitalWrite(10, LOW);
Serial.println("Time during motion (ms):");
Serial.println(millis()-startcounter2);
val2=analogRead(4);
};
// digitalWrite(9, LOW);//stop motion // digitalWrite(10, LOW);
counter2=millis()-startcounter2;
Serial.println("Time after leaving loop:");
Serial.println(counter2);
val=analogRead(4);
Serial.println("Finished calibration 2. Drawer cylinder state:");
Serial.println(val2);
//14. Continue moving for the calibrated duration (into loading pos.) // digitalWrite(9, HIGH); // digitalWrite(10, LOW);
delay(counter2);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
Serial.println("Moved into soil loading position.");
};