?这一次来说一下如何控制小车,不过首先要说我遇到的问题,其实我写到一半基本能跑了,然后疏忽大意,让IO口碰了8.4V电源,全套包括接收机在内,和鞭炮一样炸了,五十多块钱直接飘了,这一次可以说是损失惨重,主要所有主要模块都是自制的,很费时间,可以说是非常难过了。
?
?
使用的电机控制模块和电机是这样的
?
?
控制方法很简单
?设计上,IO32,IO33是A通道控制,IO25,IO26是B通道控制,前后信号IO15,转向信号IO16
#define CA2 32
#define CA1 33
#define CB1 25
#define CB2 26
#define DEATH_AREA 20
#define MIDDLE 1600
#define SIGNALPIN 15
#define SIGNALPIN2 16
#define MIN 1000
#define MAX 2255
#define PWMBASE_GO 1000
#define ARRANGE 40
#include "soc/rtc_wdt.h"
void setup(){
rtc_wdt_protect_off();
rtc_wdt_enable();
rtc_wdt_feed();
rtc_wdt_set_time(RTC_WDT_STAGE0, 7000);
Serial.begin(115200);
Serial.println("hello");
pinMode(CA1,OUTPUT);
pinMode(CA2,OUTPUT);
pinMode(CB1,OUTPUT);
pinMode(CB2,OUTPUT);
digitalWrite(CA1,LOW);
digitalWrite(CA2,LOW);
digitalWrite(CB1,LOW);
digitalWrite(CB2,LOW);
}
int goandback;
int rotatepulse;
void loop(){
goandback = pulseIn(SIGNALPIN, HIGH) ;
rotatepulse = pulseIn(SIGNALPIN2, HIGH) ;
Serial.print("GoBack,Rotate");
Serial.print(goandback);
Serial.print(" , ");
Serial.println(rotatepulse);
rtc_wdt_feed();
if(abs(goandback-MIDDLE)<DEATH_AREA)
{
carStandby();
}
else if(goandback>MIN&&goandback<MIDDLE-DEATH_AREA)//go
{
carBack(goandback);
}
else if(goandback>MIDDLE-DEATH_AREA&&goandback<MAX)//back
{
carRun(goandback);
}
else
{
carStandby();
}
}
void carStandby()
{
digitalWrite(CA1,LOW);
digitalWrite(CA2,LOW);
digitalWrite(CB1,LOW);
digitalWrite(CB2,LOW);
}
void carBack()
{
digitalWrite(CA1,HIGH);
digitalWrite(CA2,LOW);
digitalWrite(CB1,HIGH);
digitalWrite(CB2,LOW);
}
void carBack(int i)
{
digitalWrite(CA2,LOW);
digitalWrite(CA1,HIGH);
delay((MIDDLE-i)/ARRANGE);
carStandby();
digitalWrite(CB2,LOW);
digitalWrite(CB1,HIGH);
delay((MIDDLE-i)/ARRANGE);
carStandby();
}
void carRun(int i)
{
digitalWrite(CA1,LOW);
digitalWrite(CA2,HIGH);
delay((i-MIDDLE)/ARRANGE);
carStandby();
digitalWrite(CB1,LOW);
digitalWrite(CB2,HIGH);
delay((i-MIDDLE)/ARRANGE);
carStandby();
}
void carRun()
{
digitalWrite(CA1,LOW);
digitalWrite(CA2,HIGH);
digitalWrite(CB1,LOW);
digitalWrite(CB2,HIGH);
}
void carstop()
{
digitalWrite(CA1,HIGH);
digitalWrite(CA2,HIGH);
digitalWrite(CB1,HIGH);
digitalWrite(CB2,HIGH);
}
主要做的事情其实非常的简单,就是:
1.处理输入的前后信号,处理输入的转向信号,使用PulseIn来获取到高电平时间
2.通过PWM信号到电机驱动芯片,分配能量到两个车轮的电机上
然而在还没弄好之前,炸了,但是唯一值得庆幸的是我还好有这个——USB隔离器,不然感觉电脑也有点危险,USB的5V是有保护但是信号线基本没有高压保护
?
|