#include <Servo.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(A0,A1);
Servo myservoA;
Servo myservoB;
Servo myservoC;
Servo myservoD;
String readString;
const int ledPin = 13;
char unChar;
///-------------------------------
const int s0 = 2; ///ต่อ 2
const int s1 = 3;///ต่อ 3
const int s2 = 4;///ต่อ 4
const int s3 = 5;///ต่อ 5
const int nLED = 6; // LED///ต่อ 6
const int out = 7; // TCS230 output///ต่อ 7
int red = 0;//ตัวแปร สี แดง
int green = 0;//ตัวแปร สี เขียว
int blue = 0;//ตัวแปร สี น้ำเงิน
////-----------------------------
int posA=100;
int posB=100;
int posC=100;
int posD=100;
int posSA1[50];
int posSB1[50];
int posSC1[50];
int posSD1[50];
//------------------
int posSA2[50];
int posSB2[50];
int posSC2[50];
int posSD2[50];
//------------------
int posSA3[50];
int posSB3[50];
int posSC3[50];
int posSD3[50];
//----------------
int Step=0;
int Start=0;
int Max=0;
int DL=100;
int pro=1;
int co=1;///สี
void setup()
{
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(nLED, OUTPUT);
pinMode(out, INPUT);
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
digitalWrite(nLED, LOW);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
Serial.begin(57600);
while (!Serial)
{
}
Serial.println("TF-robot");
Serial.println("พร้อมทำงาน");
myservoA.attach(8);
myservoA.write(posA);
myservoB.attach(9);
myservoB.write(posB);
myservoC.attach(10);
myservoC.write(posC);
myservoD.attach(11);
myservoD.write(posD);
mySerial.begin(9600);
mySerial.println("");
}
void loop()
{
if (mySerial.available())
{
unChar = mySerial.read();
Serial.println(unChar);
if(unChar=='A'&&posB<=140)
{
posB=posB+1;
myservoB.write(posB);
Serial.println(posB);
delay(50);
}
if(unChar=='B'&&posB>=70)
{
posB=posB-1;
myservoB.write(posB);
Serial.println(posB);
delay(50);
}
if(unChar=='C'&&posA<=170)
{
posA=posA+1;
myservoA.write(posA);
Serial.println(posA);
delay(50);
}
if(unChar=='D'&&posA>=10)
{
posA=posA-1;
myservoA.write(posA);
Serial.println(posA);
delay(50);
}
if(unChar=='F'&&posC>=70)
{
posC=posC-1;
myservoC.write(posC);
Serial.println(posC);
delay(50);
}
if(unChar=='E'&&posC<=150)
{
posC=posC+1;
myservoC.write(posC);
Serial.println(posC);
delay(50);
}
if(unChar=='N'&&posD>=85)
{
posD=posD-1;
myservoD.write(posD);
Serial.println(posD);
delay(50);
}
if(unChar=='M'&&posD<=140)
{
posD=posD+1;
myservoD.write(posD);
Serial.println(posD);
delay(50);
}
/////////////////////////////////////////////////////////////
if(unChar=='I')//สามเหลี่ยม
{
Serial.println("I");
digitalWrite(ledPin, LOW);
delay(1000);
digitalWrite(ledPin, HIGH);
Step=0;
Start=0; //หยุดออโต้
}
if(unChar=='J')//กากบาท
{
digitalWrite(ledPin, LOW);
delay(1000);
digitalWrite(ledPin, HIGH);
Serial.println("J"); //หยุดออโต้
Step=0;
Start=0;
}
/////////////////////////////////////////////////////
if(unChar=='K')//สี่เหลี่ยม
{
digitalWrite(ledPin, LOW);
delay(1000);
digitalWrite(ledPin, HIGH);
Serial.println("K");
Step=0;
Start=1; //เริ่ม auto
}
////////////////////////////////////////////////////////
if(unChar=='L')//วงกลม
{
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
Serial.println("L");
Save();//บันทึก
}
///////////////////////////////////////////////////////////
if(unChar=='G')//selec
{
if(pro==3)
{ digitalWrite(ledPin, LOW);
delay(1000);
digitalWrite(ledPin, HIGH);
Serial.println("L");
pro=1;
}
else if(pro==1)
{
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
Serial.println("L");
pro=2;
}
else if(pro==2)
{
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
Serial.println("L");
pro=3;
}
}
if(unChar=='H')//start
{
digitalWrite(ledPin, LOW);
delay(1000);
digitalWrite(ledPin, HIGH);
Serial.println("L");
Step=0;
Start=0;
Max=0;
DL=100;
pro=1;
color();
}
/////////////////////////////////////////////////////////////////
}
//////////////////////////////////////////
else if(Start==1)//ทำงานรัน
{
if(co==1)
{
runARM1();
}
else if(co==2)
{
runARM2();
}
else if(co==3)
{
runARM3();
}
}
//////-------------------------------------------------------
}//////////////////////ลูป
void Save()
{
if(pro==1)
{
posSA1[Step]=posA;
posSB1[Step]=posB;
posSC1[Step]=posC;
posSD1[Step]=posD;
Step++;
Max=Step;
Print();
}
else if(pro==2)
{
posSA2[Step]=posA;
posSB2[Step]=posB;
posSC2[Step]=posC;
posSD2[Step]=posD;
Step++;
Max=Step;
Print();
}
else if(pro==3)
{
posSA3[Step]=posA;
posSB3[Step]=posB;
posSC3[Step]=posC;
posSD3[Step]=posD;
Step++;
Max=Step;
Print();
}
}
//------------------------------
void runARM1()///pro1
{
if(Max==Step)///กรณีหยุด
{
//Start=0;
Step=0;
color();
}
else if(posA<posSA1[Step])
{
posA++;
myservoA.write(posA);
delay(DL);
}
else if(posA>posSA1[Step])
{
posA--;
myservoA.write(posA);
delay(DL);
}
else if(posB<posSB1[Step])
{
posB++;
myservoB.write(posB);
delay(DL);
}
else if(posB>posSB1[Step])
{
posB--;
myservoB.write(posB);
delay(DL);
}
else if(posC<posSC1[Step])
{
posC++;
myservoC.write(posC);
delay(DL);
}
else if(posC>posSC1[Step])
{
posC--;
myservoC.write(posC);
delay(DL);
}
else if(posD<posSD1[Step])
{
posD++;
myservoD.write(posD);
delay(DL);
}
else if(posD>posSD1[Step])
{
posD--;
myservoD.write(posD);
delay(DL);
}
else
{
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
Step++;
Print();
delay(1000);
}
}
//-----------------------------
void runARM2()///pro2
{
if(Max==Step)///กรณีหยุด
{
//Start=0;
Step=0;
color();
}
else if(posA<posSA2[Step])
{
posA++;
myservoA.write(posA);
delay(DL);
}
else if(posA>posSA2[Step])
{
posA--;
myservoA.write(posA);
delay(DL);
}
else if(posB<posSB2[Step])
{
posB++;
myservoB.write(posB);
delay(DL);
}
else if(posB>posSB2[Step])
{
posB--;
myservoB.write(posB);
delay(DL);
}
else if(posC<posSC2[Step])
{
posC++;
myservoC.write(posC);
delay(DL);
}
else if(posC>posSC2[Step])
{
posC--;
myservoC.write(posC);
delay(DL);
}
else if(posD<posSD2[Step])
{
posD++;
myservoD.write(posD);
delay(DL);
}
else if(posD>posSD2[Step])
{
posD--;
myservoD.write(posD);
delay(DL);
}
else
{
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
Step++;
Print();
delay(1000);
}
}
void runARM3()///pro3
{
if(Max==Step)///กรณีหยุด
{
//Start=0;
Step=0;
color();
}
else if(posA<posSA3[Step])
{
posA++;
myservoA.write(posA);
delay(DL);
}
else if(posA>posSA3[Step])
{
posA--;
myservoA.write(posA);
delay(DL);
}
else if(posB<posSB3[Step])
{
posB++;
myservoB.write(posB);
delay(DL);
}
else if(posB>posSB3[Step])
{
posB--;
myservoB.write(posB);
delay(DL);
}
else if(posC<posSC3[Step])
{
posC++;
myservoC.write(posC);
delay(DL);
}
else if(posC>posSC3[Step])
{
posC--;
myservoC.write(posC);
delay(DL);
}
else if(posD<posSD3[Step])
{
posD++;
myservoD.write(posD);
delay(DL);
}
else if(posD>posSD3[Step])
{
posD--;
myservoD.write(posD);
delay(DL);
}
else
{
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
Step++;
Print();
delay(1000);
}
}
void Print()
{
Serial.print("step= ");
Serial.print(Step);
Serial.print(" P_A= ");
Serial.print(posA);
Serial.print(" P_B= ");
Serial.print(posB);
Serial.print(" P_C= ");
Serial.print(posC);
Serial.print(" P_D= ");
Serial.print(posD);
Serial.println();
}
void color()
{
digitalWrite(nLED,HIGH);
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
// count OUT, pRed, RED
red = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
digitalWrite(s3, HIGH);
//count OUT, pBLUE, BLUE
blue = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
digitalWrite(s2, HIGH);
// count OUT, pGreen, GREEN
green = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
digitalWrite(nLED,0);
if (red < blue && red < green)
{
Serial.println("Red");
co=1;
}
else if (blue < red && blue < green)
{
Serial.println("blue");
co=2;
}
else
{
Serial.println("green");
co=3;
}
}