หน้าเว็บ

วันอังคารที่ 30 กรกฎาคม พ.ศ. 2556

ตัวอย่างโค้ด SHT11(เซนเซอร์วัดค่าอุณหภูมิและความชื้น) กับ PIC18F2550





โมดูล SHT11

เป็นโมดูลวัดความชื้นสัมพัทธ์และอุณหภูมิจากบริษัท Sensirion (www.sensirion.com) มีขนาดเล็กและเพื่อความสะดวกในการใช้งานซึ่งมีคุณสมบัติทางเทคนิคดังนี้คะ
  • ทำหน้าที่เป็นทั้งตัววัดความชื้นและอุณหภูมิภายในตัวถังเดียวกัน
  • สามารถกำหนดความละเอียดของย่านการวัดได้
  • มีขนาดเล็กและกินพลังงานต่ำ ทำงานในย่านแรงดัน +2.4V ถึง+5.5V
  • เสถียรภาพในการทำงานสูง

ขาสัญญาณสำหรับสื่อสารข้อมูลของโมดูล SHT11

  • PIN  1  :  DATA หรือ Serial Data (SDA)
  • PIN  2   : NC (No connect)
  • PIN  3  :  CLOCK หรือ Serial Clock (SCK)
  • PIN  4  :  GND
  • PIN  5   : NC (No connect)
  • PIN  6  :  NC (No connect)
  • PIN  7  :  NC (No connect)
  • PIN  8  :  +5V 




ทดลองต่อวังจร SHT11 กับ PIC18F2550 เลยคะ

ทำการต่อวงจรตามรูปข้างล่างเลยค่า โดยการทำงานของวงจรที่เราทำขึ้นเราจะทำการอ่านค่าจากเซนเซอร์ จากนั้นนำมาแสดงที่ serial port  ทางคอมพิวเตอร์คะ ซึ่งโปรแกรมที่เราเขียนจะทำการอ่านค่าวนซ้ำทุก 1 วินาที




ขึ้นตอนต่อไป คือการเขียนโปรแกรม ผู้เขียนจะใช้ CCS C คอมไพเลอร์ร่วมกับ MPLAB IDE  ซึ่งในโค้ดข้างล่างเราต้องทำการ add library "sht1x.c" ซึ่ง library นี้ผู้เขียนได้ทำการแก้ไขจากไลบราลี่เดิมที่มีอยู่แล้ว โดยเพื่อนๆ สามารถดาวน์โหลดไลบราลี่ได้จากลิ้งนี้คะ (link here) เมื่อดาวน์โหลดมาแล้วให้เอาไปแทนไลบราลี่ตัวเดิมซึ่งอยูใน  "C:\Program Files (x86)\PICC\Drivers" จากนั้นเขียนโปรแกรมตามโค้ดข้างล่างเลยคะ



//******************************************************
//Project        : SHT11 Example
//Purpose        : Test SHT11
//Auther         : JUMP start innovation
//Email          : jumpstartinnovation@gmail.com
//Complier       : CCS.PCWH.v4.134
//Hardware       : PIC18F2550
//**********************************************************

#include <18f2550.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// *** Device Specification ***
#fuses HS            // use Oscillator mode HS
#fuses NOWDT // doesn't use watch dog
#fuses NOLVP         // doesn't use Low Voltage for program
#fuses NOPROTECT     // No program detect

#use delay (clock=20M, crystal)
// use built-in function: delay_ms() & delay_us() by crytal 20MHz

#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,stream=HOSTPC,errors)

// Assign pin for sht1x
#define sht_data_pin   PIN_B0
#define sht_clk_pin    PIN_B1
#include<sht1x.c>



/*******************************************************************************
*  Function prototypes
********************************************************************************/
void headle(void);

/***********************************************************************
 * FUNCTION:    headle
 * DESCRIPTION: Show headle title though rs232
 * PARAMETERS:  nothing
 * RETURNED:    nothing
 ***********************************************************************/
void headle(void){
                fprintf(HOSTPC,"\n\r******************************************************\n\r");
                fprintf(HOSTPC,"Project        : SHT11 Example\n\r");
                fprintf(HOSTPC,"Purpose        : Test SHT11\n\r");
                fprintf(HOSTPC,"Auther         : JUMP start innovation\n\r");
                fprintf(HOSTPC,"Email          : jumpstartinnovation@gmail.com\n\r");
                fprintf(HOSTPC,"Complier       : CCS.PCWH.v4.134\n\r");
                fprintf(HOSTPC,"Hardware       : PIC18F2550\n\r");
                fprintf(HOSTPC,"**********************************************************\n\r");
    }


/***********************************************************************
 * FUNCTION:    main
 * DESCRIPTION: main function
 * PARAMETERS:  nothing
 * RETURNED:    nothing
 ***********************************************************************/
void main(void){

        float truehumid;
        float restemp;
        
headle(); //show message output to serial port

        sht_init(); //Initial SHT11
        fprintf(HOSTPC,">> Initial SHT11 ... DONE\n\r");

        while(true){
                  sht_rd (restemp, truehumid);
                  fprintf(HOSTPC,"Temperature   :%2.1f\n\r",restemp);
                  fprintf(HOSTPC,"Humidity      :%2.1f\n\r", truehumid);
                  fprintf(HOSTPC,"------------------\n\r\n\r");
                  delay_ms(1000);

            }

        }


เมื่อทำการคอมไพล์เสร็จเรียบร้อยแล้ว ทดลองรันดูเลยคะ จะได้ผลตาม Video ข้างล่างคะ





เราสามารถนำไปประยุกต์ใช้ได้อย่างหลากหลายเช่น
  • ระบบ เปิด-ปิด สปริงเกอร์ ที่ใช้สำหรับควบคุมความชื้นโรงเพาะเห็ด
  • ใช้ความคุมการ เปิด-ปิด ฮิตเตอร์สำหรับห้องปิดเช่น ห้องซาวน่า เป็นต้น

คลิปวีดีโอข้างล่างเป็นการประยุกต์โดยจะทำการเตือนเมื่ออุณหภูมิและความชื้นเกินกว่าค่าที่ตั้งเอาไว้ โดยวงจรนี้จะต่อตัวเซนเซอร์สองตัว ซึ่งแยกทำงานกันแบบอิสระ




วันอาทิตย์ที่ 28 กรกฎาคม พ.ศ. 2556

LCD display บน PIC18F2550

บทความนี้เป็นตัวอย่างโค้ดสำหรับ PIC เชื่อมต่อกับ LCD 16x2 โดยเราจะพิมพ์ข้อความไปที่จอ LCD คะ ซึ่งขาของตัว LCD Module ดูตามข้อมูลด้านล่างคะ

Pin NoSymbolLevelDescription
1VSS0VGround
2VDD5VSupply Voltage for logic
3VO(Variable)Operating voltage for LCD
4RSH/LH: DATA, L: Instruction code
5R/WH/LH: Read(MPU?Module) L: Write(MPU?Module)
6EH,H->LChip enable signal
7DB0H/LData bus line
8DB1H/LData bus line
9DB2H/LData bus line
10DB3H/LData bus line
11DB4H/LData bus line
12DB5H/LData bus line
13DB6H/LData bus line
14DB7H/LData bus line
15A5VLED +
16K0VLED-



โดยขั้นตอนในการติดต่อกับตัว LCD Module ดูได้จาก flowchart ของโปรแกรมด้านล่างคะ



จากนั้นทำการต่อวงจรในโปรแกรม proteus ตามวงจรข้างล่างเลยคะ



ขึ้นตอนต่อไป คือการเขียนโปรแกรม ผู้เขียนจะใช้ CCS C คอมไพเลอร์ร่วมกับ MPLAB IDE  ซึ่งในโค้ดข้างล่างเราต้องทำการ add library "lcd.c" ซึ่ง library นี้ผู้เขียนได้ทำการแก้ไขจากไลบราลี่เดิมที่มีอยู่แล้ว โดยเพื่อนๆ สามารถดาวน์โหลดไลบราลี่ได้จากลิ้งนี้คะ (link here) เมื่อดาวน์โหลดมาแล้วให้เอาไปแทนไลบราลี่ตัวเดิมซึ่งอยูใน  "C:\Program Files (x86)\PICC\Drivers" จากนั้นเขียนโปรแกรมตามโค้ดข้างล่างเลยคะ


//******************************************************
//Project        : LCD print out
//Purpose        : Test LCD Module
//Auther         : JUMP start innovation
//Email          : jumpstartinnovation@gmail.com
//Complier       : CCS.PCWH.v4.134
//Hardware       : PIC18F2550
//**********************************************************

#include <18f2550.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// *** Device Specification ***
#fuses HS            // use Oscillator mode HS
#fuses NOWDT // doesn't use watch dog
#fuses NOLVP         // doesn't use Low Voltage for program
#fuses NOPROTECT     // No program detect

#use delay (clock=20M, crystal)
// use built-in function: delay_ms() & delay_us() by crytal 20MHz

#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,stream=HOSTPC,errors)

#define _FLEX_LCD216_H  //  LCD Type 16x2
//#define _FLEX_LCD416_H  //  LCD Type 16x4
// Assign MCU's pin to LCD
#define LCD_DB4   PIN_B2
#define LCD_DB5   PIN_B3
#define LCD_DB6   PIN_B4
#define LCD_DB7   PIN_B5
#define LCD_RS    PIN_B0
#define LCD_E     PIN_B1
//#define LCD_RW    PIN_B1  // Doesn't use RW connect to GND
#include <lcd.c> // include LCD library CCS C

/*******************************************************************************
*  Function prototypes
********************************************************************************/
void headle(void);

/***********************************************************************
 * FUNCTION:    headle
 * DESCRIPTION: Show headle title though rs232
 * PARAMETERS:  nothing
 * RETURNED:    nothing
 ***********************************************************************/
void headle(void){
                fprintf(HOSTPC,"\n\r******************************************************\n\r");
                fprintf(HOSTPC,"Project        : LCD print out\n\r");
                fprintf(HOSTPC,"Purpose        : Test LCD Module\n\r");
                fprintf(HOSTPC,"Auther         : JUMP start innovation\n\r");
                fprintf(HOSTPC,"Email          : jumpstartinnovation@gmail.com\n\r");
                fprintf(HOSTPC,"Complier       : CCS.PCWH.v4.134\n\r");
                fprintf(HOSTPC,"Hardware       : PIC18F2550\n\r");
                fprintf(HOSTPC,"**********************************************************\n\r");
    }


/***********************************************************************
 * FUNCTION:    main
 * DESCRIPTION: main function
 * PARAMETERS:  nothing
 * RETURNED:    nothing
 ***********************************************************************/
void main(void){

headle(); //show message output to serial port

        lcd_init(); //Initial LCD
        fprintf(HOSTPC,">> LCD Initial ... DONE\n\r");

        while(true){

            printf(lcd_putc,"\f");  //clear LCD screen

            lcd_gotoxy(4,1); //goto lcd position x=1, y=1
            printf(lcd_putc,"Hello World");

            lcd_gotoxy(2,2); //goto lcd position x=2, y=2
            printf(lcd_putc,"* JUMP START *");
            
            delay_ms(1000);

            // clear LCD screen line 1
            lcd_gotoxy(16, 1); //goto lcd position x=16, y=1
            for(int i=0; i < 16; i++){
                printf(lcd_putc," \b\b"); //back space
                delay_ms(100);
            }

            // clear LCD screen line 2
            lcd_gotoxy(16, 2); //goto lcd position x=16, y=1
            for(i=0; i < 16; i++){
                printf(lcd_putc," \b\b"); //back space
                delay_ms(100);
            }

        }
}




เมื่อทำการคอมไพล์เสร็จเรียบร้อยแล้ว ทดลองรันดูเลยคะ จะได้ผลตาม Video ข้างล่างคะ







การติดต่อ Serial Port (RS232)กับ PIC

Serial Port คือ พอร์ตอนุกรม ในการสื่อสารข้อมูลนั้นพอร์ตอนุกรมจะมีความเร็วในการสื่อสารที่ช้ากว่าแบบ ขนาน เพราะการเคลื่อนย้ายข้อมูลแบบอนุกรมนั้นเป็นการส่งข้อมูลครั้งละ 1 บิต แต่พอร์ตขนานนั้นสามารถส่งข้อมูลทีละหลายๆ บิทพร้อมๆกันได้ แต่ข้อดีของการสื่อสารข้อมูลแบบอนุกรมคือ สามารถส่งข้อมูลได้ในระยะทางที่ไกลกว่าแบบขนาน และใช้สายสัญญาณที่น้อยกว่าการสื่อสารข้อมูลแบบขนาน




ประเภทของการสื่อสารแบบอนุกรมแบ่งตามลักษณะสัญญาณในการส่งแบ่งได้ 2 แบบ คือ

1.การสื่อสารแบบซิงโครนัส (Synchronous) เป็นการสื่อสารข้อมูลโดยใช้สัญญาณนาฬิกาในการควบคุมจังหวะของการรับส่งสัญญาณ
2.การสื่อสารแบบอะซิงโครนัส (Asynchronous) เป็นการสื่อสารที่ใช้สายข้อมูลเพียงตัวเดียว จะใช้รูปแบบของการส่งข้อมูล(Bit Pattern) เป็นตัวกำหนดว่าส่วนไหนเป็นส่วนเริ่มต้นข้อมูล ส่วนไหนเป็นตัวข้อมูล ส่วนไหนจะเป็นตัวตรวจสอบความถูกต้องของข้อมูล และส่วนไหนเป็นส่วนปิดท้ายของข้อมูล โดยต้องกำหนดให้สัญญาณนาฬิกาเท่ากันทั้งภาคส่งและภาครับ

คอนเน็กเตอร์ที่นิยมใช้จะเป็นชนิด D-Type แบบ 9 ขา และแบบ 25 ขา โดยจะติดตั้งอยู่หลังเครื่องคอมพิวเตอร์ ระดับแรงดันจะมีค่าระหว่าง -3 โวลต์ ถึง-15โวลต์คะ


การเชื่อมต่อ Seria Port ระหว่างไมโครคอนโทรเลอร์กับคอมพิวเตอร์

ในการพัฒนาโปรแกรมไมโครคอนโทรเลอร์ โดยเทคนิคส่วนตัวของเจ้าของบล๊อค เราจำเป็นอย่างยิ่งที่ต้องเห็นการทำงานแต่ละสเตปหรือเป็นการดีบัคโปรแกรมคะ ว่าตอนนี้ไมโครคอนโลรเลอร์ทำงานอยู่ในส่วนไหนตำแหน่งไหนของโค้ด ซึ่งวิธีง่ายสุดคือการสั่ง printf ออกมาทางหน้าจอคอมพิวเตอร์ เช่น

if(x == 1){
       printf("Positon 1  >>  x=1\n\r");
}else if(x==2){
       printf("Positon 2  >>  x=2\n\r");
}else{
       printf("Positon 3 >> x=other\n\r");
}

การเชื่อมต่อ serial port กับไมโครคอนโทรเลอร์จำเป็นที่จะต้องมีไอซีที่ใช้ในการแปรงระดังสัญญาณระหว่างTTL Level (5 Volt) กับ RS232 Level (+/- 9 Volt) โดยเราจะใช้ไอซี MAX232 ในการเชื่อมต่อ


ในการทดลองนี้ เราจะใช้ PIC เบอร์ PIC18F2550 ซึ่งเป็นไมโครคอนโทรเลอร์ 28 pins คะ ซึ่งตัวเล็กกระทัดลัดแต่ประสิทธิภาพไม่เล็กเหมือนตัวนะคะ โดยคุณสมบัติของไอซีเบอร์ดังกล่างคือ



