วันพฤหัสบดีที่ 15 ตุลาคม พ.ศ. 2558

สั่งงาน PIC และ arduino ผ่านมือถือ เชื่อมต่อโดย bluetooth

ใช้ IC HC-05 ในการส่งสัญญาณ bluetooth ติดต่อสื่อสาร





















โหลดโปรแกรม code ด้านล่างลง arduino



/*
 Software serial multple serial test

 Receives from the hardware serial, sends to software serial.
 Receives from software serial, sends to hardware serial.

 The circuit:
 * RX is digital pin 10 (connect to TX of other device)
 * TX is digital pin 11 (connect to RX of other device)

 Note:
 Not all pins on the Mega and Mega 2560 support change interrupts,
 so only the following can be used for RX:
 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

 Not all pins on the Leonardo support change interrupts,
 so only the following can be used for RX:
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

 created back in the mists of time
 modified 25 May 2012
 by Tom Igoe
 based on Mikal Hart's example

 This example code is in the public domain.

 */
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup()
{
  Serial.begin(38400);
  while (!Serial) ;
  mySerial.begin(38400);
}

void loop()
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

----------------------------------------------------------------------



ต่อวงจรตามรูป เพื่อ set ค่า HC-05 ผ่าน AT command





ไปที่โปรแกรม Arduino IDE 

กดรูปแว่น  Serial Monitor 

ลองพิมพ์ AT จากนั้นกด Enter จะขึ้นว่า OK 

คำสั่งเปลี่ยนชื่ออุปกรณ์ตอนเลือกเชื่อมต่อ 
พิมพ์ AT+NAME="Device Name" แล้วกด Enter หากสำเร็จจะขึ้น OK

คำสั่งเปลี่ยนพาสที่ใช้จับคู่  
พิมพ์ AT+PSWD=New Password 

เมื่อต่อครบแล้ว Reset HC05
โดยกดปุ่มบนตัว HC05 ค้างไว้ แล้ว ถอด VCC 5V ออกแล้วเสียบใหม่















ทดลอง PIC microcontroller 

คอมไพล code CCS แล้วอัดลง PIC
  
#include <16F627A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8)
#use fast_io(A)
#use fast_io(B)

void main()
{
  char x;                                   
  set_tris_b(0b00000010); 
  set_tris_a(0b11111111);
  output_b(0b00000000);      
  
  while(true)                              
        {
        if(kbhit())
           {        
             x=getc();
            
              if (x=='A')
             {
             output_low(pin_b7);
             }
             if (x=='B')
             {
             output_high(pin_b7);
             }
             if (x==1)
             {
             output_low(pin_b0);
             }
             if (x==2)
             {
             output_high(pin_b0);
             }
           }        
        }
  } 


ต่อวงจรตามรูป
ขา RX ของ PIC ต่อกับ TX ของ HC-05
ขา TX ของ PIC ต่อกับ R 1K ohm และต่อกับ RX ของ HC-05
ต่อ R 1k ohm เนื่องจาก ขา RX TX ของ HC-05 ทำงานที่แรงดัน 3.3V แต่ขา PIC จ่ายไฟ 5V


Download โปรแกรม android ตาม link
ลงแล้ว
เปิด Bluetooth
เลือก Bluetooth
กด Click to connect 
จากนั้นลองกด เปิดปิดไฟ ดู



วันอังคารที่ 13 ตุลาคม พ.ศ. 2558

Project เครื่องให้อาหารปลาอัตโนมัติ โดยใช้ PIC

เครื่องให้อาหารปลาอัตโนมัติ
โดยใช้ PIC microcontroller ตั้งเวลาจ่ายไฟ

วงจรสวิตซ์ใช้ Transistor  ดาร์ลิงตัน รับสัญญาณจาก PIC เพื่อตัดต่อการจ่ายไฟ 12 V
























Code program CCS PIC 16F627A


#include <16F627A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP
unsigned long i,j;
//www.konkarhoon.blogspot.com/
void delays(){
delay_ms(300000);
}//www.konkarhoon.blogspot.com/

void main(void)
{
    set_tris_a(0B00000000);

    while(1)
    {
     output_high(PIN_b0);
     output_high(PIN_b4);
         delay_ms(500);
     output_low(PIN_b0);
     output_low(PIN_b4);
     delay_ms(500);
   
     output_high(PIN_b0);   // ´feed
     output_high(PIN_b4);
   
         delays();
       
     output_low(PIN_b0);    // delay 12 hr
     output_low(PIN_b4);
     for(j=1;j<1440;j++){
         delays();
         }
     //www.konkarhoon.blogspot.com/
   
    }

}


วันเสาร์ที่ 10 ตุลาคม พ.ศ. 2558

การใช้ Transistor เป็นสวิตซ์ และ วงจร Darlington

ในการใช้ MCU PIC หรือ Arduino
บางครั้งเราจะใช้เปิดปิดวงจร 24 V หรือ 12V
แต่ MCU จ่ายไฟออกแค่ 5V

เราจึงใช้ Transistor เป็นสวิตซ์
แต่ พอใช้ Transistor ตัวเดียว ก็มีปัญหาในการขยายกระแส
จึงใช้ 2 ตัวเพื่อ แก้ปัญหานี้ซึ่งเรียกว่า วงจร ดาร์ลิงตัน


วันศุกร์ที่ 9 ตุลาคม พ.ศ. 2558

การใข้ printf VS fprint

fprint จะมีลักษณะคล้ายกับ printf
printf จะแสดงออกทางจอภาพ
fprint จะเป็นการบันทึกลงแฟ้มข้อมูล

format ที่ใช้กับ printf และ fprint มีดังนี้
%% - รูปแบบ %
%b - รูปแบบเลขฐานสอง
%c - รูปแบบตัวอักษรที่สอดคล้องกับ ASCII value
%d - รูปแบบเลขฐาน 10 แบบมีเครื่องหมาย
%e - รูปแบบสัญลักษณ์แบบวิทยาศาสตร์ เช่น 2.4e+2
%u - รูปแบบเลขฐาน 10 แบบไม่มีเครื่องหมาย
%f - รูปแบบเลขทศนิยมแบบมี local settings
%F - รูปแบบเลขทศนิยมแบบไม่มี local settings
%o - รูปแบบเลขฐาน 8
%s - รูปแบบString
%x - รูปแบบเลขฐาน 16 ตัวอักษรเล็ก
%X - รูปแบบเลขฐาน 16 ตัวอักษรใหญ่

วันพุธที่ 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