Saturday, October 23, 2010

Inverted pendulum state feedback control

พอดีทาง FIBO ได้มอบหมายงานชิ้นแรกให้ผม คือ ออกแบบ Control low เพื่อ ควบคุม Inverted pendulum หลังจากทำได้สองอาทิตย์ก็ทำสามารถให้มันตั้งได้แล้วแต่ state ของ cart ยังคง oscillate อยู่เพราะการปรับค่า gain ของระบบที่มีความเป็น Nonlinear และ Unstable มันไม่ใช่เรื่องง่าย และ Mechanic ก็ยังไม่ค่อยดีเท่าไหร่ แต่นี้เป็นแค่การทดสอบ Algorithm ว่า Micro controller รุ่น PIC18f4431 สามารถเขียน Control law u=-k1*(x1-reference)-k2*x2-k3*(x3-reference)-k4*x4-k5*z-k6*z1 ได้หรือเปล่าวโดยที่ x1 คือ Angle ของ pendulum x2 คือ Angular velocity ของ pendulum โดยติดตั้ง Potentiometer ไว้ที่จุดหมุนของ pendulum ส่วน x3 คือ Cart position และ x4 คือ linear velocity ของ cart มี Encoder ติดไว้ที่ motor z1 และ z2 คือ Integral error ของ Pendulum และ Cart x1 to x4 เราเรียกมันว่า State variable จะเห็นว่า x1 และ x3 สามารถวัดได้โดยตรง ส่วน x2 และ x4 ผมนำมันมา Derivative เทียบกับเวลาซึ่งไม่ใช่วิธีการที่ดีเท่าไหร่ แต่คิดไว้แล้วว่าจะใช้ Reduce order observer  หรือ อาจจะใช้ Kalman filter มาประมาณหาความเร็วแต่ทั้งสองวิธีนี้จะต้องมีแบบจำลองทางคณิตศาสตร์ของระบบก่อนวันนี้พอเท่านี้ก่อนแล้วกันครับ ครั้งหน้าจะมาดูว่า
1. หาแบบจำลองอย่างไร
2.หาสัมประสิทธิ์คงที่ ของ Model
3.ออกแบบ Observer 
4.หา Gain K โดยวิธี Lqr  
5.เขียน Code ลงใน PIC18F

อันนี้เป็น VDO ลองดูเล่นๆก่อน มันยังไม่สมบูรณ์เท่าที่ควรเพราะยังขาด Algorithm บางตัวอยู่ 





Sunday, October 3, 2010

Convert Thermistor Reading

บทความนี้จะพูดถึงการแปรงแรงดันไฟฟ้าไปเป็นอุณหภูมิ ก่อนอื่นมาทำความรู้จักกับเจ้า thermistor ก่อน Thermistor เป็นอุปกรณ์ตรวจรู้ชนิดหนึ่งที่มีคุณสมบัติ คือ เมื่อตัวมันได้รับความร้อนจะทำให้ความต้านทานภายในตัวมันมีการเปลี่ยนแปลง ซึ่งเราจะอาศัยการเปลี่ยนแปลงเหล่านี้ไปหาความสัมพันธ์ระหว่างอุณหภูมิกับความต้านทาน Thermistor เป็นอุปกรณ์แบบ passive คือ มันจะต้องได้รับการกระตุ้นเสียก่อน ซึ่งในที่นี้สิ่งที่มากระตุ้นมันก็คือแรงดันไฟฟ้ากระแสตรง ซึ่งสามารถเขียนวงจรได้ดังรูปด้านล่างนี้




เมื่อใช้กฎของโอห์มแล้วจะได้ความสัมพันธ์ดังนี้

โดยที่ A, B, C คือค่าคงที่ของ Thermistor หาได้จาก data sheet ของ Thermistor เอง
Tk คือ อุณหภูมิที่วัด มีหน่วย (K)
 ขั้นตอนการเขียนโปรแกรม Labview เมื่อเราเปิดโปรแกรม Labview ขึ้นมาแล้วให้ไปที่ Numeric-->Scaling--> Convert Temperature Reading.vi ดังรูปด้านล่าง
จากนั้นเราก็อ่าน ค่า  Voltage เข้ามาในโปรแกรม Labview ถ้ามี DAQ เราก็สามารถวัดได้โดยตรงแต่ถ้าเราไม่มี DAQ เราก็สามารถใช้ RS-232 ก็ได้





หวังว่าบทความนี้จะเป็นประโยชน์กับผู้ที่สนใจเกี่ยวกับ โปรแกรม Labview ไม่มากก็น้อยนะครับ







 

