สัญญาณนี้ใช้ในการเข้ารหัสอะไร


19

ฉันมีเทอร์โมมิเตอร์พูลไร้สายราคาถูก (AcuRite 617 1 ) และฉันต้องการดักจับข้อมูลอุณหภูมิที่เครื่องรับและใช้กับระบบบันทึกข้อมูลด้วยคอมพิวเตอร์

สิ่งอำนวยความสะดวกภายในตัวรับสัญญาณเป็นกระดานแยกย่อยขนาดเล็กที่เชื่อมต่อกับเสาอากาศและมีหมุด "V", "G", "D" และ "SH" แบบดิจิทัล:

คณะกรรมการ RF211

นี่คือส่วนของข้อมูลที่บันทึกจากหมุด "D" ระหว่างการส่งสัญญาณ (เกิดขึ้นหนึ่งครั้งต่อนาที) ก่อนส่วนนี้มีข้อมูลที่ดูเหมือนว่าจะมีอัตราสูงกว่ามาก แต่ฉันเชื่อว่าอาจเป็นเสียงรบกวน - นี่คือจุดเริ่มต้นของข้อมูล 1.36kHz / 680Hz

สัญญาณที่จับได้จากพิน "D"

ฉันไปเที่ยวบ้างและไม่สามารถหาการเข้ารหัสที่มีลักษณะเช่นนี้ได้ แต่ถ้าฉันต้องเดาว่าเกิดอะไรขึ้นนี่คือสิ่งที่ฉันคิด:

  • 4 รอบแรกของ 680 Hz คือการซิงโครไนซ์นาฬิกา แต่ไม่มีข้อมูล
  • รอบ 13 ของ 1.36 kHz (2x อัตราเริ่มต้น) ที่ตามมาปรากฏว่ามีหนึ่งในสองรูปแบบ: พวกเขาทั้งสองลดลงต่ำก่อนที่จุดกึ่งกลางของรอบหรือหลังจากนั้น - ฉันจะถือว่ารูปแบบหนึ่งเป็นตรรกะหนึ่งและอื่น ๆ เป็นศูนย์
  • หลังจากนั้นจะมีช่องว่างแปลก ๆ แต่ถ้าคุณลดส่วนต่ำที่เป็นส่วนหนึ่งของ "1" ก่อนหน้านั้นช่องว่างที่เหลืออยู่คือ 735 µs ซึ่งเป็นความต่อเนื่องของเฟส 680 Hz เริ่มนำ

ฉันกำลังดูสิ่งนี้ถูกต้องหรือไม่? มีชื่อสำหรับการเข้ารหัสนี้หรือไม่?

หมายเหตุเพิ่มเติมบางประการเกี่ยวกับการทำลายบอร์ด:

  • บอร์ดนี้มีชื่อว่า "RF211" และมีลักษณะสอดคล้องกับวัตถุประสงค์ทั่วไป MICRF211 ", 3V QwikRadio Receiver ที่ทำงานที่ 433.92MHz" 3
  • แผ่นข้อมูล MICRF211 มีรูปต่อไปนี้ (มีคำอธิบายน้อยมาก) ซึ่งดูเหมือนยั่วเย้าเหมือนสิ่งที่ฉันเห็นยกเว้นคลื่นสี่เหลี่ยมสองอัตราข้อมูลเมื่อเทียบกับการจับของฉัน:
    โปรไฟล์ข้อมูล

อัปเดตเมื่อวันที่ 2016-02-14:ฉันได้กลับมายังโปรเจ็กต์นี้และดูเหมือนว่าจะได้รับสตรีมแบบ 64 บิตที่สะอาดระหว่าง preamble แบบ 4 รอบและแบบ "postamble" แบบ 1 รอบหลังจากที่บอร์ดแสดงผลปิดโมดูล RF โดย ดึง ^ SH ต่ำ (บรรทัดบนสุด):

ข้อมูล 64 บิต

ตามโครงการ "33/66% PWM" ของ Micrel (ซึ่งไม่ปรากฏที่อื่นใน Google) นั่นคือ

-_-_-_-_0000011110011000110000000000000000000000100011101000010010101010-_

