วันอาทิตย์ที่ 15 มีนาคม พ.ศ. 2558

Arduino note 13/3/15 Servo Controller & 7 Segment Tip from P'Sai

Arduino note 13/3/15

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ในหลักสุดท้ายค่าเดียว ส่วนหลักอื่นๆ ค่าไม่ชัดเจนดังคลิปต่อไปนี้



ไม่มีความคิดเห็น:

แสดงความคิดเห็น