×

机器人系统研讨会:TI RSLK MAX上的Arduino编程

消耗积分:0 | 格式:zip | 大小:49.65 MB | 2022-11-16

王浩

分享资料个

描述

此页面上提供了研讨会体验所需的一切。

本次研讨会的参与者将获得构建 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 为机器人系统知识提供了先进的垫脚石,但初学者仍然可以通过完整的讲座和实验室活动获得。

实验室 0 - 准备工作

准备好电脑和螺丝刀。建议使用 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.当我们开始编程时,应该加载并准备好示例,但不要担心运行任何代码。接下来,您将要组装您的机器人并使用调试工具对其进行功能测试。

实验 1 - 构建 TI-RSLK MAX 机器人

所需硬件

  • TI-RSLK MAX 套件
  • 6 节 AA 电池
  • 小十字螺丝刀(可选)

在这个实验室中,我们将组装我们的机器人。

您还需要一个电源,我们可以为机器人配备电源,使其真正移动。TI-RSLK 需要 6 节标准 AA 电池。如果您愿意,它也可以配备可充电的镍氢电池,但可更换的碱性电池可以很好地供个人使用,并且可以持续很长时间。

按照这些说明组装您的机器人

TI-RSLK MAX 只是快速组合在一起的几个组件

1) 开始前先观看组装视频并查看施工指南

- 一个。请注意,机箱板应预先安装,因此即使视频涵盖了它,您也无需将其放在上面

- 乙。请注意,视频中没有介绍面包板,但您可以使用下图查看它们的安装位置。您无需解开粘合垫,只需将螺钉穿过粘合剂即可将其拧入支架。要固定支架,您需要卸下电池盖并将固定螺母安装到电池仓内侧的指定位置,以便将支架拧入。

2) 验证所有 LaunchPad 上的 5V 跳线是否已移除,它们应该在工厂完成,但只需验证,否则会导致灾难性故障。

pYYBAGNzcSGABnXdAAA2TtQyUfM035.png
 
pYYBAGNzcSSAMQluAAEUQ6waNt0121.png
 

3) 确保将电机安装座完全固定好,使其与底盘齐平。如果你不这样做,那么你很容易弯曲和折断固定片,这会阻止你完全插入电机,直到那些破损的片被移除,并且可能会在以后导致一些失速问题

pYYBAGNzcSaAHvnuAAB4E6t_Xh4311.png
 

4) 面包板支架放置在蓝色圆圈处

poYBAGNzcSiADh7-AACGqoGh7qA440.jpg
 
pYYBAGNzcSuAVhDNAAC6wznzkQA172.jpg
 

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。如果您发现碰撞开关有任何问题,请确保连接正确对齐。对于线路传感器的任何问题,请确保其方向正确并且所有连接都对齐。

您的机器人已组装并验证功能正常。希望它感觉相当稳定并准备好滚动。

实验 2 - Arduino 编程介绍

所需硬件

  • 组装好的 TI-RSLK MAX(安装电池并进行功能测试)

所需软件

  • Arduino IDE
  • TI-RSLK MAX 机器人库

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。它首先通过前进和后退对线路进行校准。然后您可以通过再次单击该按钮来开始线检测。机器人将尝试保持在线。如果您将机器人设置为较慢的速度,它可能会更好地工作。注意:根据您的线路设置,此示例可能有点棘手,因此请随意跳过。

故障排除

代码不上传?

  • 检查 Arduino 调试窗口中的错误。编译器会告诉你发生了什么。错误以红色文本显示。
  • 有时,您的 LaunchPad 会卡住或挂断之前的代码。拔下 LaunchPad 并将其重新插入以执行完全重置。这称为上电复位。有时使用 RESET 按钮可以工作,但通常最好将电源断开并让微控制器完全复位。
  • 如果您上传失败,则可能是您的驱动程序未正确安装。Arduino IDE 有时会给出错误“未找到未使用的 FET”,这意味着它找不到连接到您的计算机的 LaunchPad。通过运行 TI Cloud Agent 或在本地安装 RSLK 调试工具,确保为您的操作系统下载 USB 驱动程序。还要确保您的 USB 电缆不仅仅是电源。使用包装盒中的一种以获得最佳效果。
  • 如果您对 GUI 或第一个 LED 示例没有任何问题,那么您的 Energia 应该已正确设置。如果遇到任何问题,请重新启动 LaunchPad 并重新启动 Arduino IDE。确保在工具菜单下选择正确的串口和板卡类型。

LED 不亮?

  • 确保您正确上传了代码并正确命名了 LED 引脚的变量。您的 LED 损坏的可能性很小,但我们可以通过使用相同代码闪烁不同的 LED 来验证。
  • 点击重置按钮,有时 LaunchPad 需要这样做才能运行新上传的程序。
 

实验室 3 - 基本自主机器人

所需硬件

  • 组装好的 TI-RSLK MAX

它会导航吗?

我们将继续使用一些更复杂的示例代码来测试我们的机器人。我们可以使用库中的状态机示例。转到文件 > 示例 > 自定义机器人库 > 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)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'机器人系统研讨会:TI RSLK MAX上的Arduino编程',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);