查看: 7346|回复: 40

[资源下载] 【Mind+】自定义用户库,收集贴,最全Mind+用户库

[复制链接]

说明

  • Mind+从V1.6.2开始可以使用用户自定义库了,本帖子收集各种用户库,如有自己写好或发现的Mind+用户库,可以将扩展库链接及功能简介回复本帖子加入此列表。- 点击这里 查看自定义用户库教程

官方示例库

  • OLED12864显示库:https://gitee.com/dfrobot/ext-oled12864.git

  

优秀用户库列表

优秀用户库加载方式:直接搜索库名称中的关键词即可加载。

加载方式

列表:

推荐用户库列表

推荐用户库加载方式:输入网址即可加载。
加载方式

列表:

名称 介绍 加载链接
SHT20防水温湿度传感器 https://gitee.com/chenqi1233/DFRobot-SHT20.git
TM1637数码管 https://gitee.com/liliang9693/ext-TM1637DigitalTube
步进电机库 https://gitee.com/liliang9693/ext-Stepper
甲醛温湿度传感器 https://gitee.com/liliang9693/ext-DFRobot_AirQualityMonitorSensor
掌控宝扩展板 https://gitee.com/liliang9693/ext-parrotshield
掌控板蓝牙 https://gitee.com/liliang9693/ext-MpythonBT
掌控板蓝牙键盘 https://gitee.com/ironpanda/ext-BLEKeyboard
语音识别扩展板 https://gitee.com/chenqi1233/ext-DFRobot_DFR0177_VoiceRecognitionShield
掌控板DS1307时钟模块 https://gitee.com/chenqi1233/ext-esp_DS1307
掌控板4路电机扩展板 https://gitee.com/chenqi1233/ext-esp_Motor
老款10DOF传感器 https://gitee.com/chenqi1233/DFRobot-10DOF

常见问题

模块上显示“不可用”原因为不支持当前主控板、模式(上传/实时)、语言(ArduinoC/micropython),请切换到此用户库支持的状态。
  

加入列表

如有自制用户库,请点击打开并回复用户库收集帖发布自己的用户库,以加入此列表。




屏幕快照 2019-04-04 17.36.55.png

石磊  学徒

发表于 2020-4-2 16:06:22

/******************************************************
* 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[11];
        if (servoID > 31 || !(Time > 0)) { //舵机ID不能打于31,可根据对应控制板修改
                return;
        }
        buf[0] = FRAME_HEADER;                   //填充帧头
        buf[1] = FRAME_HEADER;
        buf[2] = 8;                              //数据长度=要控制舵机数*3+5,此处=1*3+5
        buf[3] = CMD_SERVO_MOVE;                 //填充舵机移动指令
        buf[4] = 1;                              //要控制的舵机个数
        buf[5] = GET_LOW_BYTE(Time);             //填充时间的低八位
        buf[6] = GET_HIGH_BYTE(Time);            //填充时间的高八位
        buf[7] = servoID;                        //舵机ID
        buf[8] = GET_LOW_BYTE(Position);         //填充目标位置的低八位
        buf[9] = 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[103];    //建立缓存
        if (Num < 1 || Num > 32 || !(Time > 0)) {
                return; //舵机数不能为零和大与32,时间不能为零
        }
        buf[0] = FRAME_HEADER;    //填充帧头
        buf[1] = FRAME_HEADER;
        buf[2] = Num * 3 + 5;     //数据长度 = 要控制舵机数*3+5
        buf[3] = CMD_SERVO_MOVE;  //填充舵机移动指令
        buf[4] = Num;             //要控制的舵机个数
        buf[5] = GET_LOW_BYTE(Time); //取得时间的低八位
        buf[6] = GET_HIGH_BYTE(Time); //取得时间的高八位
        uint8_t index = 7;
        for (uint8_t i = 0; i < Num; i++) { //循环填充舵机ID和对应目标位置
                buf[index++] = servos[i].ID; //填充舵机ID
                buf[index++] = GET_LOW_BYTE(servos[i].Position); //填充目标位置低八位
                buf[index++] = GET_HIGH_BYTE(servos[i].Position);//填充目标位置高八位
        }
        SerialX->write(buf, buf[2] + 2); //发送帧,长度为数据长度+两个字节的帧头
}

/*********************************************************************************
* Function:  moveServos
* Description: 控制多个舵机转动
* Parameters:   Num:舵机个数,Time:转动时间,...:舵机ID,转动角,舵机ID,转动角度 如此类推
* Return:       无返回
* Others:
**********************************************************************************/
void LobotServoController::moveServos(uint8_t Num, uint16_t Time, ...)
{
        uint8_t buf[128];
        va_list arg_ptr = NULL;
        va_start(arg_ptr, Time); //取得可变参数首地址
        if (Num < 1 || Num > 32 || (!(Time > 0)) || arg_ptr == NULL) {
                return; //舵机数不能为零和大与32,时间不能为零,可变参数不能为空
        }
        buf[0] = FRAME_HEADER;     //填充帧头
        buf[1] = FRAME_HEADER;
        buf[2] = Num * 3 + 5;      //数据长度 = 要控制舵机数 * 3 + 5
        buf[3] = CMD_SERVO_MOVE;   //舵机移动指令
        buf[4] = Num;              //要控制舵机数
        buf[5] = GET_LOW_BYTE(Time); //取得时间的低八位
        buf[6] = 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[index++] = GET_LOW_BYTE(tmp); //貌似avrgcc中可变参数整形都是十六位
                                                  //再取其低八位
                uint16_t pos = va_arg(arg_ptr, uint16_t); //可变参数中取得对应目标位置
                buf[index++] = GET_LOW_BYTE(pos); //填充目标位置低八位
                buf[index++] = GET_HIGH_BYTE(pos); //填充目标位置高八位
        }
        va_end(arg_ptr);     //置空arg_ptr
        SerialX->write(buf, buf[2] + 2); //发送帧
}