การต่อวงจรให้ต่อตามรูปข้างล่างคะ โดยสัญญาณ Tx และ Rx ของ UART ในตัวไมโครคอนโทรเลอร์ จะต่ออยู่ที่ขา C6 และ C7 เราจะให้ Crytal ความถี่ 20MHz เป็นสัญญาณนาฬิกาให้กับไมโครคอนโทรเลอร์คะ ส่วน C1 (0.1uF) ที่ต่อระหว่าง VDD กับ VSS ซึ่งต้องต่อไกล้ๆนะค่ะ  ตัวนี้ค่อนข้างสำคัญคะ เพราะเจ้าของบล๊อคเองเคยเจอว่า ถ้าเราลืมต่อมัน บางทีมันเวิร์คบ้างไม่เวิร์คบ้าง อาจเป็นเพราะอาจจมี noise จากข้างนอก หรือจาก clock ของตัวมันเองมากวนคะ ซึ่งจะทำให้เราหลงทางได้ ^^ 


การเขียนโปรแกรมโดยใช้ CCS C ทำงานบน MPLAB IDE

ขึ้นตอนต่อไปเป็นขึ้นตอนที่สำคัญคะ คือการเขียนโปรแกรม ผู้เขียนจะใช้ CCS C คอมไพเลอร์ร่วมกับ MPLAB IDE ซึ่งภายในโค้ดผู้เขียนจะอธิบายโค้ดไปทีละบรรทัดเลยค่าาา ^^





 Source code  (ไฟล์.hex ดาวน์โหลดได้จากลิ้งนี่คะ)

#include <18f2550.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// *** Device Specification ***
#fuses HS            // ใช้ Oscillator mode HS
#fuses NOWDT // ไม่ใช้ Watch dog 
#fuses NOLVP         // ไม่ใช้การโปรแกรมแบบ Low Voltage
#fuses NOPROTECT     // ไม่ต้องทำการป้องกันการอ่านโค้ด

#use delay (clock=20M, crystal)
// ใช้ built-in function: delay_ms() & delay_us() โดยใช้ crytal ความถี่ 20MHz 

#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,stream=HOSTPC,errors)
// กำหมดการเชื่อมต่อกับ serial port โดยกำหนดคอนฟิคต่างๆ และใช้ stream ชื่อว่า HOSTPC โดยจะใช้เป็นช่องทางการสั่ง fprintf


/*******************************************************************************
*  Function prototypes
********************************************************************************/
void headle(void);

/***********************************************************************
 * FUNCTION:    headle
 * DESCRIPTION: Show headle title though rs232
 * PARAMETERS:  nothing
 * RETURNED:    nothing
 ***********************************************************************/
void headle(void){
                fprintf(HOSTPC,"\n\r**********************************************************************************\n\r");
                fprintf(HOSTPC,"Project        : RS232 print out \n\r");
                fprintf(HOSTPC,"Purpose        : Test serial port \n\r");
                fprintf(HOSTPC,"Auther         : JUMP start innovation\n\r");
                fprintf(HOSTPC,"Email          : jumpstartinnovation@gmail.com\n\r");
                fprintf(HOSTPC,"Complier       : CCS.PCWH.v4.134\n\r");
                fprintf(HOSTPC,"Hardware       : PIC18F2550\n\r");
                fprintf(HOSTPC,"**********************************************************************************\n\r");
    }

/***********************************************************************
 * FUNCTION:    main
 * DESCRIPTION: main function
 * PARAMETERS:  nothing
 * RETURNED:    nothing
 ***********************************************************************/
void main(void){

int i; // ประกาศตัวแปล i เป็นชนิด integer
headle(); //แรกฟังก์ชั่น headle เพื่อแสดงข้อความออกทาง serial port
fprintf(HOSTPC,"Hello World\n\r");  //แสดงข้อความ Hello World ออกทางหน้าจอ

// ทำการสั่งพิมพ์ค่า i ออกทางหน้าจอ โดยค่า i จะแสดงค่าตั้งแต่ 0 จนถึง 9 แล้ววนกลับมาใหม่
for(i = 0; i < 10; i++){
fprintf(HOSTPC,"i = %d\n\r",i);
}

}

ทดลอง Simulation โดยใช้ Proteus Software

ต่อวงจรตามรูปข้างล่างเลยคะ โดยกำหนด clock ให้กับไมโครคอนโทรเลอร์เป็นค่า 20MHz แต่ถ้าจำไม่ได้ว่าทำการ config มันยังไงให้กลับไปดูบนความก่อนหน้านี้คะ (link here) ส่วนไฟล์ไบนาลี่ไปเอามาได้จากลิ้งนี้คะ (link here)
เมื่อต่อเสร็จแล้วลองรันดูเลยค่าาาา .... ^^



บทความนี้น่าจะเป็นพื้นฐานที่สำคัญในการพัฒนาไมโครคอนโทรเลอร์นะคะ .... ขอบคุณที่เข้ามาติดตามค่าาาา ^^



วันเสาร์ที่ 27 กรกฎาคม พ.ศ. 2556

XBee module



Xbee เป็นอุปกรณ์ที่มี Microcontroller และ RF IC อยู่ภายใน (อ้างอิงได้จาก Schematic ) ทำหน้าที่เป็น อุปกรณ์ transceiver (อุปกรณ์รับ-ส่งสัญญาณ) แบบ แบบ Half Duplex ย่านความถี่ 2.4 Ghz มีการจัดการโดยใช้พลังงานต่ำ ใช้งานง่าย มี interface ที่ใช้รับและส่งข้อมูลกับ Xbee เป็น UART (TTL) ซึ่งสำหรับทางด้านไมโครคอนโทรลเลอร์ เรานำขาที่ใช้ติดต่อสื่อสาร UART ของXbee ต่อเข้ากับ UART ของ ไมโครคอนโทรลเลอร์ ได้เลยคะ





Xbee สามารถใช้งานตามมาตรฐาน Zigbee ได้ โดยที่ท่านไม่ต้องเขียนโปรแกรมสร้าง เครือข่าย Zigbee เลย เพราะว่าทางผู้ผลิตได้จัดทำ firmware ที่จะโหลดเข้าไปในตัว Xbee ให้เราสามารถ set parameter ผ่าน software interface (X-CTU หรือโปรแกรมที่เขียนขึ้นเอง) , ผ่านทาง At command (เหมือนกับการควบคุม GSM Module ) โดยใช้ Hyper terminal หรือ ผ่านทางการรับส่งข้อมูลด้วยไมโครคอนโทรลเลอร์ ได้อย่างง่ายดาย โดยเมื่อ set Xbee ให้ทำงานเป็นอุปกรณ์ในเครือข่าย Zigbeeแล้ว เราจะเรียก Xbee แต่ละตัวว่าเป็น Node คะ







Xbee นั้น ใช้ย่านความถี่ 2.4 Ghz ซึ่งเป็นย่านเดียวกันกับ Bluetooth หรือ Wireless Lan ดังนั้นหลายคนอาจจะสงสัยว่า สัญญาณมันจะกวนกันหรือไม่ คำตอบคือ กวนกันคะ ยกตัวอย่างเช่น เรามี wireless lan ใช้ Access Point 1 ตัว และเราก็ยังใช้เครื่องโทรศัพท์แบบ ถือไปมาได้ (2.4 GHz cordless telephones) ซึ่งก็ใช้ย่าน 2.4 Ghz เช่นกัน แล้วเราก็ทดสอบใช้งาน Xbee ด้วยคะ ผลปรากฏว่า การรับส่งสัญญาณก็ขาดหายไปบ้าง แต่บางครั้งก็ครบถ้วน นั่นอาจเป็นเพราะกำลังส่งของ Xbeeและระยะทางของ node ที่เราทดสอบใกล้กันมากคะ





ช่องสัญญาณย่านความถี่ 2.4 Ghz นี้เรียกว่าเป็นย่านไมโครเวฟ หลักสำคัญของย่านไมโครเวฟอย่างหนึ่งคือ การวางตำแหน่งตัวรับส่งสัญญาณนั้น ต้องตั้งแบบ line of sight (ไม่มีสิ่งกีดขวางใด ๆ) ถึงจะได้กำลังส่งสูงสุด  สำหรับกำลังส่งของ Xbee ในรุ่น Pro จะใช้ 50-60 mw ใน datasheet บอกว่าได้ไกลถึง 1.5 km. แต่ก็ต้องเป็นลักษณะ ของ line of sight คะ หากไม่ใช่เงื่อนไขนี้ เราจะได้ระยะการรับส่งสัญญาณที่ลดลง นอกเหนือจากเรื่อง line of sight แล้ว ยังมีเรื่องสัญญาณรบกวนต่าง ๆ (Interference) 








ขอขอบคุณข้อมูลจาก http://www.thaieasyelec.com/Review-Product-Article/what-is-xbee.html

วันศุกร์ที่ 26 กรกฎาคม พ.ศ. 2556

Proteus (Software Simulation and PCB design)

โปรแกรม Proteus เป็นโปรแกรมที่มีความสามารถมากอีกโปรแกรมหนึ่ง ในงานด้านอิเล็กทรอนิกส์ เพราะสามารถออกแบบวงจรไฟฟ้า พร้อมทั้งจำลองการทำงานของวงจรได้ ทั้งยังสามารถออกแบบลายวงจรพิมพ์ได้อีกด้วย ความสามารถที่โดดเด่นของ Proteus นั้น จะกล่าวได้ว่าเป็นโปรแกรมที่สามารถจำลองพฤติกรรม (Simulator) การทำงานของวงจรที่ใช้ Microcontroller เบอร์ต่าง ได้มากมาย โดยไม่ต้องประกอบวงจรให้เสียเวลา เพื่อพิสูจน์ว่าโปรแกรมที่เขียนขึ้นใช้งานได้หรือไม่ โดยวงจรและโปรแกรม (Source code) ที่ตรวจสอบด้วยโปรแกรม Proteus เป็นที่เรียบร้อยแล้วว่าถูกต้อง เราก็สามารถสร้างวงจรจริงได้ตามต้องการ




ความเป็นมาของโปรแกรม Proteus
โปรแกรม Proteus หรือ Proteus VSM (Virtual System Modeling) เป็นโปรแกรมที่พัฒนาขึ้น โดยบริษัท แล็บเซ็นเตอร์อิเล็กทรอนิกส์ จำกัด (Labcenter Electronics Ltd.) ที่ประเทศอังกฤษ โปรแกรม Proteus มีชื่อเต็มว่า Labcenter Electronics Proteus ซึ่งภายในโปรแกรมจะประกอบด้วยส่วนประกอบหลัก 2 ส่วน คือ ISIS และ ARES โปรแกรม Proteus จะมีอยู่หลายเวอร์ชันให้เลือกใช้งาน ซึ่งเวอร์ชันในปัจจุบัน คือ เวอร์ชัน 7 และถ้าต้องการศึกษาหาข้อมูลเกี่ยวกับเวอร์ชันนี้ ก็สามารถเยี่ยมชมได้ที่เว็บไซต์ http://www.labcenter.co.uk




ความสามารถในการทำงานของโปรแกรม Proteus ก็คือ สามารถจำลองการทำงานของวงจรอิเล็กทรอนิกส์ได้หลากหลายรูปแบบ ไม่ว่าจะเป็นแบบอนาล็อกและแบบดิจิตอล หรือทั้งแบบอนาล็อกและดิจิตอลผสมกัน นอกจากนี้ Proteus ยังสามารถออกแบบลายวงจรพิมพ์ (PCB) ได้อีกด้วย จุดเด่นของโปรแกรม Proteus ที่เป็นที่นิยมและชื่นชอบก็คือ การจำลองการทำงานของวงจรอิเล็กทรอนิกส์ ที่ใช้ไมโครคอนโทรลเลอร์ตระกูลต่าง ไม่ว่าจะเป็น PIC, MCS-51, AVR และ ARM เป็นต้น ทำให้นักเขียนโปรแกรมหรือโปรแกรมเมอร์สามารถตรวจสอบได้ว่าโปรแกรม หรือซอสโค้ด (Source Code) ที่เขียนขึ้นมานั้น สามารถสนับสนุนกับวงจรฮาร์ดแวร์ที่ต่อได้หรือไม่ ถ้าโปรแกรม (Source Code) ที่เขียนขึ้น ไม่สนับสนุนกับวงจรฮาร์ดแวร์ที่ต่อโปรแกรมเมอร์ก็จะทำการพัฒนาโปรแกรม (Source Code) ที่เขียนขึ้นใหม่ หรือปรับปรุงวงจรฮาร์ดแวร์ใน Proteus จนกว่าโปรแกรมที่เขียนขึ้นและฮาร์ดแวร์ที่ต่อ สามารถสนับสนุนซึ่งกันและกัน ทำให้การสร้างโครงงานต่าง สามารถประหยัดเวลาและค่าใช้จ่ายเป็นอย่างมาก เพราะในอดีตการเขียนโปรแกรมขึ้นมานั้น จะต้องต่อวงจรจริงเพื่อทดสอบ ทำให้เสียเวลาและค่าใช้จ่ายมาก ในกรณีที่วงจรฮาร์ดแวร์และโปรแกรมที่เขียนขึ้นไม่สนับสนุนซึ่งกันและกัน

การจำลองการทำงานของวงจร

การออกแบบลายวงจร





ขอบคุณข้อมูลจากเว๊ปไซต์ http://www.xtranetworks.com


CCS C Complier


โปรแกรม CCS C Compiler หรือ PIC C Compiler เป็นโปรแกรมที่ใช้สำหรับโปรแกรมสั่งงานไมโครคอนโทรลเลอรตระกูล PIC ของบริษัท Microchip Inc. สร้างโดยบริษัท Customer Computer Service สหรัฐอเมริกา




CCS C Complier มีหลายรุ่น เพื่อรองรับความต้องการของผู้ใช้ โดยตารางข้างล่างแสดงรายละเอียดในเบื้องต้นของ CCS C ในแต่ละรุ่น 




ซึ่งทางบริษัท Customer Computer Service ได้บรรยายสรรพคุณไว้ว่า เป็นคอมไพเลอร์ที่ฉานฉลาดและทำให้ตัว source code นั้นสั้นและกระชับมากในการเขียน โดยตัวคอมไพเลอร์นี้จะเป็นการเขียนอยู่บนพื้นฐานของภาษาซี และได้รวมเอา Build-in Funtion Library ที่เฉพาะเจาะจงกับ register ของ PIC แต่ละเบอร์ไว้อย่างพร้อมสับคะ



ซึ่งตัวโปรแกรมสามารถดาวน์โหลดฟรีได้ที่ http://www.ccsinfo.com/downloads.php ซึ่งจะเป็นตัว demo สามารถทดลองใช้ได้ 30 วันคะ

ไมโครคอนโทรลเลอร์ ......มันคืออะไร?


ไมโครคอนโทรลเลอร์ (อังกฤษ: Microcontroller) คือ อุปกรณ์ควบคุมขนาดเล็ก ซึ่งบรรจุความสามารถที่คล้ายคลึงกับระบบคอมพิวเตอร์ โดยในไมโครคอนโทรลเลอร์ได้รวมเอาซีพียู, หน่วยความจำ และพอร์ต ซึ่งเป็นส่วนประกอบหลักสำคัญของระบบคอมพิวเตอร์เข้าไว้ด้วยกัน โดยทำการบรรจุเข้าไว้ในตัวถังเดียวกัน

โครงสร้างโดยทั่วไป ของไมโครคอนโทรลเลอร์นั้น สามารถแบ่งออกมาได้เป็น 5 ส่วนใหญ่ๆ ดังต่อไปนี้
1. หน่วยประมวลผลกลางหรือซีพียู (CPU : Central Processing Unit) ทำหน้าที่เป็นศูนย์กลางควบคุมการทำงานของระบบคอมพิวเตอร์ทั้งหมด โดยนำข้อมูลจากอุปกรณ์รับข้อมูลมาทำงาน ประมวลผลข้อมูลตามคำสั่งของโปรแกรม และส่งผลลัพธ์ออกไปหน่วยแสดงผล

2. หน่วยความจำ (Memory) สามารถแบ่งออกเป็น ส่วน คือ หน่วยความจำที่มีไว้สำหรับเก็บโปรแกรมหลัก (Program Memory) เปรียบเสมือนฮาร์ดดิสก์ของ เครื่องคอมพิวเตอร์ตั้งโต๊ะ คือข้อมูลใดๆ ที่ถูกเก็บไว้ในนี้จะไม่สูญหายไปแม้ไม่มีไฟเลี้ยง อีกส่วนหนึ่งคือหน่วยความจำข้อมูล (Data Memory) ใช้เป็นเหมือนกกระดาษทดในการคำนวณของซีพียู และเป็นที่พักข้อมูลชั่วคราวขณะทำงาน แต่หากไม่มีไฟเลี้ยง ข้อมูลก็จะหายไปคล้ายกับหน่วยความแรม (RAM) ในเครื่องคอมพิวเตอร์ทั่วๆ ไป แต่สำหรับไมโครคอนโทรลเลอร์สมัยใหม่ หน่วยความจำข้อมูลจะมีทั้งที่เป็นหน่วยความจำแรม ซึ่งข้อมูลจะหายไปเมื่อไม่มีไฟเลี้ยง และเป็นอีอีพรอม (EEPROM : Erasable Electrically Read-Only Mempry) ซึ่งสามารถเก็บข้อมูลได้แม้ไม่มีไฟเลี้ยง

3. ส่วนติดต่อกับอุปกรณ์ภายนอก หรือพอร์ต (Port) มี 2 ลักษณะคือ พอร์ตอินพุต (Input Port) และพอร์ตส่งสัญญาณหรือพอร์ตเอาต์พุต (Output Port) ส่วนนี้จะใช้ในการเชื่อมต่อกับอุปกรณ์ภายนอก ถือว่าเป็นส่วนที่สำคัญมาก ใช้ร่วมกันระหว่างพอร์ตอินพุต เพื่อรับสัญญาณ อาจจะด้วยการกดสวิตช์ เพื่อนำไปประมวลผลและส่งไปพอร์ตเอาต์พุต เพื่อแสดงผลเช่น การติดสว่างของหลอดไฟ เป็นต้น

4. ช่องทางเดินของสัญญาณ หรือบัส (BUS) คือเส้นทางการแลกเปลี่ยนสัญญาณข้อมูลระหว่าง ซีพียู หน่วยความจำและพอร์ต เป็นลักษณะของสายสัญญาณ จำนวนมากอยู่ภายในตัวไมโครคอนโทรลเลอร์ โดยแบ่งเป็นบัสข้อมูล (Data Bus) , บัสแอดเดรส (Address Bus) และบัสควบคุม (Control Bus)


5. วงจรกำเนิดสัญญาณนาฬิกา นับเป็นส่วนประกอบที่สำคัญมากอีกส่วนหนึ่ง เนื่องจากการทำงานที่เกิดขึ้นในตัวไมโครคอนโทรลเลอร์ จะขึ้นอยู่กับการกำหนดจังหวะ หากสัญญาณนาฬิกามีความถี่สูง จังหวะการทำงานก็จะสามารถทำได้ถี่ขึ้นส่งผลให้ไมโครคอนโทรลเลอร์จัวนั้น มีความเร็วในการประมวลผลสูงตามไปด้วย




นอกจากนี้ยังมีส่วนพิเศษอื่นๆ จะขึ้นอยู่กับกระบวนการผลิตของแต่ละบริษัทที่จะผลิตขึ้นมาใส่คุณสมบัติพิเศษลงไปเช่น 

- ADC (Analog to Digital) ส่วนภาครับสัญญาณอนาล็อกแปลงไปเป็นสัญญาณดิจิตอล

- DAC (Digital to Analog) ส่วนภาคส่งสัญญาณดิจิตอลแปลงไปเป็นสัญญาณอนาล็อก

- I2C (Inter Integrate Circuit Bus) เป็นการสื่อสารอนุกรม แบบซิงโครนัส (Synchronous) เพื่อใช้ ติดต่อสื่อสาร ระหว่าง ไมโครคอนโทรลเลอร์ (MCU) กับอุปกรณ์ภายนอก ซึ่งถูกพัฒนาขึ้นโดยบริษัท Philips Semiconductors โดยใช้สายสัญญาณเพียง 2 เส้นเท่านั้น คือ serial data (SDA) และสาย serial clock (SCL) ซึ่งสามารถ เชื่อมต่ออุปกรณ์ จำนวนหลายๆ ตัว เข้าด้วยกันได้ ทำให้ MCU ใช้พอร์ตเพียง 2 พอร์ตเท่านั้น

- SPI (Serial Peripheral Interface) เป็นการเชื่อมต่อกับอุปกรณ์เพื่อรับส่งข้อมูลแบบซิงโครนัส (Synchronize) มีสัญญาณนาฬิกาเข้ามาเกี่ยวข้องระหว่างไมโครคอนโทรลเลอร์ (Microcontroller) หรือจะเป็นอุปกรณ์ภายนอกที่มีการรับส่งข้อมูลแบบ SPI อุปกรณ์ที่ทำหน้าที่เป็นมาสเตอร์ (Master) โดยปกติแล้วจะเป็ไมโครคอนโทรลเลอร์ หรืออาจกล่าวได้ว่าอุปกรณ์ Master จะต้องควบคุมอุปกรณ์ Slave ได้ โดยปกติตัว Slave มักจะเป็นไอซี (IC) หน้าที่พิเศษต่างๆ เช่น ไอซีอุณหภูมิ, ไอซีฐานเวลานาฬิกาจริง (Real-Time Clock) หรืออาจเป็นไมโครคอนโทรลเลอร์ที่ทำหน้าที่ในโหมด Slave ก็ได้เช่นกัน

- PWM (Pulse Width Modulation) การสร้างสัญญาณพัลส์แบบสแควร์เวฟ ที่สามารถปรับเปลี่ยนความถี่และ Duty Cycle ได้เพื่อนำไปควบอุปกรณ์ต่างๆแช่น มอเตอร์


- UART (Universal Asynchronous Receiver Transmitter) ทำหน้าที่รับส่งข้อมูลแบบอะซิงโครนัสสำหรับมาตรฐานการรับส่งข้อมูลแบบ RS-232



ไมโครคอนโทรลเลอร์ มีกี่ประเภทอะไรบ้าง?

ไมโครคอนโทรลเลอร์ มีด้วยกันหลายประเภทแบ่งตามสถาปัตยกรรม 
(การผลิตและกระบวนการทำงานระบบการประมวลผล) ที่มีใช้ในปัจจุบันยกตัวอย่างดังนี้

1.ไมโคร คอนโทรลเลอร์ตระกูล PIC (บริษัทผู้ผลิต Microchip ไมโครชิป) 

2.ไมโคร คอนโทรลเลอร์ตระกูล MCS51 (บริษัทผู้ผลิต Atmel,Phillips)

3.ไมโคร คอนโทรลเลอร์ตระกูล AVR (บริษัทผู้ผลิต Atmel)

4.ไมโคร คอนโทรลเลอร์ตระกูล ARM7,ARM9 (บริษัทผู้ผลิต Atmel,Phillips,Analog Device,Sumsung,STMicroelectronics)

5.ไมโคร คอนโทรลเลอร์ตระกูล Basic Stamp (บริษัทผู้ผลิต Parallax)

6.ไมโคร คอนโทรลเลอร์ตระกูล PSOC (บริษัทผู้ผลิต CYPRESS)

7.ไมโคร คอนโทรลเลอร์ตระกูล MSP (บริษัทผู้ผลิต Texas Intruments)

8.ไมโคร คอนโทรลเลอร์ตระกูล 68HC (บริษัทผู้ผลิต MOTOROLA)

9.ไมโคร คอนโทรลเลอร์ตระกูล H8 (บริษัทผู้ผลิต Renesas)

10.ไมโคร คอนโทรลเลอร์ตระกูล RABBIT (บริษัทผู้ผลิต RABBIT SEMICONDUCTOR)

11.ไมโคร คอนโทรลเลอร์ตระกูล Z80 (บริษัทผู้ผลิต Zilog)

และอีกหลายเบอร์หลายบริษัทที่ยังไม่ได้ยกมาเป็นตัวอย่าง










ภาษาที่ใช้เขียน โปรแกรมควบคุมไมโครคอนโทลเลอร์ มีอะไรบ้าง?

1.ภาษา Assembly

2.ภาษา Basic

3.ภาษา C

4.ภาษา Pascal

5.ภาษา Java

และอีกหลากหลายภาษาซึ่งได้รับการพัฒนามาอย่างต่อเนื่อง

ภาษา ดัง กล่าวที่กล่าวในเบื้องต้น ไมโครคอนโทรลเลอร์บางตระกูล จะใช้ได้ครบทุกภาษา แต่บางตระกูลจะใช้ได้บางภาษา ขึ้นอยู่กับบริษัทผู้ผลิต Software (โดยทั่วไปจะเรียกว่า Editor And Complier) ที่ใช้เขียนภาษาไมโครคอนโทรลเลอร์นั้นจะผลิตออกมาให้ Support หรือไม่ 
ผมขอสรุปในเบื้องต้นแบบง่ายๆ ไมโครคอนโทรลเลอร์เปรียบเทียบรถยนต์ทั่วไปรถยนต์ มีหลายบริษัทผู้ผลิต,ในแต่ละบริษัทก็มีอยู่หลายรุ่นหลายแบบ รถยนต์มีระบบทุกอย่างพร้อมขึ้นอยู่กับเราจะขับหรือควบคุมการใช้งานนั่นเองไมโคร คอนโทรลเลอร์ก็เช่นกัน มีหลายบริษัทผู้ผลิต,ในแต่ละบริษัทผู้ผลิต ก็จะมีหลายเบอร์ให้เลือกใช้งาน,ไมโครคอนโทรลเลอร์ก็มีระบบต่างๆอยู่เพียบ พร้อม ส่วนการใช้งานขึ้นอยู่กับเราจะเขียนโปรแกรมควบคุมให้มันทำงานตามที่เราต้อง การเท่านั้นเองคะ.