//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //CEB Testing Program //Written at Factor e Farm, July 2011 by William Neal - william.j.a.neal@gmail.com //This is a concept program designed to highlight and test the possibility of a Python-Based GUI control for the CEB Press //Please feel free to offer feedback and suggestions // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Interface from Python //Python sends a four character code - one letter and three digits //The letter tells the Arduino which mode to enter //The three digits offer additional detail for certain modes. int LetterCode = 0; // ASCII Code of Letter Being Sent int d0 = 0; //Hundreds Digit int d1 = 0; //Tens Digit int d2 = 0; //Ones Digit int Mode; int Configuration = 0; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Variable setup - Arduino pins for various functions int SensorPin0 = A0; int SensorPin1 = A1; int SensorPin2 = A2; int LedPin = 13; int SupplyPin = 12; int SensorValue0 = 0; int SensorValue1 = 0; int SensorValue2 = 0; //Assignment of pins for the PWM Solenoid drivers int pwm_a = 11; int pwm_b = 10; int pwm_c = 9; int pwm_d = 6; int pwm_e = 3; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Other Variables int i; //Tolerance: magenetinc tolerance level for the sensors. This may need to change, depending on the exact location of the sensors in relation to the magnets //and the value of the pull-up resistors being used. int Tolerance = 80; //Adjust this value to determine how long the Solenoid drivers are turned on. //60 seconds is recommended for rigorous testing; 1 second for a quick test. int Seconds = 1; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setup() { Serial.begin(9600); // opens serial port, sets data rate to 9600 bps pinMode(LedPin, OUTPUT); pinMode(SupplyPin, OUTPUT); pinMode(SensorPin0, INPUT); pinMode(SensorPin1, INPUT); pinMode(SensorPin2, INPUT); digitalWrite(SupplyPin, HIGH); } void loop() { // This code receives the four characters from Python: if (Serial.available() > 0) { // read the incoming byte: LetterCode = Serial.read(); } if (Serial.available() > 0) { d0 = Serial.read(); } if (Serial.available() > 0) { d1 = Serial.read(); } if (Serial.available() > 0) { d2 = Serial.read(); } Serial.flush(); //This prints the received letters for testing purposes Serial.println(LetterCode); Serial.println(d0); Serial.println(d1); Serial.println(d2); //Here, we decide on the Mode based on the received LetterCode switch (LetterCode){ case 65: //In case it's an A, run the Blink program Serial.println("Blink"); Mode = 1; break; case 66: //In case it's a B, setup the sensors for testing Serial.println("Sensor"); Mode = 2; break; case 67: //In case it's a C, cycle the Mosfets through a test. Serial.println("Mosfets"); Serial.println(d2); Mode = 3; //Subtract 48 from the received character to obtain a digit from 0 to 9: //The configuration determines the nature of the test. Configuration = d2-48; } switch(Mode){ case 1: pinMode(13, OUTPUT); digitalWrite(13, HIGH); // set the LED on delay(1000); // wait for a second digitalWrite(13, LOW); // set the LED off delay(1000); // wait for a second case 2: // Read the value from the 3 sensors: SensorValue0 = analogRead(SensorPin0); Serial.println (SensorValue0, DEC); SensorValue1 = analogRead(SensorPin1); Serial.println (SensorValue1, DEC); SensorValue2 = analogRead(SensorPin2); Serial.println (SensorValue2, DEC); // Turn the ledPins on or off depending on the reading of each sensor if(SensorValue0 > Tolerance){ digitalWrite(13, HIGH); } if(SensorValue0 < Tolerance){ digitalWrite(13, LOW); } if(SensorValue1 > Tolerance){ digitalWrite(12, HIGH); } if(SensorValue1 < Tolerance){ digitalWrite(12, LOW); } if(SensorValue2 > Tolerance){ digitalWrite(11, HIGH); } if(SensorValue2 < Tolerance){ digitalWrite(11, LOW); } delay(10); case 3: Serial.println("Testing:"); Serial.println(Configuration); // Set all channels to 0 as a precaution - it is important that opposite solenoids are not simultaneously engaged //It is also important that both cylinders do not engage at the same time so as to cause internal damage to the machine analogWrite(pwm_a, 0); analogWrite(pwm_b, 0); analogWrite(pwm_c, 0); analogWrite(pwm_d, 0); analogWrite(pwm_e, 0); switch(Configuration){ case 0: break; case 1: test_channel(pwm_a); break; case 2: test_channel(pwm_b); break; case 3: test_channel(pwm_c); break; case 4: test_channel(pwm_d); break; case 5: test_channel(pwm_e); break; Configuration = 0; Mode = 0; LetterCode = 0; } break; } } void test_channel(int channel) //This code engages a channel according to the time alloted to the variable 'Seconds' { Serial.print("Testing PWM channel "); Serial.println(channel); analogWrite(channel, 255); Serial.println("PWM channel at max."); for(int i=0; i