สารบัญ:

ตกอยู่ใน Stm32: การควบคุมระยะไกลสำหรับ Home Media Center: 4 ขั้นตอน (พร้อมรูปภาพ)
ตกอยู่ใน Stm32: การควบคุมระยะไกลสำหรับ Home Media Center: 4 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: ตกอยู่ใน Stm32: การควบคุมระยะไกลสำหรับ Home Media Center: 4 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: ตกอยู่ใน Stm32: การควบคุมระยะไกลสำหรับ Home Media Center: 4 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: Program STM32 F103 with Arduino | STM32 Programming via USB Port - STM32 Bootloader 2024, พฤศจิกายน
Anonim
ตกอยู่ใน Stm32: การควบคุมระยะไกลสำหรับ Home Media Center
ตกอยู่ใน Stm32: การควบคุมระยะไกลสำหรับ Home Media Center

นี่คือต้นแบบที่สมบูรณ์สำหรับการควบคุมระยะไกลสำหรับโฮมมีเดียเซ็นเตอร์โดยใช้ไมโครคอนโทรลเลอร์ smt32, stm32f103c8t6 ที่รู้จักกันในชื่อ 'bluepill' สมมติว่าคุณกำลังใช้พีซีสำหรับโฮมมีเดียเซ็นเตอร์ เป็นโซลูชันที่ยืดหยุ่นมาก ซึ่งช่วยให้คุณสามารถวางไลบรารีวิดีโอขนาดใหญ่ลงในฮาร์ดไดรฟ์ภายใน หรือคุณสามารถเล่นวิดีโอจากเครือข่าย เช่น youtube ได้ คุณจะไม่มีปัญหากับตัวแปลงสัญญาณหรือวิดีโอเลย เพราะมันเป็นโปรแกรมที่ดีมาก ง่ายต่อการอัปเดตโปรแกรมเล่นซอฟต์แวร์ทุกเวลา ข้อเสียเปรียบหลักของการแก้ปัญหานี้คือ คุณควรใช้เมาส์และคีย์บอร์ดเพื่อควบคุมการเล่นของคุณ รีโมตคอนโทรล IR เป็นโหมดที่สะดวกมากสำหรับสิ่งนี้

ในบทความนี้ ผมจะแสดงวิธีการสร้างรีโมทคอนโทรลของตัวเองโดยใช้ชิปบอร์ดบลูพิล

ขั้นตอนที่ 1: ไอเดีย

ความคิด
ความคิด
ความคิด
ความคิด

แนวคิดหลักนั้นง่ายมาก: บอร์ด bluepill มีพอร์ต usb ในตัว และสามารถทำหน้าที่เป็นคีย์บอร์ด USB HID หากเราแนบตัวรับสัญญาณ IR เข้ากับบอร์ด จะสามารถแปลคำสั่งจากรีโมทคอนโทรล IR ของคุณเป็น 'การกดแป้น' ของแป้นพิมพ์เสมือนได้ ไม่จำเป็นต้องมีไดรเวอร์เพิ่มเติม!

มีโปรโตคอล IR มากมายในโลกรอบตัวเรา ผู้จำหน่ายทีวีของ VCS แต่ละรายมีโปรโตคอล IR ของตัวเอง แต่โปรโตคอลเหล่านี้มีบางอย่างที่เหมือนกัน: พวกเขาใช้การมอดูเลตแบบพัลส์เพื่อเข้ารหัสสัญญาณ โดยปกติจะมีคำนำอยู่บ้าง: แรงกระตุ้นยาวก่อนบิตแรกในแพ็กเก็ต จากนั้นการควบคุม IR จะส่งแพ็กเก็ตทั้งหมดด้วย 0 และ 1 และสิ้นสุดการส่งด้วยพัลส์แบบยาวเสร็จสิ้น ในการถอดรหัสบิต เราต้องวัดความยาวพัลส์และความยาวของพีค โดยปกติความยาวสูงสุดของลอจิก 0 และลอจิก 1 จะเท่ากัน ความแตกต่างอยู่ที่ความยาวพัลส์ทั้งหมด

