|
在最近的一篇文章中,我们讨论了一些可用于在项目中命令伺服电机的简单方法。在本篇文章中,我们将介绍如何使用树莓派和智能手机的倾斜传感器来控制项目中的伺服电机。
所需的硬件 ● 树莓派4 ● 伺服电机 ● 跳线 ● 外接电源
将伺服电机连接到树莓派4 该项目中,您只需要两个伺服电机和控制器。本文我们将伺服电机直接连接到树莓派4。之所以选择树莓派,是因为它内置Wi-Fi连接,并且本机支持将在下一节中介绍的软件。
以下是接线图:
如您所见,接线非常简单。您只需要将每个伺服电机的控制线连接到支持硬件PWM的GPIO引脚(示例为GPIO12和GPIO13)。
此外,GND线需要绑在一起。伺服电机应由外部电源供电,因为树莓派可能无法提供足够的电流。
软件方面 此制作的大部分工作都在软件方面进行。在树莓派上运行的软件可以完成三件事: ● 提供可在智能手机上访问的网站 ● 处理传入的HTTP请求 ● 与伺服电机通讯
网站读取设备的传感器值,并定期将更新的数据发送到Python脚本。
您还可以编写一个智能手机应用程序,以读取传感器值并将其直接传输到Raspberry Pi(例如,通过蓝牙)。但是,本文使用的方法足以完成此任务。这样,您无需在智能手机上安装任何软件,并且该解决方案也与平台无关。
设置Flask后端 幸运的是,在Pi上设置标准的后端服务器很容易。要安装软件,只需键入: 如有必要,可以使用以下命令安装pip: - sudo apt-get install python-pip
复制代码
建立网站 网站本身并不复杂。它只包含一个用于输出信息和错误消息(使用户知道发生了什么)的div,以及一个开始跟踪运动传感器的按钮: - <html>
- <body>
- <button id="connectbtn" onclick="requestPermission()">Connect</button>
- <div id="outputdiv"></div>
- </body>
- </html>
复制代码以下脚本完成了主要工作。此代码段显示了读取传感器值的部分: - function handleRotation(event)
- {
- updown = Math.round(event.gamma);
- leftright = Math.round(event.beta);
- }
- function requestPermission()
- {
- if (typeof(DeviceMotionEvent) !== 'undefined' && typeof(DeviceMotionEvent.requestPermission) === 'function')
- {
- output.innerHTML = "iOS 13+ device";
- DeviceMotionEvent.requestPermission().
- then(response => {
- if (response === 'granted') {
- output.innerHTML = "iOS 13+ device (Permission granted)";
- window.addEventListener('deviceorientation', handleRotation);
- }
- else {
- output.innerHTML = "iOS 13+ device (Permission denied)";
- }
- finishRequest();
- }).catch(console.error);
- }
- else
- {
- output.innerHTML = "Non-iOS 13 device";
- window.addEventListener('deviceorientation', handleRotation);
- finishRequest();
- }
- }
复制代码
请注意,苹果手机更改了iOS 13中处理传感器请求的方式。因此,我为非iOS 13设备提供了fallback功能(该设备还应包括不支持Permissions API的Android设备)。在iOS 12设备上,您必须在设置中启用Safari的运动传感器功能。
用户单击连接按钮后,脚本会定期将最新的传感器读数发送到Python后端: - function sendToFlask()
- {
- const xhr = new XMLHttpRequest();
- const data = new FormData();
- data.append("updown", updown);
- data.append("leftright", leftright);
- xhr.open("POST", "moveservos");
- xhr.send(data);
- }
复制代码
我之所以决定这样做,是因为传感器的读数每秒可能发生数百次,这会产生大量的开销,并且Flask服务器将无法满足请求。但是,您可以在脚本中调整间隔超时,以调整每秒的请求数。标准是四个。
Python脚本
Python脚本从网站接收用户输入并控制伺服电机。我使用Pigpio与伺服电机进行通讯是因为我发现它是使用伺服电机时最容易使用、最稳定和可靠的。
如前所述,我使用Flask为该应用程序创建了后端。它接收并处理来自网站的HTTP请求。为此,我公开了以下两个端点: - # Serve the HTML file when the root path is requested
- @app.route("/")
- def serveRoot():
- return render_template_string(TPL)
- # Expose an endpoint for sending the servo coordinates
- # from the JS to the Flask Backend
- @app.route("/moveservos", methods=["POST"])
- def moveServos():
- # Get the values from the request
- horizontal = 25 * int(request.form["updown"])
- vertical = 25 * int(request.form["leftright"])
- print(str(horizontal) + ", " + str(vertical))
- # Move the Servos
- setServoDuty(HORIZ_SERVO_PORT, clamp(HORIZ_SERVO_CENTER - horizontal, 500, 2500))
- setServoDuty(VERT_SERVO_PORT, clamp(VERT_SERVO_CENTER - vertical, 500, 2500))
- # Wait for 0.2s so that the servos have time to move
- sleep(0.2)
- # Stop the servo motors to save energy and reduce noise
- gpio.set_servo_pulsewidth(HORIZ_SERVO_PORT, 0)
- gpio.set_servo_pulsewidth(VERT_SERVO_PORT, 0)
- # Return empty request (Should return a 200 OK with an empty body)
- return ""
复制代码
第一种方法处理对根域的GET请求。只需返回上述HTTP页面和JavaScript。第二种方法由接受POST请求。这是网站发送传感器数据的地方,您可以在其中更改伺服器的行为。
您可以通过键入以下代码来运行代码: 请注意,首次启动后端时,您必须运行一次以下命令:
伺服电机控制
您可以利用此方法来控制各种设备,例如机械手、玩具以及其他伺服控制设备。对于无法准确按下触摸屏上的按钮的人,它也可以用作辅助功能。
从iOS设备读取传感器值可能会很痛苦。但是,一旦弄清楚了,就很容易做到,而且它为您提供了一种有趣的新方法来控制您的项目。 |