Python
- Python
- Hola Mundo
- Audio
- LED
- Entradas
- Display
- Sensores de movimiento
- El tiempo (servicios en la nube)
- Envío de mensajes con dos mBots2
- Inteligencia Artificial IA
- Movimientos
- Sensor ultrasonidos
- Evita obstáculos
- Sensor de líneas
- Sigue líneas
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 :
- int si son enteros
- float si tienen decimales
- binarioDeben comenzar por 0b. Por ejemplo: 0b110, 0b11
- string son frases, son "cadenas" de caracteres entre "
- bool Solamente hay dos literales booleanos True o False
- lista Se pueden declarar variables que son conjuntos por ejemplo Colores = ["verde", "rojo", "naranja" ]
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"
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=4 , a = 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
- while ejecuta lo contenido en la sangría mientras sea verdadero la condición
- for ejecuta lo contenido en la sangría mientras y va recorriendo la variable dentro del rango creado
Para verlo mejor vamos a ver estos ejemplos
- EJEMPLO BUCLE WHILE
- mientras n sea positivo va ejecutando : imprime n y lo decrementa
- al decrementar llega un momento que deja de ser positivo y finaliza el bucle
- EJEMPLO BUCLE WHILE INFINITO
- Es muy típico en robótica, todo el rato hace el bucle (en robótica para que lea los sensores y realice cosas en los actuadores) pero este ejemplo no esta en un robot sino en tu pc y no queremos que se quede "colgado" luego al teclear "fin" acaba gracias a la instrucción break
- Fíjate que hay una instrucción continue para que pase a la siguiente iteración provocando que no imprime lo tecleado
- EJEMPLO BUCLE FOR FRIENDS
- Va recorriendo la variable friend dentro del cojunto lista friends
- como puedes ver la diferencia entre for y while es que for además recorre la variable
- EJEMPLO BUCLE FOR
- mientras n este en el rango de 0 a 5 se ejecuta
Venga pruébalo !!!
Funciones
No vamos a entrar en detalle, pero observa el siguiente código
- FUNCIONES PREDEFINIDAS Si observas, la primera línea llama a importar una librería externa, import math donde math es un fichero que tienen funciones predefinidas, vamos a utilizar una de ellas, la raiz cuadrada sqrt luego para llamar a esa función que esta definida dentro de math se hace con la instrucción math.sqrt
- FUNCIONES DEFINIDAS POR TI em este caso, se utiliza la palabra def para crear una función, que le vamos a pasar tres argumentos a, b y c y para finalizar la función usamos return para devolver el valor que queremos obtener
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:
- Programar sin omitir de donde viene (o sea, indicar el objeto de donde sale esa función, cyberpi. )
- Programar omitiéndolo pero antes tienes que decirle que importas todo import *
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
- Entramos en mblock con el dispositivo cargado mBot2 y vamos a la pesaña Python
- Pegamos el programa
- 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
- Damos a la opción Cargar
- Subir código
Y el resultado es
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
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
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
¡¡ 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:
- PON-EL-NOMBRE-DE-TU-WIFI y CLAVE-DE-TU-WIFI son el nombre y la contraseña de la red wifi pues necesita conectarse a un servidor
- TU-ID-CLOUD lo puedes encontrar en mBlock aquí HAY QUE ESTAR LOGUEADO
- location_id es un número de identificador meteorológico, por ejemplo si ponemos alcorisa en https://meteoblue.com/ nos sale en la URL el código 3130563
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)
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
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
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
- Si hay obstáculo que gire
- Si no hay obstáculo que tire p'alante
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.
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 :
- 0 o en binario 00 que quiere decir que los dos sensores detectan blanco, por lo tanto habría que volver hacia atrás para recuperar la línea
- 1 o en binario 01 que significa que el sensor de la derecha detecta línea pero el de la izquierda no, por lo tanto hay que girar a la derecha
- 2 o en binario 10 que significa que el sensor de la izquierda detecta línea pero el de la derecha no, por lo tanto hay que girar a la izquierda
- 3 o en binario 11 que quiere decir que los dos sensores detectan línea, por lo tanto todo bien, recto
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