วันจันทร์ที่ 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));
  }
}