ตัวควบคุมไมโคร stm32 มีคุณสมบัติฝังตัวเพื่อจับสัญญาณ PWM เกือบทุกตัวจับเวลาของไมโครคอนโทรลเลอร์สามารถใส่ใน 'การจับสัญญาณ PWM มากขึ้น' เมื่อตัวแปรช่องสัญญาณของตัวจับเวลาบันทึกความยาวทั้งหมดของพัลส์และความยาวสูงสุดของพัลส์ ที่นี่ฉันต้องเน้นรายละเอียดเล็กน้อย: เมื่อตัวรับสัญญาณ IR จับสัญญาณ แรงดันไฟฟ้าบนพินทำงานจะกลายเป็น 0 และในสถานะว่าง แรงดันไฟฟ้าในพินทำงานคือ 5 หรือ 3.3 โวลต์ ขึ้นอยู่กับแรงดันไฟฟ้าของตัวรับสัญญาณ IR กล่าวคือ ผู้รับ 'กลับด้าน' สัญญาณ

ด้วยโหมดการจับภาพ PWM ตัวควบคุมไมโคร stm32 สามารถเปลี่ยนเป็นนักแปลระยะไกล IR จากรีโมท IR ไปยังรหัสแป้นพิมพ์ได้อย่างง่ายดาย จากนั้นคุณสามารถเริ่มซอฟต์แวร์สร้างภาพที่คุณชื่นชอบได้ เช่น Kodi ของ VLC เพื่อเล่นภาพยนตร์เรื่องโปรดของคุณบน Media Center

ขั้นตอนที่ 2: การสร้างคอนโทรลเลอร์

การสร้างคอนโทรลเลอร์
การสร้างคอนโทรลเลอร์
การสร้างคอนโทรลเลอร์
การสร้างคอนโทรลเลอร์
การสร้างคอนโทรลเลอร์
การสร้างคอนโทรลเลอร์
การสร้างคอนโทรลเลอร์
การสร้างคอนโทรลเลอร์

ในการเขียนโปรแกรม stm32 micro controller ฉันอยากจะแนะนำซอฟต์แวร์ฟรีจาก STM: system workbench (aka ac6) และเครื่องมือกำหนดค่าบอร์ด cubeMX ในการอัปโหลดซอฟต์แวร์ลงในไมโครคอนโทรลเลอร์ สามารถใช้โคลนชิปของอะแดปเตอร์ ST-Link V2 ได้ ไฟล์โปรเจ็กต์เวิร์กเบนช์ระบบที่แนบมากับขั้นตอนนี้ ไฟล์ F1-IR_remote.zip

เครื่องมือกำหนดค่าบอร์ดทำให้ขั้นตอนการกำหนดค่าฮาร์ดแวร์เริ่มต้นของไมโครคอนโทรลเลอร์ของเราง่ายขึ้น

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

  • สร้างโครงการใหม่และเลือกบอร์ด stm32f103c8
  • เลือก 'Crystal/Ceramic Resonator' สำหรับรายการ 'นาฬิกาความเร็วสูง (HSE)' ในเมนู RCC
  • เลือก 'Serial Wire' สำหรับรายการ 'Debug' ในเมนู SYS
  • กำหนดค่าตัวจับเวลา #2 (เมนู TIM2) ในโหมดจับภาพ PWM ตามที่แสดงในภาพ:

    • โหมดทาส -> รีเซ็ตโหมด
    • แหล่งที่มาของทริกเกอร์ -> TI1FP1
    • แหล่งสัญญาณนาฬิกา -> นาฬิกาภายใน
    • Channel1 -> อินพุตโหมดจับภาพโดยตรง
  • ตั้งค่าช่องทำเครื่องหมาย 'อุปกรณ์ (FS) ในเมนู USB
  • เลือกองค์ประกอบเมนูแบบเลื่อนลง 'Human Interface Device Class (HID)' ในรายการ 'Class of FS IP' ในเมนู USB_DEVICE
  • ในแผงการกำหนดค่านาฬิกา ตรวจสอบให้แน่ใจว่าได้ให้ 72 MHz กับตัวจับเวลา #2 เนื่องจากเราต้องการตัวจับเวลาที่แต่ละ 1 mks
  • ในแผงการกำหนดค่าให้กำหนดค่าอุปกรณ์ USB ตามที่แสดงในภาพ
  • ในแผงการกำหนดค่าให้กำหนดค่าตัวจับเวลา #2 ดังต่อไปนี้:

    • Prescaller - 71 (จาก 0 ถึง 71) - ขีด 1 ไมโครวินาที!
    • โหมดตัวนับ - ขึ้น
    • Counter Period - 39999 (น่าจะวัดชีพจรได้)
    • ช่องดักจับอินพุต 1 - Falling Edge (จำไว้ว่าสัญญาณจากตัวรับสัญญาณ IR กลับด้าน)