/*********************************************************************************
* Function:  runActionGroup
* Description: 运行指定动作组
* Parameters:   NumOfAction:动作组序号, Times:执行次数
* Return:       无返回
* Others:       Times = 0 时无限循环
**********************************************************************************/
void LobotServoController::runActionGroup(uint8_t numOfAction, uint16_t Times)
{
        uint8_t buf[7];
        buf[0] = FRAME_HEADER;   //填充帧头
        buf[1] = FRAME_HEADER;
        buf[2] = 5;      //数据长度,数据帧除帧头部分数据字节数,此命令固定为5
        buf[3] = CMD_ACTION_GROUP_RUN; //填充运行动作组命令
        buf[4] = numOfAction;      //填充要运行的动作组号
        buf[5] = GET_LOW_BYTE(Times); //取得要运行次数的低八位
        buf[6] = GET_HIGH_BYTE(Times); //取得要运行次数的高八位
        SerialX->write(buf, 7);      //发送数据帧
}

/*********************************************************************************
* Function:  stopActiongGroup
* Description: 停止动作组运行
* Parameters:   Speed: 目标速度
* Return:       无返回
* Others:
**********************************************************************************/
void LobotServoController::stopActionGroup(void)
{
        uint8_t buf[4];
        buf[0] = FRAME_HEADER;     //填充帧头
        buf[1] = FRAME_HEADER;
        buf[2] = 2;                //数据长度,数据帧除帧头部分数据字节数,此命令固定为2
        buf[3] = 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[7];
        buf[0] = FRAME_HEADER;     //填充帧头
        buf[1] = FRAME_HEADER;
        buf[2] = 5;                //数据长度,数据帧除帧头部分数据字节数,此命令固定为5
        buf[3] = CMD_ACTION_GROUP_SPEED; //填充设置动作组速度命令
        buf[4] = numOfAction;      //填充要设置的动作组号
        buf[5] = GET_LOW_BYTE(Speed); //获得目标速度的低八位
        buf[6] = 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[4];
        buf[0] = FRAME_HEADER;         //填充帧头
        buf[1] = FRAME_HEADER;
        buf[2] = 2;                   //数据长度,数据帧除帧头部分数据字节数,此命令固定为2
        buf[3] = CMD_GET_BATTERY_VOLTAGE; //填充后的电池电压命令

        SerialX->write(buf, 4);        //发送数据帧
}


/*********************************************************************************
* Function:  receiveHandle
* Description: 处理串口接收数据
* Parameters:   无输入参数
* Return:       无返回
* Others:
**********************************************************************************/
void LobotServoController::receiveHandle()
{
        uint8_t buf[16];
        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[0]) {
                        case BATTERY_VOLTAGE: //电池电压指令
                                batteryVoltage = BYTE_TO_HW(buf[2], buf[1]); //高低八位组合成电池电压
                                break;
                        case ACTION_GROUP_RUNNING:         //有动作组被运行
                                numOfActinGroupRunning = buf[1]; //获得运行中动作组号
                                actionGroupRunTimes = BYTE_TO_HW(buf[3], buf[2]); //高低八位组合成运行次数
                                isRunning = true; //设置运行中标识为真
                                break;
                        case ACTION_GROUP_STOPPED: //动作组停止
                        case  ACTION_GROUP_COMPLETE://动作组运行完成
                                isRunning = false; //设置运行中标识为假
                                numOfActinGroupRunning = 0xFF; //设置运行中动作组号为0xFF
                                actionGroupRunTimes = 0; //设置运行次数为0
                                break;
                        default:
                                break;
                        }
                default:
                        len = 0;
                        getHeader = 0;
                        break;
                }
        } while (SerialX->available());
}
回复

使用道具 举报

石磊  学徒

发表于 2020-4-2 16:33:51

