วันพุธที่ 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 ก็จะมากขึ้น


สมการที่เกี่ยวข้อง

 \tau = RC

Charging  V(t) = V_0(1-e^{-t/ \tau})
Discharging  V(t) = V_0(e^{-t/ \tau})

\tau = RC = \frac{1}{2 \pi f_c}

f_c = \frac{1}{2 \pi R C} = \frac{1}{2 \pi \tau}

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

วันอาทิตย์ที่ 13 กันยายน พ.ศ. 2558

สร้างแรงดัน PWM L-C Filter














เราสามารถสร้างแรงดันจาก PWM แล้วมาใช้ LC กรองเพื่อให้ได้แรงดันที่ต้องการ

วันเสาร์ที่ 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
กด 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




















//konkarhoon.blogspot.com

 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


















-ใช้ 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



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