Saturday, October 2, 2010

Labview write To Measurement File

บทความนี้ เราจะมาศึกษาการ Save ข้อมูลของโปรแกรม Labview วิธีก็คือเราต้องการบันทึกข้อมูลที่มีรูปแบบเป็น waveform โดยที่หลัก(column)แรกของข้อมูลจะเป็นเวลา และหลัก(column)ต่อมาจะเป็นข้อมูลที่เราต้องการ และจะให้มันบันทึก ก็ต่อเมื่อเรากดปุ่ม save มันจะบันทึกเพียงครั้งเดียว เพราะถ้าเราไม่เขียนแบบนี้แล้วมันจะบันทึกเองทุกรอบการทำงาน หมายความว่าถ้ามันวน loop 100 ครั้งมันก็บันทึกข้อมูล 100 ครั้งซึ่งนั้นคงไม่ใช่สิ่งที่เราต้องแน่นอน ก่อนอื่นเมื่อเปิดโปรแกรมขึ้นมาแล้วไปที่ file i/o write To Measurement File แล้วจะได้ดังนี้
รูปที่.1
จากนั้นก็ให้เราคลิกช่อง Use next available file name ที่เลือกตัวนี้ก็เพราะมันจะเปลี่ยนชื่อเองโดยอัตโนมัติซึ่งจะสะดวกในการใช้งานเพราะการเก็บข้อมูลอาจจะต้องมีการเก็บหลายครั้ง ต่อจากนั้นให้ดูที่ X Value Column ให้เลือก One column only หมายความว่าเราต้องการข้อมูลเกี่ยวกับเวลาแค่หลักเดียว เมื่อดำเนินตามขั้นต้นเสร็จ ก็คลิก ok
ต่อมาก็เขียนตามรูปด้านล่างนี้
 รูปที่.2
ที่ Button ที่ชื่อว่า save ที่ผมตั้งชื่อขึ้นเองนี้ให้เราปรับมันนิดหน่อยโดยไปที่ front panel แล้วคลิกขวาที่ปุ่มกด (button) mechanical action แล้วเลือก Latch when released หรือ Latch when pressed ก็ได้ คือ มันจะทำงานเมื่อเรากด หรือ เราปล่อย button ดูตัวอย่างที่รูปด้านล่าง
รูปที่.3
สุดท้ายเมื่อเรากด Save แล้วเราก็จะได้ text file ที่มีหน้าตาดังรูปด้านล่างนี้

Labview Local variable

บทความนี้เราจะศึกษาการเขียนโปรแกรม Labview เรื่อง Labview Local variable กันนะครับก่อนที่จะดูว่ามันสร้างอย่างไรเรามาดูมันก่อนว่ามันมีประโยชน์ อะไรบ้าง Labview Local variable มีไว้สำหรับใช้งานใน vi เดียวกัน แต่สามารถรับส่งข้อมูลกันไปมาระหว่าง loop หนึ่งไปยัง loop อื่นได้ เช่น เราอ่าน visa เข้ามาใน loop แรกแต่คราวนี้เราต้องการนำค่าที่ได้จาก Visaไปใช้งานใน loop อื่นต่อเรา ก็สามารถสร้างLabview Local variable ขึ้นมาเพื่อที่จะนำค่าไปใช้ใน loop อื่นต่อไป ดูได้จากตัวอย่างด้านล่างนี้
รูปที่.1
ตัวอย่างจากรูปที่.1 สมมุติถ้าเราต้องการที่จะนำค่าจาก loop-A มาบวกกับ 10 ในรูป loop B ถ้าเขียนอย่านี้แล้วค่าที่ loop-A จะไม่สามารถส่งข้ามมายัง loop-B ได้จนกว่าเราจะกดปุ่ม stop มันถึงจะส่งข้อมูลตัสุดท้ายออกจาก loop- A ได้ แต่ถ้าเราสร้าง Labview Local variable ขึ้นมามันถึงสามารถส่งข้อมูระหว่าง loop ได้ทุกๆรอบการทำงานของ while loop ดังตัวอย่างด้านล่าง

รูปที่.2 
วิธีการสร้าง Labview Local variable ให้คลิกขวาตัวที่เราต้องการจะสร้าง Labview Local variable

รูปที่.3
แล้วไปที่ Createlocal variable

รูปที่.4

แล้วเราก็จะได้ Labview Local variable ดังนี้

 
เพียงเท่านี้เราก็สามารถสร้าง Labview Local variable ได้แล้วนะครับ