And here is the video and code of last version of project.
In here I'm using stepper as a servo, first 45 degree, than another 45 degree, finaly 90 degree back. It still has little errors but when it go opposite direction, fixing little error.
Sorry about my english btw.
Video:http://tinypic.com/player.php?v=250nux2>&s=8#.U3OFY_l_tZ5
Code:
//Boran KARADUMAN Color Sorter Project
//**************************************** LIBRARIES ***************************************
#include <Average.h> // See http://playground.arduino.cc/Main/Average
#include <Servo.h>
#include <Stepper.h>
//************************************ GLOBAL VARIABLES ************************************
//Sensor variables
int S0=1,S1=7,S2=6,S3=5, LED=4;
int OUT=2;
//Servo and stepper Variables
Servo servo360;
int cpos=0;
int abc;
int check1=0;
int check2 ;
int check3;
const int pwmA = 3;
const int pwmB = 11;
const int brakeA = 9;
const int brakeB = 8;
const int dirA = 12;
const int dirB = 13;
const int STEPS = 25; // 360 / stepAngle
// Initialize the Stepper class
Stepper myStepper(STEPS, dirA, dirB);
void setup() {
Serial.begin(9600);
TCS3200_Setup();
servo360.attach(10);
delay(100);
myStepper.setSpeed(300);
// Turn on pulse width modulation
pinMode(pwmA, OUTPUT);
digitalWrite(pwmA, HIGH);
pinMode(pwmB, OUTPUT);
digitalWrite(pwmB, HIGH);
// Turn off the brakes
pinMode(brakeA, OUTPUT);
digitalWrite(brakeA, LOW);
pinMode(brakeB, OUTPUT);
digitalWrite(brakeB, LOW);
}
void loop() {
Serial.println(check1);
Serial.println(check2);
Serial.println(check3);
myStepper.step(STEPS);
delay(250);
Serial.println(ReadColor());
servoDrive(abc);
delay(500);
myStepper.step(STEPS);
delay(125);
myStepper.step(-STEPS*2);
delay(500);
}
void TCS3200_Setup() {
pinMode(S0,OUTPUT);
pinMode(S1,OUTPUT);
pinMode(S2,OUTPUT);
pinMode(S3,OUTPUT);
pinMode(LED,OUTPUT);
pinMode(OUT,INPUT);
}
void TCS3200_On() {
digitalWrite(LED,HIGH); // Switch LED on
digitalWrite(S0,HIGH); //Output frequency scaling (100%)
digitalWrite(S1,HIGH);
delay(5);
}
void TCS3200_Off() {
digitalWrite(LED,LOW); // Switch LED off
digitalWrite(S0,LOW); //Power off sensor
digitalWrite(S1,LOW);
}
void NoFilter() { //Select no filter
digitalWrite(S2,HIGH);
digitalWrite(S3,LOW);
delay(5);
}
void RedFilter() { //Select red filter
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
delay(5);
}
void GreenFilter() { //Select green filter
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
delay(5);
}
void BlueFilter() { //Select blue filter
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
delay(5);
}
char* ReadColor() { //0=white, 1=orange, 2=yellow, 3=red, 4=green, 5=blue, 6=object out of range
float FrequencyClear,FrequencyRed,FrequencyGreen,FrequencyBlue;
int PercentageRed,PercentageGreen,PercentageBlue;
TCS3200_On();
NoFilter();
FrequencyClear=500.0/pulseIn(OUT,LOW,10000); // Frequency in kHz
RedFilter();
FrequencyRed=500.0/pulseIn(OUT,LOW,10000); // Frequency in kHz
GreenFilter();
FrequencyGreen=500.0/pulseIn(OUT,LOW,10000); // Frequency in kHz
BlueFilter();
FrequencyBlue=500.0/pulseIn(OUT,LOW,10000); // Frequency in kHz
TCS3200_Off();
//Output frequency blue, green, red percentage represents the ratio of the
//respective color to the Clear channel absolute value:
PercentageRed=int((FrequencyRed/FrequencyClear)*100.0);
PercentageGreen=int((FrequencyGreen/FrequencyClear)*100.0);
PercentageBlue=int((FrequencyBlue/FrequencyClear)*100.0);
check1=PercentageRed;
check2=PercentageGreen;
check3=PercentageBlue;
//Learned blue, green, red percentage values of different colors
int SavedColorRed[] = {42,50,30,20};
int SavedColorGreen[] = {36,20,45,26};
int SavedColorBlue[] = {16,25,28,40};
char* GetColor[] = {"yellow","red","green","blue",""};
int ColorArray[3];
int i_color;
int ClosestColor;
int MaxDiff;
int MinDiff=300;
if(FrequencyClear<1.5)ClosestColor=4; // Object out of range
else {
for (i_color=0; i_color<4; i_color++) { //Find closest color
ColorArray[0]=abs(SavedColorRed[i_color]-PercentageRed);
ColorArray[1]=abs(SavedColorGreen[i_color]-PercentageGreen);
ColorArray[2]=abs(SavedColorBlue[i_color]-PercentageBlue);
MaxDiff=maximum(ColorArray,3);
if (MaxDiff<MinDiff) {
MinDiff=MaxDiff;
ClosestColor=i_color;
abc=i_color;
}
}
}
return GetColor[ClosestColor];
}
void servoDrive(int curr){
switch(curr){
case 1:
servo360.write(72);
break;
case 2:
servo360.write(87);
break;
case 0:
servo360.write(108);
break;
case 3:
servo360.write(130);
break;
default: ;}
}
Btw why moderators moved this topic also project guidience. I think my problem is about fixing stepper's steps accuracy with programing.