使用arduino控制舵机
GitHub最近发布了一篇博客文章 ,该文章显示了不同语言在这段时间内的发展情况。 排名表示GitHub的公共和私有存储库中使用的语言(不包括fork),这被称为Linguist的库检测到。 从中可以明显看出,JavaScript无疑在各个领域都赢得了竞争。 尽管来自C,C ++和Java的竞争非常激烈,但编程语言已成为游戏编程,机器人技术和IoT设备的非常受欢迎的选择。 当JavaScript开始为机器人提供动力时, NodeBots诞生了。
NodeBots是由Node.js控制的机器人。 如果您有兴趣进一步了解它们,建议您阅读Patrick Catanzariti撰写的标题为NodeBots简介的文章。
在本教程中,我们将制作一个可以从浏览器控制的简单NodeBot。 整个项目的源代码可在GitHub上找到 。
设置硬件
我们将在该项目中使用以下硬件:
- Arduino的
- 2马达
- L298电机控制器
- 将Arduino连接到计算机的电线
Arduino是一个基于易于使用的硬件和软件的开源原型平台。 它在全球成千上万的项目中使用。 我们使用Arduino的原因是它处理廉价且易于扩展的跨平台(可在Windows,Linux和OS X上运行)。
我们将从组装硬件开始。 连接的表示在下面给出。
如果您在理解引脚号时遇到任何困难,请参考下面的示意图。
我建议您根据需要选择电动机(例如,它必须承受的负载)。 如果您使用额定电压更高的电动机,则可能必须使用外部电源,因为Arduino提供的电压可能不够。
连接完成后,我们必须确保StandardFirmata已安装在板上。 Firmata是用于从主机计算机上的软件与微控制器通信的通用协议。 为此,请按照以下简单步骤操作:
- 下载Arduino IDE
- 通过USB插入Arduino或Arduino兼容微控制器
- 打开Arduino IDE,选择File> Examples> Firmata> StandardFirmata
- 点击“上传”按钮。
完成硬件连接并将StandardFirmata上传到Arduino之后,我们可以移至下一部分,在其中创建Web应用程序。
应用程序入门
首先从Web应用程序开始,让我们定义项目的软件依赖关系。 为此,我们将创建一个如下所示的package.json
文件:
{
"name": "nodebot-sample",
"dependencies": {
"express": "^4.11.2",
"johnny-five": "^0.8.53",
"socket.io": "^1.3.3"
}
创建文件后,在项目文件夹的根目录中运行npm install
,以便将安装所有依赖项。 如果您不熟悉npm ,请阅读Peter Dierx撰写的标题为npm入门指南— Node Package Manager的文章 。
服务器端代码
服务器代码依赖于Node.js和Express 。 我们将在项目目录的根目录下创建一个名为index.js
的文件。 该文件将包含我们所有的服务器端逻辑。
var express = require('express');
var app = express();
var io = require('socket.io')(app.listen(8081));
var five = require('johnny-five');
app.use(express.static(__dirname + '/app'));
app.get('/', function (res) {
res.sendfile('/index.html');
});
var board = new five.Board({
repl:false
});
express()
函数是Express模块导出的顶级函数。 express.static()
负责将静态资产提供给客户端。 app.get
使用回调函数将HTTP请求路由到指定的路径。 res
对象代表快递应用在收到请求时发送的HTTP响应。 sendFile
方法将文件从特定路径发送到浏览器。
我们正在利用Socket.IO来利用WebSockets和johnny-five的功能来帮助Arduino与服务器进行通信,从而维护客户端与服务器之间的实时连接。 johnny-five是一个基于Firmata协议的IoT和机器人编程框架。
首先,我们创建一个Board
的新实例。 一旦完成,所有逻辑将在开发板准备就绪后实现(这意味着在触发ready
事件时)。 在回调函数中,我们通过提供带有两个数字的数组来创建Motor
的两个实例。 具体来说, [3,12]
和[11,13]
代表与相应电机相连的Arduino的引脚。
board.on('ready', function () {
var speed, commands, motors;
motors = {
a: new five.Motor([3, 12]),
b: new five.Motor([11, 13])
};
commands = null;
io.on('connection', function (socket) {
socket.on('stop', function () {
motors.a.stop();
motors.b.stop();
});
socket.on('start', function () {
speed = 255;
motors.a.fwd(speed);
motors.b.fwd(speed);
});
socket.on('reverse', function () {
speed = 120;
motors.a.rev(speed);
motors.b.rev(speed);
});
socket.on('left', function () {
var aSpeed = 220;
var bSpeed = 50;
motors.a.fwd(aSpeed);
motors.b.rev(bSpeed);
});
socket.on('right', function () {
var aSpeed = 50;
var bSpeed = 220;
motors.a.rev(aSpeed);
motors.b.fwd(bSpeed);
});
});
});
电动机的速度由0到255之间的数字指定.stop()
方法使电动机.stop()
停止。 还有一种替代方法.brake()
强制电动机停止(而不是.brake()
停车),但仅适用于带有专用制动销的电路板。 .fwd()
和.rev()
方法只是.forward()
和.reverse()
别名。 它们都接受一个数字作为参数,范围从0到255,以控制速度。 我们使用前进和后退速度的不同组合来获得电动机的不同运动。
<source type="image/webp"><source><img src="https://s2.51cto.com/images/blog/202412/03235511_674f29dfc6e7934302.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=" alt="">
免费学习PHP!
全面介绍PHP和MySQL,从而实现服务器端编程的飞跃。 原价$ 11.95 您的完全免费
免费获得这本书
为了完成我们的项目,我们必须实时检测用户何时在客户端选择了特定选项。 这是Socket.IO发挥作用的地方。 与客户端建立新连接后,将触发connection
事件。 每当客户端发出事件时, .on()
方法就允许我们在服务器端侦听该事件并执行一些操作。
客户端代码
客户端实施包括创建界面,用户可以在其中选择电动机的不同运动。 我们首先在目录根目录下的app
文件夹内创建一个index.html
文件。 在此页面中,我们包含Socket.IO的客户端版本。
<body>
<div class="container">
<i class="fa fa-angle-up" id="forward"></i>
<i class="fa fa-angle-left" id="left"></i>
<i class="fa fa-angle-down" id="reverse"></i>
<i class="fa fa-angle-right" id="right"></i>
<i class="fa stop" id="stop">STOP</i>
</div>
<script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
<script src="app.js"></script>
</body>
Socket.IO公开了一个全局方法,该方法被添加到window
对象上,该方法称为io()
。 socket.emit('right')
会将事件名称为right
的消息发送回服务器。 一旦.emit()
被调用客户端上,安装有回调socket.on('right')
的服务器上被执行。
var socket = io();
function moveForward(){
socket.emit('start');
}
function turnRight(){
socket.emit('right');
}
function turnLeft(){
socket.emit('left');
}
function moveReverse(){
socket.emit('reverse');
}
function stop(){
socket.emit('stop');
}
document.getElementById('forward').onclick = moveForward;
document.getElementById('right').onclick = turnRight;
document.getElementById('left').onclick = turnLeft;
document.getElementById('reverse').onclick = moveReverse;
document.getElementById('stop').onclick = stop;
在最后一个代码片段中,我们已经完成了代码。 现在,您可以从浏览器控制电动机了。 您甚至可以将keypress
事件绑定到箭头键,并使用它们控制电机。
要启动服务器,请打开终端并在项目目录的根目录中运行node index.js
。 现在,您可以在浏览器上访问位于127.0.0.1:8081
的网页,并从那里开始控制电动机。 如果Board not found
问题,请确保Arduino与计算机之间的连接良好,并且您已将StandardFirmata从Arduino IDE正确上传到了Board。
这个项目是一个非常小的示例,说明您可以通过结合使用Node.js和Arduino来实现。 您可以使用WebSockets的功能将从传感器( MPU6050 )接收的数据实时传输到浏览器。 您可以基于此显示实时图形,并根据收到的读数控制电动机。 在这里可以找到基于这些原理的类似实现,这是当前项目的扩展。 如果您对该项目感兴趣,则一定要检查一下。
结论
在本教程中,我们学习了创建基本的NodeBot。 同时,我们还探索了Node.js提供的各种可能性,以及如何利用其功能在Web应用程序和机器人之间建立链接。
希望大家都喜欢这篇文章,并找到更多喜欢JavaScript的理由。 再次强调,您可以在GitHub上找到整个项目的源代码 。
翻译自: https://www.sitepoint.com/controlling-a-motorbot-using-arduino-and-node-js/
使用arduino控制舵机