/******************************************************
* 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_SPEED  0x0B   //设置动作组运行速度指令
#define CMD_GET_BATTERY_VOLTAGE 0x0F   //获得电池电压指令

//接收部分的指令
#define BATTERY_VOLTAGE       0x0F  //电池电压
#define ACTION_GROUP_RUNNING  0x06  //动作组被运行
#define ACTION_GROUP_STOPPED  0x07  //动作组被停止
#define ACTION_GROUP_COMPLETE 0x08  //动作组完成

struct LobotServo {  //舵机ID和位置结构体
  uint8_t  ID;       //舵机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_t  numOfActinGroupRunning; //正在运行的动作组序号
    uint16_t actionGroupRunTimes; //正在运行的动作组运行次数
    bool isRunning; //有动作组运行?
    uint16_t batteryVoltage; //控制板电池电压

    HardwareSerial *SerialX;
};
#endif
回复

使用道具 举报

foxzenith  见习技师

发表于 2020-4-3 09:48:14

代码应该敲的东 发表于 2020-3-27 17:33
码云链接:https://gitee.com/dong223/dai-ext-PAJ7620U2-Gesture-Sensor

gitee的下载本地无法加载,直接在线加载可以成功。但是编译也如刚才那个同学所说,出错。原因是有个arduinoC/_menus/arduino.json文件是空的
回复

使用道具 举报

gada888  版主

发表于 2019-10-31 12:17:20

喜欢mind+。入门贼方便
回复

使用道具 举报

DFrJ5KYVQaH  初级技匠

发表于 2019-12-29 10:06:46

又有新版本了,真高兴
回复

使用道具 举报

huagulo  学徒

发表于 2020-1-6 10:58:44

有mac版吗
回复

使用道具 举报

Forgotten  版主
 楼主|

发表于 2020-1-8 11:02:33


有的,可以直接官网下载
http://mindplus.cc
回复

使用道具 举报

redtxd  见习技师

发表于 2020-2-12 16:41:13

问一下各位老师:iPad能装Mac版的Mind+吗。
回复

使用道具 举报

Forgotten  版主
 楼主|

发表于 2020-3-16 11:07:02

redtxd 发表于 2020-2-12 16:41
问一下各位老师:iPad能装Mac版的Mind+吗。

不可以的,可以尝试一下直接用chrome浏览器打开在线版mind+
回复

使用道具 举报

Ski  初级技师

发表于 2020-3-16 16:17:20

好强大

欢迎来分享
回复

使用道具 举报

Ski  初级技师

发表于 2020-3-17 16:29:09

202003173252..png https://gitee.com/csq5277/ext--LM35.git 202003174668..png
回复

使用道具 举报

Sev7nKarat克拉  见习技师

发表于 2020-3-22 10:05:30

有人写了OTTO库吗
回复

使用道具 举报

Nick-ccq  初级技师

发表于 2020-3-24 11:10:03


目前正在写。
回复

使用道具 举报

代码应该敲的东  初级技师

发表于 2020-3-27 17:33:08

回复

使用道具 举报

代码应该敲的东  初级技师

发表于 2020-3-27 19:37:07

代码应该敲的东 发表于 2020-3-26 17:14
https://github.com/dong223/dai-ext-PAJ7620U2-Gesture-Sensor-

这个github云端加载,会编译出错
回复

使用道具 举报

石磊  学徒

发表于 2020-3-31 16:20:55

真的很喜欢Mind+这款软件,请问如何添加16路舵机控制板模块
回复

使用道具 举报

Forgotten  版主
 楼主|

发表于 2020-3-31 19:53:57

石磊 发表于 2020-3-31 16:20
真的很喜欢Mind+这款软件,请问如何添加16路舵机控制板模块

可以按照用户库的教程,移植16路舵机驱动板的arduio库
回复

使用道具 举报

石磊  学徒

发表于 2020-4-1 09:43:52

Forgotten 发表于 2020-3-31 19:53
可以按照用户库的教程,移植16路舵机驱动板的arduio库

您的意思是需要我自己编写吗?如果我没有代码基础请问能帮助我解决吗?
回复

使用道具 举报

石磊  学徒

发表于 2020-4-1 10:02:14

Forgotten 发表于 2020-3-31 19:53
可以按照用户库的教程,移植16路舵机驱动板的arduio库

您的意思是需要我自己编写吗?如果我没有代码基础请问能帮助我解决吗?
回复

使用道具 举报

Forgotten  版主
 楼主|

发表于 2020-4-1 10:58:03

石磊 发表于 2020-4-1 10:02
您的意思是需要我自己编写吗?如果我没有代码基础请问能帮助我解决吗? ...

如果搞不定可以把这个东西的资料给出来,然后帮忙测试
回复

使用道具 举报

石磊  学徒

发表于 2020-4-1 16:48:20

一共两款16路舵机控制板。这是第一款

第一款舵机控制板样式

第一款舵机控制板样式

产品特点

产品特点

产品参数

产品参数
回复

使用道具 举报

石磊  学徒

发表于 2020-4-1 16:53:07

这是第二款

产品样式

产品样式

产品参数1

产品参数1

产品参数2

产品参数2
回复

使用道具 举报

12下一页
高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2020 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail