วันอาทิตย์ที่ 13 ธันวาคม พ.ศ. 2558

Final Project


นาฬิกาปลุกแบบเล่นเกมได้

       - ฟังก์ชันพื้นฐานของนาฬิกาปลุกนี้ได้แก่การดูเวลา, ตั้งนาฬิกาปลุก, ดูเวลาที่เหลืออยู่ก่อนปลุก, มีโหมดเล่นเกม, สามารถดูบันทึกการตื่นนอนได้, สามารถใช้ bluetooth สั่งงานจากมือถือได้
       - นาฬิกานี้เมื่อปลุกแล้วจะเข้าสู๋โหมดเล่นเกม ซึ่งผู้ใช้จะต้องเล่นให้ผ่านตามคะแนนที่กำหนดนาฬิกาจึงจะหยุดปลุก โดยมีเกมให้เลือกอยู่ 2 เกม ได้แก่เกมงูและเกมข้ามถนน
       - การตั้งค่าต่าง ๆ ของนาฬิกาจะทำได้โดยการส่งเลข 5 ตัวจากโทรศัพท์ โดยเลขตัวแรกจะเป็นตัวที่บอกว่าจะส่งไปตั้งค่าอะไร
       - การกดเลือกคำสั่งต่าง ๆ ของนาฬิกาจะทำได้โดยใช้ joystick เลื่อนขึ้นลงเพื่อเลือกคำสั่ง แล้วจึงเลื่อน joystick ไปทางขวาเพื่อเลือกคำสั่งนั้น และเลื่อนไปทางซ้ายเพื่อกลับมาที่หน้าเมนู




       - ในวิดีโอแรกนี้จะแสดงฟังก์ชันพื้นฐานต่าง ๆ ของนาฬิกายกเว้นฟังก์ชัน bluetooth

      



       - วิดีโอนี้แสดงการตั้งเวลาของนาฬิกาผ่านทาง bluetooth โดยหากเลขตัวแรกเป็นเลข 0 จะเป็นการตั้งเวลาที่จะแสดง และหากเป็นเลข 1 จะเป็นการตั้งเวลาที่จะปลุก



       - วิดีโอนี้เป็นการตั้งระดับความยากของเกม โดยจะส่งเลขตัวแรกเป็นเลข 2 และเลขตัวต่อไปจะเป็นระดับความยากของเกม ตั้งแต่ 1 - 3 โดย 3 จะยากที่สุด และเลขอีก 3 ตัวที่เหลือสามารถเป็นเลขอะไรก็ได้ไม่มีผลต่อการทำงานของนาฬิกา



       - การใช้ bluetooth เพื่อดูบันทึกการตื่นนอนจะส่งเลขตัวแรกเป็นเลข 3 และข้อมูลจะมาแสดงที่หน้าจะโทรศัพท์

************************************

วันอาทิตย์ที่ 6 ธันวาคม พ.ศ. 2558

วันศุกร์ที่ 27 พฤศจิกายน พ.ศ. 2558

week 10 Lab 3

การทำงานและแนวคิดของโค้ด
       - ในโค้ดนี้เราเขียนฟังก์ชันของโหมดที่ 1 ไว้ก่อนเพื่อให้สะดวกแก่การทำงาน และในฟังก์ชัน main จะแสดงข้อความบอกว่าโหมดไหนทำอะไรและต้องส่งค่าอะไรเพื่อเข้าโหมดนั้น จากนั้นจึงรอรับค่าเพื่อทำงานต่อไป โดยหากค่าที่ส่งมาไม่ตรงกับโหมดใดเลยก็จะแสดงเมนูใหม่อีกครั้ง 
       - โหมด 1 จะเป็นการเปิด LED ใน pattern ต่าง ๆ โดยในโปรแกรมนี้จะมีอยู่ 2 pattern โดยจะเลือกโหมดโดยการส่งค่าตัวอักษร a หรือ d และถ้าหากส่งค่าตัวอักษร s จะทำการปิด LED ทั้งหมดและกลับไปหน้า menu
       - โหมด 2 จะแสดงค่าของสวิตซ์ตัวซ้ายของบอร์ด Nx-100 ว่าเป็น logic 0 หรือ 1 แล้วจึงกลับไปหน้า menu

