此页面上提供了研讨会体验所需的一切。
本次研讨会的参与者将获得构建 TI-RSLK MAX 机器人平台、测试、定制和与之竞争的经验。它是一款轮式机器人车辆,使用 TI SimpleLink MSP432 LaunchPad,使其高度模块化。使用 Energia,TI 相当于简单的 Arduino 风格的脚本代码,您将获得完整的实验室设置和教学材料。这是一种以可访问和有趣的方式引入电子和嵌入式系统的兴奋的低成本方式。由于 TI LaunchPad 是开源和模块化硬件,我们还可以添加 BoosterPack 模块来扩充我们的威廉希尔官方网站 。本次研讨会将重点介绍使用基本 TI-RSLK MAX 套件随附的板载传感。IR 反射、凹凸开关和编码器。
Arduino 编程适用于编程经验很少或没有编程经验的学生,适合 K-12 学生或大学一年级学生使用电子产品进行探索和原型制作。对于高级功能,鼓励学生使用 Code Composer Studio 和 C 编程为 TI-RSLK MAX 系统编写固件代码。
如需了解更多机器人学知识,请查看 TI-RSLK MAX,这是一个全面的开源课程和硬件包,通过机电一体化的应用教授嵌入式系统的基础知识。TI-RSLK 为机器人系统知识提供了先进的垫脚石,但初学者仍然可以通过完整的讲座和实验室活动获得。
准备好电脑和螺丝刀。建议使用 Chrome 浏览器来使用本次研讨会的一些在线元素。
在我们开始之前,请确保您:
1.下载并安装最新版本的Arduino IDE(1.8.13)。
2.将 URL 添加到您的 File > Preferences > Additional Board Manager URLs。如果您愿意,还可以选中显示行号框,如果您希望它更大,请调整字体大小。
3.转到 Tools > Boards > Boards Manager 并使用 Energia MSP432 滚动到列表底部并安装 5.29.1
注意:此步骤需要几分钟,安装时间在 10-20 分钟之间。
4.安装完成后,需要在Arduino IDE中选择板子和COM口。转到 Tool > Boards,现在您应该会看到“Energia MSP432 Red Boards”>“Red LaunchPad MSP432P401R EMT”,并确保选中它。
5.您还应该选择正确的 COM 端口。在通过 USB 将 LaunchPad 插入计算机并安装 LaunchPad 驱动程序(在后面的步骤中使用 RSLK 调试工具 GUI 完成)之后,可以完成此步骤。转到工具 > COM 端口以从可用选项中进行选择。LaunchPad 填充了两个 COM 端口。MacOS 用户将看到端口 001 和 004 已填充,请使用端口 1。Windows 用户可以通过转到设备管理器并找到 XDS110 UART 来验证他们的 COM 端口。
6.在本页底部的代码部分添加可下载的 RSLK 机器人库。转到 Sketch > 包含库 > 添加 .ZIP 库。选择下载的zip库的文件路径,点击ok。它应该说添加了库,您可以通过转到文件 > 示例 > TI-Robot-Lib 来检查这一点,并查看库中提供的示例代码。
7.当我们开始编程时,应该加载并准备好示例,但不要担心运行任何代码。接下来,您将要组装您的机器人并使用调试工具对其进行功能测试。
在这个实验室中,我们将组装我们的机器人。
您还需要一个电源,我们可以为机器人配备电源,使其真正移动。TI-RSLK 需要 6 节标准 AA 电池。如果您愿意,它也可以配备可充电的镍氢电池,但可更换的碱性电池可以很好地供个人使用,并且可以持续很长时间。
按照这些说明组装您的机器人
TI-RSLK MAX 只是快速组合在一起的几个组件
1) 开始前先观看组装视频并查看施工指南
- 一个。请注意,机箱板应预先安装,因此即使视频涵盖了它,您也无需将其放在上面
- 乙。请注意,视频中没有介绍面包板,但您可以使用下图查看它们的安装位置。您无需解开粘合垫,只需将螺钉穿过粘合剂即可将其拧入支架。要固定支架,您需要卸下电池盖并将固定螺母安装到电池仓内侧的指定位置,以便将支架拧入。
2) 验证所有 LaunchPad 上的 5V 跳线是否已移除,它们应该在工厂完成,但只需验证,否则会导致灾难性故障。
3) 确保将电机安装座完全固定好,使其与底盘齐平。如果你不这样做,那么你很容易弯曲和折断固定片,这会阻止你完全插入电机,直到那些破损的片被移除,并且可能会在以后导致一些失速问题
4) 面包板支架放置在蓝色圆圈处
5) 做一个快速的功能检查。确认碰撞开关是否发出咔哒声,电源按钮在 ON/OFF 开关处于 OFF 位置时工作,四个大电容器在机箱板上就位且没有损坏,用手转动车轮时没有摩擦.
6) 组装后立即使用在线调试工具:
- 一个。这使您可以验证一切是否正常。如果您想确保您的机器人没有损坏,它也会在以后为您提供帮助。
- 乙。使用 Chrome 或 Firefox 浏览器并安装浏览器扩展 + TI Cloud Agent 本地驱动程序。这些对于让 LaunchPad 正常工作至关重要,因此如果安装不正确,GUI 将无法工作。当我们稍后运行 Arduino 时,安装 TI Cloud Agent 也很重要。
- C。如果仪表板有任何问题(未连接硬件等),请尝试刷新页面并重试。如果您完全无法让 GUI 工作,您也可以尝试下载本地副本尝试。
Mac 操作系统
Linux 64 位
- d。每次都会下载测试固件,因此在加载页面时请确保 LaunchPad 已通过 USB 数据线连接到 PC
- e。在您确认机箱板的电源打开之前,电机或光传感器将无法工作。使用机箱板上的电源按钮,您应该看到蓝色电源 LED 指示它已打开。开/关开关可能会令人困惑,但最好将其留在关闭位置。如果您将其打开,它将工作,但无法将其关闭,直到您将其关闭并按下电源按钮。
- F。要将其关闭,请确保将开/关开关拨到 OFF 并按下电源按钮,您应该会看到蓝色 LED 熄灭
- G。如果您发现电机不工作或听到一些摩擦声,请确保磁铁没有太紧并防止电机齿轮移动。您可以用指甲松开电机轴上的磁铁。
- H。如果您发现碰撞开关有任何问题,请确保连接正确对齐。对于线路传感器的任何问题,请确保其方向正确并且所有连接都对齐。
您的机器人已组装并验证功能正常。希望它感觉相当稳定并准备好滚动。
Arduino IDE 允许您通过 TI LaunchPad 使用 Arduino 风格编程开始快速原型设计。这使得在项目开始时测试不同的社区硬件解决方案并将它们集成到自定义应用程序中非常棒。
在本实验中,我们将设置我们的开发环境。我们可以做的第一件事是让 LED 闪烁,以确保我们可以用计算机对微控制器进行编程。
1.打开 Arduino IDE。
2.首先,确保您选择了您的开发板,方法是转到工具 > 开发板并在菜单上查找“LaunchPad with MSP432”(如果您还没有的话)。如果您的 LaunchPad 板不存在,请转到 Boards Manager 并安装您的 LaunchPad 板包。MSP432 板应该是列表中的最后一个选项。注意:MSP432 EMT 表示多任务处理并具有 RTOS 功能,但我们现在不需要。
3.如果您正确安装了驱动程序,那么您应该会在工具 > 端口下看到 COM 端口。如果有多个选项,请选择具有 UART 功能的端口。您可以在计算机的设备管理器中验证 COM 端口。
现在我们将第一次运行我们的代码示例。
库中的前两个示例是相同的代码 01_Bump_Switch_Motor_Bare 和 02_Bump_Switch_Motor_Simplified,它们将向前移动机器人,直到碰撞开关碰到什么东西。非常简单,可以跳过。裸代码使用对库的直接调用,简化代码使用库中定义的函数。
4.转到文件 > 示例 > 自定义机器人库 > TI-Robot-Lib > 03_Bump_Switch_LED_Bare。单击上传按钮,完成后您可以点击碰撞开关以测试不同的 LED 并验证新代码是否可以闪烁到 RSLK MAX。
5.接下来,您可以运行跳舞机器人示例。这将为您的机器人编程提供一个有趣的开始。转到文件 > 示例 > 自定义机器人库 > TI-Robot-Lib > 05_Dancing_Robot_Simplified。程序上传后,绿色 LED 将闪烁,表示正在等待按钮按下。按 S1(左侧)按钮或 S2(右侧)按钮告诉机器人开始舞蹈序列。您也可以尝试 06_Dancing_Robot_2_Simplified,这是一个略有不同的动作。
或者,通过转到文件 > 新建打开一个新草图。粘贴下面的示例代码并运行它。
#include "Energia.h"
#include "SimpleRSLK.h"
bool hit_obstacle = false;
void waitBtnPressed() {
while(digitalRead(LP_S2_PIN) == 1){
digitalWrite(LP_RGB_LED_GREEN_PIN, HIGH);
delay(500);
digitalWrite(LP_RGB_LED_GREEN_PIN, LOW);
delay(500);
}
}
void checkCollision() {
for(int x = 0;x<6;x++)
{
/* Check if bump switch was pressed
* Parameter:
* bump switch number -> 0-5
* Returns:
* true -> if specific switch was pressed
* false -> if specific switch was not pressed
*/
if(isBumpSwitchPressed(x) == true) {
hit_obstacle = true;
Serial.println("Collision detected");
disableMotor(BOTH_MOTORS);
break;
}
}
}
void setup() {
/* Set serial communication to 115200 baud rate for MSP432 */
Serial.begin(115200);
delay(500);
/* Run setup code */
setupRSLK();
/* Initialize LED pins as outputs */
pinMode(LED_FR_PIN, OUTPUT);
pinMode(LED_FL_PIN, OUTPUT);
pinMode(LED_BR_PIN, OUTPUT);
pinMode(LED_BL_PIN, OUTPUT);
pinMode(LP_RED_LED_PIN, OUTPUT);
pinMode(LP_RGB_LED_RED_PIN, OUTPUT);
pinMode(LP_RGB_LED_BLUE_PIN, OUTPUT);
pinMode(LP_RGB_LED_GREEN_PIN, OUTPUT);
/* Initialize LaunchPad buttons as inputs */
pinMode(LP_S1_PIN, INPUT_PULLUP);
pinMode(LP_S2_PIN, INPUT_PULLUP);
}
void loop() {
Serial.println("Waiting until left button is pushed");
/* Wait until button is pressed to start robot */
waitBtnPressed();
/* Wait two seconds before starting */
delay(2000);
digitalWrite(LP_RGB_LED_BLUE_PIN, HIGH);
/* Enables specified motor.
* Parameter:
* Motor your referencing -> LEFT_MOTOR RIGHT_MOTOR BOTH_MOTORS
*/
enableMotor(BOTH_MOTORS);
/* Set direction of motor rotation.
* Parameter:
* Motor your referencing -> LEFT_MOTOR RIGHT_MOTOR BOTH_MOTORS
* Direction -> MOTOR_DIR_FORWARD MOTOR_DIR_BACKWARD
*/
setMotorDirection(LEFT_MOTOR,MOTOR_DIR_FORWARD);
setMotorDirection(RIGHT_MOTOR,MOTOR_DIR_FORWARD);
/* Set speed of motor.
* Parameter:
* Motor your referencing -> LEFT_MOTOR RIGHT_MOTOR BOTH_MOTORS
* Speed -> 0 - 100
*/
setMotorSpeed(BOTH_MOTORS,10);
while(!hit_obstacle) {
/* Move robot in place */
/* Right turn in place */
setMotorDirection(LEFT_MOTOR, MOTOR_DIR_BACKWARD);
setMotorDirection(RIGHT_MOTOR, MOTOR_DIR_FORWARD);
delay(1000);
/* Left turn in place */
setMotorDirection(LEFT_MOTOR, MOTOR_DIR_FORWARD);
setMotorDirection(RIGHT_MOTOR, MOTOR_DIR_BACKWARD);
delay(1000);
/* 360 spin right */
setMotorDirection(LEFT_MOTOR, MOTOR_DIR_FORWARD);
setMotorDirection(RIGHT_MOTOR, MOTOR_DIR_BACKWARD);
setMotorSpeed(BOTH_MOTORS,50);
delay(800);
setMotorSpeed(BOTH_MOTORS,10);
/* 360 spin left */
setMotorDirection(LEFT_MOTOR, MOTOR_DIR_BACKWARD);
setMotorDirection(RIGHT_MOTOR, MOTOR_DIR_FORWARD);
setMotorSpeed(BOTH_MOTORS,50);
delay(800);
setMotorSpeed(BOTH_MOTORS,10);
/* Left turn in place */
setMotorDirection(LEFT_MOTOR, MOTOR_DIR_BACKWARD);
setMotorDirection(RIGHT_MOTOR, MOTOR_DIR_FORWARD);
delay(500);
/* Right turn in place */
setMotorDirection(LEFT_MOTOR, MOTOR_DIR_FORWARD);
setMotorDirection(RIGHT_MOTOR, MOTOR_DIR_BACKWARD);
delay(1000);
/* Left turn in place */
setMotorDirection(LEFT_MOTOR, MOTOR_DIR_BACKWARD);
setMotorDirection(RIGHT_MOTOR, MOTOR_DIR_FORWARD);
delay(1000);
/* 360 spin right */
setMotorDirection(LEFT_MOTOR, MOTOR_DIR_FORWARD);
setMotorDirection(RIGHT_MOTOR, MOTOR_DIR_BACKWARD);
setMotorSpeed(BOTH_MOTORS,50);
delay(800);
setMotorSpeed(BOTH_MOTORS,10);
/* 360 spin left */
setMotorDirection(LEFT_MOTOR, MOTOR_DIR_BACKWARD);
setMotorDirection(RIGHT_MOTOR, MOTOR_DIR_FORWARD);
setMotorSpeed(BOTH_MOTORS,50);
delay(800);
setMotorSpeed(BOTH_MOTORS,10);
}
}
这段代码让您的机器人在原地旋转以显示我们拥有的简单电机控制。您可能需要对其进行修改,因为机器人所在的表面会影响其转动速度。不要太挂在这部分上,因为我们将在下一个实验室中添加更多的自治层。这再次证明了我们的电机确实可以工作,并让我们对电机逻辑有所了解。
6.一些可选的练习可以用编码器和线跟随例子来完成。转到文件 > 示例 > 自定义机器人库 > TI-Robot-Lib > 04_Encoder_Simplified。此编码器示例将通过串行监视器向您显示值,这有利于调试。
如果您想尝试以下线路,结果将根据您可用的线路类型而有所不同。您可以通过在白纸上使用记号笔或使用电工胶带绘制高对比度线条。您还可以从在线示例打印线轨。机器人跟随路线的能力将根据轨道的条件而变化。
现在我们准备测试线路跟踪能力。通过打印出轨迹或使用黑色电工胶带制作轨迹,在白色表面上设置黑线。设置好线路后,在以下示例中加载线路。转到文件 > 示例 > 自定义机器人库 > TI-Robot-Lib > 07_Line_Following_Simplified。它首先通过前进和后退对线路进行校准。然后您可以通过再次单击该按钮来开始线检测。机器人将尝试保持在线。如果您将机器人设置为较慢的速度,它可能会更好地工作。注意:根据您的线路设置,此示例可能有点棘手,因此请随意跳过。
故障排除
代码不上传?
LED 不亮?
它会导航吗?
我们将继续使用一些更复杂的示例代码来测试我们的机器人。我们可以使用库中的状态机示例。转到文件 > 示例 > 自定义机器人库 > TI-Robot-Lib > 09_State_Machine_Simplified。或者,通过转到文件 > 新建打开一个新草图。粘贴下面的示例代码并运行它。
#include "Energia.h"
#include "SimpleRSLK.h"
/* Defines struct for state machine states */
typedef enum
{
START = 0,
WAIT,
GO,
GO2,
BUMPED1a,
BUMPED1b,
DRIVE,
STOP
} my_state_t;
/* Initialize state machine in START state */
my_state_t state = START;
/* Variable that will take the state machine to the STOP state */
bool done;
/* Initialize objects */
void setup() {
/* Set serial communication to 115200 baud rate for MSP432 */
Serial.begin(115200);
delay(500);
Serial.println("Initializing.....");
setupRSLK();
/* Initialize LED pins as outputs */
pinMode(LED_FR_PIN, OUTPUT);
pinMode(LED_FL_PIN, OUTPUT);
pinMode(LED_BR_PIN, OUTPUT);
pinMode(LED_BL_PIN, OUTPUT);
pinMode(LP_RED_LED_PIN, OUTPUT);
pinMode(LP_RGB_LED_RED_PIN, OUTPUT);
pinMode(LP_RGB_LED_BLUE_PIN, OUTPUT);
pinMode(LP_RGB_LED_GREEN_PIN, OUTPUT);
/* Initialize LaunchPad buttons as inputs */
pinMode(LP_S1_PIN, INPUT_PULLUP);
pinMode(LP_S2_PIN, INPUT_PULLUP);
Serial.println("Initializing System Complete.");
}
void loop() {
// Emergency stop switch S2
// Switch to state "STOP" if pressed
if (digitalRead(LP_S2_PIN) == 0) state = STOP;
//-----------------------------------
// Main State Machine
//-----------------------------------
switch (state) {
case START:
Serial.println("Enter START state");
state = WAIT;
break;
case WAIT:
Serial.println("Enter WAIT state");
digitalWrite(LP_RGB_LED_GREEN_PIN, HIGH);
delay(200);
digitalWrite(LP_RGB_LED_GREEN_PIN, LOW);
delay(200);
if (digitalRead(LP_S1_PIN) == 0) {
state = GO;
}
break;
case GO:
Serial.println("Enter GO state");
/* Start running the motors */
/* Enables specified motor.
* Parameter:
* Motor your referencing -> LEFT_MOTOR RIGHT_MOTOR BOTH_MOTORS
*/
enableMotor(BOTH_MOTORS);
setMotorDirection(BOTH_MOTORS, MOTOR_DIR_FORWARD);
setMotorSpeed(BOTH_MOTORS, 25);
state = GO2;
break;
case GO2:
Serial.println("Enter GO2 state");
/* Detect a bump and then switch to bump correction state */
for(int x = 0;x<6;x++)
{
if(isBumpSwitchPressed(x) == true) state = BUMPED1a;
}
/* Continue to rotate until done condition is met */
/* Certain distance traveled or other conditions can be set */
if (getEncoderLeftCnt() > 50000) {
done = 1;
}
if (done) state = STOP;
break;
case BUMPED1a:
Serial.println("Enter BUMPED1a state");
/* Stop the motors */
setMotorSpeed(BOTH_MOTORS,0);
/* Reverse the robot */
setMotorDirection(BOTH_MOTORS, MOTOR_DIR_BACKWARD);
setMotorSpeed(BOTH_MOTORS,25);
delay(500);
state = BUMPED1b;
break;
case BUMPED1b:
Serial.println("Enter BUMPED1b state");
/* Turn robot to avoid obstacle */
setMotorSpeed(LEFT_MOTOR,0);
setMotorSpeed(RIGHT_MOTOR,25);
delay(100);
state = DRIVE;
break;
case DRIVE:
Serial.println("Enter DRIVE state");
/* Put motors back to forward direction */
setMotorDirection(BOTH_MOTORS, MOTOR_DIR_FORWARD);
setMotorSpeed(BOTH_MOTORS, 25);
state = GO2;
break;
case STOP:
Serial.println("Enter STOP state");
Serial.println("Press Reset to begin again");
/* Stop all motors */
disableMotor(BOTH_MOTORS);
break;
}
delay(10);
}
此代码将使用基本状态机向机器人展示如何撞到墙壁和物体并避免它们。这称为航位推算导航。
尝试其他一些库示例。您可以看到它们基于名为 SimpleRSLK.h 的文件。如果您想在自己的代码中使用这些函数,或者只是知道它在做什么,请进入您的 Arduino Libraries 文件夹,您可以查看库源文件。
希望您喜欢 TI-RSLK MAX 的体验!
学习不止于此。通过探索课程,深入了解 TI-RSLK MAX 的高级主题。与 Jonathan Valvano 博士一起获得有关嵌入式系统的指导学习体验。在 20 多个学习模块中查看讲座视频和更多内容。
您可以学习如何使用模块 1 中的代码项目设置 Code Composer Studio。还有使用 DriverLib 进行编程。这是这种风格编程的示例
您还可以从 edX 了解有关机电一体化主题的更多信息,并将您的知识应用于任何系统。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !