本文章是由機器翻譯。

.NET Micro Framework

內嵌應用程式中的 Microsoft .NET Framework

Colin Miller

下載代碼示例

世界已經來到了很長的路,從第一個上下文-­在 1980 年代早期敏感的 C 代碼編輯器。模具和最初開發桌面應用程式的語言已經被擴大到包括伺服器、 雲計算和其他環境。Microsoft.NET 框架和Visual Studio提供先進的工具,極大地提高程式設計效率。.NET 框架工具和語言提供豐富的庫和協作工具,程式師免受最常見的錯誤。

這些進展,然而,尚未向發展提供­戲院致力於嵌入式設備。嵌入式工具市場一直缺乏必要來吸引那種在 PC、 伺服器和雲計算的應用程式的工具的投資規模。形形色色的"智慧設備"的出現帶來了這種不平衡的變化。

隨著.NET 微架構,已成為一股新的產品,包括用於需要一套不同的嵌入式的技巧來開發代碼的小型設備。相反,這些標準制定個人和團隊與.NET 技能。如果你是.NET 開發人員,有沒有想過如何利用小的嵌入式的設備,在應用程式中,希望這篇文章會使你可以使用你的技能參與物聯網 (物聯網) 和智慧設備的爆炸。

你為什麼要在乎呢?一個最近的分析估計,94%的處理器預計在 2017 年船舶不會具有足夠的容量來支援傳統的.NET 應用程式環境。與.NET 微架構,您可以擴展您的覆蓋範圍。

在現場觀察專案最初是.NET 微架構。在過去的七年,它一直.NET 家庭的一部分。它太小,無法支援完整的作業系統的 32 位處理器上運行。這是實際上.NET 集成到可執行映射的執行引擎與類型系統直接在硬體上運行。

.NET 微框架的目標是説明.NET 開發人員創建在嵌入式應用程式小 32 位 MCU 基於設備運行的應用程式。生成會議在 2014 年,微軟所述覆蓋物聯網空間與 Windows 嵌入式標準在高端和小設備端.NET 微框架範圍內的作業系統平臺。

嵌入式的開發

智慧設備擁有本地的計算能力,可以與其他設備和潛在雲通信。這篇文章中,我創建了一個小型的移動機器人,我還可以控制從運行 Windows Phone 作業系統的智慧手機。目的是展示如何為 Windows Phone 應用程式使用的.NET 技能是機器人一邊同樣適用。工具和語言支援是新的在這種環境,和兩者之間來來回回工作的開發環境是無縫的。

滿足伯特 — — 伯特是一個具有四個驅動輪移動式機器人 (見圖 1)。他大約 35 美元的價格由秘密實驗室,包括可用的 Netduino 2 局。一個簡單的控制器可以控制上的機器人去正向和反向每一側的電動機。不過還有沒有速度控制。

伯特機器人
圖 1 伯特機器人

對於通信,伯特包括通過一個序列介面通信與 NetduinoBluetooth模組。為了確保你不會撞到任何東西的伯特或運行他下懸崖,有紅外感應器包括在車頭和車尾。也有的頭燈和轉彎信號只是為了好玩。

簡單的 Windows Phone 應用程式被從生成會議上介紹了一個演示。它將連接到正確的設備,並使用星載加速度計路過伯特周圍通過Bluetooth發送命令。你可以看到在介面圖 2,在下拉清單中選擇 圖 3。選擇枚舉選擇所連接的設備,您將向其發送命令。命令在螢幕上,反映在定向的信件中。

Windows Phone 應用程式介面
圖 2 Windows Phone 應用程式介面

設備選擇下拉清單
圖 3 設備選擇下拉清單

