801S Vibration Sensor vibration module โมดูลตรวจจับความสันไหวปรับความไวได้
Vibration Sensor Module ใช้เซนเซอร์เบอร์ 801S ในการตรวจจับความเคลื่อนไหว
คุณภาพสูง ใช้ไฟเลี้ยง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
}
ตัวอย่าง VDO
https://www.youtube.com/watch?v=7FkL_tyRbQA
อ้างอิง
www.myarduino.net/product/34/801s-vibration-sensor-vibration-module-โมดูลตรวจจับความสันไหวปรับความไวได้
วันจันทร์ที่ 6 กุมภาพันธ์ พ.ศ. 2560
Dust Sensor (ตรวจจับควันและฝุ่นละออง)
Dust Sensor (ตรวจจับควันและฝุ่นละออง)
Dust Sensor เป็น Sensor ใช้สำหรับตรวจจับควันและฝุ่นละอองในอากาศ ค่าที่ได้ออกมาเป็น Analog 1-1023 ลักษณะการทำงานคือ Sensor จะส่งแสงเลเซอร์ ไปกระทบกับตัวรับ และให้อากาศผ่านในช่อง หากการรับแสงมีน้อยแสดงว่าฝุ่นละออกเยอะ หากมีการรับแสงได้มากแสดงว่าฝุ่นละอองน้อย สามารถวัด ควันธูป แป้ง ฝุ่น ได้ นำไปประยุคใช้กับ Air purifier, Air conditioner, Air monitor
ข้อมูลเพิ่มเติม
- datasheets : https://www.sparkfun.com/datasheets/Sensors/gp2y1010au_e.pdf
ตัวอย่าง Code
int measurePin = A1;int ledPower = 12;int samplingTime = 280;int deltaTime = 40;int sleepTime = 9680;int voMeasured = 0;float calcVoltage = 0;float dustDensity = 0;int totalvoMeasured = 0;float totaldustDensity = 0;#include <Arduino.h>#include <TM1637Display.h>// Module connection pins (Digital Pins)#define CLK 2#define DIO 3// The amount of time (in milliseconds) between tests#define TEST_DELAY 2000TM1637Display display(CLK, DIO);void setup(){Serial.begin(9600);pinMode(ledPower,OUTPUT);display.setBrightness(0xF);uint8_t data[] = { 0x0, 0x0, 0x0, 0x0 };display.setSegments(data);pinMode(4, OUTPUT);pinMode(5, OUTPUT);pinMode(6, OUTPUT);}void loop(){for (int i=1; i <= 10; i++){digitalWrite(ledPower,LOW); // power on the LEDdelayMicroseconds(samplingTime);voMeasured = analogRead(measurePin); // read the dust valuedelayMicroseconds(deltaTime);digitalWrite(ledPower,HIGH); // turn the LED offdelayMicroseconds(sleepTime);calcVoltage = voMeasured * (3.3 / 1024);/* if(voMeasured<=85){ //ตั้งค่าvoMeasured = 0;}else{voMeasured = voMeasured-85;}*/voMeasured = map(voMeasured, 80, 418, 0, 100);if(voMeasured<=0){voMeasured = 0;}dustDensity = 0.17 * calcVoltage - 0.1;totalvoMeasured = voMeasured+totalvoMeasured;totaldustDensity = dustDensity+totaldustDensity;delay(100);}totalvoMeasured = totalvoMeasured/10;totaldustDensity = totaldustDensity/10;Serial.print("Raw Signal Value (0-100): ");Serial.print(totalvoMeasured);Serial.print(" - Dust Density: ");Serial.println(totaldustDensity);uint8_t segto;display.showNumberDec(totalvoMeasured); //แสดง ใน 7 segmentdelay(500);if(totalvoMeasured <= 40){digitalWrite(4, LOW);digitalWrite(5, LOW);digitalWrite(6, LOW);}else if (totalvoMeasured <= 60){digitalWrite(4, HIGH);digitalWrite(5, LOW);digitalWrite(6, LOW);}else if (totalvoMeasured <= 80){digitalWrite(4, LOW);digitalWrite(5, HIGH);digitalWrite(6, LOW);}else{digitalWrite(4, LOW);digitalWrite(5, LOW);digitalWrite(6, HIGH);}totalvoMeasured = 0;totaldustDensity = 0;delay(500);}
อ้างอิง
https://www.9arduino.com/product/145/dust-sensor-ตรวจจับควันและฝุ่นละออง-gp2y1010au0f
การใช้งาน โมดูลวัดระยะทาง
การใช้งาน โมดูลวัดระยะทาง Ultrasonic Module Distance Measuring Transducer Sensor กับ Arduino
การวัดระยะทางโดยใช้ โมดูล Ultrasonic ร่วมกับ Arduino สามารถทำได้ง่าย อุปกรณ์โมดูล Ultrasonic มีความแม่นยำในการวัดระยะทาง การทำงานเป็นแบบคลื่นสะท้อนกลับแล้วนำมาคำนวน จึงเหมาะสำหรับมาใช้ในการหลบหลีกสิ่งกีดขวาง ตรวจจับวัตถุที่อยู่ในรัศมีที่ต้องการ
วิธีการต่อขา ใช้งาน โมดูลวัดระยะทาง Ultrasonic Module Distance Measuring Transducer Sensor กับ Arduino
- Vcc - 5v
- Gnd - Gnd
- Trig - 13
- Echo - 12
ตัวอย่างโคด Arduino ใช้งาน โมดูลวัดระยะทาง Ultrasonic Module Distance Measuring Transducer Sensor
const int pingPin = 13;
int inPin = 12;
void setup() {
Serial.begin(9600);
}
void loop()
{
long duration, cm;
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
pinMode(inPin, INPUT);
duration = pulseIn(inPin, HIGH);
cm = microsecondsToCentimeters(duration);
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(100);
}
long microsecondsToCentimeters(long microseconds)
{
// The speed of sound is 340 m/s or 29 microseconds per centimeter.
// The ping travels out and back, so to find the distance of the
// object we take half of the distance travelled.
return microseconds / 29 / 2;
}
อ้างอิง
https://www.arduinoall.com/article/13/การใช้งาน-โมดูลวัดระยะทาง-ultrasonic-module-distance-measuring-transducer-sensor-กับ-arduino-ภายใน-3-นาที
PIR เซนเซอร์ตรวจจับความเคลื่อนไหว Motion Sensor Module
ตรวจจับความเคลื่อนไหวจากความร้อน เมื่อมีคนเดินผ่านก็จะจับค่าความร้อนที่เปลี่ยนแปลง แล้วส่งค่าสัญญาณมีไฟ ออกมา ในกรณีที่ไม่มีการเปลี่ยนแปลงส่งค่าไม่มีไฟ ออกมา เราสามารถนำค่านี้ไปสั่งควบคุม Arduino ได้ สามารถปรับเวลาหน่วงเวลาในการตรวจจับครั้งต่อไปได้ ปรับระยะทางการตรวจจับได้ 3-7 เมตร มีช่องให้ต่อ LDR เพิ่ม เพื่อให้ทำงานตรวจจับแค่ตอนกลางคืน
รายละเอียด PIR เซนเซอร์ตรวจจับความเคลื่อนไหว Motion Sensor Module
- Dimension: 3.2cm x 2.4cm x 1.8cm (approx)
- Infrared sensor with control circuit board
- The sensitivity and holding time can be adjusted
- Working Voltage Range: DC 3V- 5V
- Current drain:<60uA
- Voltage Output: High/Low level signal:3.3V TTL output
- Detection distance: 3--7M(can be adjusted)
- Detection range: <140°
- Delay time: 5-200S(can be adjusted, default 5s +-3%)
- Blockade time: 2.5 S (default)
- Trigger: L: Non-repeatable trigger H: Repeat Trigger (default)
- Work temperature:-20-+80°C
- Trigger Method: L unrepeatable trigger / H repeatable trigger
ตัวอย่างโคด Code Arduino PIR Motion Sensor Module
int ledPin= 13;
int inputPin= 3;
void setup(){
pinMode(ledPin, OUTPUT);
pinMode(inputPin, INPUT);
}
void loop(){
int value= digitalRead(inputPin);
if (value == HIGH)
{
digitalWrite(ledPin, HIGH);
delay(1000) ;
}
else
{
digitalWrite(ledPin, LOW);
}
}
อ้างอิง
https://www.arduinoall.com/product/29/pir-เซนเซอร์ตรวจจับความเคลื่อนไหว-motion-sensor-module
การเชื่อมต่อ RC Servo Motor เข้ากับบอร์ด Arduino
ตัวอย่างการเชื่อมต่อ RC Servo Motor เข้ากับบอร์ด Arduino
อุปกรณ์ 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);
}
ผลการทำงานของโค้ด
myservo.write(0);
delay(1000);
Servo Motor จะหมุนไปที่ตำแหน่ง 0 องศา และ หยุดเป็นเวลา 1 วินาที
myservo.write(90);
delay(1000);
Servo Motor จะหมุนไปที่ตำแหน่ง 90 องศา และ หยุดเป็นเวลา 1 วินาที
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
โค้ดตัวอย่างการควบคุมตำแหน่ง 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
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 จะหมุนได้
ความกว้าง 1500 us หมายถึงการสั่งให้ Servo Motor หยุดหมุน
ความกว้าง 2000 us หมายถึงการหมุนไปทางขวาด้วยความเร็วสูงสุดที่ Servo Motor จะหมุนได้
การ Calibrate Center Stop
ในการใช้งาน Continuous Rotation Servo เมื่อซื้อมาใหม่หรือใช้งานไปสักระยะหนึ่งจุด Center Stop อาจมีการคลาดเคลื่อนได้ ซึ่งแม้เราสั่งให้สัญญาณพัลซ์มีความกว้างเท่ากับ 1500 us ไป Continuous rotation servo ก็จะไม่หยุดหมุน เราจึงต้องปรับตั้งค่า Center Stop ดังนี้
- ต่อ Continuous rotation servo เข้ากับ Arduino
- เขียนโปรแกรมจ่ายความกว้างพัลซ์ 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 หยุดหมุน
การควบคุม Continuous Rotation Servo โดยใช้ Potentiometer ปรับความเร็วและทิศทางการหมุน
โค้ดตัวอย่างการควบคุม 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 มากขึ้น
อ้างอิง
http:// www.thaieasyelec.com/article-wiki/review-product-article/บทความตัวอย่างการควบคุม-rc-servo-motor-ด้วย-arduino.html
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); } |
delay(1000);
Servo Motor จะหมุนไปที่ตำแหน่ง 0 องศา และ หยุดเป็นเวลา 1 วินาที
delay(1000);
Servo Motor จะหมุนไปที่ตำแหน่ง 90 องศา และ หยุดเป็นเวลา 1 วินาที
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 } } |
myservo.write(pos);
delay(15);
}
{
myservo.write(pos);
delay(15);
}
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 } |
อ่านค่า 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
ลักษณะการใช้งาน RC Servo Motor ชนิดนี้จะแตกต่างจากการใช้งาน RC Servo Motor แบบ 180 องศาตรงที่ Servo ชนิดนี้จะใช้ความกว้างของสัญญาณพัลซ์ในการกำหนดความเร็วและทิศทางในการหมุน ไม่ได้ใช้เพื่อกำหนดมุมจึงไม่สามารถกำหนดให้ Motor หมุนไปยังตำแหน่งมุมต่างๆ ตามความต้องการได้ สัญญาณความกว้างของพัลซ์ที่ใช้ควบคุมจะอยู่ในช่วง 1000-2000 us แต่จะมีความแตกในความหมายของแต่ละความกว้างของพัลซ์ดังนี้
ความกว้าง 1000 us หมายถึงการหมุนไปทางซ้ายด้วยความเร็วสูงสุดที่ Servo Motor จะหมุนได้
ในการใช้งาน Continuous Rotation Servo เมื่อซื้อมาใหม่หรือใช้งานไปสักระยะหนึ่งจุด Center Stop อาจมีการคลาดเคลื่อนได้ ซึ่งแม้เราสั่งให้สัญญาณพัลซ์มีความกว้างเท่ากับ 1500 us ไป Continuous rotation servo ก็จะไม่หยุดหมุน เราจึงต้องปรับตั้งค่า Center Stop ดังนี้
- ต่อ Continuous rotation servo เข้ากับ Arduino
Servo myServo;
void setup() {
myServo.attach(9);
myServo.writeMicroseconds(1500); // Stop
}
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 } |
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 มากขึ้น
สมัครสมาชิก:
บทความ (Atom)