目录
一、背景
花139买了一台双鹰牧马人遥控车,发现只有一个300mAh 6V的电池组,但没有充电器。前后断断续续玩了不到2小时就没电了,拿出以前的降压模块和12V路由器电源做成简易充电器充电并不能充进去,电池已经完全亏电且遥控距离只有30m左右,玩起来很不尽兴。于是,作为业余电子爱好者,怎会甘心如此?我决心好好改造一番这个遥控车,下面从拆解开始。
二、买来的遥控车原车拆解
1、整车图片
整车式越野式JEEP。整车一共有3个直流有刷电机,一个负责开关门,一个负责前后运动,还有一个负责左右转向;另外有2棵前向白色LED和2颗倒车红色LED指示灯。
2、原装电池
原装电池是一个300mAh的可充电电池组,且这个价格入手不搭配充电器😂,没有动手能力基本就是一次性玩具。
3、小车控制电路
该电路一共采用了3颗芯片,其中无线接收芯片封装丝印已经被打磨掉,不知道型号,只知道是2.4GHz工业频段的无线接收芯片。另外2颗都是电机驱动芯片,分别为MX1616H双通道电机驱动芯片和MX08H单通道电机驱动芯片。由于改装并不需要用到原来的遥控,遥控部分就不拆解了。
三、开始改装小车
1、改进后的遥控电路
a、遥控电路原理图:
遥控电路主要由STC89C52RC做主控,上手相对简单且低成本;供电采用可充电9V电池通过线性稳压器1117转为5V;通过串口通信的模式实时发送数据。无线模块采用HC12串口模块进行通信。原理图中主要由按键部分、单片机最小系统、电源部分以及指示灯组成。
b、遥控电路PCB图和实物图:
c、遥控电路代码(Demo):
#include "reg52.h"
#include "intrins.h"
#include "string.h"
void ConfigUART(unsigned int baud) //串口初始配置
{
PCON|=0x80;
SCON=0x50;
TMOD|=0x20;
TH1=256-(11059200/12/16)/baud;
TL1=TH1;
ET1=0;
ES=1;
EA=1;
TR1=1;
}
void Delay(unsigned int t)
{
while(--t);
}
void main()
{
P0=0xff;
P1=0xff;
P2=0xff;
ConfigUART(9600);
while(1)
{
P1=P0; //P0是8个button,直接实时检测P0数据并赋值给P1,P1对应八个按键指示灯,直接赋值即可
SBUF=P1; //把P1实时赋值给串口发送缓存SBUF
while(!TI); //实时发送
TI=0;
Delay(5000);
}
}
2、改进后的小车控制电路
a、小车控制电路原理图:
小车控制电路单片机采用ESP32做主控,比较奢侈,主要是为后续软件功能更新做铺垫。
一键开关门电路是机械结构已经决定电机只要单向转动即可循环开门关门动作,所以电路延续原车采用JSM2302A-A2SHB N-Channel MOSFET做该电机开关;前进后退电机延续原车MX1616H H桥芯片电路;左右转电机延续原车MX08H H桥芯片电路;为提升小车续航,改用12V 5000mAh大容量锂电池,先采用DC-DC模块降压到8V给电机供电,同时采用1117-5降压到5V和3.3V给电路中单片机和其余模块供电;前后车灯分别用三极管进行开关(此处应该四灯独立,这样可以增加转向灯功能,当时没想到)。
b、小车控制电路和实物图
c、小车控制电路代码
from machine import Pin
from machine import UART
import time
import binascii
# 定义引脚
DR1 = Pin(32, Pin.OUT)
DR2 = Pin(33, Pin.OUT)
LFA = Pin(26, Pin.OUT)
LFB = Pin(25, Pin.OUT)
SET = Pin(2, Pin.OUT)
R_LED = Pin(18, Pin.OUT)
D_LED = Pin(19, Pin.OUT)
OPEN_DOOR = Pin(4, Pin.OUT)
# 配置串口参数
uart2 = UART(2,9600)
uart2.init(9600,bits=8,parity=None,stop=1)
D_LED.value(0)
R_LED.value(0)
ledflag = 0
while True:
cmd = uart2.read(1) # 读取串口数据
if cmd!=None: # 检查串口缓冲区是否有数据
data = ord(cmd) # 值转为整形值
DR1.value(data & 0x01) #前进
if not data & 0x40: #开车前灯
ledflag = 1
elif not data & 0x02: #倒车关闭车前灯
ledflag = 0
if ledflag:
D_LED.value(1)
else:
D_LED.value(not data & 0x01)
DR2.value(data & 0x02) #后退
R_LED.value(not data & 0x02)
LFA.value(data & 0x04) #左转
LFB.value(data & 0x08) #右转
OPEN_DOOR.value(not data & 0x20) #开关门
print(data)
time.sleep(0.01) # 等待一段时间,避免密集轮询
3、小车演示
这才是百元遥控车该有的样子