步驟1 - 組裝電路
此項目的電路如下所示:
將伺服與Netduino連接以進行測試
結果
使用外部電源供電時,必須將外部GND連接到Netduino上的GND軌道(如下圖和面包板圖所示)或PWM控制信號不起作用:
將伺服與Netduino和外部電源連接
步驟2 - 將Netduino連接到網絡
在Netduino以引導加載程序模式連接時,下載并打開Windows或MacOS的固件更新程序和配置工具。在使用網絡配置部分之前,請確保在型號選擇器控件中自動選擇您的設備,以確認您的設備已正確連接。
固件更新程序和配置工具
如果您使用的是 Netduino 3 WiFi ,請選擇正確的加密,身份驗證,SSID和密碼短語設置,最后點擊更新將這些設置保存到Netduino。將網絡設置保存到設備后,請記住斷開連接并將Netduino重新連接到計算機以退出引導加載程序模式,并在項目完成后立即運行項目。
步驟3 - 創建Netduino項目
在Visual Studio 2015 for Windows或最新的Visual Studio for Mac中創建Netduino項目;將項目命名為 ServoHost 。
步驟4 - 添加Netduino.Foundation Maple NuGet包
Windows
右鍵單擊 ServoHost 項目,然后單擊管理NuGet包。在“瀏覽”選項卡中,搜索 Netduino.Foundation ;它應該是第一個搜索結果。單擊“安裝”按鈕。
將Netduino.Foundation NuGet包添加到ServoHost
現在搜索Netduino.Foundation.Servo和Netduino.Foundation.Network和Maple將它們添加到您的項目中。
MacOS
在解決方案資源管理器中按住Alt鍵并單擊您的ServoHost項目,然后單擊添加=》添加Nuget包到打開NuGet包窗口。搜索Netduino.Foundation包并單擊Add Package將其添加到項目中。
將Netduino.Foundation NuGet包添加到ServoHost
現在搜索 Netduino.Foundation.Servo 和 Netduino.Foundation.Network 和 Maple 將它們添加到您的項目中。
步驟5 - 編寫ServoHost項目的代碼
添加RequestHandlerclass
Maple web API端點是通過創建從 RequestHandlerBase 繼承的自定義類來定義的。 Maple 使用反射根據這些自定義類中的方法名稱創建URL。它支持 get 和 post 動詞,方法名稱必須以其中一個字符串為前綴,以便自動成為端點。
右鍵單擊您的項目,然后單擊添加新=》類,并將其命名為 RequestHandler 。在這里您將公開五個URL端點:/StartSweep ,/StopSweep 和/RotateTo 。復制以下所有這些方法的實現:
public class RequestHandler : RequestHandlerBase
{
public event EventHandler RotateTo = delegate { };
public event EventHandler StopSweep = delegate { };
public event EventHandler StartSweep = delegate { };
public RequestHandler() { }
public void postRotateTo()
{
try
{
int targetAngle = 0;
var param = “targetAngle”;
try
{
var temp = this.Body?[param] ?? this.Form?[param] ?? this.QueryString?[param];
targetAngle = int.Parse(temp.ToString());
}
catch (Exception ex)
{
Debug.Print(ex.Message);
}
RotateTo(this, new ServoEventArgs(targetAngle));
StatusResponse();
}
catch (Exception ex)
{
Debug.Print(ex.Message);
}
}
public void postStopSweep()
{
StopSweep(this, EventArgs.Empty);
StatusResponse();
}
public void postStartSweep()
{
StartSweep(this, EventArgs.Empty);
StatusResponse();
}
private void StatusResponse()
{
Context.Response.ContentType = “application/json”;
Context.Response.StatusCode = 200;
Send();
}
}
調用這些端點時,將調用相應的方法。在每個方法上,發生了兩件事:觸發事件并發送響應以確認客戶端已收到請求。
添加ServoController類
最好為每個涉及的外圍設備創建一個Controller類,以使項目更具可擴展性,可維護性和清潔性。這些Controller類抽象了所有外設的邏輯,因此主程序邏輯將更清晰,更易于理解。使用以下代碼添加ServoController類:
public class ServoController
{
protected int _rotationAngle;
protected bool _isRotating;
protected Servo _servo;
public ServoController(Servo servo)
{
_servo = servo;
StartSweep();
}
public void RotateTo(int degrees)
{
StopSweep();
_servo.RotateTo(degrees);
}
public void StopSweep()
{
_isRotating = false;
}
public void StartSweep()
{
StopSweep();
_isRotating = true;
Thread _animationThread = new Thread(() =》
{
while (_isRotating)
{
while (_rotationAngle 《 180)
{
if (!_isRotating)
break;
_rotationAngle++;
_servo.RotateTo(_rotationAngle);
Thread.Sleep(15);
}
while (_rotationAngle 》 0)
{
if (!_isRotating)
break;
_rotationAngle--;
_servo.RotateTo(_rotationAngle);
Thread.Sleep(15);
}
}
});
_animationThread.Start();
}
public void NetworkConnected()
{
StopSweep();
_servo.RotateTo(0);
}
}
添加App類
對于這個項目,我們想實現一個共同的用于控制所有網絡和控制器的應用軟件模式使事物變得更加清晰和強大。將新的App類添加到項目中,并復制以下代碼:
-
-
結果
結果
結果
結果
using Netduino.Foundation.Network;
using Maple;
using Netduino.Foundation.Servos;
using N = SecretLabs.NETMF.Hardware.Netduino;
using Microsoft.SPOT;
namespace ServoHost
{
public class App
{
protected MapleServer _server;
protected ServoController _servoController;
public App()
{
InitializePeripherals();
InitializeWebServer();
}
protected void InitializePeripherals()
{
var _servo = new Servo(N.PWMChannels.PWM_PIN_D11, NamedServoConfigs.Ideal180Servo);
_servoController = new ServoController(_servo);
}
protected void InitializeWebServer()
{
var handler = new RequestHandler();
handler.RotateTo += (s, e) =》 { _servoController.RotateTo(((ServoEventArgs)e).Angle); }; ;
handler.StopSweep += (s, e) =》 { _servoController.StopSweep(); };
handler.StartSweep += (s, e) =》 { _servoController.StartSweep(); };
_server = new MapleServer();
_server.AddHandler(handler);
}
public void Run()
{
Initializer.InitializeNetwork();
Initializer.NetworkConnected += InitializerNetworkConnected;
}
private void InitializerNetworkConnected(object sender, EventArgs e)
{
Debug.Print(“InitializeNetwork()”);
_server.Start(“ServoHost”, Initializer.CurrentNetworkInterface.IPAddress);
_servoController.NetworkConnected();
}
}
}
這個類中發生的第一件事就是調用 InitializePeripherals 實例化連接到 Netduino 的所有控制器,在此項目中,它是 ServoController 對象并使其在整個范圍內來回旋轉。
設置外圍設備后,它現在調用 InitializeWebServer ,在這里您將使用 RequestHandler 。在實例化之后,為前面解釋的四種公開方法注冊事件處理程序: StartSweep , StopSweep 和 RotateTo :
RotateTo - 將伺服旋轉到特定角度。
StopSweep - 停止伺服。
StartSweep - 使伺服器來回旋轉全范圍。
在所有這些事件處理程序之后,創建一個新的 Maple 實例,并將 RequestHandler 對象分配給其Handler屬性。
在運行方法中,啟動時需要做的第一件事該項目是使用 Initializer.InitializeNetwork(); 。 Netduino主板需要在每次啟動時初始化網絡,因此在啟動 Maple 服務器之前,您需要確保Netduino已成功連接到網絡,并且已收到有效的IP地址。
當Netduino加入網絡時,您現在可以通過 server.Start() Maple 服務器》傳遞服務器的名稱和分配給它的IpAddress,并設置停止伺服從循環以指示程序已成功啟動,并準備好接收客戶端請求。
在Program類中實現Main方法
最后,創建一個新的 App 類對象并調用 Run 方法。您的代碼應如下所示:
運行ServoHost項目
這就是你需要做的一切 ServoHost 項目。當您運行項目時,您將看到伺服完成初始化外圍設備后旋轉全范圍,并且一旦連接到網絡,它現在等待接收IP地址。一旦它加入網絡,伺服將停止旋轉并轉到角度零。
伺服項目正在運行并指示Maple何時成功啟動
步驟6 - 設置Xamarin.Forms ServoRemote項目
此項目的下一部分是讓您的手機上運行Xamarin.Forms應用程序。該項目可以在Netduino_Samples/Connected_Servo倉庫中找到。在Netduino上運行的代碼位于ServoHost應用程序文件夾中。 Xamarin.Forms在ServoRemote文件夾中對其進行采樣。繼續將ServoRemote項目下載到您的計算機/mac,并在最新版本的Visual Studio上打開它,公共代碼項目應如下所示:
Xamarin.Forms ServoRemote app sample
結果
這個項目的用處是我們如何使用MapleClient NuGet包連接到maple,它有一個簡單的 HttpClient 實現,用于發送/接收服務器請求/來自 Maple 服務器, UdpClient 接收來自運行的一個或多個Maple服務器的UDP廣播消息,應用程序會將其列在Picker上,以便您可以選擇您希望連接到哪個Netduino并發送請求。
最后,您發送API請求到maple的類位于ServoClient類中。請注意,它從MapleClient擴展,它有三個請求控制你的Netduino上的伺服。
public class ServoClient : MapleClient
{
public async Task RotateToAsync(ServerItem server, int degrees)
{
return (await SendCommandAsync(“RotateTo?targetAngle=”+degrees, server.IpAddress));
}
public async Task StartSweepAsync(ServerItem server)
{
return (await SendCommandAsync(“StartSweep”, server.IpAddress));
}
public async Task StopSweepAsync(ServerItem server)
{
return (await SendCommandAsync(“StopSweep”, server.IpAddress));
}
}
SendCommandAsync 函數將返回一個布爾值指示請求是否正確處理(true)或請求中是否有錯誤或發生異常(false)。
每次發送請求時,應用程序都會顯示一個加載屏幕,一旦響應消息返回成功,加載屏幕就會消失并重新啟用按鈕,突出顯示的按鈕反映伺服器上當前正在發生的操作。
ServoRemote項目
步驟7 - 運行項目樣本
首先運行 ServoHost 項目,等待伺服停止循環指示服務器現在正在運行并廣播UD P消息的名稱和IP地址。
現在將 ServoRemote 項目運行到您的移動設備上,稍等片刻,直到應用程序顯示Picker控件,你在那里可以選擇您要連接的服務器。如果連接成功,設置對話框屏幕應該消失,伺服應該再次開始循環。
-
伺服
+關注
關注
16文章
665瀏覽量
41668 -
Netduino
+關注
關注
0文章
19瀏覽量
3487
發布評論請先 登錄
如何使用無線遠程控制模塊來實現rs-485無線控制?

智慧路燈如何實現遠程控制?

plc遠程控制模塊是什么
PLC遠程控制模塊應用
使用樹莓派實現遠程控制的技巧
遠程控制溫控器的應用
用網頁端遠程控制電腦各工具對比
風管遠程控制系統應用方案
普通空開怎樣遠程控制斷電
城市照明遠程控制系統
teamviewer內網遠程控制外網
智能路燈遠程控制系統
水泵遠程控制系統方案

評論