ในบางครั้ง เรามีความจำเป็นต้องทำปุ่มกดพิเศษขึ้นมานอกเหนือจากการใช้แป้นจากคีย์บอร์ดคอมพิวเตอร์ปกติ เพื่อให้โปรแกรมที่เราเขียนขึ้นมาเองทำงานฟังก์ชั่นพิเศษ หรือในบางงานเราอาจจะไม่สะดวกที่จะให้ User ทำการกดบนแป้นคีย์บอร์ด แต่ อยากให้มีปุ่มที่ทำงานเฉพาะเพื่อรับค่าการกดปุ่ม แล้วนำไปประมวลผลต่อในโปรแกรม
วันนี้ ผมมีตัวอย่างง่ายๆ ด้วยการรับค่าจากปุ่มกด Push button แบบกดติดปล่อยดับ โดยต่อเข้ากับอินพุตพอร์ตของไอซี MCP2200 ของทางบริษัทไมโครชิพ แล้วให้โปรแกรมที่เขียนด้วย C# มาอ่านค่าจากพอร์ต GPIO ของ MCP2200 และแสดงค่าบนหน้าต่างโปรแกรมของเรา
ไม่ขอกล่าวถึงรายละเอียดของ MCP2200 มากนัก ซึ่งเราสามารถหาอ่านรายละเอียดได้จากเว็บ www.microchip.com ได้เลย เพียงแต่จะบอกรายละเอียดย่อๆ ไว้ แท้จริงแล้ว MCP2200 นั้นก็คือ ไมโครคอนโทรลเลอร์เบอร์ 18F14K50 ที่ได้บรรจุ firmware ที่ทำหน้าที่เป็น USB to Serial converter ไว้แล้ว นอกจากนี้ ยังมี GPIO เหลือให้ใช้อีก จำนวนหนึ่ง (ไม่เกิน 8 pin) และยังสามารถเรียกใช้หน่วยความจำ EEPROM ให้ใช้ได้อีก 256 byte แต่ในตัวอย่างที่ผมจะทดสอบให้ดูวันนี้ เป็นแค่การเรียกใช้ GPIO2 - GPIO5 ของมันเท่านั้น
ทำการต่อวงจรตามรูป
เสร็จแล้วทดลองจ่ายไฟเข้าบอร์ดผ่านทางสาย USB ถ้าวงจรที่เราทำนั้นทำงานได้ปกติ ตัว Windows เองจะพยายามทำการติดตั้ง Driver ให้เราทำการโหลด Driver จากเว็บแล้วติดตั้งลงไป ตรงนี้ไม่ขออธิบายมากนัก ก็เหมือนๆ กับการติดตั้ง Driver ทั่วๆไป
http://www.microchip.com/wwwproducts/devices.aspx?dDocName=en546923
เสร็จแล้ว ลองทดสอบด้วยการเปิดโปรแกรม MCP2200 Configuration Utility v1.3.1 โหลดได้จากที่นี่ เหมือนกัน
http://www.microchip.com/wwwproducts/devices.aspx?dDocName=en546923
หากสามารถเชื่อมต่อไป โปรแกรมจะแสดงคำว่า Connected ที่ด้านล่าง ตามรูป
ปิดโปรแกรมไป ทีนี้ เราจะมาสร้าง Windows application เพื่ออ่านค่าจาก push button ที่เราต่อไว้กับ GPIO2, GPIO3, GPIO4, GPIO5 ของ MCP2200 เพื่ออ่านค่าสถานะ push button แล้วแสดงค่าบนฟอร์มที่เราออกแบบไว้บน Visual C# 2010 express
หน้าต่างโปรแกรม ครับ
ทำการ add reference ไฟล์ SimpleIO-M.dll ซึ่งต้องไปดาวน์โหลดที่
http://ww1.microchip.com/downloads/en/DeviceDoc/MCP2200_DLL_2013-01-28.zip
จากนั้นแตกไฟล์ออก ไฟล์จะอยู่ที่โฟวเดอร์ Managed\ เนื่องจากเราพัฒนาโปรแกรมด้วย Visual C# ซึ่งมองว่าเป็นแบบ Managed code แล้ว add reference ไปใส่ในโปรเจค C# ของเรา และในโฟวเดอร์เดียวกันนี้ เขาจะมีไฟล์ SimpleIO DLL (Managed) User Manual.pdf ให้เรา เพื่ออธิบายการทำงานแต่ละ method ศึกษาเพิ่มเติมได้จากนี่แหละครับ
ทำการ using SimpleIO; เพื่อเรียกใช้ class ใน namespace แล้วทำการเขียนโค๊ด
อธิบายการทำงานของโปรแกรม
ทำการ Initial constructor ของ SimpleIOClass ด้วยการกำหนดค่า VID, PID ที่ได้จากการตั้งค่าจากโปรแกรม MCP2200 Configuration Utility v1.3.1
Timer1 ทำหน้าอ่านค่าสถานะของ push button ที่ต่ออยู่กับ GPIO ทุกๆ 200ms
ทำการอ่านค่า Port ด้วยเมธอด SimpleIOClass.ReadPort ซึ่งจากให้ค่าเป็นแบบ One-at-a-time มีลักษณะเปลี่ยนแปลงแบบครั้งเดียว ไม่คงค่าไว้ ดังนั้นเราจึงต้องใช้ Timer1 ช่วยในการ sampling ตลอดเวลา
================= โค๊ด==========================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SimpleIO;
namespace SimpleMCP2200
{
public partial class Form1 : Form
{
const uint mcp2200_VID = 0x04D8;
const uint mcp2200_PID = 0x00DF;
bool isConnected = false;
public Form1()
{
InitializeComponent();
SimpleIOClass.InitMCP2200(mcp2200_VID, mcp2200_PID);
timer1.Interval = 200;
timer1.Stop();
}
private void Form1_Load(object sender, EventArgs e)
{
isConnected = SimpleIOClass.IsConnected();
if (isConnected)
{
connectedLabel.Text = "The device is connected";
connectedLabel.ForeColor = Color.Green;
if (SimpleIOClass.ConfigureIO(0xFF))
{
configLabel.Text = "Success";
configLabel.ForeColor = Color.Green;
timer1.Start();
}
else
{
configLabel.Text = "Invalid command";
configLabel.ForeColor = Color.Red;
}
}
else
{
connectedLabel.Text = "The device is NOT connected";
connectedLabel.ForeColor = Color.Red;
errorReadPortLabel.Text = "Read port Fail";
errorReadPortLabel.ForeColor = Color.Red;
configLabel.Text = "Not config";
configLabel.ForeColor = Color.Red;
}
}
private void timer1_Tick(object sender, EventArgs e)
{
unsafe
{
uint add = 0x00;
uint* returnValue = &add;
if (SimpleIOClass.ReadPort(returnValue))
{
int ret = SimpleIOClass.ReadPortValue();
if (ret != 0x8000)
{
errorReadPortLabel.Text = "Read port Success";
errorReadPortLabel.ForeColor = Color.Green;
readPortValueTextBox.Text = String.Format("{0:x2}", ret);
readPortValueTextBox.Text = String.Concat("0x",readPortValueTextBox.Text.ToUpper());
switch(ret)
{
case 0x00FB:
gpio2Label.Text = "ON";
break;
case 0x00F7:
gpio3Label.Text = "ON";
break;
case 0x00EF:
gpio4Label.Text = "ON";
break;
case 0x00DF:
gpio5Label.Text = "ON";
break;
default:
gpio5Label.Text = "OFF";
gpio4Label.Text = "OFF";
gpio3Label.Text = "OFF";
gpio2Label.Text = "OFF";
break;
}
}
else
{
errorReadPortLabel.Text = "Read port Fail";
errorReadPortLabel.ForeColor = Color.Red;
}
}
}
}
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
System.Diagnostics.Process.Start("http://visual-studio-express-project.blogspot.com/");
}
}
}
ทดสอบกด push button แล้วดูการเปลี่ยนแปลงที่หน้าโปรแกรมที่เราสร้างขึ้นมาครับ
หมายเหตุ : Dll ไฟล์นี้ ใช้ได้กับ .NET Framework 3.5 ไม่เกินนี้ ตอน Build project จำเป็นต้องเช็คบ๊อกซ์ Allow unsafe code ด้วย เพราะมีการเรียกใช้ pointer ในโค๊ด
โหลดไฟล์โปรเจคของผมไปศึกษากันดูครับ
https://dl.dropboxusercontent.com/u/65353188/SimpleMCP2200.zip
0 ความคิดเห็น:
Post a Comment