ขั้นประยุกต์: อ่าน IMU ผสานข้อมูล และสื่อสารให้ทันเวลา

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

อ่าน คู่มือเฟรม UART เพื่อฝึกถอด bytes เป็นค่า และ คู่มืออัตราสุ่มตัวอย่าง ก่อนเลือก dt ของเซนเซอร์ และ คู่มือคาลิเบรต IMU ก่อนผสานข้อมูล

อ่านต่อ บท Complementary Filter พร้อมตัวอย่างคำนวณ เพื่อแยก prediction จากมุมที่ผสานแล้ว

วัตถุประสงค์และอุปกรณ์

บทนี้ทำให้แยก “อ่านข้อมูลได้” ออกจาก “ข้อมูลนำไปใช้ได้” โดยตรวจหน่วย ทิศทาง ช่วงเวลา และผลของข้อมูลเก่า เริ่มชุดฝึกบนคอมพิวเตอร์ที่มี Python 3.11 ขึ้นไป ได้โดยไม่ต้องมีบอร์ด เมื่อจะทดลองอุปกรณ์จริงจึงใช้บอร์ดจากบทพื้นฐาน โมดูล IMU ตามคู่มือ และสายเชื่อมต่อ บอร์ด ESP32 ตัวที่สองเป็นทางเลือกสำหรับแบบฝึกสื่อสาร

เริ่มจาก พื้นฐาน I/O และ timing ตรวจว่าโมดูลรองรับ I2C หรือ SPI และระดับแรงดันตรงกับบอร์ด บางโมดูลมีตัวแปลงแรงดัน บางโมดูลไม่มี ให้ใช้ datasheet ของโมดูลจริงแทนการดูชื่อเซนเซอร์อย่างเดียว

ก่อนอ่าน IMU ดู เลือก I2C, SPI หรือ UART เพื่อแยกการต่อสัญญาณจากความหมายของข้อมูล

เลือก I2C, SPI หรือ UART ให้ตรงงาน

วัตถุประสงค์: เลือกช่องสื่อสารที่โมดูลรองรับ และเขียนรายการตั้งค่าที่ตรวจย้อนกลับได้ พื้นฐาน: รู้จัก GPIO แรงดันลอจิกและกราวด์จาก บทพื้นฐาน เริ่มทำ: อ่านคู่มือบอร์ดกับโมดูลและกรอกใบวางแผนบน PC หรือกระดาษ ยังไม่ต้องต่ออุปกรณ์

ภาพแนวคิดโต๊ะเตรียมบอร์ดไมโครคอนโทรลเลอร์ โมดูลเซนเซอร์ เครื่องมือวิเคราะห์สัญญาณและสายที่ยังไม่ต่อ พร้อมโครงโดรนถอดใบพัด

ภาพเสมือนจริงสร้างด้วย AI สำหรับอธิบายบริบทการเตรียมงาน ไม่ใช่ pinout วงจรที่รับรอง หรือผลวัดอุปกรณ์จริง

เปรียบเทียบหน้าที่ก่อนเลือกสาย

ช่องสื่อสาร สัญญาณในรูปแบบที่อธิบาย ใช้พิจารณางานใด
I2C SDA ข้อมูล และ SCL clock; เลือกอุปกรณ์ด้วย address เซนเซอร์หลายตัวบนบัสใกล้กัน เมื่อ address และเงื่อนไขไฟฟ้าใช้ร่วมกันได้
SPI SCK clock, MOSI ส่งจาก controller, MISO รับกลับ และ CS เลือกอุปกรณ์ โมดูลที่รองรับ SPI และต้องกำหนด transaction/clock ตาม datasheet
UART TX ส่งไป RX ของอีกฝั่ง และ RX รับจาก TX; แบบ asynchronous นี้ไม่มีสาย clock ร่วม อ่านข้อความจากโมดูลหรือส่ง Log โดยทั้งสองฝั่งใช้ baud และรูปแบบเฟรมตรงกัน

ตารางนับเฉพาะสัญญาณแบบทั่วไปที่อธิบาย ต้องพิจารณา power และกราวด์ด้วย ไม่ใช่จำนวนสายทั้งหมดหรือข้อกำหนดของทุกโมดูล เลือกจาก interface ที่มีจริง ขาที่เหลือ งานเวลาและวิธีตรวจข้อผิดพลาด ไม่ตัดสินจากชื่อบัสเพียงอย่างเดียว

I2C · ตรวจ address และ pull-up

SDA/SCL ต้องมี pull-up ไปยังระดับแรงดันที่อุปกรณ์รองรับ ตรวจว่า breakout มี resistor อยู่แล้วหรือไม่และมี address ซ้ำกันหรือไม่ ขา default อาจต่างกันระหว่างบอร์ด จึงไม่ใช้หมายเลข GPIO จากตัวอย่างกับทุก ESP32 ตั้ง pins/clock ตามคู่มือและตรวจค่าคืนของ API ตาม Espressif I2C

หากจะใช้ scanner เมื่อมีอุปกรณ์ ผลตอบรับ address เป็นเพียงจุดเริ่ม ต้องอ่าน register ระบุตัวอุปกรณ์ตาม datasheet ถ้ามี แล้วตรวจหน่วย/แกน/ช่วงข้อมูลต่อ การเห็น address ไม่รับรองว่า IMU ให้ข้อมูลถูกต้องหรือสายใช้ได้ในทุกสภาพ

SPI · ตรวจ mode และ CS ของอุปกรณ์

ระบุขา SCK/MOSI/MISO/CS, bit order, clock สูงสุดที่โมดูลรองรับ และ SPI mode (clock polarity/phase) ให้ครบ เมื่อแชร์บัสต้องเลือกอุปกรณ์ด้วย CS ตามเงื่อนไขของแต่ละตัว และตรวจว่า library/งานอื่นใช้ peripheral หรือขาเดียวกันหรือไม่ ตัวอย่าง Espressif SPI แสดงการตั้ง SPISettings, เปิด transaction, เลือก CS, transfer และจบ transaction

ชื่อ MOSI/MISO อาจเขียนเป็น COPI/CIPO ตาม เอกสาร Arduino เรื่องชื่อสัญญาณ SPI ให้เทียบ ทิศทางกับ controller ไม่เทียบสีสาย อย่าสมมติว่าโมดูลจะรับความถี่หรือ mode จากตัวอย่างได้

UART · แยก baud จากข้อความที่รับ

สำหรับ UART ระดับลอจิกทั่วไปที่อธิบาย ต่อ TX ไป RX และมีกราวด์อ้างอิงร่วม ตรวจระดับแรงดันและ baud/data bits/parity/stop bits ทั้งสองฝั่งตาม Espressif Serial ชื่อ Serial อาจมี routing ไป UART/USB ต่างกันตามบอร์ดและ options ต้องอ่านคู่มือของรุ่นจริง ไม่ต่อขาลอจิกตรงกับ RS-232/RS-485 โดยไม่ตรวจวงจร interface

ตัวอย่างคำนวณบนกระดาษ: สมมติ UART 115,200 baud, 8N1 ส่งต่อเนื่อง ไม่มีช่วงหยุดและไม่ใช้ flow control หนึ่ง byte ใช้ start 1 + data 8 + stop 1 = 10 bits ตาม Microchip: asynchronous frame จึงมีเพดานข้อมูล 11,520 bytes/s; ข้อความที่เข้ารหัสแล้ว 32 bytes ใช้เวลา wire ประมาณ 2.78 ms (32 × 10 / 115200 วินาที) ถ้าส่ง 100 ข้อความ/s ใช้ wire ประมาณ 27.8% ค่านี้เป็นการคำนวณตามสมมติฐาน ไม่รวมเวลาคิว งานจัดข้อความ ช่วงหยุดหรือความหน่วง USB และไม่ใช่ผล benchmark

คำภาษาไทยหนึ่งตัวอักษรอาจใช้หลาย bytes จึงนับขนาดหลังเข้ารหัสและรวม header/newline ของ protocol ด้วย การเขียนลง buffer ไม่เท่ากับปลายทางรับแล้ว ดู ESP-IDF: การส่ง UART แล้วต่อด้วย ที่มาและขอบเขต Log

แผนภาพสัญญาณ I2C ใช้ SDA และ SCL, SPI ใช้ SCK MOSI MISO และ CS, UART ต่อ TX ไป RX โดยต้องตรวจแรงดัน กราวด์และการตั้งค่าของอุปกรณ์

ไดอะแกรมหน้าที่สัญญาณของรูปแบบทั่วไป ไม่ระบุขา GPIO หรือสาย power ใช้ร่วมกับ datasheet และ pinout ของบอร์ด/โมดูลจริง เปิดไดอะแกรมสัญญาณขนาดเต็ม

ขั้นตอนวางแผนก่อนเชื่อมต่อ

  1. ระบุงาน เช่น อ่าน IMU หรือรับข้อความ เลือกรุ่นบอร์ด/โมดูลและ URL คู่มือ ตรวจ interface ที่รองรับจริง
  2. กรอกชื่อขา แรงดันลอจิก/power กราวด์ และการตั้งค่าของบัสในใบวางแผน อย่าเติมค่าไฟฟ้าที่ datasheet ยังไม่ระบุ
  3. กำหนดสิ่งที่จะอ่านเพื่อยืนยันการสื่อสาร เช่น register ระบุตัวอุปกรณ์หรือข้อความพร้อม length/หน่วย และ timeout/error ที่จะบันทึก การมีค่าตอบกลับอย่างเดียวไม่ยืนยันความหมายของข้อมูล
  4. ประเมินจำนวน bytes และเวลาที่ใช้ ระบุจุด timestamp/clock ก่อนเชื่อมกับงานควบคุม ทบทวน งบเวลา STM32 เมื่อมีงานหลายอย่างร่วมกัน
  5. เมื่อมีอุปกรณ์และคู่มือตรงรุ่น จึงตรวจวงจรขณะไม่จ่ายไฟและทดลองทีละโมดูลตาม คู่มือบอร์ดจริง เก็บค่าตั้งและไฟล์ดิบ ไม่เพิ่มผลวัดในใบงานจากการคาดเดา

คำแนะนำแก้ปัญหา: I2C ไม่ตอบ ให้ตรวจ address/pull-up/แรงดัน/ขา; SPI ได้ค่าคงที่ ให้ตรวจ CS/mode/ทิศทาง/จำนวน bytes; UART เป็นข้อความเพี้ยน ให้ตรวจ baud/frame/กราวด์และรูปแบบข้อมูล เปลี่ยนทีละเงื่อนไขแล้วเก็บหลักฐาน อาการเหล่านี้เป็นแนวทางตรวจ ไม่ใช่การยืนยันสาเหตุของอุปกรณ์ที่ยังไม่ได้วัด

ดาวน์โหลด คู่มือเลือกช่องสื่อสาร, ใบวางแผน interface ว่าง, โจทย์คำนวณ UART, เฉลยคำนวณและข้อจำกัด, ที่มาของหัวข้อ interface และ manifest ของคู่มือ interface ใบงานนี้แยกจากชุดฝึกนำทาง 10 ชุดและคะแนนเดิม ไม่มีผลต่อบอร์ดหรือผลผู้เรียนใหม่

อ่านเฟรม UART จาก bytes ไปเป็นค่า

วัตถุประสงค์: แยกช่วงที่อ่าน bytes ได้ออกจากขอบเขตข้อความ ตรวจการเรียงไบต์และความผิดพลาดก่อนนำค่าไปใช้ พื้นฐาน: อ่านเลขฐานสิบหก หน่วย byte และ การตั้ง UART ได้ เริ่มทำ: ใช้ PC หรือกระดาษกับข้อมูลสมมติ ยังไม่ต้องต่อบอร์ด

ภาพแนวคิดโต๊ะเรียนการอ่านเฟรม UART มีบอร์ดไมโครคอนโทรลเลอร์ USB adapter และสายที่ยังไม่ต่อ สมุดแบ่งช่องข้อความกับโครงโดรนถอดใบพัด

ภาพเสมือนจริงสร้างด้วย AI เพื่ออธิบายบริบท ไม่ใช่ pinout การต่อวงจร หรือผลรับส่งจากอุปกรณ์จริง

อ่านได้กี่ bytes ยังไม่บอกว่าครบข้อความ

UART ส่งลำดับ bytes ส่วน protocol ของงานกำหนดขอบเขตและความหมายของข้อความเอง หนึ่งรอบอ่านอาจได้บางส่วนของเฟรม หรือหลายเฟรมติดกัน ดู Espressif Serial API: available() นับ bytes ที่รออ่าน; read() คืน byte หรือ -1; readBytes() อาจคืนจำนวนน้อยกว่าที่ขอเมื่อ timeout จึงตรวจจำนวนที่อ่านจริงก่อนเข้าถึง buffer และไม่แปลง -1 เป็นข้อมูล

อย่าถือว่า UART start/stop bits เป็นตัวเริ่มและจบข้อความหลาย bytes และอย่าใช้ช่วงเงียบเป็นขอบเขตเอง เว้นแต่ protocol ระบุไว้ หากอ่านค่าที่ยังมาไม่ครบ ให้เก็บสถานะไว้รอภายในขนาด buffer และเวลาที่กำหนด ไม่วนรอไม่สิ้นสุดในงานควบคุม

โจทย์เฟรม 6 bytes ที่ประกาศเอง

เฟรมนี้สร้างเพื่อฝึกบนกระดาษ ไม่ใช่ MAVLink หรือคำสั่งควบคุมโดรน ทุก token ด้านล่างเป็น hexadecimal หนึ่ง byte ไม่ใช่ข้อความ ASCII ที่ส่งจริง

ตำแหน่งเริ่มจาก 0 หน้าที่
0 marker เริ่ม A5
1 sequence หนึ่ง byte
2 และ 3 ค่า 16 bit แบบ little-endian: low byte มาก่อน high byte
4 XOR เฉพาะ bytes ตำแหน่ง 1, 2 และ 3
5 marker จบ 5A ณ ตำแหน่งนี้

marker อาจปรากฏใน payload ได้ จึงอ่านตาม ความยาว 6 bytes และตรวจจุดจบตำแหน่ง 5 ไม่ตัดที่ 5A ตัวแรกที่เจอ โจทย์นี้ไม่ได้กำหนดหน่วยทางกายภาพ timestamp หรือ boot session จึงยังใช้ตัดสินความสดหรือควบคุมการบินไม่ได้

เฟรมแรก A5 07 34 12 21 5A: XOR คือ 07 XOR 34 XOR 12 = 21 และค่า unsigned คือ 0x1234 = 4,660 การเรียง bytes ของ field นี้ต่างจากลำดับ bits ที่ peripheral ส่งในหนึ่ง byte ต้องดู protocol ก่อน decode

เฟรมที่สอง A5 08 9C FF 6B 5A: XOR คือ 6B; unsigned เป็น 0xFF9C = 65,436 หาก schema ประกาศ signed 16 bit แบบ two’s complement ให้แปลงค่าที่ตั้ง bit สูงเป็น 65,436 − 65,536 = −100 อย่าสรุป signed หรือหน่วยจากชื่อ sensor และไม่อาศัยการ cast pointer เป็น struct แทนการอ่าน schema

แบ่งช่วงอ่านโดยไม่แบ่งข้อความผิด

สมมติไม่สูญหาย ไม่แทรก bytes และเริ่มตรงต้นเฟรมแรก ผู้รับได้สามช่วงตามลำดับ:

รอบอ่าน bytes ที่ได้
1 A5 07 34
2 12 21 5A A5
3 08 9C FF 6B 5A

หลังรอบ 1 ยังไม่มีเฟรมครบ หลังรอบ 2 ครบเฟรมแรกและเหลือ A5 สำหรับต้นเฟรมที่สอง หลังรอบ 3 ครบเฟรมที่สอง จึงมี 2 เฟรม จาก 3 รอบอ่าน ไม่ใช่ 3 ข้อความ สำหรับ unsigned ทั้งสองค่าคือ 4,660 และ 65,436; จะเรียกค่าหลังว่า −100 ได้เมื่อ schema ระบุ signed แล้ว

ไดอะแกรมแบ่งสามช่วงอ่านเป็นสองเฟรม UART ความยาวหก bytes แล้วแยกการตรวจขอบเขต XOR schema และความสดของข้อมูล

ไดอะแกรมเป็นข้อมูลสมมติ แสดงขอบเขต bytes ไม่ใช่ waveform หรือผลจาก serial monitor เปิดไดอะแกรมเฟรมขนาดเต็ม

XOR ผ่านยังไม่ได้รับรองข้อมูล

เฟรม A5 09 34 12 00 5A ไม่ผ่าน XOR เพราะค่าที่คำนวณได้คือ 2F ต่างจาก 00 แต่การสลับ payload เป็น A5 07 12 34 21 5A ยังผ่าน XOR เดิม ทั้งที่ค่าที่ decode เป็น 0x3412 = 13,330 แทน 4,660 ตัวอย่างนี้แสดงข้อจำกัดของ XOR ไม่มีการวัดอัตราความผิดพลาด

งานจริงใช้ framing และตัวตรวจความผิดพลาดตาม protocol พร้อม library ที่ตรงรุ่น เช่น MAVLink serialization มีรูปแบบ packet และ checksum ของตน อย่าแทนด้วยเฟรมฝึกนี้ การผ่านตัวตรวจความผิดพลาดไม่ยืนยันผู้ส่ง สิทธิ์สั่งงาน หน่วย หรือความสดของข้อมูล

คำแนะนำเบื้องต้น: ตรวจ schema ให้ตรงกัน จัดงบ buffer และ timeout จำกัดข้อมูลก่อน decode และแยกเหตุผลปฏิเสธ เช่น incomplete, marker ผิด, checksum ต่าง หรือ schema ไม่ตรง หากต้องหาต้นเฟรมใหม่เมื่อ bytes เสีย ต้องกำหนดและทดสอบ resynchronization เพิ่ม โจทย์สามช่วงข้างต้นยังไม่ทดสอบกรณีนี้

ขั้นตอนฝึกและบันทึกข้อสรุป

  1. อ่าน คู่มือชุดเฟรม UART และสำเนา ใบวางแผนเฟรมว่าง กำหนด length, byte order, signedness และหน่วย หากยังไม่ทราบให้บันทึก unknown
  2. ทำ โจทย์ bytes และเฟรม โดยวาด buffer คงค้างแต่ละรอบ แล้วตรวจ เฉลยพร้อมขอบเขต โจทย์ไม่เพิ่มคะแนนแบบประเมินเดิม
  3. คำนวณเวลา wire ตามสมมติฐาน UART 115,200 baud แบบ 8N1 ต่อเนื่อง: 6 bytes × 10 bits = 60 bits ใช้ประมาณ 0.521 ms ต่อเฟรม ไม่รวมคิว timeout ช่วงหยุด USB หรือเวลา decode
  4. ต่อ เกณฑ์คัดข้อความที่ถอดค่าแล้ว เพื่อพิจารณา sequence อายุข้อมูลและ boot session ที่โจทย์เฟรมนี้ยังไม่มี แล้วอ่าน ที่มาและขอบเขต Log ก่อนเก็บข้อมูลจริง
  5. เมื่อจะพัฒนา parser จริง ให้เตรียมกรณีข้อมูลขาด หลายเฟรม marker ใน payload การเสีย alignment และ buffer เต็ม ตรวจผ่านชุดทดสอบเฉพาะ protocol ก่อนเชื่อมอุปกรณ์ ตาม คู่มือเตรียมบอร์ดจริง รอบนี้ยังไม่มี parser executable หรือผลรับส่งจริง

ที่มาชุดฝึก: schema และข้อมูลตัวอย่าง · รายการแฮชไฟล์เฟรม

เซนเซอร์แต่ละชนิดบอกอะไร

เซนเซอร์ สิ่งที่วัด สิ่งที่ต้องระวัง
Gyroscope อัตราการหมุนรอบแกน เช่น deg/s หรือ rad/s bias ทำให้มุมที่อินทิเกรตสะสมคลาด; การสั่นและ noise มีผลด้วย
Accelerometer specific force ตามแกน ใน g หรือ m/s² การเคลื่อนที่มีผลต่อค่าที่อ่าน; ค่าขณะวางนิ่งต้องตีความตามกรอบพิกัด
Barometer ความดันสำหรับประมาณความสูง ต้องมีเงื่อนไขอ้างอิง; ลมและสภาพแวดล้อมมีผล
ToF / rangefinder ระยะถึงผิวที่เซนเซอร์มองเห็น ทิศการติดตั้ง ผิวเป้าหมาย และช่วงวัดมีผล

Gyro และ accelerometer มักรวมเป็น IMU ให้กำหนดแกน X/Y/Z และทิศบวกก่อนใช้ข้อมูล อย่าสมมติว่าโมดูลทุกตัวใช้แกนหรือหน่วยเดียวกัน แนวทางของระบบจริงแยก sensor driver และการแก้ไขข้อมูลออกจากผู้ใช้ข้อมูล ดู ArduPilot sensor drivers

แยกอัตราสุ่มตัวอย่างจากอัตราอ่านเซนเซอร์

วัตถุประสงค์: อธิบาย aliasing และวางแผนอัตราข้อมูลกับจุดกรองก่อนใช้ IMU พื้นฐาน: รู้จัก Hz, ms และอ่านตารางตัวเลขได้ เริ่มทำ: ใช้ PC หรือกระดาษกับสัญญาณคณิตศาสตร์ ไม่ต้องมีบอร์ดหรือปรับพารามิเตอร์บิน

ภาพแนวคิดโต๊ะศึกษาอัตราสุ่มตัวอย่าง มีบอร์ดไมโครคอนโทรลเลอร์ โมดูล IMU สาย USB และสายสัญญาณที่ยังไม่ต่อ สมุดตารางเวลากับโครงโดรนถอดใบพัด

ภาพเสมือนจริงสร้างด้วย AI สำหรับบริบทการเรียน ไม่ใช่วงจรที่รับรอง หรือผลวัดเซนเซอร์จริง

สี่อัตราที่ต้องระบุแยกกัน

อัตรา สิ่งที่ต้องตรวจ
อัตราสุ่มตัวอย่างภายใน จุดที่เซนเซอร์หรือ ADC เก็บสัญญาณ และตัวกรองก่อนจุดนั้น
ODR หรืออัตราข้อมูลออก ความถี่ที่อุปกรณ์ให้ sample ใหม่ ตาม mode และ datasheet
อัตราที่ MCU อ่าน อ่าน register ล่าสุด หรือดึงหลาย samples จาก FIFO
อัตราที่งานนำไปใช้ cadence ของ filter/controller และอายุ sample ที่ใช้

สมมติบนกระดาษ: เซนเซอร์ให้ค่าใหม่ 100 ครั้ง/s แต่ MCU อ่าน register ค่าล่าสุด 1,000 ครั้ง/s โดยไม่มี FIFO และ register เปลี่ยนเฉพาะเมื่อมี sample ใหม่ การอ่านซ้ำจึงไม่ได้สร้าง samples ใหม่ 1,000 ครั้ง/s ให้ตรวจ data-ready, sample counter หรือ timestamp ตามที่อุปกรณ์รองรับ การดึง FIFO หนึ่งครั้งอาจได้หลาย samples ต้องตรวจ overflow และเวลาของแต่ละ sample ด้วย

อัตราตั้ง 100 Hz มีคาบ 10 ms เมื่อสม่ำเสมอ แต่ช่วงเวลาอ่านจริงอาจคลาดจากงานค้าง อย่าตั้ง dt จากรอบ loop โดยไม่ตรวจจุด timestamp และข้อมูลซ้ำ แยกเวลา sample เกิด เวลาอ่าน และเวลาใช้ หากคนละ clock ต้องระบุวิธีเทียบเวลา

โจทย์ 20 Hz กับ 80 Hz ที่ให้ samples เหมือนกัน

ประกาศสัญญาณ x(t) = cos(2π f t) แอมพลิจูด 1 ไม่มีหน่วยทางกายภาพ phase เริ่มศูนย์และไม่มี noise สุ่มอุดมคติสม่ำเสมอที่ fs = 100 samples/s, t[n] = n / 100 s ตัวอย่างต่อไปนี้เป็นค่าคำนวณ ไม่ใช่ข้อมูล gyro

เวลา (ms) f = 20 Hz f = 80 Hz
0 1.0000 1.0000
10 0.3090 0.3090
20 −0.8090 −0.8090
30 −0.8090 −0.8090
40 0.3090 0.3090
50 1.0000 1.0000

ทั้งสองสัญญาณตรงกันที่จุดสุ่ม เพราะ 80 = 100 − 20 และสำหรับ n จำนวนเต็ม cos(2πn − θ) = cos(θ) ตัวอย่างนี้จึงแยก 80 Hz ออกจาก 20 Hz ไม่ได้จาก samples บน grid นี้เพียงอย่างเดียว เป็น aliasing อ่านพื้นฐาน Analog Devices: sampling และ aliasing

กราฟคำนวณ cosine 20 และ 80 Hz กับจุดสุ่ม 100 samples ต่อวินาทีที่ตรงกัน และไดอะแกรมตำแหน่งกรองก่อนลดอัตรา ไม่ใช่ผลเซนเซอร์

เส้นและจุดสร้างด้วย Matplotlib จากสมการที่ประกาศ แกนแอมพลิจูดไม่มีหน่วย ไม่ใช่ waveform ที่วัดจริง ส่วนล่างเป็นลำดับแนวคิดทั่วไป ไม่ใช่ pipeline ของ IMU ทุกตัว เปิดกราฟและไดอะแกรมสุ่มขนาดเต็ม

ใช้ Nyquist พร้อมสมมติฐานและระยะเผื่อ

สำหรับการสุ่มสม่ำเสมอของสัญญาณ baseband ที่จำกัดความถี่ ให้ความถี่สูงสุดอยู่ ต่ำกว่า fs/2 และเผื่อช่วงเปลี่ยนผ่านของตัวกรองตามงาน ไม่เลือก fs จากความถี่ที่อยากเห็นเพียงอย่างเดียว หากมีการสั่นหรือ noise สูงกว่านั้น สิ่งเหล่านี้อาจ alias เข้าช่วงที่สนใจได้

ที่ fs = 100 samples/s ขอบ Nyquist คือ 50 Hz กรณีขอบต้องระวัง phase: ถ้าสัญญาณเป็น sin(2π × 50 × t) และสุ่มเริ่มที่ t = 0 จะได้ sin(πn) = 0 ทุกจุด แม้สัญญาณระหว่างจุดไม่เป็นศูนย์ จึงไม่ถือว่า “สอง samples ต่อคาบ” เพียงอย่างเดียวรับรองการกู้คืนทุกสัญญาณ

แบบจำลองนี้ไม่รวม jitter, quantization, clipping หรือ response ของอุปกรณ์จริง อ่าน Analog Devices: anti-aliasing filter ซึ่งอธิบายการกรองก่อน ADC และการเผื่ออัตราสุ่มในงานจริง ตัวกรองจริงมี transition band ไม่ใช่ตัดหายทันทีที่ความถี่เดียว

กรองก่อนจุดที่ลดอัตราและตรวจความหน่วง

แยกสองจุด: ก่อน ADC ต้องจำกัดสัญญาณตามโครงสร้าง analog front-end; เมื่อมีข้อมูลดิจิทัลอัตราสูงแล้วจะลดอัตรา ต้องกรองให้เหมาะกับอัตราใหม่ ก่อน เลือกเก็บบาง samples เช่น 1,000→100 samples/s โดยเก็บทุก 10 ตัว ไม่ใช่ตัดข้อมูลก่อนแล้วค่อยพยายามลบ alias ภายหลัง ดูลำดับแนวคิดใน ADI AN-282: sampled data systems

การเฉลี่ยหรือ low-pass หลัง alias เกิดไม่ได้บอกว่าสัญญาณเดิมเป็นความถี่ใด และการกรองเพิ่มมีผลต่อความหน่วง ต้องอ่านตำแหน่ง filter/ODR/FIFO ของชิปและ driver จริง ตัวอย่างระบบ PX4 filter pipeline v1.16 แยกขั้นกรองและผลต่อ latency บทนี้ใช้เพื่ออ่านโครงสร้าง ไม่เสนอค่าปรับสำหรับการบิน

ขั้นตอนฝึกและคำแนะนำเบื้องต้น

  1. อ่าน คู่มือสุ่มตัวอย่าง แล้วทำสำเนา ใบวางแผนอัตราสุ่มว่าง ระบุ sample/ODR/read/use rate, clock และจุดกรอง ใช้ unknown เมื่อยังไม่มีข้อมูล
  2. ทำ โจทย์อัตราสุ่มและ aliasing ก่อนเปิด เฉลยพร้อมสมมติฐาน ตรวจ Hz กับ ms และ phase ที่ใช้ โจทย์ไม่เพิ่มคะแนนในแบบประเมินเดิม
  3. วางแผนตรวจ sample ใหม่ ข้อมูลซ้ำ FIFO overflow และช่วง timestamp จริง ก่อนใช้ dt คงที่ หากอ่านถี่แต่ค่าเหมือนกัน อย่าสรุปทันทีว่า sensor ค้าง เพราะสัญญาณคงที่และการอ่านซ้ำก็ทำให้ค่าเท่ากันได้
  4. อ่าน งบเวลาและจุดวัดของ STM32 เพื่อรวมเวลาคิวและ filter ในแผน จากนั้นกลับ Sensor Fusion เพื่อเลือก dt ตามความหมายของข้อมูล
  5. เมื่อมีอุปกรณ์จึงใช้ คู่มือเตรียมบอร์ดจริง เก็บ source/config/clock/Log และข้อจำกัด รอบนี้ไม่มีการวัด bandwidth หรือปรับ filter ของอุปกรณ์จริง การเพิ่มอัตราไม่ยืนยันความถูกต้องหรือการบินนิ่ง

ที่มาชุดฝึก: สมการและสมมติฐานอัตราสุ่ม · รายการแฮชชุดสุ่มตัวอย่าง

แยก bias ความไว และ noise ก่อนผสาน IMU

วัตถุประสงค์: อธิบายสิ่งที่การคาลิเบรตแก้ได้และยังแก้ไม่ได้ ก่อนใช้ค่าจาก IMU พื้นฐาน: อ่านหน่วย deg/s กับ g และหาค่าเฉลี่ยได้ เริ่มทำ: ใช้ PC หรือกระดาษกับตัวเลขสมมติ ไม่ต้องมีบอร์ด บทนี้ไม่เปลี่ยนค่าคาลิเบรตหรือพารามิเตอร์บิน

ภาพแนวคิดโต๊ะศึกษาการคาลิเบรต มีโมดูล IMU บนแท่นลูกบาศก์ บอร์ดไมโครคอนโทรลเลอร์ สาย USB ที่ยังไม่ต่อ สมุดจุดตัวอย่างและโครงโดรนถอดใบพัด

ภาพเสมือนจริงสร้างด้วย AI สำหรับบริบทการเรียน ท่าทางอุปกรณ์ในภาพไม่ใช่ท่าคาลิเบรตที่รับรองหรือหลักฐานผลวัด

จำแนกความคลาดก่อนเลือกวิธีแก้

สิ่งที่ต้องแยก ความหมายในแบบจำลอง สิ่งที่ต้องตรวจต่อ
Bias / offset ค่าเลื่อนจากค่าที่ควรได้ภายใต้เงื่อนไขอ้างอิง อ้างอิง หน่วย แกน อุณหภูมิ และว่าข้อมูลถูกชดเชยแล้วหรือยัง
Gain / ความไว อัตราการเปลี่ยน output ต่อ input แยกการแปลง LSB เป็นหน่วยกายภาพจาก gain error หลังแปลงแล้ว
Noise / ความแปรผัน ค่าที่กระจายรอบค่าเฉลี่ย ช่วงเวลา bandwidth และข้อมูลซ้ำ; สี่จุดไม่พอระบุสถิติ noise ของชิป
ทิศแกน / clipping เครื่องหมายหรือแกนผิด / ค่าเกินช่วงวัด ตรวจ mapping และ range; การลบ offset ไม่แก้สองกรณีนี้

ใช้แบบจำลองหนึ่งแกน y = s × x + b + e โดย x เป็นค่าอ้างอิง y เป็นค่ารายงานใน หน่วยเดียวกัน, s เป็น gain ไม่มีหน่วย, b เป็น offset ในหน่วยของ y และ e เป็นส่วนแปรผัน แบบจำลองไม่รวม cross-axis, ความไม่เป็นเชิงเส้น หรืออุณหภูมิ อ่านหลักการ offset และ sensitivity ใน Analog Devices AN-1057 ส่วน Calibration for Offset and Sensitivity Mismatch Error

Gyro นิ่ง: ลบค่าเฉลี่ยไม่ได้ลบความแปรผัน

โจทย์สมมติ: อัตราหมุนจริงเป็นศูนย์ หน่วย deg/s และมี samples ใหม่สี่จุด [0.4, 0.5, 0.6, 0.5] ค่าเฉลี่ยคือ 0.5 deg/s เมื่อลบค่านี้ได้ [-0.1, 0.0, 0.1, 0.0] ค่าเฉลี่ยใหม่เป็นศูนย์ แต่ค่าระหว่างจุดยังแตกต่างกัน ตัวอย่างสั้นนี้ไม่ได้พิสูจน์ bias จริงหรือรูปแบบ noise ของอุปกรณ์

ถ้าคงเหลือ bias 0.1 deg/s คงที่ตลอด 10 s จะสะสมมุมผิด 1° จาก error = bias × time ภายใต้แบบจำลองอุดมคติ ไม่ใช่การรับรองความแม่นยำหลังคาลิเบรต การเก็บช่วงที่ยังหมุนแล้วลบค่าเฉลี่ยจะลบการหมุนจริงรวมไปด้วย และ bias อาจเปลี่ยนตามเงื่อนไขใช้งาน

ตัวอย่างขั้นตอนจริง PX4 gyro calibration v1.16 ให้วางยานนิ่งตาม QGroundControl; ถ้าขยับจะเริ่มขั้นตอนใหม่ อย่านำเลข 0.5 จากโจทย์ไปตั้งบอร์ดจริง ส่วน PX4 thermal compensation v1.16 อธิบายการชดเชย bias ที่เปลี่ยนกับอุณหภูมิ บทนี้ไม่ได้ทำ thermal calibration

Accelerometer นิ่งไม่ได้แปลว่าทุกแกนเป็นศูนย์

คงนิยาม body FRD ของชุดฝึกเดิม: X หน้า Y ขวา Z ลง เมื่อวางระดับนิ่งในแบบจำลองอุดมคติ specific force คือ [0, 0, −1] g หรือ Z = −9.80665 m/s² ตามค่าคงที่ของโจทย์เดิม จึงไม่ลบค่า Z ทั้งหมดให้เป็นศูนย์ เพราะจะลบข้อมูลแรงโน้มถ่วงที่ใช้ประมาณท่าทางไปด้วย ทิศและเครื่องหมายของโมดูลจริงต้องตรวจ datasheet/driver กับ orientation mapping

ตัวอย่างสองจุดหนึ่งแกน: ตั้งค่าอ้างอิง x เป็น +1 และ −1 g ตามแนวแกนที่ประกาศ สมมติค่ารายงาน y เท่ากับ +1.10 และ −0.94 g ใช้แบบจำลองเชิงเส้นไม่มี noise:

  • b = (y+ + y−) / 2 = 0.08 g
  • s = (y+ − y−) / (2 g) = 1.02 ไม่มีหน่วย
  • x_est = (y − b) / s ในหน่วย g การลบอย่างเดียวไม่แก้ความไวที่คลาด
จุดของโจทย์ x อ้างอิง (g) y สมมติ (g) ลบ b อย่างเดียว (g) ลบ b แล้วหาร s (g)
ใช้หา b และ s +1.00 +1.10 +1.02 +1.00
ใช้หา b และ s −1.00 −0.94 −1.02 −1.00
ตรวจสมการ ไม่ใช้ fit 0.00 +0.08 0.00 0.00
ตรวจสมการ ไม่ใช้ fit +0.50 +0.59 +0.51 +0.50

สองแถวท้ายสร้างจากสมการเดียวกัน จึงตรวจได้เพียงเลขคำนวณ ไม่ใช่ validation จากการวัดอิสระ แบบจำลองไม่ครอบคลุม cross-axis หรือช่วงอุณหภูมิ และไม่แทนขั้นตอนคาลิเบรตสามแกนของ flight stack ดู PX4 accelerometer calibration v1.16 ซึ่งตั้ง orientation แล้วถือยานนิ่งในหลายท่าตามคำแนะนำ

กราฟข้อมูลสมมติ gyro ก่อนและหลังลบค่าเฉลี่ย กับเส้นแบบจำลอง accelerometer ที่เปรียบเทียบการลบ offset และการแก้ gain พร้อมลำดับตรวจการชดเชย

กราฟ Matplotlib สร้างจากตัวเลขและสมการในโจทย์ จุดตรวจสมการไม่ใช่ผลทดลองอิสระ เปิดกราฟและไดอะแกรมคาลิเบรตขนาดเต็ม

ขั้นตอนฝึกและคำแนะนำเบื้องต้น

  1. อ่าน คู่มือคาลิเบรตบนกระดาษ และทำสำเนา ใบวางแผนคาลิเบรตว่าง ระบุหน่วย แกน อ้างอิง และสถานะการชดเชยของข้อมูล หากยังไม่ทราบให้เขียน unknown
  2. ทำ โจทย์ bias และ gain ก่อนอ่าน เฉลยพร้อมขอบเขต แยกจุดที่ใช้ fit จากจุดตรวจสมการ ไม่มีคะแนนใหม่ในแบบประเมินเดิม
  3. ตรวจ driver/library ว่า output ถูกแปลงหน่วยหรือชดเชยแล้วหรือไม่ ป้องกันการลบ offset ซ้ำ เก็บ raw log และ config เดิมก่อนคำนวณ อ่าน อัตราสุ่มตัวอย่าง เพื่อแยก sample ใหม่จากการอ่านซ้ำ
  4. เมื่อมีอุปกรณ์ ใช้ คู่มือเตรียมบอร์ดจริง และขั้นตอนของผู้ผลิตหรือ flight stack เก็บช่วงนิ่ง หน่วย อุณหภูมิ config และชุดวัดอิสระที่ไม่ใช้ fit; แยกผลที่วัดจริงจากคำตอบบนกระดาษ
  5. กลับ Sensor Fusion เมื่ออธิบายข้อมูลเข้าและขอบเขตได้ การคาลิเบรตไม่ได้แก้ทุกข้อผิดพลาดของเวลา แกน หรือการเคลื่อนที่ และผลผ่านแบบฝึกไม่ยืนยันการบินนิ่ง

ที่มาชุดฝึก: แบบจำลองคาลิเบรตและแหล่งอ้างอิง · รายการแฮชชุดคาลิเบรต

Sensor Fusion: ใช้หลายแหล่งให้ช่วยกัน

Gyro เหมาะกับติดตามการหมุนช่วงสั้น ส่วน accelerometer ช่วยอ้างอิงทิศทางแรงโน้มถ่วงเมื่อเงื่อนไขการเคลื่อนที่เหมาะสม การผสานข้อมูลต้องคำนึงถึงหน่วย bias noise และช่วงเวลา ไม่ใช่เฉลี่ยค่าดิบสองชนิดที่มีหน่วยต่างกัน

เริ่มจากแนวคิด complementary filter เพื่อเข้าใจว่าข้อมูลแต่ละแหล่งช่วยในช่วงความถี่ต่างกัน แล้วศึกษา EKF ซึ่งใช้แบบจำลองสถานะและความไม่แน่นอนร่วมกับการวัด ระบบ EKF ของ flight stack ยังตรวจความสอดคล้องและคุณภาพข้อมูล การใช้ EKF จึงไม่รับประกันว่าข้อมูลจะไร้ drift ทุกกรณี ดู PX4 EKF v1.16

ดาวน์โหลดชุดฝึก IMU และข้อความบน PC

ดาวน์โหลดชุดฝึก PC พร้อมโค้ด ข้อมูล และเฉลย (ZIP) · ใบงานเปล่า (CSV) · เฉลยรวม (JSON) · รายการไฟล์และ SHA-256

ชุดนี้ใช้ Python standard library จึงไม่ต้องติดตั้งแพ็กเกจเพิ่ม ข้อมูลทั้งหมดสร้างจากสมการสังเคราะห์ ตาม protocol.json ใช้ฝึกแปลงหน่วย เปรียบเทียบมุม และอธิบายการรับข้อความ โปรแกรมและเฉลยผ่านการทดลองซ้ำบน Windows Python 3.11/3.14 และ Ubuntu Python 3.12 แต่ยังไม่ได้วัด IMU หรือส่งวิทยุจริง

  1. แตก ZIP แล้วอ่านข้อสมมติ: เปิด terminal ในโฟลเดอร์ที่แตก อ่าน README.md และ protocol.json ตรวจ python --version บนระบบที่ใช้คำสั่ง python3 ให้แทนชื่อคำสั่งทุกบรรทัด
  2. ตรวจชุดฝึกและรัน IMU สองกรณี: ใช้คำสั่งด้านล่าง เปิด imu-analysis.csv และ summary.json ที่ได้ในแต่ละโฟลเดอร์ผลลัพธ์
  3. รันข้อความ 12 แถว: เปิด message-analysis.csv ไล่เหตุผลที่ยอมรับหรือปฏิเสธแต่ละแถว พร้อมดูเวลาและเลขลำดับต้นทาง
  4. กรอกใบงานก่อนดูเฉลย: ระบุหน่วย สมมติฐาน และแถว CSV ที่เป็นหลักฐาน แล้วเทียบกับ answers/ ถ้ารันไม่ได้ให้ตรวจโฟลเดอร์ ชื่อไฟล์ และรุ่น Python ก่อนแก้สูตร
python -m unittest discover -s . -v
python imu_lab.py imu --input data/imu-roll.csv --output results/imu-baseline
python imu_lab.py imu --input data/imu-motion.csv --output results/imu-motion
python imu_lab.py messages --input data/telemetry.csv --output results/messages

แกนและหน่วยของโจทย์: body FRD คือ X หน้า/Y ขวา/Z ลง และ roll บวกตามกฎมือขวา ชุดนี้มีเพียง roll ไม่มี pitch/yaw ขณะวางราบนิ่ง specific force แกน Z เท่ากับ −9.80665 m/s² สูตรมุม atan2(-ay,-az) จึงใช้กับข้อสมมตินี้ ค่า gyro ใน CSV เป็น deg/s โปรแกรมแปลงเป็น rad/s แล้วอินทิเกรตแบบ trapezoid ด้วย dt จาก timestamp จริง การประมาณ bias ใช้วินาทีแรกที่ generator กำหนดให้วางนิ่ง สูตรนี้ไม่แทนขั้นคาลิเบรตอุปกรณ์ทุกชนิด ระบบจริงต้องตรวจชื่อ field และเวลา เช่น PX4 SensorCombined v1.16 และ กรอบพิกัด flight controller

กราฟผลคำนวณข้อมูล IMU สังเคราะห์ เปรียบเทียบมุมอ้างอิง gyro ที่มี bias และ complementary filter พร้อมช่วง force เพิ่ม

กราฟคำนวณจากชุดฝึก ไม่ใช่ภาพผลวัดจริง กรณี motion เพิ่ม force แกน Y 3 m/s² ช่วง 5–5.5 วินาที เปิดกราฟ IMU ขนาดเต็ม เพื่อขยายรายละเอียด

วิธีประมาณ roll RMSE กรณี baseline (°) RMSE กรณี force เพิ่ม (°)
อินทิเกรต gyro ที่ยังมี bias 2.887792 2.887792
แก้ bias แล้วอินทิเกรต gyro 0.000630 0.000630
Complementary filter 0.004671 2.386747
Filter พร้อมตรวจ norm ก่อนใช้ accelerometer 0.004671 0.005033

RMSE เทียบกับมุมอ้างอิงที่ generator กำหนด ในชุดนี้ gyro ที่แก้ bias ให้ผลดีมากเพราะข้อสมมติเอื้อต่อการอินทิเกรต ไม่ใช่ข้อสรุปว่าดีกว่า sensor fusion ในระบบจริง Filter ใช้ tau=0.5 s และ alpha=tau/(tau+dt) ส่วน norm gate ยอมใช้ accelerometer เมื่อ norm ต่างจาก g ไม่เกิน 0.3 m/s² เป็นเพียง heuristic ของโจทย์: norm ใกล้ g ยังไม่ได้ยืนยันว่าไม่มีการเคลื่อนที่หรือแกนผิด

เกณฑ์ตรวจข้อความ: โจทย์ใช้ clock เดียวและ boot session เดียว อายุ 40 ms ผ่าน แต่ 41 ms เก่า; timestamp อนาคตถูกปฏิเสธ Sequence 16 bit วนจาก 65535 กลับ 0 ได้ อัปเดตเลขล่าสุดเฉพาะข้อความที่ยอมรับ และปฏิเสธกรณีย้อนหลังหรือกำกวมครึ่งช่วง ผลคือ accepted 7, duplicate 1, out_of_order 1, stale 2 และ future_timestamp 1 ส่วน accepted-stream gaps 3 คือเลขที่ขาดจากรายการที่ยอมรับ ยังสรุปว่า radio สูญหาย 3 แพ็กเก็ตไม่ได้ CSV เป็นข้อความที่ถอดค่าแล้ว ไม่ได้ตรวจการส่ง ESP-NOW/UART, CRC หรือการเข้ารหัส

ฝึกทีละขั้น: อ่าน IMU และคัดข้อความด้วยเหตุผล

วัตถุประสงค์: ตรวจแกน หน่วย เวลา และลำดับข้อความก่อนนำข้อมูลไปใช้ควบคุม พื้นฐานที่ใช้: อ่าน Serial และ timestamp ได้ เวลาเสนอ: 45–60 นาที เป็นเวลาแนะนำ ยังไม่มีผลทดลองกับผู้เรียนจริง ใช้เครื่องคิดเลข/โปรแกรมอ่าน CSV ได้ หรือ replay ชุด PC ด้านบนด้วย Python 3.11+

ลำดับฝึกจากข้อมูล PC สู่การตรวจแกน หน่วย เวลา และแยกวิเคราะห์ IMU กับข้อความ ก่อนสรุปภายใต้ขอบเขต

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

ดาวน์โหลด วิธีทำ, ใบงาน 8 ข้อ, ตารางคัดข้อความว่าง, ข้อความต้นฉบับ 12 แถว และ protocol ก่อนเปิด เฉลยพร้อมเหตุผล ตรวจที่มาและ SHA-256 ได้ใน manifest สองไฟล์ต้นฉบับคัดตรงจาก ZIP เดิม

1. ตรวจแกนและหน่วยก่อนคำนวณ · A1–A3

อ่าน protocol แล้วเขียน FRD และเครื่องหมาย specific force ที่ Z เมื่อวางราบนิ่งในกรณีอุดมคติ จากนั้นแปลง bias 0.5 deg/s เป็น rad/s คำนวณมุมที่สะสมจาก bias คงที่ใน 10 วินาที และหา alpha เมื่อ tau=0.5 s, dt=10 ms ระบุหน่วยทุกคำตอบ แยกค่าที่ปลายช่วงจาก RMSE ทั้งช่วง

คำแนะนำ: แปลง ms เป็น s ก่อนแทนสูตร และตรวจชื่อคอลัมน์ CSV ก่อนนำไปเทียบ firmware จริง เช่น PX4 v1.16 SensorCombined ใช้ gyro rad/s, acceleration m/s² ใน body FRD และ timestamp หน่วย microseconds ตั้งแต่เริ่มระบบ

2. อธิบายฟิลเตอร์เมื่อมีแรงแทรก · A4

ใช้ผล imu-motion ในตารางด้านบน/summary เดิม เปรียบเทียบ complementary กับ norm-gated และนับตัวอย่างช่วง 5.00–5.50 วินาทีที่มีแรงแทรกตาม protocol อธิบายว่า norm ใกล้ g ยังไม่พิสูจน์ว่าไม่มีการเคลื่อนที่ และผลดีใน fixture เดียวไม่รับรองฟิลเตอร์บน IMU จริง

3. คัดข้อความทีละแถว · A5–A6

เปิด telemetry.csv เติม age_ms, disposition, accepted_gap และเหตุผลในตารางว่าง โดยเลข data_row นับจากข้อมูลแถวแรก ไม่รวม header เก็บ last_seq เฉพาะข้อความที่ accepted ตรวจตามลำดับ: อายุค่าติดลบ → อายุเกิน40 ms → seq ซ้ำ → seq เก่าหรือกำกวม → ยอมรับ

ลองอธิบายสองจุดสำคัญด้วยตัวเอง: อายุ40/41 ms ให้ผลต่างกันอย่างไร และ 65534→0 ต่างจาก 0→65535 อย่างไร โดยคำนวณ delta=(seq-last_seq) mod65536 ขอบเดินหน้าที่รับคือ1..32767 ส่วน0ซ้ำและ32768..65535ปฏิเสธใน protocol นี้

4. สรุปเฉพาะสิ่งที่หลักฐานรองรับ · A7–A8

รวมจำนวนข้อความที่รับ/ปฏิเสธพร้อม gaps แล้วตอบว่า gaps บอกการสูญหายทางวิทยุจริงได้หรือไม่ อธิบายทำไมแถว8 (seq=3, อายุ−10 ms) ถูกปฏิเสธ แต่แถว9 (seq=3, อายุ20 ms) ยอมรับได้ และเหตุใดสูตร rx-sample จึงต้องประกาศ clock/boot/session ก่อนใช้กับอุปกรณ์สองเครื่อง

ตรวจตนเองหลังทำ: เปิดเฉลย ข้อละ2คะแนนที่เสนอ (คำตอบ1 + เหตุผล/หน่วยหรือข้อจำกัด1) รวม16 บันทึกหัวข้อทบทวนในใบงาน คะแนนใช้ช่วยเลือกอ่านซ้ำ ไม่มีเกณฑ์รับรองความพร้อมบิน และยังไม่ผ่านการประเมินกับผู้เรียนจริง เมื่ออธิบายได้ให้ต่อ บท Freshness หรือ กิจกรรม MCU กับ Sim

ขั้นตอนทดลอง IMU บนโต๊ะเมื่อมีอุปกรณ์

แผนภาพ IMU → ตรวจแกน หน่วย เวลา → Sensor Fusion → ตรวจลำดับและอายุข้อมูลก่อนส่งหรือบันทึก

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

  1. อ่านตัวอย่างของโมดูล: ตรวจการเชื่อมต่อและ device ID แล้วบันทึกค่า raw หรือค่าที่ไลบรารีแปลงไว้ พร้อมระบุหน่วยและชื่อไลบรารี
  2. วางนิ่งแล้วเก็บข้อมูล: ใช้ตาราง timestamp_ms, gx, gy, gz, ax, ay, az บันทึกช่วงระหว่างตัวอย่างจริง และสังเกตค่ากลางกับการกระจาย
  3. หมุนทีละแกน: ทำเครื่องหมายทิศบวกบนบอร์ด หมุนช้า ๆ แล้วตรวจว่าค่าเปลี่ยนในแกนที่คาดหรือไม่ การเอียงพร้อมเลื่อนทำให้ตีความ accelerometer ยากขึ้น
  4. ทดลองการประมาณค่า: ถ้าไลบรารีมี orientation output ให้เทียบกับการวางบอร์ดที่รู้ทิศ บันทึกหน่วย เงื่อนไข และพฤติกรรมเมื่อหยุดนิ่งก่อนปรับ filter

การคาลิเบรตควรใช้ขั้นตอนของเซนเซอร์หรือ flight stack ที่เลือก การปรับ offset เองเพื่อให้เลขสวยอาจซ่อนข้อผิดพลาดการต่อแกนหรือหน่วยได้

ออกแบบข้อความสื่อสารให้ตรวจสอบได้

ใช้ UART หรือ ESP-NOW เป็นแบบฝึกได้ แบ่งข้อความเป็น control, telemetry และ configuration เพื่อรู้หน้าที่ แต่เลขชนิดข้อความ เช่น 0xAA หรือ 0xBB เป็นเพียงค่าที่ผู้พัฒนากำหนด การมีเลขชนิดไม่ได้จัดลำดับความสำคัญให้อัตโนมัติ

ข้อมูล/กลไก ใช้แก้ปัญหาอะไร
version, type, length ปฏิเสธรูปแบบที่ไม่รองรับและ payload ที่ขนาดไม่ถูก
sequence number ตรวจข้อความซ้ำ ข้ามลำดับ หรือหาย; ต้องกำหนดการวนกลับของตัวนับ
เวลาและอายุข้อมูล กันข้อมูลเก่าถูกใช้เหมือนข้อมูลใหม่; หากใช้เวลาฝั่งส่งต้องรู้ความสัมพันธ์ของนาฬิกาทั้งสองฝั่ง
bounded queue และนโยบายทิ้ง จำกัดงานค้างและเลือกว่าข้อมูลใดควรแทนค่าล่าสุด
acknowledgement ตามงาน ยืนยันว่าแอปพลิเคชันปลายทางรับหรือใช้ข้อมูลแล้วเมื่อจำเป็น
pairing และการตรวจสิทธิ์ ควบคุมว่าอุปกรณ์ใดส่งคำสั่งที่ยอมรับได้

ESP-NOW ส่งแบบ connectionless บน Wi-Fi ของชิปที่รองรับ ผล send callback ที่สำเร็จระดับ MAC ไม่ยืนยันว่าแอปพลิเคชันใช้ข้อมูลแล้ว งานใน callback ควรสั้นและส่งต่อผ่าน queue การเข้ารหัส unicast ต้องตั้งค่า peer/key ให้ถูก และอย่าสมมติว่า broadcast เข้ารหัสแบบเดียวกัน ดู เอกสาร ESP-NOW

แบบฝึกข้อมูลหายและเกณฑ์ตรวจผล

ส่งเฉพาะเลขลำดับ ค่าสมมติ และ timestamp ไปแสดงใน serial หรือ LED ยังไม่ต่อ actuator ตั้งเกณฑ์อายุข้อมูลให้ชัดก่อนทดลอง จากนั้นหยุดโปรแกรมฝั่งส่งหรือจงใจข้ามหนึ่งเลขลำดับ ฝั่งรับควรรายงานข้อมูลขาด/เก่า และแยกจากข้อผิดพลาดการอ่านเซนเซอร์ได้

ผลที่ควรได้คือ CSV ที่มีหน่วยและแกนชัด ตารางช่วงเวลาจริง และ log ที่อธิบายข้อความตกหล่นได้ หากอ่านค่าไม่ได้ให้ตรวจสาย address และ interface ก่อนเปลี่ยน filter หากข้อมูลกระตุกให้ตรวจเวลาและงานค้างก่อนสรุปว่าเซนเซอร์เสีย ไปต่อ ขั้นสูง: STM32 และเฟิร์มแวร์ เมื่ออธิบายเส้นทางข้อมูลได้

ตรวจความเข้าใจด้วยตนเอง

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

เตรียมเก็บหลักฐานจากบอร์ดจริง

คู่มือเตรียมทดลอง UNO/ESP32/STM32 พร้อมใบงาน ตรวจรุ่น wiring source/core clock และไฟล์ดิบก่อนสรุปผล คู่มือพร้อมใช้ แต่การ upload/วัดจริงยังรออุปกรณ์

เลือกชุดฝึกหรือทบทวนต่อ

กลับสารบัญชุดฝึก MCU 10 ชุด เพื่อเลือกโจทย์ตามเป้าหมายและพื้นฐานที่ควรรู้ หรือ ทำแบบประเมินความเข้าใจ 12 ข้อ เพื่อหาหัวข้อที่ควรทบทวน

หลังตรวจเฉลย ให้บันทึกคำตอบที่แก้ เหตุผล และสิ่งที่หลักฐานยังไม่ยืนยัน แล้วเลือกชุดถัดไปที่ช่วยตอบคำถามนั้น คะแนนใบงานกับแบบประเมินเป็นคนละส่วน ใช้เลือกทบทวนด้วยตนเอง

IMUgyroscopeaccelerometerSensor FusionI2CSPIUARTESP-NOWtelemetrytimestamp