30

基于鸿蒙系统 + Hi3861 的wifi小车,可以通过电脑、手机控制

 3 years ago
source link: http://developer.51cto.com/art/202010/630396.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

基于鸿蒙系统 + Hi3861 的WiFi小车

首先,我们得有一套WiFi小车套件,其实也是Hi3861 加上电机、循迹模块、超声波等模块。

小车安装完大概是这样:

iQ3ieqQ.jpg!mobile

3.13.1 电机驱动

我们这里先只做最简单的,驱动小车的电机,让小车跑起来。

电机的驱动板如下图,目前电机驱动芯片用的是L9110S芯片。

qyaeeyb.jpg!mobile

典型的应用电路如下图:

JnEBJfy.png!mobile

我们可以看到,如果要控制电机,我们芯片至少需要2路PWM信号,一路用于控制正转,一路用于控制反转。

然后我们小车有两个轮子,需要两个电机,所以我们需要 4 路PWM信号。

查阅小车资料,可以知道,目前Hi3861 芯片用来控制电机的4路PWM分别是:

NbY3yaA.png!mobile

知道了PWM通道和对应的GPIO口,我们就可以开始编程了。

首先PWM初始化部分:

void pwm_init(void) 
 
{ 
 
 GpioInit(); 
 
 //引脚复用 
 
 IoSetFunc(WIFI_IOT_IO_NAME_GPIO_0, WIFI_IOT_IO_FUNC_GPIO_0_PWM3_OUT);  
 
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_1, WIFI_IOT_IO_FUNC_GPIO_1_PWM4_OUT);   
 
 IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_PWM0_OUT);  
 
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_IO_FUNC_GPIO_10_PWM1_OUT);  
 
 
 
 
 //初始化pwm 
 
 PwmInit(WIFI_IOT_PWM_PORT_PWM3); 
 
    PwmInit(WIFI_IOT_PWM_PORT_PWM4); 
 
 PwmInit(WIFI_IOT_PWM_PORT_PWM0); 
 
    PwmInit(WIFI_IOT_PWM_PORT_PWM1); 
 
} 

控制小车前进、后退、左转、右转、停止的函数:

void pwm_stop(void) 
 
{ 
 
//先停止PWM 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM3); 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM4); 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM0); 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM1); 
 
} 
 
//前进 
 
void pwm_forward(void) 
 
{ 
 
//先停止PWM 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM3); 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM4); 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM0); 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM1); 
 
//启动A路PWM 
 
PwmStart(WIFI_IOT_PWM_PORT_PWM3, 750, 1500); 
 
PwmStart(WIFI_IOT_PWM_PORT_PWM0, 750, 1500); 
 
} 
 
//后退 
 
void pwm_backward(void) 
 
{ 
 
//先停止PWM 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM3); 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM4); 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM0); 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM1); 
 
//启动A路PWM 
 
PwmStart(WIFI_IOT_PWM_PORT_PWM4, 750, 1500); 
 
PwmStart(WIFI_IOT_PWM_PORT_PWM1, 750, 1500); 
 
} 
 
//左转 
 
void pwm_left(void) 
 
{ 
 
//先停止PWM 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM3); 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM4); 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM0); 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM1); 
 
//启动A路PWM 
 
PwmStart(WIFI_IOT_PWM_PORT_PWM3, 750, 1500); 
 
} 
 
//右转 
 
void pwm_right(void) 
 
{ 
 
//先停止PWM 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM3); 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM4); 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM0); 
 
PwmStop(WIFI_IOT_PWM_PORT_PWM1); 
 
//启动A路PWM 
 
PwmStart(WIFI_IOT_PWM_PORT_PWM0, 750, 1500); 
 
} 

最后,要使用pwm功能,我们需要修改

vendor\hisi\hi3861\hi3861\build\config\usr_config.mk 文件,把PWM功能打开,增加一行 CONFIG_PWM_SUPPORT=y 。如图:

UNrEJn.jpg!mobile

3.13.2 WiFi控制部分

我们在小车上面简单编写一个UDP程序,监听50001端口号。这里使用的通信格式是json,小车收到UDP数据后,解析json,并根据命令执行相应的操作,例如前进、后退、左转、右转等,代码如下:

aAzmIbf.png!mobile

电脑端,使用C#编写一个测试程序,可以手动输入小车的IP地址,也可以不输入IP地址,这样,电脑端程序会发送广播包给小车,也可以起到控制的功能。

buAV3a.jpg!mobile

小车的源码,C#控制端的代码均开源,大家可以自由修改,发挥自己的想象,创造出更厉害炫酷的DIY产品。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK