วันพฤหัสบดีที่ 20 พฤศจิกายน พ.ศ. 2557

LED shift

วัตถุประสงค์

1. ฝึกทักษะการเขียน code ของโปรแกรม
 2.ฝึกการสังเกต และ แก้ไข code เมื่อเกิดบัค

อุปกรณ์ที่ใช้

1. FPGA Board                                                                          1 อัน


โจทย์
จงสร้างวงจรดิจิทัลสำหรับ FPGA ด้วยภาษา VHDL ที่ทำงานได้ดังต่อไปนี้
- ทำงานด้วย CLK ความถี่ 50 MHz
- มีอินพุต PB จากปุ่มกด push-button (active-low) หนึ่งชุดที่อยู่บนบอร์ด FPGA
- มีเอาต์พุต LEDS(7:0) ซึ่งนำไปต่อกับ LED 8 ดวงที่อยู่บนบอร์ด FPGA
- เริ่มต้น LEDS(7:0) จะมีเพียงดวงเดียวที่ติด (ON) ซึ่งเป็นดวงขวาสุด LEDS(0) และที่เหลือจะต้องไม่ติด (OFF) 
- เมื่อกดปุ่มแล้วปล่อยหนึ่งครั้ง จะทำให้ตำแหน่งของ LED ที่ติด (ON) เลื่อนไปทางซ้ายหนึ่งตำแหน่งถัดไป ถ้าเลื่อนไปจนซ้ายสุดแล้ว ถัดไปจะกลับไปเริ่มที่ตำแหน่งขวาสุด

Code

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity shiftled is
            port(
            CLK : in std_logic;
            button : in std_logic;
            led : out std_logic_vector(7 downto 0)
            );
end shiftled;
architecture data of shiftled is
signal count : integer range 0 to 2000 :=0;
signal check : std_logic := '0';
signal x : std_logic;
signal reg : std_logic_vector(7 downto 0) := "00000001"; //กำหนดค่าเริ่มต้นให้กับ LED 8ดวง
begin
            process (CLK)
            begin
                        if rising_edge(CLK) then
                                    if count<2000 then
                                    count <= count+1;  
                                    end if;           
                                    if count = 2000 then //กำหนดเงื่อนไขเพื่อหน่วงเวลาในการทำงาน เพื่อให้โปรแกรม
                                                                                                       เข้ามาทำตามคำสั่งด้านในแค่ครั้งเดียวต่อการกด1ครั้ง
                                                if button = '1' then //เมื่อกดปุ่ม
                                                                    x <= button ;
                                                end if;
                                                if button = '0' then //เมื่อปล่อยปุ่ม
                                                            check <= (x xor check); //ใส่ค่าให้ check เพื่อตรวจสอบว่า                                                                                                                              มีการกดปุ่มหรือไม่
                                                            if check = '1' then //เมื่อcheck เป็น1แสดงว่ามีการกดปุ่มแล้ว                                                                                                                            ปล่อย1ครั้ง
                                                                        reg <= reg(6 downto 0)&reg(7); //เลื่อน                                                                                                                            บิตLEDไปทางซ้าย
                                                                        check <='0';
                                                            end if;
                                                            x <= button; ;  //กำหนดให้เป็นค่า0เพื่อเตรียมพร้อมในการกดปุ่ม                                                                                                                            ในครั้งต่อไป
                                                end if;
                                                count <=0;  //กำหนดให้เป็นค่า0เพื่อเตรียมพร้อมในการกดปุ่มในครั้งต่อไป
                                    end if;
                        end if;
            end process;
            led <= reg;  //ให้led มีค่าเท่ากับ reg ที่ได้ทำการเลื่อนบิตมาแล้ว
end data;



วันพุธที่ 5 พฤศจิกายน พ.ศ. 2557

โจทย์ปฏิบัติสัปดาห์ที่ 28/10/2557

2) จงออกแบบวงจรนับ binary counter ขนาด 32 บิต
- มีอินพุต CLK ความถี่ 50MHz (ได้จากวงจรสร้างความถี่บนบอร์ด FPGA)
- มีขา LED(7:0) ซึ่งเป็นเอาต์พุตและต่อกับ LED บนบอร์ด FPGA
และให้แสดงสถานะลอจิกของตัวนับ 8 บิต นับจากซ้ายสุด (บิตที่ 31..24)
- ให้ออกแบบวงจรโดยใช้ภาษา VHDL
- ทดลองในบอร์ด FPGA และเขียนรายงานการทดลอง

อุปกรณ์ที่ใช้

1. FPGA Board                                                                                                                                  1 อัน




Code VHDL
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity counter is
            port(
            clock : in std_logic;         //เป็นการกำหนดให้ clock เป็นสัญญาณ input
            led : out std_logic_vector( 7 downto 0 )   // กำหนดให้ Led เป็น output โดยมีจำนวน 8 bit
            );
end counter;

architecture DATAFLOW of counter is
            signal count : std_logic_vector( 31 downto 0 );  // กำหนดให้ตัวแปร countมีทั้งหมด 32 บิต
            begin
            process (clock)        
                        begin
                        if clock'event and clock = '1' then     //กำหนดเงื่อนไข เมื่อมีสัญญาณ clock เข้ามา
                                    count <= count +1;              //ให้ count เพื่มค่าขึ้น 1
                        end if ;
                        led <= count(31 downto 24);          //ให้ Led รับค่าของ count บิตที่31-24
            end process;
end DATAFLOW;



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

การทดลองที่ 5.4 การเชื่อมต่อวงจรอิเล็กทรอนิกส์ด้วยแสง

วัตถุประสงค์

     1. ฝึกต่อวงจรโดยใช้อุปกรณ์เชื่อมต่อทางแสง เช่น เบอร์ PC817
     2. ประยุกต์ใช้งานอุปกรณ์ชนิดนี้ร่วมกับบอร์ด Arduino และใช้ควบคุมการจ่ายกระแสให้โหลด

อุปกรณ์ที่ใช้ในการทดลอง
     1. แผงต่อวงจร (เบรดบอร์ด)                            1 อัน
     2. อุปกรณ์เชื่อมต่อทางแสง PC817                 1 ตัว
     3. ไดโอดเปล่งแสงสีแดงหรือสีเขียว               1 ตัว
     4. ตัวต้านทาน 220Ω หรือ 330Ω                      1 ตัว
     6. ทรานซิสเตอร์ NPN เบอร์ PN2222A           1 ตัว
     7. ตัวต้านทาน 1kΩ                                          1 ตัว
     8. ตัวต้านทาน 4.7kΩ                                       1 ตัว
     9. ตัวต้านทาน 10kΩ                                        1 ตัว
     10. ตัวต้านทานปรับค่าได้ 10kΩ หรือ 20kΩ     1 ตัว
     11. ไดโอด 1N400x                                          1 ตัว
     12. มอเตอร์ไฟฟ้ากระแสตรงขนาดเล็ก            1 ตัว
     13. สายไฟสำหรับต่อวงจร                               1 ชุด
     14. มัลติมิเตอร์                                                 1 เครื่อง
     15. แหล่งจ่ายแรงดันควบคุม                            1 เครื่อง
     16. ออสซิลโลสโคปแบบดิจิทัล                       1 เครื่อง

ขั้นตอนการทดลอง

     1. ต่อวงจรบนเบรดบอร์ดตามรูปที่ 5.4.1 ให้สังเกตว่า ในผังวงจรมี GND1 และ GND2 แยกกันซึ่ง
จะต้องไม่นำมาต่อเข้าด้วยกันโดยเด็ดขาด


*ขั้นตอนนี้ใช้ตัวต้านทาน 10k ต่อขนานกันแทนตัวต้านทาน 4.7k

     2. ให้ใช้แรงดันไฟเลี้ยง +5V และ GND1 ให้ใช้จากบอร์ด Arduino แต่สำหรับ +9V และ GND2
ให้ใช้จากแหล่งจ่ายแรงดันควบคุม
     3. เขียนโค้ด Arduino โดยสร้างสัญญาณแบบ PWM โดยใช้คำสั่ง analogWrite() เพื่อสร้างสัญญาณเอาต์พุตที่ขา D5 โดยปรับค่า Duty Cycle ของสัญญาณเอาต์พุตตามค่าที่อ่านได้จากตัวต้านทานปรับค่าได้ ซึ่งต่อเป็นอินพุตที่ขา A1

รูปวงจรที่ใช้ในการทดลอง
Code
const byte input =A1;
const byte led =5;
void setup(){
   pinMode(led,OUTPUT);
   analogReference(DEFAULT);
   Serial.begin(9600);
}
void loop(){
   int value =analogRead(input)/4;
   Serial.println(value);
   analogWrite(led,value);
   delay(500);
}


     4. ใช้ออสซิลโลสโคปวัดสัญญาณที่ขา E ของ PC817 เทียบกับ GND2 แล้วทดลองหมุนปรับที่
ตัวต้านทานปรับค่าได้ เพื่อปรับค่า Duty Cycle เป็น 0% 25% 50% และ 100% ตามลำดับ
บันทึกรูปคลื่นสัญญาณที่ได้ในแต่ละกรณี

Duty Cycle เป็น 0% 

Duty Cycle เป็น 25% 

Duty Cycle เป็น 50% 

Duty Cycle เป็น 100% 

     5. ทดลองเปลี่ยนจาก LED และตัวต้านทาน เป็นมอเตอร์ไฟฟ้ากระแสตรงขนาดเล็ก (ปรับแรงดันไฟเลี้ยงจาก +9V ให้เป็นแรงดันไฟเลี้ยงที่เหมาะสมกับมอเตอร์ไฟฟ้า +VM) โดยต่อวงจรตามรูปที่ 5.4.2 และ ทดลองปรับค่า Duty Cycle





*เมื่อปรับให้ค่าDuty Cycle ให้มากขึ้น มอเตอร์ไฟฟ้าก็จะยิ่งหมุนเร็วขึ้น






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

การทดลองที่ 5.2 การตรวจจับวัตถุในระยะใกล้ด้วยแสงอินฟราเรด

วัตถุประสงค์

  • ฝึกต่อวงจรโดยใช้ไดโอดเปล่งแสงอินฟราเรดและโฟโต้ทรานซิสเตอร์
  • เขียนcode สำหรับควบคุมการทำงานบอร์ด Arduino เพื่อใช้ตรวจจับวัตถุในระยะใกล้

รายการอุปกรณ์

  • แผงต่อวงจร (เบรดบอร์ด)                                                 1 อัน
  • ไดโอดเปล่งแสงอินฟราเรด                                               1 ตัว
  • ไดโอดเปล่งแสงสีแดงหรือสีเขียว                                     1 ตัว
  • โฟโต้ทรานซิสเตอร์                                                           1 ตัว
  • ตัวต้านทาน 220Ω                                                             1 ตัว
  • ตัวต้านทาน 330Ω หรือ 470Ω                                            1 ตัว
  • ตัวต้านทาน 10kΩ                                                              1 ตัว
  • ตัวเก็บประจุแบบ Electrolytic 1uF หรือ 10uF (มีขั้ว)          1 ตัว
  • สายไฟสำหรับต่อวงจร                                                       1 ชุด
  • มัลติมิเตอร์                                                                         1 เครื่อง


ขั้นตอนการทดลอง

1. ออกแบบวงจร (วาดผังวงจร) โดยใช้ไดโอดเปล่งแสงอินฟราเรดและโฟโต้ทรานซิสเตอร์ 1 ชุด พร้อมตัวต้านทานตามที่กำหนดให้ แล้วนำสัญญาณเอาต์พุตของวงจรส่วนนี้ ไปต่อเข้าที่ขาอินพุต A1 ของบอร์ด Arduino และให้มีวงจร ไดโอดเปล่งแสง (LED) พร้อมตัวต้านทานจำกัดกระแส 330Ω หรือ 470Ω ที่ต่อกับขาเอาต์พุต D5 ของบอร์ด Arduino เพื่อใช้เป็นเอาต์พุตในการแสดงผล


2. ต่อวงจรตามผังวงจรที่ได้วาดไว้บนเบรดบอร์ด ให้ใช้แรงดันไฟเลี้ยง VCC=+5V และ Gnd จากบอร์ด Arduino เท่านั้น ห้องปฏิบัติการระบบสมองกลฝังตัว (ESL) / มจพ. ดร.เรวัต ศิริโภคาภิรมย์
ผังวงจรของการทดลอง


3. เขียนโค้ดสำหรับ Arduino ให้แสดงพฤติกรรมดังนี้ เมื่อมีวัตถุเข้าใกล้ (อยู่เหนือ) ตัวส่งและตัวรับแสง อินฟราเรดของวงจร (เช่น ที่ระยะห่างประมาณ 10 cm หรือน้อยกว่า) จะทำให้ LED เริ่มกระพริบด้วยความถี่ต่ำ (อย่างช้าๆ) แต่ถ้าวัตถุเข้าใกล้มากขึ้น LED จะกระพริบด้วยความถี่สูงขึ้น แต่ถ้าไม่มีวัตถุอยู่ในระยะใกล้ LED จะต้องไม่ติด (ไม่กระพริบ) ให้ทดลองกับวัตถุต่างสีกัน เช่น สีขาวและสีดำ
CODE
const byte input = A1;    //กำหนดให้ input เป็น ขาA1 ของ Arduino
const byte Led = 5;        //กำหนกให้ Led เป็นขา digital ขา5
void setup() {
  pinMode(Led, OUTPUT);     //กำหนดให้Led เป็น output(แสดงที่หลอดLED)
  digitalWrite(Led, LOW);       //กำหนดให้เริ่มแรก หลอดLEDดับ
  analogReference(DEFAULT);
  Serial.begin(9600);

}

void loop() {
  int value = analogRead(input);    //กำหนดให้ value มีค่าเป็นA1 คือค่าที่รับมาจาก output ของ โฟโต้ทรานซิสเตอร์   
  Serial.println(value);
  if (value < 900) {                       //ค่า900มาจากการวัดค่า value เมื่อไม่มีวัตถุใดๆอยู่เหนือวงจร ค่าที่วัดได้มีค่า มากกว่า900
    int x = (2 * value / 10);           //เป็นตัวกำหนดค่าว่าจะให้LED กระพริบเร็วมากน้อยแค่ไหน
    digitalWrite(Led, HIGH);      //กำหนดให้LEDติด
    delay(x);                                //ค่า delay จะเป็นการหน่วงเวลาในการวน void loop
    digitalWrite(Led, LOW);      //กำหนดให้LEDดับ
    delay(x);
  }
  else {
    digitalWrite(Led,LOW);
  }

}



4. เขียนรายงานการทดลอง ซึ่งประกอบด้วยคำอธิบายการทดลองตามขั้นตอน ผังวงจรที่ถูกต้องครบถ้วนตามหลักไฟฟ้า (ให้วาดด้วยโปรแกรม Cadsoft Eagle) รูปถ่ายของการต่อวงจรบนเบรดบอร์ด และตอบคำถามท้ายการทดลอง


คำถามท้ายการทดลอง

           1. ในการทดลอง ถ้าใช้วัตถุต่างสีกัน จะมีผลต่อการทำงานของวงจรที่แตกต่างกันหรือไม่ จงอธิบาย

ตอบ มีผลเนื่องจาก กระดาษสีขาวมีการสะท้อนของแสงได้ดีกว่า

วันพฤหัสบดีที่ 25 กันยายน พ.ศ. 2557

การทดลองที่ 4.7 การสร้างวงจรสร้างและควบคุมแรงไฟฟ้ากระแสตรงแบบปรับค่าได้

วัตถุประสงค์

  • ฝึกออกแบบและต่อวงจรสร้างและควบคุมแรงดันไฟฟ้ากระแสตรงแบบปรับค่าได้ โดยใช้ไอซี
    LM317T เพื่อใช้เป็นแหล่งจ่ายให้วงจรอิเล็กทรอนิกส์
รายการอุปกรณ์
  • แผงต่อวงจร (เบรดบอร์ด)                                                1 อัน
  • ไอซี LM317T                                                                  1 ตัว
  • ตัวเก็บประจุ 0.1uF และ 10uF อย่างละ                             1 ตัว
  • ตัวต้านทานค่าคงที่ เลือกค่าในช่วง 220Ω ถึง 1kΩ           1 ตัว
  • ตัวต้านทานปรับค่าได้แบบสามขา 4.7kΩ หรือ 10kΩ        1 ตัว
  • ไดโอด 1N4001 อย่างน้อย                                                1 ตัว
  • สายไฟสำหรับต่อวงจร                                                      1 ชุด
  • แหล่งจ่ายแรงดันควบคุม                                                  1 เครื่อง
  • มัลติมิเตอร์                                                                       1 เครื่อง
ขั้นตอนการทดลอง
  1. ออกแบบวงจร วาดผังวงจร และต่อวงจรบนเบรดบอร์ด เพื่อสร้างวงจรควบคุมแรงดันแบบปรับค่าได้โดยใช้ไอซี LM317T และอุปกรณ์ตามรายการที่ได้ระบุไว้ (ศึกษาตัวอย่างวงจรได้จากดาต้าชีทLM317T และจากอินเทอร์เน็ต)


  2. ใช้แรงดันจากแหล่งจ่ายภายนอก โดยป้อนแรงดัน +9V เป็นแรงดันอินพุต และปรับค่าตัวต้านทาน
    ปรับค่าได้ในวงจร ให้ได้แรงดันเอาต์พุต +5V และ +3.3V ตามลำดับ ตรวจสอบและวัดระดับแรงดันเอาต์พุตด้วยมัลติมิเตอร์
ผลการทดลอง

 รูปการต่อวงจรบนเบรดบอร์ด





ค่าที่วัดได้เมื่อปรับตัวต้านทานปรับค่าได้

 

วันศุกร์ที่ 19 กันยายน พ.ศ. 2557

การทดลองที่ 4.4 สัญญาณอินพุต-แอนะล็อกและการใช้งานร่วมกับบอร์ด Arduino

วัตถุประสงค์

  • ฝึกต่อวงจรเพื่อสร้างสัญญาณแอนะล็อค และป้อนให้บอร์ด Arduino เพื่อใช้เป็นสัญญาณอินพุต
  • เขียนโปรแกรมสำหรับ Arduino เพื่อเปิด/ปิด LED ตามสภาวะแสง

วัสดุอุปกรณ์

  • แผงต่อวงจร (เบรดบอร์ด)                                   1 อัน
  • บอร์ด Arduino (ใช้แรงดัน +5V)                         1 บอร์ด
  • ตัวต้านทานปรับค่าได้ 10kΩ หรือ 20kΩ           1 ตัว
  • ตัวต้านทานไวแสง LDR                                      1 ตัว
  • ไดโอดเปล่งแสงขนาด 5 มม.                               1 ตัว
  • ตัวต้านทาน 330Ω หรือ 470Ω                           1 ตัว
  • ตัวต้านทาน 10kΩ                                               1 ตัว
  • สายไฟสำหรับต่อวงจร                                        1 ชุด
  • มัลติมิเตอร์                                                           1 เครื่อง


ขั้นตอนการทดลอง

1. ต่อวงจรตามผังวงจรในรูปที่ 4.4.1 บนเบรดบอร์ด ร่วมกับบอร์ด Arduino โดยใช้แรงดันไฟเลี้ยงVCC=+5V และ Gnd จากบอร์ด Arduino เท่านั้น (ต่อวงจรบนเบรดบอร์ดก่อน จากนั้นจึงเชื่อมต่อสัญญาณอินพุตและเอาต์พุตของบอร์ด Arduino เมื่อตรวจสอบความถูกต้อง แล้วจึงป้อนแรงดันไฟเลี้ยงและ Gnd ตามลำดับ)

2. เขียนโปรแกรมตามตัวอย่างโค้ดที่กำหนดให้ และทำขั้นตอน Upload จากนั้นให้ทดลองหมุนปรับค่าที่ ตัวต้านทานปรับค่าได้ หรือปิดบริเวณส่วนรับแสงของ LDR เปิดหน้าต่าง Serial Monitor ของArduino IDE แล้วสังเกตข้อความที่ถูกส่งมาจากบอร์ด Arduinoห้องปฏิบัติการระบบสมองกลฝังตัว (ESL) / มจพ. ดร.เรวัต ศิริโภคาภิรมย์

3. ปรับแก้โค้ดตัวอย่าง เพื่อให้วงจรและบอร์ด Arduino แสดงพฤติกรรมดังนี้ ถ้าปิดส่วนรับแสงของตัวต้านทานไวแสง LDR หรือมีปริมาณแสงน้อยลง จะทำให้ LED1 “สว่าง” แต่ถ้า LDR ได้รับแสงตามสภาวะแสงปรกติ หรือได้รับปริมาณแสงมาก จะทำให้ LED1 “ไม่ติด”


4. เขียนรายงานการทดลอง ซึ่งประกอบด้วยคำอธิบายการทดลองตามขั้นตอน ผังวงจรที่ถูกต้องครบถ้วนตามหลักไฟฟ้า (ให้วาดด้วยโปรแกรม Cadsoft Eagle) รูปถ่ายของการต่อวงจรบนเบรดบอร์ด โค้ด Arduino ที่ได้ทดลองจริงพร้อมคำอธิบายโค้ด/การทำงานของโปรแกรมโดยละเอียด และตอบคำถามท้ายการทดลอง


รูป4.4.1 รูปผังวงจรสำหรับต่อวงจรบนเบรดบอร์ดร่วมกับบอร์ด Arduino 

โค้ดที่ 4.4.1  โค้ดตัวอย่างสำหรับ Arduino
const byte LDR_PIN = A1; // from LDR
const byte VREF_PIN = A2; // from Trimpot
const byte LED1_PIN = 5; // to LED1
void setup() {
   pinMode( LED1_PIN, OUTPUT );
   digitalWrite( LED1_PIN, LOW );
   analogReference( DEFAULT );
   Serial.begin( 9600 ); // open serial port
}
void loop() {
   // read analog values
   int value1 = analogRead( LDR_PIN );
   int value2 = analogRead( VREF_PIN );
   // send message to serial port
   Serial.print( "Read " );
   Serial.print( value1, DEC );
   Serial.print( ", " );
   Serial.println( value2, DEC );
   delay( 200 );
}

แก้ไขโค้ดเพื่อทำตามโจทย์ ข้อ 3
const byte LDR_PIN = A1; // from LDR
const byte VREF_PIN = A2; // from Trimpot
const byte LED1_PIN = 5; // to LED1
void setup() {
   pinMode( LED1_PIN, OUTPUT );
   digitalWrite( LED1_PIN, LOW );
   analogReference( DEFAULT );
   Serial.begin( 9600 ); // open serial port
}
void loop() {
   int value1 = analogRead( LDR_PIN );
   int value2 = analogRead( VREF_PIN );
   if(value1<750){
      digitalWrite( LED1_PIN, HIGH );
   }
   else{
      digitalWrite( LED1_PIN, LOW );
   }
}


คำถามท้ายการทดลอง

1. ค่าที่ได้ (เลขจำนวนเต็ม) จากบอร์ด Arduino สำหรับสัญญาณอินพุตที่ขา A1 มีค่าอยู่ในช่วงใด(ต่ำสุด-สูงสุด)

ตอบ 359 - 996

2. จะต้องปรับแก้โค้ดอย่างไรสำหรับบอร์ด Arduino ถ้าจะทำให้ LED1 มีความสว่างมากน้อยได้ตามปริมาณแสงที่ได้รับ เช่น ถ้า LDR ได้แสงสว่างน้อย จะทำให้ LED1 สว่างมาก แต่ถ้า LDR ได้แสงสว่างมาก จะทำให้ LED1สว่างน้อย หรือไม่ติดเลย
ตอบ

const byte LDR_PIN = A1; // from LDR
const byte VREF_PIN = A2; // from Trimpot
const byte LED1_PIN = 5; // to LED1
void setup() {
   pinMode( LED1_PIN, OUTPUT );
   digitalWrite( LED1_PIN, LOW );
   analogReference( DEFAULT );
   Serial.begin( 9600 ); // open serial port
}
void loop() {
   int value1 = analogRead( LDR_PIN );
   int value2 = analogRead( VREF_PIN );
   int light = (1023-value1)*255/1023 ;
   analogWrite( LED1_PIN, light);
}