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 : int si son enteros float si tienen decimales binario Deben 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 La función show_label la veremos después, tiene el formato cyberpi . display . show_label( texto , tamaño , color, x, y ) 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