3.การใช้งานทั่วไป

Lab 20 Track HMC5883


รูปแบบคำสั่งที่ใช้งาน

 1. Menu 0 อ่านค่าแสง Analog, อ่านค่ามุมเข็มทิศ,อ่านค่าสีพื้น น้ำเงิน แดง เขียว เหลือง

 2. Menu 1 วัดค่าแสง **กรณีมีโมดูล ADS1115/ADS1015 I2C (เพิ่มจำนวนพอร์ตฝั่งซ้ายของบอร์ด AA0-AA3)

 3. Menu 2 ตั้งค่าเซอร์โวตัวที่1

 4.S(ตัวเลข); ออกตัวจากจุดเริ่มต้น

 5.P(); แทร็กห้องหยุดเมื่อเจอสี/ดำ

 6.P(ตัวเลข); แทร็กห้องตามจำนวนนับ

 7. R(ตัวเลข); เลี้ยวขวาตามจำนวนนับ

 8. L(ตัวเลข); เลี้ยวซ้ายตามจำนวนนับ

 9. r(ตัวเลข องศาเข็มทิศ); เลี้ยวขวาแล้วหยุดล็อกตำแหน่งที่องศาเข็มทิศตามที่กรอก ** กรณีมีโมดูล HMC5883L

10. l (ตัวเลข องศาเข็มทิศ); เลี้ยวขวาแล้วหยุดล็อกตำแหน่งที่องศาเข็มทิศตามที่กรอก ** กรณีมีโมดูล HMC5883L

11. p(ตัวเลข องศาเข็มทิศ); แทร็กล็อกตำแหน่งที่องศาเข็มทิศตามที่กรอก ** กรณีมีโมดูล HMC5883L

12.B(ตัวเลข); ถอยหลังตามจำนวนนับ

13. sv_set(); ตั้งค่าองศาเซอร์โวเริ่มต้นทำงาน

14. sv_up(); ยิงกระสุนกระบอกชุดที่ 1

15. sv_up2(); ยิงกระสุนกระบอกชุดที่ 2

การติดตั้งตำแหน่ง Sensor Lotus T3

Arduino IDE Code

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

#include <Wire.h>

#include <MechaQMC5883.h>

#include <SPI.h>

#include <Adafruit_ADS1015.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

#include <Servo.h>

Adafruit_SSD1306 OLED(-1);

MechaQMC5883 qmc;

Adafruit_ADS1115 ads1115;

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

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

int ss1 = 10;  // เปิดใช้งาน s1 ที่พอร์ต 10

int ss2 = 11;  // เปิดใช้งาน s1 ที่พอร์ต 11

int ss3 = 12;  // เปิดใช้งาน s1 ที่พอร์ต 12

Servo sv1;     // ประกาศการใช้งาน sv1

Servo sv2;     // ประกาศการใช้งาน sv2

Servo sv3;     // ประกาศการใช้งาน sv3

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

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

#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 300 // ค่ากลางเซนเซอร์ A0 (ซ้ายสุด) *********

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

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

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

#define A6 300// ค่ากลางเซนเซอร์ A6 (ตรงกลาง)***********

//////////แสตมป์ค่าเช็คสี RGB /////////////////

//////////แสตมป์ค่าเช็คสี RGB ////////////////

/////////ค่าสี S1R ใช้เซนเซอร์ T3 สีแดง////////

#define Y01 10000   // กรอกค่าที่วัดได้สีเหลือง

#define G01 10000   // กรอกค่าที่วัดได้สีเขียว

#define R01 10000   // กรอกค่าที่วัดได้สีแดง

#define B01 10000   // กรอกค่าที่วัดได้สีน้ำเงิน

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

/////////ค่าสี S2B ใช้เซนเซอร์ T3 สีน้ำเงิน/////////////////////

#define Y02 10000   // กรอกค่าที่วัดได้สีเหลือง

#define G02 10000   // กรอกค่าที่วัดได้สีเขียว

#define R02 10000   // กรอกค่าที่วัดได้สีแดง

#define B02 10000   // กรอกค่าที่วัดได้สีน้ำเงิน

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

/////////ค่าสี S6G ใช้เซนเซอร์ T3 สีเขียว/////////////////////

#define Y06 10000   // กรอกค่าที่วัดได้สีเหลือง

#define G06 10000   // กรอกค่าที่วัดได้สีเขียว

#define R06 10000   // กรอกค่าที่วัดได้สีแดง

#define B06 10000   // กรอกค่าที่วัดได้สีน้ำเงิน

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

int s0 ;

int s1 ;

int s2 ;

int s3 ;

int s6 ;

void analogs()

{

  s0 = analogRead(0);

  s1 = analogRead(1);

  s2 = analogRead(2);

  s3 = analogRead(3);

  s6 = analogRead(6);

}

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

void setup() {

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

  Wire.begin();

  qmc.init();

  ads1115.begin(); // เปิดการใช้งาน ADS1115

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

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

  pinMode(DL1, OUTPUT);

  pinMode(DL2, OUTPUT);

  pinMode(PWML, OUTPUT);

  pinMode(DR1, OUTPUT);

  pinMode(DR2, OUTPUT);

  pinMode(PWMR, OUTPUT);

  sv1.attach(ss1); // เรียกใช้งานเตรียมตอบสนองเซอร์โว sv1

  sv2.attach(ss2); // เรียกใช้งานเตรียมตอบสนองเซอร์โว sv2

  sv3.attach(ss3); // เรียกใช้งานเตรียมตอบสนองเซอร์โว sv3

 // sv_set();

}


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 ads(){

  while(true){

int16_t adc0, adc1, adc2, adc3;

 adc0 = ads1115.readADC_SingleEnded(0);

 adc1 = ads1115.readADC_SingleEnded(1);

 adc2 = ads1115.readADC_SingleEnded(2);

 adc3 = ads1115.readADC_SingleEnded(3);

 /////////// ทำการ Map ค่าเซนเซอร์ Analog ที่ได้ค่าเหมาะสมกับเซนเซอร์ Lotus T3 /////

 int AA0 = map(adc0,150,25000,0,1023);

 int AA1 = map(adc1,150,25000,0,1023);

 int AA2 = map(adc2,150,25000,0,1023);

 int AA3 = map(adc3,150,25000,0,1023);

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

      OLED.clearDisplay();

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

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

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

      OLED.println(" ANALOG I2C TEST");

      OLED.print("    AA0 = "); OLED.println(AA0); /// แสดงผลค่าอะนาล็อกMapที่พอร์ต AA0

      OLED.print("    AA1 = "); OLED.println(AA1); /// แสดงผลค่าอะนาล็อกMapที่พอร์ต AA1

      OLED.print("    AA2 = "); OLED.println(AA2); /// แสดงผลค่าอะนาล็อกMapที่พอร์ต AA2

      OLED.print("    AA3 = "); OLED.println(AA3); /// แสดงผลค่าอะนาล็อกMapที่พอร์ต AA3

      OLED.display();

      delay(50);

  }}

void sensor()

{



  while (true) {

    int x, y, z;

    int azimuth;

    qmc.read(&x, &y, &z, &azimuth);

    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("      S1R = "); OLED.println(s1);  // แสดงค่าเซนเซอร์ S1

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

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

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

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

    OLED.print("      Azi = "); OLED.println(azimuth);

    if (  ( s1>=(Y01 - 100) ) and (s1 < (Y01 + 100))and( s2>=(Y02 - 100) ) and (s2 < (Y02 + 100))and( s6>=(Y06 - 70) ) and (s6 < (Y06 + 70))      ){OLED.println("         Yelow");}

    if (  ( s1>=(G01 - 100) ) and (s1 < (G01 + 100))and( s2>=(G02 - 100) ) and (s2 < (G02 + 100))and( s6>=(G06 - 70) ) and (s6 < (G06 + 70))        ){OLED.println("         Green");}

    if (  ( s1>=(R01 - 100) ) and (s1 < (R01 + 100))and( s2>=(R02 - 100) ) and (s2 < (R02 + 100))and( s6>=(R06 - 70) ) and (s6 < (R06 + 70))        ) {OLED.println("          Red");}

    if (  ( s1>=(B01 - 100) ) and (s1 < (B01 + 100))and( s2>=(B02 - 100) ) and (s2 < (B02 + 100))and( s6>=(B06 - 70) ) and (s6 < (B06 + 70))        ) {OLED.println("          Blue");} 

            

    else { OLED.println("        -------");}

    OLED.display();

    delay(50);

  }

}

