一、概述

这是一个可以用Python代码控制、WINDOWS上位机控制、UART通讯编程控制、电位器手动控制共四种方式调节的PWM驱动器。用于直流电机调速、灯光调节等应用场景。

本产品支持5V~24V宽电压输入,并具有10A的承载能力,能驱动50W左右的直流电机或者整卷5米左右的灯带。

适用于水泵水量控制、散热风扇速度控制、灯光亮度调节、电动工具改造、电机灯带产品测试、电机速度自动化控制、灯光效果自动化控制等场景。

二、产品特点

  1. Python代码编程,无需主板或转接器。USB直连电脑,简单易用。
  2. Windows软件控制,无需编程,USB即插即用。
  3. UART通讯控制,可方便嵌入设备长期使用。
  4. 外接电位器控制,手动控制,无需编程。
  5. ModBus RTU协议,协议公开,可灵活定制自己的控制方式。
  6. 5V~24V宽电压支持,适配更多的电机和灯带。
  7. 大电流MOS管驱动,10A承载能力。

三、应用场景

Python代码控制

  1. 连接USB接口,可直接使用Python代码对电机速度、灯光进行自动化控制。无需额外增加主板或者转接器。
  2. 不论是windows电脑、苹果电脑、树莓派、工控机电脑还是LattePanda均可非常方便的驱动。

WINDOWS电脑控制:

  1. 电脑散热风扇、散热水泵的改造。可直接在电脑上手动调节,也可以读取CPU温度自动调节。
  2. 由于上位机可精确调节频率和占空比,可用于测试电机产品或者灯带产品。或者用于小设备优化改造。
  3. 制作在电脑上控制的办公小风扇,风速可自动调节或者在电脑上调节。插上USB即可使用。

主控板编程控制:

  1. 制作特殊效果或者特定时间开启或者调节灯光大小的项目。或者和传感器配合的项目。例如自动调节风力的风扇,自动控制亮度的灯带。
  2. 鱼缸或者浇花的水泵出水量的自动控制。
  3. 节日氛围灯的自动控制。

电位器手动控制:

  1. 家电改造,制作可调风扇。
  2. 电动工具制作,改造,可调转速。
  3. 灯带灯光控制改造。
  4. 鱼缸或浇花水泵的出水量控制。

四、技术规格

五、产品尺寸图

六、功能指示图

七、WINDOWS软件控制外设

本产品提供了windows软件控制的方式。可使用windows电脑对PWM的各项参数进行控制。从而在电脑端直接控制电机的速度或者灯光的亮度。

注:目前仅在win10下测试通过,其它版本操作系统未经测试。

1、连接设备

使用本产品前,你需要准备如下配件:

  1. 一台Windows10电脑
  2. 被控制的电机或者灯带
  3. 一根TYPE-C数据线
  4. 一个符合要求的电源(电压:5V~24V 功率大于2A 。需根据被控制的设备功率选择对应电压和功率的电源)

连接好Gravity连接线、电源线、被控制的电机或灯光设备。并将切换开关拨动到UART/COM 侧。如下图所示:

2、安装USB驱动程序

驱动下载

如果你从未使用过本产品,那么你可能需要下载并安装USB驱动程序。

USB驱动下载链接(两个链接地址的内容一样,可任意选择一个地址进行下载):

https://github.com/DFRobot/CH_Driver

http://download.dfrobot.top/CH_Drive/

驱动说明

windows驱动: CH340/CH341USB转串口WINDOWS驱动程序,内含DLL动态库及非标准波特率的设置等使用说明,支持32/64位 Windows 10/8.1/8/7/VISTA/XP,SERVER 2016/2012/2008/2003,2000/ME/98,通过微软数字签名认证,支持USB转3线和9线串口。

Linux驱动: CH340/CH341的USB转串口LINUX驱动程序,支持32/64位系统。

MAC驱动: CH340/CH341的USB转串口MAC OS驱动程序,支持32/64位系统,内有使用说明。

安卓驱动: CH340/CH341的USB转串口安卓免驱应用库,用于Android操作系统3.1及以上版本的USB Host模式,无需加载Android内核驱动,无需root权限操作。包含apk安装程序,lib库文件(Java Driver),App Demo例程(USB转UART Demo工程SDK)。

3、下载windows控制程序包

下载链接:https://github.com/DFRobot/DRI0050_soft_V1.0

下载后无需安装,解压缩即可。解压缩后,双击 “Light and Motor Driver .exe” 文件,开始运行。

软件界面如图所示:

  1. 使用USB-TYPE-C数据线将本产品连接到电脑后,如果安装了驱动程序,本软件会自动识别。
  2. 点击开始按钮后,电脑与PWM模块通讯成功,此时,就可以对PWM的频率和占空比进行实时调节。
  3. 频率调节的输入范围为0-255,可手动输入,也可拖动条控制,对应的真实频率显示在界面右侧。
  4. 本产品为单通道PWM控制,所以,只有通道一的占空比调节可以使用。可在输入框内手动输入占空比,输入范围0-255,也可通过拖动条控制。
  5. 复选框可开启或者关闭PWM控制。

八、Python编程控制外设

当你把本产品使用USB线连接到电脑上后,你不仅可以使用客户端进行控制,你还可以在windows平台、MAC平台、Linux平台等多平台通过Python编程的方式对电机或者灯带进行控制。

注:Windows平台需要安装python3.5+版本,推荐最新版Python 。

大部分Linux平台已经预装了Python3,如果没有安装,请自行安装Python3.5+版本。

你可以使用两种方法来进行python编程:

  1. Python pinpong库编程方式: pingpong库是DFRobot集成了众多硬件控制的python库,使用pinpong库能大幅度的简化编程代码。

  2. Python直接编程方式(无需pinpong库): 使用这种方式代码会比较繁多,但是不用调用pinpong库也可以使用Python控制。

全平台Python_Pinpong库控制外设

使用如下命令安装pinpong库:

pip3 install pinpong

使用Pinpong库控制设备(适用于Linux和Windows平台)

程序提供了可控制的基本命令,你可根据你的实际情况来选择你程序控制方式,你的编程平台等。

# -*- coding: utf-8 -*-
'''
PWM频率高于2K,频率和设定值可能存在较大偏差
频率高于2K请参考使用如下的频率值
46875HZ, 23437HZ, 15625HZ, 11718HZ,
9375HZ, 7812HZ, 6696HZ, 5859HZ, 5208HZ, 4687HZ, 4261HZ,
3906HZ, 3605HZ, 3348HZ, 3125HZ,
2929HZ, 2757HZ, 2604HZ, 2467HZ, 2343HZ, 2232HZ, 2130HZ, 2038HZ,
'''

import time
from pinpong.board import Board
from pinpong.libs.dfrobot_dri0050 import DRI0050 #从libs中导入 DRI0050 库

#Board("RPi").begin()  #RPi Linux 平台
Board("Win").begin() #windows平台

#pwmd = DRI0050(port="/dev/ttyUSB0") #RPi Linux平台
pwmd = DRI0050(port="COM12")  #Windows平台

print("version=0x{:x}, addr=0x{:x}".format(pwmd.get_version(), pwmd.get_addr()))
print("pid=0x{:x}, vid=0x{:x}".format(pwmd.get_vid(), pwmd.get_pid()))

while True:
  print("\n--------初始值------") 
  print("freq={}, duty={:.2f} enable={}".format(pwmd.get_freq(), pwmd.get_duty(), pwmd.get_enable()))  

  print("--------设置新值------")  
  #pwmd.pwm(freq=860,duty=0.82) # freq(183HZ-46875HZ) duty(0%-100%)
  pwmd.set_freq(860) #(183HZ-46875HZ)
  pwmd.set_duty(0.82)#(0%-100%)
  pwmd.set_enable(1)
  print("freq={}, duty={:.2f} enable={}".format(pwmd.get_freq(), pwmd.get_duty(), pwmd.get_enable()))

  print("--------恢复出厂设置(366HZ, 占空比50%, 禁止输出)-------\n")
  pwmd.pwm(freq=366,duty=0.5) # freq(183HZ-46875HZ) duty(0%-100%)
  pwmd.set_enable(0)
  time.sleep(5)

全平台Python控制外设

使用如下命令安装串口库和modbus库:

pip3 install serial
pip3 install modbus_tk

程序提供了可控制的基本命令,你可根据你的实际情况来选择你程序控制方式,你的编程平台等。

# -*- coding: utf-8 -*-
'''
PWM频率高于2K,频率和设定值可能存在较大偏差
频率高于2K请参考使用如下的频率值
46875HZ, 23437HZ, 15625HZ, 11718HZ,
9375HZ, 7812HZ, 6696HZ, 5859HZ, 5208HZ, 4687HZ, 4261HZ,
3906HZ, 3605HZ, 3348HZ, 3125HZ,
2929HZ, 2757HZ, 2604HZ, 2467HZ, 2343HZ, 2232HZ, 2130HZ, 2038HZ,
'''

import time
import serial
import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu

PORT="COM12" #windows平台
#PORT="/dev/ttyUSB0" #Linux平台
BAUDRATE=9600
SLAVE_ADDR=0x32

PID_REG       =  0x00
VID_REG       =  0x01
ADDR_REG      =  0x02
VER_REG       =  0x05
DUTY_REG      =  0x06
FREQ_REG      =  0x07
PWM_EN_REG    =  0x08

ser = serial.Serial(port=PORT,baudrate=BAUDRATE, bytesize=8, parity='N', stopbits=1)
master = modbus_rtu.RtuMaster(ser)
time.sleep(0.5)

def get_pid():
  data = master.execute(SLAVE_ADDR, cst.READ_HOLDING_REGISTERS, PID_REG, 1)
  time.sleep(0.03)
  return data[0]

def get_vid():
  data = master.execute(SLAVE_ADDR, cst.READ_HOLDING_REGISTERS, VID_REG, 1)
  time.sleep(0.03)
  return data[0]

def get_addr():
  data = master.execute(SLAVE_ADDR, cst.READ_HOLDING_REGISTERS, ADDR_REG, 1)
  time.sleep(0.03)
  return data[0]

def get_version():
  data = master.execute(SLAVE_ADDR, cst.READ_HOLDING_REGISTERS, VER_REG, 1)
  time.sleep(0.03)
  return data[0]

def get_duty():
  data = master.execute(SLAVE_ADDR, cst.READ_HOLDING_REGISTERS, DUTY_REG, 1)
  time.sleep(0.03)
  return data[0]/255

def get_freq():
  data = master.execute(SLAVE_ADDR, cst.READ_HOLDING_REGISTERS, FREQ_REG, 1)
  time.sleep(0.03)
  return int(12*1000*1000/256/(data[0]+1))

def get_enable():
  data = master.execute(SLAVE_ADDR, cst.READ_HOLDING_REGISTERS, PWM_EN_REG, 1)
  time.sleep(0.03)
  return data[0]

def set_duty(duty):
  master.execute(SLAVE_ADDR, cst.WRITE_SINGLE_REGISTER, DUTY_REG, output_value=int(duty*255))
  time.sleep(0.03)

def set_freq(freq):
  master.execute(SLAVE_ADDR, cst.WRITE_SINGLE_REGISTER, FREQ_REG, output_value=int(12*1000*1000/256/freq) - 1)
  time.sleep(0.03)

def set_enable(enable):
  master.execute(SLAVE_ADDR, cst.WRITE_SINGLE_REGISTER, PWM_EN_REG, output_value=enable)
  time.sleep(0.03)

def pwm(freq, duty):
  v=[]
  v.append(int(duty*255))
  v.append(int(12*1000*1000/256/freq) - 1)
  master.execute(SLAVE_ADDR, cst.WRITE_MULTIPLE_REGISTERS, DUTY_REG, output_value=v)
  time.sleep(0.03)


print("version=0x{:x}, addr=0x{:x}".format(get_version(), get_addr()))
print("pid=0x{:x}, vid=0x{:x}".format(get_vid(), get_pid()))

print("\n--------初始值------") 
print("freq={}, duty={:.2f} enable={}".format(get_freq(), get_duty(), get_enable()))  

print("--------设置新值------")  
#pwm(freq=860,duty=0.82) # freq(183HZ-46875HZ) duty(0%-100%)
set_freq(860) #(183HZ-46875HZ)
set_duty(0.82)#(0%-100%)
set_enable(1)
print("freq={}, duty={:.2f} enable={}".format(get_freq(), get_duty(), get_enable()))

print("--------恢复出厂设置(366HZ, 占空比50%, 禁止输出)-------\n")
pwm(freq=366, duty=0.5) # freq(183HZ-46875HZ) duty(0%-100%)
set_enable(0)

九、Arduino编程控制外设

使用Arduino控制前,你需要准备如下配件:

  1. ArduinoUNO主板
  2. 被控制的电机或者灯带
  3. 一根4P的Gravity连接线
  4. 一个符合要求的电源(电压:5V~24V 功率大于2A 。需根据被控制的设备功率选择对应电压和功率的电源)

连接好Gravity连接线、电源线、被控制的电机或灯光设备。并将切换开关拨动到UART/COM 侧。如下图所示:

代码功能说明:让灯带按2秒的频率交替闪烁。

#define  PWM_ENABLE           0x01
#define  PWM_DISENABLE        0x00
#define  DEV_ADDR             0x32
#define  DUTY_REG_ADDR        0x0006
#define  FREQ_REG_ADDR        0x0007
#define  PWM_EN_REG_ADDR      0x0008


