หน้าเว็บ

วันอังคารที่ 3 มิถุนายน พ.ศ. 2557

เครื่องให้น้ำต้นไม้ตามปริมาณความชื้นในดิน

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




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



รูปด้านบนแสดงโครงสร้างระบบจ่ายน้ำอัตโนมัติ  โดยการทำงานของระบบ ตัวเซนเซอร์จะทำการตรวจวัดระดับความชื้นในดิน ซึ่งจะแบ่งระดับความชื้นในดินออกเป็น 5 ระดับ โดยระดับที่ 0 ความชื้นในดินจะต่ำที่สุด และระดับที่ 4 ความชื้นในดินจะสูงที่สุด โดยผู้ใช้สามารถสังเกตระดับความชื้นได้จากไฟแอลอีดี(LED) ที่อยู่บนตัวเซนเซอร์ จากนั้นตัวเซนเซอร์ จะส่งผ่านข้อมูลความชื้น (แบบไร้สาย) ไปให้กับกล่องควบคุม  โดยกล่องควบคุมจะเป็นตัวประมวลผลและเป็นตัวควบคุมการจ่ายน้ำให้กับแปลงพื้นนั้นๆ โดยค่าระดับความชื้นในดินและเวลาในการรดน้ำ ผู้ใช้งานสามารถตั้งค่าได้เองที่ตัวกล่องควบคุม  ซึ่งกล่องควบคุม 1 ตัว สามารถเชื่อมต่อตัววัดความชื้นได้หลายตัว   โดยตัววัดความชื้นและวาล์วน้ำอิเล็กทรอนิกส์ แต่ละตัวสามารถแยกการทำงานได้อย่างอิสระ


กล่องควบคุม



เซนเซอร์วัดความชื้น



โพรบวัดความชื้นในดิน





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



การวางระบบน้ำโดยใช้ท่อพีอี



ตัวอย่าง วาล์วน้ำอิเล็กทรอนิกส์และระบบจ่ายน้ำแบบน้ำหยด



ติดตั้งตัวเซนเซอร์วัดความชื้นในดิน

จากการทำงาน เครื่องจ่ายน้ำอัตโนมัติตามปริมาณความชื้นในดิน ทำให้เกษตรกรสามารถใช้ทรัพยากรน้ำได้อย่างมีประสิทธิภาพ และยังช่วยเพิ่มผลผลิตที่การเกษตรให้มากขึ้นอีกด้วย



สนใจแนวคิดและหลักการเพื่อนำไปต่อยอดนวัตกรรม
ติดต่อได้ที่ คุณ อุเทน บุญเลียม
โทรศัพท์ : 089-1407205
อีเมล์ : uten.boonliam@gmail.com

วันเสาร์ที่ 3 สิงหาคม พ.ศ. 2556

XBEE communication test with PIC24FJ48GA002



บทความนี้เป็นการทดลองใช้ Xbee สองตัวมาคุยกันครับ โดยตัวแรกต่ออยู่กับฝั่งคอมพิวเตอร์ ส่วนตัวที่สองต่ออยู่กับ MCU เบอร์ PIC24FJ48GA002 (ตระกูล 16 bit) โดยการทดสอบคือจะให้ตัว Host(ต่ออยู่กับคอมพิวเตอร์) ร้องขอไปยังตัว Client (ที่อยู่อยู่กับ MCU)  โดยการทำงานของฟังก์ชั้นคือ



Host : ทำการเช็ค Client ว่าแอคทีฟอยู่หรือไม่ โดยส่ง ASK <client>
Client : ทำการแจ้งกลับไปในกรณีทีตัวมันถูกเรียก โดยส่ง ACK <client> 
Host : ทำการสอบถามสถานะตัว Client ว่ายุ่งอยู่หรือไม่ โดยส่งคำสั่ง BSY <client>
Client: ส่งสถานะตัวมันว่าตอนนี้ยุ่งอยู่หรือว่าง คือ  READY <client> หรือ BUSY <client>


โดยลูปการทำงานของ MCU จะทำการนับค่า 1 ถึง 100 ไปวนไปเรื่อยๆ แต่จะใช้หลักการ serial interrupt ในกรณีที่มีข้อมูลเข้ามาที่ตัว  Xbee

โดย Flow chart การทำงานของโปรแกรมดูได้จากข้างล่างครับ






วีดีโอการทดลอง



วันพฤหัสบดีที่ 1 สิงหาคม พ.ศ. 2556

ความรู้เกี่ยวกับ MEMORY ชนิดต่างๆ







          SRAM (static RAM) เป็นหน่วยความจำชั่วคราวที่รักษาบิตข้อมูลในหน่วยความจำ ตราบที่ยังมีพลังงานจ่ายให้ ซึ่งแตกต่างจาก dynamic RAM (DRAM) ที่เก็บบิตในเซลล์ที่ประกอบด้วยคาปาซิเตอร์ และตัวต้านทาน SRAM จะไม่มีการ refresh เป็นระยะ ๆ SRAM ให้การเข้าเก็บข้อมูลเร็วกว่าและแพงกว่า DRAM และ SRAM จะใช้เป็น cache memory ของคอมพิวเตอร์ และเป็นส่วนของ random access memory digital-to-analog converter (RAMDAC) บนการ์ดวิดีโอ



          Dynamic random access memory (DRAM) เป็นหน่วยความจำชั่วคราว (RAM) ที่ใช้โดยทั่วไปสำหรับคอมพิวเตอร์ส่วนบุคคล และเวิร์กสเตชัน หน่วยความจำเป็น เครือข่ายของการชาร์จไฟฟ้าที่จุดซึ่งเป็นที่เก็บของคอมพิวเตอร์ โดยมีการเข้าถึงข้อมูลอย่างรวดเร็วในรูปแบบ 0 และ 1 random access มีความหมายว่าโพรเซสเซอร์ของคอมพิวเตอร์ส่วนบุคคล สามารถเข้าถึงส่วนต่าง ๆ ของหน่วยความจำ หรือที่เก็บข้อมูลโดยตรงแทนที่การเข้าถึงแบบอนุกรมจากจุดเริ่มต้น DRAM แตกต่างจาก Static RAM (SRAM) โดย DRAM ต้องการให้เซลล์มีการ refresh หรือให้มีการชาร์จไฟฟ้าใหม่ ในช่วงเวลาที่เป็น milliseconds ในขณะที่ Static RAM ไม่จำเป็นต้อง refresh เพราะการทำงานอยู่บนหลักการของการย้ายกระแส เมื่อมีการสับเปลี่ยนในหนึ่งของสองทิศทางแทนการชาร์จประจุของเซลล์ Static RAM โดยทั่วไปใช้สำหรับ cache memory ซึ่งเข้าถึงได้เร็วกว่า DRAM
          DRAM เก็บแต่ละบิตในเซลล์ที่ประกอบด้วยคาปาซิเตอร์ และตัวต้านทาน โดยคาปาซิเตอร์ มีแนวโน้ม สูญเสียการชาร์จ อย่างรวดเร็ว ดังนั้น จึงต้องการให้ชาร์จใหม่ RAM ยังมีอีกหลายประเภท เช่น extended data output RAM (EDO RAM) และ synchronous dynamic random access memory (SDRAM)



           Flash memory (บางครั้งเรียกว่า "flash RAM") เป็นประเภทของ constantly-powered nonvolatile memory ที่สามารถลบและดปรแกรมใหม่ในหน่วยความจำที่เรียกว่า บล๊อก สิ่งนี้เป็นการเปลี่ยนแปลงของ electrically erasable programmable read-only memory (EEPROM) ซึ่ง ไม่เหมือนกับ flash memory ได้รับการลบและเขียนใหม่ที่ระดับไบต์ ซึ่งช้ากว่าการปรับปรุง flash memory ตามปกติ flash memory ได้รับการใช้เพื่อควบคุมคำสั่ง เช่น basic input/output system (BIOS) ในเครื่องคอมพิวเตอร์ส่วนบุคคล เมื่อ BIOS ต้องเปลี่ยนแปลง (เขียนใหม่) flash memory สามารถได้รับการเขียนลงในบล๊อก (แทนที่ไบต์) ทำให้ในการปรับปรุง อีกด้านหนึ่ง flash memory ไม่ใช้เป็น random access memory (RAM)
           Flash memory ได้รับชื่อนี้เพราะการจัดไมโครชิป ดังนั้นส่วนของเซลหน่วยความจำได้รับการลบในกากระทำครั้งเดียว หรือ “flash” การลบเป็นเหตุโดย Fowler-Nordheim tunneling ซึ่งอิเลคตรอนแทรกผ่านวัสดุ dielectric บางเพื่อลบการปล่อยประจุอิเลคตรอนจาก floating gate ที่สัมพันธ์กับแต่ละเซลหน่วยความจำ Intel ให้รูปแบบของ flash memory ที่เก็บ 2 บิต (แทนที่ 1 บิต) ในแต่ละเซลหน่วยความจำ ดังนั้นเพิ่มความจุหน่วยความจำเป็น 2 เท่าโดยปราศจากการเพิ่มราคา
           Flash memory ได้รับการใช้โทรศัพท์เซลลูลาร์ดิจิตอล, กล้องดิจิตอล, PC Card สำหรับคอมพิวเตอร์ notebook, สวิตช์ LAN, set-up box ดิจิตอล, ตัวควบคุมแบบฝัง และอุปกรณ์อื่นๆ






          EEPROM เป็นหน่วยความจำแบบอ่านอย่างเดียว ที่ผู้ใช้ปรับปรุงได้ ซึ่งสามารถลบ และโปรแกรมใหม่ได้ด้วยการประยุกต์ของความต่างศักย์ที่สูงกว่าปกติ แต่ไม่เหมือนกัน erasable programmable read-only memory (EPROM) โดย EEPROM จะต้องและโปรแกรมใหม่ทั้งหมดไม่สามารถเลือกได้ และอายุการใช้ขึ้นกับจำนวนครั้งในการโปรแกรม ตั้งแต่หลายสิบครั้ง หลายหมื่นครั้ง ใน EEPROM ที่มีความถี่ในการโปรแกรมใหม่ ขณะที่คอมพิวเตอร์ใช้งาน ต้องพิจารณาอายุของ EEPROM ในการออกแบบ รูปแบบพิเศษของ EEPROM คือ flush memory ซึ่งใช้ความต่างศักย์ปกติของคอมพิวเตอร์ส่วนบุคคลในการและโปรแกรมใหม่




EPROM = Erasable Programmable Read-Only Memory หรือ เอ็ปรอม คือพีรอมซึ่งสามารถลบและนำมาใช้ซ้ำได้ การลบข้อมูลในเอ็ปรอมสามารถทำได้โดยการนำไปตากแดด รังสีอุลตร้าไวโอเล็ตในแสงแดงจะทำปฏิกิริยากับชิพหน่วยความจำและลบข้อมูลทั้งหมดออกไป อย่างไรก็ตามการลบข้อมูลจะเกิดขึ้นภายใต้แสงแดดจัดเท่านั้น แสงแดดที่ส่องผ่านเข้ามาในห้องอาจมีปริมาณรังสีอุลตร้าไวโอเล็ตไม่เพียงพอสำหรับกระบวนการดังกล่าวได้




NAND Flash Drive คืออะไร
นวัตกรรมจาก samsung โดย NAND Flash Drive ใช้โครงสร้างการผลิตแบบเดียวกับการผลิต CF Card นั่นเอง โดย NAND Flash Drive จะถือเป็นอุปกรณ์จัดเก็บข้อมูลสำหรับอุปกรณ์พกพาไม่ว่าจะเป็น Notebook, PDA Phone สำหรับอนาคต ข้อดีที่ดีกว่าฮาร์ดดิสก์แบบ 2.5 นิ้ว ในปัจจุบันก็คือน้ำหนักที่เบากว่า และการบริโภคพลังงานที่น้อยกว่านั่นเอง โดยผู้พัฒนาเทคโนโลยีซัมซุงนั่นสามารถผลิตชิพความจำ NAND (Flash Memory) ให้มีขนาดบางลงอย่างไม่น่าเชื่ออยู่ที่แค่ 0.6 มิลลิเมตร (หรือ 0.02 นิ้ว) เท่านั่นเอง NAND ขนาด 0.6 มิลลิเมตรจะมีขนาดความจำเริ่มต้นถึง 32GB เลยที เดียวปัจจุบันเทคโนโลยี NAND นั่นถูกใช้เป็นมาตรฐาน Memory (ความจำ) โดยทั่วไปอย่างล้นหลายในไม่ว่าจะเป็นความจำของมือถือ, เครื่องเล่น mp3, หรือกล้องดิจิตอล หลายสือได้สันนิษฐานว่าการพัฒนาในการลดขนาด NAND ของ ซัมซุงอาจเป็นการกระตุ้นให้ราคา SSD (Solid-State Drive) ตกลงขึ้นมาได้





           nonvolatile storage หรือ nonvolatile RAM (NVRAM) เป็นรูปแบบของ static RAM ที่เพื่อได้รับการบันทึกเมื่อคอมพิวเตอร์ปิด หรือไม่มีแหล่งพลังงานภายนอก NVRAM สามารถทดลองโดยให้ static RAM ต่อกับแบตเตอรี่สำรอง หรือโดยการบันทึกเนื้อหา และดึงจาก electrically erasable programmable ROM โมเด็มบางแบบใช้ NVRAM เป็นที่เก็บค่าตั้งต้น หรือ หมายเลขโทรศัพท์ที่ผู้ใช้เจาะจง และรายละเอียดของโมเด็ม




วันอังคารที่ 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)
เมื่อต่อเสร็จแล้วลองรันดูเลยค่าาาา .... ^^



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