Tabla de contenido:

Programación de un Micro: Bit Robot & Joystick: Bit Controller con MicroPython: 11 pasos
Programación de un Micro: Bit Robot & Joystick: Bit Controller con MicroPython: 11 pasos

Video: Programación de un Micro: Bit Robot & Joystick: Bit Controller con MicroPython: 11 pasos

Video: Programación de un Micro: Bit Robot & Joystick: Bit Controller con MicroPython: 11 pasos
Video: Arduino project 😎^ Arduino #arduino #2022 #2021 #2023 #dc #arduinoproject #diy #foryou 2024, Noviembre
Anonim
Programación de un Micro: Bit Robot & Joystick: Bit Controller con MicroPython
Programación de un Micro: Bit Robot & Joystick: Bit Controller con MicroPython

Para Robocamp 2019, nuestro campamento de robótica de verano, los jóvenes de 10 a 13 años están soldando, programando y construyendo un 'robot antweight' basado en micro: bit BBC, así como también programando un micro: bit para usar como control remoto.

Si se encuentra actualmente en Robocamp, salte al Paso 3, ¡ya que hemos realizado los dos primeros pasos como grupo

Esta es una guía paso a paso para lograr que un robot micro: bit se comunique con un controlador de joystick: bit.

No toma la ruta más rápida para que todo funcione, pero prueba las cosas en pequeños fragmentos para que pueda probar el código a medida que avanza, ponerle su propio sello y comprender por qué estamos haciendo las cosas que estamos haciendo. !

Para esta actividad, usamos nuestro propio robot personalizado, pero funcionará con cualquier robot que use un controlador de motor similar, como un L9110s.

Los archivos de diseño para nuestro robot se pueden encontrar aquí:

Esta guía está escrita para principiantes, pero si nunca antes ha usado un micro: bit con MicroPython, le recomendamos que pruebe primero un programa más simple, como nuestra placa de identificación Instructable: https://www.instructables.com/id/Felt -Microbit-Nam…

Suministros

2x BBC micro: bit

Robot que funciona con un BBC micro: bit (ver explicación arriba)

joystick: controlador de bits (obtuvimos el nuestro de Cool Components)

Paso 1: Configuración del robot

Tiene algunas opciones para escribir código MicroPython para su micro: bit:

  • Mu, que puede descargar e instalar desde aquí:
  • El editor en línea, que puede encontrar aquí:

Estas instrucciones asumen que está utilizando Mu

Abra Mu y conecte su micro: bit a su computadora. Mu debería reconocer que está usando un micro: bit y seleccionar micro: bit 'Mode', pero si no es así, cámbielo manualmente.

elegir modo
elegir modo

Obtenga una copia del código de prueba del motor del robot desde aquí:

Si no está acostumbrado a Github, ¡puede ser poco intuitivo! Dos formas sencillas de obtener este código son:

  1. Guarde el archivo Raw en su computadora, luego cárguelo en Mu:
  2. Copie y pegue todo el código dado en un archivo nuevo en Mu.
guardar archivo sin procesar
guardar archivo sin procesar

Ahora haga clic en el botón 'Flash' de la barra de herramientas de Mu, para enviar su nuevo código al micro: bit.

¡Esto no funcionará a menos que el micro: bit esté conectado

La luz amarilla en la parte posterior del micro: bit comenzará a parpadear. Cuando haya terminado, su código ha sido transferido.

CONFIGURACIÓN DE LAS DIRECCIONES DEL MOTOR

Este programa encenderá los motores en diferentes direcciones cuando presione el botón 'A' en el micro: bit.

Lo que quieres que suceda es:

  • Cuando se muestra 'A', el motor izquierdo avanza
  • Cuando se muestra 'B', motor izquierdo hacia atrás
  • Cuando se muestra 'C', el motor derecho avanza
  • Cuando se muestra 'D', motor derecho hacia atrás

¡Este probablemente no será el caso, ya que depende de cómo haya conectado su robot!

En la parte superior del código, encontrará una lista de variables, que determinan qué pin del micro: bit controla en qué dirección del motor.

Si está utilizando uno de nuestros robots (archivos), intercambie los nombres de las variables para que el robot se mueva en las direcciones correctas:

intercambiar variables de pin
intercambiar variables de pin

Si está utilizando un robot propio, verifique a qué pines está conectado el controlador del motor antes de editar el código.

PROBANDO LA UNIDAD

Ahora verifique cómo se conduce su robot reemplazando el código de prueba en el bucle principal con algún código propio.

Le dice al robot que conduzca llamando a la función drive (). Esto toma dos argumentos: un valor para el motor izquierdo y un valor para los motores derechos, entre 0 (apagado) y 1023 (velocidad máxima).