ดังนั้นตอนนี้ฉันต้องเริ่มจัดการอุณหภูมิเพื่อถอดรหัสบิต ที่นี่ ("x") เป็นบิตที่ดูเหมือนจะเปลี่ยนแปลงโดยไม่มีการเปลี่ยนแปลงที่ชัดเจนในหน้าจอ:

0000011110011000110000000000000000000000100011101000010010101010
------------------------------------------------x----xxxx----xxx

ฉันถือว่าสิ่งเหล่านี้เป็นบิตที่สำคัญน้อยที่สุดหรือระดับแบตเตอรี่ (ซึ่งจะแสดงเป็น "ต่ำ" เมื่อมันลดลงอย่างมีนัยสำคัญเท่านั้น)

2016-02-15 อัปเดต:ฉันกำลังแสดงอยู่บนท้องถนนเพื่อให้สแต็คใหม่ "Reverse Engineering" แตกที่กำหนดความหมาย: /reverseengineering/12048/what-is-contained -in-นี้ส่ง-RF-สระว่ายน้ำที่อุณหภูมิเซ็นเซอร์ฐานหน่วยอีกครั้ง


BTW - การอ่านความคิดเห็นของผู้ใช้ที่เว็บไซต์ Home Depot สำหรับหน่วย AcuRite 617 ไม่ได้ให้ความรู้สึกที่ดีต่อความทนทานโดยรวมของผลิตภัณฑ์นี้ ที่จริงแล้วมันดูเหมือนว่าเป็น outrite pos ด้วยความเคารพที่จะไม่รั่วไหลเข้าไปในหน่วยผู้ส่ง
Michael Karas

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

คำตอบอื่น ๆ ที่มีไขมันต่ำ แต่เกิดจากลักษณะที่ปรากฏ คลื่นสี่เหลี่ยมเริ่มต้นคือการทำให้ตัวแบ่งข้อมูลตรงกันในระดับ 50% หยุดชั่วคราวก่อนที่ข้อมูลจะตรวจสอบให้แน่ใจว่าระดับ "1" ลดลง จากนั้น 2: 1mk-spc = 1 พูดและ 1: 2 = 0 ด้วย hysteresis 50:50 ไม่สลับระหว่างก่อนหน้า 1 หรือ 0 BUT แต่ไม่ควรเกิดขึ้นระหว่างสตรีมข้อมูล ก่อนหน้านี้คือ "ไม่ดี" เนื่องจากไม่พยายามรักษาอัตราส่วนเฉลี่ย 50:50 และระดับ dc ของคุณจะลอยหากข้อมูลมีมากกว่า 1 หรือ 0 แต่ถ้าค่า DC ของคุณคงที่เมื่อเทียบกับความยาว msg เรื่อง. จากนั้นคุณทำการ resynch อีกครั้งด้วยคำนำ 1: 1 สำหรับ msg ถัดไป
Russell McMahon

ตัวถอดรหัสอาจเป็น opamp ที่มีสัญญาณป้อนเข้าหนึ่งสัญญาณโดยตัวกรอง RC เพื่อตั้งค่าระดับ DC และสัญญาณป้อนอื่น ๆ ผ่านตัวต้านทานบวก + ข้อเสนอแนะ hysteresis ve (อาจจะประมาณ 4R) เพื่อให้สัญญาณ 1: 1 ไม่พลิกออก แต่เป็น 2 : 1 หรือ 1: 2 ทำ การเล่นกับ hysteresis% และค่าคงที่เวลา RC RC เล็กน้อยและควรทำงานได้ดีพอ
Russell McMahon

เม็ดแคลเซียมคาร์ไบด์ไม่กี่เม็ดหรือแคลเซียมโลหะที่ด้านล่างของที่อยู่อาศัยควรเก็บไว้ในที่แห้งและมีแรงดันเล็กน้อย :-) ไม่ฉันไม่เคยลองเลย
Russell McMahon

คำตอบ:


8

Micrel หมายถึงมันเป็นโครงการ PWM 33/66% มันดูเหมือนจะค่อนข้างง่าย แต่ ad-hoc โปรโตคอล

PWM ย่อมาจากการปรับความกว้างพัลส์ มีหน้า Wikipedia ที่ให้รายละเอียดเพิ่มเติม แต่ในระยะสั้น PWM คือที่ที่คุณรักษาช่วงเวลาที่กำหนดไว้ดังนั้นนี่คือเวลาจาก edge edge ไปจนถึง Edge ที่สูงขึ้นถัดไป แต่คุณเปลี่ยนเปอร์เซ็นต์ของเวลาที่อยู่ในระดับสูง สถานะโดยการเปลี่ยนแปลงเมื่อขอบตกเกิดขึ้น สำหรับอันนี้คุณจะเห็นได้ว่าสูง 33% สำหรับ '1' และ 66% สูงสำหรับ '0'

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

ดูhttp://www.micrel.com/_PDF/App-Notes/an-22.pdfสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่พวกเขาคาดหวังสำหรับโมดูล

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

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


3

คนที่ฉันรู้จักมักจะเรียกเทคนิคการเข้ารหัส "PWM" ซึ่งฉันคิดว่าเป็นคำอธิบายที่สมเหตุสมผล

ความคิดแรกของฉันดูที่ data stream ของคุณและสมมติว่าคุณคาดเดาขั้วของบิตอย่างถูกต้องนั่นคือการอ่าน ADC แบบ 12 บิต, LSB ก่อนโดยมี '1' เป็นบิตเริ่มต้น ฉันไปกับ LSB ก่อนเพราะการเริ่มต้นของสิ่งที่น่าจะเป็นการอ่านครั้งต่อไปแสดงให้เห็นถึงการเปลี่ยนแปลงบิตเดียวและไม่น่าเป็นไปได้ที่การอ่าน ADC ของอุณหภูมิ (พูล) จะแตกต่างกันโดย MSB ที่ 2 หรือ 3 ในช่วงเวลาสั้น ๆ

ฉันขุดลงไปอีกเล็กน้อยในระบบกลับไปที่สิ่งที่สร้างข้อมูล (ตรงข้ามกับการส่งสัญญาณ) ดูว่าคุณสามารถระบุเซ็นเซอร์อุณหภูมิและค้นหาความสัมพันธ์ระหว่างข้อมูลที่ส่งและอุณหภูมิ


สำหรับฉันแล้วดูเหมือนว่า @RobStarling ควรจะสามารถรู้ได้ว่าอุณหภูมิที่ส่งผ่านนั้นมาจากการดูที่อุปกรณ์รับสัญญาณและดูว่ามีการแสดงอะไรอยู่
Michael Karas

1
จริง แต่สิ่งเหล่านี้มีเล่ห์เหลี่ยม เช่นจอแสดงผลสามารถสลับได้ระหว่าง˚F / ˚Cดังนั้นการส่งสัญญาณอาจเป็นแบบสัมบูรณ์ orC หรือ˚Fหรือสัมพันธ์กับค่าออฟเซ็ตแปลก ๆ หรือความแม่นยำจุดคงที่แบบกำหนดเอง นอกจากนี้ยังมีรหัสสถานีที่สามารถสับเปลี่ยนได้ 3 รหัส ("A", "B", "C") และแม้ว่ามันจะบอกว่าการเปลี่ยน ID อาจช่วยให้รับสัญญาณได้ แต่ฉันก็รู้สึกว่ามันเป็นเพียงคำนำหน้ารหัสบนข้อความ - ฉันจะเปลี่ยน มันและดูว่ามีการเปลี่ยนแปลงข้อมูล
Rob Starling

@RobStarling - คุณสามารถเปิดหน่วยผู้ส่งเพื่อดูว่าพวกเขากำลังใช้เซ็นเซอร์อุณหภูมิชนิดง่าย ๆ เช่น LM75 หรือหนึ่งในประเภท I2C ทั่วไปอื่น ๆ หากเป็นไปได้ว่าข้อมูลที่ถูกส่งผ่านลิงก์เป็นค่าอุณหภูมิตามหลังการอ่านจากอุปกรณ์เซ็นเซอร์อุณหภูมิ ในทางตรงกันข้ามหากผู้ส่งใช้เซ็นเซอร์แบบแอนะล็อกเช่นไดโอดหรือ BJT ทรานซิสเตอร์เป็นเซ็นเซอร์มันจะยากกว่าที่จะอนุมานข้อมูลที่ส่งจริง
Michael Karas

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

@MichaelKaras - มันยากที่จะดูว่าเซ็นเซอร์คืออะไร - มันอยู่บนกระดานเล็ก ๆ ที่มีปลายแหลมเล็ก ๆ วางไว้ในแผ่นซับความร้อนเพื่อจับคู่กับผนังด้านนอกใต้น้ำ
Rob Starling

2

แผนการส่งคลื่นความถี่วิทยุเกือบทั้งหมดจะต้องมีคุณสมบัติหลายอย่างในโปรโตคอลการเข้ารหัสข้อมูล สิ่งเหล่านี้จะรวมถึง:

  1. รูปแบบที่สอดคล้องกันเริ่มนำมาใช้เพื่อล็อคตัวรับกับความถี่
  2. ตัวบ่งชี้การซิงค์ชีพจรเพื่อทำเครื่องหมายเริ่มถ้ามีการระบุเฟรม
  3. วิธีการในการเข้ารหัสข้อมูล 1 และ 0 พร้อมการตอกบัตรเพื่อการกู้คืนข้อมูล

พัลส์บอลคี่ที่คุณจดบันทึกไว้แน่นอนว่าเป็นตัวบ่งชี้พัลส์การซิงค์

การเข้ารหัสข้อมูลปรากฏขึ้นเพื่อติดตามสิ่งที่ฉันได้เห็นว่าเป็นการเข้ารหัสความกว้างพัลส์ นี่เป็นเทคนิคที่พบได้ทั่วไปโดยที่ทิศทางการเปลี่ยนทิศทางเดียวตามความถี่คงที่นำไปสู่เวลาบิตของความกว้างคงที่ ในระหว่างบิตเซลล์ชีพจรที่ใช้งานจะแสดงเป็น 25% ของเวลาเซลล์บิตหรือ 75% ของเวลาเซลล์บิต รูปแบบนี้ไม่ใช่พัลส์ไปสู่พัลส์ DC แบบแผนการเข้ารหัสที่สมดุลเช่นข้อเสนอการเข้ารหัสของแมนเชสเตอร์ มันเป็นเทคนิคทั่วไปที่มีการเข้ารหัสความกว้างพัลส์เพื่อให้สมดุล DC ภายในโปรโตคอลข้อความโดยการส่งบิตพิเศษเพื่อสร้างสมดุลโดยรวมในข้อความทั้งหมด ในรูปแบบที่ง่ายที่สุดข้อมูลจะถูกส่งสองครั้งพร้อมสำเนาที่สองที่มีเหตุผล

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

แก้ไข:

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


ฉันสงสัยว่านี่คือ: คำนำ (สี่เหลี่ยม) + บิตเริ่มต้น (1) + รหัสเฉพาะ (12 บิต) + ซิงค์ชีพจร + ข้อมูล (โอ้อย่างที่คุณแนะนำ ... เช่นบางทีมันอาจคาดว่า µC จะพร้อมสำหรับข้อมูลในระหว่างการซิงค์ชีพจร)
Rob Starling

2

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

40 ce c0 00 00 0c 03 be
(00 0C 03) => 0C3 => 67F

40 ce c0 00 00 0c 84 39
(00 0C 04) => 0C4 => 67F

40 ce c0 00 00 0c 05 b8
(00 0C 05) => 0C5 => 67F

ข้อมูล / อุณหภูมิอื่น ๆ ที่ฉันได้เห็นคือ:

E2 => 73F

F5 => 76F

108 => 80F (81 00 88)

109 => 80F

การใช้สิ่งนี้คุณควรจะสามารถทำการแปลง "เส้นตรง" (สมมติฐาน)

