Automatische Übersetzung anzeigen
Dies ist eine automatisch generierte Übersetzung. Wenn Sie auf den englischen Originaltext zugreifen möchten, klicken Sie hier
#Produkttrends
{{{sourceTextContent.title}}}
Snack-Automat auf Basis des T5L Smart Screen
{{{sourceTextContent.subTitle}}}
[Open Source Award Fall]
{{{sourceTextContent.description}}}
Guten Tag zusammen! Wir freuen uns, Ihnen heute ein preisgekröntes Open-Source-Projekt aus dem DWIN Developer Forum vorstellen zu können: Snack-Maschine basierend auf T5L Smart Screen. Diese Lösung nutzt den T5L-Chip, um die Greifkraft und Geschwindigkeit der Krallen über die PWM-Schnittstelle in Echtzeit zu steuern. Sie unterstützt Funktionen wie das Auslesen der Dauer des langen Drückens von Hintergrundtasten, die Selbstkontrolle für jedes Modul, Fehlerwarnungen und die synchrone Anzeige von Münzeinwurfzahlen, Spiel-Countdowns usw. Es ermöglicht auch Parametereinstellungen für Münz-zu-Guthaben-Verhältnisse, Spielmodi, mehrsprachige Schnittstellen und Schwellenwerte für die Greifkraft.
(1) Kommunikationscode zwischen T5L Smart Screen und Hauptsteuergerät
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(schritt==0) {
recv_len = 0;
if(res==0x15) step = 1;
} sonst if(step==1) {
date_len = res;
schritt = 2;
if(date_len>UART2_PACKET_MAX_LEN) step = 0;
} sonst if(step==2) {
if(recv_len==date_len) {
schritt = 0;
if(res==0x16) {
uart2_rx_sta = date_len;
uart2_rx_sta |= UART2_PACKET_OK;
}
} sonst {
uart2_buf[recv_len++] = res;
}
}
}
}
}
(2) Motortreiber-Code
void motor_move(MOTOR motor, MOTOR_DIR dir) {
if (motor == MOTOR_Z) { // Klauenmotor für die Z-Achse
if (dir == MOTOR_DIR_NONE) { // Anhalten
MOTOR_Z_DISABLE();
} sonst {
if ((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) { // X-Achse Bewegung Motor
// Ähnliche Logik für X-Achse mit Positionsprüfungen
} else if (motor == MOTOR_Y) { // Motor zur Bewegung der Y-Achse
// Ähnliche Logik für die Y-Achse mit Positionskontrollen
} else if (motor == MOTOR_CLAW) { // Klauenmotor
wenn (dir == MOTOR_DIR_NONE) {
MOTOR_CLAW_RELEASE(); // Klaue freigeben
} sonst {
MOTOR_CLAW_HOLD(); // Objekte halten
}
}
}
(3) PWM-basierte Klauenkraft- und Geschwindigkeitsanpassung
const u16 MOTOR_DUTY[MOTOR_TOTAL][MOTOR_SPEED_MAX+1] = {
{45+DUTY_OFFSET, ...}, // Geschwindigkeiten der X-Achse
{45+DUTY_OFFSET, ...}, // Geschwindigkeiten der Y-Achse
{45, 60, ...}, // Geschwindigkeiten der Z-Achse (kein Offset)
{200, 220, ...}, // Klauenkraftstufen
};
void motor_set_speed(MOTOR motor, u8 speed) {
if(speed>MOTOR_SPEED_MAX) return;
pwm_set_duty((PWM_CH)motor, MOTOR_DUTY[motor][speed]);
}
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); // Spannung normalisieren
if(vol<0)
vol = 0;
sonst 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) Long-Press-Erkennung für Hersteller-Backend-Tasten
u8 key_check_long_press(KEY key, u32 time) {
while(1) {
if(!(KEY_Scan(1) & key)) return 1; // Taste freigegeben: Fehlschlag
if(time) {
sys_delay_ms(1);
time--;
if(time==0) return 0; // Zeitüberschreitung: Erfolg
}
}
}