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));
}
}