NEWS: Procyon 800E Phase 2 Beta Testing Begins

Categories: C# .NET

ปัญหา The search key was not found in any record. ในไฟล์ .dbf หรือ dBase

หลังจากประสบปัญหากับการอ่าน File dBase โดยใช้ Jet Engine 4.0 ไม่ได้ เกิด Error Message “The search key was not found in any record.” in dBase ?  ในที่สุดก็พบวิธิการแก้ปัญหาแบบ จบเรื่องเลย สำหรับเพื่อนนักพัฒนา ที่มีปัญหาแบบเดียวกันลองทำดูนะครับ

ให้ทำตามขั้นตอน ดังนี้
1. ให้ใช้ Regedit เพื่อที่จะแก้ไข Registry key
Registry key: \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Eng ines\Xbase
2.ที่ Panel ด้านขวาให้หา Deleted
3. แล้วคลิกขวาที่  Deleted  แล้วจึงเลือก Modify.
4. ให้เปลี่ยนค่า จาก 0000 01 ไปเป็น 0000 00
5. คลิก OK.
6. ปิด Regedit แล้วกลับไปลองใหม่นะครับ รับลองว่าจะได้อย่างไม่น่าเชื่อ

🙂

Categories: C# .NET

Watch “นารีผล” on YouTube

Categories: C# .NET

ความเข้าใจพื้นฐานสำหรับการตั้งค่าวิทยุบังคับ RC ( Radio Control )

futk6900_layout_445   วิทยุบังคับทุกวันนี้มีคุณสมบัติสูง มีการพัฒนาสัญญาณให้มีการรบกวนกันน้อยมาก ให้ความรู้สึกตอบสนองต่อการใช้งานดีมากและมีค่าให้ปรับแต่งมากมาย ครับ brands หรือ ยี่ห้อมี่นิยมใช้กันก็อย่างเช่น Futaba , Hitec, Sanwa และ Spektrum

ที่จะกล่าวต่อไปเป็นหัวข้อหลักๆ ที่ต้องทำความเข้าใจ ก่อนที่จะปรับค่าเหล่านั้น รวมถึงลำดับขั้นตอนของ หัวข้อเหล่านั้นว่าควรจะเกิดขึ้นตอนไหนอย่างไร ซึ่งในเรื่องนี้นั้น เป็นเรื่องที่ผู้ที่เริ่มเล่นใหม่ ๆ มักกระหายอยากรู้แต่ก็ยากที่จะหาผู้รู้อธิบายได้ อย่างแจ่มแจ้งถึงจุดประสงค์ของหัวข้อ Function การทำงานเหล่านั้น

ในบทความนี้ไม่ได้เฉพาะเจาะจงไปที่ อุปกรณ์ยี่ห้อได้โดยเฉพาะ หรือประเภทของการเล่น ชนิดใดโดยเฉพาะ นะครับ เราพูดเป็น concept โดยรวม แล้วหาก มีโอกาส หรือมีคำถามเฉพาะเรื่อง ก็จะหาข้อมูลเจาะเฉพาะเรื่องเอามาแบ่งปันกันให้ทราบนะครับก่อนอื่น

มาพูดถึง กฎเหล็กกันก่อนนะครับ

    กฎเหล็กของการเล่น RC ก็คือ

  • ต้องตรวจสอบก่อนนะครับว่า มีใครที่ใช้ความถี่เดียวกะเราหรือไม่ ไม่ว่าเราจะเล่นที่สนาม หรือเล่นที่ใดๆ ก็ตาม การกวนสัญญาณที่เกิดจากการใช้ความถี่เดียวกันทำให้เราไม่สามารถควบคุม เครื่องบิน หรือ รถเราได้ อาจทำให้ ตก หรือพุ่งเข้าหาคนทำให้เกิดบาดเจ็บได้ โดยเฉาะ เฮริคอปเตอร์ ซึ่งอันตรายมาก
  • เปิดวิทยุก่อนเสมอแล้วค่อยเปิดไฟให้กับเครื่องบินหรือ รถ ต้องดูว่า throttle อยู่ในตำแหน่งต่ำสุดเสมอด้วย
  • การปิด ก็ต้องเปิดที่รถ หรือเครื่องบินก่อน แล้วค่อยปิดที่วิทยุ นะครับ

ติดตั้ง Servo ให้ถูกต้อง

สิ่งแรกที่เราควรตรวจสอบในการ เซตเครื่องใหม่ หรือครั้งแรกก็คือต้องมั่นใจว่าเราติดตั้ง servo ได้เหมาะสมแล้ว หรืออยู่ในตำแหน่งที่เราได้ตรวจสอบแล้วว่าถูกต้อง คืออยู่ center ของมัน แขน ตั้งฉากกับ case ของ servo

ตรวจสอบได้ด้วยการ เปิดวิทยุ และ receiver โดยเสียบสาย Servo ไว้ (ยังไม่ต้องติดตั้ง Servo บน model ที่เราเล่นนะครับ ) และให้ตรวจสอบให้แน่ใจว่า trim ถูกเลื่อนไปที่ตำแหน่ง neutral หรือ ตำแหน่ง กลาง แล้ว แขน Servo ต้องตั้งฉากกับตัวของ Servo หาก เอียงไปมากก็ให้ถอดแขน Servo ขยับ แต่ถ้าเอียงนิด หน่อย ขยับไม่ได้แล้วก็ปล่อย ไว้ ค่อยไปปรับต่อที่ขั้นตอนต่อไป ที่เราต้อง set ให้ตั้งฉากเพื่อให้ servo สามรถเคลื่อนที่ไป ทั้งสองด้านได้อย่างเต็มที่ (Maximum throw)
Subtrimsorvosetting

Subtrim

หลังจากใส่แขน Servo ทั้งหมดและติดตั้งกับตัว model แล้วสิ่งแรกที่เราจะตั้งค่าใน วิทยุคือ Subtrim
Sumtrim นั้นเป็น การกำหนดค่าหลัก ( master ) ในการปรับตำแหน่ง กลาง ( neutral ) ของ servo โดยไม่มีผลต่อการเคลื่อนที่ ทั้ง 2 ด้าน พูดง่ายๆ คือ เลื่อนจุดกลางโดยที่ Maximum throw ยังเหมือนเดิมทั้ง 2 ด้าน ใช้สำหรับการปรับละเอียด( fine tune ) แขน Servo ให้อยู่ในตำแหน่งเริ่มต้นที่ถูกต้อง (โดยทั่วไปคือ 90 องศาตั้งฉากกับ ตัว case)

IMG_0477_(800x600)_(2)

ภาพจาก http://rc.runryder.com/helicopter/t708525p1/

ATV (Adjustable Travel Volume)

หรือที่เราเรียกอีกอย่างหนึ่งว่า EPA (End Point Adjustment) เป็นฟังก์ชันควบคุมหลัก อีกอันหนึ่ง ใช้สำหรับการ จำกัดหรือเพิ่ม การ throw ( ผมขอเรียกทับศัพท์ละกันนะครับ มันหมายถึงว่า การเคลื่อนที่ของแขน servo ไปจนหยุด ด้านใดด้านหนึ่งนะครับในครั้งแรกที่เราตั้งค่ามันอาจ เคลื่อนที่ได้มากสุด หรือ Maximum throw ซึ่งเราอาจไม่ต้องการมันก็ได้ ครับ ขึ้นอยู่กับการติดตั้งและการใช้งาน ) การใช้ EPA นี้ก็เพื่อให้การเคลื่อนที่ของ แขน servo นั้น ได้เต็ม การทำงานของมันโดยไม่ค้ำ ยัน หรือ lock (ATV ควรใช้เมื่อเราตั้ง Dual rate ไว้ที่ค่าสูงสุดนะครับ ดู ด้านล่าง)

Servo_End-point_Adjustment

ภาพจาก http://rcdictionary.blogspot.com/2013/08/endpoint-adjustment.html

Trim
วิทยุ นอกจาก มี subtrim แล้วยังมี trim ใช้สำหรับการปรับค่าชดเชยอีกครั้ง หลังจาก Subtrim ถูกตั้งค่า เช่น Aileron ของเครื่องบิน ในครั้งแรกเราอาจต้องมีการ trim ตอน first flight เพื่อแก้อาการเอียงไปทางด้านใดด้านหนึ่ง ให้สามารถปล่อยมือได้ แล้วไม่เอียง เป็นต้น ในการ ตั้ง trim นี้หากดูแล้วมันเยอะเกินไป แปลว่า เรา ติดตั้ง servo ไม่ดี หรือ ปีกเอียงไปด้านใดด้านหนึ่ง จะต้องย้อนกลับไปแก้ อาการนั้นก่อน แล้วมา subtrim แล้ว trim ตอนบินอีกครั้งหนึ่ง นี่เป็นหลักการนะครับ

Dual Rate
การตั้งค่านี้ บ่อยครั้งครับ ใช้ผิดจุดประสงค์การใช้งาน หลายคนใช้ ค่านี้แทน ATV (ดูด้านบน) ซึ่งผิด Dual rate เป็น การกำหนดค่า ที่ต้องทำที่หลัง การตั้งค่า ATV เพื่อจำกัดการเคลื่อนที่ ภายในค่า ของ ATV ถ้าตั้งค่าถูกต้อง Maximum dual rate จะให้การเคลื่อนที่สูงสุดที่จุด ATV ตั้งไว้ และ หากตั้งไว้ 50% ก็จะเป็น ครึ่งหนึ่งของ ATV ที่ตั้งไว้ ค่านี้มี 2 ด้านนะครับ ไม่จำเป็นต้องเท่ากัน

Dual-rate

Exp (Exponential)
หรือเรียกว่า Curve เป็นการที่เราจะสามารถกำหนด mid-range ของ throttle หรือ การเลี่ยว การหมุนต่าง ๆ หรือผมจะเรียกว่าการตอบสนอง ละกันครับ ค่ามันก็จะมีทั้งบวก และ ลบ สำหรับการตั้งให้เป็น ลบ (mild หรือ negative) จะทำให้ servo ตอบสนองต่อการขยับของ stick น้อยลง หมายถึงหาก stick ขยับนิดหน่อย( partial control movement) ก็อาจไม่ตอบสนอง และมีผลทำให้ ระยะการเคลื่อนที่ลดลงด้วย เช่นเรา ดัน stick ไปซ้าย 50% servo อาจเคลื่อนที่ไปแค่ 40% เท่านั้น
ส่วนหากเรากำหนดให้เป็น บวก หรือ เป็น fast จะทำให้ servo ตอบสนองเร็ว และเคลื่อนที่มากกว่าเดิม สำหรับค่านี้ควรเป็นค่าน้อย ๆ นะครับหาก เมื่อใดเราต้อง ตั้งค่านี้ มาก จึงจำสามารถควบคุม model ได้ ก็ควรที่จะกลับไปหา function การตั้งค่าหลักก่อน หรือ อาจต้องไปดูที่ตัว model กันเลยที่เดียว

Servo-SurfaceGeometry-02

ภาพจาก http://www.angelfire.com/indie/aerostuff/IMAGES/Servo-SurfaceGeometry-02.jpg

ตัวอย่างเช่น หาก เครื่องบิน ตอบสนองต่อการ กัม/เงย เร็ว เกินไป อาจต้องไป กำหนดค่า EXP ของ Elevator ให้เป็น ค่าลบเพื่อให้การตอบสนองช้าลง ซึ่งจะทำให้การควบคุมได้ง่ายขึ้น

สำหรับ dual rate กับ EXP ลองอ่านที่นี่เพิ่มเติมนะครับ

สรุปว่า ขั้นตอน ควรเป็นเช่นนี้นะครับ

step

ครับคิดว่า ความเข้าใจเหล่านี้จะเป็นประโยชน์ต่อหลายๆ ท่านนะครับ ขอให้สนุกสนานกับการ ควบคุมนะครับ
s_teerapong2000@yahoo.com
s.teerapong@gmail.com

Categories: Radio Control, RC

งาน UAV Community “Unmanned Unlimited” 2014

Categories: C# .NET, game development Tags:

การตรวจสอบการใช้ Memory ( Measuring Memory Usage )

Image

 

วิธีในการวินิจฉัยปัญหาของการใช้ memory คือการตรวจสอบจำนวน memory ที่ถูกใช้ไปโดยโปรแกรมที่เราเขียน เรามักต้องให้ความสำคัญกับเรื่อง การใช้ Memory ค่อนข้างมากเนื่องจาก ทรัพยากร Memory มีน้อย ดูได้จาก post ที่แล้ว  เราลองมาดูวิธีการตรวจสอบ กันครับ

