亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

控制乐高动力功能

组件和用品

Arduino UNO
× 1
Texas Instruments 双 H 桥电机驱动器 L293D
(买一个长插脚的,不是照片上的表面贴装版本)
× 1
面包板(通用)
× 1
9V to Barrel Jack Connector
× 1
Lego Power Functions 延长线(货品:8886)
× 3
HC-05 蓝牙模块
× 1

关于这个项目

您是否拥有一款带有电动机和伺服电机的令人敬畏的乐高 Power Functions 模型?在本教程中,我将向您展示如何使用 Arduino 和最少的电子元件控制乐高模型。我将详细解释电路和编程,以使本教程易于初学者理解。乐高模型你必须自己建造(如果你没有儿子),我不会帮你。

我们还将学习如何使用 MIT 应用程序发明者来编写我们自己的远程控制 Android 应用程序。很快,您将在后院拥有自己的乐高火星车!

这是我的第一个 Arduino 项目,我儿子有一个漂亮的 Lego Technic 汽车模型(9398 4X4 Crawler),带有乐高动力功能:一个用于转向的乐高伺服电机和两个用于驾驶的乐高 L 电机。他允许我在这个项目中使用这辆车(只要我没有切断任何电机电缆)。在这里,我们测试完成的原型:

了解电源功能接线

首先,购买一些乐高电源功能延长线(乐高网上商店的商品 8886)。接下来,将它们(认真地)切碎。我们将制作一些“分线”电缆,一端是乐高积木,另一端是别针。将引脚焊接在或类似的地方。接线说明如下:

GND 代表 Ground,是电池组(阳极)的负极端子 (-)。 C1和C2可以切换极性,使电机和舵机切换方向。 TechnicRobot 制作了一个很好的视频,详细解释了所有内容。 (警告:您自己负责这样做。如果您破坏了某些东西,我将不承担任何责任!)对于乐高伺服连接器,您需要将针脚焊接到所有四根电缆上。您可以使用浅灰色插头。对于连接电池盒和面包板的电源线,我们只需要+9伏和GND,但你必须使用深灰色插头(因为你需要一个公连接器):

对于电机线,我们只需要连接C1和C2,您可以使用浅灰色插头。 (详细研究原理图)。

用 L293D 芯片控制乐高电机

我们需要对直流电机进行变速控制,对乐高伺服进行位置控制。这是通过脉宽调制 (PWM) 实现的。 Arduino 的编程语言使 PWM 易于使用;只需调用analogWrite(pin, dutyCycle),其中dutyCycle 是一个从0 到255 的值。PWM 引脚在您的arduino 上标有~。

Arduino 输出引脚为 5 伏和最大值。 30 毫安,而乐高电机需要 9 伏特,并且每个拉力超过 100 毫安。我们需要某种介于两者之间的“切换设备”。我们还希望能够在两个方向上运行直流电机。这些功能由所谓的 H 桥解决。我们将使用 L293D,它在一个集成芯片上包含两个 H 桥,这意味着我们可以将乐高电机 (M) 并联连接到芯片的一侧,将乐高伺服 (S) 连接到芯片的另一侧。 (如果您想独立控制两个电机,则需要第二个 L293D)。乐高舵机也需要连接到GND和乐高+9伏。

该芯片使 Lego +9 Volt 和 Arduino +5 Volt 完全分离。切勿将它们连接在一起,否则会损坏某些东西!但是您必须将所有地线连接在一起并与 L293D 地引脚连接。

在我们的 Arduino 中,我们将使用引脚 9 来控制电机速度,使用引脚 2 和 5 来控制旋转方向。乐高伺服像电机一样控制:我们连接引脚 3 用于位置,引脚 6 和 8 用于方向(左或右)。

在我们程序的顶部,我们将使用的 Arduino 引脚定义为常量。此外,我们还定义了一些用于控制电机的变量:

