kiano♥
|
|
« เมื่อ: ตุลาคม 21, 2009, 10:58:35 pm » |
|
คุณ...ไปปิดไฟสิ จะนอนแล้ว... คุณนั่นแหละ ไปปิดที... ต่อไปไม่ต้องเกี่ยงกันเรื่องปิดไฟแล้วครับ ถ้าทำโครงงานนี้ "สวิทช์ปิด-เปิดไฟด้วยรีโมทคอนโทรล" เป็นโครงงาน PIC Microcontroller มีคุณสมบัติดังนี้คือ - ต่อเอาพุตได้ 3 ช่อง กำลังไฟฟ้าโหลด 500 วัตต์ต่อช่อง - ควบคุมการทำงานด้วยรีโมททีวี วีซีดีทั่วไป โดยมีโปรแกรมจำค่าปุ่มกดที่รีโมท - มีสวิทช์ควบคุมในตัว ในกรณีไม่ใช้รีโมท - ติดตั้งง่าย ใช้ใส่เข้าไปแทนที่สวิทช์ธรรมดาได้เลย การทำงานของวงจร ทุกอย่างจะถูกควบคุมการทำงานด้วยไอซี Microcontroller เบอร์ PIC12F629 หรือเรียกสั้นๆว่า MCU โดย IR Module จะทำหน้าที่รับสัญญาณรีโมทที่ส่งมาจากตัวรีโมท แล้วส่งไปประมวลผลคำสั่งภายใน MCU เช่นเดียวกันกับ SW จะรับคำสั่งจากการกดของผู้ใช้งาน แล้วส่งผลการกดสวิทช์ไปประมวลคำสั่งภายใน MCU ซึ่งจะได้ดูรายละเอียดการประมวลผลคำสั่งในหัวข้ออธิบายการทำงานของโค๊ดโปรแกรม หลักจากประมวลผลคำสั่งแล้ว MCU จะส่งคำสั่งปิด-เปิดไฟไปที่ MOC3063 เพื่อทริกให้ไตรแอคทำงาน หรือหยุดทำงานแล้วแต่คำสั่งทีรับมาจาก MCU และไตรแอคจะจ่ายไฟให้กับหลอดไฟต่อไป PZ คือลำโพงเปียซโซ โดยทุกครั้งที่ MCU สั่งงานไปที่ออปโต้จะมีเสียง บี๊ป เพื่อให้รู้ถึงสถานะการทำงาน รูปด้านล่างจะเป็นลายแผ่น PCB และการวางอุปกรณ์ลงบนแผ่น ในการวางอุปกรณ์จะใ่ส่ด้านที่เป็นทองแดงเลย ต้องดูขาของอุปกรณ์ให้แน่ในก่อนที่จะบัดกรี เพราะวงจรเกียวข้องกับไฟ 220v โดยตรง ทำให้เกิดความเสียหายได้ง่ายถ้าใส่ผิด รูปด้านล่างแสดงไดอะแกรมการต่อสวิทช์รีโมทเข้ากับหลอดไฟ 3 หลอด รูปแสดงหลังจากติดตั้งสวิทช์รีโมทเสร็จแล้ว สำหรับฝาปิดของสวิทช์ ใช้ฝาทึบทัวไปมาเจาะรูปสำหรับรับแสงอินฟาเรด แล้วตัดส่วนนูนของหลอด LED 3 มิลลิเมตรมาติดไว้ที่รูดังรูปด้านล่าง
|
|
|
บันทึกการเข้า
|
|
|
|
m077531424
member
คะแนน 4
ออฟไลน์
กระทู้: 433
|
|
« ตอบ #1 เมื่อ: ตุลาคม 22, 2009, 04:31:09 pm » |
|
พี่สนใจทำเป็นชุดคิทขายไหมครับผมสนใจมากๆๆครับ
|
|
|
บันทึกการเข้า
|
|
|
|
kiano♥
|
|
« ตอบ #2 เมื่อ: ตุลาคม 22, 2009, 05:48:49 pm » |
|
วันนี้จะมาดูว่า ไอซีอ่านโค๊ดที่ส่งมาจากรีโมทได้อย่างไรนะครับ
ก่อนอื่นเราต้องรู้ก่อนว่า รีโมทนั้น ส่งอะไรออกมา จึงจะเขียนโปรแกรมให้อ่านโค๊ด แล้วเอาโค๊ดนั้นมาใช้งานได้ การดูว่า รีโมทส่งอะไรมานั้น ก็อาจจะต่อสโคป กับตัว IR Module ส่วนผมใช้วิธีต่อ PIC Kit-2 โดยใช้ฟังก์ชั่น Logic Analyzer ตัวที่ทำเป็นตัวอย่าง เป็นรีโมทวีซีดี ของจีนแดงทั่วไปครับ แล้วเราได้อะไร มาดูกันครับ ...
ตามรูปแนบด้านล่าง จะเห็นว่า รีโมททุกตัว จะส่งสัญญาณออกมาคล้ายๆกันครับ Start Code เป็นสัญญาณอย่างแรกที่ส่งออกมาเลย โดยจะมีสองสถานะ คือ เป็น low 8ms แล้วตามด้วย Hight 4.5ms Device Code สำหรับรีโมทตัวนี้ จะมีทั้งหมด 16 บิต ถ้าจะแปลตามตัวก็คือ เป็นรหัสของรีโมทตัวนั้นๆ คือถ้าเรากดปุ่มไหนของรีโมท มันก็จะส่งสัญญาณแบบนี้ออกมาก่อนครับ
|
|
|
บันทึกการเข้า
|
|
|
|
m077531424
member
คะแนน 4
ออฟไลน์
กระทู้: 433
|
|
« ตอบ #3 เมื่อ: ตุลาคม 22, 2009, 06:36:21 pm » |
|
พี่ครับผมPMไม่ได้ไม่ทราบว่าเป็นอะไร รบกวนพี่PMราคามาละกันครับ แล้วจะทำให้มีหลายๆๆช่องได้ไหมครับ(มากกว่า3)
ได้ครับ ทำกี่ช่องก็ได้ -ต้องแก้ไขวงจรใหม่ -ต้องแก้ไขโค๊ดใหม่
kiano
|
|
|
บันทึกการเข้า
|
|
|
|
kiano♥
|
|
« ตอบ #4 เมื่อ: ตุลาคม 22, 2009, 08:05:20 pm » |
|
จากรูปด้านบน จะเห็นแล้วนะครับ ว่าสัญญาณที่ส่งมานั้น ระหว่าง Logic 0 กับ Logic 1 นั้น มีอะไรที่ต่างกัน ครับ อธิบายเพิ่มคือ 0 จะประกอบด้วย คาบเวลาที่เป็น low 500us และคาบเวลาที่เป็น hi 500us 1 จะประกอบด้วย คาบเวลาที่เป็น low 500us และคาบเวลาที่เป็น hi 1800us จากรูปด้านล่าง เป็นโค๊ดที่ส่งมาจากรีโมท ยกตัวอย่าง 5 ปุ่มครับ จะเห็นได้ว่า 16 บิตแรก จะเหมือนกันทุกปุ่ม นั่นคือ device id data นั่นเอง ต่อมา 16 บิตด้านหลัง จะเป็น bottom data ซึ่งแต่ละปุ่มนั้น จะมีโค๊ดที่ส่งออกมาไม่เหมือนกัน และเราจะใช้ส่วนที่ไม่เหมือนกันนี่เองครับ มาใช้งาน ในโครงงานของเรา ไม่รู้ผมเรียกชื่อต่างๆถูกหรือไม่นะครับ จำไม่ค่อยได้ครับ ว่าเค้าเรียกว่าอะไร ดูรูปอธิบายแล้วอย่างเพิ่งตาลายนะครับ ผมทำเองผมยังตาลายเลย กระทู้ต่อไปจะเป็นโฟว์ชาร์ทการทำงานของโปรแกรมครับ กระทู้ต่อไปสงสัยต้องทำรูปเหนื่อยเลยครับ รูปประกอบ http://upload.mwake.com/v3.php?id=AO/FnkE0Liqej.jpg
|
|
|
บันทึกการเข้า
|
|
|
|
ถาวร-LSVteam
.กลุ่มผู้มีน้ำใจงาม.
member
คะแนน 955
ออฟไลน์
กระทู้: 7987
|
|
« ตอบ #5 เมื่อ: ตุลาคม 22, 2009, 08:10:33 pm » |
|
บอกขายได้เลยครับ ทางเว็บสนับสนุน คนที่คิดค้นทำ ครับ ชุดแรกเป็นเฮดพัลท์ จะบอกชนิดของอุปกรณ์ IRว่าเป็นคำสั่งของอะไร เช่น TV VDO หรือแอร์ ฯ ชุดที่2 น่าจะเป็นอีควอไรเซอร์พั้ลท์ เป็นเหมือนการ์ด กั้น คำสั่ง ซึ่งเป็นชุดที่3 ถ้าผมจำไม่ผิดนะครับเพราะว่าเรียนมาก็20ปีเข้าไปแล้ว อาจจะจำผิดมั่งก็ได้ จะหาหนังสือกลับมาอ่านคงรื้อบ้านกันไม่น้อย
|
|
|
บันทึกการเข้า
|
ยังสร้างความฉิบหายให้ประเทศไทยไมพอกันอีกหรือ ผู้ใดคิดร้ายให้ร้ายพระองค์ มันจงพินาจฉิบหายในเวลาอันใกล้
|
|
|
ถาวร-LSVteam
.กลุ่มผู้มีน้ำใจงาม.
member
คะแนน 955
ออฟไลน์
กระทู้: 7987
|
|
« ตอบ #6 เมื่อ: ตุลาคม 22, 2009, 10:06:22 pm » |
|
แผ่นปริ้นจ้างทำเขาคิดเป็นตารางนิ้วครับ ผมว่าแรกๆทำเองลดต้นทุนครับ ใช้แผ่นอีพร๊อกซี่ ใช้ดรายฟลีม หัดสักพักก็จะออกมาสวยครับ ก็เหลือแต่เคลือบสีปริ้น ก็จะออกมาสวยแล้วครับ คนมีความคิดสร้างสรรค์น่าสนับสนุนครับ ควรหารีโหมดราคาถูกตัวละ20กว่าบาทมาใช้ครับ เพราะเจอต่างยี่ห้อ พั้ลท์คำสั่งมันจะไม่ตรงกันครับ
|
|
|
บันทึกการเข้า
|
ยังสร้างความฉิบหายให้ประเทศไทยไมพอกันอีกหรือ ผู้ใดคิดร้ายให้ร้ายพระองค์ มันจงพินาจฉิบหายในเวลาอันใกล้
|
|
|
kiano♥
|
|
« ตอบ #7 เมื่อ: ตุลาคม 23, 2009, 01:27:29 am » |
|
ขอต่ออีกนิดครับ... มาดูโฟว์ชาร์ทการทำงานของโปรแกรมกันครับ จะว่าในส่วนของโปรแกรม main ก่อนเลยครับ ดูตามภาพแล้ว ก็ไม่ได้มีออะไรมากมายครับ คือ ถ้าไม่มีการกดสวิทช์ หรือกดรีโมท โปรแกรมจะวนภายในลูป main เพื่อคอยตรวจสอบ ว่ามีการกด สวิทช์ หรือกดรีโมทหรือไม่ แค่นั้นเองครับ แต่ถ้ามีการกดรีโมท มันก็จะกระโดดไปทำงาน ในส่วนของโปรแกรม อ่านค่ารีโมท ถ้ากดสวิทช์ มันก็จะกระโดดไปทำงานในส่วนของโปรแกรมอ่านค่าสวิทช์
|
|
|
บันทึกการเข้า
|
|
|
|
kiano♥
|
|
« ตอบ #8 เมื่อ: ตุลาคม 23, 2009, 01:36:55 am » |
|
ดูโฟว์ชาร์ท แล้วมาดูโค๊ดกันเลยครับ ...
MAIN: DECFSZ STACK_0, F GOTO $-1 BTFSS IR GOTO READ_IR DECFSZ STACK_0, F GOTO $-1 BTFSC SW GOTO READ_SW GOTO MAIN
นี่เลยครับ ไม่มีอะไรมากมาย ในโค๊ดส่วนนี้ แต่จะเห็นว่ามีอะไรเพิ่มเข้ามานิดหน่อย คือ หน่วงเวลาครับ ผมให้มันหน่วงเวลาสักนิด เพิ่อป้องกันการทำงานพลาดจาก นอยส์ที่เข้ามาทาง AC Line นั่นเองครับ
มีส่วนแตกต่างกันระหว่างการกดสวิทช์ กับการกดรีโมทคือ ปรกติ ถ้าไม่มีการกดสวิทช์ ขาอินพุตของสวิทช์ จะเป็น 0 ถ้ากดจะเป็น 1 แต่ขา อินพุตของ IR จะกลับกันกับสวิทช์ครับ คือปรกติถ้าไม่กดรีโมท จะอยู่ในสถานะ 1 เนื่องจาก อาร์พูลอัพที่ต่ออยู่กับขาอินพุตนั่นเองครับ
ปล.นี่เป็นโครงงานชิ้นแรกที่เขียนด้วยโค๊ด asm จริงๆครับ ถ้าท่านใดมีข้อเสนอแนะ หรือความคิดเห็นเพิ่มเติม ก็แทรกได้เลยนะครับ
|
|
|
บันทึกการเข้า
|
|
|
|
kiano♥
|
|
« ตอบ #9 เมื่อ: ตุลาคม 23, 2009, 01:50:18 am » |
|
ต่อมาเป็นโฟว์ชาร์ทการทำงานของส่วนอ่านค่าจากการกดสวิทช์ ในส่วนนี้ จะทำงานโดยการอ่านว่า สวิทช์ถูกกดกี่ครั้ง ในเวลาที่กำหนดไว้ ซึ่งจะนำค่าที่อ่านได้จากการกด ไปทำงานแบบนี้ครับ
กด 1 ครั้ง ให้สั่ง ปิด-เปิด หลอดไฟหลอดที่ 1 กด 2 ครั้ง ให้สั่ง ปิด-เปิด หลอดไฟหลอดที่ 2 กด 3 ครั้ง ให้สั่ง ปิด-เปิด หลอดไฟหลอดที่ 3
กด 6 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 1 ที่ควบคุมการทำงาน ให้ปิดหลอดไฟทุกหลอด หรือทุก CH นั่นเอง กด 7 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 2 ที่ควบคุมการทำงาน ปิด-เปิด หลอดไฟหลอดที่ 1 กด 8 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 3 ที่ควบคุมการทำงาน ปิด-เปิด หลอดไฟหลอดที่ 2 กด 9 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 4 ที่ควบคุมการทำงาน ปิด-เปิด หลอดไฟหลอดที่ 3 กด 10 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 5 ที่ควบคุมการทำงาน ให้เปิดหลอดไฟทุกหลอด หรือทุก CH นั่นเอง
จะเห็นว่า ฟังก์ชั่นของสวิทช์ จะมีส่วนเกี่ยวข้องกับฟังก์ชั่นอ่านค่า จากรีโมทด้วย ตัวอย่าง ถ้ากดสวิทช์ 6 ครั้ง มันก็จะไปรอรับสัญญาณจากรีโมท เพื่อรอให้เรากดปุ่ม ที่ต้องการสั่งงานให้ปิดหลอดไฟทุกหลอด หลังจากได้ค่าที่ส่งมาจากรีโมทแล้ว มันจะสั่งให้ eeprom เก็บค่าที่อ่านได้ เพื่อการใช้งานครั้งต่อไป ค่าที่ตั้งเอาไว้จะได้ไม่ลบหาย แม้เวลาไฟดับ
ด้วยเหตุที่ต้องเกี่ยวข้องกับฟังก์ชั่น IR ด้วย จึงต้องเพิ่มทางเลือกให้มันครับ โดยการกำหนดตัวแปรที่ชือ case ให้มัน โดยตัว case นี้จะเป็นตัวกำหนดว่า หลังจากอ่านค่า IR เสร็จแล้ว ให้ไปทำงานที่ส่วนไหนต่อ เพื่อเข้าใจง่ายขึ้น ดูโฟว์ชาร์ทด้านล่างประกอบเลยครับ เป็นโฟว์ชาร์ทการทำงานรวมของฟังก์ชั่นสวิทช์
|
|
|
บันทึกการเข้า
|
|
|
|
kiano♥
|
|
« ตอบ #10 เมื่อ: ตุลาคม 23, 2009, 06:45:33 pm » |
|
หลังจากดูแล้วว่าฟังก์ชั่นสวิทช์มีการทำงานโดยรวมเป็นอย่างไร ต่อไปเราจะมาดูรายละเอียดของฟังก์ชั่นนี้ ว่าแต่ละส่วนนั้นทำงานอย่างไร
READ_SW: CLRF SW_DATA CALL BEEP INCF SW_DATA, F MOVLW 0X50 MOVWF STACK_4 DECFSZ STACK_3, F GOTO $-1 DECFSZ STACK_4, F GOTO $-3 BTFSC SW ;ถ้ายังกดค้างอยู่ ให้กลับไป delay GOTO $-7
ตามโค๊ดด้านบนอธิบายได้ว่า หลังจากที่สวิทช์ถูกกดไป 1 ครั้งจากฟังก์ชั้นเมน แล้วยังไม่มีการปล่อยสวิทช์ ตัวแปรที่เก็บค่าการกดสวิทช์จะถูกเพิ่มขึ้น 1 ค่า แล้วจะหน่วงเวลาก่อน 20ms เพื่อรอการปล่อยมือจากสวิทช์ แต่ถ้าหน่วงเวลาแล้ว ก็ยังไม่มีการปล่อยมืออีก จะกลับไปหน่วงเวลาต่อ ซึ่งโฟว์ชาร์ทการทำงาน ดูได้จะรูปแนบด้านล่างครับ จะเห็นภาพการทำงานที่ชัดเจนขึ้น
|
|
|
บันทึกการเข้า
|
|
|
|
kiano♥
|
|
« ตอบ #11 เมื่อ: ตุลาคม 23, 2009, 07:09:16 pm » |
|
หลังจากที่มีการปล่อยสวิทช์แล้ว โปรแกรมจับเวลาก็จะเริ่มจับเวลา ว่า ภายในเวลา 3 วินาทีนั้น มีการกดสวิทช์ไปกี่ครั้ง โปรแกรมจับเวลาจะเริ่มจากแถว SW_L1: ไปจนถึง แถว SW_L2: MOVLW 0X07 ;จับเวลา 3 sec มีการกดกี่ครั้ง MOVWF STACK_2 SW_L1: DECFSZ STACK_0, F GOTO SW_L2 DECFSZ STACK_1, F GOTO SW_L1 DECFSZ STACK_2, F GOTO SW_L1 GOTO SW_L3 ;สิ้นสุดการจับเวลา SW_L2: BTFSS SW ;ช่วงที่จับเวลามีการกดสวิทช์หรือไม่ GOTO SW_L1 INCF SW_DATA, F ;ถ้ากด ก็ให้เพิ่่มค่าตัวแปร CALL BEEP MOVLW 0X50 MOVWF STACK_4 DECFSZ STACK_3, F GOTO $-1 DECFSZ STACK_4, F GOTO $-3 BTFSS SW ;ยังกดค้างอยู่หรือไม่ GOTO SW_L1 GOTO $-8 ;ถ้ายังกดค้างอยู่ให้กลับไป delay จนกว่าจะไม่กดค้าง ในระหว่างการจับเวลา โปรแกรมจะกระโดดไปตรวจสอบสวิทช์อยู่ทุกรอบไซเคิล เพื่อดูว่ามีการกดสวิทช์หรือไม่ ถ้ากดสวิทช์ แต่ยังไม่ปล่อย ก็จะมีการหน่วงเวลาซ้ำเข้าไปอีก ซึ่งจะเริ่มจากแถว SW_L2: ไปจนจบโปรแกรมอ่านสวิทช์ หลังจากที่ครบเวลา 3 วินาทีแล้ว เราจะได้อะไรจากโปรแกรมอ่านสวิทช์ ครับ จะได้ค่าการกดสวิทช์ นั่นก็คือค่า sw_data นั่นเอง ซึ่งจะใช้ค่านี้ ไปสั่งงานในโปรแกรมส่วนต่อไป... รูปประกอบ http://upload.mwake.com/v3.php?id=Or/EfPuWPJw9e.jpg
|
|
|
บันทึกการเข้า
|
|
|
|
kiano♥
|
|
« ตอบ #12 เมื่อ: ตุลาคม 23, 2009, 07:22:55 pm » |
|
คิดไม่ออกครับ ว่าต่อไปจะอธิบายอย่างไร เพราะมันทำงานเกี่ยวเนื่องกัน เอาเป็นว่ามาดูโฟว์ชาร์ทรวมของโปรแกรมกันดีกว่าครับ ถ้าไม่เข้าใจจุดไหนก็ถามแทรกมาได้เลยครับ ส่วนผมจะอธิบายไปเรื่อยๆ เท่าที่จะคิดได้ แต่ส่วนสำคัญก็คงจะเป็นส่วนของ โปรแกรมอ่านค่า จากรีโมทนั่นเองครับ จะมาดูกันว่า มันใช้ได้กับทุกรีโมทอย่างที่ผมเกริ่นไว้ได้จริงหรือไม่ รูปประกอบ http://upload.mwake.com/v3.php?id=zZ/o2zLV0fI9I.jpg
|
|
|
บันทึกการเข้า
|
|
|
|
kiano♥
|
|
« ตอบ #13 เมื่อ: ตุลาคม 23, 2009, 07:37:54 pm » |
|
จากรูปโฟว์ชาร์ทรวมการทำงานด้านบน จะเห็นได้ว่า ผมได้แยกสีไว้ครับ อธิบายได้ดังนี้คือ...
สีเขียว จะเป็นฟังก์ชั่นเมนของโปรแกรม ที่จะคอยตรวจสอบการสั่งงานจาก ยูสเซอร์ จะดูว่า มีการกดสวิทช์ หรือมีการกดรีโมทหรือไม่ ถ้าไม่ได้กดอะไร มันก็จะทำงานวนอยู่ในลูปของมัน
สีฟ้า จะเป็นส่วนของโปรแกรมอ่านค่าจากการกดสวิทช์ จะนับว่า เรากดสวิทช์ไปกี่ครั้ง ในเวลา 3 วินาที กด 1 ครั้ง โปรแกรมจะกำหนดให้ ค่า IR เท่ากับค่าที่อ่านได้จากอีพรอม นั่นก็คือปุ่มที่ 2 แล้วมันจะไปสั่งงาน ให้โปรแกรมควบคุมหลอดไฟทำงาน โดยจะตรวจสอบสถานะของหลอดไฟหลอดที่ 1 ถ้าเปิดอยู่ มันก็จะสั่งให้ปิด ถ้าหลอดไฟปิดอยู่ มันก็จะสั่งให้เปิด ซึ่งโปรแกรมควบคุมหลอดไฟ ก็จะอยู่ในกลุ่มสีม่วงนั่นเองครับ
แต่ถ้ากดสวิทช์ 6 ครั้งล่ะ มันก็จะสั่งงานในโหมดตั่งค่าปุ่มกดครับ โดยมันจะกระโดดไปรอรับคำสั่งจากตัวรีโมท รอให้เรากดปุ่มที่รีโมท แล้วก็จะจำค่าปุ่มนั่นเอาไว้ เพื่อนำมาใช้เป็นค่าอ้างอิงให้กับโปรแกรม ควบคุมหลอดไฟนั่นเอง
สีแดง จะเป็นโปรแกรมอ่านโค๊ดจากรีโมท จะอ่านได้สูงสุดขนาด 16 bit ซึ่งจะได้อธิบายในหัวข้อต่อไปครับ หลังจากอ่านโค๊ดจากตัวรีโมทได้ 16 บิตแล้ว มันก็จะนำค่าที่อ่านได้ มาเปรียบเทียบกับค่าอ้างอิง ที่ได้จากการตั้งค่าตามคำอธิบายด้านบน ถ้าค่าตรงกัน มันก็จะสั่งให้หลอดไฟ เปิด หรือ ปิด
|
|
|
บันทึกการเข้า
|
|
|
|
Ptn-LSVteam♥
.กลุ่มผู้มีน้ำใจงาม.
member
คะแนน 780
ออฟไลน์
กระทู้: 2770
|
|
« ตอบ #14 เมื่อ: ตุลาคม 23, 2009, 09:03:22 pm » |
|
แนวคิดการออกแบบดีมากๆครับ
|
|
|
บันทึกการเข้า
|
AV Electronic Pattani.
|
|
|
kiano♥
|
|
« ตอบ #15 เมื่อ: ตุลาคม 23, 2009, 09:20:52 pm » |
|
มาดูโปรแกรมอ่านค่ารีโมทกันครับ เริ่มจากอ่าน เฮดพัลล์ ก่อนครับ ถ้าดูรูปด้านล่างประกอบ จะเห็นว่า เฮดพัลล์ ประกอบไปด้วย Low 8 ms ตามมาด้วย HI 4.5 ms ซึ่งรีโมทแต่ละตัว จะส่งออกมาเวลาจะใกล้เคียงกัน งั้นผมก็เลยกำหนดเอาเลยว่า ช่วงที่เป็น Low นั้น มันจะอยู่ในเวลาระหว่าง 255 us - 10000 us ถ้าไม่ได้อยู่ในช่วงเวลานี้ ก็แสดงว่า มันไม่ใช่เฮดพัลล์ ให้กระโดดไป Error ช่วงที่เป็น่ HI ก็จะเขียนโปรแกรมอ่านลักษณะเดียวกันครับ คือจับเวลาว่า มันจะต้องอยู่ในช่วงเวลา 255 - 10000 us ถ้าไม่ได้เวลาตามนี้ ก็ให้โดดไปที่ Error ดูโค๊ดกันเลยครับ ส่วนของการอ่านเฮดพัลล์ MOVLW 0X08 ;จับเวลา 10 ms MOVWF STACK_1 DECFSZ STACK_0, F GOTO $+4 DECFSZ STACK_1, F GOTO $-3 GOTO ERR ;ถ้านานเกิน 10 ms ให้โดดไป Error INCF COUNT_0, F BTFSC STATUS, Z INCF COUNT_1, F BTFSS IR GOTO $-9 ;จับเวลาน้อยกว่า 255 us หรือไม่ MOVLW 0X01 SUBWF COUNT_1, W BTFSS STATUS, C GOTO ERR ;ถ้าน้อยกว่า 255 us ให้โดดไป Error รูปประกอบ http://upload.mwake.com/v3.php?id=b0/UkKQW3Jcjo.jpgขอขอบคุณ คุณพี่ Ptn-LSVteam♥ มากๆครับ ที่แวะมาให้กำลังใจครับ
|
|
|
บันทึกการเข้า
|
|
|
|
kiano♥
|
|
« ตอบ #16 เมื่อ: ตุลาคม 23, 2009, 09:57:33 pm » |
|
หลังจากอ่านเฮดพัลล์เสร็จแล้วโดยไม่มีการเออเร่อ คือถ้ามันเออเร่อ โปรแกรมมันจะเข้ามาในส่วนต่อไปนี้ไม่ได้ จึงไม่ต้องกังวลเลย ว่ามันจะแอบเปิดไฟของเราโดยที่เราไม่ได้สั่ง... และถึงแม้นอยส์ หรืออะไรก็แล้วแต่ ทำให้มันทำงานพลาด มันสามารถผ่านด่านเออเร่อสองครั้งของการอ่านเฮดพัลล์ แล้วเข้ามาส่วนนี้ได้ แต่มันก็ต้องเจอด่านอรหันต์ด่านต่อไปครับ คือ Lighting control นั่นเองครับ
ก่อนอื่นเรามาวิเคราะห์กันอีกทีครับ ว่าสัญญาณโค๊ดที่ส่งมาจากรีโมทนั้น หน้าตาเป็นอย่างไร ดูจากรูปแนบแล้วจะเห็นว่า ถ้ามันส่ง Logic 0 ออกมา มันจะประกอบไปด้วย 2 สถานะ นั่นคือ เป็น LO 500us แล้วเป็น HI 500us
แล้วถ้ามันส่ง Logic 1 ออกมา มันจะประกอบไปด้วย 2 สถานะเหมือนกัน แต่คาบเวลาจะต่างกัน นั่นคือ เป็น LO 500us แล้วเป็น HI 1800us ....... ข้อมูลอ้างอิงจากรีโมทเครืองวีซีดีจีนแดงทั่วไป
เอาล่ะครับ เราจะเขียนโปรแกรมอย่างไร ให้มันแยกแยะออก ว่าอันไหนเป็น Logic 0 หรือ 1 แถมยังต้องให้ครอบคลุม ได้กับรีโมททุกยี่ห้ออีก เพราะแต่ละยี่ห้อ มันต้องส่งออกมาคาบเวลาไม่เหมือนกันแน่นอน แถมจำนวนบิตที่ส่งออกมา ก็อาจจะไม่ใช่ 32 บิตเหมือนกับรีโมทยี่ห้อนี้....
|
|
|
บันทึกการเข้า
|
|
|
|
kiano♥
|
|
« ตอบ #17 เมื่อ: ตุลาคม 24, 2009, 08:11:09 am » |
|
เอางี้นะครับ เราปล่อยวางก่อน อย่าเพิ่งไปคิดอะไรมาก อย่าเพิ่งไปคิดว่ามันส่ง device code , data bottom อะไรของมันก็ให้มันส่งมา ช่วงที่มันเป็น LO เราจะจับเวลาลองดู เพิ่มค่าเวลาในตัวแปรของเรา ดูซิ ว่าตัวแปรของเรามันจะได้ค่าเท่าไหร่กัน โดยโค๊ดจับเวลาช่วงที่มันเป็น LO 500us ตามด้านล่างเลยครับ
IR_L1: CLRF STACK_1 IR_L2: MOVLW 1 ADDWF STACK_1, 1 ;เก็บเวลาช่่วง 0 ไว้ที่ตัวแปร STACK_1 NOP NOP NOP NOP NOP BTFSC STATUS, C ;stack-1 อยู่ระหว่าง 0~50 ถ้าวนเกิน 255 ให้ไปที่ case( 500us / 10us = 50 ) GOTO CASE BTFSS IR GOTO IR_L2 ;ถ้า ir ยังเป็น 0 ก็ให้กลับไปเพิ่มเวลา
จากโค๊ดจะเห็นได้ว่า ในการนับวน 1 รอบหรือเพิ่มค่าตัวแปร 1 ครั้งนั้น ต้องใช้คำสั่งถึง 10 คำสั่ง ซึ่งแต่ละคำสั่งจะใช้เวลา 1 us แล้วช่วงเวลาที่มันเป็น LOW นั้นมันใช้เวลา 500 us ใช่ไหมครับ งั้นตัวแปรของเราจะมีค่า 500/10 = 50 แล้วเก็บค่าไว้ในตัวแปร stack_1 ซึ่ง stack_1 นั้นจะรับค่าได้สูงสุดคือ 255 มันจะมีรีโมทตัวไหนบ้างนะ ที่จะส่งดาต้า LOW ออกมาเกิน 255x10 = 2550 us โอเคครับ คงไม่มีแน่ๆ ผมคิดว่าอย่างนั้นนะครับ ดังนั้นค่าที่จับเวลาได้ ผมจึงใช้แค่ 8 บิต หรือใช้ตัวแปรแค่ตัวเดียวครับ
หลังจากที่ลองจับเวลาช่วงเป็น LOW และได้ค่าตัวแปร STACK_1 มาแล้ว จะมาลองจับเวลาช่วงเป็น HI กัน โดยโค๊ดตามด้านล่างครับ
CLRF STACK_2 IR_L3: MOVLW 1 ADDWF STACK_2, 1 ;เก็บค่าที่นับได้ ไว้ที่ตัวแปร STACK_2 NOP NOP NOP NOP NOP BTFSC STATUS, C ;stack-2 อยู่ระหว่าง 0~180 ถ้าวนเกิน 255 ครั้งให้ไปที่ case ( 1800us / 10us = 180 ) GOTO CASE BTFSC IR GOTO IR_L3 ;ถ้า ir ยังเป็น 1 ก็ให้กลับไปเพิ่มเวลา
จะเห็นว่าเป็นโค๊ดตัวเดียวกันกับตัวจับเวลา LOW เพียงแต่จะเก็บค่าที่ได้ไว้ใน stack_2 มาดูกันครับ stack_2 จะมีค่าเท่าไหร่ 500/10 = 50 ตอนนี้เราจะได้ค่าตัวแปร 2 ตัวแล้วนะครับ คือค่าตัวแปร stack_1 = 50 และตัวแปร stack_2 =50 ซึ่งคาบเวลาเท่ากันก็หมายถึงเป็น Logic 0 นั่นเองครับ แล้วถ้าตัวแปรที่ได้เป็นอย่างนี้ครับ stack_1 = 50 และตัวแปร stack_2 = 180 (1800us / 10 = 180) ถ้าค่าตัวแปรออกมาแบบนี้ ก็หมายถึงรีโมทมันส่งค่า Logic 1 ออกมานั่นเอง ต่อไปจะดูโค๊ดตัวที่จะเป็นตัวตัดสินว่า บิตไหนจะเป็น 0 หรือบิตไหนจะเป็น 1
MOVF STACK_1, W ADDWF STACK_2, F MOVLW 0X9B SUBWF STACK_2, F BTFSC STATUS, C GOTO $+3 BCF IR_DATA, 0 GOTO IR_L1 BSF IR_DATA, 0 GOTO IR_L1
จากโปรแกรมด้านบนอธิบายได้แบบนี้ครับ... จะเห็นว่า จะนำค่า stack_1 กับ stack_2 มาบวกกัน แล้วลบด้วย 155 (Stack_1+stack_2)-155 แล้วจะตรวจสอบผลลัพธ์ที่ได้ ถ้าติดลบ ก็หมายถึง เป็น Logic 0 ถ้าค่าที่ได้ออกมาเป็นเลขบวก ก็หมายถึง Logic 1 ลองแทนค่าตัวแปรดูนะครับ (50+50)-155 = -55 ---> Logic 0 (50+180)-155 = 75 ---> Logic 1
|
|
|
บันทึกการเข้า
|
|
|
|
Nattawut-LSV Team
E23IUY
.กลุ่มผู้มีน้ำใจงาม.
member
คะแนน 808
ออฟไลน์
กระทู้: 3581
|
|
« ตอบ #18 เมื่อ: ตุลาคม 24, 2009, 08:36:49 am » |
|
|
|
|
บันทึกการเข้า
|
|
|
|
ลุงเคี้ยง-LSVteam♥
.กลุ่มผู้มีน้ำใจงาม..
member
คะแนน 1138
ออฟไลน์
กระทู้: 6667
ขอเป็นข้ารองบาททุกชาติไป
|
|
« ตอบ #19 เมื่อ: ตุลาคม 24, 2009, 09:23:58 am » |
|
|
|
|
บันทึกการเข้า
|
|
|
|
alassy
member
คะแนน 2
ออฟไลน์
กระทู้: 40
|
|
« ตอบ #20 เมื่อ: ตุลาคม 25, 2009, 11:26:29 pm » |
|
เขียนเป็นแอสแซมบลี้เลยหรือครับท่าน มึนจัง อิอิ
|
|
|
บันทึกการเข้า
|
|
|
|
moo
member
คะแนน 3
ออฟไลน์
กระทู้: 125
|
|
« ตอบ #21 เมื่อ: ตุลาคม 28, 2009, 06:19:54 am » |
|
น่าสนใจมากครับขอถามนิดนึ่งเวลาโปรแกรม IC ใช้วงจรอะไรครับ ผมใช้ pic Kit-2 OEM ครับ จะมีวิธีการโปรแกรมให้ดูด้วยครับ ในช่วงท้าย รวมทั้งการประกอบ การใช้งาน แต่ต้องรอหน่อยครับ และจะหาวิธีโปรแกรมที่ง่ายที่สุด สำหรับคนที่ยังไม่มีเครื่องโปรแกรมครับ จะได้ทำได้ทุกคนที่อยากทำ kiano
|
|
|
บันทึกการเข้า
|
|
|
|
kiano♥
|
|
« ตอบ #22 เมื่อ: ตุลาคม 28, 2009, 08:12:56 pm » |
|
หลังจากที่โปรแกรมคำนวนเวลาของพัลล์แต่ละลูกออกมาและได้รู้ว่าพัลล์ลูกไหนเป็น 0 หรือ 1 แล้วก็จะเก็บค่าเอาไว้ในตัวแปร 2 ตัวนั่นก็คือ IR_DATA และ IR_DATA_2 เราจะเขียนโปรแกรมได้ดังนี้ครับ IR_L1: CLRF STACK_1 IR_L2: MOVLW 1 ADDWF STACK_1, 1 NOP NOP NOP NOP NOP BTFSC STATUS, C GOTO CASE BTFSS IR GOTO IR_L2 CLRF STACK_2 IR_L3: MOVLW 1 ADDWF STACK_2, 1 NOP NOP NOP NOP NOP BTFSC STATUS, C GOTO CASE BTFSC IR GOTO IR_L3 RLF IR_DATA_2, F BTFSS IR_DATA, 7 GOTO $+3 BSF IR_DATA_2, 0 GOTO $+2 BCF IR_DATA_2, 0 RLF IR_DATA, F MOVF STACK_1, W ADDWF STACK_2, F MOVLW 0X9B SUBWF STACK_2, F BTFSC STATUS, C GOTO $+3 BCF IR_DATA, 0 GOTO IR_L1 BSF IR_DATA, 0 GOTO IR_L1 จากโค๊ดส่วนของการอ่านค่าที่รีโมทส่งมา จะเห็นว่าโปรแกรมจะไม่แยกแยะ ว่ารีโมทส่งอะไรออกมา จะอ่านแค่เฮดพัลล์ และโค๊ด 16 บิทหลังสุดดังนั้น โค๊ดนี้จึงอ่านได้กับทุกรีโมทครับ เพราะหลังจากอ่านแล้ว มันก็จะเก็บค่าที่อ่านได้ ไว้ใน ee-prom เพื่อเป็นค่าอ้างอิง ในการควบคุมการปิด-เปิดหลอดไฟ ซึ่งจะดูได้จากส่วนของโปรแกรมคุมหลอดไฟต่อไปครับ ดูการเก็บค่าไว้ในตัวแปรได้จากรูปแนบครับ รูปประกอบ http://upload.mwake.com/v3.php?id=Hm/I198UMvDuI.jpg
|
|
|
บันทึกการเข้า
|
|
|
|
msoamsoa
member
คะแนน 4
ออฟไลน์
กระทู้: 56
|
|
« ตอบ #23 เมื่อ: พฤศจิกายน 02, 2009, 10:51:14 pm » |
|
น่าสนใจมากเลยครับ แต่ผมอ่านแล้วไม่ค่อยจะเข้าใจเท่าไรเลยอ่าครับ พื้นฐานไม่มี
|
|
|
บันทึกการเข้า
|
|
|
|
ถาวร-LSVteam
.กลุ่มผู้มีน้ำใจงาม.
member
คะแนน 955
ออฟไลน์
กระทู้: 7987
|
|
« ตอบ #24 เมื่อ: พฤศจิกายน 03, 2009, 09:19:06 am » |
|
ผมแนะนำเรื่องตัวสวิท หน่อยครับ จะใช้ ฝาปิด ใหญ่ เป็นตัวกดสวิทใช่รึเปล่า ถ้าใช่ ผมแนะนำให้ ใส่สวิท ที่4มุม มุมละตัวครับ แทนที่จะใส่ตรงกลางเพียงตัวเดียว
--------------------------------------------------------------
ไม่ค่อยเข้าใจที่อาจารย์ถาวรแนะนำครับ คือหมายถึงใส่ตัวละมุม เพื่อรับแรงกดได้ทั่วแบบนี้หรือไม่ครับ หรือ ใส่ตัวละมุม แล้วให้แยกฟังก์ชั่นการทำงานของสวิทช์แต่ละตัวออก ตัวหนึ่ง ก็คุมไฟหลอดหนึ่ง แบบนี้หรือไม่ครับ
พอดีมีคนแนะนำผมมาว่า น่าจะแยกสวิทช์ออก ไม่ให้มีสวิทช์เดียว เพราะตอนใช้งานจะไม่ค่อยสะดวก ถ้ายังไงคงจะปรับปรุงแล้วทำเป็นอีกเวอร์ชั่นน่ะครับ ขอบคุณครับ kiano
|
|
|
บันทึกการเข้า
|
ยังสร้างความฉิบหายให้ประเทศไทยไมพอกันอีกหรือ ผู้ใดคิดร้ายให้ร้ายพระองค์ มันจงพินาจฉิบหายในเวลาอันใกล้
|
|
|
pop_9919
member
คะแนน 1
ออฟไลน์
กระทู้: 27
|
|
« ตอบ #25 เมื่อ: พฤศจิกายน 10, 2009, 03:32:33 pm » |
|
กด 1 ครั้ง ให้สั่ง ปิด-เปิด หลอดไฟหลอดที่ 1 กด 2 ครั้ง ให้สั่ง ปิด-เปิด หลอดไฟหลอดที่ 2 กด 3 ครั้ง ให้สั่ง ปิด-เปิด หลอดไฟหลอดที่ 3
กด 6 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 1 ที่ควบคุมการทำงาน ให้ปิดหลอดไฟทุกหลอด หรือทุก CH นั่นเอง กด 7 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 2 ที่ควบคุมการทำงาน ปิด-เปิด หลอดไฟหลอดที่ 1 กด 8 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 3 ที่ควบคุมการทำงาน ปิด-เปิด หลอดไฟหลอดที่ 2 กด 9 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 4 ที่ควบคุมการทำงาน ปิด-เปิด หลอดไฟหลอดที่ 3........
คือผมสงสัยว่าเรากดรีโมท 1ครั้ง เปิด-ปิดหลอด1 กด2ครั้ง เปิดปิดหลอด2...คือว่ากด2ครั้งปุ่มเดี๋ยวกันหรือคนละปุ่ม แล้วถ้าเราจะตั้งให้มันเป็น 1หลอดต่อหนึ่งปุ่มบนรีโมทได้หรือป่าวคับ
--------------------------------
ถ้าดูตามวงจร จะเห็นว่ามันมีสวิทช์อยู่ตัวเดียวครับ ซื่งการทำงานของสวิทช์ตามด้านบนวรรคแรก ส่วนการทำงานที่รีโมทนั้น จะมีปุ่มสั่งงานทั้งหมด 5 ปุ่มดังนี้
1 เปิดทุกหลอด 2 ปิด-เปิด หลอดที่ 1 3 ปิด-เปิด หลอดที่ 2 4 ปิด-เปิด หลอดที่ 3 5 ปิดหมดทุกหลอด
รีโมททั่วไปมันมีหลายปุ่มใช่ไหมครับ แต่ผมใช้แค่ 5 ปุ่มนี้มาใช้งาน ซึ่งการตั้งค่าที่ตัวรีโมท ว่าปุ่มไหนสั่งงานอะไร ก็ย้อนกลับไปอ่านด้านบนวรรคสอง kiano
|
|
|
บันทึกการเข้า
|
|
|
|
ถาวร-LSVteam
.กลุ่มผู้มีน้ำใจงาม.
member
คะแนน 955
ออฟไลน์
กระทู้: 7987
|
|
« ตอบ #26 เมื่อ: พฤศจิกายน 10, 2009, 07:11:06 pm » |
|
เป็นสวิทขนานกันไงครับ ไม่ว่าจะกดด้านไหน ลืมไปคำสั่งแบบนี้จะมีปัญหาเรื่องการกดอีกเพราะว่ามันอาจจะนับเป็นครั้งไปเลย ถ้าสวิทเริ่มไม่ดี ผมว่าใช้สักพักจะมีปัญหาเรื่องสวิทตัวนี้แน่นอน
|
|
|
บันทึกการเข้า
|
ยังสร้างความฉิบหายให้ประเทศไทยไมพอกันอีกหรือ ผู้ใดคิดร้ายให้ร้ายพระองค์ มันจงพินาจฉิบหายในเวลาอันใกล้
|
|
|
kiano♥
|
|
« ตอบ #27 เมื่อ: พฤศจิกายน 15, 2009, 09:09:18 am » |
|
หลังจากหายไปนาน จะว่ากันต่อในส่วนของโค๊ดตัวที่คุมการปิด เปิดหลอดไฟครับ
CONTROL: MOVF BOTTOM_0, W XORWF IR_DATA, W BTFSS STATUS, Z GOTO B1 MOVF BOTTOM_00, W XORWF IR_DATA_2, W BTFSS STATUS, Z GOTO B1 BCF CH1 BCF CH2 BCF CH3 CALL BEEP CALL DELAY GOTO MAIN
สมมุติก่อนครับว่า ค่าของปุ่มกดที่รีโมท 5 ปุ่มนั้น เราได้ทำการตั้งค่าไว้ใน ee-prom แล้ว คราวนี้ ตัวโค๊ดด้านบนนี้ จะดึงค่าปุ่มกดปุ่มที่ 1 ออกมาก่อน เพื่อจะเปรียบเทียบค่าที่อ่านได้จากการกดรีโมท ถ้าตรงกัน ก็จะสั่งงานให้ปิดไฟหมดทุกหลอด แต่ถ้าไม่ตรง ก็จะกระโดดไปเปรียบเทียบกับค่าป่มต่อไป ตามโค๊ดด้านล่างครับ
B1: MOVF BOTTOM_1, W XORWF IR_DATA, W BTFSS STATUS, Z GOTO B2 MOVF BOTTOM_11, W XORWF IR_DATA_2, W BTFSS STATUS, Z GOTO B2 MOVF GPIO, W MOVWF STACK_0 MOVLW 0X01 XORWF STACK_0, F BTFSS STACK_0, 0 GOTO $+3 BSF CH1 GOTO $+2 BCF CH1 CALL BEEP CALL DELAY GOTO MAIN
จากโค๊ดจะเห็นว่า จะดึงค่าปุ่มกดปุ่มที่ 2 ออกมาเปรียบเทียบกับค่าที่อ่านได้จากการกดรีโมท ถ้าค่าเท่ากัน ก็จะตรวจสอบว่า หลอดไฟหลอดที่ 1 เปิด หรือ ปิด อยู่ ถ้าเปิดอยู่ ก็จะสั่งให้ปิด หรือกลับกัน ถ้าปิดอยู่ ก็จะสั่งให้เปิด แต่ถ้าเปรียบเทียบแล้ว ค่าไม่เท่ากัน ก็จะกระโดดไปเปรียบเทียบกับปุ่มต่อไป ซึ่งโปรแกรมจะเขียนเหมือนกันครับ
|
|
|
บันทึกการเข้า
|
|
|
|
moo
member
คะแนน 3
ออฟไลน์
กระทู้: 125
|
|
« ตอบ #28 เมื่อ: พฤศจิกายน 18, 2009, 06:48:22 pm » |
|
อยากได้ไอซีที่เบิร์นแล้วครับไม่ทราบว่าถ้าขายตัวละเท่าไรครับ น่าลองทำเล่นดู
|
|
|
บันทึกการเข้า
|
|
|
|
|