วันพฤหัสบดีที่ 9 กุมภาพันธ์ พ.ศ. 2560

โมดูลสแกนลายนิ้วมือ

วิธีใช้งาน Fingerprint Senser โมดูลสแกนลายนิ้วมือ สำหรับ Arduino

การต่อสายกับบอร์ด Arduino Uno

  • VCC : สีแดง - 5V
  • GND : สีดำ - GND
  • RX : สีขาว - 3
  • TX : สีเขียว - 2

โคดตัวอย่างการใช้งาน Arduino Fingerprint Scanner Code แบบเข้าใจง่าย
2. เพิ่มลายนิ้วมือลงในโมดูล โดย อัพโหลด Arduino Fingerprint Scanner Code จากไฟล์ตัวอย่าง enroll.ino จากโฟลเดอร์ Fingerprint\examples\enroll
พิมพ์เลข ID ที่ต้องการบันทึก เช่น
  • พิมพ์เลข 2 เพื่อบันทึกลายนิ้วมือ ID 2 แล้วกดปุ่ม Send
  • เอามือออก และประทับลายนิ้วมืออีกครั้ง 
  • โปรแกรมบันทึกเรียบร้อยได้เป็น ID #2 ที่ตรงกับลายนิ้วมือที่สแกน
3. การสแกนอ่านลายนิ้วมือว่าเป็นของใคร ทำได้โดย อัพโหลด Arduino Fingerprint Scanner Code ไฟล์ตัวอย่าง fingerprint.ino จากโฟลเดอร์ Fingerprint\examples\fingerprint
  • เมื่อรันโปรแกรมและวางนิ้วมือที่สแกน ก็จะพบข้อมูลว่าตรงกับเลข ID อะไร
  • ถ้าไม่ตรงก็จะไม่พบหมายเลข ID

ข้อมูล Fingerprint Senser โมดูลสแกนลายนิ้วมือ

  • Supply voltage: 3.6 - 6.0VDC
  • Operating current: 120mA max
  • Peak current: 150mA max
  • Fingerprint imaging time: 
  • Window area: 14mm x 18mm
  • Signature file: 256 bytes
  • Template file: 512 bytes
  • Storage capacity: 162 templates
  • Safety ratings (1-5 low to high safety)
  • False Acceptance Rate: <0.001% (Security level 3)
  • False Reject Rate: <1.0% (Security level 3)
  • Interface: TTL Serial
  • Baud rate: 9600, 19200, 28800, 38400, 57600 (default is 57600)
  • Working temperature rating: -20C to +50C
  • Working humidy: 40%-85% RH
  • Full Dimensions: 56 x 20 x 21.5mm
  • Exposed Dimensions (when placed in box): 21mm x 21mm x 21mm triangular
  • Weight: 20 grams

    โมดูลตรวจจับความสันไหวปรับความไวได้

    801S Vibration Sensor vibration module โมดูลตรวจจับความสันไหวปรับความไวได้

    801S Vibration Sensor vibration module โมดูลตรวจจับความสันไหวปรับความไวได้

    คุณภาพสูง ใช้ไฟเลี้ยง3-5V


    สามารถปรับความไวได้ ให้สัญญาณanalog และ digital ใช้กับงานตรวจจับ เช่น อุปกร์ป้องกันขโมย,บอร์ดล็อกแบบอิเล็กทรอนิกส์ 
    ,อุปกรณ์ตรจจับความสั่นไหว






    ตัวอย่างการใช้งาน

    เซนเซอร์ -> Arduino

    +5V -> 5V

    Gnd -> Gnd

    Output -> A0

     ตัวอย่าง Code

    void setup() {

      // initialize serial communication at 9600 bits per second:

      Serial.begin(9600);

    }

    // the loop routine runs over and over again forever:

    void loop() {

      // read the input on analog pin 0:

      int sensorValue = analogRead(A0);

      // print out the value you read:

      Serial.println(sensorValue);

      delay(1000);        // delay in between reads for stability

    }

    วันจันทร์ที่ 6 กุมภาพันธ์ พ.ศ. 2560

    Arduino วัดอุณหภูมิและความชื้น ด้วยเซนเซอร์ DHT22 / DTH21 / DHT11 ใช้ได้ภายใน 3 นาที

    วิธี ใช้งาน Arduino วัดอุณหภูมิและความชื้น ด้วยเซนเซอร์ DHT22 / DTH21 / DHT11 ใช้ได้ภายใน 3 นาที


    สอน วิธี ใช้งาน Arduino วัดอุณหภูมิและความชื้น ด้วยเซนเซอร์ DHT22 / DTH21 / DHT11 ใช้ได้ภายใน 3 นาที



             Arduino สามารถใช้งานเป็นอุปกรณ์เซนเซอร์ ความชื้นและอุณหภูมิ สำหรับประยุกต์ใช้กับงานตามต้องการได้ เช่น ระบบควบคุมอุณหภูมิความชื้นในโรงเพาะเห็น ระบบควบคุมอัตโนมัติ หรือจะใช้ทำเป็นเซนเซอร์เล็ก ๆ สำหรับมอนิเตอร์อุณหภูมิความชื้นในสถานที่ต่าง ๆ การใช้งานเซนเซอร์อุณหภูมิและความชื้นร่วมกับ Arduino สามารถทำได้โดยง่าย เพราะมีไลบารีมาให้พร้อมใช้งาน เพียงแค่ก็อปไปวางก็สามารถดึงค่าอุณหภูมิและความชื้นออกมาได้แล้ว
    ในตัวอย่างนี้ ใช้เซนเซอร์่วัดความชื้นและอุณหภูมิ DHT22 ร่วมกับ Arduino

    การต่อวงจร DHT11 / DHT22 กับ Arduino ต่อตามรูปนี้
    สำหรับการต่อวงจร DHT21 กับ Arduino ต่อตามนี้
    • สายสีดำ -> Gnd
    • สายสีแดง -> 5 Vcc
    • สายสีเหลือง -> 2 (สาย ข้อมูล)
    • ต่อ R 4.7K คร่อมสายสีแดงกับสายสีเหลือง


    การเขียนโคด Arduino เพื่ออ่านค่าความชื้นและอุณหภูมิจากเซนเซอร์ DHT22
    1. ดาวน์โหลดไลบารี DHT22/11 คลิกที่นี่
    2.เขียนโคดโปรแกรมตามนี้ (ก็อปวาง)

    #include "DHT.h"
    
    DHT dht;
    
    void setup()
    {
      Serial.begin(9600);
      Serial.println();
      Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)");
    
      dht.setup(2); // data pin 2
    }
    
    void loop()
    {
      delay(dht.getMinimumSamplingPeriod());
    
      float humidity = dht.getHumidity(); // ดึงค่าความชื้น
      float temperature = dht.getTemperature(); // ดึงค่าอุณหภูมิ
    
      Serial.print(dht.getStatusString());
      Serial.print("\t");
      Serial.print(humidity, 1);
      Serial.print("\t\t");
      Serial.print(temperature, 1);
      Serial.print("\t\t");
      Serial.println(dht.toFahrenheit(temperature), 1);
    }
    
    
    3. เปิดดูผลลัพธ์ที่หน้าจอ Serial Monitor ก็จะพบว่าเราสามารถดึงค่าอุณหภูมิ ความชื้น
    จากเซนเซอร์ DHT22 / DHT21 / DHT11 โดยใช้ Arduino ออกมาใช้งานได้แล้ว
    
    
    
    ข้อมูลอุปกรณ์เซนเซอร์ ความชื้นและอุณหภูมิ

    วิธีใช้งาน Arduino จอ LCD แบบ I2C แสดงข้อความได้ ภายใน 3 นาที

    วิธี ใช้งาน Arduino จอ LCD แบบ I2C แสดงข้อความได้ ภายใน 3 นาที

    สอน วิธี ใช้งาน Arduino จอ LCD แบบ I2C แสดงข้อความได้ ภายใน 3 นาที
    จอ  LCD ปกติจะใช้สายไฟหลายเส้นในการต่อใช้งาน ทำให้บางครั้ง Arduino มีขาไม่พอที่จะควบคุมและยังทำให้การเดินสายต่อใช้งานไม่สะดวก มีวงจรแปลงสัญญาณสำหรับติดต่อจอ LCD แบบอินเตอร์เฟส I2C ต่อแปลงการใช้สายไฟหลาย ๆ เส้น ให้เหลือสายไฟเพียง 2 เส้น ทำให้การเขียนโปรแกรมและการต่อวงจรทำได้ง่ายขึ้น เพียงแค่ใช้โมดูล LCD I2C ไปต่อกับจอ LCD แบบเดิม ก็สามารถใช้งานได้ทันที โมดูล I2C LCD นี้จะมีตัวต้านทานปรับค่าได้สำหรับปรับความสว่างหน้าจอมาด้วย

    การแสดงผลของจอ LCD ถ้ามองชัด ๆ แล้วจะเห็นว่าข้อความเกิดจากช่องสี่เหลี่ยมเล็ก ๆ มีสถานะเปิดกับปิดรวมกันหลาย ๆ ช่องกลายเป็น 1 ตัวอักษร ซึ่งเราสามารถสร้างอักษรของเราขึ้นมาเองได้ อาจจะใช้เว็บนี้ในการช่วยสร้างข้อความ http://fusion94.org/lcdchargen/
     

    จอ LCD ที่ใช้งานร่วมกับโมดูล LCD I2C นี้มีอยู่ 2 รุ่นคือ
    1. รุ่น LCD 16x2 หรือรุ่น LCD 1602 สามารถแสดงข้อความได้ 16 ตัวอักษร 2 บรรทัด
    2. รุ่น LCD 20x4 หรือรุ่น LCD 2004 สามารถแสดงข้อความได้ 20 ตัวอักษร 4 บรรทัด

    วิธีการใช้งาน Arduino จอ LCD แบบ I2C แสดงข้อความ
    ดาวน์โหลดไลบารี LCD คลิกที่่นี่ หลังจากติดตั้งไลบารีแล้ว ก็พร้อมใช้งานได้เลย

    การต่อใช้งาน  จอ LCD แบบ I2C

    • Vcc -> 3.3-5V
    • Gnd -> Gnd
    • SDA -> 4
    • SCL -> 5
    ตัวอย่างโคด 1602 2004 LCD Adapter Plate IIC I2C Interface for arduino
    #include <Wire.h>
    #include <LCD.h>
    #include <LiquidCrystal_I2C.h>
    
    #define I2C_ADDR 0x27 // กำหนดตำแหน่ง Address ของ I2C
    // #define I2C_ADDR 0x3F // ในบางกรณี Address ของ I2C เป็น 0x3f 
    //ให้เปลี่ยน 0x27 เป็น 0x3F
    
    #define BACKLIGHT_PIN 3
    
    
    LiquidCrystal_I2C lcd(I2C_ADDR,2,1,0,4,5,6,7);
    
    void setup()
    {
    // lcd.begin (20,4); 
    lcd.begin (16,2);
    
    /* byte customChar0[8] = {
        0b00000,
        0b00000,
        0b00000,
        0b11111,
        0b11111,
        0b11111,
        0b11111,
        0b00000
      };
      byte customChar1[8] = {
        0b11100,
        0b11100,
        0b11100,
        0b11111,
        0b11111,
        0b11111,
        0b11110,
        0b00000
      };
      lcd.createChar(1, customChar0);
      lcd.createChar(2, customChar1);*/
    // Switch on the backlight
    lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
    lcd.setBacklight(HIGH);
    lcd.home (); // ไปที่ตัวอักษรที่ 0 แถวที่ 1
    
    lcd.setCursor(1,0); // ไปทตัวอักษรที่ 1 แถวที่ 1
    lcd.print("Welcome ALL");
    
    lcd.setCursor(3,1); // ไปที่ตัวอักษรที่ 5 แถวที่ 2
    lcd.print("ArduinoAll");
    // lcd.write(1);
    // lcd.write(2);
    
    }
    
    void loop()
    {
    
    }
    
    จอ LCD 16x2 with I2C ทางร้านตรวจสอบให้อย่างละเอียด ทุกจุด ทุก pixel ถ้ามีปัญหาแม้เแต่จุด pixel เดียว ก็จะไม่ส่งให้ลูกค้า

    I2C มี 2 เบอร์ PCF8574T/PCF8574AT

    Datasheet บอกไว้ชัดเจนตามนี้ http://www.nxp.com/documents/data_sheet/PCF8574_PCF8574A.pdf



    และ แต่ละเบอร์เปลี่้ยน address ได้ 8 แบบ มีความเป็นไปได้ 16 address แบบ ซึ่งทำให้เราสามารถต่อ LCD แบบ I2C ได้ถึง 16 ตัวพร้อมกันบนบอร์ดเดียว โดยใช้ขาควบคุมเพียง 2 เส้น






    การใช้งาน Character LCD Display กับ Arduino

     การใช้งาน Character LCD Display กับ Arduino
    (ตอนที่1 - รูปแบบการเชื่อมต่อแบบ Parallel)
    12

    ความรู้ทั่วไปเกี่ยวกับ LCD Display
            จอ Liquid Crystal Display (LCD) เป็นจอแสดงผลรูปแบบหนึ่งที่นิยมนำมาใช้งานกันกับระบบสมองกลฝังตัวอย่างแพร่ หลาย จอ LCD มีทั้งแบบแสดงผลเป็นตัวอักขระเรียกว่า Character LCD ซึ่งมีการกำหนดตัวอักษรหรืออักขระที่สามารถแสดงผลไว้ได้อยู่แล้ว และแบบที่สามารถแสดงผลเป็นรูปภาพหรือสัญลักษณ์ได้ตามความต้องการของผู้ใช้ งานเรียกว่า Graphic LCD นอกจากนี้บางชนิดเป็นจอที่มีการผลิตขึ้นมาใช้เฉพาะงาน ทำให้มีรูปแบบและรูปร่างเฉพาะเจาะจงในการแสดงผล เช่น นาฬิกาดิจิตอล เครื่องคิดเลข หรือ หน้าปัดวิทยุ เป็นต้น
    1   13  4

    โครงสร้างโดยทั่วไปของ LCD
              โครงสร้างของ LCD ทั่วไปจะประกอบขึ้นด้วยแผ่นแก้ว 2 แผ่นประกบกันอยู่ โดยเว้นช่องว่างตรงกลางไว้ 6-10 ไมโครเมตร ผิวด้านในของแผ่นแก้วจะเคลือบด้วยตัวนำไฟฟ้าแบบใสเพื่อใช้แสดงตัวอักษร ตรงกลางระหว่างตัวนำไฟฟ้าแบบใสกับผลึกเหลวจะมีชั้นของสารที่ทำให้โมเลกุลของ ผลึกรวมตัวกันในทิศทางที่แสงส่องมากระทบเรียกว่า Alignment Layer และผลึกเหลวที่ใช้โดยทั่วไปจะเป็นแบบ Magnetic โดย LCD สามารถแสดงผลให้เรามองเห็นได้ทั้งหมด 3 แบบด้วยกันคือ
    - แบบใช้การสะท้อนแสง (Reflective Mode) LCD แบบนี้ใช้สารประเภทโลหะเคลือบอยู่ที่แผ่นหลังของ LCD ซึ่ง LCD ประเภทนี้เหมาะกับการนำมาใช้งานในที่ที่มีแสงสว่างเพียงพอ
    - แบบใช้การส่งผ่าน (Transitive Mode) LCD แบบนี้วางหลอดไฟไว้ด้านหลังจอ เพื่อทำให้การอ่านค่าที่แสดงผลทำได้ชัดเจน
    - แบบส่งผ่านและสะท้อน (Transflective Mode) LCD แบบนี้เป็นการนำเอาข้อดีของจอแสดงผล LCD ทั้ง 2 แบบมารวมกัน
              ในบทความนี้เราจะกล่าวถึงจอ LCD ที่แสดงผลเป็นอักขระหรือตัวอักษร ตามท้องตลาดทั่วไปจะมีหลายแบบด้วยกัน มีทั้ง 16 ตัวอักษร 20 ตัวอักษรหรือมากกว่า และจำนวนบรรทัดจะมีตั้งแต่ 1 บรรทัด 2 บรรทัด 4 บรรทัดหรือมากกว่าตามแต่ความต้องการและลักษณะของงานที่ใช้ หรืออาจจะมีแบบสั่งทำเฉพาะงานก็เป็นได้ ในบทความนี้เราจะยกตัวอย่างจอ LCD ขนาด 16x2 Character หรือที่นิยมเรียกกันว่าจอ LCD 16 ตัวอักษร 2 บรรทัด สามารถหาซื้อได้ง่ายและมีราคาไม่สูง เหมาะสมกับการใช้งานแสดงผลไม่มากในหน้าจอเดียว
              จอ LCD 16x2 Character ที่นิยมวางจำหน่ายจะมีอยู่ 2 แบบด้วยกันคือ LCD แบบปกติที่เชื่อมต่อแบบขนาน (Parallel) และ LCD แบบ ที่เชื่อมต่ออนุกรม (Serial) แบบ I2C โดยทั้ง 2 แบบตัวจอมีลักษณะเดียวกันเพียงแต่แบบ I2C จะมีบอร์ดเสริมทำให้สื่อสารแบบ I2C ได้เชื่อมต่อได้สะดวกขึ้น
    5
    รูปที่ 1 จอ LCD 16x2 Character (Parallel)

    3
    7

    รูปที่ 2 จอ LCD 16x2 Character (I2C)
    ต่อ มาเราจะมาดูกันว่าทั้ง 2 แบบมีขาหรือ Pin ในการเชื่อมต่อแตกต่างกันอย่างไร โดยแบบแรกเป็นแบบ Parallel มีทั้งหมด 16 ขาด้วยกัน ส่วนแบบที่สองเป็นแบบ I2C มีเพียง 4 ขา สามารถแยกออกตามตารางด้านล่างครับ
    1. แบบ Parallel มี 16 ขา
    8
    รูปที่ 3 ด้านหน้าจอ LCD 16x2 (Parallel)
    14
     ตารางที่ 1 ตารางขาของจอ LCD 16x2 แบบ Parallel
    2. แบบ I2C มี 4 ขา (คลิกอ่าน บทความการเชื่อมต่อแบบ I2C)
    7
    9
    รูปที่ 4 ด้านหลังจอ LCD 16x2 (I2C)
    15
    ตารางที่ 2 ตารางขาของจอ LCD 16x2 แบบ I2C
    การควบคุมการแสดงผลของ LCD
              ในการควบคุมหรือสั่งงาน ตัวจอ LCD นั้นมีส่วนควบคุม (Controller) รวมไว้ในตัวแล้ว ผู้ใช้สามารถส่งรหัสคำสั่งควบคุมการทำงานของจอ LCD ผ่าน Controller ว่าต้องการใช้แสดงผลอย่างไร โดย LCD Controller ของจอตัวนี้เป็น Hitachi เบอร์ HD44780 และขาในการเชื่อมต่อระหว่าง LCD กับ Microcontroller มีดังนี้
              1. GND เป็นกราวด์ใช้ต่อระหว่าง Ground ของระบบ Microcontroller กับ LCD
              2. VCC เป็นไฟเลี้ยงวงจรที่ป้อนให้กับ LCD ขนาด +5VDC
              3. VO ใช้ปรับความสว่างของหน้าจอ LCD
              4. RS ใช้บอกให้ LCD Controller ทราบว่า Code ที่ส่งมาทางขา Data เป็นคำสั่งหรือข้อมูล
              5. R/W ใช้กำหนดว่าจะอ่านหรือเขียนข้อมูลกับ LCD Controller
              6. E เป็นขา Enable หรือ Chips Select เพื่อกำหนดการทำงานให้กับ LCD Controller
              7-14. DB0-DB7 เป็นขาสัญญาณ Data ใช้สำหรับเขียนหรืออ่านข้อมูล/คำสั่ง กับ LCD Controller
              วิธี การสั่งงานจะแตกต่างกันไป โดย LCD Controller สามารถรับรหัสคำสั่งจาก Microcontroller ได้จากสัญญาณ RS R/W และ DB0-DB7 ในขณะที่สัญญาณ E มีค่า Logic เป็น “1” ซึ่งสัญญาณเหล่านี้จะใช้ร่วมกันเพื่อกำหนดเป็นรหัสคำสั่งสำหรับสั่งงาน LCD โดยหน้าที่ของแต่ละสัญญาณพอสรุปได้ดังนี้ 
              - E เป็นสัญญาณ Enable เมื่อมีค่าเป็น
                       “1” เป็นการบอกให้ LCD ทราบว่าอุปกรณ์ภายนอกต้องการติดต่ออ่านหรือเขียนข้อมูล
                       “0” ให้ LCD ไม่สนใจสัญญาณ RS R/W และ DB7-DB0
              - RS เป็นสัญญาณสำหรับกำหนดให้ LCD ทราบว่าอุปกรณ์ภายนอกต้องการติดต่อกับ LCD ในขณะนั้นเป็นรหัสคำสั่งหรือข้อมูล โดยถ้า
                        RS = “0” หมายถึง คำสั่ง
                        RS = “1” หมายถึง ข้อมูล
              - R/W เป็นสัญญาณสำหรับบอกให้ LCD ทราบว่าอุปกรณ์ภายนอกต้องการอ่านหรือเขียนกับ LCD โดยถ้า
                        R/W = “0” หมายถึง เขียน
                        R/W = “1” หมายถึง อ่าน
              - DB0-DB7 เป็นสัญญาณแบบ 2 ทิศทาง โดยจะสัมพันธ์กับสัญญาณ R/W ใช้สำหรับรับสั่ง คำสั่งและข้อมูลระหว่าง LCD กับอุปกรณ์ภายนอก โดยถ้า R/W =   “0” สัญญาณ DB7-DB0 จะส่งจากอุปกรณ์ภายนอกมาที่ LCD แต่ถ้า R/W = “1” สัญญาณ DB7-DB0 จะส่งจาก LCD ไปยังอุปกรณ์ภายนอก
    การเชื่อมต่อสัญญาณขาข้อมูลระหว่าง Microcontroller กับ LCD Controller
              การเชื่อมต่อสัญญาณขาข้อมูลระหว่าง Microcontroller กับ LCD Controller สามารถทำได้ 2 ลักษณะ คือ การเชื่อมต่อแบบ 8 บิต (DB0-DB7) และการเชื่อมต่อแบบ 4 บิต (DB4-DB7) ทั้งสองแบบแตกต่างกันเพียงจำนวนขาที่ใช้คือ 8 หรือ 4 ขา และยังสามารถทำงานได้เหมือนกัน อย่างที่แน่นอนในการส่งข้อมูลแบบ 4 ขา ย่อมทำได้ช้ากว่า 8 ขา แต่ไม่ได้ช้ามากจนสังเกตุได้ด้วยสายตา ในการต่อกับ Arduino นั้นจึงนิยมต่อเพียง 4 ขา หรือ 4 บิตเท่านั้น เพื่อเป็นการประหยัดขาในการต่อใช้งานไปไว้ต่อกับอุปกรณ์อื่น ตัวอย่างเช่น Arduino UNO R3 นั้นมีขาให้ใช้งานค่อนข้างน้อย
    ขาที่ใช้ในการเชื่อมต่อกับ Arduino UNO R3
    10
    ตารางขาที่ใช้ในการเชื่อมต่อกับ Arduino UNO R3
    11
    รายละเอียดคำสั่งในการสั่งงานระหว่าง Arduino กับ จอ LCD
             คำสั่งในการควบคุมจอ LCD ของ Arduino นั้น ทาง Arduino.cc เขียนเป็น Library มาให้เพื่อสะดวกในการนำไปใช้งาน หลังจากต่อสายเสร็จเรียบร้อย ขั้นตอนแรกในการเริ่มเขียนโปรแกรมคือการเรียกใช้ Library ของ LCD จากไฟล์ชื่อ LiquidCrystal.h หลังจากนั้นมาดูกันว่ามีฟังก์ชั่นที่สำคัญอะไรบ้างที่ใช้สั่งงานให้จอ LCD
             ฟังก์ชั่น LiquidCrystal(); ใช้ประกาศขาที่ต้องการส่งข้อมูลไปยังจอ LCD รูปแบบในการสั่งงานคือ
    LiquidCrystal lcd(rs, enable, d4, d5, d6, d7) <<<<<<< ในกรณีใช้งานแบบ 4 บิต
    LiquidCrystal lcd(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) <<<<<<< ในกรณีใช้งานแบบ 8 บิต
             ใน บทความนี้ใช้แบบ 4 บิต คือ LiquidCrystal lcd(12, 11, 4, 5, 6, 7); ก็หมายถึงการเชื่อมต่อ rs ที่ขา 12 , Enable ที่ขา 11 , และ DB4-DB7 ที่ขา 4-7 ของ Arduino ตามลำดับ
             ฟังก์ชั่น begin(); ใช้กำหนดขนาดของจอ ในบทความนี้เราใช้ขนาด 16 ตัวอักษร 2 บรรทัด จึงประกาศเป็น lcd.begin(16, 2);
             ฟังก์ชั่น setCursor(); ใช้กำหนดตำแหน่งและบรรทัดของ Cursor เช่น lcd.setCursor(0, 1); คือ ให้เคอร์เซอร์ไปที่ตำแหน่งที่ 0 บรรทัดที่ 1 การนับตำแหน่งเริ่มจาก 0 ดังนั้น LCD 16x2 มีตำแหน่ง 0 – 15 บรรทัด คือ 0 กับ 1
             ฟังก์ชั่น print(); ใช้กำหนดข้อความที่ต้องการแสดง เช่น lcd.print("ThaiEasyElec"); คือ ให้แสดงข้อความ “ThaiEasyElec” ออกทางหน้าจอ LCD
             ในบทความนี้เราจะใช้เพียงฟังก์ชั่นที่พูดถึงด้านบน ส่วนฟังก์ชั่นอื่นๆ สามารถดูเพิ่มเติมได้จาก Arduino.cc <<< คลิกได้เลยครับ
    ตัวอย่างโค้ดโปรแกรม 
    #include <LiquidCrystal.h>  //ประกาศLibrary
    // initialize the library with the numbers of the interface pins
    LiquidCrystal lcd(12, 11, 4, 5, 6, 7);  //ฟังก์ชั่นแรกกำหนดPins ที่ใช้ในการเชื่อมต่อ
    void setup()
    {
    // set up the LCD's number of columns and rows:
    lcd.begin(16, 2);                                                 //กำหนดขนาดของจอ columns และ rows
    // Print a message to the LCD.
    lcd.print("Hello !!!");                      //กำหนดข้อความที่ต้องการแสดงผล
    lcd.setCursor(0, 1);                                        //กำหนดตำแหน่ง Cursor
    lcd.print("ThaiEasyElec");                //กำหนดข้อความที่ต้องการแสดงผล
    }
    void loop()
    {
    }
    ผลลัพธ์ ที่ได้ตามรูปด้านล่างนะครับผม!!!! นอกจากนี้ยังมีตัวอย่างอื่นๆ สามารถเปิดได้จาก Arduino IDE ในเมนู File >> Example >> LiquidCrystal >> .......
    12

    วิธีควบคุมทิศทาง DC Motor ด้วย Relay 2 Chanel

    วิธีควบคุมทิศทาง DC Motor ด้วย Relay 2 Chanel

             วิธี ควบคุมทิศทางดีซี มอเตอร์ (DC Motor) ให้หมุนไป-กลับ (ตามเข็มนาฬิกา-ทวนเข็มนาฬิกา) ด้วย Relay 2 Chanel โดยวิธีการดังกล่าวนี้จะไม่สามารถควบคุมความเร็วของมอเตอร์ได้จะควบคุมได้ เฉพาะทิศทางเท่านั้น หากต้องการที่จะควบคุมความเร็วจะต้องใช้บอร์ดอีกประเภทครับ


    อุปกรณ์

    Relay
    การต่อ Relay

    การต่อวงจร

    Arduino Uno Relay
    5 V VCC
    GND GND
    D3 IN1
    D4 IN2
    การต่อวงจรจาก Code ตัวอย่าง   Code ตัวอย่าง
          จาก Code ตัวอย่างจะเห็นว่า ขา PIN ที่ใช้งานคือ ขา  3 และ 4 ตามที่ได้ตั้งไว้ การต่อใช้
    งานคือ ขา 3 และ 4 ของบอร์ด Arduino UNO จะต่อเข้ากับขา IN1 และ IN2 ของบอร์ด Relay
    ส่วนขา GND และ VCC ที่บอร์ด Relay ให้ต่อเข้ากับขา GND และ 5V ของบอร์ด Arduino UNO

    การควบคุม RC Servo Motor ด้วย Arduino

     "ตัวอย่างการควบคุม RC Servo Motor ด้วย Arduino"
    01
    RC Servo Motor รุ่นที่มีจำหน่าย:
              Servo เป็นคำศัพท์ที่ใช้กันทั่วไปในระบบควบคุมอัตโนมัติ มาจากภาษาละตินคำว่า Sevus หมายถึง “ทาส” (Slave) ในเชิงความหมายของ Servo Motor ก็คือ Motor ที่เราสามารถสั่งงานหรือตั้งค่า แล้วตัว Motor จะหมุนไปยังตำแหน่งองศาที่เราสั่งได้เองอย่างถูกต้อง โดยใช้การควบคุมแบบป้อนกลับ (Feedback Control) ในบทความนี้จะกล่าวถึง RC Servo Motor ซึ่งนิยมนำมาใช้ในเครื่องเล่นที่บังคับด้วยคลื่นวิทยุ (RC = Radio - Controlled) เช่น เรือบังคับวิทยุ รถบังคับวิทยุ เฮลิคอปเตอร์บังคับวิทยุ เป็นต้น
              Feedback Control คือ ระบบควบคุมที่มีการวัดค่าเอาต์พุตของระบบนำมาเปรียบเทียบกับค่าอินพุตเพื่อ ควบคุมและปรับแต่งให้ค่าเอาต์พุตของระบบให้มีค่า เท่ากับ หรือ ใกล้เคียงกับค่าอินพุต
    ส่วนประกอบภายนอก RC Servo Motor
    02
    - Case ตัวถัง หรือ กรอบของตัว Servo Motor
    - Mounting Tab ส่วนจับยึดตัว Servo กับชิ้นงาน
    - Output Shaft เพลาส่งกำลัง
    - Servo Horns ส่วนเชื่อมต่อกับ Output shaft เพื่อสร้างกลไกล
    - Cable สายเชื่อมต่อเพื่อ จ่ายไฟฟ้า และ ควบคุม Servo Motor จะประกอบด้วยสายไฟ 3 เส้น และ ใน RC Servo Motor จะมีสีของสายแตกต่างกันไปดังนี้
             o สายสีแดง คือ ไฟเลี้ยง (4.8-6V)
             o สายสีดำ หรือ น้ำตาล คือ กราวด์
             o สายสีเหลือง (ส้ม ขาว หรือฟ้า) คือ สายส่งสัญญาณพัลซ์ควบคุม (3-5V)
    - Connector จุดเชื่อมต่อสายไฟ
    ส่วนประกอบภายใน RC Servo Motor
    03Ref: www.pololu.com
    1. Motor เป็นส่วนของตัวมอเตอร์
    2. Gear Train หรือ Gearbox เป็นชุดเกียร์ทดแรง
    3. Position Sensor เป็นเซ็นเซอร์ตรวจจับตำแหน่งเพื่อหาค่าองศาในการหมุน
    4. Electronic Control System เป็นส่วนที่ควบคุมและประมวลผล
    Servo Motor Block Diagram
    04
    หลักการทำงานของ RC Servo Motor
                 เมื่อจ่ายสัญญาณพัลซ์เข้ามายัง RC Servo Motor ส่วนวงจรควบคุม (Electronic Control System) ภายใน Servo จะทำการอ่านและประมวลผลค่าความกว้างของสัญญาณพัลซ์ที่ส่งเข้ามาเพื่อแปลค่า เป็นตำแหน่งองศาที่ต้องการให้ Motor หมุนเคลื่อนที่ไปยังตำแหน่งนั้น แล้วส่งคำสั่งไปทำการควบคุมให้ Motor หมุนไปยังตำแหน่งที่ต้องการ โดยมี Position Sensor เป็นตัวเซ็นเซอร์คอยวัดค่ามุมที่ Motor กำลังหมุน เป็น Feedback กลับมาให้วงจรควบคุมเปรียบเทียบกับค่าอินพุตเพื่อควบคุมให้ได้ตำแหน่งที่ ต้องการอย่างถูกต้องแม่นยำ
    สัญญาณ RC ในรูปแบบ PWM
                ตัว RC Servo Motor ออกแบบมาใช้สำหรับรับคำสั่งจาก Remote Control ที่ใช้ควบคุมของเล่นด้วยสัญญาณวิทยุต่างๆ เช่น เครื่องบินบังคับ รถบังบังคับ เรือบังคับ เป็นต้น ซึ่ง Remote จำพวกนี้ที่ภาครับจะแปลงความถี่วิทยุออกมาในรูปแบบสัญญาณ PWM (Pulse Width Modulation)
    05           มุม หรือองศาจะขึ้นอยู่กับความกว้างของสัญญาณพัลซ์ ซึ่งโดยส่วนมากความกว้างของพัลซ์ที่ใช้ใน RC Servo Motor จะอยู่ในช่วง 1-2 ms หรือ 0.5-2.5 ms 
               ยกตัวอย่างเช่นหากกำหนดความกว้างของสัญญาณพัลซ์ไว้ที่ 1 ms ตัว Servo Motor จะหมุนไปทางด้ายซ้ายจนสุด ในทางกลับกันหากกำหนดความกว้างของสัญญาณพัลซ์ไว้ที่ 2 ms ตัว Servo Motor จะหมุนไปยังตำแหน่งขวาสุด แต่หากกำหนดความกว้างของสัญญาณพัลซ์ไว้ที่ 1.5 ms ตัว Servo Motor ก็จะหมุนมาอยู่ที่ตำแหน่งตรงกลางพอดี
    06
               ดังนั้นสามารถกำหนดองศาการหมุนของ RC Servo Motor ได้โดยการเทียบค่า เช่น RC Servo Motor สามารถหมุนได้ 180 องศา โดยที่ 0 องศาใช้ความกว้างพัลซ์เท่ากับ 1000 us ที่ 180 องศาความกว้างพัลซ์เท่ากับ 2000 us เพราะฉะนั้นค่าที่เปลี่ยนไป 1 องศาจะใช้ความกว้างพัลซ์ต่างกัน (2000-1000)/180 เท่ากับ 5.55 us
               จากการหาค่าความกว้างพัลซ์ที่มุม 1 องศาข้างต้น หากต้องกำหนดให้ RC Servo Motor หมุนไปที่มุม 45 องศาจะหาค่าพัลซ์ที่ต้องการได้จาก 5.55 x 45 เท่ากับ 249.75 us แต่ที่มุม 0 องศาเราเริ่มที่ความกว้างพัลซ์ 1ms หรือ 1000 us เพราะฉะนั้นความกว้างพัลซ์ที่ใช้กำหนดให้ RC Servo Motor หมุนไปที่ 45 องศา คือ 1000 + 249.75 เท่ากับประมาณ 1250 us
    07
    วิธีควบคุม RC Servo Motor ด้วย Arduino
                Arduino มีไลบรารี่สำหรับสั่งงาน RC Servo Motor มาให้ใช้งานอยู่แล้วเป็นฟังก์ชั่นสำเร็จรูปและใช้งานได้ง่าย ในหน้าเว็บไซต์ http://arduino.cc/en/reference/servo ได้ให้ข้อมูลไว้ว่า Servo Library ของ Arduino สามารถสั่งงาน RC Servo Motor ได้ทั้งแบบหมุนไป-กลับได้ 0-180 องศา (ที่กล่าวถึงตามตัวอย่างข้างต้น) และแบบต่อเนื่องที่หมุนครบรอบได้เรียกว่าเป็น Continuous Rotation Servo (ซึ่งในช่วงท้ายบทความจะกล่าวถึงเพิ่มเติม) โดยสามารถรองรับการเชื่อมต่อ RC Servo Motor ได้ถึง 12 ตัวกับบอร์ด Arduino UNO และรองรับสูงสุดถึง 48 ตัวหากใช้บอร์ด Arduino Mega
    ฟังก์ชั่นภายใน Servo Library
    - attach()
    - write()
    - writeMicroseconds()
    - read()
    - attached()
    - detach()
    attach()
    Description
              คือฟังก์ชั่นที่ใช้ในการกำหนดขาสัญญาณที่ Servo Motor ต่อกับ Arduino และกำหนดความกว้างของพัลซ์ที่ 0 องศาและ 180 องศา
    Syntax
              Servo.attach(pin)
              Servo.attach(pin,min,max)
    Parameters
              Pin: คือ ขาสัญญาณของ Arduino ที่ใช้เชื่อมต่อกับ Servo Motor
              Min: คือ ความกว้างของพัลซ์ที่ 0 องศาของ Servo ตัวที่ใช้ในหน่วยไมโครวินาที (us) โดยปกติแล้วหากไม่มีการตั้งค่าโปรแกรมจะกำหนดค่าไว้ที่ 544 us
              Max: คือ ความกว้างของพัลซ์ที่ 180 องศาของ Servo ตัวที่ใช้ในหน่วยไมโครวินาที (us) โดยปกติแล้วหากไม่มีการตั้งค่าโปรแกรมจะกำหนดค่าไว้ที่ 2400 us
    Write()
    Description
              คือฟังก์ชั่นที่ใช้ควบคุมตำแหน่งที่ต้องการให้ Servo Motor หมุนไปยังองศาที่กำหนดสามารถกำหนดเป็นค่าองศาได้เลย คือ 0-180 องศา แต่ใน Servo Motor ที่เป็น Full Rotation คำสั่ง write จะเป็นการกำหนดความเร็วในการหมุน โดย
              ค่าเท่ากับ 90 คือคำสั่งให้ Servo Motor หยุดหมุน
              ค่าเท่ากับ 0 คือการหมุนด้วยความเร็วสูงสุดในทิศทางหนึ่ง
              ค่าเท่ากับ 180 คือการหมุนด้วยความเร็วสูงสุดในทิศทางตรงกันข้าม
    Syntax
              servo.write(angle)
    Parameters
              Angle: คือมุมที่ต้องการให้ RC Servo Motor แบบ 0-180 องศาหมุนไป แต่หากเป็น RC Servo Motor แบบ Full Rotation ค่า Angle คือ การกำหนดความเร็วและทิศทางในการหมุน
    writeMicroseconds()
    Description
              คือฟังก์ชั่นที่ใช้ควบคุมตำแหน่งที่ให้ Servo Motor หมุนไปยังตำแหน่งองศาที่กำหนดโดยกำหนดเป็นค่าความกว้างของพัลซ์ในหน่วย us ซึ่งปกติแล้ว RC Servo Motor จะใช้ความกว้างของพัลซ์อยู่ที่ 1000-2000 us ตามที่ได้กล่าวไปข้างต้นแล้ว แต่ RC Servo Motor บางรุ่นหรือบางยี่ห้อไม่ได้ใช้ ช่วงความกว้างของพัลซ์ตามที่ได้กล่าวเอาไว้นี้ อาจจะใช้ช่วง 700-2300 แทนก็สามารถใช้ฟังก์ชั่น writeMicroseconds นี้เพื่อกำหนดความกว้างพัลซ์ได้เอง
              การ ใช้ฟังก์ชั่น writeMicroseconds สามารถกำหนดค่าได้อิสระ ตรงนี้ ”ต้องระวังในการใช้งาน” หากสั่งงาน RC Servo Motor (แบบ 0 - 180 องศา) จนหมุนไปเกินจุดสิ้นสุดคือเกินทั้งฝั่ง 0 หรือ 180 องศา จะทำให้เกิดเสียงครางดังจากการหมุนไปต่อไม่ได้และมอเตอร์จะกินกระแสสูงขึ้น ด้วยในเวลาเดียวกันนั้น ซึ่งอาจทำให้ RC Servo Motor เกิดความเสียหายได้
    Syntax
              servo.writeMicroseconds(uS)
    Parameters
              uS: คือค่าความกว้างของพัลซ์ที่ต้องการกำหนดในหน่วยไมโครวินาที (โดยตัวแปร int)
    read()
    Description
              คือฟังก์ชั่นอ่านค่าองศาที่สั่งเข้าไปด้วยฟังก์ชั่น write() เพื่อให้รู้ว่าตำแหน่งองศาสุดท้ายที่เราสั่งเข้าไปนั้นมีค่าเท่าไหร่ซึ่งค่า ที่อ่านออกมานั้นจะมีค่าอยู่ในช่วง 0 - 180
    Syntax
              servo.read()
    Parameters
              ไม่มี: จะ Return ค่า 0-180
    attached()
    Description
               คือฟังก์ชั่นตรวจสอบว่า Servo ที่เราต้องการใช้กำลังต่ออยู่กับขสัญญาณของ Arduino หรือไม่
    Syntax
               servo.attached()
    Parameters
               ไม่มี: จะ Return ค่า True ออกมา หาก Servo Motor เชื่อมต่ออยู่กับ Arduino แต่ถ้าหาก Return ออกมาเป็นค่าอื่นถือว่าไม่เชื่อมต่อ
    detach()
    Description
               คือฟังก์ชั่นคืนสถานะของขาที่เรากำหนดให้เป็นขาควบคุม Servo Motor ด้วยคำสั่ง attached() ให้กลับคือสู่การใช่งานปกติ
    Syntax
               servo.detach()
    Parameters
               ไม่มี
    ตัวอย่างการเชื่อมต่อ RC Servo Motor เข้ากับบอร์ด Arduino
    08
    อุปกรณ์ RC Servo Motor ที่ใช้ในบทความ :  EFDV245 Futaba S3003 Servo Motor
    โค้ดตัวอย่างการควบคุมตำแหน่ง RC Servo Motor
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <Servo.h>
    Servo myservo;  
    void setup()
    {
      myservo.attach(9);
    }
    void loop()
    {       myservo.write(0);
            delay(1000);     
            myservo.write(90);
            delay(1000);     
            myservo.write(180);
            delay(1000);                    
    }

    ผลการทำงานของโค้ด

    09
    myservo.write(0);
    delay(1000);
    Servo Motor จะหมุนไปที่ตำแหน่ง 0 องศา และ หยุดเป็นเวลา 1 วินาที
    10
    myservo.write(90);
    delay(1000);
    Servo Motor จะหมุนไปที่ตำแหน่ง 90 องศา และ หยุดเป็นเวลา 1 วินาที
    11
    myservo.write(90);
    delay(1000);
    Servo Motor จะหมุนไปที่ตำแหน่ง 180 องศา และ หยุดเป็นเวลา 1 วินาที
    จากนั้นจะหมุนกลับไปที่ตำแหน่ง 0 องศา และวนรอบไปเช่นนี้เรื่อยๆ
    โค้ดตัวอย่างการควบคุมตำแหน่ง RC Servo Motor แบบ Sweep
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <Servo.h>
    Servo myservo;        //create servo object to control a servo
                                  // a maximum of eight servo objects can be created
    int pos = 0;             // variable to store the servo position
    void setup(){
           myservo.attach(9); // attaches the servo on pin 9 to the servo object
    }
     
    void loop(){
           for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees
          {
                myservo.write(pos); // tell servo to go to position in variable 'pos'
                delay(15); // waits 15ms for the servo to reach the position
           }
           for(pos = 180; pos>=1; pos-=1)// goes from 180 degrees to 0 degrees
          {
                myservo.write(pos); // tell servo to go to position in variable 'pos'
               delay(15); // waits 15ms for the servo to reach the position
          }
    }
    ผลการทำงานของโค้ด
    for(pos = 0; pos < 180; pos += 1){
    myservo.write(pos);
    delay(15);
    }
                ลูป for กำหนดให้ค่า pos มีค่าเท่ากับ 0 และทุกๆ การทำงานคำสั่งภายใน for loop ค่า pos จะเพิ่มค่าขึ้น 1 ค่า จนจนถึง 180 ก็จะหลุดออกจาก loop
               ภายใน loop for คำสั่ง myservo.write(pos); ก็คือการกำหนดให้ Servo Motor หมุนไปยังตำแหน่ง มุมตามค่าในตัวแปร pos และหน่วงเวลา 15ms ด้วยคำสั่ง delay(15); ดังนั้น Servo Motor จะค่อยๆ หมุนอย่างช้าๆ จากตำแหน่ง 0 องศาไปที่ 180 องศา
    for(pos = 180; pos>=1; pos-=1)
    {
    myservo.write(pos);
    delay(15);
    }
               ใน loop for ที่สองนี้จะทำงานเช่นเดียวกับใน loop for แรกเพียงแต่เปลี่ยนค่าเริ่มต้นจาก 180 เป็น 0 และลดลงค่าลง 1 ค่าทุกๆ การทำงาน 1 รอบ ส่งผลให้ Servo Motor จะหมุนจากตำแหน่งมุม 180 องศา ไปยังมุม 0 องศาอย่างช้าๆ 
               !!! ทดลองเพิ่มค่าในคำสั่ง delay() ให้มากขึ้นจะพบว่า Servo Motor จะหมุนช้าลงและในทางกลับกันหากลดค่าใน delay() ลงจะพบว่า Servo Motor จะหมุนเร็วขึ้น

    ตัวอย่างการควบคุมตำแหน่ง RC Servo Motor โดยใช้ Potentiometer
    13
    โค้ดตัวอย่างการควบคุมตำแหน่ง RC Servo Motor โดยใช้ Potentiometer
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <Servo.h>
    Servo myservo; // create servo object to control a servo
    int potpin = 0; // analog pin used to connect the potentiometer
    int val; // variable to read the value from the analog pin
     
      
     
    void setup(){
             myservo.attach(9); // attaches the servo on pin 9 to the servo object
    }
    void loop(){
             val = analogRead(potpin); // reads the value of the potentiometer (value // between 0 and 1023)
             val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value
                                                            // between 0 and 180)
             myservo.write(val); // sets the servo position according to the
                                          // scaled value
             delay(15); // waits for the servo to get there
    }
    ผลการทำงานของโค้ด
    val = analogRead(potpin);
               อ่านค่า Analog จาก Potentiometer ที่ต่ออยู่ที่ขา A0 เก็บไว้ในตัวแปร val
    val = map(val, 0, 1023, 0, 179);
               เนื่องจาก ADC ภายใน Arduino เป็น ADC ขนาด 10-bit จึงอ่านค่า Analog ได้ตั้งแต่ 0 – 1023 แต่ RC Servo Motor สามารถหมุนได้เพียงแค่ 1-180 องศา จึงต้องใช้ Function map เพื่อทำการสเกลค่าลงจาก 0-1023 เป็น 0-179 แล้วนำไปเก็บไว้ในตัวแปร val
    myservo.write(val);
               เมื่อสเกลค่า จาก 0-1023 ลงเหลือ 0-179 แล้วก็นำมาสั่งให้ Servo Motor หมุนไปยังตำแหน่งในค่าตัวแปร val
    delay(15);
               หน่วงเวลา 15 ms
    ผลของการทำงานทำให้สามารถปรับตำแหน่งองศาของ Servo Motor ได้โดยการหมุนปรับค่า Potentiometer

    Continuous Rotation Servo
    14
               Continuous Rotation Servo คือ RC Servo Motor แบบที่สามารถหมุนได้ 360 องศา ส่วนประกอบภายนอกนั้นจะมีหน้าตาคล้ายกับ RC Servo Motor แบบที่หมุนได้ 180 องศา เพียงแต่จะมี Potentiometer เพื่อใช้สำหรับปรับ ตำแหน่ง Center Stop Adjust ของตัว Servo
               ลักษณะการใช้งาน RC Servo Motor ชนิดนี้จะแตกต่างจากการใช้งาน RC Servo Motor แบบ 180 องศาตรงที่ Servo ชนิดนี้จะใช้ความกว้างของสัญญาณพัลซ์ในการกำหนดความเร็วและทิศทางในการหมุน ไม่ได้ใช้เพื่อกำหนดมุมจึงไม่สามารถกำหนดให้ Motor หมุนไปยังตำแหน่งมุมต่างๆ ตามความต้องการได้ สัญญาณความกว้างของพัลซ์ที่ใช้ควบคุมจะอยู่ในช่วง 1000-2000 us แต่จะมีความแตกในความหมายของแต่ละความกว้างของพัลซ์ดังนี้
               ความกว้าง 1000 us หมายถึงการหมุนไปทางซ้ายด้วยความเร็วสูงสุดที่ Servo Motor จะหมุนได้
    15
                ความกว้าง 1500 us หมายถึงการสั่งให้ Servo Motor หยุดหมุน
    16
                ความกว้าง 2000 us หมายถึงการหมุนไปทางขวาด้วยความเร็วสูงสุดที่ Servo Motor จะหมุนได้
    17
    การ Calibrate Center Stop
                ในการใช้งาน Continuous Rotation Servo เมื่อซื้อมาใหม่หรือใช้งานไปสักระยะหนึ่งจุด Center Stop อาจมีการคลาดเคลื่อนได้ ซึ่งแม้เราสั่งให้สัญญาณพัลซ์มีความกว้างเท่ากับ 1500 us ไป Continuous rotation servo ก็จะไม่หยุดหมุน เราจึงต้องปรับตั้งค่า Center Stop ดังนี้
    - ต่อ Continuous rotation servo เข้ากับ Arduino
    18
    - เขียนโปรแกรมจ่ายความกว้างพัลซ์ 1500 us ให้กับ Servo Motor
    #include <Servo.h>
    Servo myServo;
    void setup() {
              myServo.attach(9);
              myServo.writeMicroseconds(1500); // Stop
    }
    - เมื่อรันโปรแกรมจ่ายความกว้างพัลซ์ 1500 us แล้ว Servo Motor ไม่หยุดหมุน ให้ใช้ไขควงขนาดเล็กหมุนปรับ Center Stop Adjust จน Servo Motor หยุดหมุน

    19
    การควบคุม Continuous Rotation Servo โดยใช้ Potentiometer ปรับความเร็วและทิศทางการหมุน
    20
    โค้ดตัวอย่างการควบคุม Continuous Rotation Servo โดยใช้ Potentiometer

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <Servo.h>
    Servo myservo; // create servo object to control a servo
    int potpin = 0; // analog pin used to connect the potentiometer
    int val; // variable to read the value from the analog pin
    void setup(){
              myservo.attach(9); // attaches the servo on pin 9 to the servo object
    }
    void loop(){
              val = analogRead(potpin); // reads the value of the potentiometer (value // between 0 and 1023)
              val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value // between 0 and 180)
              myservo.write(val); // sets the servo position according to the scaled value
              delay(15); // waits for the servo to get there
    }

    !!! โค้ดเหมือนกับตัวอย่าง RC Servo Motor โดยใช้ Potentiometer แต่ผลการทำงานจะแตกต่างกัน
    ผลการทำงานของ Code
    val = analogRead(potpin);
              อ่านค่า Analog จาก Potentiometer ที่ต่ออยู่ที่ขา A0 เก็บไว้ในตัวแปร val
    val = map(val, 0, 1023, 0, 179);
              เนื่องจาก ADC ภายใน Arduino เป็น ADC ขนาด 10-bit จึงอ่านค่า Analog ได้ตั้งแต่ 0-1023 แต่ Continuous Rotation Servo รับค่าได้ในช่วง 1-180 จึงต้องใช้ Function map เพื่อสเกลค่าจาก 0-1023 เป็น 0-179 แล้วนำไปเก็บไว้ในตัวแปร val
    myservo.write(val);
              เมื่อสเกลค่า จาก 0-1023 ลงเหลือ 0-179 แล้วก็นำมาสั่งให้ Servo Motor หมุนในความเร็วและ ทิศทางตามค่าความกว้างของพัลซ์ที่จ่ายออกไป
    delay(15);
              หน่วงเวลา 15 ms
              ผลของการทำงานในโค้ดนี้จะเห็นได้ว่า หากปรับ Potentiometer ไปทางด้านใดด้านหนึ่งจนสุด Continuous Rotation Servo จะหมุนในทิศทางหนึ่งด้วยความเร็วสูงสุดและเมื่อเราค่อยๆ ปรับ Potentiometer กลับมาให้มาอยู่ในตำแหน่งกึ่งกลาง Servo Motor จะค่อยหมุนช้าลงแต่ยังหมุนในทิศทางเดิม และจะหยุดสนิทหากเราปรับ Potentiometer มาที่ตำแหน่งกึ่งกลางพอดี เมื่อปรับ Potentiometer เกินกว่า ครึ่งหนึ่งในทิศตรงกันข้าม Servo Motor จะเปลี่ยนทิศการหมุน แต่จะหมุนอย่างช้าๆ และจะค่อยๆหมุนเร็วขึ้นเมื่อเราปรับ Potentiometer มากขึ้น