// 电机控制数字输出引脚定义为全局常量const int controlPin1A =2; const int controlPin2A =5; const int ENablePin =9; // 伺服控制数字输出引脚定义为全局常量 const int controlPin3A =6; const int controlPin4A =8; const intservoENablePin =3; // 电机控制全局变量:int motorSpeed =0; // 电机速度 0..255int motorDirection =1; // 正向(1)或反向(0)// 伺服控制全局变量:int Steering =0; // 伺服位置 0..255int 转向方向 =0; // 左(0)和右(1) 

在设置中,我们使用 pinmode() 命令将这些引脚定义为输出,然后使用 digitalWrite() 将它们设置为 0 Volt。

void setup() { //other stuff.... // 声明数字输出引脚:pinMode(controlPin1A, OUTPUT); // 1A pinMode(controlPin2A, OUTPUT); // 2A pinMode(ENablePin, OUTPUT); // EN1,2 pinMode(controlPin3A, OUTPUT); // 3A pinMode(controlPin4A, OUTPUT); // 4A pinMode(servoENablePin, OUTPUT); // EN3,4 digitalWrite(ENablePin, LOW); // 电机关闭 digitalWrite(servoENablePin, LOW); // 转向居中} 

现在我们需要了解L293D芯片如何控制电机的旋转方向。我们必须提供以下信号(高 ==5 伏;低 ==0 伏):

  • EN1,2 1A 2A
  • 高 高 低 电机向左转(向前;motorDirection ==1)
  • 高低高电机右转(反向; motorDirection ==0)
  • EN3,4 3A 4A
  • 高 高 低 伺服左转(转向方向 ==0)
  • 高 低 高 伺服右转(转向方向 ==1)

行。我们准备编写一个子程序来读取方向和速度/位置的全局变量并控制电机和伺服:

void SetMotorControl(){ if (motorDirection ==1) //Forward { digitalWrite(controlPin1A, HIGH);数字写入(控制引脚2A,低); } else //反向{ digitalWrite(controlPin1A, LOW);数字写入(控制引脚2A,高);模拟写入(ENablePin, motorSpeed); //速度 if (steeringDirection ==0) //Left { digitalWrite(controlPin3A, HIGH);数字写入(控制引脚4A,低); } else //Right { digitalWrite(controlPin3A, LOW);数字写入(控制引脚4A,高);模拟写入(servoENablePin,转向); //伺服位置} 

带有操纵杆的简单 RC Android 应用程序

接下来,让我们构建一个简单的 Android 应用程序来控制模型。 (如果您想先测试已完成的应用程序:我已在 Google Play 商店中为您提供。这是链接:Arduino RC 汽车蓝牙)。

我们将使用 MIT 应用程序发明者 2。MIT App Inventor 是对编程和应用程序创建的创新初学者介绍。 Google 的 Mark Friedman 和麻省理工学院教授 Hal Abelson 共同领导了 App Inventor 的开发。它作为一种网络服务运行,由麻省理工学院移动学习中心的工作人员管理。

在您的 Android 手机上,前往 Google Play 并安装 MIT AI2 Companion 应用程序。在您的计算机上,在 Firefox 或 Chrome 浏览器(不支持 Internet Explorer)中打开指向我的 RC 应用程序的链接。您必须使用您的 gmail 地址登录并创建一个帐户才能查看源代码。如果您在手机上打开配套应用程序,您可以在浏览器中查看源代码,对其进行更改并立即在手机上进行测试。

在浏览器中,您现在将看到应用程序的设计器视图:

在底部,我们看到带有蓝色操纵杆球的橙色垫。现在切换到块视图来查看程序。该程序的核心是一个 when-block,它跟踪您的手指触摸和拖动蓝色操纵杆球的动作:

在两个变量 currentX 中跟踪手指的位置 和 currentY 并用于计算两个变量转向的值 和速度 (范围:-100..0..+100)。首先,程序会检查您的手指是否在垫外,并将值限制为 +/- 100。如果手指在垫内,则程序会计算转向的值 和速度 .接下来,程序生成以下形式的命令字符串:

命令以用于远程控制的“RC”开头(这个想法是在未来,您可能想要更多的命令)后跟一个逗号。然后我们发送转向的值 和速度 .命令末尾的换行符 ('\n') 是向 Arduino 发出命令已完成的信号。该命令字符串通过蓝牙发送到 Arduino。供您参考,该字符串也显示在屏幕上。

将蓝牙命令读入 Arduino

为了读取蓝牙命令字符串,我们需要连接一个 HC-05 蓝牙模块。看看你的模块:

我的有6个引脚。我们只需要四个引脚。 VCC 是(正)电源电压,GND 是地。该模块可承受 6 伏电源电压,这意味着我们可以将其连接到 arduino 5 伏电源引脚。 TXD 和 RXD 是串行信号。我们必须跨越线路并将 TXD 连接到 arduino RXD(引脚 0),反之亦然。 小心: 它指出 LEVEL:3.3V 这意味着 RXD 不能 直接连接到 5V arduino TXD(引脚 1)。我们必须构建一个带有三个 1 kOhm 电阻器的分压器,以产生 5V 的 2/3 的输出电压(参见示意图)。另一方面,3.3V的TXD信号可以直接连接到Arduino RXD。 Arduino 会将 3.3 伏特识别为高电压。

由于引脚 0 和 1 与 Arduino 的 USB 端口共享,因此在通过 USB 将程序上传到电路板时,您必须断开引脚 0 和 1 的 RXD 和 TXD 信号。如果您不断开电缆,则上传将无法进行。

接下来,您必须将 HC-05 模块与您的 Android 设备配对。打开蓝牙;启动应用程序;按“蓝牙连接”;使您的手机可见并寻找名为 HC-05 或类似的设备。选择设备。您将被要求提供代码。按“1234”。当您返回操纵杆屏幕时,它应该以绿色显示“已连接”。

现在,让我们看一下代码:

// 串行缓冲区大小:根据一个命令的预期最大输入大小计算#define INPUT_SIZE 30 void loop() { // 从串行蓝牙获取下一个命令(为最后的 0 添加 1 个字节) char input[ INPUT_SIZE + 1]; // 字符类型数组(C 字符串) // 读取串行直到新行或缓冲区已满或超时 byte size =Serial.readBytesUntil('\n', input, INPUT_SIZE); // 添加最后的 0 以结束 C 字符串 input[size] =0; // 拆分字符串,格式为:"RC,steering,speed,\n\0" char* command =strtok(input, ","); // command (RC) // RCsteering in Range:-100 (left).. 0 .. 100 (right) char* RCsteering =strtok(NULL, ","); // RCspeed in Range:-100 (full speed reverse).. 0 .. 100 (full speed forward) char* RCspeed =strtok(NULL, ","); int iRCsteering =atoi(RCsteering); // 将字符串转换为整数 int iRCspeed =atoi(RCspeed); // 将字符串转换为整数 // 程序的其余部分}  

Android 应用程序发送的字符串被读入一个特殊的字符串结构:一个带有空终止符的 C 字符串。 (0 字符告诉程序它已经到了字符串的末尾)。这是通过使用 Serial.readBytesUntil('\n', input, ...) 函数完成的,该函数从串行接口(蓝牙)读取,直到它获得换行符('\n')。这样,我们会继续读取字节,直到在 input 中有一个完整的命令 :

一种处理输入的非常有效的方法 是字符串标记函数,它使用逗号作为分隔符将字符串分成几部分。第一次调用 strtok() 返回“RC”。然后通过将 NULL 传递给 strtok() 来读取命令的后续部分。返回值存储在 RCsteering 中 和 RCspeed .这些变量实际上是指向 input 中位置的指针 .函数 atoi() 最终将它们转换为整数。现在,我们有:

我们现在差不多完成了。我们必须将这些值乘以 2.55,然后才能将它们传递给我们的例程 SetMotorControl()(请记住,电机速度在 0..255 范围内)。研究代码部分中程序的其余部分,构建电路并测试您的遥控乐高模型!

下一步是什么?

既然您有一个 Arduino 来控制您的乐高模型,您可能希望将该模型用作机器人平台:添加一些超声波 ping 传感器,编写您自己的避障逻辑并制作您自己的自动驾驶机器人火星探测器。或者向遥控器添加更多命令,为模型添加更多功能。但首先,找到一种方法让 Arduino 确定模型已超出蓝牙连接的范围并停止模型。告诉我你的解决方案。

很快,您就会发现原型试验板和松散的电缆对于移动模型来说并不是一个好主意。给自己一个带有大接线端子连接器的 adafruit motorshield,重新接线和重新编程。这也将释放可用于输入的数字信号。您还可以考虑使用传感器屏蔽罩,以便更好地连接传感器。

让我知道你现有的项目!

代码

  • Legocar_v3_bluetooth
Legocar_v3_bluetoothArduino
/* 通过蓝牙控制的乐高 Powerfunctions 汽车模型 Arduino Uno 控制电机和伺服 使用 MIT App Inventor 2 开发的 android 应用程序远程控制电路:* 串行通信(使用 Uno 引脚 0,1)连接蓝牙模块(必须通过 USB 加载程序时分离)* L293D 带电机(使用 Uno 数字引脚 2、5、9) * L293D 带伺服(使用 Uno 数字引脚 6、8、3)*/// 使用的库:#include  // 串行外设接口库#include  // 包含函数 strtok:将字符串拆分为标记// 串行缓冲区大小:根据蓝牙串行接口上​​的一个命令的预期最大输入大小计算#define INPUT_SIZE 30/ / 电机控制数字输出引脚定义为全局常量(带 2 个乐高电机的 4 轮驱动):const int controlPin1A =2; // L293D 驱动器在 2 号引脚上输入 1A http://www.ti.com/lit/ds/symlink/l293.pdf 连接到 Arduino 数字输出引脚 2const int controlPin2A =5; // L293D 驱动器输入 2A 引脚 7 连接到 Arduino 数字输出引脚 5const int ENablePin =9; // L293D ENable(1,2) 输入引脚 1 连接到 Arduino 数字输出引脚 9 // 伺服控制数字输出引脚定义为全局常量(带有 1 个乐高伺服的伺服转向):const int controlPin3A =6; // L293D 驱动器输入 3A 在引脚 10 上连接到 Arduino 数字输出引脚 6const int controlPin4A =8; // L293D 驱动器输入 4A 在引脚 15 上连接到 Arduino 数字输出引脚 8 const intservoENablePin =3; // L293D ENable(3,4) 输入引脚 9 连接到 Arduino 数字输出引脚 3 // 电机控制全局变量:int motorSpeed =0; // 电机速度 0..255int motorDirection =1; // 正向(1)或反向(0)// 伺服控制全局变量:int Steering =0; // 伺服位置 0..255int 转向方向 =0; // 左 (0) 和右 (1)void setup() { Serial.begin(9600); // 初始化串行通信 Serial.setTimeout(1000); // 1000 ms 超时 // 声明数字输出引脚: pinMode(controlPin1A, OUTPUT); // 1A pinMode(controlPin2A, OUTPUT); // 2A pinMode(ENablePin, OUTPUT); // EN1,2 pinMode(controlPin3A, OUTPUT); // 3A pinMode(controlPin4A, OUTPUT); // 4A pinMode(servoENablePin, OUTPUT); // EN3,4 digitalWrite(ENablePin, LOW); // 电机关闭 digitalWrite(servoENablePin, LOW); // 转向居中}void loop() { // 从串行蓝牙获取下一个命令(为最后的 0 添加 1 个字节) char input[INPUT_SIZE + 1]; // 带有空终止符的字符类型(C 字符串)数组 (https://www.arduino.cc/en/Reference/String) 字节大小 =Serial.readBytesUntil('\n', input, INPUT_SIZE); //读取串行直到新行或缓冲区已满或超时 // 添加最后的 0 以结束 C 字符串 input[size] =0; // 读取 C 字符串形式的命令:“RC,RCsteering,RCspeed,\n\0”(以换行符和空字符结尾) char* command =strtok(input, ","); // 暂时忽略命令(RC for Remote Control 是目前应用程序发送的唯一命令) char* RCsteering =strtok(NULL, ","); // 接下来是范围内的 RCsteering:-100 (left).. 0 .. 100 (right) char* RCspeed =strtok(NULL, ","); // 接下来是 RCspeed,它在范围内:-100(全速倒车).. 0 .. 100(全速前进) int iRCsteering =atoi(RCsteering); // 将字符串 RCsteering 转换为整数 iRCsteering int iRCspeed =atoi(RCspeed); // 将字符串 RCspeed 转换为整数 iRCspeed // 设置电机和伺服控制变量 if (iRCsteering> 0) SteeringDirection =1; // 如果 iRCsteering =1..100 则向右转,否则 SteeringDirection =0; // 如果 iRCsteering =-100..0 转向左转 =int(2.55*abs(iRCsteering)); // 伺服位置 0..255 基于命令 0..100 if (iRCspeed> 0) motorDirection =1; // 如果 iRCspeed =1..100 else motorDirection =0,则设置汽车前进; // 如果 iRCspeed =-100..0 motorSpeed =int(2.55*abs(iRCspeed)); // 根据命令 0..100 设置速度 0..255 SetMotorControl(); // 调整电机方向和速度 }void SetMotorControl()/*L293 逻辑:EN1,2 1A 2A HHL 电机左转(前进;motorDirection ==1) HLH 电机右转(反向;motorDirection ==0) EN3,4 3A 4A HHL Servo 左转 (steeringDirection ==0) HLH Servo 右转 (steeringDirection ==1) 电机速度:EN1,2 上的 PWM 信号(490 Hz;motorSpeed 的数字输出值 0..255)伺服位置:PWM 信号打开EN3,4(490 Hz;位置数字输出值 0..255;0 为直线)*/{ if (motorDirection ==1) //Forward { digitalWrite(controlPin1A, HIGH);数字写入(控制引脚2A,低); } else //反向{ digitalWrite(controlPin1A, LOW);数字写入(控制引脚2A,高);模拟写入(ENablePin, motorSpeed); //速度 if (steeringDirection ==0) //Left { digitalWrite(controlPin3A, HIGH);数字写入(控制引脚4A,低); } else //Right { digitalWrite(controlPin3A, LOW);数字写入(控制引脚4A,高);模拟写入(servoENablePin,转向); //伺服位置}
Github Lego-car-Arduino
包含源代码Arduino;弗里茨图;用于上传到 MIT 应用程序发明者的源代码 android 应用程序 https://github.com/Notthemarsian/Lego-car-Arduino

示意图

Github Lego-car-Arduino
包含源代码Arduino;弗里茨图;用于上传到 MIT 应用程序发明者的源代码 android 应用程序 https://github.com/Notthemarsian/Lego-car-Arduino 乐高%20rc%20car%20v2.fzz

制造工艺

  1. 控制双刃 SaaS 剑
  2. e
  3. e
  4. 避孕药
  5. 推土机
  6. 更可靠的电力传输组件的策略
  7. 电气控制面板的基础知识
  8. 风力
  9. 英国制造商花费超过 250 万英镑纠正错误
  10. 电力和暖通空调/气候控制
  11. 调试过程控制系统的 8 个步骤
  12. 卷材处理中的张力控制 – 关键组件