CEB Control Code: Difference between revisions

From Open Source Ecology
Jump to navigation Jump to search
No edit summary
No edit summary
Line 14: Line 14:
//http://openpario.net/projects/OSE?
//http://openpario.net/projects/OSE?


=Code=
=Code - Liberator Beta v2.0=
int val3;
//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(){
void setup(){
   Serial.begin(9600);  
   Serial.begin(9600);
   pinMode(17,INPUT);//Digital 17 is Analog 3
   pinMode(19,INPUT);//Digital 19 is Analog 5.
   pinMode(11, OUTPUT);
  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(){
void loop(){
   val3=analogRead(3);//read Hall effect sensor
 
   Serial.println(val3);
//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);
    
    
   if(val3>500){
//12. Push brick up.
     digitalWrite(11, HIGH);
 
   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); 
   }
   }
   else{
    
     digitalWrite(11, LOW);}
  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.");
};
 
 




[[Category:Code]][[Category:CEB Control Code]]
[[Category:Code]][[Category:CEB Control Code]]

Revision as of 16:57, 22 April 2010

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.");

};