Flash

     การตรวจสอบจำนวน พื้นที่ที่ถูกใช้ของ flash นั้นดูได้จาก ข้อมูลที่ compiler แสดงทุก ครั้ง ที่มีการ compile

Image

EEPROM

สำหรับ EEPROM นั้นเราสามารถรู้ได้แน่นอนว่าพื้นที่ใช้ไปเท่าไร เหลือเท่าไร เนื่องจากการอ่านและเขียนนั้นเราจะต้อง อ้างไปที่ตำแหน่งของ address นั่นๆ เราไม่รู้ไม่ได้ 

Image

จากรูปการใช้งานจะเห็นว่าการอ่านหรือเขียนข้อมูลกับ EEPROM นั้นจำนวนการใช้ Memory นั้นค่อยข้างชัดเจนและแน่นอนสามารถควบคุมได้ด้วยโปรแกรมเมอร์อย่างชัดเจน

SRAM

    สำหรับ SRAM นั้น การใช้งานค่อนข้าง dynamic ทำให้ยากต่อการตรวจวัด การใช้ free_ram() เป็นวิธีเดียวสำหรับการตรวจสอบนี้ ใช้ส่วนของ code นี้ในโปรแกรม แล้วเรียกใช้เพื่อตรวจสอบ ได้เมื่อต้องการ จากจุดต่างๆ ของ code การใช้พื้นที่ของ SRAM นั้นค่อนข้าง คาดเดาได้ยาก จะต้องมีการตรวจสอบด้วย free_ram() เป็นระยะ ทุก จากทุกจุดของ code

Image

 

     การทำงานของ function freeRam() นั้นเป็นตรวจสอบพื้นที่ ว่างระหว่าง heap กับ stack ไม่ได้รวมถึง memory ใน heap ที่ เลิกใช้หรือ de-allocated (หรือเรียกว่า Buried heap space )

Buried heap space นั้นจะถูกทิ้งไว้โดยไม่มีใครสามารถนำไปใช้ได้ ไม่ว่าจะเป็นส่วนของ heap เองหรือ ของ Stack เองก็ตาม

Buried heap space นั้นเป็นพื้นที่ stack เอาไปใช้งานไม่ได้ หรือแม้แต่ heap เอง พื้นที่ ที่คืนมาอาจไม่ต่อเนื่องพอที่จะ allocate ใช้กับข้อมูลที่ต้องการใช้ได้ ก็ต้องทิ้งล้างไป ดังนั้นพื้นที่ ระหว่าง stack และ heap จึงเป็นพื้นที่ ที่เรา monitor เพื่อป้องกันปัญหาเช่น การล่มของ stack

Image

รูปจาก https://learn.adafruit.com/memories-of-an-arduino/measuring-free-memory

 

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

ติดตามกันต่อไปนะครับ อุปกรณ์ที่เราจะนำมาใช้งานร่วมนั้นก็มีส่วนที่จะต้องใช้ Memory เหมือนกัน ติดตามกันต่อไปครับ

ธีระพงษ์ สนธยามาลย์

 

 

อ้่างอิง Arduino – Memory , Measuring Memory Usage

Categories: Arduino

การจัดการ Memory ของ Arduino [Arduino Memories]

Image

Arduino มี Memory อยู่ 3 ชนิดคือ

  • Flash หรือ Program Memory
  • SRAM
  • EEPROM

Flash Memory

   ใช้สำหรับการบันทึก Program Image และข้อมูลตั้งต้นต่าง  เราสามารถ run โปรแกรมจาก flash memory ได้แต่เราไม่สามารถแก้ไขข้อมูลใน flash memory จาก code ที่ทำงานอยู่ได้  หากต้องการแก้ไขข้อมูลเราจะต้องทำการสำเนาไปที่ SRAM 

Flash memory นั้นใช้เทคโนโลยีเดียวกันกับ thumb-drive และ SD cards ซึ่งเป็นแบบ non-volatile หมายถึง program หรือข้อมูลจะคงอยู่แม้ว่าจะไม่มีไฟหล่อเลี้ยงอยู่ก็ตามหรือมีลักษณะเหมือน hard disk  แต่มันก็มีข้อจำกัดในเรื่องจำนวนครั้งในการเขียนกล่าวคือเราจะเขียนหรือบันทึกข้อมูลลง flash memory ได้ประมาณ 100000 ครั้ง (100000 write cycle)   มากพอที่จะใช้งานสัก 10 – 20 ปีแหละครับ ( สมมติว่าเราเขียนลงบน flash memory 10 ครั้งต่อวันเราก็จะใช้เวลาประมาณ 27 ปีครับ

SRAM

     หรือ Static Random Access Memory นั้นสามารถอ่านหรือเขียนได้จากโปรแกรม code ที่ทำงานอยู่ SRAM นั้นถูกใช้ในหลายจุดประสงค์คือ

  • Static Data เป็นส่วนของ memory ที่กันไว้สำหรับ  global variable และ static variable ของโปรแกรมสำหรับตัวแปรที่ถูกกำหนดค่าเริ่มต้นเมื่อเริ่ม start ระบบจะทำการสำเนาค่าเริ่มต้นนั้นจาก flash memory มาใส่ให้
  • Heap เป็นส่วนที่เก็บข้อมูลแบบ dynamic หรือข้อมูลที่มีการ allocate ระหว่างที่โปรแกรมทำงาน  ส่วนของ Heap นั้นจะขยายจากส่วนบนของ static data ขึ้นไปโดยใช้ส่วนของ memory ที่ว่างไปเรื่อยในระหว่างที่มีการจองและใช้งานของโปรแกรมที่ทำงานอยู่
  • Stack เป็นส่วนของ memory ที่ใช้เก็บข้อมูลตัวแปรแบบ local และเก็บรายการ interrupts และ function call ต่างๆ memory ในส่วนของ stack จะขยายจากด้านบนสุดของ memory ลงมาหา Heap ดังนั้นทุก  ตัวแปร  รายการ interrupts และ function call นั้นจะทำให้ memory ส่วน stack ขยายลงมากเรื่อย  การ return จาก interrupt หรือจาก function call นั้นจะคืนพื้นที่ว่างให้กับ SRAM 

       ปัญหาส่วนใหญ่ของ Memory เกิดจากการขยายขนนาดของ stack และ heap จนมาชนกันเมื่อเกิดการชนกันของ stack และ heap พื้นที่ข้อมูลของส่วนที่ถูกบันทึกทับก็จะเสียหายส่งผลให้เกิดการทำงานผิดพลาดแบบไม่สามารถคาดเดาผลการทำงานได้หรือในบางครั้งก็อาจทำให้เกิดการล่มของโปรแกรมไปเลย  หรือในบางครั้งผลของการชนกันอาจไม่สังเกตเห็นได้จนกระทั่งเกิด error ขึ้นภายหลังจากนำเอาโปรแกรมไปใช้งานแล้วก็ได้

EEPROM

เป็น non-volatile memory อีกอันหนึ่งซึ่งสามารถอ่านและเขียนโดยโปรแกรม code ที่ทำงานอยู่แต่ข้อจำกัดของมันคือต้องอ่านทีละ byte ทำให้เวลาใช้งานยุงยากหน่อยและการอ่านก็ช้ากว่า SRAM นอกจากนี้ก็ยังมีข้อจำกัดในการเขียนที่ 100000 write cycle ( แต่การอ่านไม่จำกัด )

Image

Arduino Memory Comparison

ตารางด้านล่างแสดงถึงข้อเปรียบเทียบของจำนวน memory แต่ละชนิดของแต่ละ model ของ Arduino และ Arduino compatible board 

Image

     ครับ เรารู้รูปแบบของ Memory ต่าง ๆ กันคร่าวแล้ว ทำไงเราจะตรวจสอบว่า โปรแกรมที่เราเขียนนั้นใช้ Memory ไปเท่าไร หมายถึงอะไรเท่าไรนะครับ มีคำอธิบายต่อไปเรื่องการตรวจสอบ ใน ตอนต่อไปครับ  เรื่อง  การตรวจสอบการใช้ Memory ( Measuring Memory Usage )

ขอให้สนุกกับการ เรียนรู้นะครับ

ธีระพงษ์ สนธยามาลย์