Al llamar drive (500, 500), por ejemplo, le está diciendo a ambos motores que se enciendan, en la dirección de avance, aproximadamente a la mitad de la velocidad.

Pruebe algunas opciones para tener una idea de qué tan recto se conduce y qué tan bien gira.

Sugerencia: las pruebas del motor estaban dentro de un bucle verdadero while y una declaración if: los motores no girarían hasta que presionaras el botón A en el micro: bit, y siempre está verificando si presionaste el botón A.

Sugerencia: los motores no se apagarán hasta que usted se lo indique. Siempre continuarán haciendo su última instrucción.

OPCIONAL: MEJORAR LA CONDUCCIÓN EN LÍNEA RECTA

Si su robot no se mueve en línea recta, es posible que uno de sus motores esté girando más rápido que el otro.

Después de comprobar que no hay nada que impida físicamente que la rueda gire libremente, puede editar el código en la función de conducción para reducir la velocidad del motor más rápido.

Desplácese hacia arriba para encontrar la definición de la función de conducción y observe las dos instrucciones superiores:

def drive (L, R):

# A continuación se muestra un ajuste para corregir la discrepancia de velocidad del motor L = int (L * 1) R = int (R * 1)

Estas dos líneas actualmente toman el valor de L y R, multiplíquelas por 1, luego asegúrese de que sigan siendo números enteros (int).

Por ejemplo, si su motor izquierdo es más rápido, cambie el * 1 en su línea a * 0.9 y vea si eso mejora las cosas.

No podrá hacerlo perfecto, pero puede seguir ajustando hasta que se conduzca más recto.

CONFIGURACIÓN DE LA RADIO

Ahora configure la radio, agregando las siguientes líneas en la parte superior de su código:

importar radio

radio.config (canal = 7, grupo = 0, cola = 1) radio.on ()

Esto permitirá que su robot reciba instrucciones de otro micro: bit, pero por el momento recibirá instrucciones de cualquier otro micro: bit.

Esto se debe a que el canal 7 y el grupo 0 son los canales predeterminados.

Cambie estos números, eligiendo un canal entre 0-82 y un grupo entre 0-255. Ahora su micro: bit solo recibirá instrucciones de otros con la misma información de configuración.

queue = 1 significa que micro: bit solo mantendrá un mensaje entrante a la vez; esto da un tiempo de respuesta ligeramente más rápido que el predeterminado, que es 3.

Ahora necesita editar su código de bucle principal para, en lugar de ejecutar instrucciones cuando presiona un botón, esperar un mensaje de radio entrante y responder adecuadamente.

Pruebe el siguiente código como prueba (no hará nada hasta que haya configurado el joystick en el Paso 2):

mientras que es cierto:

message = radio.receive () if message == 'forward': drive (500, 500)

Paso 2: Configuración del joystick

Desenchufe el micro: bit de su robot y en su lugar conecte el micro: bit de su joystick

Obtenga una copia del código de configuración del joystick desde aquí:

Configure la radio con la misma configuración (canal y número de grupo) que utilizó para el robot; esto permitirá que los dos se comuniquen entre sí.

Al final del programa, comience su ciclo principal:

mientras que es cierto:

if button_a.was_pressed (): radio.send ('adelante')

Este código aún no usa el joystick: bit. Utiliza el botón A en el micro: bit para enviar un mensaje.

Asegúrese de que tanto su robot como su controlador micro: bits tengan energía, luego presione el botón para enviar su mensaje.

Si el mensaje se recibe correctamente y su robot se mueve … ¡bien hecho! Ha terminado con las instrucciones de configuración.

CONSEJOS PARA SOLUCIONAR PROBLEMAS

Si recibe un mensaje de error en su controlador micro: bit … depure el código de su controlador

Si recibe un mensaje de error en su robot micro: bit … ¡su mensaje de radio se envió correctamente! Pero el robot no puede entenderlo, así que verifique que el mensaje que envió y el mensaje que le dijo al robot que escuchara coincidan.

Si no pasa nada en absoluto

  • Asegúrese de mostrar el código correcto en cada micro: bit; ¡es fácil mostrar accidentalmente el código incorrecto!
  • Asegúrate de que los números de tu canal y grupo coincidan en cada micro: bit

Paso 3: Comprobación de los valores de la palanca de mando

Los siguientes pasos son todos usando el código del controlador

Antes de poder usar el joystick en su controlador, necesita saber qué tipo de valores obtiene cuando empuja el joystick.

Reemplace su bucle principal con el siguiente código:

mientras que es cierto:

joystick = joystick_push () imprimir (joystick) dormir (500)

Actualice este código en su micro: bit, luego haga clic en el botón REPL en la barra de herramientas de Mu. Esto abrirá una terminal en la parte inferior del editor, que le brinda un enlace en tiempo real al micro: bit.

abre el REPL
abre el REPL

¡Esto no funcionará a menos que el micro: bit esté conectado

Con el REPL abierto, presione el botón de reinicio en la parte posterior de su micro: bit.

Imagen
Imagen

Debería ver algunos valores traer 'impreso' a su pantalla:

valores en terminal
valores en terminal

Empuje la palanca del joystick y vea qué sucede con los números.

Tome nota de los valores dados cuando el joystick está en la posición central, en mi caso (518, 523).

Vuelva a hacer clic en el botón REPL en la barra de herramientas de Mu para cerrarla; no podrá enviar un nuevo código al micro: bit mientras esté abierto.

Paso 4: Ajuste de las variables X e Y

Quiere cambiar los valores dados por la función del joystick, de modo que:

  • en el centro es cero
  • arriba es positivo
  • abajo es negativo.

Esto coincide con las instrucciones que necesita el robot: un número positivo para conducir hacia adelante y un número negativo para conducir hacia atrás.

Mira los números que obtuviste en el último paso. El primer número es x y el segundo número es y.

Edite la definición de joystick_push () que ya está en el programa, para menos sus valores del original:

def joystick_push ():

x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 return x, y

Utilice sus propios números, ¡pueden ser diferentes a los míos

Actualice su nuevo código, abra el REPL, presione el botón de reinicio del micro: bit y verifique sus valores.

¿Obtienes (0, 0)?

Paso 5: Conversión de X e Y en valores para los motores izquierdo y derecho

Por el momento, este joystick no será muy útil para conducir un robot. Si lo empuja hacia adelante hasta el final, obtendrá un valor como (0, 500).

Si le dieras estos números al robot, encendería el motor derecho pero no el izquierdo, ¡que no es lo que quieres que suceda!

Este diagrama muestra lo que sucede con los valores xey cuando mueves el joystick y lo que queremos que haga el robot cuando mueves el joystick.

diagrama
diagrama

Necesitas usar algunas matemáticas para mezclar los valores de x e y, para darte algo más útil.

norte

LAS MATEMÁTICAS

Comencemos empujando el joystick hasta el final.

Un ejemplo de los valores que puede obtener es:

x = 0

y = 500

Para ser útil para el robot, desea obtener valores como estos:

izquierda = 500

derecha = 500

Intentemos sumar xey de diferentes maneras para ver qué números obtenemos:

x + y = 0 + 500 = 500

x - y = 0 - 500 = -500 y + x = 500 + 0 = 500 y - x = 500 - 0 = 500

Ahora veamos qué sucede si empujamos el joystick completamente hacia la derecha.

Un ejemplo de los valores que puede obtener es:

x = 500

y = 0

Para hacer que el robot gire a la derecha, desea que el motor izquierdo avance y el motor derecho retroceda:

izquierda = 500

derecha = -500

Probemos de nuevo nuestra fórmula:

x + y = 500 + 0 = 500

x - y = 500 - 0 = 500 y + x = 0 + 500 = 500 y - x = 0 - 500 = -500

Compare los dos conjuntos de fórmulas para averiguar qué opción le dará el valor correcto a la izquierda y qué opción le dará el valor correcto a la derecha.

Pruébelo con algunos de los valores que obtiene de su propio joystick, para asegurarse de que la fórmula que elija funcione todo el tiempo.

norte

AMPLIACIÓN DE LA FUNCIÓN JOYSTICK

Expanda y edite la función del joystick para crear dos nuevas variables para la izquierda y la derecha, y para devolver esos valores en lugar de xey:

def joystick_push ():

x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 left = right = return left, right

Actualice su nuevo código, abra el REPL, presione el botón de reinicio del micro: bit y verifique sus valores.

¿Está obteniendo los valores que espera?

Si necesita más ayuda, consulte nuestro código de ejemplo aquí:

Paso 6: Envío de valores como mensajes de radio

Ahora tiene algunos valores listos para enviar a su robot.

Edite su bucle principal, de modo que verifique los valores del joystick, pero luego, en lugar de imprimir los valores, los prepare para enviarlos como un mensaje de radio.

mientras que es cierto:

joystick = joystick_push () mensaje = str (joystick [0]) + "" + str (joystick [1])

¡Esto todavía no enviará el mensaje!

¿Qué está pasando en esta nueva línea de código?

  • joystick [0] significa el primer bit de información que sale de la función de joystick (izquierda)
  • joystick [1] es el siguiente bit de información (derecha)
  • str () convierte ambos números en formato de cadena (texto en lugar de números); esto es necesario para poder enviar la información por radio.

Estará acostumbrado a ver que + significa suma: puede sumar números y concatenar cadenas, lo que significa que unirá los dos bits de información.

Ejemplo:

150 + 100 = 250

str (150) + str (100) = 150100

Por lo tanto, la concatenación mantendrá los valores izquierdo y derecho juntos.

Para forzar una separación entre los dos bits de información (para que el robot sepa que son dos bits de información), concatene una cadena adicional entre ellos usando "". Las marcas de habla alrededor del espacio significan que ya es una cadena.

Finalmente, amplíe su código para enviar este mensaje recién creado por la radio:

radio.send (mensaje)

dormir (10)

¡El sueño ralentiza el envío de mensajes para que el micro: bit receptor no se sobrecargue con demasiada información!

Actualice este código en su controlador micro: bit y depure cualquier error antes de pasar al siguiente paso

Paso 7: recibir los mensajes en su robot

Regrese a su código de robot desde el principio; recuerde desenchufar su controlador micro: bit para que no le muestre accidentalmente el código de robot

Desplácese hacia abajo hasta su bucle principal: elimine el código de prueba y agregue esto en su lugar:

mientras que es cierto:

message = radio.receive () print (message) sleep (100)

Esto establece una variable igual al mensaje entrante e imprime el mensaje en el REPL para verificar que los mensajes lleguen como se esperaba.

Actualice su nuevo código, conectado al REPL, luego presione el joystick.

Debería obtener algo como esto:

Valores REPL
Valores REPL

CONSEJOS PARA SOLUCIONAR PROBLEMAS

Si recibe un mensaje de error en su controlador micro: bit … depure el código de su controlador

Si recibe un mensaje de error en su robot micro: bit … ¡su mensaje de radio se envió correctamente! Pero el robot no puede entenderlo, así que verifique que el mensaje que envió y el mensaje que le dijo al robot que escuchara coincidan.

Si no pasa nada en absoluto

  • Asegúrese de mostrar el código correcto en cada micro: bit; ¡es fácil flashear accidentalmente el código incorrecto!
  • Asegúrate de que los números de tu canal y grupo coincidan en cada micro: bit

Paso 8: uso de los mensajes entrantes para controlar los motores del robot

Ahora está recibiendo dos números que se envían por radio como una cadena.

Debe dividir este mensaje en dos cadenas, luego convertir las cadenas nuevamente en números y pasar esto a la función de unidad. ¡Suceden muchas cosas a la vez!

Antes de hacer esto, debe verificar que el mensaje que está recibiendo esté en el formato correcto.

Si no se envían mensajes, recibirá "Ninguno" en su lugar. Si intenta dividir esto, obtendrá un mensaje de error.

mientras que es cierto:

message = radio.receive () si el mensaje no es None: message = message.split () drive (int (message [0]), int (message [1]))

¿Que está sucediendo aquí?

  • El nuevo código se ejecutará si el mensaje no es "Ninguno".
  • message.split () busca un espacio en el mensaje (que agregamos en el último paso) y lo usa para dividir el mensaje en dos.
  • int (mensaje [0]), int (mensaje [1]) hace lo contrario de lo que hicimos en el paso anterior: obtiene cada pieza de información individualmente y la convierte en un entero (un número entero).
  • int (mensaje [0]) se utiliza como valor para el motor izquierdo en la función de accionamiento, e int (mensaje [1]) se utiliza como valor para el motor derecho.

Compruebe que funciona: ¿giran los motores cuando empuja el joystick?

Si no es así, ¡es hora de depurarlo!

Si es así, ¡fantástico! ¡Tienes un robot de control remoto en funcionamiento!

Dedique un tiempo a practicar con su robot antes de pasar al siguiente paso. ¿Conduce de la forma esperada?

Los siguientes pasos le mostrarán cómo usar los botones del joystick para agregar funcionalidad adicional a su robot

Si desea ver nuestra versión de este código hasta ahora:

  • Robot:
  • Controlador:

Paso 9: Uso de los botones: recepción de mensajes adicionales

Por el momento, su código intentará dividir cualquier mensaje que no sea Ninguno. Esto significa que si recibe, por ejemplo, 'hola', recibirá un mensaje de error.

Para permitir que su micro: bit interprete otros mensajes, primero deberá verificar cada mensaje esperado y luego dividir el mensaje solo si no se le ha dicho que haga nada más con él.

Expanda su código así:

si el mensaje no es Ninguno:

