วันจันทร์ที่ 1 ธันวาคม พ.ศ. 2557

รายงานความคืบหน้า สัปดาห์ที่1

Mini Project
รายงานความคืบหน้า ครั้งที่ 1
ส่วนที่ทำแล้ว
1.     คอมพิวเตอร์
·         ออกแบบให้เป็น GUI โดย โปรแกรม Processing
·         กําหนดค่าในช่วง 0 ถึง 255 จํานวน 3 ช่องสัญญาณ แยกอิสระได้ และนําไปใช้ในการสร้างสัญญาณ PWM ที่ปรับค่า Duty Cycle
·         มีการเปลี่ยนแปลงค่าใหม่ โดยโปรแกรมจะต้องส่งค่าใหม่เป็นข้อความ ไปให้บอร์ด Arduino ผ่าน USB-to-Serial โดยใช้ค่า baudrate เท่ากับ 115200
·         กำหนดรูปแบบข้อความ หรือคําสั่งที่ส่งไปยังบอร์ด Arduino และข้อความที่ได้
ส่งกลับมา เป็นดังนี้ 255,108,83 (มีลูกน้ำคั่นระหว่างเลขแต่ละชุด เพื่อสะดวกในการนำมาแยกข้อมูล แล้วแปลงเป็น ชนิดจำนวนเต็ม)

2.     บอร์ดไมโครคอนโทรลเลอร์
(บอร์ด Arduino ที่ใช้ชิป ATmega328P,5V/16MHz)
·       ใช้ Arduino Sketch ที่ทําหน้าที่เชื่อมต่อกับคอมพิวเตอร์ผ่าน USB
·       รับข้อความ หรือคําสั่งจากโปรแกรมในข้อ แล้วนําไปใช้ในการสร้างสัญญาณแบบ PWM พร้อมกันจํานวน 3 ช่อง ที่ความถี่ 50Hz (ใช้คำสั่งของ Arduino Servo Library) และมีค่าความกว้างในช่วงของ Pulse ของแต่ละสัญญาณในช่วง 1000 ถึง 2000 ไมโครวินาที (usec)




ส่วนที่ดำเนินการอยู่
3.     บอร์ด FPGA (ชิป Altera Cyclone III)
·         ใช้สร้างวงจรดิจิทัล ที่ทําหน้าที่เชื่อมต่อบอร์ด Arduino โดยการรับสัญญาณ PWM จํานวน 3 ช่อง ผ่านวงจรลดระดับแรงดันจากช่วง 0 ถึง 5V มาเป็น 0 ถึง 3.3V เนื่องจากขา I/O ของ FPGA ทํางานที่ระดับแรงดัน 3.3V เท่านั้น แต่แรงดัน I/O ของ Arduino เป็น 5V
ส่วนที่ยังไม่ได้ทำ
·       ใช้สัญญาณอินพุต CLK ความถี่ 50MHz และใช้วงจรปุ่มกดรีเซตแบบ active-low ที่มีอยู่บนบอร์ดทดลอง รับสัญญาณอินพุต PWM_IN (2:0) ที่มีความถี่ 50Hz และมีแรงดันในช่วง 0 ถึง 3.3V จํานวน 3 ช่องสัญญาณ สัญญาณอินพุต PWM_IN (2:0) แต่ละช่อง จะถูกวัดค่าความกว้างช่วง HIGH และความกว้างของคาบสัญญาณ เพื่อคํานวณเป็น 0 ถึง 100%
·       สร้างสัญญาณเอาต์พุต PWM_OUT (2:0) ความถี่ 500Hz และแรงดันในช่วง 0 ถึง 3.3V จํานวน 3 ชุด ทํางานอิสระต่อกัน และให้มีค่า Duty Cycle (%) ตรงกับค่าของสัญญาณอินพุต แต่ละช่องของ PWM_IN (2:0)
4.     วงจรควบคุมการจ่ายกระแสให้ RGB LED Strip
·       ใช้ไอซี ULN2803A
·       ใช้แรงดันไฟเลี้ยง 12V สําหรับจ่ายกระแสให้ RGB LED Strip
·       ปรับความสว่างของแต่ละสี (R,G,B) ด้วยสัญญาณ PWM







ผลการดำเนินการที่ได้กระทำไปแล้ว
Code GUI และการส่งค่าจาก Processing ให้กับ Ardunio
import processing.serial.*;
Serial SendValue;
int [] value = {
  10, 110, 60
};
int [] R_G_B = {
  150, 250, 200
};

void setup () {
  size (400, 300);
  SendValue = new Serial (this, "COM3", 115200);
}

void draw () {
  background (255);
  display();
}





void display () {
  noStroke ();
  fill (255, 0, 0);
  textSize (20);
  text ("RED", 30, 75);
  rect (140, 50, 255, 30);

  fill (0, 255, 0);
  text ("GREEN", 30, 145);
  rect (140, 120, 255, 30);

  fill (0, 0, 255);
  text ("BLUE", 30, 215);
  rect (140, 190, 255, 30);

  fill (179, 177, 180);
  rect (210, 250, 60, 30);
  fill(0);
  textSize(12);
  text ("Start", 225, 270);

  fill (value[0], value[1], value[2]);
  rect (295, 250, 60, 30);


  fill (0);
  textSize (15);
  text ("Click to change value", 40, height-30);
  Cursor();
  PrintValue ();
}

void PrintValue () {
  fill (80, 42, 6);
  textSize (10);
  text (value[0], 255, 40);
  text (value[1], 255, 110);
  text (value[2], 255, 180);
}

void Cursor () {
  fill (0);
  rect ( R_G_B[0], 50, 5, 30);
  rect ( R_G_B[1], 120, 5, 30);
  rect ( R_G_B[2], 190, 5, 30);

  if (mousePressed && (mouseX >= 140 && mouseX<= (width-5) && mouseY >=50 && mouseY <= 80)) {
    R_G_B[0] = mouseX;
  }
  if (mousePressed && mouseX >= 140 && mouseX<= (width-5) && mouseY >=120 && mouseY <= 150) {
    R_G_B[1] = mouseX;
  }
  if (mousePressed && mouseX >= 140 && mouseX<= (width-5) && mouseY >=190 && mouseY <= 220) {
    R_G_B[2] = mouseX;
  }
}

int [] Check_Click (int [] value) {
  if (mousePressed && (mouseX >= 140 && mouseX<= (width-5) && mouseY >=50 && mouseY <= 80)) {
    value[0] = (mouseX-140);  
    if (value[0] > 256) {
      value[0] = 0;
    }
  }
  if (mousePressed && mouseX >= 140 && mouseX<= (width-5) && mouseY >=120 && mouseY <= 150) {
    value[1] = (mouseX-140);      
    if (value[1] > 256) {
      value[1] = 0;
    }
  }
  if (mousePressed && mouseX >= 140 && mouseX<= (width-5) && mouseY >=190 && mouseY <= 220) {
    value[2] = (mouseX-140);      
    if (value[2] > 256) {
      value[2] = 0;
    }
  }
  return value;
}

void mouseMoved(){
  if (mouseX >= 210 && mouseX<270 && mouseY >=250 && mouseY <270) {
    cursor(HAND);
  }else{
    cursor(ARROW);
  }
}

void mousePressed () {
  Check_Click (value);
  ////////send value////////
  if (mouseX >= 210 && mouseX<270 && mouseY >=250 && mouseY <310) {
    SendValue.write(Convert(value));
    println(Convert(value));
  }
}
String Convert (int [] value) {
  String newValue = "";
  for (int i =0; i<value.length; i++) {
    String KeepIn = ""+(value[i]);
    newValue = newValue + KeepIn + ",";
  }
  return newValue;
}




Code Ardunio รับค่ามาจาก GUI
#include <Servo.h>
String recieved = "";
Servo s[3];
int converted [] = {0, 0, 0};
int i = 0;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  s[0].attach(9, 0, 2000);
  s[1].attach(10, 0, 2000);
  s[2].attach(11, 0, 2000);
}
void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available()) {
    char Data = Serial.read();
    if (Data != ',') {
      recieved = recieved + Data;
    } else {
      recieved += '\0';
      converted [i] = recieved.toInt();
      i++;
      recieved = ""; //reset recieve
      if (i == 3) {
        i = 0;
      } //stop loop
    }
  }
  for (int j = 0; j < 3; j++) {
    s[j].write(map(converted [j], 0, 255, 0, 179));
  }
}







วันอังคารที่ 4 พฤศจิกายน พ.ศ. 2557

การทดลองที่ 6.1

การออกแบบวงจร 3 to 8 decorder


วัตถุประสงค์ในการทดลอง

1.    ฝึกการออกแบบวงจร 3 to 8 decorder โดยใช้โปรแกรม Quartus
2.   สามารถออกแบบวงจรโดยใช่ลอจิเกตพื้นฐาน และใช้ภาษา VHDL ในการออกแบบได้
3.   สามารถทดลองกับบอร์ด FPGA ได้อย่างถูกต้องเหมาะสมได้


อุปกรณ์ที่ใช้ในการทดลอง  

1. บอร์ด Altera FPGA Board (WARRIOR CYCLONE3 DEV)  1 บอร์ด
2. สายดาวน์โหลด ByteBlaster II และ USB Blaster 1 สาย
3. โปรแกรม Altera Quartus II Web Edition (version 11.1 ขึ้นไป)


โจทย์
1) จงออกแบบวงจร 3-to-8 decoder มีทำงานตามข้อกำหนดต่อไปนี้
- มีอินพุต A(2:0) และเอาต์พุต Y(7:0)
ถ้า A(2:0) = "000" จะได้ Y(7:0) = "00000001"
ถ้า A(2:0) = "001" จะได้ Y(7:0) = "00000010"
ถ้า A(2:0) = "010" จะได้ Y(7:0) = "00000100"
.......
ถ้า A(2:0) = "111" จะได้ Y(7:0) = "10000000"
- อินพุต A(2:0) ให้ใช้สวิตช์เลื่อน (Slide Switches) บนบอร์ด FPGA
- เอาต์พุต Y(7:0) ให้ใช้ LEDs บนบอร์ด FPGA
การออกแบบวงจร ให้ใช้วิธีดังต่อไปนี้ (สร้าง Design Project สำหรับแต่ละกรณี)
- ใช้วิธีวาดวงจร โดยใช้ลอจิกเกตพื้นฐาน อย่างเช่น AND, OR, NOT
- ใช้ภาษา VHDL ในการออกแบบ
- ทดลองในบอร์ด FPGA และเขียนรายงานการทดลอง

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

1) เตรียมอุปกรณ์

Altera FPGA Board


ByteBlaster II และ USB Blaster 


โปรแกรม Altera Quartus II Web Edition 

2.) วาดวงจร 3 to 8 decorder โดยใช้ลอจิกเกตพื้นฐาน อย่างเช่น AND, OR, NOT 
ด้วยโปรแกรม Quartus 
3.) ใช้ภาษา VHDL ในการออกแบบวงจรตามที่โจทย์กำหนด
1.             สร้างโปรเจคสำหรับการทดลอง โดยทำการเลือก
-                   เลือกชิปที่ตรงกับบอร์ด FPGA เป็น EP3C10E144C8
-                   Device Family ตระกูล Cyclone III
-                   Design synthesis เลือก ModelSim-Altera สำหรับเครื่องมือการจำลองการทำงาน (Simulation)
โดยใช้ภาษา VHDL
code
library ieee, work;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity tb decoder tb_decoder3_to_8 is
end tb_decoder3_to_8;
architecture testbench of tb_decoder3_to_8 is
component decoder3_to_8 is
port(
I : in std_logic_vector( 2 downto 0 );
O : out std_logic_vector( 7 downto 0 ) );
end component;
signal t_I : std_logic_vector( 2 downto 0 );
signal t_O : std_logic_vector( 7 downto 0 );
begin
DUT: decoder decoder3_to_8 port map( I => t I_ , O => t O_ );
process begin
t_I <= "000";
for i in 0 to 7 loop
t_I <= std_logic_vector( to_unsigned(i, 3) );
wait for 100 ns;
end loop;
end process;
end testbench;

4.) ทำการ Analysis & Synthetic เพื่อวิเคราะห์และสังเคราะห์วงจรดิจิทัลจากโค้ด VHDL
5.) กำหนดหมายเลขขาอินพุต-เอาต์พุตสำหรับวงจร โดยใช้คำสั่ง Pin Planner


ถ้ามีการใช้ LED จากบอร์ด FPGA ให้เพิ่มชื่อสัญญาณ LED_54 ที่ขา PIN_54 และกำหนดให้เป็น As output, driving GND โดย ขา 54 ต่ออยู่กับสัญญาณ LED_54 ที่เป็นตัวควบคุมการทำงานของ LEDs บนบอร์ดทดลอง FPGA ที่ใช้

6.) ทำการ Fitter และ Assembler


7.) ใช้คำสั่ง Programmer เพื่อทำการรันโค้ดที่ได้บนวงจร FPGA Board

8.) นำไปทดลองบนบอร์ด  FPGA 

บันทึกผลการทดลอง

จากการทดลองข้อที่ 2 :
การวาดวงจร 3 to 8 decorder

จากการทดลองข้อที่ 3 :