วันพฤหัสบดีที่ 29 ตุลาคม พ.ศ. 2558

LAB04 sin wave (microcontroller interface)

1.แนวคิดและวิธีการเขียนโค๊ด

  • ใช้พื้นฐานเรื่อง กราฟ sin(zeta) ครึ่งคาบจะตัดแกนx ที่ pi (pi=3.14159265359) ดังนั้นจึงให้ค่าตัวแปรเพิ่มไปเรื่อยๆจาก 0 จนถึงค่า pi  เพื่อสร้างกราฟ sin(zeta) ในช่วง 0 ถึง 1 
  • ถ้าค่าเกินกว่า pi ให้เข้าเงื่อนไขเพื่อทำ Two's Complement เราจะได้กราฟ sin(zeta) ในช่วง 0 ถึง -1  
  • นำการเลื่อนแกนมาช่วยเพื่อให้กราฟขยับขึ้นไปจาก -1 ถึง 1 เป็น 0 ถึง 2 ด้วยการ บวกหนึ่งค่า sin(zeta) 
  • แปลงค่าจาก 0 ถึง 2 ให้เป็น 0 - 4095 เพื่อส่งออกด้วยคำสั่ง MCP.writeA()

2.การทำงานของโปรแกรม



Step 1 : ต่อ nucleo กับ IC MCP4922 เพื่อช่วยแปลงค่า digital เปลี่ยนให้เป็น analog เนื่องจากเป็นรุ่น F411RE 

Step 2 : นำ Output IC MCP4922 ไปต่อเข้ากับ scope ของ hantek เพื่อวัดสัญญาณที่ส่งออกมา

Step 3 : โปรแกรมจะสร้าง sin wave เริ่มจากค่า sin(zeta)ตั้งแต่ 1 ถึงสอง 2  แล้วค่อย  Two's Complement  พื่อสร้าง sin wave ตั้งแต่ 1 ถึง 0 สลับไปเรื่อยๆ

3.code ที่กลุ่มของเราเขียนขึ้นครับ

http://www.mediafire.com/download/342w100zsmzqwwe/LAB_04_sinwave.rar

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

Assignment 2 (microcontroller interface)

1. แนวคิด และ วิธีการเขียน code


  • สามารถ ส่งค่า 0 - 99 จาก smartphone ไปแสดงบนบอร์ด NX-100 ในรูปแบบของ 7-segment ได้
  • อ่านค่า VR adjust ที่อยู่บนบอร์ด NX-100 แล้วส่งกลับไปให้ Smartphone ได้ในรูปแบบ Voltage 
  • มีการใช้ switch case ในการลำดับเงื่อนไขว่าควรจะเข้า menu ไหนก่อน และ หลัง 
  • สร้าง busout 2 ชุด busout 1 ชุดควบคุม 7-segment 1 ตัว
  • รับค่า analog จาก VR adjust แล้วนำไป calculation ให้ได้ 0 - 3.3 V เพื่อตอบค่ากลับไปที่ smartphone  

ปัญหาที่พบ


  • เริ่มแรกผมใช้function  pc.getc() กับ pc,readable() เป็นส่วนสำคัญแต่ความยากอยู่ตรงค่าที่ได้รับจาก smartphone เป็น ascii ผมจึงต้องสร้าง function ที่แปลง ascii เป็น int แต่ด้วยความที่มันใช้งานได้ลำบาก และเสียเวลา จึงเปลี่ยนเป็นรับค่าโดย function scanf() แทน เพราะสามารถรับค่าเป็น int ได้เลย ไม่ต้องแปลงค่าอีก
  • การที่ใช้ scanf() มีข้อเสียคือต้องส่ง "\n" มาหลังค่า data ที่เราส่งเพื่อให้ scanf() รู้ว่านั่นคือจบdataแล้ว แต่ทั้งนี้ app อย่าง roboremo สามารถ setting ค่าได้ว่าตอนจบ จะให้ส่ง "\n" ปิด    ท้ายเสมอ

2. VDO แสดงการทำงานของ Program

#เราได้ทำการ test โดยใช้ application "Terminal Bluetooth" ของ Android

Step 1 : เลือกว่าจะกด 1 : ส่งเลข 00-99 ไปแสดงที่ 7-segment 
                              กด 2 : ถามหาค่า Voltage ของ VR adjust ณ ปัจจุบัน

Step 2 : เมื่อเลือกปุ่ม 1 ให้ใส่ค่า 00 - 99 ลงไปโดยมี "\n" ปิดท้าย

Step 3 : ค่าdata ที่รับเข้ามาจะถูก show บน 7-segment ทั้ง 2 อันเป็นตัวเลขตามที่ส่งจาก smartphone

Step 4 : เมื่อเลือกปุ่ม 2 ระบบจะส่งค่า Voltage กลับมาให้กับผู้ใช้ทันทีในรูปของ text ตัวอย่างเช่น

"Voltage from VR adjust : 0.47 V " เป็นต้น



3.code ที่กลุ่มของเราเขียนขึ้นครับ

http://www.mediafire.com/download/21tnmfoql1zc51i/Assignment2_digitalFRA221.rar

LAB 03 (microcontroller interface)

1.แนวคิดและวิธีการเขียนโค๊ด

- เป็นการเขียนโปรแกรมเพื่อให้บอร์ดนิวคลีโอสื่อสารกับคอมพิวเตอร์ได้ โดยสามารถสั่งงานผ่าน serial monitor ของ Arduino
- เราได้นำโปรแกรมที่เรียนในคลาสมาประยุกต์แก้ไขเป็นโปรแกรมของเรา แบ่งออกเป็นสองส่วนคือ 1. Output LED 8 ดวง มี 3 pattern  2. Function ในการรับค่า switchจาก บอร์ดNX-100 ว่า On / Off
-  มีการแบ่ง state เพื่อให้โปรแกรมสามารถเข้าใจได้ง่าย
- ใช้ switch  case เพื่อ check ว่า ascii ที่รับเข้ามานั้นเป็นโหมดการทำงานไหน
- มีรูปแบบ show display ที่ LED 8 ดวง สองแบบคือ 1. LED ติดจากซ้ายไปขวา 2.ไล่ติด LED เปน binary เริ่มจากเลข  0 - 255 แสดงแบบ 8 bit
- ต้องการให้สามารถใส่คำสั่งเข้าแล้ว pattern ที่ Display LED เปลี่ยนทันที โดยไม่ต้องรอให้วนลูป for จบก่อน

2.การทำงานของโปรแกรม

-  เมื่อเริ่มการทำงาน หน้าจอ serial monitor จะขึ้นมาให้เรากดเลือกโหมดการทำงาน โดยจะมี 2 โหมดให้เลือก  ถ้าส่งค่า 1 ก็จะโหมด 1 ส่งค่า 2 ก็จะโหมด 2
- เมื่อเลือกเข้าสู่โหมด 1 ทางหน้าจอ serial monitor ก็จะขึ้นหัวข้อมาให้เลือกอีกสามโหมด
    - a  ถ้าส่งค่า a ไปโหมดนี้จะเป็นการไปสั่งให้ LED วิ่งเป็นแพทเทิร์นๆหนึ่ง
    - d  ถ้าส่งค่า d ไปดหมดนี้จะเป็นการสั่งให้ LED วิ่งอีกแพทเทิร์นหนึ่ง
   - s   ถ้าส่งค่า s ไปจะเป็นการออกจากโหมด 1 ไปสู่หัวข้อเริ่มต้นให้เลือกโหมดใหม่ว่าจะ 1 หรือ 2

- เมื่อเลือกเข้าสู่โหมด 2 จะเป็นการไปอ่านค่าว่า สวิสต์ On หรือ Off อยู่และจะแสดงผลออกมาทาง Serial monitor จากนั้นก็จะออกจากโหมดนี้โดยอัตโนมัติ  กลับไปเมนูเริ่มต้น


3.code ที่กลุ่มของเราเขียนขึ้นครับ

http://www.mediafire.com/download/n6u9zyxhpnyrvlz/LAB_03.rar

วันอาทิตย์ที่ 18 ตุลาคม พ.ศ. 2558

LAB 02 (microcontroller interface)

LAB 2.1

1.แนวคิดและวิธีการเขียนโค๊ด

เป็นการเขียนโปรแกรมให้สามารถรับค่าแรงดันไฟฟ้า แบบ Analog จาก VR adjust  และนำมาแสดงในรูปของ หลอด LED 8 ดวง โดย ระดับของแรงดันไฟฟ้าจะแปรผันตรงกับจำนวน LED ที่ติด แรงดันไฟฟ้าเข้ามาน้อย LED ก็จะติดน้อย และไล่ระดับไปเรื่อยๆ จนติดครบทั้ง 8 ดวง
- ในการเขียน โปรแกรมนั้นก็ไม่มีอะไรมากครับ เริ่มต้น ก็แน่นอนต้องมีคำสั่งอ่านค่าสัญญาณ Analog
เมื่อได้ค่า Analog มาแล้วก็จะเป็นในส่วนเงื่อนไขต่างๆ โดยกลุ่มผมทำการแบ่งสัญญาณ Analog ออกเป็น 8 ช่วง จ่ายแรงดันมามากแค่ใหน ถึงช่วงใหน LED ก็จะติดถึงช่วงนั้น จะเห็นว่าในโค๊ดจะมี คำสั่ง If else อยู่ 9 ตัว โดยแบ่งเป็น คำสั่ง on ไฟ LED 8 ระดับ และ  คำสั่งที่ 9 คือ off LED
ในโปรแกรมพวกผมเลือกใช้คำสั่ง BusOut หรือก็คือ คำสั่งที่ทำให้แปลงค่าจากเลขฐานสิบเป็นเลขฐานสอง แล้วส่งค่าออกไป On LED 8 bit ดังนั้นจึงได้ตัวเลขฐานสองตั้งแต่ 0 ถึง 255
-โดยพวกผมมอง LED ทั้งแปดตัว เป็นเลขฐานสอง 8 bit ดังนั้นในแต่ละฟังชั่นของฟังชั่น If else ก็จะทำการจับ LED มาเท่ากับเลข ฐานสิบค่าหนึ่งที่เมือส่งออกไปในรูปเลขฐานสอง 8 bit แล้วจะทำให้ LED on ตามจำนวนที่ต้องการ
     Example แรงดันแรงมากแต่ยังไม่แรงที่สุดจะให้ LED ติด 7 ดวง ในฟังชั่น else if ก็ทำการจับLED มาเท่ากับ 127 เพราะเมื่อแปลงเป็นเลขฐานสอง 8 bitแล้วจะได้ 01111111 ไฟจะติดแค่เจ็ดดวง



2. VDO การทำงานของโปรแกรม

         เมื่อทำการหมุนปุ่ม VR adjust มากขึ้นเรื่อยๆ LED ก็จะติดเรียงกันไปเรื่อยๆตามระดับแรงดันไฟฟ้าที่ VR adjust ปล่อยออกมา ตั้งแต่ 0 V - 3.3 V Display เป็น LED 8 ดวง คิดเป็น 8 ระดับ    

ค่า VR adjust   = 0 V    => LED ทั้ง 8 ดวงดับหมด
ค่า VR adjust >= 3.3 V => LED ทั้ง 8 ดวงติดครบทุกดวง


3.code ที่กลุ่มของเราเขียนขึ้นครับ

http://www.mediafire.com/download/l33dfg146wy00vr/LAB02_01.rar



LAB 2.2

1.แนวคิดและวิธีการเขียนโค๊ด

-เป็นการเขียนโปรแกรมให้สามารถรับค่าแรงดันไฟฟ้า แบบ Analog จาก VR adjust  และนำมาแสดงออกทาง 7-SEGMENT แบบเดียวกับ Volt meter
-ในส่วนของโปรแกรมนั้นก็แน่นอน ต้องเขียนคำสั่งเพื่ออ่านค่า Analog ของแรงดันไฟฟ้าที่มาจาก ปุ่มหมุน VR adjust
-เมื่อได้ ค่าสัญญาณ analog มาแล้ว เนื่องจากการอ่านค่าสัญญาณ Analog จะอ่านอยู่ในช่วง 0-1.0 แต่เราต้องการให้ค่า Max สุดแสดงที่ 3.3 (เนื่องจากบอร์ดนิวคลีโอรับไฟได้มากสุด 3.3 volt) จึงนำค่าที่ได้มาคูณ 3300 (ที่คูณ 3300 แทนที่จะเป็น 3.3 เพราะจะได้ความละเอียดของค่าที่มากกว่า
-ในการจะแสดงผลออกทาง  7-SEGMENT จำเป็นจะต้องส่งค่าออกไปในรูปเลขฐานสอง จึงใช้คำสั่ง BusOut และต้องใช้ สองตัว เพื่อแสดงจำนวนเต็มและหลักทศนิยมหนึ่งตำแหน่ง
-จากนั้นก็นำค่า Analog ที่ได้ หาร ด้วยหนึ่งพันเก็บไว้ในตัวแปร INT ตัวหนึ่งทำให้ค่าที่ได้จะเป็นจำนวนเต็ม แล้วก็ ส่งออกไปทางคำสั่ง BusOut ตัวแรก
-ในการจะคิดหาหลักทศนิยมนั้น กลุ่มผม นำค่าจำนวนเต็มที่ส่งไปกับ BusOut ตัวแรกนั้นคูณหนึ่งพัน เก็บไว้ในอีกตัวแปร
-จากนั้นก็นำค่า Analog ที่วัดได้มาลบกับค่าที่เก็บเอาไว้ จะทำให้ได้ส่วนต่างออกมา ซึ่งเมื่อนำส่วนต่างนั้นไปหารด้วยหนึ่งร้อย  ก็จะได้หลักทศนิยม และทำการส่งออกไปกับ BusOut ตัวที่ 2

2. VDO การทำงานของโปรแกรม

- เมื่อทำการหมุน VR adjust จะทำให้เกิดสัญญาณ Analog ของค่าแรงดันไฟฟ้าออกมาและก็ไปแสดงผลกับ                7-SEGMENT  ค่าออกมาเป็น Voltage ตั้งแต่ 0 V - 3.3 V


3.code ที่กลุ่มของเราเขียนขึ้นครับ

http://www.mediafire.com/download/3qhp927i9r26337/LAB02_02.rar

วันอังคารที่ 13 ตุลาคม พ.ศ. 2558

LAB01 (microcontroller interface)

1. แนวคิด และ วิธีการเขียน code

- สามารถควบคุม Delay เพิ่ม/ลด ได้จาก button ที่เป็น Debounce Switchs 2 ปุ่ม
- ควบคุมการติดของ LED จาก ซ้ายไปขวา และ ขวาไปซ้ายได้เอง จาก Switchเลื่อนตัวที่ 0
- แสดง Display(Output) เป็น LED 8 ดวง ทั้งหมด 3 pattern
- สามารถ Reset Delay กลับไปที่ค่าเริ่มต้นได้ จาก Switchเลื่อนตัวที่ 1
- มี Input ทั้งหมด 4ปุ่ม
- แบ่งการทำงานเป็น state เพื่อให้ควบคุมได้ง่ายขึ้น
- ไม่ต้องการสั่งให้ LED ทั้ง 8 ดวง ติดและดับ ทีละดวง

ปัญหาที่พบ

- เรื่อง DigitalIn/DigitalOut แบบ Array
DigitalIn Input[3]={D0,D1,D2};
DigitalOut LED[8]= {D3,D4,D5,D6,D7,D8,D9,D10};
แต่มี error เกิดขึ้นเพราะว่าไม่สามารถวน while(1){} จึงไปศึกษาจาก Handbook พบว่านิยมใช้
BusOut LED(D3,D4,D5,D6,D7,D8,D9,D10); มากกว่า
จึงนำมาใช้ในการสร้าง pattern ของ LEDs ทั้ง 8 ตัว
- การเปลี่ยน state จะทำได้ก็ต่อเมื่อหมดการทำงานของ state นั้นๆแล้วครับ ไม่สามารถเปลี่ยนกระทันหันในทีเดียวได้
- DigitalIn D0 D1 ไม่สามารถใช้งานได้ครับ อาจเนื่องจากเป็นportเฉพาะ
- การใช้คำสั่ง BusOut จำต้องคำนวณเลขให้ได้เพราะ Output ออกมาเป็นตัวเลขฐาน2  8 bit จึงยุ่งยากกว่าการสั่งแบบทั่วไป แต่สั้นกว่า
Example
         for (int j=0; j<256; j++)
                {
                LED = j;
                wait_ms(100);  
                }
นี่คือ pattern การ Output LED 8 ดวง เป็นตัวเลขฐาน2 ตั้งแต่ 0-255 แบบ 8 bit ครับ


2. VDO แสดงการทำงานของ Program




Step 1 : LED ไล่ติดจากขวาสุดไปซ้ายสุด/  ติดพร้อมกันหมดทุกดวง / ไล่ดับจากขวาสุดไปซ้ายสุด โดยที่ switch ตัวที่0 ยังเป็น logic 0 delay 150 ms

Step 2 : กด  Debouce Switch ตัวที่ 2 เพิ่มDelayขึ้น เป็น1000 ms การติด/ดับของ LED ช้าลง

Step 3 : กด Debouce Switch ตัวที่ 1 ลดDelayลงเหลือ 50 ms การติด/ดับของ LED เพิ่มขึ้น

Step 4 : กด  switch ตัวที่0 เป็น logic1 pattern LED จะติดไล่จากซ้ายสุดไปขวาสุด / ติดพร้อมกันหมดทุกดวง / ไล่ดับจากซ้ายสุดไปขวาสุด

Step 5 :  กด  switch ตัวที่1 เป็น Logic1 Reset Delay เป็น 150 ms

Step 6 : กดDebounce Switch ตัวที่ 1 และ ตัวที่ 2 พร้อมกัน LED จะติดเป็นเลขฐาน2 จาก 1-255 Output แบบ 8 bit

3.code ที่กลุ่มของเราเขียนขึ้นครับ

http://www.mediafire.com/download/3zzirijgl3biz9v/LAB01_microcontroller_interface.rar