***********************************


VDO แสดงการทำงานของโปรแกรม

       - เมื่อเริ่มทำงาน Serial Monitor จะแสดงหน้า menu ขึ้นมา โดยจะมีให้เลือกโหมดการทำงาน 2 โหมด ขึ่นอยู่กับค่าที่ส่งไปทาง Serial Monitor 
       - โหมด 1 เริ่มทำงานเมื่อส่งค่าเลข 1 ไปทาง Serial Monitor โดยจะเป็นการเปิด LED ใน pattern ต่าง ๆ ในโปรแกรมนี้จะมีอยู่ 2 pattern เลือกได้โดยการส่งต่าตัวอักษร a หรือ d ไปทาง Serial Monitor และหากส่งตัวอักษร s จะเป็นการปิดไฟ LED และกลับไปที่หน้า menu
       - โหมด 2 จะทำงานเมื่อส่งค่าเลข 2 ไปทาง Serial Monitor โดยจะเป็นการอ่านค่าของสวิตซ์ตัวซ้ายสุดบนบอร์ด NX100 ว่าเป็น logic 0 หรือ 1 แล้วจึงแสดงผลเป็นเลข 0 หรือ 1 ออกมาทางหน้าจอ Serial Monitor และเมื่อแสดงผลเสร็จแล้ว จะกลับไปที่หน้า menu
      

************************************

week 11 Lab 4

การทำงานและแนวคิดของโค้ด

       - .ในโปรแกรมจะใช้การวนลูปไปเรื่อย ๆ และเนื่องจากค่าที่ส่งไปได้มากสุดอยู่ที่ 4095 และค่า sine จะวนครบรอบที่รอบละ 2*pi เรเดียน ในการวนลูปแต่ละรอบจึงส่งค่า sine ไป 4095 ครั้ง โดยแต่ละครั้งจะเพิ่มค่ามุมขึ้น pi/2047 เรเดียนแล้วจึงคูณค่าที่ได้ด้วย 2047 เพื่อขยายสัญญาณ และเมื่อส่งครบแต่ละรอบจะตั้งค่ามุมกลับไปเป็น 0 แล้วจึงเริ่มส่งค่ารอบใหม่

     การรับ-ส่งค่ามนที่นี้ จะคล้าย ๆ กับการพล็อตกราฟ โดยเมื่อเราต้องการรูปของกราฟ sine เราจึงวนลูปค่าของ i (เปรียบเสมือนแกน x) ให้วนตั้งแต่ 0 ไปจนถึง 4094 ซึ่งเป็นค่าสูงสุดที่เราจะส่งค่าไปได้ แล้วจึงนำค่า i ไปแปลงให้อยู่ในรูปของกราฟ sine (ซึ่งเปรียบเสมือนแกน y) โดยใช้สมการคือ (sin(i*(2*pi)/4094)*(4094/2))
     ป.ล. ที่ต้องคูณด้วย 2pi/4094 เนื่องจากกราฟ sine จะมีการวนครบ 1 รอบเมื่อองศาเปลี่ยนไปตั้งแต่ 0-2pi และที่ต้องหารด้วย 4094 เนื่องจาก i มีค่าอยู่ในช่วง 0-4095 จึงต้องการแบ่งสัญญาณของกราฟ sine ออกเป็นช่วงเล็ก ๆ
     ป.ล.2 ที่ต้องนำสมการ sine ไปคูณกับ (4094/2) เนื่องจากต้องการขยายกราฟ sine ให้มีสัญญาณใหญ่ขึ้น จะได้ง่ายต่อการมองเห็น

***********************************


VDO แสดงการทำงานของโปรแกรม




************************************

week 12 Lab 5