你可以口.NET 微框架到另一個硬體平臺採用.NET 微框架移植工具組 (bit.ly/1wp57qm)。使用該工具組將低級介面寫入賴以您正在運行的特定硬體。這是更接近于經典的嵌入式程式設計活動。好消息是,供應商已經為你做這。在此應用程式中使用的 Netduino 板為例,有所有你需要開始編碼 Netduino SDK 中向理事會 (bit.ly/1CQygzz)。

Netduino 是一種皮質 M3 處理器從意法半導體與 192 KB 至 384 KB 的快閃記憶體和 60 KB 到 100 KB 的 RAM 和引腳相容與 Arduino 盾牌。你可以找到其他支援.NET 微架構在 GHI 電子、 登山、 Sparkfun、 Adafruit、 亞馬遜和其他存放裝置。

審計委員會也是開源硬體,所以一旦你寫下你的應用程式和想要它商品化,你有幾個選項。你只可以用於 Netduino 板低容量的應用程式,但如果您的目標更高的容量,或有特定要求,如想要集成在同一 PCB 上的附加電子,可以去開放源碼提供主機板製造商的設計檔並從那裡去。

因為我開始用 Netduino 板,安裝 Netduino SDK 了。這包括.NET 微框架 SDKVisual Studio範本與所有必要的庫支援。對於其他的開發板,你可能需要單獨安裝.NET 框架 SDK,微。SDK 附帶一個模擬程式,所以你不需要得到任何硬體和.NET 的微架構,一起玩,雖然使用的硬體是更有效率的如果你已經知道什麼您想要使用的感應器。

創建嵌入的應用程式

安裝 Netduino SDK (其中包含.NET 框架 SDK,微) 後,開始.NET 微架構就像任何其他專案內Visual Studio開始是嵌入的應用程式。您選擇新的專案和您想要啟動的應用程式的類型。如中所示圖 4,已經選擇了一個 Netduino 2 應用程式相匹配的董事會上伯特。

開始微的.NET 框架嵌入式應用程式
圖 4 開始微的.NET 框架嵌入式應用程式

一旦你開始這個專案,你可以跳進創造機器人和電話之間的通信聯繫的權利。

像許多嵌入式應用程式,伯特靠電池運行。這意味著您的代碼編寫,以節省電源使用。好消息是.NET 框架和.NET 微架構非常適合的。如果沒有要運行的執行緒,則.NET 微框架可以自動投入低耗電狀態的處理器。它也變得普遍要添加第二個有效處理器監視中斷並將主處理器放入一個甚至更低的電源狀態。你很快就會看到是否.NET 框架非常適合用於解決這種類型的程式設計。

此應用程式中的代碼運行對外來事件作出回應,然後只需作出回應。所以你會看到所有執行都駐留在一個事件處理常式或已暫停大多數情況下,一個執行緒就像這樣:

public class Program
  {
    public static void Main()
    {
      RunRobot myRunRobot = new RunRobot();
      myRunRobot.Start();
      while (true)
      {
        Thread.Sleep(Timeout.Infinite);
      }
    }
  }

RunRobot 的建構函式初始化更詳細地看的 IO 實例和 RunRobot.Start 方法初始化中斷觸發實際執行:

public void Start()
  {
  // Enable interrupts on BT input on the HC-06 radio
  hc06.DataReceived += hc06_DataReceived;
  // Use onboard button to turn on/off accepting commands
  button = new InterruptPort(Pins.ONBOARD_SW1, false, Port.ResistorMode.Disabled,
    Port.InterruptMode.InterruptEdgeHigh);
  // Start monitoring for button presses
  button.OnInterrupt += new NativeEventHandler(button_OnInterrupt);
  }

獲得Bluetooth工作

有Bluetooth通訊伯特和 Windows Phone 應用程式之間工作的三個步驟:

  1. 接通的機器人上的Bluetooth模組
  2. 從手機應用程式發送命令
  3. 接收這些命令對伯特

因為 Netduino 是 Arduino 相容的很多的連接,您可能能夠找到你可以插一個盾牌,使所有必要的連接,為您。Arduino 是一個受歡迎的業餘愛好者平臺,具有豐富的生態系統的週邊設備。你可以手工創建廣泛的解決方案從現有模組。

如果你不想要花時間與佈線,從 GHI 電子看: 產品。這些議會和元件,您可以使用嚮導來決定在哪裡插入標準連接的元件 (請參閱圖 5),所以你不需要任何知識的線路連接。模組介面處於同樣高的水準。Arduino,像: 具有一套豐富的現有的模組,用來創建您的解決方案。一旦你有了模組連接,你仍然編碼在.NET 微架構。這是特別有用的快速成型你的想法。

嚮導顯示連接
圖 5: 嚮導顯示連接

在伯特,我不使用於製造精密,但收集我自己的模組。Bluetooth模組 (HC-06) 使用一個序列介面具有四個連接 — — VIN,GND,RX 和 TX。連接 (電壓在) VIN 到任何 5V 或 3.3 v 輸出從 Netduino,然後將 GND 連接到 GND 連接之一。Netduino 在產出表看圖 6,你會看到連接到 Netduino TX (傳輸) 和 BT 模組 TX 到 COM1 序列埠 Netduino RX 的藍牙模組 RX (接收)。如果需要,有大量的實例將這些模組連接到 Web 上常見的微控制器。

Netduino IO 針腳定義
圖 6 Netduino IO 針腳定義

這些連接作了,你可以電源開啟,Netduino (它的權力的藍牙模組) 和配對與電話設備。藍牙模組的預設名稱是 HC-06,所以你可以搭配的。使用 AT 命令的伯特更名。傳送的位元組與字元"AT + NAMEBert"要更改的 BT 模組的名稱的陣列。此外可以使用此介面來配置Bluetooth模組,包括諸如通信串列傳輸速率。

現在您可以使用電話,當您將任何其他 BT 連接到伯特設備,並開始發送命令。第一,我訪問星載加速度計,並設置合理的報告間隔,以免沼澤差伯特:

accelerometer = Accelerometer.GetDefault();
if (accelerometer != null)
{
  uint minReportInterval = accelerometer.MinimumReportInterval;
  desiredReportInterval = minReportInterval > 250 ? minReportInterval : 250; 
    // Slowing this way down to prevent flooding with commands
  accelerometer.ReportInterval = desiredReportInterval;
    // Add event for accelerometer readings
  accelerometer.ReadingChanged += new TypedEventHandler<Accelerometer,
    AccelerometerReadingChangedEventArgs>(ReadingChanged);
}

ReadingChanged 事件處理常式發送命令,如中所示圖 7

圖 7 的事件處理常式,用於將命令發送到伯特

AccelerometerReading reading = args.Reading;
if (reading.AccelerationX > .4)  // These are arbitrary levels
                                 // set to what seemed easy
{
                        // Send Right
  if( cmdSent != 'R')   // Don’t resend the same command over and over
  {
      // Update the phone display
    txtRight.Text = "On";
    txtLeft.Text = " L";
    txtForward.Text = " F";
    txtBack.Text = " B";
      // Send the command
    packet = Encoding.UTF8.GetBytes("R");
    cmdSent = 'R';
    SendData(packet);
  }

接受和執行命令

現在,您可以考慮接收機器人一邊命令。藍牙模組連接到 Netduino 的第一個序列埠。創建一個串口實例和訊息緩衝區,就像你在其他版本的.NET Framework 上:

SerialPort hc06;                 // The BT radio
byte[] cmdBuffer = new byte[32]; // The input buffer for receiving commands

然後用Bluetooth模組配置用於通信的序列埠 (9600 串列傳輸速率是缺省操作 ; 可以重置此使用 AT 命令,但這將是非常稀疏的通信,簡化程式,以便更快的速度都是不必要):

// Set up the Bluetooth radio communication
hc06 = new SerialPort(SerialPorts.COM1, 9600, 
  Parity.None, 8, StopBits.One);
hc06.ReadTimeout = 1000;
hc06.Open();

然後,我建立了一個觸發應用程式內處理大部分的 DataReceived 事件處理常式。換句話說,伯特睡覺直到他接收到一個指令。處理器熬夜長,足以使電動機在正確的狀態,然後回去繼續睡覺:

// Enable interrupts on BT input
hc06.DataReceived += hc06_DataReceived;

傳入命令處理事件處理常式中,如中所示圖 8

圖 8 的入站命令開始移動的伯特

do
{
  try
  {
    count = hc06.Read(cmdBuffer, 0, 1);  // Should read one byte at a time
  }
  catch (Exception) { }        // Just eat exceptions
  if (count > 0)
  {
    cmd = (char)cmdBuffer[0];
    executeCmd(cmd);   // Execute command immediately
  }
} while (count > 0);

該代碼沒有任何不同比你要寫什麼,在桌面上。

在運動中設置伯特

我使用的電機控制器只需要我在一些邏輯的狀態,以確定如何轉動車輪設置四個輸入。邏輯是:

/*        
A2  A1  Motor 1         B2  B1  Motor 2
0   0   Shaft locked    0   0   Shaft locked
0   1   Clockwise       0   1   Clockwise
1   0   Anti-clockwise  1   0   Anti-clockwise
1   1   Shaft locked    1   1   Shaft locked 
*/

若要寫入這些,創建腔並配合它所示的 Netduino 數位引腳之一圖 6。腔是.NET 框架中獨特的一類,因為通常運行完整的.NET 框架的設備不能解決個別數位 I/O 埠。有少量的新的類,在.NET 微框架來處理額外的 I/O 類型和其他像電源管理此應用程式空間特有的問題:

// Motor controller output
A1 = new OutputPort(Pins.GPIO_PIN_D2, false);  
  // A is the left tires when viewed from the front
A2 = new OutputPort(Pins.GPIO_PIN_D3, false);
B1 = new OutputPort(Pins.GPIO_PIN_D4, false);  
  // B is the right tires when viewed from the front
B2 = new OutputPort(Pins.GPIO_PIN_D5, false);
Setting them is as simple as writing true or false:
switch (cmd)
{
  case 'F':
  {
    Debug.Print("Forward");
    A1.Write(false);   // Left forward = false/true
    A2.Write(true);
    B1.Write(true);    // Right forward = true/false
    B2.Write(false);
    break;
  }

小心駕駛

我不想伯特跑進東西為了他自己和安全的在他周圍的人和事,所以我從夏普在正面和背面安裝了紅外感應器。這些感應器傳回值從 0.0 到 1.0 取決於對最近的物件反映了預計的紅外燈距離。

前臺的感應器被指對角下來遙感地面伯特約 18 英寸的位置。這讓我使用一個感應器來檢測物件,隨著落花走了,如果它接近一套樓梯,例如地面。這些感應器返回的值是類比的這意味著創建另一個類的實例在.NET Framework 中到.NET 微框架獨特 — — 類比輸入類:

AnalogInput foreRange;    // Forward range finder input
AnalogInput backRange;    // Rear range finder input
// Set up range finder for collision and edge avoidance
foreRange = new AnalogInput(Cpu.AnalogChannel.ANALOG_5, 100, 0, -1);
backRange = new AnalogInput(Cpu.AnalogChannel.ANALOG_4, 100, 0, -1);

此建構函式標識特定的類比埠,連接到的我是,我可以用來將輸出轉換為一個更方便的範圍,偏移量為-1 意味著最大精度與修改輸出,方便,輸出的精度的乘數。定期進行這些測量,讓盡可能多的處理器睡眠、 讀數均由一個計時器觸發。我把這個時候,當我不接受來自電話和處理命令:

// Start timer for rangeFinders
Timer rangeReader = new Timer(new TimerCallback(rangeTimerHandler), 
  null, 0, 100);

通用中斷

我要介紹的最後新類是 InterruptPort 類。這讓我當班長數位量輸入和變化,如從Low到高,變化的前沿上的觸發器的變化為例。我用這個獲取伯特對命令做出反應,從手機的 Netduino 板上的按鈕。這意味著他將忽略命令,直到此按鈕按下並忽略它們,再按下它後:

// Use onboard button to turn on/off accepting commands
button = new InterruptPort(Pins.ONBOARD_SW1, false,
  Port.ResistorMode.Disabled,
  Port.InterruptMode.InterruptEdgeHigh);

Pins.ONBOARD_SW1 是 Netduino 板上的開關的內部連接。你可以將開關連接到任何中列出的數位埠圖 6。第二個參數是是否我需要故障篩選器應用於此開關輸入量,避免多個觸發器為按一次按鈕。

下一個參數是否是,一把拉住或下拉電阻器在交換器上。這定義的預設埠位置時 (高或Low),並不按下的按鈕。下一個參數設置為觸發回高過渡上的中斷,所以你的手指的出路是如果伯特立即起飛。創建的 InterruptPort 實例,我就可以將指定的中斷處理常式:

// Start monitoring for button presses
button.OnInterrupt += new NativeEventHandler(button_OnInterrupt);

中斷處理常式啟動伯特監測從電話裡傳來的任何命令,正如你可以看到在圖 9

圖 9 中斷處理常式啟動命令監測

private void button_OnInterrupt(uint data1, uint data2, DateTime time)
{
  cmdListenState = !cmdListenState;
  if (cmdListenState)
  {
    // Set up timer for rangeFinders
    rangeReader = new Timer(new TimerCallback(rangeTimerHandler), 
      null, 0, 100);
  }
  else
  {
    rangeReader.Dispose(); // Drop the timer because Bert isn't processing
                          // commands so he shouldn't be moving
  }
  led.Write(cmdListenState);  // The onboard LED indicates whether
                               // Bert is accepting commands
}

嵌入式應用程式和.NET 微框架

嵌入式應用程式通常在精心製作以滿足最低要求的硬體上執行一套有針對性的功能。制定有針對性和調諧的嵌入式應用程式要求較高的初始投資。在一個較長的產品生命週期收回投資。

傳統的嵌入式開發的最大挑戰之一是完成專案所需的時間。很大一部分嵌入­­ded 專案被遺棄是因為成本變得太大或要求更改之前的專案可以進入市場。

很多事情都影響嵌入式應用的動態­陽離子。當微軟首次發佈.NET 微架構七年以前,大多數嵌入式應用程式就以 8 位處理器,以降低成本時,達到所需的性能要求和滿足功率要求 (例如對於長時間在一個電池運行能力)。

同時,嵌入式空間的增長大部分目標像 ARM7 處理器為 32 位。這些處理器被繼續降價,並提供足夠的性能,對於許多應用程式和功耗有所改善。較新的皮質處理器繼續吸引很多新的嵌入式應用程式向 32 位家人。

最近更多的設備,是更廣泛的應用,包括嵌入式的設備、 閘道、 雲連接、 資料庫、 業務智慧應用程式的組成部分。這些新的應用程式改變經濟的嵌入式應用程式。

它變得更重要的是堅持以共同的通訊協定。這些新設備的更多是在消費領域中,所以期待著長時間的開發週期意味著增加的產品風險。上市時間是更重要的是為這些應用程式和期間考慮到即將激增的"智慧設備"。

這些新類型的應用程式的其他影響是他們獨自的廣度。他們可能彙集桌面開發者和他的專業知識在高規模通訊、 資料庫、 業務分析和雲她具備硬體和低級程式設計技術與嵌入式開發者協定。工具和語言説明相同的技能集,以跨整個應用更有效率的專案工作。

這是為其制定了.NET 微框架的背景。這個平臺的起點被創造了作為內部工具開發 Microsoft 現場監視應用程式 (僅領先市場的九年)。當平臺變得有用對於其他內部的專案時,該產品被四捨五入作為一個通用的平臺在 2007 年。

嵌入的應用程式的成本、 性能和功率效率的驅動程式還沒走。如果有什麼,當你談論要部署數以千計的感應器在建築中的應用,成本變得更為重要。性能和功耗要求的應用程式,以及與各不相同。繼續提高,可以達到與.NET 微架構的應用範圍是焦點的微軟發展努力正在進行地區。

部署和調試

將代碼部署到您的設備是一樣容易連接它並按 F5,與 Windows Phone 應用程式一樣。但是,安裝程式稍有不同。在專案中 |屬性對話方塊中,還有你可以在那裡指定運輸一個.NET 微架構選項卡 (USB、 串列或 TCP/IP) 和標識的設備。預設值是 USB。它將會自動識別一種.net 微裝置,所以除非您連接到多個設備,你可能永遠不需要在此對話方塊中。在這一點上,生成解決方案和程式集部署到設備。您可以按照這一切發生在Visual Studio中的輸出視窗。立即開始執行,您可以開始調試設備上運行的代碼。

也可以將應用程式部署到運行在桌面 PC 上的模擬程式。不同的是 Windows Phone 已經相對有限的數目的變更,所以您可以從Visual Studio中提供的一組選擇最接近的模擬器。對於.NET 微架構時,一個通用的微軟模擬器。你最有可能不得不創建您自己的模擬器來匹配您的硬體。這絕對是值得尋找到的如果你想要開始編碼之前您的硬體是可用的。

在過去,用於調試機器人與 Windows Phone 應用程式之間的通信方案可能做了 JTAG 調試器。這是單獨從開發環境和外國給.NET 開發人員,所以你可能有一個開發人員,監測上的電話和一個監控 (在單獨的工具) 在嵌入式設備上發生了什麼事發生了什麼。您可以監視兩個同時在Visual Studio。你可以逐句通過電話代碼,並且打破對命令的傳輸,然後走進上伯特的該命令會發生什麼。

接近尾聲了

如何在.NET 微架構上創建任何重大的嵌入式應用程式的完整圖片將一整本書。這篇文章的目的是展示學習曲線並不是很陡,以您的.NET 技能用於嵌入式應用程式和.NET 微架構。

這項工程需要幾門課不是完整的.NET 庫的一部分。也有一些事情你熟悉上你不能擠進.NET 微架構的.NET Framework 全但Visual Studio環境完全支援與IntelliSense、 中斷點、 觀察點、 呼叫堆疊和其他任何你習慣。有嵌入式應用程式,在那裡,.NET 微架構不是正確的解決方案。對於許多人來說,雖然,它工作得很好。繼續努力,擴大到越來越多越來越重要一部分的電腦科學的大段平臺的適用性。

所以,現在你準備嘗試作為嵌入式程式師的小專案。

請參閱 Bert 在行動

現在你知道如何把你的開發技能派上用場的東西的樂趣。你開發了一個應用程式,您可以控制使用運行 Windows Phone 作業系統的智慧手機的小型機器人。你用來開發 Windows Phone 應用程式的.NET 技能都同樣適用的機器人。兩人之間來來回回工作是無縫的。你的工作完成 — — 是時候看到伯特的行動:youtu.be/ypuqTju2w4c


Colin Miller 是物聯網的團隊在微軟主要程式經理。聯繫到他在 colin.miller@microsoft.com。他已經在微軟 20 多年,並曾在物聯網、 嵌入式、 開發工具、 研究、 MSN、 互聯網資源管理器中,詞和其他專案。

感謝以下 Microsoft 技術專家,檢討這篇文章: Lorenzo Tessiore