当前位置:网站首页>如何制作自己的机器人
如何制作自己的机器人
2022-07-06 00:23:00 【acktomas】
如何制作自己的机器人
2016 年 5 月 23 日
如何使用带有 Arduino 部件和传感器的步进电机在 2 个轮子上制作自己的机器人:
一旦您了解了使用步进电机的基础知识,您就可以创建一些有趣的项目,甚至可以制作自己的机器人。这一次,我将尝试使用步进电机构建一个 2 轮机器人。
在上一篇文章中,使用 Arduino 控制电机 - 使用伺服电机进行转向制作遥控车,我们制作了遥控车,其中普通电机提供前进/后退运动,伺服电机控制转向。
在这个 2 轮机器人中,向前/向后移动和转动可以通过并排放置的两个电机来完成。您经常会看到使用这种 2 轴距作为运动源的机器人。我要制作具有这种多功能性的东西。
用这个电子构造配方制作你自己的机器人
大约时间:90 分钟
所需零件
两轮机器人的设计
图 1 – 为 2 轮机器人建模
首先,您需要考虑 2 轮机器人的完整设计。如果有 2 个电机,则可以用简单的设计制作一个 2 轮机器人。2 个同向转动的电机提供向前/向后运动,反向转动提供转动能力。这一点,即使用两个电机可以很容易地实现基本运动控制,在许多领域都采用了这一点。让我们测量步进电机和其他要使用的部件的尺寸,并制作一个与该尺寸相匹配的机身。
图 1 使用免费的建模软件“123d design”,展示了我对 2 轮机器人身体的简单设计的想法。我正在考虑使用一块圆形木头作为底座,并将步进电机、Arduino 和电池连接到它上面。因为两轮机器人最终可能会向前或向后翻倒,所以我将在板的背面安装一个小滚珠脚轮作为支撑。
要确定车轮的尺寸,请将步进电机放在图 1 所示的圆形木块上,然后测量距地板的高度。到那个高度,加上脚轮浮动一点点+ 2-3mm时的高度,你就得到了轮子的直径。
图1 3D打印机生产的圆板和轮子
图2 支撑球脚轮
此外,我模拟了将步进电机锁定到板上的部分。步进电机的轴侧有四个 4mm 螺丝孔,所以我制作了一个零件,可以用它们将圆板锁定到步进电机上。
图2 将步进电机固定在圆板上的部分
图3 3D打印机打印出来的零件
一旦 3D 打印机生产出零件,我就安装了步进电机并确认了尺寸。它非常适合。
图 4 – 零件组装
将驱动器连接到步进电机。
由于所有部件都安装在直径为 12 厘米的板上,因此我们需要尽可能谨慎地使用空间。由于步进电机驱动器L6470的板子和螺丝孔位置和尺寸与步进电机表面的相同,我可以将驱动器拧到步进电机的背面。通过这样做,我可以节省一点空间。
图 5 – 暂时卸下螺丝并安装驱动板。
图 6 – 步进电机背面的驱动板
使用 Arduino 驱动两个步进电机的电路
以前,我们只驱动一台步进电机。这一次,我们需要驱动两个步进电机。使用称为菊花链的方法,L6470 可以控制多个步进电机。
菊花链是一种 布线方案,其中多个设备按顺序或以环形方式连接在一起。 除了完整的单回路之外,包含内部回路的系统不能称为菊花链。
与 L6470 进行菊花链所需的电路如下所示。由于电线较多,接线时请注意不要弄错。
图 3 – 连接两个步进电机的电路
与电路只有一个时的不同之处在于,第一和第二步进电机现在有一个连接它们的部件。用 L6470 数据表确认后,第一个步进电机连接到 SDO,第二个步进电机连接到 SDI。通过这部分发送和接收数据。
图 4 – L6470 示意图
结论
电路接线完成后,我想说是时候开始编程部分了,但由于处理多个步进电机的程序可能有点复杂,退一步了解更多关于步进电机编程的知识可能是明智的。如果一切顺利,两个步进电机将像下面的视频一样同步。
如何制作自己的机器人(第 2 部分)
2016 年 5 月 24 日
如何在 2 个轮子上制作自己的机器人,使用带有 Arduino 部件和传感器的步进电机……第 2 部分
在第 1 部分中,我们使用库驱动步进电机。这一次,我们将更详细地研究步进电机编程并学习如何控制它,处理步进电机时遇到的问题,以及一些解决方案。
电子建筑配方
大约时间:90m
所需零件
步进电机评论
图 1 – 步进电机和 L6470
我将在这篇文章中回顾如何通过编程来控制步进电机。从以下特性可以看出,与普通电机和伺服电机相比,步进电机的独特之处在于能够控制旋转。
- 电机:通电时旋转
- 伺服电机:对应一个信号在0到N度范围内旋转
- 步进电机:可不受信号限制地控制
此外,您在实际控制电机时按顺序向电机发送 PWM 信号。也就是说,如果将 Arduino 直接连接到步进电机,控制会很困难。所以通常,对于像 Arduino 这样的微控制器,您会希望通过电机驱动器来控制步进电机,这使得各种类型的控制成为可能。(有关处理普通电机驱动器的信息,请参阅#12。)
这次使用的 L6470 步进电机驱动器既便宜又具有板载控制/振荡器电路,用于检测步进电机、DSP 和通信 I/F 的过电流。从根本上说,当您尝试控制电机的转数或功率或需要精确运动时,您需要选择具有如下功能和能力的电机驱动器来完成您的电路。
[](http://www.rohm.com/web/global/search/parametric/-/search/Stepping Motor)
[步进电机驱动器目录 – ROHM](http://www.rohm.com/web/global/search/parametric/-/search/Stepping Motor)
因为我想要一个易于使用且价格便宜的产品,所以我使用的是 L6470。但是,上次和之前的时间,当我试图驱动步进电机时,我预计它会旋转。相反,我只有噪音和振动,但轴没有转动。我想知道我是否做了什么让它变得奇怪?
步进电机“失步”现象
在使用步进电机时,您经常会遇到失步。简而言之,失步就是步进电机的实际运动跟不上旋转控制信号,电机驱动器预期的旋转位置与实际步进电机位置失准,从而导致同步性丢失和电机不转。
跳出的原因多种多样。如下所述驱动步进电机通常会导致它。
- 突然加速或减速步进电机
- 突然加减速的时机带来了信号与电机不同步的可能。在这些情况下,首先逐渐加速/减速会消除这种可能性。
- 扭矩不足
- 如果电机没有足够的扭矩(转动功率),可能会发生失步。在这种情况下,您必须切换到具有所需扭矩的电机。
- 驱动电压低/不稳定
- 如果驱动电压低/不稳定,这可能会导致失步。L6470 规格要求 8V-45V,但在 8V 下运行时要小心。
- 振动的影响
- 如果对电机施加振动,可能会导致失步。
一般来说,出现失步时,上述原因都有可能,但扭矩不足导致的突然加速或超速是最常见的原因。因此,如果您的步进电机出现故障,这些原因值得调查。
另外意法半导体有卖L6470的,有详细的说明,大家也可以参考一下。
对步进电机进行编程
现在,让我们深入研究这篇文章的主题,步进电机编程。为了通过 L6470 从 Arduino 控制步进电机,您必须对 l6470 进行编程以发送控制信号。电路如下。
图 1 – 连接 Arduino、L6470 和步进电机的电路
步进电机控制程序流程
下面是步进电机程序。我们现在将细读这个程序的流程。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | #include <Arduino.h>#include <SPI.h> //(1) Import for SPI transmission //(2) Define the stepper motor pin#define PIN_SPI_MOSI 11#define PIN_SPI_MISO 12#define PIN_SPI_SCK 13#define PIN_SPI_SS 10 void setup(){ delay(1000); Serial.begin(9600); //(3) Initialize the stepper motor pin pinMode(PIN_SPI_MOSI, OUTPUT); pinMode(PIN_SPI_MISO, INPUT); pinMode(PIN_SPI_SCK, OUTPUT); pinMode(PIN_SPI_SS, OUTPUT); digitalWrite(PIN_SPI_SS, HIGH); //(4) SPI signal to commence SPI transmission SPI.begin(); SPI.setDataMode(SPI_MODE3);// When SCK is high, send/receive data, when idle, set pin to HIGH SPI.setBitOrder(MSBFIRST);// Transmission from MSB //(5) L6470 settings L6470_setup();} //**********************************************//(6) SPI transmission method//void L6470_send(unsigned char value){ digitalWrite(PIN_SPI_SS, LOW); SPI.transfer(value); // Send control signal via SPI transmission digitalWrite(PIN_SPI_SS, HIGH); } //// (7) L6470 setup//void L6470_setup(){ // Device settings L6470_send(0x00); L6470_send(0x00); L6470_send(0x00); L6470_send(0x00); L6470_send(0xc0); //Set maximum revolution speed L6470_send(0x07);//register address L6470_send(0x20);//value(10bit),default 0x41 //Voltage setting when motor is idle L6470_send(0x09);//register address L6470_send(0xFF);//value(8bit),default 0x29 //Voltage setting when motor rotating at constant speed L6470_send(0x0a);//register address L6470_send(0xFF);//value(8bit),default 0x29 //Voltage setting when accelerating L6470_send(0x0b);//register address L6470_send(0xFF);//value(8bit),default 0x29 //Voltage setting when decelerating L6470_send(0x0c);//register address L6470_send(0xFF);//value(8bit),default 0x29 //full step, half step,1/4,1/8,…,1/128 step setting L6470_send(0x16);//register address L6470_send(0x00);//value(8bit} //// (8)Main process - loop()//**********************************************void loop(){ //360 degrees - Turn one complete revolution L6470_send(0x50);// Run(DIR,SPD),0x51:Forward,0x50:Reverse L6470_send(0x00); L6470_send(0x20);// Rotation speed settings L6470_send(0x00); delay(1604);// Turn 1 time every 1604ms L6470_send(0xB8);// Hard stop} |
---|---|
控制信号——关于 SPI 传输
首先,L6470 和 Arduino 之间的控制信号交换通过调用 SPI 传输(串行外设接口)的方法进行。这种 SPI 传输用于在 Arduinos 和 IC 芯片等微控制器之间交换信号。
在程序第二行(1)的“#include SPI.h”表达式中,我准备在Arduino上使用SPI传输。使用库时,请记住这些“#include <***.h>”表达式一直存在。
接下来,在(2)中,我设置了 L6470 使用的引脚。在这里,您可以看到书面的 MOSI 和 MISO。这些是 SPI 传输使用的基本信号线。
在 SPI 传输中,信号线由以下 3 个基本元素构成(使用 SS 信号时为 4 个元素)。每条信号线都有特定的时钟(SCK)、输出信号(MOSI:Master Out Slave In)和输入信号(MISO:Master In Slave Out)。实际传输时,通信安排为 Arduino 输出标准时钟信号 (SCK),然后与 L6470 一起使用 In 和 Out(MISO 和 MOSI)连接来回传输数据。
- SCK——串行时钟
- MISO – 主进从出
- MOSI – 主出从入
- SS – 从机选择
在 (3) 中,设置使用的信号线的引脚模式。接下来,在(4)中,设置要使用的SPI传输模式。正在连接的设备确定模式。
一旦 SPI 传输准备完成,在 (5) 中,我们终于可以使用 SPI 传输并开始 L6470 设置。实际发送SPI传输信号的部分是(6) L6470_send()函数的写法。
在进行 L6470 设置时,请根据数据表和手册中记录的规格设置所需的元素。
当您查看数据表的内容时,您将看到下面的命令地址表。这次因为我们使用的是12026电机,所以通过SPI传输将表中记录的寄存器地址发送到初始化L6470。
作为如何在编程中使用表格的示例:
123 | //Highest revolution speed settingL6470_send(0x07);//register addressL6470_send(0x20);//value(10bit),default0x41 |
---|---|
以上是代码。如果我们在“最高转速”功能行的表格中查看,地址为“0x07”,长度为“10”位,初始值为“0x20”(以12026模式为例)。通过 SPI 传输发送表中的值,您可以进行各种设置。
表 1 L6470 数据表。
初始化完成后,在 (8) 主过程中找到实际驱动步进电机的命令。您可以再次看到数据表中记录的各种命令。
- 旋转指令
0x51(正转)、0x50(反转) - 停止(软)命令 0xB0
在该示例中,发送正向或反向旋转命令,然后是 20 位旋转速度命令,然后是延迟(1604)。这使它在这段时间内转动。如果改变这个转速值,它可以加速或减速。
这是使用Arduino通过L6470驱动步进电机时的流程。另外,与此相对应,通过改变一些连接方式,可以像上次介绍的那样控制多台步进电机。
让我们试着驾驶一个两轮机器人
现在我们了解了步进电机的编程功能流程,让我们完成 2 轮机器人。我在上一篇文章中使用 3D 打印机完成了轮子和车身的打印,现在将在车身上安装必要的部件,这样您就可以完全制作自己的机器人了。
图 2 – 制作您自己的机器人所需的所有部件都安装在身体上
安装了 Arduino、面包板和用于步进电机(2 个串联)的 9V 电池后,几乎没有剩余空间了……哎呀。
因此,我没有使用 Arduino UNO,而是尝试将其更换为 Arduino Pro Mini。
图 3 – 使用 Arduino Pro Mini,非常完美!
图 4 – 它整齐地安装在面包板上
图 5 – 轮子牢固地安装在轴上,因此不会打滑
安装完所有部件后,我们终于可以打开电源并尝试驱动它。
有用!在视频中,步进电机连接了一个 12V 适配器。当我连接 9V 电池时,它们有点太重了,我注意到步进电机没有足够的扭矩。在这种情况下,如果它太重,就像我之前描述的那样,您可以更换电机本身,减轻重量,或者进一步改进电源以使稳定运行成为可能。
结论
这一次,我们使用步进电机在两个轮子上制作您自己的机器人。移动发生在代码中。当你制作自己的机器人时,你可以添加其他东西,比如在每一侧安装光传感器,制作一个朝着最亮的光移动的机器人,或者一个朝着声音移动的机器人,甚至是一个可以由智能手机驱动的机器人通过之前介绍的 ESP- WROOM -02使用 WIFI 通信。各种应用都是可能的。我可能会尝试在后续帖子中介绍一些改进。
下一次,我想我会制作一个使用磁传感器或其他很酷的东西的设备。
边栏推荐
- Single merchant v4.4 has the same original intention and strength!
- Multithreading and high concurrency (8) -- summarize AQS shared lock from countdownlatch (punch in for the third anniversary)
- Codeforces round 804 (Div. 2) [competition record]
- 多线程与高并发(8)—— 从CountDownLatch总结AQS共享锁(三周年打卡)
- FFT learning notes (I think it is detailed)
- Data analysis thinking analysis methods and business knowledge -- analysis methods (II)
- Search (DFS and BFS)
- 关于结构体所占内存大小知识
- 【QT】Qt使用QJson生成json文件并保存
- anconda下载+添加清华+tensorflow 安装+No module named ‘tensorflow‘+KernelRestarter: restart failed,内核重启失败
猜你喜欢
Go learning - dependency injection
FFMPEG关键结构体——AVFormatContext
notepad++正則錶達式替換字符串
Hudi of data Lake (1): introduction to Hudi
How much do you know about the bank deposit business that software test engineers must know?
wx. Getlocation (object object) application method, latest version
Set data real-time update during MDK debug
The difference of time zone and the time library of go language
XML Configuration File
NSSA area where OSPF is configured for Huawei equipment
随机推荐
Yolov5, pychar, Anaconda environment installation
What are the functions of Yunna fixed assets management system?
MySQL functions
提升工作效率工具:SQL批量生成工具思想
小程序技术优势与产业互联网相结合的分析
Huawei equipment is configured with OSPF and BFD linkage
[designmode] composite mode
Gavin teacher's perception of transformer live class - rasa project actual combat e-commerce retail customer service intelligent business dialogue robot system behavior analysis and project summary (4
Codeforces round 804 (Div. 2) [competition record]
[Chongqing Guangdong education] Chongqing Engineering Vocational and Technical College
多线程与高并发(8)—— 从CountDownLatch总结AQS共享锁(三周年打卡)
Hudi of data Lake (1): introduction to Hudi
[Chongqing Guangdong education] reference materials for Zhengzhou Vocational College of finance, taxation and finance to play around the E-era
Opencv classic 100 questions
Intranet Security Learning (V) -- domain horizontal: SPN & RDP & Cobalt strike
Hudi of data Lake (2): Hudi compilation
[Online gadgets] a collection of online gadgets that will be used in the development process
7.5 decorator
Configuring OSPF load sharing for Huawei devices
Problems and solutions of converting date into specified string in date class