เนื่องจาก Servo Motor จำเป็นต้องสั่งงานโดยกำหนดองศาการทำงานให้ ดังนั้นการหาตำแหน่งเซอโวที่ต้องการ จึงค่อนข้างจำเป็นมากในหุ่นยนต์ขนาดเล็ก
เราทราบแล้วว่าเซอโวมอเตอร์จะทำงานได้แค่ 0 - 180 ํ และ analog อ่านค่าได้ 0-1023 บทความนี้จะใช้หลักการอ่านค่า analog จาก0-1023 อ่านจากvr หรือ Knob ซึ่งต่ออยู่ Pin analog 7 มาแปลงเป็นค่า 0 - 180 คือองศาเซอโว พร้อมทั้งแสดงตำแหน่งองศาอยู่ที่หน้าจอ Oled
map(value, fromLow, fromHigh, toLow, toHigh)
โดยที่
value = ค่าที่ต้องหารแปลง
fromLow = จากค่าต่ำสุด
fromHigh = จากค่าสูงสุด
toLow = แปลงเป็นค่าต่ำสุด
toHigh = แปลงเป็นค่าสูงสุด
บอร์ด TKL Nano Learning Bot
Servo Motor
ตรวจสอบการเชื่อมต่อมอเตอร์ให้ถูกต้อง โดยมีวิธีเช็คดังนี้
1. เสียบสาย servo motor ใน Pin 10 และ 11
การทดสอบต้องทดสอบตำแหน่งเซอโวทีละตัว เพื่อป้องกัน เซอโวเสียหาย
#include <SPI.h>
#include <Wire.h>
#include <Servo.h> //เรียกใช้งาน library เซอโว
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define Oled_RESET 4
Adafruit_SSD1306 Oled(Oled_RESET);
Servo sv1; // กำหนดชื่อเซอโวตัวที่ 1 ว่า sv1
const int buttonPin = 2; //ประกาศตัวแปร buttonPin แทน Pin ของปุ่มกด ซึ่งต่อไว้กับ D2
void setup() {
sv1.attach(10); //กำหนดขา Servo ตัวที่ 1 เป็น Pin 10
Oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
}
void loop(){
int sw = digitalRead(buttonPin);
if (sw == 1){
while(1) {
int vr = analogRead(A7); // กำหนดตัวแปรจำนวนเต็มอ่านค่าอนาล็อกที่พอร์ต 7
int nob = map(vr, 0, 1023, 0, 180); // ทำการ map อัตราส่วนจากสัญญาณ analog 0-1023 เป็น 0-180
Oled.clearDisplay(); // เคลียร์หน้าจอ display
Oled.setTextColor(WHITE, BLACK); //สีอักษรเป็นสีขาว ,พื้นหลังดำ
Oled.setCursor(0, 0); // เซตตำแหน่ง 0,0
Oled.setTextSize(2); // เซตขนาดอักษรมีขนาดเป็น 2
Oled.println(nob); // นำค่า nob มาแสดงใน display
Oled.display(); // เปิดฟังก์ชันแสดงผล
sv1.write(nob); // สั่งเซอร์โวมอเตอร์ให้หมุนไปตามค่าองศาที่ทำการ nob ไว้
delay(50); // หน่วงเวลา 0.05 วินาที
}
}
}