Vedi traduzione automatica
Questa è una traduzione automatica. Per vedere il testo originale in inglese cliccare qui
#Tendenze
{{{sourceTextContent.title}}}
Macchina per snack basata sullo schermo intelligente T5L
{{{sourceTextContent.subTitle}}}
[Caso del premio Open Source]
{{{sourceTextContent.description}}}
Buongiorno a tutti! Oggi siamo entusiasti di presentare un caso open-source premiato dal DWIN Developer Forum: Snack Machine Based on T5L Smart Screen. Questa soluzione sfrutta il chip T5L per ottenere il controllo in tempo reale della forza di presa e della velocità dell'artiglio tramite l'interfaccia PWM. Supporta funzioni come la lettura della durata della pressione prolungata dei pulsanti di sfondo, l'autoverifica di ciascun modulo, gli avvisi di errore e la visualizzazione sincrona dei conteggi di inserimento delle monete, dei conti alla rovescia dei giochi, ecc. Consente inoltre di impostare i parametri per il rapporto monete/credito, le modalità di gioco, le interfacce multilingue e le soglie di forza di presa.
(1) Codice di comunicazione tra lo schermo intelligente T5L e il controller principale
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) {
se(step==0) {
recv_len = 0;
se(res==0x15) passo = 1;
} else if(step==1) {
data_len = res;
passo = 2;
se(data_len>UART2_PACKET_MAX_LEN) passo = 0;
} else if(step==2) {
se(recv_len==data_len) {
step = 0;
se(res==0x16) {
uart2_rx_sta = data_len;
uart2_rx_sta |= UART2_PACKET_OK;
}
} else {
uart2_buf[recv_len++] = res;
}
}
}
}
}
(2) Codice del driver del motore
void motor_move(MOTOR motor, MOTOR_DIR dir) {
if (motor == MOTOR_Z) { // Motore ad artiglio dell'asse Z
if (dir == MOTOR_DIR_NONE) { // Si ferma
MOTOR_Z_DISABLE();
} else {
se ((IS_MOTOR_Z_BACKWARD_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) { // Motore di movimento dell'asse X
// Logica simile per l'asse X con controlli di posizione
} else if (motor == MOTOR_Y) { // Motore di movimento dell'asse Y
// Logica simile per l'asse Y con controlli di posizione
} else if (motor == MOTOR_CLAW) { // Motore per l'artiglio
se (dir == MOTOR_DIR_NONE) {
MOTOR_CLAW_RELEASE(); // Rilascio dell'artiglio
} else {
MOTOR_CLAW_HOLD(); // Trattiene gli oggetti
}
}
}
(3) Regolazione della forza e della velocità dell'artiglio basata su PWM
const u16 MOTOR_DUTY[MOTOR_TOTAL][MOTOR_SPEED_MAX+1] = {45+DUTY_OFFET, ... }, // velocità dell'asse X
{45+DUTY_OFFSET, ...}, // Velocità asse X
{45+DUTY_OFFSET, ...}, // velocità asse Y
{45, 60, ...}, // Velocità asse Z (senza offset)
{200, 220, ...}, // Livelli di forza dell'artiglio
};
void motor_set_speed(MOTOR motor, u8 speed) {
if(speed>MOTOR_SPEED_MAX) return;
pwm_set_duty((PWM_CH)motore, MOTOR_DUTY[motore][velocità]);
}
void motor_set_claw_strength_by_vol(float vol) {
#define CLAW_DUTY_MIN 200
#define CLAW_DUTY_MAX TIM_ARR
u16 dovere;
vol = (vol - QZLDY_MIN) / (QZLDY_MAX - QZLDY_MIN); // Normalizzazione della tensione
se(vol<0)
vol = 0;
altrimenti se(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) Rilevamento della pressione prolungata per i pulsanti del backend del produttore
u8 key_check_long_press(KEY key, u32 time) {
while(1) {
if(!(KEY_Scan(1) & key)) return 1; // Tasto rilasciato: fallimento
if(time) {
sys_delay_ms(1);
tempo;
if(time==0) return 0; // Timeout: successo
}
}
}