static uint16_t CheckCRC(uint8_t *data, uint8_t len){
  uint16_t crc = 0xFFFF;
  for(uint8_t pos = 0; pos < len; pos++){
    crc ^= (uint16_t)data[pos];
    for(uint8_t i = 8; i != 0; i-- ){
      if((crc & 0x0001) != 0){
        crc >>= 1;
        crc ^= 0xA001;
      }else{
        crc >>= 1;
      }
    }
  }
  crc = ((crc & 0x00FF) << 8) | ((crc & 0xFF00) >> 8);
  return crc;
}

static void WriteRegValue(uint16_t regAddr, uint16_t value){
  uint8_t tempData[8];
  uint16_t crc;
  tempData[0] = DEV_ADDR;
  tempData[1] = 0x06;
  tempData[2] = (regAddr >> 8) & 0xFF;
  tempData[3] = regAddr & 0xFF;
  tempData[4] = (value >> 8) & 0xFF;
  tempData[5] =  value & 0xFF;
  crc = CheckCRC(tempData, 6);
  tempData[6] = (crc >> 8) & 0xFF;
  tempData[7] = crc & 0xFF;
  for(uint8_t i = 0 ;i < 8; i++){
    Serial.print((char)tempData[i]);
  }
  Serial.flush();
}


static void setPwmDuty(uint8_t duty){
  WriteRegValue(DUTY_REG_ADDR, (uint16_t)duty);
}

static void setPwmFreq(uint8_t freq){
  WriteRegValue(FREQ_REG_ADDR, (uint16_t)freq);
}

static void setPwmEnable(uint8_t pwmStatus){
  WriteRegValue(PWM_EN_REG_ADDR, (uint16_t)pwmStatus);
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  delay(1000);
  setPwmFreq(10);
  delay(50);
  setPwmDuty(0);
  delay(50);
  setPwmEnable(PWM_ENABLE);
  delay(50);
}

void loop() {
    setPwmDuty(200);
    delay(2000);
    setPwmDuty(0);
    delay(2000);
}

十、电位器控制外设

我们可以选择用 “电位器模块” 或 “电位器元件” 两种方式之一来接入并控制PWM值的大小,从而控制电机的转速或者灯光的强弱。

使用电位器控制前,你需要准备如下配件和工具:

  1. Gravity电位器模块或者焊接好连接线的电位器元件。
  2. 用于拧接线螺丝的螺丝刀。
  3. 被控制的电机或者灯带。
  4. 一个符合要求的电源。(电压:5V~24V 功率大于2A 。需根据被控制的设备功率选择对应电压和功率的电源)。

连接好电位器模块或者电位器元件、电源线、被控制的电机或灯光设备。并将切换开关拨动到Analog IN侧。如下所示:

Gravity电位器模块连接

下图为DFRobot出品的电位器模块的连接方式,使用模块自带的Gravity连接线连接到3P排针上。(连接时请注意线序不要插反)

电位器元件连接

左侧图为电位器元件的接线方式原理图。你需要自己准备电位器元件,并焊接好连接线,然后按图把连接线连接到接线柱上。 右侧图是一个典型的电位器实物连接图,一般是电位器的中间引脚为可调端。连接时请先确定好你的电位器哪一个引脚是可调端,电位器的可调端接入 “A” 端口。

电位器可选择阻值为4.7K~470K之间的均可。

十一、Mind+平台_图形化Python编程控制外设(测试中,未完成)

软件下载及库导入

  1. 下载最新版本Mind+(V1.7.1 RC1.0以上),下载链接:http://mindplus.cc/download.html

  2. 打开Mind+软件。

  3. 点击右上角的“python模式”按钮,切换为python模式。

  1. 点击左下角的“扩展”按钮,打开扩展窗口。

  1. 点击“用户库,切换到用户库方式。

  1. 在搜索框内粘贴以下两个网址中的任意一个:

https://github.com/liliang9693/ext-lightdriver

https://gitee.com/liliang9693/ext-lightdriver

7.导入用户库。

  1. 显示已加载后,点击返回。

  1. 返回后,点击左侧下方的用户库,出现本产品的图形化编程模块。

图形化例程

使用TYPEC数据线将驱动板链接到电脑的USB口,并外接6V直流电源,如图:

以下代码实现的功能是让灯带亮两秒后,再灭2秒。循环执行。

十二、寄存器表(采用ModBus RTU通讯协议)

十三、更多资料下载

DRI0050-电路原理图

DRI0050-V1.0-3D-STEP文件

DRI0050-V1.0-2D-DXF文件

<File:nextredirectltr.png>购买 Light_and_Motor_Driver(SKU: DRI0050)