Lab 8 การแทร็กเส้น V.2

สำหรับบอร์ด Zack Robot nano shield

การใช้งาน

- แทกเส้นเจอ ดำ-ดำ หยุด ----- P();

- เลี้ยวซ้าย ---------------------- L();

- เลี้ยวขวา ---------------------- R();

Arduino IDE Nano

///////// ผนวกไลบรารี่ ////////////

#include <Wire.h>

#include <SPI.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 OLED(-1);

///////////ตั้งค่าปุ่มกด///////////////////

int button = 2; /// กำหนดปุ่มกดสวิตซ์ขา 2

//////////////////////////////////////////////

////////////ตั้งค่าพอร์ตมอเตอร์////////////////////

#define DR1 7 /// กำหนดสัญญาณดิจิตอลขวาที่ 1 พอร์ต 7

#define DR2 8 /// กำหนดสัญญาณดิจิตอลขวาที่ 2 พอร์ต 8

#define PWMR 6 /// กำหนดสัญญาณ PWM ขวาพอร์ต 6

/////////////////////////////////

#define DL1 9 // กำหนดสัญญาณดิจิตอลซ้ายที่ 1 พอร์ต 9

#define DL2 4 // กำหนดสัญญาณดิจิตอลซ้ายที่ 2 พอร์ต 4

#define PWML 5 /// กำหนดสัญญาณ PWM ซ้ายพอร์ต 5

/////////////////ตั้งค่าพอร์ต Analog//////////////

#define A0 252 // ค่ากลางเซนเซอร์ A0 (ซ้ายสุด)

#define A1 356 // ค่ากลางเซนเซอร์ A1 (ซ้ายกลาง)

#define A2 379 // ค่ากลางเซนเซอร์ A2 (ขวากลาง)

#define A3 223 // ค่ากลางเซนเซอร์ A3 (ขวาสุด)

///////////////////////////////////////////////

int s0 ;

int s1 ;

int s2 ;

int s3 ;

void analogs()

{

s0 = analogRead(0);

s1 = analogRead(1);

s2 = analogRead(2);

s3 = analogRead(3);

}

//////////////////////////////////////////////

void setup() {

OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C); // กำหนดแอดเดรสของพอร์ตจอเป็น 0x3C (for the 128x64)

pinMode(2, INPUT); // ตั้งค่าขา 2 เป็น INPUT

////////กำหนดสัญญาณทุกขาเป็น OUTPUT /////////

pinMode(DL1, OUTPUT);

pinMode(DL2, OUTPUT);

pinMode(PWML, OUTPUT);

pinMode(DR1, OUTPUT);

pinMode(DR2, OUTPUT);

pinMode(PWMR, OUTPUT);

}


void loop() {

int sw = digitalRead(button); // ให้ sw อ่านค่า digital จากพอร์ต 2(button)

int nob = analogRead(7); // ให้ nob เทียบเท่าค่า A7

int menu = map(nob, 0, 1023, 0, 12); // เทียบอัตราส่วนของพอร์ต A7 จาก 0-1023 เพื่อทำเป็นเมนู 0-12

OLED.clearDisplay(); // ล้างค่าหน้าจอ

OLED.setTextColor(WHITE, BLACK); //สีอักษรเป็นสีขาว ,พื้นหลังดำ

OLED.setCursor(0, 0); // เซตตำแหน่ง 0,0

OLED.setTextSize(2); // เซตขนาดอักษรมีขนาดเป็น 2

OLED.print(" "); // วรรค

OLED.println(menu); // แสดงค่า Menu ที่ได้จากการ map nob ให้เหลือ 0-12

OLED.setTextSize(1); // เซตขนาดอักษรมีขนาดเป็น 2

OLED.println(" KLS ROBOT CENTER"); // พิมพ์คำว่า KLS ROBOT CENTER

OLED.print(" "); // วรรค

OLED.print(nob); // แสดงค่าที่อ่านได้จาก nob หรือ Analog7

OLED.println(" www.kls.ac.th"); // พิมพ์คำว่า www.kls.ac.th

OLED.display();

if ((sw == 0) and (menu == 0))

{ sensor();

}

if ((sw == 0) and (menu == 1))

{

menu1();

}

if ((sw == 0) and (menu == 2))

{

menu2();

}

if ((sw == 0) and (menu == 3))

{

menu3();

}

if ((sw == 0) and (menu == 4))

{

menu4();

}

if ((sw == 0) and (menu == 5))

{

menu5();

}

if ((sw == 0) and (menu == 6))

{

menu6();

}

if ((sw == 0) and (menu == 7))

{

menu7();

}

if ((sw == 0) and (menu == 8))

{

menu8();

}

if ((sw == 0) and (menu == 9))

{

menu9();

}

if ((sw == 0) and (menu == 10))

{

menu10();

}

if ((sw == 0) and (menu == 11))

{

menu11();

}

if ((sw == 0) and (menu == 12))

{

menu12();

}

delay(100);

}

void sensor()

{

while (true) {

analogs();

OLED.clearDisplay();

OLED.setTextColor(WHITE, BLACK); //สีอักษรเป็นสีขาว ,พื้นหลังดำ

OLED.setCursor(0, 0); // เซตตำแหน่ง 0,0

OLED.setTextSize(1); // เซตขนาดอักษรมีขนาดเป็น 1

OLED.print(" S0 = "); OLED.println(s0); // แสดงค่าเซนเซอร์ S0

OLED.print(" S1 = "); OLED.println(s1); // แสดงค่าเซนเซอร์ S1

OLED.print(" S2 = "); OLED.println(s2); // แสดงค่าเซนเซอร์ S2

OLED.print(" S3 = "); OLED.println(s3); // แสดงค่าเซนเซอร์ S3

OLED.display();

delay(50);

}

}


///////////////////////เจอดำหยุด////////////////////////////////////////////

/////////////////////////เลี้ยวซ้าย///////////////////////////////////////////

void L0(){while (1){analogs();run(-75,75);if(s0<A0){run(0,0);break;}}} //S0

void L1(){while (1){analogs();run(-75,75);if(s1<A1){run(0,0);break;}}} //S1

void L2(){while (1){analogs();run(-75,75);if(s2<A2){run(0,0);break;}}} //S2

void L3(){while (1){analogs();run(-75,75);if(s3<A3){run(0,0);break;}}} //S3

//////////////////////เลี้ยวขวา//////////////////////////////////////////

void R0(){while (1){analogs();run(75,-75);if(s0<A0){run(0,0);break;}}} //S0

void R1(){while (1){analogs();run(75,-75);if(s1<A1){run(0,0);break;}}} //S1

void R2(){while (1){analogs();run(75,-75);if(s2<A2){run(0,0);break;}}} //S2

void R3(){while (1){analogs();run(75,-75);if(s3<A3){run(0,0);break;}}} //S3


/////////////////////////////////////////////////////////////////////

/////////////////////////ฟังก์ชันเส้นทาง////////////////////////////////////////

/////////////////////////ฟังก์ชันเส้นทาง////////////////////////////////////////


void P() ///////////// ฟังก์ชันแทกเส้นเจอคู่ดำหยุด/////////////////////////////

{while (1){

s0 = analogRead(0);

s1 = analogRead(1);

s2 = analogRead(2);

s3 = analogRead(3);

if ((s1 > A1) and (s2 > A2)){run(75, 75);}

if (s1 < A1){run(30, 75);}

if (s2 < A2){run(75, 30);}

if (s0 < A0){run(-40, 75);}

if (s3 < A3){run(75, -40);}

if (((s1 < A1) and (s2 < A2)) or ((s1 < A1) and (s0 < A0)) or ((s2 < A2) and (s3 < A3)))

{run(75, 75);delay(180);run(0, 0);delay(100);tone(3,1000,100);break;}}}

void L(){L3();L1();delay(100);tone(3,1000,50);} /////// เลี้ยวซ้าย

void R(){R0;R2();delay(100);tone(3,1000,50);} ///////// เลี้ยว

//////////////////////////////////////////////////////////////////////////


/////////////////////////////ฟังก์ชันมอเตอร์///////////////////////////////////

/////////////////////////////ฟังก์ชันมอเตอร์///////////////////////////////////

void run(int spl, int spr) // ประกาศฟังก์ชัน run(กำลังมอเตอร์ซ้าาย,กำลังมอเตอร์ขวา);

{

if (spl > 0)

{

digitalWrite(DL1, LOW);

digitalWrite(DL2, HIGH);

analogWrite(PWML, spl);

}

else if (spl < 0)

{

digitalWrite(DL1, HIGH);

digitalWrite(DL2, LOW);

analogWrite(PWML, -spl);

}

else

{

digitalWrite(DL1, LOW);

digitalWrite(DL2, LOW);

}

//////////////////////////////////////

if (spr > 0)

{

digitalWrite(DR1, LOW);

digitalWrite(DR2, HIGH);

analogWrite(PWMR, spr);

}

else if (spr < 0)

{

digitalWrite(DR1, HIGH);

digitalWrite(DR2, LOW);

analogWrite(PWMR, -spr);

}

else

{

digitalWrite(DR1, LOW);

digitalWrite(DR2, LOW);

}

}

//////////////////////////////// เรียกใช้ code menu ////////////

void menu1() /// code 1 ที่นี่

{

P();

}

void menu2() /// code 2 ที่นี่

{

L();

}

void menu3() /// code 3 ที่นี่

{

R();

}

void menu4() /// code 4 ที่นี่

{

}

void menu5() /// code 5 ที่นี่

{

}

void menu6() /// code 6 ที่นี่

{

}

void menu7() /// code 7 ที่นี่

{

}

void menu8() /// code 8 ที่นี่

{

}

void menu9() /// code 9 ที่นี่

{

}

void menu10() /// code 10 ที่นี่

{

}

void menu11() /// code 11 ที่นี่

{

}

void menu12() /// code 12 ที่นี่

{

}

สำหรับบอร์ด UNO

การใช้งาน

- แทกเส้นเจอ ดำ-ดำ หยุด ----- P();

- เลี้ยวซ้าย ---------------------- L();

- เลี้ยวขวา ---------------------- R();

Arduino UNO

//////////////////ผนวกไลบรารี่จอแสดงผล//////////////////

#include <Wire.h>

#include <SPI.h>


//////////////////////////////////////กำหนดตัวแปร

int s0 ;

int s1 ;

int s2 ;

int s3 ;

///////////ตั้งค่าปุ่มกด///////////////////

int button = 2; /// กำหนดปุ่มกดสวิตซ์ขา 2

////////////ตั้งค่าพอร์ตมอเตอร์////////////////////

#define DR1 7 /// กำหนดสัญญาณดิจิตอลขวาที่ 1 พอร์ต 7

#define DR2 8 /// กำหนดสัญญาณดิจิตอลขวาที่ 2 พอร์ต 8

#define PWMR 6 /// กำหนดสัญญาณ PWM ขวาพอร์ต 6

/////////////////////////////////

#define DL1 9 // กำหนดสัญญาณดิจิตอลซ้ายที่ 1 พอร์ต 9

#define DL2 4 // กำหนดสัญญาณดิจิตอลซ้ายที่ 2 พอร์ต 4

#define PWML 5 /// กำหนดสัญญาณ PWM ซ้ายพอร์ต 5

/////////////////ตั้งค่าพอร์ต Digital//////////////

void digital() {

s0 = digitalRead(10);

s1 = digitalRead(11);

s2 = digitalRead(12);

s3 = digitalRead(13);

}

/////////////////////แท็ก/////////////////////

void track() {

digital();

if ((s1 == 0) and (s2 == 0))

{run(100, 100);}


if (s0 == 1)

{run(-150, 150);

delay(500);}

if (s1 == 1)

{run(-150, 150);

delay(300);}

if (s2 == 1)

{run(150, -150);

delay(300);}

if (s3 == 1)

{run(150, -150);

delay(500);}

}


/////////////////////////////////////////////////////

void P()

{ while (1)

{ int s0 = digitalRead(10);

int s1 = digitalRead(11);

int s2 = digitalRead(12);

int s3 = digitalRead(13);

if ((s1 == 0) and (s2 == 0)){run(100, 100);}

// if (s0 == 1) {run(-150, 150);delay(50);}

if (s1 == 1) {run(-130, 130);delay(30);}

if (s2 == 1) {run(130, -130);delay(30);}

// if (s3 == 1) {run(150, -150);delay(50);}

if (((s1 == 1) and (s2 == 1)) or ((s1==1) and (s0==1)) or ((s2==1) and (s3==1))) {tone(3,1000,100); run(150, 150);delay(300); run(0, 0); delay(300); break;}}}

////////////////////////////////////////////////////2

void setup() {

//Serial.print(s0);

//Serial.print(s1);

//Serial.print(s2);

//Serial.println(s3);

//////////////////////////////////////////////////

pinMode(2, INPUT); // ตั้งค่าขา 2 เป็น INPUT

pinMode(10, INPUT);

pinMode(11, INPUT);

pinMode(12, INPUT);

pinMode(13, INPUT);

////////กำหนดสัญญาณทุกขาเป็น OUTPUT ///////////////

pinMode(DL1, OUTPUT);

pinMode(DL2, OUTPUT);

pinMode(PWML, OUTPUT);

pinMode(DR1, OUTPUT);

pinMode(DR2, OUTPUT);

pinMode(PWMR, OUTPUT);

////////////////////////////

}

/////////////////////////////////////////////////////////////////

void run(int spl, int spr) // ประกาศฟังก์ชัน run(กำลังมอเตอร์ซ้าาย,กำลังมอเตอร์ขวา);

{

if (spl > 0)

{

digitalWrite(DL1, LOW);

digitalWrite(DL2, HIGH);

analogWrite(PWML, spl);

}

else if (spl < 0)

{

digitalWrite(DL1, HIGH);

digitalWrite(DL2, LOW);

analogWrite(PWML, -spl);

}

else

{

digitalWrite(DL1, LOW);

digitalWrite(DL2, LOW);

analogWrite(PWML, -255);

}

//////////////////////////////////////

if (spr > 0)

{

digitalWrite(DR1, LOW);

digitalWrite(DR2, HIGH);

analogWrite(PWMR, spr);

}

else if (spr < 0)

{

digitalWrite(DR1, HIGH);

digitalWrite(DR2, LOW);

analogWrite(PWMR, -spr);

}

else

{

digitalWrite(DR1, LOW);

digitalWrite(DR2, LOW);

analogWrite(PWMR, -255);

}

}

////////////////////เสี้ยวซ้าย S เจอดำหยุด///////////

void L0(){while(1){digital();run(-255,255);if(s0==1){run(0,0);break;}}}

void L1(){while(1){digital();run(-255,255);if(s1==1){run(0,0);break;}}}

void L2(){while(1){digital();run(-255,255);if(s2==1){run(0,0);break;}}}

void L3(){while(1){digital();run(-255,255);if(s3==1){run(0,0);break;}}}


///////////////////เสี้ยวขวา S เจอดำหยุด/////////////


void R0(){while(1){digital();run(255,-255);if(s0==1){run(0,0);break;}}}

void R1(){while(1){digital();run(255,-255);if(s1==1){run(0,0);break;}}}

void R2(){while(1){digital();run(255,-255);if(s2==1){run(0,0);break;}}}

void R3(){while(1){digital();run(255,-255);if(s3==1){run(0,0);break;}}}

/////////////////////////////////

void L (){L3();L1();delay(100); run(150,150); delay(100); run(0,0); delay(100); tone(3,1000,50);}

void R (){R0();R2();delay(100); run(150,150); delay(100); run(0,0); delay(100); tone(3,1000,50);}

/////////////////////////////////

void loop() {

int sw = digitalRead(button);

if (sw == 1) {

P(); ///// เขียน code ที่นี่

}}