Servo Controller
สิ่งที่ได้ - ได้ปรับความเข้าใจเกี่ยวกับความรู้เรื่อง Servo motorกับพี่ไทรได้รู้เพิ่มเติมว่าservo motorนั้นมีคุณสมบัติที่สำคัญคือ นอกจากServo motor จะสมารถควบคุมPositionแล้วยังสามารถรักษาตำแหน่งเดิมของมันได้อีกด้วย เช่น เม่ือเราสั่งให้servo motor หมุนไปที่60องศา จากนั้นเราใส่แรงภายนอกผลักmotorให้หมุนไปทางอื่นservo motorจะพยายามที่จะคงตำแหน่งเดิมไว้ไม่ว่าเราจะผลัก จะเลื่อนไปตำแหน่งใดก็ตาม
และยังได้รู้จักกับRC Servo motor หรือservo motorที่ควบคุมด้วยสัญญาณวิทยุ (Radio Controller) โดยการควบคุมนั้นจะใช้สัญญาณPulse(พัลส์) เป้นตัวควบคุมโดยซึ่งมีความกว้าง1-2 milliseconds (ms)
RC Servo นั้นมีสายสามเส้นเช่นเดียวกับServoทั่วไปคือ 1.สายไฟ(VDD) 2.สายกราวด์(GND) 3.สายData(สายสัญญาณ)
torque และรอบของServo นันมีความสัมพันธ์กับความต่างศักย์ไฟฟ้า ซึ่งในServoส่วนมากสามารถรับไฟในช่วง4.8-6.0 volt ได้ โดยรอบและtorque จะเพิ่มขึ้นเมื่อเราจ่ายกระแสไฟเข้าไปมาก
Servoจะทำงานได้ก็ต่อเมื่อมีไฟเลี้ยงพอแต่หาก ไฟน้อยหรือมากกว่าที่กำหนดไว้Servoก็จะไม่ทำงานหรืออาจชำรุดเสียหายได้
-ได้ทดสอบนำcodeจากSimulatorมาต่อวงจรเข้ากับboardและสั่งควบคุมPosition ของServo motorให้ได้ตามที่codingไว้ ผลที่ได้พบว่าServoสามารถทำงานได้จริงดังคลิปที่ถ่ายไว้
ซึ่งนอกจากนี้พี่ไทรยังแนะนำให้ผมรู้จักกับfunction ที่มีชื่อว่าmap(value,fromLow,
fromHigh,toLow,toHigh); ซึ่งป็นfunctionที่เกี่ยวกับบัญญัติไตรยางค์ การเทียบค่าหนึ่งไปสู่ค่าหนึ่ง
โดยก่อนหน้านี้ในตอนแรกที่ผมcodingจากSimulatorนั้น ผมเทียบออกมาก่อนแล้วค่อยใช้ตัวรทอนเอา ซึ่งเมื่อได้ลองเอาmap(); มาใช้ผมก็รู้ว่ามันมีประโยชน์มาก
หลังจากนั้นผมลองหาข้อมูลเกี่ยวกับPulseได้พบว่าเราสามารถกำหนดค่าความกว้างของ คาบ(T) ในสัญญาณPulseได้ โดยความกว้างของคาบนั้นจะเกี่ยวข้องโดยตรงกับPositionของServoโดยตรงจากรูป
ทำให้เราจะสามารถเขียนcodeในการควควมServoได้โดยการกำหนดช่วงคาบที่แทนด้วยเวลาเป้นMicro Second (us) โดยคำสั่งที่ใช้คือ myservo.writeMicrosecounds(time); ในวงเล็บจะเป้นค่าที่เราไว้ใช้กำหนดคาบของPulseในหน่วยusตามที่กล่าวข้างต้น
7 Segment Tip from P'Sai
จากปัญหาที่ได้noteไว้ใน 'Arduino note 9/3/15' ที่บอกไว้ว่าไม่รู้เกี่ยวกับpinไหนเป็นอันไหนของ7Segment วันนี้พี่ไทรก้ได้มาบอกเพิ่มเติม : คือปกติในตัววงจร7Segmentนั้นจะใช้คำสังในการสั่ง8บรรทัด(line 7 pin + dot 1 pin) แต่ในboard FunBasic I/O เราสามารถกำหนดให้เปิดปิดเลขในหลักใดๆได้ โดยใช้logic 0 ในการเปิดเลขหลักนัันๆ และlogic 1 ในการปิดเลขหลักนั้นๆในบรรทัดต่อไปได้เลย เช่นสมติว่าเราต้องการให้เลขหนึ่งปรากฏในหลักA2 D4 เป้นต้นจะได้ว่า
void loop(){
digitalWrite(a, 0);
digitalWrite(b, 0);
digitalWrite(c, 0);
digitalWrite(d,0);
digitalWrite(e, 1);
digitalWrite(f, 1);
digitalWrite(g,0);
digitalWrite(13, 0);
digitalWrite(A2.0);
digitalWrite(D4.0);
digitalWrite(D5,1);
delay(1000);
}
ซึ่งพี่ไทรก้ได้ให้โจทย์มาว่าเปิดไฟในเลข1 หลักA2 เลข2หลักD4 และเลข3ในหลักD5 โดยให้ตัวเลขวิ่งสลับเปิดปิดกันไปมาเรียงลำดับ และเมื่อเพิ่มค่าใน Potentiometer และไฟจะวิ่งด้วยตวามถี่มากขึ้นเรื่อยๆ จนเมื่อถึงค่าๆหนึง ไฟทั้ง3จะวิ่งด้วยความถี่ที่เร็วจนเรามาองเห็นว่าทั้ง3ตัวเลขติดพร้อมกัน
Plan: 1.สร้างตัวเเปรvalueที่ใช้เก็บค่าที่รับจาก potentiometer
2.ในส่วนของvoid setup() ให้กำหนดค่าความเร้วในการรับข้อมุลเข้าด้วยคำสั่งSerial.begin(9600); กำหนดpinที่ใช้ของตัวหลอดไฟ *อย่าลืมกำหนดpinของหลักตัวเลข A2 D4 และD5 ด้วย*
3.ให้รับค่าจากpotentiometerเข้าไปเก็บในตัวเเปรvalue โดยใช้คำสั่งvalue=analogRead(pot entiometer);
4.จากนั้นให้ปริ้นค่าที่รับในSerial monitor => Serial.println(value);
5.สั่งตัวเลขในแต่ละหลักตามที่ต้องการ และใส่ค่าหน่วงเวลาเป้นนานเท่าvalue =>delay(va lue);
6.complies โปรแกรมใส่boardและลองปรับค่า เช็คว่าได้ตามที่codingไว้หรือไม่?
หลังจากที่ทำการทดสอบพบว่าเมื่อcompliesเสร็จและลองปรับค่าพบว่าไฟสามารถวิ่งมีความถี่จนเรามองเห็นทั้ง3ตัวเลขพร้อมกัน แต่เมื่อเราหมุนค่าpotentiometerไปต่ำสุด(ต่ำกว่าประมาณ15เช็คจากSerial monitor) ไฟจะเกิดbug เห็นเลข3ในหลักสุดท้ายค่าเดียว ส่วนหลักอื่นๆ ค่าไม่ชัดเจนดังคลิปต่อไปนี้
ไม่มีความคิดเห็น:
แสดงความคิดเห็น