เนื่องจากฉันไม่มีขอบเขตที่ดี (และความจริงที่ว่าข้อมูลถูกส่งครั้งเดียวต่อนาที) ฉันไม่แน่ใจเกี่ยวกับเวลาของฉัน ฉันเห็นการซิงค์ HI และ LO ว่าเป็น 720 usec และบิตข้อมูลเป็น 240 และ 480 usec

หวังว่าฉันจะมีข้อมูลเพิ่มเติมในภายหลัง ฉันมีพวงของสิ่งเหล่านี้ ทันทีที่พวกเขาเริ่มรั่วฉันก็เอามันออกจากสระว่ายน้ำแล้วตากให้แห้งเพื่อใช้รอบบ้าน โมดูล 617 ในภายหลัง (ที่มีสกรูปิดด้านล่างและโอริง) ดูเหมือนจะนานกว่า


ฉันทำการถอดรหัสเพิ่มเติม ไบต์สุดท้าย (check byte) ทำให้ XOR ของแปดไบต์ทั้งหมดเท่ากับ 0FFH ตัวอย่างเช่น "40 CE C0 00 8D 0C 30", 40 xOR CE xor C0 xor 00 xor 00 xor 8D xor 0C xor 30 เท่ากับ 0FF

นอกจากนี้ฉันเอาอุณหภูมิลงไปที่ 34F และการนับเป็น 10 ทศนิยม (i, e., 00 00 0A) และที่ 80F การนับเป็น 264 ทศนิยม (เช่น 81 00 88 หรือ 108H)

จากนี้ฉันใช้ Temp (F) = 0.1811 * จำนวน +32.1889 ฉันอาจได้รับช่วงที่ใหญ่กว่าเพื่อรับข้อมูลที่ดีขึ้นถ้าฉันเห็นข้อผิดพลาด

ดูสตริงของ Rob Starling ในวันที่ 2016-02-14:

00000111/10011000/11000000/00000000/00000000/10001110/10000100/10101010 07 98 C0 00 00 8E 84 AA

XOR = FF

นับ = 0E4 หรือ 228

Temp = 73.5F


ขอบคุณเพื่อน!!! ผมค่อนข้างมั่นใจว่าจำนวนไม่ได้เป็นเพียง "นับ" แต่อุณหภูมิที่แน่นอนใน 0.1C - นั่นคือ "คณิตศาสตร์" สำหรับการถอดรหัสก็คือว่ามัน228 สำหรับฟาเรนไฮต์ทำตามปกติ22.8C F=C*9/5+32
Rob Starling

สรุปโดยย่อเกี่ยวกับวิศวกรรมย้อนกลับ SE: reverseengineering.stackexchange.com/a/13593/15076
Rob Starling

1
ร็อบคุณถูกต้องฉันควรเห็นแล้ว F = 0.18 * นับ + 32.0 สิ่งที่ดีที่คุณชี้ให้เห็นว่าฉันเร็ว ๆ นี้จะวางไว้ในน้ำร้อนจริงเพื่อให้ได้ "m" และ "x" ที่ดีขึ้นโดยใช้ช่วงกว้าง
Ken S

คุณยังอาจต้องการทำการปรับเทียบเพื่อให้ได้ตัวเลขที่แม่นยำมากขึ้นเนื่องจากผู้ตรวจสอบหลายคนบ่นว่าหน้าจอปิดไปสองสามองศา อย่างไรก็ตามอาจสะท้อนถึงความจริงที่ว่าเพียง≈4 "ใต้พื้นผิวและเครื่องวัดอุณหภูมิสระว่ายน้ำโรงเรียนเก่าส่วนใหญ่อยู่ในสายยาว
Rob Starling

อัปเดต: ฉันเขียนห้องสมุด Arduino - github.com/robstarling/ArduRight - แจ้งให้เราทราบหากมันเหมาะกับคุณ! มันมีตัวอย่างและทุกอย่าง อ้างอิงรูปภาพในโพสต์นี้คุณจะต้องบัดกรีสายไฟที่หมุด "SH", "D" และ "G" ในการรันตัวอย่างสเก็ตช์ให้เชื่อมต่อสายเหล่านั้นกับหมุด 2, 7 และ GND ตามลำดับ
Rob Starling
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.