Resumen : Este artículo presenta brevemente el desarrollo del automóvil WiFi para el sistema Hongmeng + Hi3861
Grupo adecuado : adecuado para placa de desarrollo Runhe Hi3861
Todos los repositorios de código en este artículo: https://gitee.com/qidiyun/hihope-3861-smart-home-kit
13.1 Introducción al coche
Coche WiFi basado en el sistema Hongmeng + Hi3861
En primer lugar, necesitamos tener un kit de automóvil WiFi, que en realidad es Hi3861 más motor, módulo de seguimiento, ultrasonido y otros módulos.
Una vez instalado el coche, probablemente se verá así:
13.2 Motorización
Aquí primero solo haremos lo más simple: accionar el motor del automóvil para que funcione.
La placa controladora del motor se muestra a continuación. El chip controlador del motor actual utiliza el chip L9110S.
El circuito de aplicación típico es el que se muestra a continuación:
Podemos ver que si queremos controlar el motor, nuestro chip necesita al menos 2 señales PWM, una para controlar la rotación hacia adelante y otra para controlar la rotación hacia atrás.
Entonces nuestro coche tiene dos ruedas y necesita dos motores, por lo que necesitamos 4 señales PWM.
Después de verificar la información del automóvil, podemos saber que los PWM de 4 canales que utiliza actualmente el chip Hi3861 para controlar el motor son:
Ahora que conocemos el canal PWM y el puerto GPIO correspondiente, podemos empezar a programar.
Primero la parte de inicialización de PWM:
void pwm_init(void)
{
hi_gpio_init();
//引脚复用
hi_io_set_func(HI_IO_NAME_GPIO_0, HI_IO_FUNC_GPIO_0_PWM3_OUT);
hi_io_set_func(HI_IO_NAME_GPIO_1, HI_IO_FUNC_GPIO_1_PWM4_OUT);
hi_io_set_func(HI_IO_NAME_GPIO_9, HI_IO_FUNC_GPIO_9_PWM0_OUT);
hi_io_set_func(HI_IO_NAME_GPIO_10, HI_IO_FUNC_GPIO_10_PWM1_OUT);
//初始化pwm
hi_pwm_init(HI_PWM_PORT_PWM3);
hi_pwm_init(HI_PWM_PORT_PWM4);
hi_pwm_init(HI_PWM_PORT_PWM0);
hi_pwm_init(HI_PWM_PORT_PWM1);
}
Funciones para controlar el coche hacia adelante, hacia atrás, girar a la izquierda, girar a la derecha y detenerse:
//停止
void pwm_stop(void)
{
//先停止PWM
hi_pwm_stop(HI_PWM_PORT_PWM3);
hi_pwm_stop(HI_PWM_PORT_PWM4);
hi_pwm_stop(HI_PWM_PORT_PWM0);
hi_pwm_stop(HI_PWM_PORT_PWM1);
}
void car_stop(void)
{
car_info.cur_status = car_info.go_status;
printf("pwm_stop \r\n");
pwm_stop();
}
//前进
void pwm_forward(void)
{
//先停止PWM
hi_pwm_stop(HI_PWM_PORT_PWM3);
hi_pwm_stop(HI_PWM_PORT_PWM4);
hi_pwm_stop(HI_PWM_PORT_PWM0);
hi_pwm_stop(HI_PWM_PORT_PWM1);
//启动A路PWM
hi_pwm_start(HI_PWM_PORT_PWM3, 750, 1500);
hi_pwm_start(HI_PWM_PORT_PWM0, 750, 1500);
}
void car_forward(void)
{
if(car_info.go_status != CAR_STATUS_FORWARD)
{
//直接退出
return ;
}
if(car_info.cur_status == car_info.go_status)
{
//状态没有变化,直接推出
return;
}
car_info.cur_status = car_info.go_status;
printf("pwm_forward \r\n");
pwm_forward();
step_count_update();
}
//后退
void pwm_backward(void)
{
//先停止PWM
hi_pwm_stop(HI_PWM_PORT_PWM3);
hi_pwm_stop(HI_PWM_PORT_PWM4);
hi_pwm_stop(HI_PWM_PORT_PWM0);
hi_pwm_stop(HI_PWM_PORT_PWM1);
//启动A路PWM
hi_pwm_start(HI_PWM_PORT_PWM4, 750, 1500);
hi_pwm_start(HI_PWM_PORT_PWM1, 750, 1500);
}
void car_backward(void)
{
if(car_info.go_status != CAR_STATUS_BACKWARD)
{
//直接退出
return ;
}
if(car_info.cur_status == car_info.go_status)
{
//状态没有变化,直接推出
return;
}
car_info.cur_status = car_info.go_status;
printf("pwm_backward \r\n");
pwm_backward();
step_count_update();
}
//左转
void pwm_left(void)
{
//先停止PWM
hi_pwm_stop(HI_PWM_PORT_PWM3);
hi_pwm_stop(HI_PWM_PORT_PWM4);
hi_pwm_stop(HI_PWM_PORT_PWM0);
hi_pwm_stop(HI_PWM_PORT_PWM1);
//启动A路PWM
hi_pwm_start(HI_PWM_PORT_PWM3, 750, 1500);
}
void car_left(void)
{
if(car_info.go_status != CAR_STATUS_LEFT)
{
//直接退出
return ;
}
if(car_info.cur_status == car_info.go_status)
{
//状态没有变化,直接推出
return;
}
car_info.cur_status = car_info.go_status;
printf("pwm_left \r\n");
pwm_left();
step_count_update();
}
//右转
void pwm_right(void)
{
//先停止PWM
hi_pwm_stop(HI_PWM_PORT_PWM3);
hi_pwm_stop(HI_PWM_PORT_PWM4);
hi_pwm_stop(HI_PWM_PORT_PWM0);
hi_pwm_stop(HI_PWM_PORT_PWM1);
//启动A路PWM
hi_pwm_start(HI_PWM_PORT_PWM0, 750, 1500);
}
void car_right(void)
{
if(car_info.go_status != CAR_STATUS_RIGHT)
{
//直接退出
return ;
}
if(car_info.cur_status == car_info.go_status)
{
//状态没有变化,直接推出
return;
}
car_info.cur_status = car_info.go_status;
printf("pwm_right \r\n");
pwm_right();
step_count_update();
}
Finalmente, para usar la función pwm, necesitamos modificar
dispositivo/soc/hisilicon/hi3861v100/sdk_liteos/build/config/usr_config.mk
Agregue estas dos líneas, aquí es para activar la función PWM
CONFIG_PWM_SUPPORT=y
CONFIG_PWM_HOLD_AFTER_REBOOT=y
13.3 Parte de control WiFi
Simplemente escribimos un programa UDP en el automóvil para escuchar el número de puerto 50001. El formato de comunicación utilizado aquí es json. Después de que el automóvil recibe los datos UDP, analiza el json y realiza las operaciones correspondientes de acuerdo con el comando, como avanzar, retroceder, girar a la izquierda, girar a la derecha, etc.
En el lado de la computadora, use C # para escribir un programa de prueba. Puede ingresar manualmente la dirección IP del automóvil, o no necesita ingresar la dirección IP. De esta manera, el programa del lado de la computadora enviará un paquete de transmisión al coche, que también puede tener una función de control.
13.4 Conexión de punto de acceso WiFi
Tenga en cuenta que el SSID predeterminado del firmware WiFi del automóvil aquí para conectarse al punto de acceso es:
Los lectores deben modificarlo según sus propios puntos calientes.
Archivo: sta_entry.c
El código fuente del automóvil y el código final de control C# son todos de código abierto, puede modificarlos libremente y usar su imaginación para crear productos de bricolaje más potentes y geniales.