一、引言
最近擺弄了一段時間的Arduino,發現Arduino做一些電子類項目、監控、機器人、電子玩具比較容易,並且Arduino與.NET程序集成也不難。接下來介紹一個簡單的小程序,C#做的一個Windows Form程序,通過.NET串口編程與Arduino通信,來控制LED燈的狀態,以此演示C#與Arduino串口通信的方法。
二、功能演示
這個小程序功能極其簡單,運行Windows Form程序,點擊“開燈”單選框則點亮與Arduino相連的LED燈,點擊“關燈”單選框則熄滅LED燈,圖下2圖所示:
三、實現機制
- C#程序向Arduino使用的串口COM4(可通過操作系統的控制面板查看Arduino使用的串口號)輸出命令字符:1—表示點亮,0—表示熄滅;
- Arduino讀取串口接收到的命令字符,如果讀到的字符為1則向LED所在針腳pin 13輸出高電平點亮LED燈,如果讀到的字符為0則輸出低電平熄滅LED燈。
四、開發環境
- Arduino 1.0.5 IDE
- Visual studio 2010
五、所需元件
- Arduino UNO板1塊(必需)
- Arduino UNO板與電腦相連的USB線1根(必需)
- LED燈1個(可選)
- 面包板1塊(可選)
- 10K電阻1個(可選)
- 跳線2根(可選)
注:Arduino UNO板在pin 13自帶了1個LED燈,可以用此燈代替單獨的LED燈,所以面包板、LED燈等為可選元件。
六、元件連接
元件連接很簡單:LED燈的正極與Arduino的數字針腳pin 13相連,電阻與LED串聯,然后接回Arduino的GND,最后用USB線把Arduino板與電腦相連,如上圖所示。
七、C#實現代碼
創建一個Windows Form,拖放2個單選框,編寫Windows Form后台代碼,利用.NET的SerialPort類進行串口操作:
1 public partial class Form1 : Form 2 { 3 SerialPort port; 4 5 public Form1() 6 { 7 InitializeComponent(); 8 9 this.FormClosed += new FormClosedEventHandler(Form1_FormClosed); 10 11 if (port == null) 12 { 13 //COM4為Arduino使用的串口號,需根據實際情況調整 14 port = new SerialPort("COM4", 9600); 15 port.Open(); 16 } 17 } 18 19 void Form1_FormClosed(object sender, FormClosedEventArgs e) 20 { 21 if (port != null && port.IsOpen) 22 { 23 port.Close(); 24 } 25 } 26 27 //點亮 28 private void rbOpen_CheckedChanged(object sender, EventArgs e) 29 { 30 if (this.rbOpen.Checked) 31 { 32 PortWrite("1"); 33 } 34 } 35 36 //熄滅 37 private void rbClose_CheckedChanged(object sender, EventArgs e) 38 { 39 if (this.rbClose.Checked) 40 { 41 PortWrite("0"); 42 } 43 } 44 45 //向串口輸出命令字符 46 private void PortWrite(string message) 47 { 48 if (port != null && port.IsOpen) 49 { 50 port.Write(message); 51 //port.WriteLine(message); 52 } 53 } 54 }
八、Arduino Sketch代碼
讀取串口接收到的字符,並根據字符向pin 13輸出高電平或低電平,對LED燈進行點亮或熄滅控制:
const int LedPin = 13; int ledState = 0; void setup() { pinMode(LedPin, OUTPUT); Serial.begin(9600); } void loop() { char receiveVal; if(Serial.available() > 0) { receiveVal = Serial.read(); if(receiveVal == '1') ledState = 1; else ledState = 0; } digitalWrite(LedPin, ledState); delay(50); }
九、總結
本文通過一個簡單的例子,演示了C#與Arduino通過串口通信來控制LED燈狀態的機制,總共幾十行代碼就搞定,體現了Arduino開發簡單的宗旨。當然本例子只實現了C#程序向Arduino發數據的單向通信,真實的系統還可根據需要實現Arduino向C#發送數據的雙向通信。
Arduino與.NET兩者集成可以發揮兩個平台的長處:Arduino擅長控制硬件設備與各類傳感器;而.NET則擁有強大的數據處理能力、通信功能、以及美觀的程序界面。當然,通過USB線實現Arduino與PC之間的串口通信,由於需要與PC連線且USB線的長度往往有限,所以這些因素制約了其應用。但是,Arduino與PC之間還有其他的通信方式,比如以太網線、Wifi、藍牙等,極大的提高了Arduino的應用范圍。
寫文章真的比較耗時間,所以一直就不怎么喜歡寫文章。今天就寫到這,后面有時間的話會陸陸續續寫一些關於Arduino應用與開發等各個方面的文章。
十、參考資料
- Arduino官網
- Arduino Cookbook
- Arduino in Action
- Beginning Arduino
- Arduino Internals
- Arduino Workshop: A Hands-On Introduction with 65 Projects
- Exploring Arduino: Tools and Techniques for Engineering Wizardry
- Pro Arduino
- Arduino Robotics
- Building Wireless Sensor Networks: with ZigBee, XBee, Arduino, and Processing
- Arduino and Kinect Projects: Design, Build, Blow Their Minds
- Arduino Wearables