0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Netduino和Xamarin远程控制伺服

454398 来源:工程师吴畏 2019-08-02 11:50 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

步骤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控件,你在那里可以选择您要连接的服务器。如果连接成功,设置对话框屏幕应该消失,伺服应该再次开始循环。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 伺服
    +关注

    关注

    17

    文章

    684

    浏览量

    42815
  • Netduino
    +关注

    关注

    0

    文章

    19

    浏览量

    3540
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    什么是WiFi远程控制模块?技术特点和应用场景有哪些?

    随着科技的发展,智能家居逐渐走进了我们的生活,越来越多的人开始体验到通过互联网控制家电的便利。而WiFi远程控制模块作为智能家居的核心组成部分,其独特的功能和优势使得家庭和工作场所的设备管理变得更加
    的头像 发表于 11-29 14:10 98次阅读
    什么是WiFi<b class='flag-5'>远程控制</b>模块?技术特点和应用场景有哪些?

    工业远程控制总掉链子?安科瑞 ARTU:32 路DI + 以太网通讯,效率直接翻番!

    一、直击痛点:为什么工业远程控制总卡壳? “车间设备布线像‘蜘蛛网’,PLC 对接老掉线,偏远光伏电站得天天派人巡检……” 不少工业人都在为远程控制的兼容性、稳定性发愁。而安科瑞 ARTU 模块化
    的头像 发表于 10-13 13:41 200次阅读
    工业<b class='flag-5'>远程控制</b>总掉链子?安科瑞 ARTU:32 路DI + 以太网通讯,效率直接翻番!

    远程控制破局,以智能运维增效:设备远程控制系统

    在工业 4.0 浪潮与数字化转型的推动下,设备远程控制系统已从传统工业领域的 “辅助工具”,逐渐升级为各行业实现高效管理、降本增效的 “核心中枢”。该系统借助网络通信技术、物联网(IoT)、大数
    的头像 发表于 09-16 17:02 686次阅读

    助力工业物联网升级,智能远程控制系统功不可没

    在工业4.0的浪潮中,工业物联网(IIoT)正从概念走向规模化落地,而智能远程控制系统作为其核心组件,如同“神经传导中枢”,将分散的设备、数据与决策端紧密连接。跨越时空的精准操作,都依赖于智能远程控制
    的头像 发表于 08-06 16:23 771次阅读

    是德示波器MSOX3054T远程控制自动化测试

    在现代电子测试领域,自动化测试技术已成为提升效率、降低人力成本的关键。是德示波器MSOX3054T作为一款高性能仪器,其远程控制自动化测试功能为工程师们打开了全新的效率之门。本文将深入探讨如何通过远程控制
    的头像 发表于 07-08 17:09 497次阅读
    是德示波器MSOX3054T<b class='flag-5'>远程控制</b>自动化测试

    是德频谱分析仪的远程控制与自动化测试方案详解

    远程控制与自动化测试成为了现代测试系统中不可或缺的一部分。以下是关于是德频谱分析仪远程控制与自动化测试方案的详细解析。   一、远程控制基础 远程控制是通过网络或特定的接口,实现对频
    的头像 发表于 06-19 15:16 568次阅读
    是德频谱分析仪的<b class='flag-5'>远程控制</b>与自动化测试方案详解

    如何使用无线远程控制模块来实现rs-485无线控制

    无线远程控制模块,是一种在工业自动化、远程监控等领域广泛应用的技术。以下将主要介绍无线远程控制模块及其在实现485无线控制中的应用。 一、无线远程控
    的头像 发表于 04-24 17:08 834次阅读
    如何使用无线<b class='flag-5'>远程控制</b>模块来实现rs-485无线<b class='flag-5'>控制</b>?

    50A磁保持远程控制模块是什么设备

    50A磁保持远程控制模块是一种集成了高电流控制远程通信功能的智能电气设备,主要用于工业自动化、智能家居、能源管理等领域。其核心特点在于通过磁保持继电器技术实现稳定的大电流通断控制,同
    的头像 发表于 04-22 16:12 505次阅读

    普源示波器远程控制SCPI指令的应用

    普源示波器作为现代电子测量领域的重要工具,广泛应用于科研、教育和工业测试中。随着测试需求的日益复杂和自动化水平的提高,远程控制成为提升测试效率和灵活性的关键手段。SCPI(Standard
    的头像 发表于 04-22 15:55 897次阅读
    普源示波器<b class='flag-5'>远程控制</b>SCPI指令的应用

    智慧路灯如何实现远程控制

    引言 在智慧城市建设的进程中,叁仟智慧路灯作为重要的基础设施,其远程控制功能发挥着关键作用。远程控制使得叁仟智慧路灯能够摆脱地域限制,实现高效、精准的管理,极大地提升了城市照明系统的运行效率与智能化
    的头像 发表于 03-18 12:27 686次阅读
    智慧路灯如何实现<b class='flag-5'>远程控制</b>?

    plc远程控制模块是什么

    PLC远程控制模块是什么?PLC(ProgrammableLogicController,可编程逻辑控制器)远程控制模块是用于实现远程监控和控制
    的头像 发表于 02-12 17:20 1447次阅读

    PLC远程控制模块应用

    PLC(Programmable Logic Controller,可编程逻辑控制器)远程控制模块,作为工业自动化领域的一项重要技术,正日益展现出其强大的应用潜力和价值。通过远程监控和控制
    的头像 发表于 02-12 16:48 967次阅读

    西门子TIA Portal HMI的远程控制功能

    描述 本文将介绍西门子 TIA Portal HMI 的远程控制功能,即可以通过浏览器、电脑客户端或手机客户端监控 HMI 面板。 第1步: 添加 HMI 设备。 选择 TP700 Comfort
    的头像 发表于 02-12 11:45 3999次阅读
    西门子TIA Portal HMI的<b class='flag-5'>远程控制</b>功能

    中央空调远程控制系统

    中央空调远程控制系统是现代建筑中不可或缺的一部分,将互联网、智能控制、物联网等技术相结合,对中央空调设备的远程监控、操作和管理。提升设备的运行效率,为用户提供了更加便捷、节能和智能的使用体验。 一
    的头像 发表于 12-24 16:36 1588次阅读

    实时监测,安全预警 远程控制 尾矿库安全监测

    远程控制
    稳控自动化
    发布于 :2024年12月17日 10:48:09