if message == 'hola': display.show (Image. HAPPY) elif message == 'duck': display.show (Image. DUCK) else: message = message.split () drive (int (message [0]), int (mensaje [1]))

En primer lugar, comprobará si ha recibido el mensaje 'hola'. Si es así, mostrará una imagen feliz, luego regrese a la parte superior del bucle y verifique el siguiente mensaje.

Si el mensaje no es hola, luego comprobará si el mensaje es "pato".

Si el mensaje no es 'hola' O 'pato, hará lo último en la lista, que es dividir el mensaje y encender los motores. No intentará dividir el mensaje si ha recibido 'hola' o 'pato', lo que significa que no recibirá un mensaje de error de ninguno de estos dos mensajes.

El doble signo igual es importante: significa 'es igual a', en comparación con un solo signo igual, que está configurando algo (por lo que mensaje = 'hola' significa que estamos configurando la variable en 'hola', mensaje == 'hola' significa que estamos preguntando si el mensaje es igual a 'hola').

Pruébelo con solo dos opciones por ahora, para probarlo: puede agregar tantos otros mensajes como desee más adelante.

Enlace al código de trabajo:

Paso 10: Envío de mensajes adicionales mediante los botones del controlador

Desenchufe el micro: bit de su robot y en su lugar conecte el micro: bit de su joystick

Regrese al código de su controlador para editarlo.

Al igual que en el código del robot, queremos que el controlador compruebe si está intentando enviar otros mensajes antes de enviar los valores del joystick.

En la parte superior del ciclo, todavía queremos que verifique los valores actuales del joystick, pero también queremos que verifique si se está presionando un botón actualmente:

mientras que es cierto:

joystick = joystick_push () button = button_press ()

button_press () devuelve un valor A, B, C, D, E o F dependiendo del botón que se esté presionando actualmente (si no se presiona nada, devuelve None).

Ahora podemos hacer una declaración if-elif-else, como hicimos para el código del robot, usando dos botones y enviando el valor del joystick si no se presiona ningún botón.

si botón == 'A':

radio.send ('hola') dormir (500) botón elif == 'B': radio.send ('pato') dormir (500) else: mensaje = str (joystick [0]) + "" + str (joystick [1]) radio.send (mensaje) dormir (10)

Cuando se presiona un botón, envíe uno de los mensajes que le dijo al robot que buscara en el paso anterior.

El mensaje se enviará cada vez que se presione el botón, ¡y las computadoras son mucho más rápidas que las personas! Por lo tanto, es posible que envíe el mensaje muchas veces antes de que haya logrado quitar el dedo del botón.

El sueño después de enviar el mensaje lo ralentiza, por lo que no volverá a verificar el botón tan rápido; pruebe con algunos números aquí para obtener la cantidad de tiempo perfecta para usted, demasiado lento y no responderá también. rápidamente y su robot recibirá tantos mensajes de botones que podría dejar de responder al joystick.

¿Funciona?

Si recibe mensajes de error, piense detenidamente en lo que acaba de cambiar y en lo que está sucediendo.

Si obtiene un error en el robot cuando presiona un botón en su controlador, sabe que el mensaje se está transmitiendo, pero confunde al robot. Compruebe que el mensaje que ha enviado y el mensaje que le ha dicho al robot que busque sean los mismos.

Enlace al código de trabajo:

Paso 11: Pasos siguientes

Ahora tiene el conocimiento que necesita para trabajar con los motores de su robot y con su joystick: controlador de bits

Utilice este conocimiento para mejorar los dos programas y personalizarlos. ¡Algunas ideas a continuación!

¡Tienes seis botones en tu controlador! ¿Qué quieres que hagan?

  • ¿Qué tal programar una rutina de baile para que su robot lo haga cuando lo ordene? Escriba un algoritmo de comandos drive (), separados por comandos sleep ().
  • ¿Quiere cambiar la dirección en la que se mueve el robot para que pueda conducir fácilmente al revés? Piense en los valores xey de su joystick. ¿Qué representan y cómo podría manipularlos?
  • ¿Su robot tiene (¡o podría agregar!) Características adicionales como LED, un altavoz o sensores?

Ideas para mejorar el código

  • ¿Podrías ayudar a tu robot a lidiar con mensajes desconocidos usando el código try / except?
  • Las matemáticas utilizadas para calcular los valores izquierdo y derecho desde el joystick no nos dan el rango completo de valores (la unidad del robot puede aceptar un número hasta 1023). ¿Puedes editar este código para obtener un mejor rango?
  • Hay otros métodos para mezclar los valores del joystick. ¿Se le ocurre una forma mejor de hacerlo?

Recomendado: