【Mind+】自定义用户库,收集贴,最全Mind+用户库
本帖最后由 Forgotten 于 2023-9-26 17:08 编辑##说明
- Mind+从V1.6.2开始可以使用用户自定义库了,本帖子收集各种用户库,如有自己写好或发现的Mind+用户库,可以将扩展库链接及功能简介回复本帖子加入此列表。- [点击这里](https://mindplus.dfrobot.com.cn/extensions-user "点击这里") 查看**自定义用户库教程**。
## 收录用户库列表
>**收录用户库加载方式:**直接搜索库名称中的关键词即可加载。
[![加载方式](https://img.dfrobot.com.cn/wiki/none/0d81d3fc79517d0c196db6d6f61d320e "加载方式")](https://mindplus.dfrobot.com.cn/extensions-user "加载方式")
## 加入收录列表
如有自制用户库,可回复本帖,经过管理员审核后可通过关键词搜索。 如果用户库已经收录,需要更新,则可以继续回帖,给出仓库名称和更新后的版本号。
回复格式:
1、扩展库加载界面图片或功能介绍:
2、积木截图:
3、git仓库链接(需要可以通过链接直接正常加载):
【可参考本帖置顶回复的格式】
本帖最后由 Forgotten 于 2022-1-12 12:10 编辑
1、扩展库加载界面图片:
2、积木截图:
3、git仓库链接(已测试可以通过链接直接正常加载):
https://gitee.com/csq5277/ext--LM35.git
/******************************************************
* FileName: LobotServoController.cpp
* Description: Lobot舵机控制板二次开发库,本文件包含
了此库的具体实现
*****************************************************/
#include "LobotServoController.h"
#define GET_LOW_BYTE(A) (uint8_t)((A))
//宏函数 获得A的低八位
#define GET_HIGH_BYTE(A) (uint8_t)((A) >> 8)
//宏函数 获得A的高八位
#define BYTE_TO_HW(A, B) ((((uint16_t)(A)) << 8) | (uint8_t)(B))
//宏函数 以A为高八位 B为低八位 合并为16位整形
LobotServoController::LobotServoController()
{
//初始化运行中动作组号为0xFF,运行次数为0,运行中标识为假,电池电压为0
numOfActinGroupRunning = 0xFF;
actionGroupRunTimes = 0;
isRunning = false;
batteryVoltage = 0;
#if defined(__AVR_ATmega32U4__)//for Arduino Leonardo,Micro....
SerialX = &Serial1;
#else
SerialX = &Serial;
#endif
}
LobotServoController::LobotServoController(HardwareSerial &A)
{
LobotServoController();
SerialX = &A;
}
LobotServoController::~LobotServoController()
{
}
/*********************************************************************************
* Function:moveServo
* Description: 控制单个舵机转动
* Parameters: sevoID:舵机ID,Position:目标位置,Time:转动时间
舵机ID取值:0<=舵机ID<=31,Time取值: Time > 0
* Return: 无返回
* Others:
**********************************************************************************/
void LobotServoController::moveServo(uint8_t servoID, uint16_t Position, uint16_t Time)
{
uint8_t buf;
if (servoID > 31 || !(Time > 0)) { //舵机ID不能打于31,可根据对应控制板修改
return;
}
buf = FRAME_HEADER; //填充帧头
buf = FRAME_HEADER;
buf = 8; //数据长度=要控制舵机数*3+5,此处=1*3+5
buf = CMD_SERVO_MOVE; //填充舵机移动指令
buf = 1; //要控制的舵机个数
buf = GET_LOW_BYTE(Time); //填充时间的低八位
buf = GET_HIGH_BYTE(Time); //填充时间的高八位
buf = servoID; //舵机ID
buf = GET_LOW_BYTE(Position); //填充目标位置的低八位
buf = GET_HIGH_BYTE(Position); //填充目标位置的高八位
SerialX->write(buf, 10);
}
/*********************************************************************************
* Function:moveServos
* Description: 控制多个舵机转动
* Parameters: servos[]:舵机结体数组,Num:舵机个数,Time:转动时间
0 < Num <= 32,Time > 0
* Return: 无返回
* Others:
**********************************************************************************/
void LobotServoController::moveServos(LobotServo servos[], uint8_t Num, uint16_t Time)
{
uint8_t buf; //建立缓存
if (Num < 1 || Num > 32 || !(Time > 0)) {
return; //舵机数不能为零和大与32,时间不能为零
}
buf = FRAME_HEADER; //填充帧头
buf = FRAME_HEADER;
buf = Num * 3 + 5; //数据长度 = 要控制舵机数*3+5
buf = CMD_SERVO_MOVE;//填充舵机移动指令
buf = Num; //要控制的舵机个数
buf = GET_LOW_BYTE(Time); //取得时间的低八位
buf = GET_HIGH_BYTE(Time); //取得时间的高八位
uint8_t index = 7;
for (uint8_t i = 0; i < Num; i++) { //循环填充舵机ID和对应目标位置
buf = servos.ID; //填充舵机ID
buf = GET_LOW_BYTE(servos.Position); //填充目标位置低八位
buf = GET_HIGH_BYTE(servos.Position);//填充目标位置高八位
}
SerialX->write(buf, buf + 2); //发送帧,长度为数据长度+两个字节的帧头
}
/*********************************************************************************
* Function:moveServos
* Description: 控制多个舵机转动
* Parameters: Num:舵机个数,Time:转动时间,...:舵机ID,转动角,舵机ID,转动角度 如此类推
* Return: 无返回
* Others:
**********************************************************************************/
void LobotServoController::moveServos(uint8_t Num, uint16_t Time, ...)
{
uint8_t buf;
va_list arg_ptr = NULL;
va_start(arg_ptr, Time); //取得可变参数首地址
if (Num < 1 || Num > 32 || (!(Time > 0)) || arg_ptr == NULL) {
return; //舵机数不能为零和大与32,时间不能为零,可变参数不能为空
}
buf = FRAME_HEADER; //填充帧头
buf = FRAME_HEADER;
buf = Num * 3 + 5; //数据长度 = 要控制舵机数 * 3 + 5
buf = CMD_SERVO_MOVE; //舵机移动指令
buf = Num; //要控制舵机数
buf = GET_LOW_BYTE(Time); //取得时间的低八位
buf = GET_HIGH_BYTE(Time); //取得时间的高八位
uint8_t index = 7;
for (uint8_t i = 0; i < Num; i++) { //从可变参数中取得并循环填充舵机ID和对应目标位置
uint16_t tmp = va_arg(arg_ptr, uint16_t); //可参数中取得舵机ID
buf = GET_LOW_BYTE(tmp); //貌似avrgcc中可变参数整形都是十六位
//再取其低八位
uint16_t pos = va_arg(arg_ptr, uint16_t); //可变参数中取得对应目标位置
buf = GET_LOW_BYTE(pos); //填充目标位置低八位
buf = GET_HIGH_BYTE(pos); //填充目标位置高八位
}
va_end(arg_ptr); //置空arg_ptr
SerialX->write(buf, buf + 2); //发送帧
}
/*********************************************************************************
* Function:runActionGroup
* Description: 运行指定动作组
* Parameters: NumOfAction:动作组序号, Times:执行次数
* Return: 无返回
* Others: Times = 0 时无限循环
**********************************************************************************/
void LobotServoController::runActionGroup(uint8_t numOfAction, uint16_t Times)
{
uint8_t buf;
buf = FRAME_HEADER; //填充帧头
buf = FRAME_HEADER;
buf = 5; //数据长度,数据帧除帧头部分数据字节数,此命令固定为5
buf = CMD_ACTION_GROUP_RUN; //填充运行动作组命令
buf = numOfAction; //填充要运行的动作组号
buf = GET_LOW_BYTE(Times); //取得要运行次数的低八位
buf = GET_HIGH_BYTE(Times); //取得要运行次数的高八位
SerialX->write(buf, 7); //发送数据帧
}
/*********************************************************************************
* Function:stopActiongGroup
* Description: 停止动作组运行
* Parameters: Speed: 目标速度
* Return: 无返回
* Others:
**********************************************************************************/
void LobotServoController::stopActionGroup(void)
{
uint8_t buf;
buf = FRAME_HEADER; //填充帧头
buf = FRAME_HEADER;
buf = 2; //数据长度,数据帧除帧头部分数据字节数,此命令固定为2
buf = CMD_ACTION_GROUP_STOP; //填充停止运行动作组命令
SerialX->write(buf, 4); //发送数据帧
}
/*********************************************************************************
* Function:setActionGroupSpeed
* Description: 设定指定动作组的运行速度
* Parameters: NumOfAction: 动作组序号 , Speed:目标速度
* Return: 无返回
* Others:
**********************************************************************************/
void LobotServoController::setActionGroupSpeed(uint8_t numOfAction, uint16_t Speed)
{
uint8_t buf;
buf = FRAME_HEADER; //填充帧头
buf = FRAME_HEADER;
buf = 5; //数据长度,数据帧除帧头部分数据字节数,此命令固定为5
buf = CMD_ACTION_GROUP_SPEED; //填充设置动作组速度命令
buf = numOfAction; //填充要设置的动作组号
buf = GET_LOW_BYTE(Speed); //获得目标速度的低八位
buf = GET_HIGH_BYTE(Speed); //获得目标熟读的高八位
SerialX->write(buf, 7); //发送数据帧
}
/*********************************************************************************
* Function:setAllActionGroupSpeed
* Description: 设置所有动作组的运行速度
* Parameters: Speed: 目标速度
* Return: 无返回
* Others:
**********************************************************************************/
void LobotServoController::setAllActionGroupSpeed(uint16_t Speed)
{
setActionGroupSpeed(0xFF, Speed); //调用动作组速度设定,组号为0xFF时设置所有组的速度
}
/*********************************************************************************
* Function:getBatteryVoltage
* Description: 发送获取电池电压命令
* Parameters: 无输入参数
* Return: 无返回
* Others:
**********************************************************************************/
void LobotServoController::getBatteryVoltage()
{
uint8_t buf;
buf = FRAME_HEADER; //填充帧头
buf = FRAME_HEADER;
buf = 2; //数据长度,数据帧除帧头部分数据字节数,此命令固定为2
buf = CMD_GET_BATTERY_VOLTAGE; //填充后的电池电压命令
SerialX->write(buf, 4); //发送数据帧
}
/*********************************************************************************
* Function:receiveHandle
* Description: 处理串口接收数据
* Parameters: 无输入参数
* Return: 无返回
* Others:
**********************************************************************************/
void LobotServoController::receiveHandle()
{
uint8_t buf;
static uint8_t len = 0;
static uint8_t getHeader = 0;
if (!SerialX->available())
return;
//如果没有数据则返回
do {
switch (getHeader) {
case 0:
if (SerialX->read() == FRAME_HEADER)
getHeader = 1;
break;
case 1:
if (SerialX->read() == FRAME_HEADER)
getHeader = 2;
else
getHeader = 0;
break;
case 2:
len = SerialX->read();
getHeader = 3;
break;
case 3:
if (SerialX->readBytes(buf, len - 1) > 0)
getHeader = 4;
else{
len = 0;
getHeader = 0;
break;
}
case 4:
switch (buf) {
case BATTERY_VOLTAGE: //电池电压指令
batteryVoltage = BYTE_TO_HW(buf, buf); //高低八位组合成电池电压
break;
case ACTION_GROUP_RUNNING: //有动作组被运行
numOfActinGroupRunning = buf; //获得运行中动作组号
actionGroupRunTimes = BYTE_TO_HW(buf, buf); //高低八位组合成运行次数
isRunning = true; //设置运行中标识为真
break;
case ACTION_GROUP_STOPPED: //动作组停止
caseACTION_GROUP_COMPLETE://动作组运行完成
isRunning = false; //设置运行中标识为假
numOfActinGroupRunning = 0xFF; //设置运行中动作组号为0xFF
actionGroupRunTimes = 0; //设置运行次数为0
break;
default:
break;
}
default:
len = 0;
getHeader = 0;
break;
}
} while (SerialX->available());
} /******************************************************
* FileName: LobotServoController.h
* Description: Lobot舵机控制板二次开发库的宏定义、类等
*****************************************************/
#ifndef LOBOTSERVOCONTROLLER_H
#define LOBOTSERVOCONTROLLER_H
#include <Arduino.h>
//发送部分的指令
#define FRAME_HEADER 0x55 //帧头
#define CMD_SERVO_MOVE 0x03 //舵机移动指令
#define CMD_ACTION_GROUP_RUN 0x06 //运行动作组指令
#define CMD_ACTION_GROUP_STOP 0x07 //停止动作组运行指令
#define CMD_ACTION_GROUP_SPEED0x0B //设置动作组运行速度指令
#define CMD_GET_BATTERY_VOLTAGE 0x0F //获得电池电压指令
//接收部分的指令
#define BATTERY_VOLTAGE 0x0F//电池电压
#define ACTION_GROUP_RUNNING0x06//动作组被运行
#define ACTION_GROUP_STOPPED0x07//动作组被停止
#define ACTION_GROUP_COMPLETE 0x08//动作组完成
struct LobotServo {//舵机ID和位置结构体
uint8_tID; //舵机ID
uint16_t Position; //舵机数据
};
class LobotServoController {
public:
LobotServoController();
LobotServoController(HardwareSerial &A);
~LobotServoController();
void moveServo(uint8_t servoID, uint16_t Position, uint16_t Time);
void moveServos(LobotServo servos[], uint8_t Num, uint16_t Time);
void moveServos(uint8_t Num,uint16_t Time, ...);
void runActionGroup(uint8_t NumOfAction, uint16_t Times);
void stopActionGroup(void);
void setActionGroupSpeed(uint8_t NumOfAction, uint16_t Speed);
void setAllActionGroupSpeed(uint16_t Speed);
void getBatteryVoltage(void);
void receiveHandle(void);
public:
uint8_tnumOfActinGroupRunning; //正在运行的动作组序号
uint16_t actionGroupRunTimes; //正在运行的动作组运行次数
bool isRunning; //有动作组运行?
uint16_t batteryVoltage; //控制板电池电压
HardwareSerial *SerialX;
};
#endif
好厉害!!! 喜欢mind+。入门贼方便 又有新版本了,真高兴 有mac版吗 huagulo 发表于 2020-1-6 10:58
有mac版吗
有的,可以直接官网下载
http://mindplus.cc 问一下各位老师:iPad能装Mac版的Mind+吗。 redtxd 发表于 2020-2-12 16:41
问一下各位老师:iPad能装Mac版的Mind+吗。
不可以的,可以尝试一下直接用chrome浏览器打开在线版mind+
好强大
欢迎来分享 有人写了OTTO库吗 Sev7nKarat克拉 发表于 2020-3-22 10:05有人写了OTTO库吗
目前正在写。
https://github.com/dong223/dai-ext-PAJ7620U2-Gesture-Sensor-
码云链接:https://gitee.com/dong223/dai-ext-PAJ7620U2-Gesture-Sensor 代码应该敲的东 发表于 2020-3-26 17:14
https://github.com/dong223/dai-ext-PAJ7620U2-Gesture-Sensor-
这个github云端加载,会编译出错 真的很喜欢Mind+这款软件,请问如何添加16路舵机控制板模块 石磊 发表于 2020-3-31 16:20
真的很喜欢Mind+这款软件,请问如何添加16路舵机控制板模块
可以按照用户库的教程,移植16路舵机驱动板的arduio库 Forgotten 发表于 2020-3-31 19:53
可以按照用户库的教程,移植16路舵机驱动板的arduio库
您的意思是需要我自己编写吗?如果我没有代码基础请问能帮助我解决吗? Forgotten 发表于 2020-3-31 19:53
可以按照用户库的教程,移植16路舵机驱动板的arduio库
您的意思是需要我自己编写吗?如果我没有代码基础请问能帮助我解决吗? 石磊 发表于 2020-4-1 10:02
您的意思是需要我自己编写吗?如果我没有代码基础请问能帮助我解决吗? ...
如果搞不定可以把这个东西的资料给出来,然后帮忙测试 一共两款16路舵机控制板。这是第一款 这是第二款