/////////////////////// ฟังก์ชันเซฮร์โว //////////////////////////

void up() {

  sv1.write(0);  // เซอร์โวยก

  delay(1000);

}

void down() {

  sv1.write(30);  // เซอร์โววาง

  delay(1000);

}


/////////////////////////////ฟังก์ชันเซอร์โว////////////////////////////////////////

void sv_knob() {

  while (true) {

    int vr = analogRead(A7);  // กำหนดตัวแปรจำนวนเต็มอ่านค่าอนาล็อกที่พอร์ต 7

    int nob = map(vr, 0, 1023, 0, 180); // ทำการ map อัตราส่วนจากสัญญาณ analog 0-1023 เป็น 0-180

    OLED.clearDisplay();    // เคลียร์หน้าจอ oled

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

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

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

    OLED.print("SV1 = ");     // พิมพ์คำว่า SV1 =

    OLED.println(nob);     // นำค่า nob มาแสดงใน oled

    OLED.display();        // เปิดฟังก์ชันแสดงผล

    sv1.write(nob);        // สั่งเซอร์โวมอเตอร์ให้หมุนไปตามค่าองศาที่ทำการ nob ไว้

    delay(50);             // หน่วงเวลา 0.05 วินาที

  }

}

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

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

void sv_set() {sv1.write(180); }  // ตั้งค่าเซอร์โวตอนเริ่มต้น

void sv_up() // ตั้งค่าเซอร์โวตัวที่ 1 ยิงแต้ม

{

sv1.write(180);delay(200); // สเต็บที่ 1

sv1.write(130);delay(200);  // สเต็บที่ 2

sv1.write(180);delay(200); // สเต็บที่ 3

//sv_set(); // คืนค่าเริ่มต้น

}

void sv_up2() // ตั้งค่าเซอร์โวตัวที่ 1 ยิงแต้ม

{

sv2.write(180);delay(200); // สเต็บที่ 1

sv2.write(130);delay(200);  // สเต็บที่ 2

sv2.write(180);delay(200); // สเต็บที่ 3

//sv_set(); // คืนค่าเริ่มต้น

}    

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

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

{        

  while (1) {

 int16_t adc0, adc1, adc2, adc3;

 adc0 = ads1115.readADC_SingleEnded(0);

 adc1 = ads1115.readADC_SingleEnded(1);

 adc2 = ads1115.readADC_SingleEnded(2);

 adc3 = ads1115.readADC_SingleEnded(3);

 /////////// ทำการ Map ค่าเซนเซอร์ Analog ที่ได้ค่าเหมาะสมกับเซนเซอร์ Lotus T3 /////

 int AA0 = map(adc0,150,25000,0,1023);

 int AA1 = map(adc1,150,25000,0,1023);

 int AA2 = map(adc2,150,25000,0,1023);

 int AA3 = map(adc3,150,25000,0,1023);

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

    s0 = analogRead(0);

    s1 = analogRead(1);

    s2 = analogRead(2);

    s3 = analogRead(3);

    s6 = analogRead(6);

    if ((s0 > A0) and (s3 > A3)) {run(60,60);}

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

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

    if (s6 < A6) {run(0,0);delay(100);tone(3,1000,100);break; }

    if (  ( s1>=(Y01 - 100) ) and (s1 < (Y01 + 100))and( s2>=(Y02 - 100) ) and (s2 < (Y02 + 100))and( s6>=(Y06 - 70) ) and (s6 < (Y06 + 70)) ){OLED.clearDisplay();OLED.setTextColor(WHITE, BLACK);OLED.setCursor(0, 0); OLED.println("         Yelow");    OLED.display();run(0, 0);delay(2000);tone(3, 1000, 100);break;}

    if (  ( s1>=(G01 - 100) ) and (s1 < (G01 + 100))and( s2>=(G02 - 100) ) and (s2 < (G02 + 100))and( s6>=(G06 - 70) ) and (s6 < (G06 + 70)) ){OLED.clearDisplay();OLED.setTextColor(WHITE, BLACK);OLED.setCursor(0, 0); OLED.println("         Green");    OLED.display();run(0, 0);delay(2000);tone(3, 1000, 100);break;}

    if (  ( s1>=(R01 - 100) ) and (s1 < (R01 + 100))and( s2>=(R02 - 100) ) and (s2 < (R02 + 100))and( s6>=(R06 - 70) ) and (s6 < (R06 + 70)) ) {OLED.clearDisplay();OLED.setTextColor(WHITE, BLACK);OLED.setCursor(0, 0); OLED.println("          Red");    OLED.display();run(0, 0);delay(2000);tone(3, 1000, 100);break;}

    if (  ( s1>=(B01 - 100) ) and (s1 < (B01 + 100))and( s2>=(B02 - 100) ) and (s2 < (B02 + 100))and( s6>=(B06 - 70) ) and (s6 < (B06 + 70)) ) {OLED.clearDisplay();OLED.setTextColor(WHITE, BLACK);OLED.setCursor(0, 0); OLED.println("          Blue");    OLED.display();run(0, 0);delay(2000);tone(3, 1000, 100);break;}       

  }

}

void P(int t)     ///////////// ฟังก์ชันแทกเส้น/////////////////////////////

{ int j = 0;

  while (1) {

int16_t adc0, adc1, adc2, adc3;

 adc0 = ads1115.readADC_SingleEnded(0);

 adc1 = ads1115.readADC_SingleEnded(1);

 adc2 = ads1115.readADC_SingleEnded(2);

 adc3 = ads1115.readADC_SingleEnded(3);

 /////////// ทำการ Map ค่าเซนเซอร์ Analog ที่ได้ค่าเหมาะสมกับเซนเซอร์ Lotus T3 /////

 int AA0 = map(adc0,150,25000,0,1023);

 int AA1 = map(adc1,150,25000,0,1023);

 int AA2 = map(adc2,150,25000,0,1023);

 int AA3 = map(adc3,150,25000,0,1023);

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

    s0 = analogRead(0);

    s1 = analogRead(1);

    s2 = analogRead(2);

    s3 = analogRead(3);

    s6 = analogRead(6);

    if ((s0 > A0) and (s3 > A3)) {run(60,60);}

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

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

    if (j > t) {run(0, 0);tone(3, 900, 500);break;} j++;}}

///////////////////////// แทร็กทิศ //////////////////////////////////////////////////////

void p(int cp) { 

while (1) { 

int x, y, z;int azimuth; qmc.read(&x, &y, &z, &azimuth);

if (azimuth >= (cp + 5)) {run(150, -150);int x, y, z;int azimuth; qmc.read(&x, &y, &z, &azimuth);}

else{run(100,120);int x, y, z;int azimuth; qmc.read(&x, &y, &z, &azimuth);}

}}

////////////////////มุมห้าม 255-5 องศา//////////////////////////////////////////////////////

void l(int cp) {while (1) {run(-50, 50);int x, y, z;int azimuth;qmc.read(&x, &y, &z, &azimuth);if ((azimuth > (cp - 5)) and (azimuth < (cp + 5))) {run(0, 0);tone(3, 900, 500);break;}}}

void r(int cp) {while (1) {run(50, -50);int x, y, z;int azimuth;qmc.read(&x, &y, &z, &azimuth);if ((azimuth > (cp - 5)) and (azimuth < (cp + 5))) {run(0, 0);tone(3, 900, 500);break; }}}

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

void L(int cp) {run(-60, 60);delay(cp);run(0, 0);tone(3, 900, 500);}

void R(int cp) {run(60, -60);delay(cp);run(0, 0);tone(3, 900, 500);}

void B(int cp) {run(-60,-60);delay(cp);run(0, 0);tone(3, 900, 500);}

void S(int cp) {run(60,60);delay(cp);run(0, 0);tone(3, 900, 500);} // ออกตัวสตาร์ท

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

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

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, HIGH);

    digitalWrite(DL2, HIGH);

  }

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

  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, HIGH);

    digitalWrite(DR2, HIGH);

  }

}

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

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

{

  ads();

}

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

{

 sv_knob();

}

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


}

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 ที่นี่

{l(30);


}

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

{p(100);


}

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

{


}

การกรอกค่าสี

000บทความ สี.pdf