Skittle Sorter Running Code.
Dependencies: Motor Servo mbed
main.cpp
- Committer:
- raj1995
- Date:
- 2016-04-29
- Revision:
- 0:2df76cd30860
File content as of revision 0:2df76cd30860:
#include <math.h>
#include <stdio.h>
#include "mbed.h"
#define commonAnode true
#include <algorithm>
#include "Servo.h"
//Color Sensor
I2C i2c(p9, p10); //pins for I2C communication (SDA, SCL)
int sensor_addr = 41 << 1;
DigitalOut led(p11);
//IR
Serial pc(USBTX, USBRX);
Serial device(p13, p14); // tx, rx
PwmOut IRLED(p21);
//Solenoid
DigitalOut Ctrl(p8); //Solenoid output control bit
//Motor A
PwmOut speedA(p23); // PWM Speed pin for Motor A
DigitalOut fwdA(p17); // Digital out signal for forward direction for Motor A
DigitalOut revA(p18); // Digital out signal for reverse direction for Motor A
//MotorB
PwmOut speedB(p24); // PWM Speed pin for Motor B
DigitalOut fwdB(p20); // Digital out signal for forward direction for Motor B
DigitalOut revB(p19); // Digital out signal for reverse direction for Motor B
//Bottom Encoder
DigitalIn Enc1(p16); //right motor
int oldEnc1 = 0; //Was the encoder previously a 1 or zero?
int ticks = 0;
int ticksPrime = 0;
int dist2move = 0;
//Top Encoder
DigitalIn Enc2(p15); //right motor
int oldEnc2 = 0; //Was the encoder previously a 1 or zero?
int ticks2 = 0;
//Servo
Servo servo(p25);
//Prototypes (headers)
void irSetup();
void colorSensorSetup();
int readColor();
int readIR();
void solOn();
void solOff();
void motorA(int);
void motorB(int);
void encCount(int);
void encCount2(int);
void moveBottom(int);
void moveTop(int);
void pulseBack(int);
int redpos = 0;
int greenpos = 0;
int yellowpos = 0;
int purplepos = 0;
int randompos = 0;
int turnAmount = 75;
int greenList[5] = {0,turnAmount*1,turnAmount*2,turnAmount*3,turnAmount*4+10};
int redList[5] = {0,turnAmount*1,turnAmount*2,turnAmount*3,turnAmount*4+10};
int yellowList[5] = {0,turnAmount*1,turnAmount*2,turnAmount*3,turnAmount*4+10};
int purpleList[5] = {0,turnAmount*1,turnAmount*2,turnAmount*3,turnAmount*4+10};
int garbageList[5] = {0,turnAmount*1,turnAmount*2,turnAmount*3,turnAmount*4+10};
int currentColor = 4;
int counter = 0;
int main() {
//Color Sensor setup
colorSensorSetup();
//Bottom Encoder setup
Enc1.mode(PullUp); // requires a pullup resistor so i just used embed's feature.
//Top Encoder setup
Enc2.mode(PullUp); // requires a pullup resistor so i just used embed's feature.
servo = 0.05;
bool succ = true;
double servoClosed = -0.05;
while(1) {
//pc.printf("%d\r\n",ticks);
/*
readColor();
wait(1);
motorA(1);
wait(1);
motorA(0);
wait(1);
motorB(-1);
wait(1);
motorB(0);
wait(1);
motorB(1);
wait(1);
motorB(0);
wait(1);
*/
/*
motorA(1);
if (readIR == 1){
motorA(0);
solOn();
wait(1);
int color = readColor();
if (color == 0){
}else if (color == 1){
}else if (color == 2){
}else if (color == 3){
}else{
}
solOff();
wait(0.5);
}
*/
/*
motorB(1);
encCount(1);
if (ticks==1000){
motorB(0);
break;
}
motorA(1);
*/
//succ = false;
if (succ){
moveTop(94);
succ = false;
wait(0.5);
}
encCount2(1);
//pc.printf("%d\r\n",ticks2);
wait(0.8);
int nextColor = readColor();
//pc.printf("%d,%d\n\r",currentColor,nextColor);
switch (currentColor){
case 0:
switch (nextColor){
case 0:
moveBottom(greenList[0]);
servo = 0.4;
wait(1);
servo = servoClosed;
break;
case 1:
moveBottom(greenList[1]);
servo = 0.4;
wait(1);
servo = servoClosed;
counter++;
break;
case 2:
moveBottom(greenList[2]);
servo = 0.4;
wait(1);
servo = servoClosed;
counter++;
break;
case 3:
moveBottom(greenList[3]);
servo = 0.4;
wait(1);
servo = servoClosed;
counter++;
break;
case 4:
moveBottom(greenList[4]);
servo = servoClosed;
counter++;
break;
}
break;
case 1:
switch (nextColor){
case 0:
moveBottom(redList[4]);
servo = 0.4;
wait(1);
servo = 0.05;
counter++;
break;
case 1:
moveBottom(redList[0]);
servo = 0.4;
wait(1);
servo = servoClosed;
break;
case 2:
moveBottom(redList[1]);
servo = 0.4;
wait(1);
servo = servoClosed;
counter++;
break;
case 3:
moveBottom(redList[2]);
servo = 0.4;
wait(1);
servo = servoClosed;
counter++;
break;
case 4:
moveBottom(redList[3]);
servo = servoClosed;
counter++;
break;
}
break;
case 2:
switch (nextColor){
case 0:
moveBottom(yellowList[3]);
servo = 0.4;
wait(1);
servo = servoClosed;
counter++;
break;
case 1:
moveBottom(yellowList[4]);
servo = 0.4;
wait(1);
servo = servoClosed;
counter++;
break;
case 2:
moveBottom(yellowList[0]);
servo = 0.4;
wait(1);
servo = servoClosed;
break;
case 3:
moveBottom(yellowList[1]);
servo = 0.4;
wait(1);
servo = servoClosed;
counter++;
break;
case 4:
moveBottom(yellowList[2]);
servo = servoClosed;
counter++;
break;
}
break;
case 3:
switch (nextColor){
case 0:
moveBottom(purpleList[2]);
servo = 0.4;
wait(1);
servo = servoClosed;
counter++;
break;
case 1:
moveBottom(purpleList[3]);
servo = 0.4;
wait(1);
servo = servoClosed;
counter++;
break;
case 2:
moveBottom(purpleList[4]);
servo = 0.4;
wait(1);
servo = servoClosed;
counter++;
break;
case 3:
moveBottom(purpleList[0]);
servo = 0.4;
wait(1);
servo = servoClosed;
break;
case 4:
moveBottom(purpleList[1]);
servo = servoClosed;
counter++;
break;
}
break;
case 4:
switch (nextColor){
case 0:
ticksPrime = ticks;
dist2move = nextColor*75;
moveBottom(garbageList[1]);
servo = 0.4;
wait(1);
servo = servoClosed;
if(ticks <= ticksPrime + dist2move){
succ = true;
}
counter++;
break;
case 1:
ticksPrime = ticks;
dist2move = nextColor*75;
moveBottom(garbageList[2]);
servo = 0.4;
wait(1);
servo = servoClosed;
if(ticks <= ticksPrime + dist2move){
succ = true;
}
counter++;
break;
case 2:
ticksPrime = ticks;
dist2move = nextColor*75;
moveBottom(garbageList[3]);
servo = 0.4;
wait(1);
servo = servoClosed;
if(ticks <= ticksPrime + dist2move){
succ = true;
}
counter++;
break;
case 3:
ticksPrime = ticks;
dist2move = nextColor*75;
moveBottom(garbageList[4]);
servo = 0.4;
wait(1);
servo = servoClosed;
if(ticks <= ticksPrime + dist2move){
succ = true;
}
counter++;
break;
case 4:
ticksPrime = ticks;
dist2move = nextColor*75;
moveBottom(garbageList[0]);
servo = servoClosed;
if(ticks <= ticksPrime + dist2move){
succ = true;
}
break;
}
break;
}
encCount(1);
currentColor = nextColor;
if (counter==4){
pulseBack(16);
counter = 0;
pc.printf("%d\r\n",counter);
}
}
}
int readColor(){
// Initialize color sensor
char clear_reg[1] = {148};
char clear_data[2] = {0,0};
i2c.write(sensor_addr,clear_reg,1, true);
i2c.read(sensor_addr,clear_data,2, false);
int clear_value = ((int)clear_data[1] << 8) | clear_data[0];
char red_reg[1] = {150};
char red_data[2] = {0,0};
i2c.write(sensor_addr,red_reg,1, true);
i2c.read(sensor_addr,red_data,2, false);
int red_value = ((int)red_data[1] << 8) | red_data[0];
char green_reg[1] = {152};
char green_data[2] = {0,0};
i2c.write(sensor_addr,green_reg,1, true);
i2c.read(sensor_addr,green_data,2, false);
int green_value = ((int)green_data[1] << 8) | green_data[0];
char blue_reg[1] = {154};
char blue_data[2] = {0,0};
i2c.write(sensor_addr,blue_reg,1, true);
i2c.read(sensor_addr,blue_data,2, false);
int blue_value = ((int)blue_data[1] << 8) | blue_data[0];
// print sensor readings
//pc.printf("Clear (%d), Red (%d), Green (%d), Blue (%d)\n\r", clear_value, red_value, green_value, blue_value);
//pc.printf("Red (%d), Green (%d), Blue (%d)\n\r", red_value, green_value, blue_value);
float red_in = (float)red_value;
float green_in = (float)green_value;
float blue_in = (float)blue_value;
float redSkittle[] = {4656.25,588.25,826};
float greenSkittle[] = {2968.25,3898.5,1346.5};
float yellowSkittle[] = {15387.75,9977.5,3173.75};
//float purpleSkittle[] = {1088,342.25,340.5};
float purpleSkittle[] = {1215,1773,2541};
float closed[] = {1094, 1149, 987};
float distRed = sqrt(pow(red_in-redSkittle[0],2)+pow(green_in-redSkittle[1],2)+pow(blue_in-redSkittle[2],2));
float distGreen = sqrt(pow(red_in-greenSkittle[0],2)+pow(green_in-greenSkittle[1],2)+pow(blue_in-greenSkittle[2],2));
float distYellow = sqrt(pow(red_in-yellowSkittle[0],2)+pow(green_in-yellowSkittle[1],2)+pow(blue_in-yellowSkittle[2],2));
float distPurple = sqrt(pow(red_in-purpleSkittle[0],2)+pow(green_in-purpleSkittle[1],2)+pow(blue_in-purpleSkittle[2],2));
float distClosed = sqrt(pow(red_in-closed[0],2)+pow(green_in-closed[1],2)+pow(blue_in-closed[2],2));
float choices[] = {distRed, distGreen, distYellow, distPurple, distClosed};
sort(choices,choices+5);
float closest = choices[0];
if (closest==distRed){
//pc.printf("Red\n\r");
return 1;
}else if(closest==distGreen){
//pc.printf("Green\n\r");
return 0;
}else if(closest==distYellow){
//pc.printf("Yellow\n\r");
return 2;
}else if(closest==distPurple){
//pc.printf("Purple\n\r");
return 3;
}else //pc.printf("Dave messed up.\n\r");
return 4;
}
int readIR(){
if(pc.readable()) {
device.putc(pc.getc());
}
//IR Receive code
if(device.readable()) {
pc.putc(device.getc());
}
return 1;
}
void solOn(){
Ctrl = 1; //ON
}
void solOff(){
Ctrl = 0; //ON
}
void motorA(int state){
fwdA = 1;
revA = 0;
speedA = (float)state*0.15;
}
void motorB(int dir){
if (dir > 0){
fwdB = 1;
revB = 0;
}else{
fwdB = 0;
revB = 1;
dir = -dir;
}
speedB = (float)dir*.3;
}
void pulseBack(int dir) {
//int newticks = ticks - dir;
motorB(1);
/*
while (ticks > newticks){
encCount(-1);
//pc.printf("%d,%d\n\r",newticks,ticks2);
}
*/
wait(0.1);
motorB(0);
return;
}
void irSetup(){
//IR Transmit setup code
IRLED.period(1.0/38000.0);
IRLED = 0.5;
//Drive IR LED data pin with 38Khz PWM Carrier
//Drive IR LED gnd pin with serial TX
device.baud(2400);
}
void colorSensorSetup(){
pc.baud(9600);
led = 1; // off
// Connect to the Color sensor and verify whether we connected to the correct sensor.
i2c.frequency(200000);
char id_regval[1] = {146};
char data[1] = {0};
i2c.write(sensor_addr,id_regval,1, true);
i2c.read(sensor_addr,data,1,false);
if (data[0]==68) {
//green = 0;
wait (2);
//green = 1;
} else {
//green = 1;
}
char timing_register[2] = {129,0};
i2c.write(sensor_addr,timing_register,2,false);
char control_register[2] = {143,0};
i2c.write(sensor_addr,control_register,2,false);
char enable_register[2] = {128,3};
i2c.write(sensor_addr,enable_register,2,false);
}
void encCount(int dir){
if(Enc1 != oldEnc1) { // Increment ticks every time the state has switched.
if (dir>0) ticks++;
else ticks--;
oldEnc1 = Enc1;
//pc.printf("%d\r\n",ticks);
}
}
void encCount2(int dir){
if(Enc2 != oldEnc2) { // Increment ticks every time the state has switched.
if (dir>0) ticks2++;
else ticks2--;
oldEnc2 = Enc2;
//pc.printf("%d\r\n",ticks2);
}
}
void moveBottom(int amt){
int newticks = ticks + amt;
motorB(-1);
while (ticks < newticks-5){
encCount(1);
//pc.printf("%d,%d\n\r",newticks,ticks);
}
motorB(0);
return;
}
void moveTop(int amt){
int newticks = ticks2 + amt;
motorA(1);
while (ticks2 < newticks-5){
encCount2(1);
//pc.printf("%d,%d\n\r",newticks,ticks2);
}
motorA(0);
return;
}