วันพุธที่ 30 กันยายน พ.ศ. 2558
การวัดระยะวัดถุโดยใช้ INFRARED LED
ใช้ INFRARED LED ส่องไปที่วัตถุ และสะท้อนกลับมาที่ตัว Sensor โดยมีฉากกั้นระหว่าง LED กับ SENSOR เพื่อป้องกันสัญญาณรบกวน
สามารถนำไปประยุกต์ใช้กับหุ่นยนต์เพื่อตรวจจับกำแพงการชนวัตถุ
ตัวอย่างการเขียนโปรแกรม เพื่อใช้เป็น Switch เมื่อเจอกำแพง
#include <16F628A.h>
#define CRYSTAL 4000000 //crystal 4MHz
#fuses HS
#fuses NOLVP,NOWDT
#fuses NOPROTECT
#use delay (clock=4000000)
void main(void)
{
set_tris_b(0b00000000); //ให้พอร์ท B ทั้ง 8 ขาเป็น output
cmcon = 0x07; //ทำให้ port A ทำงานเป็นพอร์ดิจิตอล
while(TRUE) //วนลูปตลอด
{
set_tris_a(0b11110001);; //ให้ พอร์ท A0 เป็น output
if(input(PIN_a0)) // Active High ถ้ามีสัญญาณเข้าขา A0
{
delay_ms(50);
output_high(PIN_B4); //จ่ายไฟออกที่ขา B4
delay_ms(2000);
}
}
}
วันจันทร์ที่ 28 กันยายน พ.ศ. 2558
ทดสอบ oscilloscope arduino กับ XCOS วัดสัญญาณ IC555
จากการต่อ วงจร IC 555 ตามรูป
ลองวัดค่าสัญญาณที่ออกจากขา 3 ของ IC 555 โดยใช้ XCOS จะได้กราฟดังรูป
ลองต่อวงจรโดยใช้ R ปรับค่าได้ ตามวงจร
เมื่อลองปรับ r ปรับค่าได้ในค่าต่างๆ จะได้กราฟดังนี้
ใช้ Xcos ของ scilab plot กราฟแรงดัน analog จาก Arduino
วันเสาร์ที่ 26 กันยายน พ.ศ. 2558
การวัดค่า R โดยใช้ Microcontroller
เราสามารถประยุกต์การอ่านค่า R ได้โดยใช้หลักการ RC Time คือถ้า R เพิ้มมากขึ้นเวลาในการคายประจุของ C ก็จะมากขึ้น
สมการที่เกี่ยวข้อง
Charging
วันจันทร์ที่ 21 กันยายน พ.ศ. 2558
Diode ขนานกับ Relay ป้องกันกระแสย้อนกลับ
ในการใช้ Relay ตัดต่อวงจรนั้นจะใช้ไดโอดต่อคร่อมเพื่อป้องกัน Back EMF เมื่อไม่จ่ายไฟให้ Relayแล้วจะมีสนามแม่เหล็กค่อยๆหดตัวไปเหนี่ยวนำขดลวดทำให้เกิดกระแสไหลในทิศทางย้อนกลับ
โดยเฉพาะการใช้ transistor ขับ โซลินอยด์วาล์ว หากไม่ต่อไดโอดคร่อมโซลินอยด์ไว้ เมื่อ on แล้วจะ off ไม่ได้
วันเสาร์ที่ 19 กันยายน พ.ศ. 2558
การควบคุม servo motor
Servo motor เป็นมอเตอร์ที่สามารถควบคุมได้ทั้ง ความเร็วและตำแหน่ง โดยเป็นแบบระบบป้อนกลับ
Feedback control
http://www.konkarhoon.blogspot.com/
ในการควบคุมนั้นจะใช้สัญญาณ PWN ในการควบคุม
http://www.konkarhoon.blogspot.com/
การควบคุม Step motor
Step motor สามารถควบคุมตำแหน่งที่ต้องการได้
โดย Step motor จะมีแบบ unipolar และ bipolar
มีทั้งแบบ 5 สาย 6 สาย
การกระตุ้นการหมุน แบ่งได้ 3 รูปแบบ
1. full step 1 phase
2.full step 2 phase
3.half step
เราสามารถออกแบบวงจรควบคุมการในการหมุนได้ตามความต้องการ
PWM PIC16F628A ใน CCS
#include <16F628A.h>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 4000000)
#use fast_io(b)
#use fast_io(a)
//konkarhoon.blogspot.com
void main()
{
set_tris_b(0xF7);
setup_ccp1(CCP_PWM); // Config CCP1 as a PWM
setup_timer_2(T2_DIV_BY_16, 169, 1);
set_pwm1_duty(84);
while(1); // ป้องกัน PIC อยู่ใน mode sleep
การใช้ Switch ใน MCU
#include <16F628A.h>
#define CRYSTAL 4000000 //crystal 4MHz
#fuses HS
#fuses NOLVP,NOWDT
#fuses NOPROTECT
#use delay (clock=4000000)
ตัวอย่าง Code CCS ใน PIC 16F628A
void main(void)
{
set_tris_b(0b00000111); //ให้พอร์ท B bitที่0,1,2 เป็น 1 เพื่อให้เป็น input ที่เหลือ output
while(TRUE)
{
output_low(PIN_B3); //ยังไม่จ่ายไฟออกที่ขา B3
output_low(PIN_B4); //ยังไม่จ่ายไฟออกที่ขา B4
if(!input(PIN_B0)) // Active Low ถ้าไม่มี สัญญาณเข้าขา B0
{
delay_ms(50); //หน่วงเวลาเพื่อตรวจสอบ logic
output_high(PIN_B3); //จ่ายไฟออกที่ขา B3
delay_ms(2000); //หน่วงเวลาจ่ายไฟให้ LED
}
if(input(PIN_B1)) // Active High ถ้ามีสัญญาณเข้าขา B1
{
delay_ms(50);
output_high(PIN_B4); //จ่ายไฟออกที่ขา B4
delay_ms(2000);
}
}
}
วันจันทร์ที่ 14 กันยายน พ.ศ. 2558
ใช้ Xcos ของ scilab plot กราฟแรงดัน analog จาก Arduino
การ plot กราฟแบบ Real time มีประโยชน์ในการใช้งานแทน oscilloscope หรือเราต้องการวัดค่าอะไรต่างๆ ในช่วงเวลาหนึ่ง ซึ่งสามารถ print กราฟออกมาได้
เริ่มแรกเราสามารถ Download โปรแกรม ที่ใช้ upload ลง Arduino ได้ตาม web
http://www.demosciences.fr/projets/scilab-arduino
เลือกโหลด toolbox_arduino_v3.ino
ซึ่งเป็นไฟล์ sketch ของตัว arduino ที่จะนำมาใช้กับ scilab
จากนั้นเปิดโปรแกรม arduino และ open ตัวไฟล์ toolbox_arduino_v3.ino และทำการ upload
เราจะทดลองการอ่านค่าจาก analog จาก port A0 โดยการต่อวงจรตามรูป
เปิด scilab ขึ้นมาและเรียกใช้ Xcos
วางอุปกรณ์ ต่างๆ ตามรูป
และ set parameter ของอุปกรณ์ต่างๆ ดังนี้ แล้วกด start ก็จะได้กราฟ
Time sample เป็นตัวกำหนดเวลาในการ plot
-Duration กำหนดเวลา เป็นวินาที
-Sampling กำหนดเวลาในการ sampling ยิ่งค่าน้อยยิ่งละเอียด
-Display..... เลือกเป็น 1 เพื่อให้กราฟต่อเนื่อง
Arduino Setup
-Identifier... เป็นตัวกำหนดลำดับ Arduino
-Serial com port number คือ port ที่ arduino เราต่อกับ computer
Analog_Read
-Analog Pin คือ ขาที่ใช้อ่านค่า Analog
-Arduino card...เป็นตัวกำหนดลำดับ Arduino
Clock_C ใช้กำหนดความละเอียดในการ plot ของกราฟ
CSope คือการกำหนดค่า parameter ต่างๆของกราฟ
เมื่อ plot กราฟจนหมดเวลา time sample ก็จะได้กราฟดังรูป
โดยที่ผมลองปรับ R ไปมากราฟก็จะขึ้นลงตามที่ปรับ
หากลองตั้งเวลา Time sample นานๆ กราฟก็จะ plot ไปเรื่อยๆ
โดย arduino มี ADC ขนาด 10 bit ซึ่งอ่านค่าได้ 0-1023
การจะวัดแรงดันให้ได้ค่าเป็น volt จะต้องนำมาคูณปรับตามความละเอียดที่ต้องการ
ถ้าจะวัดแรงดัน 5 volt ต้องใช้ตัวคูน
= 5V /1023 คือ 0.0048875855327468230694037145650049
เช่นวัดได้ค่า 954
จะได้แรงดัน 954 x 0.0048875855327468230694037145650049 = 4.66 V
เริ่มแรกเราสามารถ Download โปรแกรม ที่ใช้ upload ลง Arduino ได้ตาม web
http://www.demosciences.fr/projets/scilab-arduino
เลือกโหลด toolbox_arduino_v3.ino
ซึ่งเป็นไฟล์ sketch ของตัว arduino ที่จะนำมาใช้กับ scilab
จากนั้นเปิดโปรแกรม arduino และ open ตัวไฟล์ toolbox_arduino_v3.ino และทำการ upload
เราจะทดลองการอ่านค่าจาก analog จาก port A0 โดยการต่อวงจรตามรูป
เปิด scilab ขึ้นมาและเรียกใช้ Xcos
วางอุปกรณ์ ต่างๆ ตามรูป
และ set parameter ของอุปกรณ์ต่างๆ ดังนี้ แล้วกด start ก็จะได้กราฟ
Time sample เป็นตัวกำหนดเวลาในการ plot
-Duration กำหนดเวลา เป็นวินาที
-Sampling กำหนดเวลาในการ sampling ยิ่งค่าน้อยยิ่งละเอียด
-Display..... เลือกเป็น 1 เพื่อให้กราฟต่อเนื่อง
Arduino Setup
-Identifier... เป็นตัวกำหนดลำดับ Arduino
-Serial com port number คือ port ที่ arduino เราต่อกับ computer
Analog_Read
-Analog Pin คือ ขาที่ใช้อ่านค่า Analog
-Arduino card...เป็นตัวกำหนดลำดับ Arduino
Clock_C ใช้กำหนดความละเอียดในการ plot ของกราฟ
CSope คือการกำหนดค่า parameter ต่างๆของกราฟ
เมื่อ plot กราฟจนหมดเวลา time sample ก็จะได้กราฟดังรูป
โดยที่ผมลองปรับ R ไปมากราฟก็จะขึ้นลงตามที่ปรับ
หากลองตั้งเวลา Time sample นานๆ กราฟก็จะ plot ไปเรื่อยๆ
โดย arduino มี ADC ขนาด 10 bit ซึ่งอ่านค่าได้ 0-1023
การจะวัดแรงดันให้ได้ค่าเป็น volt จะต้องนำมาคูณปรับตามความละเอียดที่ต้องการ
ถ้าจะวัดแรงดัน 5 volt ต้องใช้ตัวคูน
= 5V /1023 คือ 0.0048875855327468230694037145650049
เช่นวัดได้ค่า 954
จะได้แรงดัน 954 x 0.0048875855327468230694037145650049 = 4.66 V
วันอาทิตย์ที่ 13 กันยายน พ.ศ. 2558
วันเสาร์ที่ 12 กันยายน พ.ศ. 2558
AC Motor VS DC Motor
เปรียบเทียบ AC VS. DC DRIVE
AC and DC drives ต่างก็มีประโยชน์และจุดเด่นเฉพาะตัวที่แตกต่างกัน
ข้อดีของ AC DRIVES
- AC
motors เล็กกว่า, เบากว่า,
ราคาถูกกว่า DC motors.
- AC
motors เหมาะสมที่จะใช้ใน
speed ที่สูงๆ (over 2500 rpm) เพราะไม่มีแปรงถ่าน
- มอเตอร์กันระเบิด
หรือ ชนิดพิเศษ จะราคาถูกกว่า DC Motor
- Motor
หลายตัวในระบบ สามารถปรับความถี่ความเร็วให้สัมพันธ์กัน
ได้
- ออกแบบ
ปรับ speed ให้คงที่ได้ง่ายกว่า
DC DRIVES MAY BE BETTER BECAUSE. . .
- DC
drives ซับซ้อนน้อยกว่า มีการแปลงพลังงานแค่
AC to DC.
- DC
drives ราคาถูกกว่าที่พิกัดกำลังสูงๆ.
- DC
motors ปรับช่วง speed ได้
กว้างกว่า
- การปรับปรุงการใช้งานจะซับซ้อนน้อยกว่า
- DC
motors มีพิกัด start torques 400% ของพิกัด motor.
- AC
drive การใช้งานบางอย่างทำให้เกิด noise
วันศุกร์ที่ 11 กันยายน พ.ศ. 2558
การแก้ไข microcontroller รับคำสั่งจาก switch ผิดพลาด
การใช้ Switch ป้อน input ให้ microcontroller
นั้น
การเปิดปิด switch จะเกิดแรงดันกระเพื่อม เนื่องจากswitch เกิดการสั่นจากแรงทางกลและการ
arc ที่หน้าสัมผัส //konkarhoon.blogspot.com
โดยจะเกิดพัลส์หลายลูกในเวลา 1-10ms ซึ่งจะเกิดผลกระทบกับ
microcontroller ทำให้เกิดอ่านค่าผิดพลาดขึ้น
สามารถแก้ไขได้โดยการ หน่วงเวลาหลังจากกดสวิตซ์ 50ms แล้วค่อยตรวจสอบข้อมูลหรือ โลจิก การกด
วันพุธที่ 9 กันยายน พ.ศ. 2558
Download component sketchup
Component sketchup ที่ผมสร้างขึ้นเพื่อนำไปประยุกต์ใช้ต่อยอด
เหล็ก
1.(เหล็ก C) C 100x50 t5 6m
http://1drv.ms/1Q0UgOv
2.(เหล็กกลม) Pipe 1_ T2.3 6m
http://1drv.ms/1UBgoWr
3.(เหล็กกลม) Pipe 2_ T2.3 6m
http://1drv.ms/1UBgtcT
4.(เหล็กกล่อง) square tube 0.5 x 0.5 T1mm
http://1drv.ms/1UBguNI
5.(เหล็กกล่อง)square tube 1x1 T2.3mm
http://1drv.ms/1UBgzRw
6.(เหล็กกล่อง)square tube 1x1 T3.2mm
http://1drv.ms/1UBgEVk
7.(เหล็กกล่อง)square tube 2_x2_ T2.3
http://1drv.ms/1UBgL3s
วันอาทิตย์ที่ 6 กันยายน พ.ศ. 2558
ตัวอย่าง plot กราฟ scilab rpm motor
ตัวอย่าง plot กราฟ scilab rpm motor
//konkarhoon.blogspot.com
เขียน code ใน scilab ดังนี้
//konkarhoon.blogspot.com
p=4;
f=1:50;
rpm=(120*f/p);
plot(f,rpm)
xtitle('speed motor','frequency','rpm')
//konkarhoon.blogspot.com
เขียน code ใน scilab ดังนี้
//konkarhoon.blogspot.com
p=4;
f=1:50;
rpm=(120*f/p);
plot(f,rpm)
xtitle('speed motor','frequency','rpm')
//konkarhoon.blogspot.com
กด Execute
จะได้กราฟ ความสัมพันธ์ระหว่าง ความถี่ (f) กับความเร็วรอบ (RPM) ของ induction motor 4 pole
//konkarhoon.blogspot.com
วันเสาร์ที่ 5 กันยายน พ.ศ. 2558
ใข้ Scilab plot ข้อมูล real time จาก Arduino
โปรแกรม ฝั่่ง Arduino
void setup() {
Serial.begin(9600); // กำหนดค่าความเร็วให้ Serial
}
\\konkarhoon.blogspot.com
void loop() {
for (int i=0;i<900;i++) // สรัาง for loop โดยกำหนดให้ i=0 ถ้า i เพิ่มขึ้นทีละ 1 จนถึง 900
{
Serial.print(i); // สั่งให้ส่งข้อมูล มาทาง serial
delay(50); // ใส่ค่า delay 50ms เพื่อให้ arduino ส่งข้อมูลมา ทีละ 50 มิลลิวินาที
//konkarhoon.blogspot.com
}
}
//konkarhoon.blogspot.com
โดยต้องใช้ scilab Version 5.4 (Version 5.5 ยังไม่ support) ต่อไป เราจะ plot ค่าที่ arduino ส่งมาบน scilab
เปิด scilab ขึ้นมา
ในการจะใช้ function serial port ใน scilab ต้องไปเปิดฟังก์ชั่นเพิ่มเติมก่อน
โดยการไปที่ menu Module manager - atoms
Serial Comunication Tool box
หลังจาก install แล้วเขียน code ใน scilab ดังนี้
คลิ๊ก SciNotes ที่แถบเครื่องมือมุมบนซ้ายขึ้นมาเพื่อเขียนโปรแกรมรวดเดียว
//konkarhoon.blogspot.com
h=openserial(4,"9600,n,8,1"); //กำหนดให้ h คือ serial port com4 ความเร็ว 9600 ซึ่งก็คือ port ที่ต่อ arduino(ถ้ายังไม่ ต่อ arduino จะขึ้น error)
for i=1:1000; //กำหนดให้ i มีค่ามากกว่าของ arduino ซึ่งจะ plot กราฟจาก 1 ถึง 1000
answer=readserial(h) //กำหนดให้ answer รับค่า มาจาก serial port
answery=strtod(answer); //แปลงข้อมูล string ไปเป็นชนิด Double เพื่อ plot กราฟ
plot2d3('gnn',i,answery); //กำหนดชนิดการ plot กราไฟให้ scilab
drawnow(); //สั่ง plot กราฟ
end
closeserial(h)
//konkarhoon.blogspot.com
เขียนเสร็จแล้ว กด Execute รูปลูกศร เพื่อ Run คำสั่ง
เมื่อ plot แกน x ถึงค่า 1000 ก็จะหยุด plot
//konkarhoon.blogspot.com
void setup() {
Serial.begin(9600); // กำหนดค่าความเร็วให้ Serial
}
\\konkarhoon.blogspot.com
void loop() {
for (int i=0;i<900;i++) // สรัาง for loop โดยกำหนดให้ i=0 ถ้า i เพิ่มขึ้นทีละ 1 จนถึง 900
{
Serial.print(i); // สั่งให้ส่งข้อมูล มาทาง serial
delay(50); // ใส่ค่า delay 50ms เพื่อให้ arduino ส่งข้อมูลมา ทีละ 50 มิลลิวินาที
//konkarhoon.blogspot.com
}
}
//konkarhoon.blogspot.com
โดยต้องใช้ scilab Version 5.4 (Version 5.5 ยังไม่ support) ต่อไป เราจะ plot ค่าที่ arduino ส่งมาบน scilab
เปิด scilab ขึ้นมา
ในการจะใช้ function serial port ใน scilab ต้องไปเปิดฟังก์ชั่นเพิ่มเติมก่อน
โดยการไปที่ menu Module manager - atoms
//konkarhoon.blogspot.com
หลังจาก install แล้วเขียน code ใน scilab ดังนี้
คลิ๊ก SciNotes ที่แถบเครื่องมือมุมบนซ้ายขึ้นมาเพื่อเขียนโปรแกรมรวดเดียว
//konkarhoon.blogspot.com
h=openserial(4,"9600,n,8,1"); //กำหนดให้ h คือ serial port com4 ความเร็ว 9600 ซึ่งก็คือ port ที่ต่อ arduino(ถ้ายังไม่ ต่อ arduino จะขึ้น error)
for i=1:1000; //กำหนดให้ i มีค่ามากกว่าของ arduino ซึ่งจะ plot กราฟจาก 1 ถึง 1000
answer=readserial(h) //กำหนดให้ answer รับค่า มาจาก serial port
answery=strtod(answer); //แปลงข้อมูล string ไปเป็นชนิด Double เพื่อ plot กราฟ
plot2d3('gnn',i,answery); //กำหนดชนิดการ plot กราไฟให้ scilab
drawnow(); //สั่ง plot กราฟ
end
closeserial(h)
//konkarhoon.blogspot.com
เขียนเสร็จแล้ว กด Execute รูปลูกศร เพื่อ Run คำสั่ง
เมื่อ plot แกน x ถึงค่า 1000 ก็จะหยุด plot
//konkarhoon.blogspot.com
-ใช้ Xcos ของ scilab plot กราฟแรงดัน analog จาก Arduino
การทดสอบสื่อสาร arduino กับ computer ผ่าน serial protocal
เปิดโปรแกรม Arduino
//konkarhoon.blogspot.com
void setup() {
// กำหนดค่าความเร็วให้ Serial
Serial.begin(9600);
}
//konkarhoon.blogspot.com
void loop() {
// สรัาง for loop โดยกำหนดให้ i=0 ถ้า i เพิ่มขึ้นทีละ 1 จนถึง 100
for (int i=0;i<100;i++)
{
// สั่งให้ส่งข้อมูล มาทาง serial
Serial.print(i);
}
}
//konkarhoon.blogspot.com
ต่อ Arduino กด upload แล้วกด serial monitor รูปแว่นขยาย
จะเห็นการส่งข้อมูลเข้ามาที่ Computer
//konkarhoon.blogspot.com
//konkarhoon.blogspot.com
void setup() {
// กำหนดค่าความเร็วให้ Serial
Serial.begin(9600);
}
//konkarhoon.blogspot.com
void loop() {
// สรัาง for loop โดยกำหนดให้ i=0 ถ้า i เพิ่มขึ้นทีละ 1 จนถึง 100
for (int i=0;i<100;i++)
{
// สั่งให้ส่งข้อมูล มาทาง serial
Serial.print(i);
}
}
//konkarhoon.blogspot.com
ต่อ Arduino กด upload แล้วกด serial monitor รูปแว่นขยาย
จะเห็นการส่งข้อมูลเข้ามาที่ Computer
//konkarhoon.blogspot.com
click เพื่ออ่านบทความ
ใข้ Scilab plot ข้อมูล real time จาก Arduino
วันพุธที่ 2 กันยายน พ.ศ. 2558
ASCII Character Set ตารางแอสกี้โค๊ด
Hex
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
0
|
NUL
|
DLE
|
space
|
0
|
@
|
P
|
`
|
p
|
1
|
SOH
|
DC1
|
!
|
1
|
A
|
Q
|
a
|
q
|
2
|
STX
|
DC2
|
"
|
2
|
B
|
R
|
b
|
r
|
3
|
ETX
|
DC3
|
#
|
3
|
C
|
S
|
c
|
s
|
4
|
EOT
|
DC4
|
$
|
4
|
D
|
T
|
d
|
t
|
5
|
ENQ
|
NAK
|
%
|
5
|
E
|
U
|
e
|
u
|
6
|
ACK
|
SYN
|
&
|
6
|
F
|
V
|
f
|
v
|
7
|
Bell
|
ETB
|
'
|
7
|
G
|
W
|
g
|
w
|
8
|
BS
|
CAN
|
(
|
8
|
H
|
X
|
h
|
x
|
9
|
HT
|
EM
|
)
|
9
|
I
|
Y
|
i
|
y
|
A
|
LF
|
SUB
|
*
|
:
|
J
|
Z
|
j
|
z
|
B
|
VT
|
ESC
|
+
|
;
|
K
|
[
|
k
|
{
|
C
|
FF
|
FS
|
,
|
<
|
L
|
\
|
l
|
|
|
D
|
CR
|
GS
|
_
|
=
|
M
|
]
|
m
|
}
|
E
|
SO
|
RS
|
.
|
>
|
N
|
^
|
n
|
~
|
F
|
SI
|
US
|
/
|
?
|
O
|
_
|
o
|
DEL
|
สมัครสมาชิก:
บทความ (Atom)