资料介绍
描述
项目更新为 V1.0 Release Candidate 1(2022 年 10 月 23 日)
该项目向您展示如何通过使用 Maple 向作为服务器运行的 Meadow 发送 http 请求来使用 MAUI 应用程序控制 MicroServo。
Maple通过 Web API 公开控制,使与 Meadow 建立连接的设备变得容易。Maple是一个开源、超轻量级、支持 JSON 的 RESTful Web 服务器。它还具有广告功能,这意味着您可以通过使用其名称和 IP 地址收听 UDP 广播消息来发现网络中的 Maple 服务器。
Meadow.Foundation是一个平台,用于在 Meadow 上使用 .NET 快速轻松地构建连接的事物。它由Wilderness Labs创建,完全开源并由 Wilderness Labs 社区维护。
如果您是 Meadow 的新手,我建议您通过控制板载 RGB LED 项目转到 Meadow 入门,以正确设置您的开发环境。
第 1 步 - 组装电路
如下所示连接您的项目:
第 2 步 - 创建 Meadow 应用程序项目
在 Visual Studio 2019 for Windows或macOS中创建一个新的Meadow Application项目并将其命名为MeadowMapleServo 。
第 3 步 - 添加所需的 NuGet 包
对于这个项目,搜索并安装以下 NuGet 包:
第 4 步 - 为 MeadowMapleServo 编写代码
让我们遍历每个类来构建这个项目:
为每个涉及的外围设备创建一个 Controller 类是一个很好的做法,可以使项目更具可扩展性、可维护性和清洁性。这些 Controller 类抽象了所有外围设备的逻辑,因此主要程序逻辑将保持清晰和易于理解。
伺服控制器类
public class ServoController
{
private static readonly Lazy instance =
new Lazy(() => new ServoController());
public static ServoController Instance => instance.Value;
Servo servo;
Task animationTask = null;
CancellationTokenSource cancellationTokenSource = null;
protected int _rotationAngle;
private ServoController()
{
Initialize();
}
private void Initialize()
{
servo = new Servo(
device: MeadowApp.Device,
pwmPort: MeadowApp.Device.Pins.D10,
config: NamedServoConfigs.SG90);
servo.RotateTo(NamedServoConfigs.SG90.MinimumAngle);
}
public void RotateTo(Angle angle)
{
servo.RotateTo(angle);
}
public void StopSweep()
{
cancellationTokenSource?.Cancel();
}
public void StartSweep()
{
animationTask = new Task(async () =>
{
cancellationTokenSource = new CancellationTokenSource();
await StartSweep(cancellationTokenSource.Token);
});
animationTask.Start();
}
protected async Task StartSweep(CancellationToken cancellationToken)
{
while (true)
{
if (cancellationToken.IsCancellationRequested) { break; }
while (_rotationAngle < 180)
{
if (cancellationToken.IsCancellationRequested) { break; }
_rotationAngle++;
servo.RotateTo(new Angle(_rotationAngle, Angle.UnitType.Degrees));
await Task.Delay(50);
}
while (_rotationAngle > 0)
{
if (cancellationToken.IsCancellationRequested) { break; }
_rotationAngle--;
servo.RotateTo(new Angle(_rotationAngle, Angle.UnitType.Degrees));
await Task.Delay(50);
}
}
}
}
如您所见,此类包含以下方法:
-
Initialize()
- 用于设置 MicroServo 并通过将其旋转 0 度将其设置到初始位置。 -
RotateTo(Angle angle)
- 使舵机按指定角度旋转。 -
StartSweep()
- 使伺服来回旋转到其最大角度范围。 -
StopSweep()
- 停止扫描动作。
ServoControllerRequestHandler 类
public class ServoControllerRequestHandler : RequestHandlerBase
{
public ServoControllerRequestHandler() { }
[HttpPost("/rotateto")]
public IActionResult RotateTo()
{
int angle = int.Parse(Body);
ServoController.Instance.RotateTo(new Angle(angle, Angle.UnitType.Degrees));
return new OkResult();
}
[HttpPost("/startsweep")]
public IActionResult StartSweep()
{
ServoController.Instance.StartSweep();
return new OkResult();
}
[HttpPost("/stopsweep")]
public IActionResult StopSweep()
{
ServoController.Instance.StopSweep();
return new OkResult();
}
}
此类用于公开所有服务器入口点,以便客户端可以发送 Http POST 请求来控制伺服。请注意,Servo Controller 类中的每个方法都有一个。
秘密课
public class Secrets { ///
/// Name of the WiFi network to use. /// summary> public const string WIFI_NAME = "[SSID]"; ///
/// Password for the WiFi network names in WIFI_NAME. /// summary> public const string WIFI_PASSWORD = "[PASSWORD]"; }
我们需要此类来输入我们的 WiFi 凭据,以便 Meadow 可以加入我们的网络。
MeadowApp 类
// public class MeadowApp : App <- If you have a Meadow F7v1.*
public class MeadowApp : App
{
MapleServer mapleServer;
public override async Task Initialize()
{
var onboardLed = new RgbPwmLed(device: Device,
redPwmPin: Device.Pins.OnboardLedRed,
greenPwmPin: Device.Pins.OnboardLedGreen,
bluePwmPin: Device.Pins.OnboardLedBlue);
onboardLed.SetColor(Color.Red);
ServoController.Instance.RotateTo(new Angle(NamedServoConfigs.SG90.MinimumAngle));
var wifi = Device.NetworkAdapters.Primary();
var connectionResult = await wifi.Connect(Secrets.WIFI_NAME, Secrets.WIFI_PASSWORD, TimeSpan.FromSeconds(45));
if (connectionResult.ConnectionStatus != ConnectionStatus.Success)
{
throw new Exception($"Cannot connect to network: {connectionResult.ConnectionStatus}");
}
mapleServer = new MapleServer(wifi.IpAddress, 5417, true, logger: Resolver.Log);
mapleServer.Start();
onboardLed.SetColor(Color.Green);
}
}
这个主类中最重要的部分是 Initialize 方法,我们首先初始化我们的ServoController ,我们激活我们的网络适配器加入我们的网络,我们创建一个新的MapleServer对象, Advertise 参数设置为true ,一旦板载 LED 亮起绿色,应用程序最终在 MeadowApp 的构造函数末尾启动了 maple 服务器。
这就是我们在 Meadow 方面需要做的一切。现在让我们快速浏览一下 Xamarin 配套应用。
第 5 步 - 了解 MAUI 应用程序
正如我们所提到的,在这个项目中,我们包含了一个在 iOS、Android 和 Windows 上运行的 MAUI 应用程序。
我们需要了解的基本内容是:
由于我们有一个在 Meadow 板上运行的 Maple Server NuGet 包,我们还有一个 Maple Client 包,您可以将其安装在您的 .NET 应用程序中。
使用 Maple 客户端
在 BaseViewModel 的构造函数中,我们可以看到如何创建一个 MapleClient 对象:
...
client = new MapleClient();
client.Servers.CollectionChanged += ServersCollectionChanged;
...
当应用程序在网络中找到 Maple 服务器时,将触发ServersCollectionChanged事件处理程序。
要找到通过网络发布信息的 Maple 服务器,您只需调用:
await client.StartScanningForAdvertisingServers();
一旦找到服务器,它将触发CollectionChanged事件,然后应用程序填充一个 ServerModel 列表,您可以使用选择器选择要向其发送服务器请求的服务器。
向 Maple 服务器发送命令
在此ServoControllerViewModel
,要注意的最重要的代码部分是SendServoCommand方法:
async Task SendServoCommand(string command)
{
if (IsBusy)
return;
IsBusy = true;
try
{
bool response = await client.PostAsync(SelectedServer != null ? SelectedServer.IpAddress : IpAddress, ServerPort, command, AngleDegrees.ToString());
if (response)
{
IsCyclingStart = IsCyclingStop = IsRotateTo = false;
switch (command)
{
case "RotateTo": IsRotateTo = true; break;
case "StartSweep": IsCyclingStart = true; break;
case "StopSweep": IsCyclingStop = true; break;
}
}
else
{
Console.WriteLine("Request failed.");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
IsBusy = false;
}
}
您可以看到该方法以字符串形式接收命令,我们使用MapleClient对象的PostAsync方法通过传递 Meadow 的 IP 地址、端口、命令和最后的角度值来发送命令,如果调用RotateTo API ,则旋转舵机.
第 6 步 - 运行项目
单击Visual Studio中的“运行”按钮。它应该类似于以下 GIF:
查看 Meadow.Foundation!
就您可以使用 Meadow.Foundation 做的大量令人兴奋的事情而言,这个项目只是冰山一角。
它带有一个庞大的外设驱动程序库,其中包含适用于最常见传感器和外设的驱动程序。
- 它带有一个庞大的外设驱动程序库,其中包含适用于最常见传感器和外设的驱动程序。
- 外设驱动程序封装了核心逻辑并公开了一个简单、干净、现代的 API。
- 该项目得到了不断发展的社区的支持,该社区不断致力于构建酷炫的互联事物,并且总是乐于帮助新来者和讨论新项目。
参考
- 基于JJBoover的远程控制ARDUNO自平衡机器人资料下载 2次下载
- 基于NI-VISA的晶圆测试探针台远程控制软件 23次下载
- 如何使用ARM7与GSM实现的简单的远程控制
- 电脑远程控制应用程序可远程控制,放送元件,演示等功能免费下载 8次下载
- 串口WiFi模块实现远程控制电饭煲的设计思路分享.pdf 75次下载
- 短信远程控制器 9次下载
- 远程控制_源代码 28次下载
- 电话远程控制系统的实现 91次下载
- 校园无线广播系统的远程控制
- 通过无线DTU对PLC的远程控制
- 智能家用远程控制仪的设计与实现
- 基于Internet的远程控制系统
- 利用Java实现远程控制
- 具有远程控制和远程报警功能的智能测控器
- 远程控制任我行V8.9绿色版 0次下载
- PLC远程控制信号怎么输送 600次阅读
- 常用的远程控制软件介绍 1763次阅读
- 常用的远程控制方法总结 1878次阅读
- 到底什么样的REST才是最佳REST? 614次阅读
- 采用RC4和RSA混合加密方式实现蓝牙远程控制功能 4292次阅读
- 基于AT89C51单片机和ISD1110芯片实现嵌入式远程控制器的设计 3266次阅读
- 基于GPRS网络威廉希尔官方网站 实现油田抽油机远程控制系统的设计 2050次阅读
- 基于Internet远程串口通信实现机械手远程控制系统的设计 5204次阅读
- 变频器远程控制如何接线 2.3w次阅读
- 阀门远程控制系统的工作原理 1.2w次阅读
- 阀门远程控制系统的工作原理及设计 1.1w次阅读
- 如何实现伺服电机远程控制? 7947次阅读
- 远程控制通讯--基于Arduino + ESP8266控制LED灯 3.9w次阅读
- 基于ARM的校园LED公告板远程控制系统设计 3046次阅读
- 三线连接用于远程控制RTD电路图 3146次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB | 532次下载 | 免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB | 339次下载 | 免费
- 3TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 4DFM软件使用教程
- 0.84 MB | 295次下载 | 免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB | 227次下载 | 免费
- 6迪文DGUS开发指南
- 31.67 MB | 194次下载 | 免费
- 7元宇宙底层硬件系列报告
- 13.42 MB | 182次下载 | 免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB | 178次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33566次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6656次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537798次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420027次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191187次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多