Ver traducción automática
Esta es una traducción automática. Para ver el texto original en inglés haga clic aquí
#Tendencias de productos
{{{sourceTextContent.title}}}
Máquina de aperitivos basada en la pantalla inteligente T5L
{{{sourceTextContent.subTitle}}}
[Caso Open Source Award]
{{{sourceTextContent.description}}}
¡Buenos días a todos! Hoy, estamos encantados de presentar un caso premiado de código abierto del Foro de Desarrolladores DWIN: Snack Machine Based on T5L Smart Screen. Esta solución aprovecha el chip T5L para lograr el control en tiempo real de la fuerza de agarre de la garra y la velocidad a través de la interfaz PWM. Admite funciones como la lectura de la duración de la pulsación prolongada de los botones de fondo, la autocomprobación de cada módulo, las alertas de error y la visualización sincrónica de los recuentos de inserción de monedas, las cuentas atrás de los juegos, etc. También permite la configuración de parámetros para las relaciones moneda-crédito, los modos de juego, las interfaces multilingües y los umbrales de fuerza de agarre.
(1) Código de comunicación entre la pantalla inteligente T5L y el controlador principal
void uart2_master_isr() interrupt 4 {
u8 res;
if(RI0) {
RI0 = 0;
res = SBUF0;
uart2_rx_timeout = UART2_RX_TIMEOUT;
if((uart2_rx_sta&UART2_PACKET_OK)==0) {
if(step==0) {
recv_len = 0;
if(res==0x15) step = 1;
} else if(paso==1) {
fecha_len = res;
step = 2;
if(date_len>UART2_PACKET_MAX_LEN) step = 0;
} else if(paso==2) {
if(recv_len==date_len) {
step = 0;
if(res==0x16) {
uart2_rx_sta = date_len;
uart2_rx_sta |= UART2_PACKET_OK;
}
} else {
uart2_buf[recv_len++] = res;
}
}
}
}
}
(2) Código del controlador de motor
void motor_move(MOTOR motor, MOTOR_DIR dir) {
if (motor == MOTOR_Z) { // Motor garra eje Z
if (dir == MOTOR_DIR_NONE) { // Parar
MOTOR_Z_DISABLE();
} else {
if ((IS_MOTOR_Z_BACKWARD_POS() && dir == MOTOR_DIR_BACKWARD) || (IS_MOTOR_Z_FACKWARD_POS() && dir == MOTOR_DIR_BACKWARD) ||)
(IS_MOTOR_Z_FORWARD_POS() && dir == MOTOR_DIR_FORWARD)) {
MOTOR_Z_DISABLE();
dir = MOTOR_DIR_NONE;
} else {
MOTOR_Z_ENABLE();
MOTOR_Z_DIR_PIN = (dir == MOTOR_DIR_BACKWARD);
}
}
} else if (motor == MOTOR_X) { // Movimiento del eje X motor
// Lógica similar para el eje X con comprobaciones de posición
} else if (motor == MOTOR_Y) { // Motor de movimiento del eje Y
// Lógica similar para el eje Y con comprobaciones de posición
} else if (motor == MOTOR_CLAW) { // Motor de garras
if (dir == MOTOR_DIR_NONE) {
MOTOR_CLAW_RELEASE(); // Liberar garra
} else {
MOTOR_CLAW_HOLD(); // Retener objetos
}
}
}
(3) Ajuste de fuerza y velocidad de garras basado en PWM
const u16 MOTOR_DUTY[MOTOR_TOTAL][MOTOR_SPEED_MAX+1] = {
{45+DUTY_OFFSET, ...}, // Velocidades eje X
{45+DUTY_OFFSET, ...}, // Velocidades eje Y
{45, 60, ...}, // Velocidades eje Z (sin offset)
{200, 220, ...}, // Niveles de fuerza de agarre
};
void motor_set_speed(MOTOR motor, u8 speed) {
if(velocidad>MOTOR_SPEED_MAX) return;
pwm_set_duty((PWM_CH)motor, MOTOR_DUTY[motor][velocidad]);
}
void motor_set_claw_strength_by_vol(float vol) {
#define CLAW_DUTY_MIN 200
#define CLAW_DUTY_MAX TIM_ARR
u16 duty;
vol = (vol - QZLDY_MIN) / (QZLDY_MAX - QZLDY_MIN); // Normalizar tensión
if(vol<0)
vol = 0
else if(vol>1)
vol = 1
duty = (u16)(vol * (CLAW_DUTY_MAX - CLAW_DUTY_MIN) + 0.5f) + CLAW_DUTY_MIN;
pwm_set_duty(PWM_CH_MOTOR_CLAW, duty);
}
(4) Detección de pulsación larga para botones de fondo del fabricante
u8 key_check_long_press(KEY tecla, u32 tiempo) {
while(1) {
if(!(KEY_Scan(1) & key)) return 1; // Tecla liberada: fallo
if(tiempo) {
sys_delay_ms(1);
tiempo--;
if(time==0) return 0; // Tiempo de espera: éxito
}
}
}