Python

Python

Librería cyberpi

Los programas en python de cyberpi que vamos a realizar utilizan esta librería por lo tanto hay que cargarla previamente en nuestros programas.

import cyberpi

Tiene multitud de funciones, te aconsejamos ver un vistazo en esta documentación:

https://www.lbotics.at/images/mbot2/files/mBot2_API_cyberpi.pdf

Esta es una muy breve introducción al Python como recordatorio de algunas instrucciones si ya has utilizado este lenguaje.
Si es la primera vez, te recomendamos que visites nuestro curso PYTHON PARA TODOS Python for everybody por Charles R. Severance licencia CC-BY-NCSA que empieza desde cero.

Lenguajes, intérpretes y compiladores

Python es un lenguaje de alto nivel destinado a ser relativamente sencillo para que los humanos lean y escriban y para que los ordenadores lean y procesen. Otros lenguajes de alto nivel incluyen Java, C ++, PHP, Ruby, Basic, Perl, JavaScript y muchos más. El hardware real dentro de la Unidad Central de Procesamiento (CPU) no comprende ninguno de estos lenguajes de alto nivel.

La CPU entiende un idioma que llamamos lenguaje de máquina. El lenguaje de máquina es muy simple y francamente muy tedioso de escribir porque está representado en ceros y unos:

El lenguaje de máquina parece bastante simple en la superficie, dado que solo hay ceros y unos, pero su sintaxis es aún más compleja y mucho más compleja que Python. Muy pocos programadores escriben lenguaje de máquina. En su lugar, creamos varios traductores para permitir que los programadores escriban en lenguajes de alto nivel como Python o JavaScript y estos traductores convierten los programas al lenguaje de máquina para su ejecución real por parte de la CPU.

Estos traductores de lenguaje de programación se dividen en dos categorías generales: (1) intérpretes y (2) compiladores.

Un intérprete lee el código fuente del programa como está escrito por el programador, analiza el código fuente e interpreta las instrucciones sobre la marcha. Python es un intérprete y cuando ejecutamos Python de forma interactiva, podemos escribir una línea de Python (una oración) y Python la procesa de inmediato y está lista para que escribamos otra línea de Python.

    >>> x = 6
    >>> print(x)
    6
    >>> y = x * 7
    >>> print(y)
    42
    >>>

Está en la naturaleza de un intérprete poder tener una conversación interactiva como se muestra arriba. A un compilador debemos entregarle todo el programa en un archivo, y luego ejecuta un proceso para traducir el código fuente de alto nivel al lenguaje de máquina y luego el compilador coloca el lenguaje de máquina resultante en un archivo para su posterior ejecución.

Variables

Las variables son como cajas que puedes meter valores. Y los valores pueden ser de varios tipos :

Para crear una variable puedes usar cualquier palabra, x, y, z o Nombre_alumno ... pero algunas palabras no puedes usar, ver

Para visualizar variables puedes usar la instrucción print poniendo entre paréntesis el valor o variable que quieres visualizar.

En la siguiente ventana puedes dar al botón play y ver el resultado

Modifica los valores como quieras, es un intérprete, juega y dale al play para ver el resultado 

Como puedes ver se ha introducido un operador el + que realiza la suma del valor de x original (43) y se le incrementa una unidad resultando en la impresión un 44.

Cadenas

Cadenas son secuencias de caracteres, por ejemplo la palabra "banana"

2025-04-05 09_29_39-Editing Page 6 Cadenas _ Librería CATEDU.png
fuente  
'Python for Everybody' por Charles R. Severance

Se puede obtener su longitud con la función len, o obtener un carácter ...

Operadores

Este apartado de operadores es adaptado de Federico Coca Guia de Trabajo de Microbit CC-BY-SA

Los operadores aritméticos se utilizan para realizar operaciones matemáticas como sumas, restas, multiplicaciones, etc.

Operador Descripción Ejemplo
+ Suma o concatenación en textos 5+3=8"Hola" + "Mundo" = "Hola Mundo
- Diferencia 6-3=3
* Multiplicación 3*3=9
/ División 6/2=3
// Parte entera de un cociente 10//3=3
% Resto de un cociente 10%3=1
** Potenciación 5**2=25

Los operadores de asignación se utilizan para asignar valores a variables.

Operador Descripción Ejemplo
= Asignación x=4a = a + 1
+= Suma y asignación x+=1 equivale a x = x + 1
-= Diferencia y asignación x-=1 equivale a x = x - 1
*= Multiplicación y asignación x*=3 equivale a x = x * 3
/= División y asignación x/=3 equivale a x = x / 3
%= Asignación de restos x%=3 equivale a x = x % 3
**= Asignación de exponentes x**=3 equivale a x = x ** 3

Los operadores de comparación comparan dos valores/variables y devuelven un resultado booleano: Verdadero o Falso True o False.

Operador Descripción Ejemplo
== Igual a 2==3 retorna False
!= Distinto de 2!=3 retorna True
< Menor que 2<3 retorna True
> Mayor que 2>3 retorna False
<= Menor o igual que 2<=3 retorna True
>= Mayor o igual que 2>=3 retorna False

Los operadores lógicos se utilizan para comprobar si una expresión es Verdadera o Falsa. Se utilizan en la toma de decisiones.

Operador Descripción Ejemplo
and AND lógica a and b #True si a y b son ciertos
or OR lógica a or b #True si a o b son ciertos
not NOT lógica not a #True si el operador a es falso
in pertenencia Devuelve True si pertenece
no int no pertenencia Devuelve True si no pertenece
is identidad Devuelve True si son iguales
is not no identidad Devuelve True si no son inguales

Los operadores bit a bit o bitwise actúan sobre los operandos como si fueran cadenas de dígitos binarios. Operan bit a bit:

Operador Descripción Ejemplo
& AND bit a bit 5&6 # 101 & 110 = 110 = 4
| OR bit a bit 5 \| 6 # 101 \| 110 = 111 = 7
~ NOT bit a bit ~3 # ~011 = 100 = -4
^ XOR bit a bit 5^3 # 101^011 = 110 = 6
<< Desplazamiento izquierda 4<<1 # 100 << 1 = 1000 = 8
>> Desplazamiento derecha 4 >> 1 # 100 >> 1 = 010 = 2

Prueba, juega con este código:




Comentarios en Python
Una sola línea : Escribiendo el símbolo almohadilla (#) delante del comentario.
Multilínea: Escribiendo triple comillas dobles (“””) al principio y al final del comentario.

Entradas de teclado

Ya hemos visto salidas por pantalla con print, pero ahora con input puede leer variables del teclado, esto es mejor experimentarlo que leerlo :

Fíjate que hay que poner las líneas x = float (x) e y = float(y) para convertirlos a números decimales, en caso contrario las interpreta string y no puede multiplicar en Resultado, pero en el siguiente ejemplo no es necesario en la variable cel (celsius) pues se multiplica por números decimales 32.0 5.0 y 9.0 

try y except son dos funciones que son un seguro para el programador por si el usuario en vez de teclear un número, mete un string o carácter

La sangría es importante en Python
La sangría se refiere a los espacios al comienzo de una línea de código. Mientras que en otros lenguajes de programación la sangría en el código es solo para facilitar la lectura, la sangría en Python es muy importante ya que se usa para indicar un bloque de código.

Condicionales

Las instrucciones if: else: son las que nos permiten realizar operaciones según las condiciones puestas. Ojo con la sangría

\n es un carácter especial que significa "Salto de página"

Bucles

Para verlo mejor vamos a ver estos ejemplos

Venga pruébalo !!!

Funciones

No vamos a entrar en detalle, pero observa el siguiente código

Para saber más de Python

CURSO PYTHON FOR EVERYBODY en español ver
Curso completo de Python 222pag pdf (*) Descargar
Curso completo de Python 422pag (*) Descargar
Curso completo de Python desde 0 (*) Ver
Curso de Python desde 0 (*) Ver
Manual de referencia Python (*) Ver
Programación en Python (*) Ver
Trabajando con ficheros en Python (*) Ver
Programación orientada a objeto en Python (*) Ver
un manual para aquellos usuarios con previos conocimientos de Python, como la programación modular y orientada a objetos.
También algunos conocimientos de las librerías tkinter  (Para crear interfaces gráficos y SQlite3 (para gestionar bases de datos). (*)
Descargar

(*) Agradecimientos a Pere Manel http://peremanelv.com

Hola Mundo

Nuestro primer programa es muy sencillo: Que por el display del Cyberpi salga la típica frase del primer programa principiante

A la hora de utilizar las funciones de la librería cyberpi, tienes dos opciones:

Mi primer programa Hola Mundo (método sin omitir)

Entramos en mBlock, y en la pestaña de Python tecleamos este programa:

import cyberpi
cyberpi.console.print("Hola Mundo")

Previamente tienes que tener el programa mBlock instalado y cargado el dispositivo mBot2 (aunque para estos ejemplos con Cyberpi también vale) , recuerda lo visto en https://libros.catedu.es/books/cyberpi-y-mbot2/page/mblock5 y en https://libros.catedu.es/books/cyberpi-y-mbot2/page/como-usar-mbot2-en-mblock

  1. Entramos en mblock con el dispositivo cargado mBot2 y vamos a la pesaña Python
  2. Pegamos el programa
  3. Vamos a conectar mBot2 (debemos de tenerlo conectado con un cable USB tal y como vimos en https://libros.catedu.es/books/cyberpi-y-mbot2/page/mi-primer-programa-hola-mundo
  4. Damos a la opción Cargar
  5. Subir código

2025-04-29 12_46_26-mBlock v5.4.3.png

Y el resultado es 

2025-04-29 12_50_34-WhatsApp.png

Mi primer programa Hola Mundo (método omitiendo)

Repite los pasos anteriores pero con este código

from cyberpi import *
console.print("Hola Mundo")

¿Ves la diferencia de código?

Audio

Un tono

Un programa sencillo de dar un tono puede ser el siguiente

import cyberpi

cyberpi.audio.set_vol(100)
cyberpi.audio.play_tone(700,1)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

Instrumentos

También podemos reproducir instrumentos

import cyberpi

cyberpi.audio.set_vol(100)
# str type eg. snare,bass-drum,side-stick,crash-cymbal,open-hi-hat,close-hi-hat,tambourine,hand-clap,claves 
# float beat > 0 (second)

cyberpi.audio.play_drum("snare",1)
cyberpi.audio.play_drum("snare",1)
cyberpi.audio.play_drum("side-stick",1)
cyberpi.audio.play_drum("tambourine",1)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

Efectos sonoros

También este código nos selecciona varios efectos sonoros y los reproduce

import cyberpi

sound_effect = ["hello","hi","bye","yeah","wow","laugh","hum","sad","sigh","annoyed","angry","surprised","yummy","curious","embarrassed","ready","sprint","sleepy","meow","start","switch","beeps","buzzing","explosion","jump","laser","level-up","low-energy","prompt-tone","right","wrong","ring","score","wake","warning","metal-clash","shot","glass-clink","inflator","running water","clockwork","click","current","switch","wood-hit","iron","drop","bubble","wave","magic","spitfire","heartbeat","load"]

cyberpi.display.show_label('UP  :GO   UP\nDOWN:GO   DOWN\nMID :PLAY EFFECT', 16, 0, 0, 0)
cyberpi.display.show_label('SELECT:\nName:', 16, 0, 60, 1)

selected = 0
min_effect = 0
max_effect = len(sound_effect) - 1

while True:
    if cyberpi.controller.is_press('up'):
        if selected < max_effect:
            selected += 1
        else:
            selected = min_effect
    elif cyberpi.controller.is_press('down'):
        if selected > min_effect:
            selected -= 1
        else:
            selected = max_effect
    elif cyberpi.controller.is_press('middle'):
        cyberpi.led.on(255,0,0,id="all")
        cyberpi.audio.play_until(sound_effect[selected])
        cyberpi.led.on(0,0,0,id="all")

    cyberpi.display.show_label('{}'.format(selected), 16, 60, 60, 2)
    cyberpi.display.show_label('{}'.format(sound_effect[selected]), 12, 52, 80, 3)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

Grabadora

O hacernos una grabadora de bolsillo

import cyberpi
from time import sleep

cyberpi.audio.set_vol(100)

cyberpi.display.show_label("A:Start Recording\nB:Play Recording",12,0,0,0)

while True:
    cyberpi.display.show_label("Waiting.",16,0,40,1)
    if cyberpi.controller.is_press('a'):
        cyberpi.led.on(0,255,0,id="all")
        cyberpi.display.show_label("Listening..",16,0,40,1)
        cyberpi.audio.record()
        sleep(5)
        cyberpi.display.show_label("Finished..",16,0,40,1)
        cyberpi.audio.stop_record()

    elif cyberpi.controller.is_press('b'):
        cyberpi.led.on(0,0,255,id="all")
        cyberpi.display.show_label("Playing..",16,0,40,1)
        cyberpi.audio.play_record_until()
        cyberpi.display.show_label("Finished..",16,0,40,1)

    cyberpi.display.show_label("Waiting...",16,0,40,1)
    cyberpi.led.on(0,0,0,id="all")
    

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

LED

Colores

Podemos fijar los colores de los leds de Cyberpi con este código

import cyberpi

#               R  G B Position
cyberpi.led.on(255,0,0,id=1)
cyberpi.led.on(255,255,0,id=2)
cyberpi.led.on(255,255,255,id=3)
cyberpi.led.on(0,255,0,id=4)
cyberpi.led.on(0,255,255,id=5)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

2025-04-29 15_08_28-WhatsApp.png

Intermitencia

Podemos encender y apagar a voluntad

import cyberpi
from time import sleep

while True:
    #               R  G B Position
    cyberpi.led.on(255,0,0,id=1)
    cyberpi.led.on(255,255,0,id=2)
    cyberpi.led.on(255,255,255,id=3)
    cyberpi.led.on(0,255,0,id=4)
    cyberpi.led.on(0,255,255,id=5)
    sleep(1)
    #               Position 
    cyberpi.led.off(id='all')
    sleep(1)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

Arco Iris
import cyberpi

"""
Name List (str)

rainbow , spoondrift , meteor_blue , meteor_green ,
flash_red , flash_orange , firefly

"""

cyberpi.led.play(name = "rainbow")

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT


Movimiento leds
import cyberpi
from time import sleep

cyberpi.led.on(255,0,0,id=1)
while True:
    # shift all the colors 1 step to the right.
    # (If it is negative, it will be left shifting.)
    cyberpi.led.move(1)
    sleep(1)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT



Entradas

Botones A y B

Si aprieto el botón A pues enciendo leds, si aprieto B los apago

import cyberpi

"""
Button Name List (str)

a , b 
up, down, left , right , middle
any_direction , any_button , any

"""
while True:
                             # button name
    if cyberpi.controller.is_press('a'):
        cyberpi.led.on(255,0,0,id='all')
        cyberpi.console.println("LED ON!")
    if cyberpi.controller.is_press('b'):
        cyberpi.led.on(0,0,0,id='all')
        cyberpi.console.println("LED OFF!")

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

Intensidad de la luz
import cyberpi

cyberpi.display.show_label("LUZ=",16,0,0,0)

while True:
    CantidadLuz = cyberpi.get_brightness()
    cyberpi.display.show_label(CantidadLuz,16,0,60,1)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

 

Cantidad de sonido
import cyberpi

cyberpi.display.show_label("Loudness:",16,10,10,index=1)

while True:
    loudness_value = cyberpi.get_loudness()
    cyberpi.display.show_label(loudness_value,16,80,10,index=2)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

 

Nivel de batería
import cyberpi

cyberpi.display.show_label("Battery Level",16,10,0,index=0)
cyberpi.display.show_label("Builtin:",16,10,20,index=1)
cyberpi.display.show_label("Extra:",16,10,40,index=2)

while True:
    builtin_batt = cyberpi.get_battery()
    extra_batt = cyberpi.get_extra_battery()
    
    cyberpi.display.show_label(builtin_batt,16,80,20,index=3)
    cyberpi.display.show_label(extra_batt,16,80,40,index=4)

 

Display

Contador
import cyberpi

cyberpi.display.show_label("Counter Program",16,0,0,0)
counter = 0

while True:
    
    if counter < 100:
        counter = counter + 1
    else:
        counter = 0
    cyberpi.display.set_brush(counter+100, 0, 0)
    cyberpi.display.show_label(counter,32,48,64,1)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

Limpiar y apagar la pantalla
import cyberpi

cyberpi.display.on()

cyberpi.display.show_label("A:Clear the Sceen",12,0,0,0)
cyberpi.display.show_label("B:Close the screen",12,0,24,1)

while True:
    if cyberpi.controller.is_press('a'):
        cyberpi.display.clear()
    elif cyberpi.controller.is_press('b'):
        cyberpi.display.off()

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

Linechart

El display permite visualizar gráficas como por ejemplo este código

import cyberpi

value = 0

while True:
    if value < 100:
        value = value + 1
    else:
        value = 0
    cyberpi.linechart.add(value)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

Barchart
import cyberpi

value = 0

while True:
    if value < 100:
        value = value + 0.1
    else:
        value = 0
    cyberpi.barchart.add(value)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

Table
import cyberpi

cyberpi.display.set_brush(255,0,0)
cyberpi.table.add(1,1,"1,1")
cyberpi.table.add(2,1,"2,1")
cyberpi.table.add(3,1,"3,1")
cyberpi.table.add(4,1,"4,1")

cyberpi.display.set_brush(0,255,0)
cyberpi.table.add(1,2,"1,2")
cyberpi.table.add(2,2,"2,2")
cyberpi.table.add(3,2,"3,2")
cyberpi.table.add(4,2,"4,2")

cyberpi.display.set_brush(0,0,255)
cyberpi.table.add(1,3,"1,3")
cyberpi.table.add(2,3,"2,3")
cyberpi.table.add(3,3,"3,3")
cyberpi.table.add(4,3,"4,4")

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

2025-04-29 20_15_40-WhatsApp.png

Drawpixel
import cyberpi
import time


pixel_list = ["music","picture","video","clock","play","pause","next","prev","sound","temperature","light","motion","home","gear","list","right","wrong","shut_down","refresh","trash_can","download","sunny","cloudy","rain","snow","train","rocket","car","truck","droplet","distance","fire","magnetic","gas","vision","color","overcast","foggy","sandstorm"]

my_sprite = cyberpi.sprite()
for p in pixel_list:
   
    my_sprite.draw_pixel(p)
    my_sprite.set_size(200)
    time.sleep(1)
    cyberpi.screen.render()

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

 

QR
import cyberpi

my_sprite = cyberpi.sprite()
my_sprite.draw_QR("https://catedu.es/")
my_sprite.set_size(400)
cyberpi.screen.render()

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

2025-04-29 20_26_54-WhatsApp.png

¡¡ y funciona !!!

 

Sensores de movimiento

Sensor agitación
import cyberpi

cyberpi.display.show_label("Shake Value\nA:Start",16,0,0,0)

while not cyberpi.controller.is_press('a'):
    pass

while True:
    shake_value = cyberpi.get_shakeval()
    cyberpi.display.show_label("Shake Value",16,20,0,0)
    cyberpi.display.show_label("{}%".format(shake_value),24,40,50,1)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

 

Inclinación y rotación

El siguiente programa enseña los dos ángulos de inclinación en eje X e Y y rotación en eje Z

import cyberpi

cyberpi.display.show_label("YAW PITCH ROLL\nA:Start",16,0,0,0)

while not cyberpi.controller.is_press('a'):
    pass
while True:
    pitch = cyberpi.get_pitch()
    roll = cyberpi.get_roll()
    yaw = cyberpi.get_yaw()

    cyberpi.display.show_label("Yaw\n\nPitch\n\nRoll\n\n",16,0,0,0)
    cyberpi.display.show_label("{}\n\n{}\n\n{}".format(pitch,roll,yaw),16,50,0,1)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

El resultado es muy parecido con la función de gyro

import cyberpi

cyberpi.reset_rotation(axis='all')
cyberpi.display.show_label("Gyroscope\nA:Start",16,0,0,0)

while not cyberpi.controller.is_press('a'):
    pass
    
while True:
    x_gyro = cyberpi.get_gyro('x')
    y_gyro = cyberpi.get_gyro('y')
    z_gyro = cyberpi.get_gyro('z')

    cyberpi.display.show_label("X\n\nY\n\nZ\n\n",16,0,0,0)
    cyberpi.display.show_label("{}\n\n{}\n\n{}".format(x_gyro,y_gyro,z_gyro),16,50,0,1)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

Y rotation

import cyberpi

cyberpi.reset_rotation(axis='all')
cyberpi.display.show_label("Rotation\nA:Start",16,0,0,0)

while not cyberpi.controller.is_press('a'):
    pass
    
while True:
    x_rotate = cyberpi.get_rotation('x')
    y_rotate = cyberpi.get_rotation('y')
    z_rotate = cyberpi.get_rotation('z')

    cyberpi.display.show_label("X\n\nY\n\nZ\n\n",16,0,0,0)
    cyberpi.display.show_label("{}\n\n{}\n\n{}".format(x_rotate,y_rotate,z_rotate),16,50,0,1)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

 

El tiempo (servicios en la nube)

Podemos ver el tiempo que hace en una localidad utilizando el siguiente código:

import cyberpi

ssid = "PON-EL-NOMBRE-DE-TU-WIFI"
pwd = "CLAVE-DE-TU-WIFI"
auth_key = "TU-ID-CLOUD"
location_id = "3127059" # CALAMOCHA SEGÚN https://www.meteoblue.com/es/tiempo/semana/calamocha_espa%c3%b1a_3127059

cyberpi.led.on(255,0,0,id='all')
cyberpi.display.show_label("WiFi:",12,0,0,0)

if not cyberpi.wifi.is_connect():
    cyberpi.display.show_label("WiFi: No Connect",12,0,0,0)
    cyberpi.wifi.connect(ssid,pwd)
    while not cyberpi.wifi.is_connect():
        cyberpi.display.show_label("Connecting..",12,0,20,1)

cyberpi.display.clear()
cyberpi.display.show_label("Status: Connected!",12,0,0,0)
cyberpi.led.on(0,255,0,id='all')

cyberpi.cloud.setkey(auth_key)

max_temp = cyberpi.cloud.weather("max_temp",location_id)
min_temp = cyberpi.cloud.weather("min_temp",location_id)
weather = cyberpi.cloud.weather("weather",location_id)
humidity = cyberpi.cloud.weather("humidity",location_id)

cyberpi.display.show_label("Max Temperature: {} C".format(max_temp),12,0,20,1)
cyberpi.display.show_label("Min Temperature: {} C".format(min_temp),12,0,32,2)
cyberpi.display.show_label("Weather: {}".format(weather),12,0,42,3)
cyberpi.display.show_label("Humidity: {} %".format(humidity),12,0,52,4)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

El resultado es (hemos puesto Calamocha)

2025-04-29 21_13_33-WhatsApp.png

No entendemos por qué no nos enseña la temperatura mínima, y además hemos elegido una localidad con estación meteorológica VOR que tiene el récord de temperatura más fría en zona habitada

Bueno ... mentirijilla, el VOR esta en Fuentes Claras, no en Calamocha

Hay más ejemplos en https://github.com/PerfecXX/Python-mBot2/tree/main/example/cyberpi/08-Cloud como la calidad del aire, pero no todas las localidades tienen datos.

Envío de mensajes con dos mBots2

En dos mBot2 le ponemos el siguiente código:

import cyberpi

ssid = "catedu"
pwd = "alcorisa"
topic = "/test_room"

cyberpi.led.on(255,0,0,id='all')
cyberpi.display.show_label("WiFi:",12,0,0,0)

if not cyberpi.wifi.is_connect():
    cyberpi.display.show_label("WiFi: No Connect",12,0,0,0)
    cyberpi.wifi.connect(ssid,pwd)
    while not cyberpi.wifi.is_connect():
        cyberpi.display.show_label("Connecting..",12,0,20,1)

cyberpi.display.clear()
cyberpi.display.show_label("WiFi: Connected!\nEnvío de mensaje botón A o B:\n Preparado también para recepción ..",12,0,0,0)
cyberpi.led.on(0,255,0,id='all')

while True:
    ## envio de mensaje
    message = cyberpi.wifi_broadcast.get(topic)
    cyberpi.display.show_label("{}".format(message),12,0,60,1)
    # envío de mensaje
    if cyberpi.controller.is_press('a'):
        cyberpi.wifi_broadcast.set(topic,"\nHola soy CATEDU")
    elif cyberpi.controller.is_press('b'):
        cyberpi.wifi_broadcast.set(topic,"\nBienvenido a los cursos de Aularagón")

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

Realmente en https://github.com/PerfecXX/Python-mBot2/tree/main/example/cyberpi/07-LAN/01-Send_Receive se utilizan DOS códigos, uno para el emisor y otro para el receptor, lo que se ha hecho en el código de arriba es unirlos.

Inteligencia Artificial IA

Reconocimiento de texto

El siguiente código se conecta a un servidor para leer un texto en un idioma concreto

import cyberpi

ssid = "MIWIFI"
pwd = "CONTRASENAWIFI"

cyberpi.driver.cloud_translate.TTS_URL = "{TTSURL}"
cyberpi.driver.cloud_translate.set_token("{ACCESSTOKEN}")
cyberpi.driver.cloud_translate.TRANS_URL = "{TRANSURL}"
cyberpi.driver.cloud_translate.set_token("{ACCESSTOKEN}")
cyberpi.speech.set_recognition_address(url = "{NAVIGATEURL}")
cyberpi.speech.set_access_token(token = "{ACCESSTOKEN}")

cyberpi.led.on(255,0,0,id='all')
cyberpi.display.show_label("WiFi:",12,0,0,0)

if not cyberpi.wifi.is_connect():
    cyberpi.display.show_label("WiFi: No Connect",12,0,0,0)
    cyberpi.wifi.connect(ssid,pwd)
    while not cyberpi.wifi.is_connect():
        cyberpi.display.show_label("Connecting..",12,0,20,1)

cyberpi.display.clear()
cyberpi.display.show_label("Status: Connected!",12,0,0,0)
cyberpi.led.on(0,255,0,id='all')

cyberpi.display.show_label("Wait...",12,0,20,1)
cyberpi.led.on(0,0,255,id='all')
cyberpi.cloud.tts("es","Bienvenido CATEDU")
cyberpi.cloud.tts("en","I speak English better: Wellcome to CATEDU")
cyberpi.led.on(0,0,0,id='all')
cyberpi.display.show_label("Finished!",12,0,20,1)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

Reconocimiento de voz

En este caso hemos seleccionado el idioma 4 (el primero chinese es el 0) luego reconoce voz en idioma inglés

import cyberpi
from time import sleep

ssid = "MIWIFI"
pwd = "CONTRASENAWIFI"

langauge_list = ["chinese","chinese_taiwan","cantonese","japanese","english","french","german","spanish","portuguese","russian","korean","italian","Dutch"]

cyberpi.driver.cloud_translate.TTS_URL = "{TTSURL}"
cyberpi.driver.cloud_translate.set_token("{ACCESSTOKEN}")
cyberpi.speech.set_recognition_address(url = "{NAVIGATEURL}")
cyberpi.speech.set_access_token(token = "{ACCESSTOKEN}")
cyberpi.driver.cloud_translate.TRANS_URL = "{TRANSURL}"
cyberpi.driver.cloud_translate.set_token("{ACCESSTOKEN}")

cyberpi.led.on(255,0,0,id='all')
cyberpi.display.show_label("WiFi:",12,0,0,0)

if not cyberpi.wifi.is_connect():
    cyberpi.display.show_label("WiFi: No Connect",12,0,0,0)
    cyberpi.wifi.connect(ssid,pwd)
    while not cyberpi.wifi.is_connect():
        cyberpi.display.show_label("Connecting..",12,0,20,1)

cyberpi.display.clear()
cyberpi.display.show_label("WiFi: Connected!",12,0,0,0)
cyberpi.led.on(0,255,0,id='all')

while True:
    cyberpi.display.show_label("A:Start Recognize",12,0,20,1)
    cyberpi.led.on(0,0,0,id='all')

    if cyberpi.controller.is_press('a'):
        sleep(0.5)
        cyberpi.led.on(0,0,255,id='all')
        cyberpi.display.show_label("Recognizing...",12,0,40,2)
        cyberpi.cloud.listen(langauge_list[4], 5)
        cyberpi.display.show_label("Processing...",12,0,40,2)
        cyberpi.led.on(0,0,0,id='all')
        recog_result = cyberpi.cloud.listen_result()
        cyberpi.display.show_label("Recognition Result\n\n{}".format(recog_result),12,0,40,2)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT
El resultado es

Traductor

En este caso le damos un texto que le decimos en qué idioma está (el 7=español) y le pedimos que nos lo traduzca al 4=inglés

import cyberpi

ssid = "MIWIFI"
pwd = "MICLAVEWIFI"

langauge_list = ["chinese","chinese_taiwan","cantonese","japanese","english","french","german","spanish","portuguese","russian","korean","italian","Dutch"]
cyberpi.driver.cloud_translate.TTS_URL = "{TTSURL}"
cyberpi.driver.cloud_translate.set_token("{ACCESSTOKEN}")
cyberpi.speech.set_recognition_address(url = "{NAVIGATEURL}")
cyberpi.speech.set_access_token(token = "{ACCESSTOKEN}")
cyberpi.driver.cloud_translate.TRANS_URL = "{TRANSURL}"
cyberpi.driver.cloud_translate.set_token("{ACCESSTOKEN}")

cyberpi.led.on(255,0,0,id='all')
cyberpi.display.show_label("WiFi:",12,0,0,0)

if not cyberpi.wifi.is_connect():
    cyberpi.display.show_label("WiFi: No Connect",12,0,0,0)
    cyberpi.wifi.connect(ssid,pwd)
    while not cyberpi.wifi.is_connect():
        cyberpi.display.show_label("Connecting..",12,0,20,1)

cyberpi.display.clear()
cyberpi.display.show_label("WiFi: Connected!",12,0,0,0)
cyberpi.led.on(0,255,0,id='all')

text = "Bienvenido a los cursos a distancia de CATEDU"
cyberpi.display.show_label("translate: \n{} in {}".format(text,langauge_list[7]),12,0,10,1)
translated_text = cyberpi.cloud.translate(langauge_list[4], text)
cyberpi.display.show_label("Result: \n{}".format(translated_text),12,0,70,2)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

2025-04-29 23_09_43-.png

Movimientos

Los movimientos de mBot2 se pueden definir por tiempo, distancia, ángulo y potencia, gracias a sus precisos motores de paso

Pequeño baile con tiempo definido
import cyberpi, mbot2

cyberpi.display.show_label("mBot2 Movement",16,0,0,0)
cyberpi.display.show_label("A:Start Moving!",16,0,20,1)

while True:
    
    while not cyberpi.controller.is_press('a'):
        pass

    cyberpi.display.show_label("Forward 60 RMP 1 Sec",12,0,40,2)
    mbot2.forward(60,1)
    cyberpi.display.show_label("Backward 60 RMP 1 Sec",12,0,40,2)
    mbot2.backward(60,1)
    cyberpi.display.show_label("Turn Left 60 RMP 1 Sec",12,0,40,2)
    mbot2.turn_left(60,1)
    cyberpi.display.show_label("Turn Right 60 RMP 1 Sec",12,0,40,2)
    mbot2.turn_right(60,1)
    cyberpi.display.show_label("Finished!",12,0,40,2)

Pequeño baile con distancia definida

En este código le decimos que vaya exactamente 100 cm

import cyberpi, mbot2

cyberpi.display.show_label("mBot2 Straight",16,0,0,0)
cyberpi.display.show_label("A:Start Moving!",16,0,20,1)

while True:
    
    while not cyberpi.controller.is_press('a'):
        pass

    cyberpi.display.show_label("Forward 100 cm",12,0,40,2)
    mbot2.straight(100)
    cyberpi.display.show_label("Backward 100 cm",12,0,40,2)
    mbot2.straight(-100)
    cyberpi.display.show_label("Finished!",12,0,40,2)
Pequeño baile con ángulos definidos

En este que gire +90º y luego -90º

import cyberpi, mbot2

cyberpi.display.show_label("mBot2 Rotation",16,0,0,0)
cyberpi.display.show_label("A:Rotate Left\nB:Rotate Right",16,0,20,1)

while True:
    
    if cyberpi.controller.is_press('a'):
        cyberpi.display.show_label("Turn Left 90",12,0,60,2)
        mbot2.turn(-90)
    elif cyberpi.controller.is_press('b'):
        cyberpi.display.show_label("Turn Right 90",12,0,60,2)
        mbot2.turn(90)
Pequeño baile con potencia definida
import cyberpi, mbot2
from time import sleep

cyberpi.display.show_label("mBot2 EM Power",16,0,0,0)

while not cyberpi.controller.is_press('a'):
        pass
        
mbot2.drive_power(100, -100)
sleep(1)
mbot2.drive_power(0, 0)

 

Sensor ultrasonidos

Medición de distancia 
import cyberpi,mbuild

cyberpi.display.show_label("Range:", 16, 0, 0, index = 0)

while True:
    range = mbuild.ultrasonic2.get(index = 1)
    cyberpi.display.show_label(range, 16, 50, 0, index = 1)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

Podemos experimentar que es bastante preciso, más que en mBot1

2025-04-30 08_18_12-WhatsApp.png

Este código haría lo mismo pero alarmando que hay obstáculo o no

import cyberpi,mbuild

cyberpi.display.show_label("Range:", 16, 20, 0, index = 0)

while True:
    range = mbuild.ultrasonic2.get(index = 1)
    cyberpi.display.show_label(range, 16, 70, 0, index = 1)
    
    if range < 10:
        cyberpi.led.on(255,0,0,id="all")
        cyberpi.display.show_label("Obstacle!", 16, 0, 20, index = 2)
    else:
        cyberpi.led.on(0,255,0,id="all")
        cyberpi.display.show_label("No Obstacle", 16, 0, 20, index = 2)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT

 

Evita obstáculos

Basándonos en el código que hemos visto de https://github.com/PerfecXX/Python-mBot2/blob/main/example/mbuild/01-Ultrasonic%20Sensor2/02-Obstacle%20Detection.py le añadimos las instrucciones de

Previamente una rutina de no empezar si no se aprieta el botón A

import cyberpi,mbuild, mbot2

cyberpi.display.show_label("PULSA A PARA COMENZAR",16,0,20,1)
while not cyberpi.controller.is_press('a'):
        pass

while True:
    range = mbuild.ultrasonic2.get(index = 1)
    cyberpi.display.show_label(range, 16, 70, 0, index = 1)
    
    if range < 40:
        cyberpi.led.on(255,0,0,id="all")
        cyberpi.display.show_label("Obstacle!", 16, 0, 20, index = 2)
        cyberpi.display.show_label("Girando un segundo",12,0,60,2)
        mbot2.turn_left(60,1)
    else:
        cyberpi.led.on(0,255,0,id="all")
        cyberpi.display.show_label("No Obstacle", 16, 0, 20, index = 2)
        mbot2.drive_power(70, -70)
    

a lo mejor habría que quitarle un poco la potencia en mbot2.drive_power(70, -70) pero mola :

Sensor de líneas

Probando la detección de líneas.
import cyberpi,mbuild

cyberpi.display.show_label("RGB PROBE STATE\nL2:\nL1:\nR1:\nR2:\n", 16, 0, 0, index = 0)

while True:
    l2_line_state = mbuild.quad_rgb_sensor.is_line("L2",1)
    l1_line_state = mbuild.quad_rgb_sensor.is_line("L1",1)
    r1_line_state = mbuild.quad_rgb_sensor.is_line("R1",1)
    r2_line_state = mbuild.quad_rgb_sensor.is_line("R2",1)

    cyberpi.display.show_label(l2_line_state, 16, 30, 18, index = 1)
    cyberpi.display.show_label(l1_line_state, 16, 30, 36, index = 2)
    cyberpi.display.show_label(r1_line_state, 16, 30, 54, index = 3)
    cyberpi.display.show_label(r2_line_state, 16, 30, 72, index = 4)

Extraído de https://github.com/PerfecXX/Python-mBot2/blob/main/README.md licencia MIT
Como puedes ver va detectando las líneas en los 4 sensores que tiene :

Más probatinas...

En https://github.com/PerfecXX/Python-mBot2/tree/main/example/mbuild/02-Quad%20RGB%20Sensor puedes descargarte más scripts que visualizan como el sensor puede detectar el color y el brillo. Nosotros aquí sólo te hemos enseñado el último el de detectar la línea.

2025-04-30 08_32_43-Python-mBot2_example_mbuild_02-Quad RGB Sensor at main · PerfecXX_Python-mBot2 ·.png

 

Sigue líneas

En este caso sólo vamos a utilizar de los 4 sensores quad que tiene los 2 de en medio con la instrucción

mbuild.quad_rgb_sensor.get_line_sta("middle", 1)

El valor que devuelve esta instrucción puede ser  :

El código es

import event, time, cyberpi, mbuild, mbot2

cyberpi.display.show_label("PULSA A PARA COMENZAR",16,0,20,1)
while not cyberpi.controller.is_press('a'):
        pass

while True:
    if mbuild.quad_rgb_sensor.get_line_sta("middle", 1) == 0b00:
        mbot2.backward(50)

    if mbuild.quad_rgb_sensor.get_line_sta("middle", 1) == 0b11:
        mbot2.forward(50)

    if mbuild.quad_rgb_sensor.get_line_sta("middle", 1) == 0b01:
        mbot2.turn_right(50)

    if mbuild.quad_rgb_sensor.get_line_sta("middle", 1) == 0b10:
        mbot2.turn_left(50)

Fuente Javier Quintana

El resultado es