Nota

Hola, bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook. ¡Explora más a fondo Raspberry Pi, Arduino y ESP32 con otros entusiastas!

¿Por qué unirse?

  • Soporte experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.

  • Aprende y comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.

  • Avances exclusivos: Obtén acceso anticipado a anuncios de nuevos productos y vistas previas.

  • Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.

  • Promociones festivas y sorteos: Participa en sorteos y promociones de temporada.

👉 ¿Listo para explorar y crear con nosotros? Haz clic en [aquí] y únete hoy mismo.

Control con Teclado

En este proyecto, aprenderemos a usar el teclado para controlar remotamente el PiCrawler. Podrás controlar al PiCrawler para que se mueva hacia adelante, hacia atrás, a la izquierda y a la derecha.

Ejecutar el Código

cd ~/picrawler/examples
sudo python3 2_keyboard_control.py

Cuando el programa comienza, PiCrawler se inicializa y se muestra una interfaz de control por teclado en la terminal.

¡Presione las teclas del teclado para controlar PiCrawler!

  • w: Avanzar

  • a: Girar a la izquierda

  • s: Retroceder

  • d: Girar a la derecha

  • Ctrl+C: Salir

La velocidad actual se muestra y puede ajustarse usando:

    • / ] para aumentar la velocidad

    • / [ para disminuir la velocidad

Después de cada acción, se aplica un pequeño retraso para mejorar la estabilidad.

Presione Ctrl+C para salir. Antes de apagarse, el crawler realiza una acción segura de «sentarse».

Código

from picrawler import Picrawler
from time import sleep
import readchar

crawler = Picrawler()

SPEED_MIN = 20
SPEED_MAX = 70
speed = 60

STEP = 1            # Number of action steps per key press
ACTION_GAP = 0.25   # Delay after each action to reduce current spikes

manual = """
Keyboard Control - PiCrawler

Movement:
W: Forward
A: Turn left
S: Backward
D: Turn right

Speed Control:
+ / ] : Increase speed
- / [ : Decrease speed

Other:
Space  : Stop (no action)
Ctrl+C : Quit (auto sit)
"""

def clamp(value, min_value, max_value):
    """Limit value within a specified range."""
    return max(min_value, min(max_value, value))

def show_info():
    """Clear terminal and display control instructions."""
    print("\033[H\033[J", end="")  # Clear terminal screen
    print(manual)
    print(f"Current speed: {speed}  (range {SPEED_MIN}-{SPEED_MAX})")
    print(f"Action gap: {ACTION_GAP:.2f}s")

def do_move(action_name):
    """Execute movement action with safety delay."""
    crawler.do_action(action_name, STEP, speed)
    sleep(ACTION_GAP)

def safe_sit():
    """Safely sit down before program exit."""
    try:
        crawler.do_step("sit", clamp(speed, 20, 40))
        sleep(1.0)
    except Exception:
        pass

def main():
    show_info()

    try:
        while True:
            key = readchar.readkey()
            k = key.lower()

            if k == "w":
                do_move("forward")
            elif k == "s":
                do_move("backward")
            elif k == "a":
                do_move("turn left")
            elif k == "d":
                do_move("turn right")

            # Speed increase
            elif k in ("+", "]"):
                global speed
                speed = clamp(speed + 5, SPEED_MIN, SPEED_MAX)

            # Speed decrease
            elif k in ("-", "["):
                speed = clamp(speed - 5, SPEED_MIN, SPEED_MAX)

            # Stop (no movement)
            elif k == " ":
                pass

            # Quit using readchar special key
            elif key == readchar.key.CTRL_C:
                print("\nQuit.")
                break

            show_info()
            sleep(0.02)

    except KeyboardInterrupt:
        print("\nQuit (KeyboardInterrupt).")

    finally:
        safe_sit()

if __name__ == "__main__":
    main()

¿Cómo funciona?

  1. Creación del Objeto del Robot

    crawler = Picrawler()
    

    Esta línea crea un objeto Picrawler. Permite que el programa controle los movimientos del robot.

  2. Definición del Rango de Velocidad Seguro

    SPEED_MIN = 20
    SPEED_MAX = 70
    speed = 60
    

    Estas variables definen el rango de velocidad permitido. speed almacena la velocidad de movimiento actual. El robot no se moverá más rápido que el valor máximo.

  3. Limitación de Velocidad con clamp()

    def clamp(value, min_value, max_value):
        return max(min_value, min(max_value, value))
    

    Esta función asegura que la velocidad se mantenga dentro del rango seguro. Evita movimientos inestables causados por valores extremos.

  4. Ejecución de un Movimiento

    def do_move(action_name):
        crawler.do_action(action_name, STEP, speed)
        sleep(ACTION_GAP)
    

    Esta función envía un comando de movimiento al robot. ACTION_GAP agrega un pequeño retraso para mejorar la estabilidad.

  5. Lectura de Entrada del Teclado

    key = readchar.readkey()
    k = key.lower()
    

    El programa espera a que se presione una tecla. La tecla se convierte a minúsculas para mantener consistencia.

  6. Lógica de Control de Movimiento

    if k == "w":
        do_move("forward")
    elif k == "s":
        do_move("backward")
    

    Cuando se presiona una tecla, el movimiento correspondiente se ejecuta inmediatamente. No es necesario presionar Enter.

  7. Salida Segura

    finally:
        safe_sit()
    

    Antes de que el programa finalice, el robot ejecuta una acción segura de «sentarse». Esto evita posturas inestables o apagados repentinos.