ในโหมดจับภาพ PWM ตัวจับเวลา #2 จะทำงานดังต่อไปนี้:

เมื่อตรวจพบการตกด้านหน้า ตัวนับเวลาจะถูกบันทึกไว้ในรีจิสเตอร์ channel1 และตัวนับเวลาจะถูกรีเซ็ตด้วย 0 จากนั้นตัวจับเวลาจะนับทิศทางต่อไป ดังนั้นเราจึงสามารถวัดความยาวพัลส์ได้อย่างง่ายดายในหน่วยไมโครวินาที

โดยค่าเริ่มต้นคลาส STM32 USB HID จะจำลองเมาส์ USB คุณจะพบคำแนะนำในการเปลี่ยนคอนโทรลเลอร์ให้เป็นคีย์บอร์ดได้ที่นี่

ขั้นตอนที่ 3: ปรับแต่งคอนโทรลเลอร์

โครงการนี้ทำงานร่วมกับรีโมทคอนโทรลของ Panasonic และศูนย์สื่อของ Kodi ในการปรับแต่งโปรเจ็กต์สำหรับคอนโทรลเลอร์ของคุณเอง คุณควรเพิ่มโค้ดอาร์เรย์สำหรับรีโมตคอนโทรลของคุณเหมือนกับที่ฉันทำกับพานาโซนิครีโมตคอนโทรล (panasonicCode) ไปที่ส่วนหัว Inc/code.h อย่างที่คุณเห็น ทุกคำสั่งมี ID ที่ไม่ซ้ำกัน (ใน IRcommmand enum) มี 24 คำสั่ง (0-23) ที่โครงการรู้จัก คำสั่งจะจัดเรียงตามความเกี่ยวข้อง

typedef enum { IR_play = 0, IR_stop, IR_pause, IR_forward, IR_rewind, IR_last_channel, IR_OSD, IR_prevous_menu, IR_left, IR_right, IR_up, IR_down, IR_enter, IR_chapter_next, IR_chapter_title_previous, IR_info_n_subplay, IR_chapter_title_, IR_info_n_subplay, IR_power, IR_unknown } คำสั่ง IR;

const uint16_t kbrd_kodi = {HID_KEY_P, HID_KEY_X, HID_KEY_SPACE, HID_KEY_F, HID_KEY_R, HID_KEY_0, HID_KEY_M, HID_KEY_BACKSPACE, HID_KEY_LEFT, HID_KEY_RIGHT, HID_KEY_UP, HID_KEY_DOWN, HID_KEY_ENTER, HID_KEY_DOT, HID_KEY_COMMA, HID_KEY_S, HID_KEY_I, HID_KEY_T, HID_KEY_L (uint16_t (HID_LEFT_CTRL) << 8)| HID_KEY_T, HID_KEY_V, HID_KEY_Z, HID_KEY_W, HID_KEY_C };

const uint32_t panasonicCode = {0xd00505d, 0xd00000d, 0xd00606d, 0xd00525f, 0xd00929f, 0x100eced, 0xd00101d, 0x1002b2a, 0x1007273, 0x100f2f3, 0x1005253, 0x100d2d3, 0x1009293, 0x1002c2d, 0x100acad, 0x1009c9d, 0x1008e8f, 0x1004e4f, 0x100cecf, 0x1000e0f, 0x180c041, 0x1801091, 0x180a021, 0xd00bcb1 };

จากนั้นคุณควรเพิ่มรีโมตคอนโทรลของคุณเองในเมธอด init() ใน IR.cpp ด้วยฟังก์ชัน addRemote() อาร์กิวเมนต์ของฟังก์ชันคือ:

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

เป็นโมฆะ IRcmd:: init (เป็นโมฆะ) { addRemote (48, 5252, 902, 1755, panasonicCode, sizeof (panasonicCode) / sizeof (uint32_t));

}

นอกจากนี้ ไฟล์ยังมีตารางอื่นสำหรับแปลงคำสั่งเป็นรหัสแป้นพิมพ์ อาร์เรย์ kbdr_kodi มีรหัสคีย์สำหรับศูนย์สื่อของ Kodi คุณสามารถเพิ่มอาร์เรย์อื่นสำหรับโปรแกรมศูนย์สื่อของคุณเองได้ เช่น vlc player หากคุณจะเพิ่มตารางแอปพลิเคชันศูนย์สื่ออื่น คุณจะต้องสร้างวัตถุ KBD อื่น และเริ่มต้นใน main.cpp

ขั้นตอนที่ 4: เครื่องมือในการทำให้การตัดเย็บเสื้อผ้าง่ายขึ้น

เครื่องมือที่ทำให้การตัดเย็บเสื้อผ้าง่ายขึ้น
เครื่องมือที่ทำให้การตัดเย็บเสื้อผ้าง่ายขึ้น
เครื่องมือที่ทำให้การตัดเย็บเสื้อผ้าง่ายขึ้น
เครื่องมือที่ทำให้การตัดเย็บเสื้อผ้าง่ายขึ้น

มีอีกสองโครงการในที่เก็บ

  • การตรวจสอบ IR - ช่วยในการวัดพารามิเตอร์เวลาของสัญญาณจากรีโมทของคุณ
  • IR_capture - ช่วยให้จับรหัส HEX ของรีโมทคอนโทรลของคุณ

เพียงโหลดโปรเจ็กต์ IR สำรวจและเชื่อมต่อพอร์ต USB ของบอร์ด bluepill เข้ากับคอมพิวเตอร์ของคุณ จากนั้นเปิดโปรแกรมเทอร์มินัลบนอุปกรณ์พอร์ตอนุกรมเสมือน ซึ่งตรงกับบอร์ด stm32 ในขณะที่คุณกดปุ่มบนรีโมท โปรแกรมจะวัดพัลส์ที่ได้รับและพิมพ์เวลาเฉลี่ยสำหรับพัลส์ที่แตกต่างกัน ควรลดความซับซ้อนในการตรวจจับความยาวพัลส์สำหรับส่วนหัวของแพ็กเก็ต ศูนย์และหนึ่งบิต

ในโครงการตรวจสอบ IR ตัวจับเวลา #2 ทำงานในโหมดจับภาพ PWM ที่มีสองช่องสัญญาณ: ช่องที่หนึ่งจับความยาวพัลส์ทั้งหมด และช่อง 2 จับความยาวสูงสุด เมื่อตรวจพบขอบสัญญาณที่ตกลงมา ค่าตัวจับเวลาจะบันทึกลงในช่องที่ลงทะเบียนไว้หนึ่งช่องและตัวจับเวลาจะรีเซ็ตด้วย 0 เมื่อตรวจพบขอบที่เพิ่มขึ้นของสัญญาณ ตัวนับเวลาจะบันทึกลงในช่อง 2 ที่ลงทะเบียน

ในการจับภาพรหัสปุ่มของรีโมทคอนโทรลของคุณเอง คุณสามารถใช้โปรเจ็กต์ IR_capture ได้ ในไฟล์ main.c คุณควรเพิ่มคำจำกัดความระยะไกลเช่นนี้:

IRcode panasonic = {.hdr = 5252,.bits = 48,.zero = 902,.one = 1755,.dev = 60 };

  • .hdr - ความยาวส่วนหัวเป็น mks
  • .bits - จำนวนบิตในแพ็กเก็ต
  • .zero - ความยาวของศูนย์บิต
  • .one - ความยาวหนึ่งบิต
  • .dev - ส่วนเบี่ยงเบน (ความแตกต่างของเวลาที่สามารถยอมรับได้) โดยปกติแล้วจะมีความยาว 1/10 ของความยาวที่เล็กที่สุด

จากนั้นเพิ่มรีโมตของคุณในรายการรีโมตที่รองรับ:

const IRcode* รีโมท[2] = {&panasonic, &pioneer};

แนะนำ: