ในบทช่วยสอนนี้เราจะพัฒนาวงจรโดยใช้เซ็นเซอร์ FLEX, Arduino Uno และเซอร์โวมอเตอร์ โครงการนี้เป็นระบบควบคุมเซอร์โวที่ตำแหน่งเพลาเซอร์โวถูกกำหนดโดยการงอหรืองอหรือเบี่ยงเบนของเซ็นเซอร์ FLEX
ก่อนอื่นมาพูดถึงเซอร์โวมอเตอร์กันก่อน ใช้เซอร์โวมอเตอร์ในกรณีที่จำเป็นต้องมีการเคลื่อนที่หรือตำแหน่งของเพลาที่ถูกต้อง สิ่งเหล่านี้ไม่ได้เสนอสำหรับการใช้งานความเร็วสูง สิ่งเหล่านี้เสนอสำหรับความเร็วต่ำแรงบิดปานกลางและการใช้งานตำแหน่งที่แม่นยำ มอเตอร์เหล่านี้ใช้ในเครื่องจักรแขนกลระบบควบคุมการบินและระบบควบคุม เซอร์โวมอเตอร์ใช้ในระบบฝังตัวเช่นเครื่องหยอดเหรียญเป็นต้น
เซอร์โวมอเตอร์มีให้เลือกหลายรูปแบบและขนาด เซอร์โวมอเตอร์ส่วนใหญ่จะมีสายไฟสายหนึ่งสำหรับแรงดันไฟฟ้าบวกอีกสายหนึ่งสำหรับกราวด์และสุดท้ายคือการกำหนดตำแหน่ง สายสีแดงเชื่อมต่อกับพลังงานสายสีดำเชื่อมต่อกับกราวด์และสายสีเหลืองเชื่อมต่อกับสัญญาณ
เซอร์โวมอเตอร์เป็นการรวมกันของมอเตอร์กระแสตรงระบบควบคุมตำแหน่งเกียร์ ตำแหน่งของเพลาของมอเตอร์กระแสตรงจะถูกปรับโดยอุปกรณ์อิเล็กทรอนิกส์ควบคุมในเซอร์โวโดยพิจารณาจากอัตราส่วนหน้าที่ของสัญญาณ PWM ที่ขาสัญญาณ
เพียงแค่พูดอุปกรณ์อิเล็กทรอนิกส์ควบคุมจะปรับตำแหน่งเพลาโดยการควบคุมมอเตอร์ DC ข้อมูลเกี่ยวกับตำแหน่งของเพลานี้จะถูกส่งผ่านขาสัญญาณ ข้อมูลตำแหน่งไปยังส่วนควบคุมควรส่งในรูปแบบของสัญญาณ PWM ผ่านขาสัญญาณของเซอร์โวมอเตอร์
ความถี่ของสัญญาณ PWM (Pulse Width Modulated) อาจแตกต่างกันไปตามประเภทของเซอร์โวมอเตอร์ สิ่งสำคัญที่นี่คือ DUTY RATIO ของสัญญาณ PWM ตาม DUTY RATION อุปกรณ์อิเล็กทรอนิกส์ควบคุมปรับเพลา สำหรับเพลาที่จะเคลื่อนไปที่ 9o นาฬิกา TURN ON RATION จะต้องเป็น 1/18ie 1 มิลลิวินาทีของ 'เวลาเปิด' และ 17 มิลลิวินาทีของ 'เวลาปิด' ในสัญญาณ 18 มิลลิวินาที
สำหรับเพลาที่จะเลื่อนไปที่ 12o นาฬิกาเวลา ON ของสัญญาณต้องเป็น 1.5ms และเวลา OFF ควรเป็น 16.5ms อัตราส่วนนี้ถูกถอดรหัสโดยระบบควบคุมในเซอร์โวและจะปรับตำแหน่งตามนั้น
PWM นี้สร้างขึ้นโดยใช้ ARDUINO UNO ตอนนี้เรารู้แล้วว่าเราสามารถควบคุมเพลาเซอร์โวมอเตอร์ได้โดยเปลี่ยนอัตราส่วนหน้าที่ของสัญญาณ PWM ที่สร้างโดย Arduino Uno UNO มีฟังก์ชันพิเศษที่ช่วยให้เราระบุตำแหน่งของ SERVO ได้โดยไม่ต้องกังวลกับสัญญาณ PWM อย่างไรก็ตามสิ่งสำคัญคือต้องทราบการปันส่วนหน้าที่ PWM - ความสัมพันธ์ของตำแหน่งเซอร์โว เราจะพูดถึงรายละเอียดเพิ่มเติม
ตอนนี้ขอพูดคุยเกี่ยวกับFLEX SENSOR ในการเชื่อมต่อเซ็นเซอร์ FLEX กับ ARDUINO UNO เราจะใช้คุณลักษณะ ADC (Analog to Digital Conversion) 8 บิตเพื่อทำงาน เซ็นเซอร์ FLEX เป็นตัวแปลงสัญญาณที่เปลี่ยนความต้านทานเมื่อรูปร่างเปลี่ยนไป เซ็นเซอร์ FLEX มีความยาว 2.2 นิ้วหรือยาวนิ้ว ดังแสดงในรูป
เซ็นเซอร์ Flex เป็นตัวแปลงสัญญาณที่เปลี่ยนความต้านทานเมื่อพื้นผิวเชิงเส้นงอ ดังนั้นชื่อ flex sensor พูดง่ายๆคือความต้านทานขั้วของเซ็นเซอร์จะเพิ่มขึ้นเมื่อมันงอ ดังแสดงในรูปด้านล่าง
การเปลี่ยนแปลงความต้านทานนี้ไม่สามารถทำประโยชน์ใด ๆ ได้เว้นแต่เราจะอ่านได้ ตัวควบคุมที่อยู่ในมือสามารถอ่านโอกาสในแรงดันไฟฟ้าเท่านั้นและไม่มีอะไรน้อยไปกว่านั้นสำหรับสิ่งนี้เราจะใช้วงจรแบ่งแรงดันไฟฟ้าซึ่งเราสามารถได้รับการเปลี่ยนแปลงความต้านทานเมื่อแรงดันไฟฟ้าเปลี่ยนแปลง
ตัวแบ่งแรงดันเป็นวงจรตัวต้านทานและแสดงในรูป ในเครือข่ายตัวต้านทานนี้เรามีความต้านทานคงที่และความต้านทานตัวแปรอื่น ๆ ดังแสดงในรูป R1 ที่นี่คือความต้านทานคงที่และ R2 คือเซ็นเซอร์ FLEX ซึ่งทำหน้าที่เป็นตัวต้านทาน
จุดกึ่งกลางของสาขาถูกนำไปวัด ด้วยการเปลี่ยนแปลง R2 เรามีการเปลี่ยนแปลงที่ Vout ด้วยเหตุนี้เราจึงมีแรงดันไฟฟ้าที่เปลี่ยนแปลงตามน้ำหนัก
ตอนนี้สิ่งสำคัญที่ควรทราบก็คืออินพุตที่คอนโทรลเลอร์สำหรับการแปลง ADC นั้นต่ำถึง 50µAmp ผลการโหลดของตัวแบ่งแรงดันตามความต้านทานนี้มีความสำคัญเนื่องจากกระแสที่ดึงมาจาก Vout ของตัวแบ่งแรงดันจะเพิ่มเปอร์เซ็นต์ความผิดพลาดที่เพิ่มขึ้นในตอนนี้เราไม่จำเป็นต้องกังวลเกี่ยวกับผลการโหลด
FLEX SENSOR เมื่อความต้านทานงอจะเปลี่ยนไป เมื่อตัวแปลงสัญญาณนี้เชื่อมต่อกับวงจรแบ่งแรงดันไฟฟ้าเราจะมีแรงดันไฟฟ้าที่เปลี่ยนแปลงโดยมี FLEX บนตัวแปลงสัญญาณ แรงดันไฟฟ้าตัวแปรนี้เป็น FED ไปยังช่อง ADC ช่องใดช่องหนึ่งเราจะมีค่าดิจิตอลที่เกี่ยวข้องกับ FLEX
เราจะจับคู่ค่าดิจิทัลนี้กับตำแหน่งเซอร์โวด้วยสิ่งนี้เราจะมีการควบคุมเซอร์โวโดยเฟล็กซ์
ส่วนประกอบ
ฮาร์ดแวร์: Arduino Uno , แหล่งจ่ายไฟ (5v), ตัวเก็บประจุ 1000 uF, ตัวเก็บประจุ 100nF (3 ชิ้น), ตัวต้านทาน100KΩ, SERVO MOTOR (SG 90), ตัวต้านทาน220Ω, เซ็นเซอร์ FLEX
ซอฟต์แวร์: Atmel studio 6.2 หรือ Aurdino ทุกคืน
แผนภาพวงจรและคำอธิบาย
วงจรสำหรับการควบคุมเซอร์โวมอเตอร์โดยเซ็นเซอร์ FLEXจะแสดงในรูปด้านล่าง
แรงดันไฟฟ้าข้ามเซ็นเซอร์ไม่เป็นเส้นตรงอย่างสมบูรณ์ มันจะมีเสียงดัง ในการกรองสัญญาณรบกวนตัวเก็บประจุจะถูกวางไว้บนตัวต้านทานแต่ละตัวในวงจรแบ่งดังแสดงในรูป
ที่นี่เราจะนำแรงดันไฟฟ้าที่ได้มาจากตัวแบ่ง (แรงดันไฟฟ้าซึ่งแสดงถึงน้ำหนักเป็นเส้นตรง) และป้อนลงในช่อง ADC ของ Arduino UNO เราจะใช้ A0 สำหรับสิ่งนี้ หลังจากการเริ่มต้น ADC เราจะมีค่าดิจิตอลที่แสดงถึงเซ็นเซอร์งอ เราจะนำค่านี้ไปจับคู่กับตำแหน่งเซอร์โว
เพื่อให้สิ่งนี้เกิดขึ้นเราจำเป็นต้องสร้างคำแนะนำเล็กน้อยในโปรแกรมและเราจะพูดถึงรายละเอียดด้านล่าง
ARDUINO มีช่อง ADC หกช่องดังแสดงในรูป ในหนึ่งหรือทั้งหมดสามารถใช้เป็นอินพุตสำหรับแรงดันไฟฟ้าแบบอะนาล็อก UNO ADC มีความละเอียด 10 บิต (ดังนั้นค่าจำนวนเต็มตั้งแต่ (0- (2 ^ 10) 1023)) ซึ่งหมายความว่าจะจับคู่แรงดันไฟฟ้าอินพุตระหว่าง 0 ถึง 5 โวลต์เป็นค่าจำนวนเต็มระหว่าง 0 ถึง 1023 ดังนั้นสำหรับทุกๆ (5/1024 = 4.9mV) ต่อหน่วย
ที่นี่เราจะใช้ A0 ของ UNO
เราจำเป็นต้องรู้บางสิ่ง
|
ก่อนอื่นช่อง UNO ADC มีค่าอ้างอิงเริ่มต้นที่ 5V ซึ่งหมายความว่าเราสามารถให้แรงดันไฟฟ้าอินพุตสูงสุด 5V สำหรับการแปลง ADC ที่ช่องอินพุตใดก็ได้ เนื่องจากเซ็นเซอร์บางตัวให้แรงดันไฟฟ้าตั้งแต่ 0-2.5V ด้วยการอ้างอิง 5V เราจึงมีความแม่นยำน้อยกว่าดังนั้นเราจึงมีคำสั่งที่ช่วยให้เราสามารถเปลี่ยนค่าอ้างอิงนี้ได้ ดังนั้นสำหรับการเปลี่ยนค่าอ้างอิงเรามี (“ analogReference ();”) สำหรับตอนนี้เราปล่อยให้เป็น
ตามค่าเริ่มต้นเราจะได้รับความละเอียด ADC สูงสุดของบอร์ดซึ่งเป็น 10 บิตความละเอียดนี้สามารถเปลี่ยนแปลงได้โดยใช้คำสั่ง (“ analogReadResolution (bits);”) การเปลี่ยนแปลงความละเอียดนี้อาจมีประโยชน์ในบางกรณี สำหรับตอนนี้เราปล่อยไว้เป็น
ตอนนี้หากเงื่อนไขข้างต้นถูกตั้งค่าเป็นค่าเริ่มต้นเราสามารถอ่านค่าจาก ADC ของช่อง '0' ได้โดยการเรียกใช้ฟังก์ชัน "analogRead (พิน)" โดยตรงในที่นี้ "พิน" หมายถึงพินที่เราเชื่อมต่อสัญญาณแอนะล็อกในกรณีนี้ จะเป็น“ A0”
ค่าจาก ADC สามารถนำมาเป็นจำนวนเต็มเป็น "int SENSORVALUE = analogRead (A0); ” โดยคำสั่งนี้ค่าหลังจาก ADC จะถูกเก็บไว้ในจำนวนเต็ม“ SENSORVALUE”
ตอนนี้เรามาพูดถึง SERVO กันดีกว่า UNO มีคุณสมบัติที่ช่วยให้เราสามารถควบคุมตำแหน่งเซอร์โวได้เพียงแค่ให้ค่าองศา สมมติว่าเราต้องการให้เซอร์โวอยู่ที่ 30 เราสามารถแทนค่าในโปรแกรมได้โดยตรง ไฟล์ส่วนหัว SERVO จะดูแลการคำนวณอัตราส่วนหน้าที่ทั้งหมดภายใน
# รวม
เซอร์โวเซอร์โว; เซอร์โวแนบ (3); servo.write (องศา); |
คำสั่งแรกแสดงถึงไฟล์ส่วนหัวสำหรับควบคุม SERVO MOTOR
คำสั่งที่สองคือการตั้งชื่อเซอร์โว เราปล่อยให้มันเป็นเซอร์โวเอง
คำสั่งที่สามระบุว่าขาสัญญาณเซอร์โวเชื่อมต่ออยู่ที่ไหน ต้องเป็นพิน PWM ที่นี่เรากำลังใช้ PIN3
คำสั่งที่สี่ให้คำสั่งสำหรับการกำหนดตำแหน่งเซอร์โวมอเตอร์และมีหน่วยเป็นองศา ถ้าให้ 30 เซอร์โวมอเตอร์จะหมุน 30 องศา
ตอนนี้ sg90 สามารถเคลื่อนที่ได้ตั้งแต่ 0-180 องศาเรามีผลลัพธ์ ADC 0-1024
ดังนั้น ADC จึงมีค่าประมาณหกเท่าของตำแหน่ง SERVO ดังนั้นเมื่อหารผล ADC ด้วย 6 เราจะได้ตำแหน่งมือ SERVO โดยประมาณ
ด้วยสิ่งนี้เราจะมีค่าตำแหน่งเซอร์โวที่ป้อนให้กับเซอร์โวมอเตอร์ซึ่งเป็นไปตามสัดส่วนการงอหรืองอ เมื่อเซ็นเซอร์ดิ้นนี้ติดตั้งอยู่บนถุงมือเราสามารถควบคุมตำแหน่งเซอร์โวโดยการเคลื่อนไหวของมือ