การทำงานและแนวคิดของโค้ด

       - ในโค้ดนี้การรับสถานะของสวิตซ์จะใช้ DigitalIn แบบ array เช่นเดียวกันกับการส่ง DigitalOut ไปเป็นสัญญาณเปิดปิด LED 
       - ในการควบคุมโหมดการทำงานของโค้ดนี้ จะใช้ค่าสถานะของสวิตซ์ 2 ตัว และตัวแปรอีกหนึ่งตัวจะเป็นตัวช่วยควบคุมให้โปรแกรมทำคำสั่งเพียงครั้งเดียวต่อการกดสวิตซ์ 1 ครั้ง
       - สำหรับโหมดที่ 1 ซึ่งเป็นการเขียนข้อมูลลงไปบน eeprom จะใช้ array 1 ตัวรับค่าสถานะของสวิตซ์ของบอร์ด NX100 จากนั้นจึงใช้การรันลูป 7 ครั้งเพื่อเขียนข้อมูลลงไปบน eeprom 7 ตำแหน่ง (เขียนทีละตำแหน่ง แต่ละตำแหน่งใช้ loop 1รอบ) โดยหากมีการบันทึกข้อมูลเพิ่มขึ้น address ที่ใช้บันทึกก็จะเลื่อนไปทีละ 7 ตำแหน่งเรื่อย ๆ ด้วย หรือก็คือ หากบันทึกข้อมูลแล้วจะทำการเลื่อน address ไปยังตำแหน่งที่ว่างตำแหน่งถัดไปเพื่อไม่ให้เกิดการซ้อนทับกันของข้อมูล
       - โหมดที่ 2 เป็นการอ่านข้อมูลจากใน eeprom 7 ตำแหน่ง โดยจะใช้การวนลูป 7 รอบเพื่อรับข้อมูลมาเก็บไว้ในตัวแปร array (รับข้อมูลจาก eeprom มาเก็บไว้ใน array ทีละตำแหน่ง) จากนั้นจึงใช้ค่าในตัวแปรนั้นไปควบคุมสถานะของหลอด LED แต่ละหลอด


***********************************


VDO แสดงการทำงานของโปรแกรม

       - โปรแกรมนี้เป็นการใช้บอร์ด nucleo ติดต่อกับ eeprom โดยโปรแกรมจะมีโหมดการทำงาน 2 โหมดซึ่งสามารถเลือกโหมดได้โดยสวิตซ์ทางซ้ายสุดบนบอร์ด NX100 โดยหากสวิตซ์อยู่ที่ logic 1 จะเป็นการบันทึกค่าสถานะของสวิตซ์อีก 7 ตัวที่เหลือลงไปบน address 7 ตัวแหน่งของ eeprom และหากสวิตซ์ตัวซ้ายสุดอยู่ที่ logic 0 จะเป็นการอ่านค่าที่บันทึกอยู่ให eeprom มาแสดงผ่านทางหลอด LED 7 หลอด โดยการทำงานแต่ละรอบจะต้องกดสวิตซ์ User_Button บนบอร์ด nucleo ก่อน


       
************************************

วันจันทร์ที่ 19 ตุลาคม พ.ศ. 2558

week 9 Lab 2.2

การทำงานและแนวคิดของโค้ด

       - โปรแกรมนี้จะเป็นการรับค่าแรงดันไฟฟ้ามาจากนั้นจึงแสดงค่าความดันไฟฟ้าด้วย 7-segments หรือก็คือ LED เส้นๆ 7 เส้นที่แสดงผลแล้วเป็นตัวเลขนั่นเอง ซึ่งในที่นี้จะแสดงค่าได้ตั้งแต่ 0.0 ถึง 3.3 V และมีความละเอียดเป็นทศนิยม 1 ตำแหน่ง
       - โค้ดที่เขียนขึ้นนั้น จะมีการทำงานประมาณนี้
       - เริ่มจากรับค่า analog ของแรงดันไฟฟ้ามา โดยค่าที่รับมาจะอยู่ในช่วงของ 0.0 ถึง 1.0จากนั้นก็นำค่าที่ได้มาคูณด้วย 33.0 เพื่อให้ค่าอยู่ในช่วง 0 ถึง 33 แทน
       - เมื่อได้ค่าที่เป็นเลข 2 หลักมาแล้วก็จะทำการแยกให้ได้ค่าของเลขหลักหน่วยและหลักสิบมาเพื่อใช้ควบคุม 7-segments 
      e.g. ถ้าไฟจ่ายเข้ามา 1.3 V โปรแกรมจะได้ค่าที่คูณด้วย 33 แล้วเป็น 13 แยกได้หลักสิบเป็น 1 และหลักหน่วยเป็น 3 ทำให้ 7-segments ตัวขวาแสดงค่า 3 และตัวซ้ายแสดงค่า 1

***********************************


VDO แสดงการทำงานของโปรแกรม

       - เมื่อจ่ายแรงดันเข้าไป ค่าของแรงดันก็จะแสดงออกมาเป็นตัวเลขที่ความละเอียดทศนิยม 1 หลัก



       * note : เพราะบอร์ดจะประมวลผลได้โดยไม่เอ๋อที่ความดันช่วง 0 ถึง 3.3 เพราะงั้นช้วงท้ายๆ VDO ที่ค่าเด้งกลับไปน้อยๆทั้งที่ให้ V มากๆเป็นเพราะให้ค่ามากเกินช่วงที่บอร์ดจะประมวลผลได้นั่นเอง

************************************
Code ที่เขียนขึ้น
         http://www.mediafire.com/download/pa64uhuc8c6n6vn/week+9+lab2.2.rar


week 9 Lab 2.1

การทำงานและแนวคิดของโค้ด

       - โปรแกรมนี้จะเป็นการรับค่าแรงดันไฟฟ้ามาและแสดงความดันไฟฟ้าในรูปแบบของหลอด LED 8 ดวง โดยจำนวนหลอด LED ที่สว่างจะแปรผันตรงกับค่าความดันไฟฟ้า โดยจะติดเรียงจากขวาไปซ้าย
     
       - โค้ดที่กลุ่มของเราได้เขียนขึ้นนั้น ใช้การประกาศตัวแปรแบบ array ของ LED ทั้ง 8 ดวง
       - จากนั้นโปรแกรมก็จะทำการรับค่า analog ของแรงดันไฟฟ้ามาในช่วงของ 0.0 ถึง 1.0 แล้วโปรแกรมจึงนำเลขนั้นมาคูณด้วย 3300 เพื่อให้ค่าออกมาดูเข้าใจง่ายขึ้นเพราะอยู่ในช่วง 0 ถึง 330 ซึ่งคล้ายกับช่วงความดันไฟฟ้าที่บอร์ดจะประมวลผลได้โดยไม่เอ๋อไปซะก่อน
       - และสำหรับ logic ของการเปิด LED เนื่องจากว่าความดันสูงสุดที่จะประมวลผลได้คือ 3.3 V และมี LED 8 ดวง เราจึงแบ่ง 3.3 ออกเป็น 8 ช่วง ได้ประมาณช่วงละ 0.4 V จึงให้ค่า 0.4*n เป็นตัวบอกว่าหลอดที่ n จะติดหรือไม่ โดยจะวนลูปของ LED ทั้ง 8 ดวง เพื่อเช็คดูว่าหลอดไหนจะติดบ้าง
      e.g. ถ้าไฟจ่ายเข้ามา 1.3 V LED จะติดถึงหลอดที่ 3 เพราะว่า 1.3 > 0.4*3 แต่ 1.3 < 0.4*4

***********************************


VDO แสดงการทำงานของโปรแกรม

       - เมื่อทำการเพิ่มความดันไฟฟ้าที่จ่ายให้บอร์ด ไฟ LED ก็จะค่อยติดเพิ่มขึ้นไปเรื่อยๆ จนเมื่อความดันไฟฟ้าที่จ่ายไปมีค่า >3.2 V หลอด LED จะติดครบทุกดวง
      

************************************
Code ที่เขียนขึ้น
         http://www.mediafire.com/download/89vmg8h7h0l5zhl/week+9+lab2.1.rar