# Python

# Python

##### <span style="color: rgb(22, 145, 121);">**Librería cyberpi**</span>

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

```python
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](https://www.lbotics.at/images/mbot2/files/mBot2_API_cyberpi.pdf)

{{@12327}}

# 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 \***

##### <span style="color: rgb(22, 145, 121);">**Mi primer programa Hola Mundo (método sin omitir)**</span>

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

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

<p class="callout warning">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](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](https://libros.catedu.es/books/cyberpi-y-mbot2/page/como-usar-mbot2-en-mblock)</p>

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](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](https://libros.catedu.es/uploads/images/gallery/2025-04/scaled-1680-/2025-04-29-12-46-26-mblock-v5-4-3.png)](https://libros.catedu.es/uploads/images/gallery/2025-04/2025-04-29-12-46-26-mblock-v5-4-3.png)

Y el resultado es

[![2025-04-29 12_50_34-WhatsApp.png](https://libros.catedu.es/uploads/images/gallery/2025-04/scaled-1680-/2025-04-29-12-50-34-whatsapp.png)](https://libros.catedu.es/uploads/images/gallery/2025-04/2025-04-29-12-50-34-whatsapp.png)

##### <span style="color: rgb(22, 145, 121);">**Mi primer programa Hola Mundo (método omitiendo)**</span>

Repite los pasos anteriores pero con este código

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

<p class="callout success">¿Ves la diferencia de código?</p>

# Audio

##### <span style="color: rgb(22, 145, 121);">**Un tono**</span>

Un programa sencillo de dar un tono puede ser el siguiente

```
import cyberpi

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

*<span style="color: rgb(0, 0, 0);">Extraído de [https://github.com/PerfecXX/Python-mBot2/blob/main/README.md](https://github.com/PerfecXX/Python-mBot2/blob/main/README.md) licencia [MIT](https://github.com/PerfecXX/Python-mBot2/blob/main/LICENSE)</span>*

##### <span style="color: rgb(22, 145, 121);">**Instrumentos**</span>

<span style="color: rgb(0, 0, 0);">También podemos reproducir instrumentos</span>

```
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

##### <span style="color: rgb(22, 145, 121);">**Efectos sonoros**</span>

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

```python
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="599" src="https://www.youtube.com/embed/2EPpDJqUhew" title="mbot2 python efectos sonoros" width="337"></iframe>

##### <span style="color: rgb(22, 145, 121);">**Grabadora**</span>

O hacernos una grabadora de bolsillo

```python
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")
    
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="599" src="https://www.youtube.com/embed/ayyBMRfwBpQ" title="grabadora python mbot2" width="337"></iframe>

# LED

##### <span style="color: rgb(22, 145, 121);">**Colores**</span>

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

```python
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

[![2025-04-29 15_08_28-WhatsApp.png](https://libros.catedu.es/uploads/images/gallery/2025-04/scaled-1680-/2025-04-29-15-08-28-whatsapp.png)](https://libros.catedu.es/uploads/images/gallery/2025-04/2025-04-29-15-08-28-whatsapp.png)

##### <span style="color: rgb(22, 145, 121);">**Intermitencia**</span>

Podemos encender y apagar a voluntad

```python
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

##### <span style="color: rgb(22, 145, 121);">**Arco Iris**</span>

```python
import cyberpi

"""
Name List (str)

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

"""

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

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

  
<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="599" src="https://www.youtube.com/embed/KrjRfHxDUwk" title="arcoiris mbot2 python" width="337"></iframe>

##### <span style="color: rgb(22, 145, 121);">**Movimiento leds**</span>

```python
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="599" src="https://www.youtube.com/embed/oorI8BS_xZU" title="movimiento leds mbot2 python" width="337"></iframe>

# Entradas

##### <span style="color: rgb(22, 145, 121);">**Botones A y B**</span>

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

```python
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!")
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="599" src="https://www.youtube.com/embed/1w7q_3t6nEM" title="botones mbot2 python" width="337"></iframe>

##### <span style="color: rgb(22, 145, 121);">**Intensidad de la luz**</span>

*<span style="color: rgb(0, 0, 0);">La función show\_label la veremos después, tiene el formato <span class="ͼe">cyberpi</span><span class="ͼ8">.</span>display<span class="ͼ8">.</span>show\_label(<span class="ͼe">texto</span>, <span class="ͼe">tamaño</span>, <span class="ͼe">color, x, y</span>)</span>*

```python
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="635" src="https://www.youtube.com/embed/DyamGMRte7w" title="luz python mbot2" width="357"></iframe>

##### <span style="color: rgb(22, 145, 121);">**Cantidad de sonido**</span>

```
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="635" src="https://www.youtube.com/embed/_xFezHI2N9o" title="cantidad de sonido Python mbot2" width="357"></iframe>

##### <span style="color: rgb(22, 145, 121);">**Nivel de batería**</span>

```python
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

##### <span style="color: rgb(22, 145, 121);">**Contador**</span>

```python
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="635" src="https://www.youtube.com/embed/yOK__g1O6OQ" title="contador con python y mbot2" width="357"></iframe>

##### **<span style="color: rgb(22, 145, 121);">Limpiar y apagar la pantalla</span>**

```python
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()
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="635" src="https://www.youtube.com/embed/qWmmkTRykyo" title="limpiar y apagar pantalla python mbot2" width="357"></iframe>

##### <span style="color: rgb(22, 145, 121);">**Linechart**</span>

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

```python
import cyberpi

value = 0

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

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="635" src="https://www.youtube.com/embed/oSzWt8k3YLA" title="grafica linechart python mbot2" width="357"></iframe>

##### <span style="color: rgb(22, 145, 121);">**Barchart**</span>

```python
import cyberpi

value = 0

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

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="635" src="https://www.youtube.com/embed/Y950W81RpEA" title="barchart mbot2 python" width="357"></iframe>

##### <span style="color: rgb(22, 145, 121);">**Table**</span>

```python
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")
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

[![2025-04-29 20_15_40-WhatsApp.png](https://libros.catedu.es/uploads/images/gallery/2025-04/scaled-1680-/2025-04-29-20-15-40-whatsapp.png)](https://libros.catedu.es/uploads/images/gallery/2025-04/2025-04-29-20-15-40-whatsapp.png)

##### <span style="color: rgb(22, 145, 121);">**Drawpixel**</span>

```
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()
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="635" src="https://www.youtube.com/embed/0UBumFzEuvI" title="drawpixel mbot2 python" width="357"></iframe>

##### **<span style="color: rgb(22, 145, 121);">QR</span>**

```python
import cyberpi

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

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

[![2025-04-29 20_26_54-WhatsApp.png](https://libros.catedu.es/uploads/images/gallery/2025-04/scaled-1680-/2025-04-29-20-26-54-whatsapp.png)](https://libros.catedu.es/uploads/images/gallery/2025-04/2025-04-29-20-26-54-whatsapp.png)

¡¡ y funciona !!!

# Sensores de movimiento

##### <span style="color: rgb(22, 145, 121);">**Sensor agitación**</span>

```
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="635" src="https://www.youtube.com/embed/bTmeeCBABAA" title="Sensor agitación mbot2 python" width="357"></iframe>

##### <span style="color: rgb(22, 145, 121);">**Inclinación y rotación**</span>

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

```python
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

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

```python
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

Y rotation

```python
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="635" src="https://www.youtube.com/embed/i3HnE8lIdLo" title="Inclinación y rotación mbot2 python" width="357"></iframe>

# 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**  
    [![2025-04-29 21_10_21-mBlock v5.4.3.png](https://libros.catedu.es/uploads/images/gallery/2025-04/scaled-1680-/2025-04-29-21-10-21-mblock-v5-4-3.png)](https://libros.catedu.es/uploads/images/gallery/2025-04/2025-04-29-21-10-21-mblock-v5-4-3.png)
- **location\_id** es un número de identificador meteorológico, por ejemplo si ponemos *alcorisa* en [https://meteoblue.com/](https://meteoblue.com/) nos sale en la URL el código 3130563  
    [![2025-04-29 21_06_57-Tiempo Alcorisa - meteoblue.png](https://libros.catedu.es/uploads/images/gallery/2025-04/scaled-1680-/2025-04-29-21-06-57-tiempo-alcorisa-meteoblue.png)](https://libros.catedu.es/uploads/images/gallery/2025-04/2025-04-29-21-06-57-tiempo-alcorisa-meteoblue.png)

```
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

El resultado es (hemos puesto Calamocha)

[![2025-04-29 21_13_33-WhatsApp.png](https://libros.catedu.es/uploads/images/gallery/2025-04/scaled-1680-/2025-04-29-21-13-33-whatsapp.png)](https://libros.catedu.es/uploads/images/gallery/2025-04/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

<p class="callout info">*Bueno ... mentirijilla, el VOR esta en Fuentes Claras, no en Calamocha*<iframe allowfullscreen="allowfullscreen" height="314" src="https://www.youtube.com/embed/DgT1THxQ89w" width="560"></iframe>

</p>

<p class="callout success">Hay más ejemplos en [https://github.com/PerfecXX/Python-mBot2/tree/main/example/cyberpi/08-Cloud](https://github.com/PerfecXX/Python-mBot2/tree/main/example/cyberpi/08-Cloud) como la calidad del aire, pero no todas las localidades tienen datos.</p>

# Envío de mensajes con dos mBots2

En dos mBot2 le ponemos el siguiente código:

```python
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")
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

Realmente en [https://github.com/PerfecXX/Python-mBot2/tree/main/example/cyberpi/07-LAN/01-Send\_Receive](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.

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="815" src="https://www.youtube.com/embed/IpjvpNEz6-I" title="Envio y recepción de mensajes con dos mbot2 con python" width="458"></iframe>

# Inteligencia Artificial IA

##### <span style="color: rgb(22, 145, 121);">**Reconocimiento de texto**</span>

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

```python
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

<iframe allowfullscreen="allowfullscreen" height="314" src="https://www.youtube.com/embed/xrwRPOQqcZ0" width="560"></iframe>

##### <span style="color: rgb(22, 145, 121);">**Reconocimiento de voz**</span>

<span style="color: rgb(0, 0, 0);">En este caso hemos seleccionado el idioma 4 (el primero chinese es el 0) luego reconoce voz en idioma inglés</span>

```python
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}  
El resultado es

<iframe allowfullscreen="allowfullscreen" height="314" src="https://www.youtube.com/embed/dHh43NAOEx0" width="560"></iframe>

##### <span style="color: rgb(22, 145, 121);">**Traductor**</span>

<span style="color: rgb(0, 0, 0);">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</span>

```python
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

[![2025-04-29 23_09_43-.png](https://libros.catedu.es/uploads/images/gallery/2025-04/scaled-1680-/2025-04-29-23-09-43.png)](https://libros.catedu.es/uploads/images/gallery/2025-04/2025-04-29-23-09-43.png)

# Movimientos

<p class="callout info"><span style="color: rgb(0, 0, 0);">Los movimientos de mBot2 se pueden definir por tiempo, distancia, ángulo y potencia, gracias a sus precisos motores de paso</span></p>

##### **<span style="color: rgb(22, 145, 121);">Pequeño baile con tiempo definido</span>**

```python
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)
```

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="635" src="https://www.youtube.com/embed/pf_htY6PWUw" title="pequeño baile mbot2 python" width="357"></iframe>

##### **<span style="color: rgb(22, 145, 121);">Pequeño baile con distancia definida</span>**

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

```python
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)

```

##### **<span style="color: rgb(22, 145, 121);">Pequeño baile con ángulos definidos</span>**

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

```python
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)
```

##### **<span style="color: rgb(22, 145, 121);">Pequeño baile con potencia definida</span>**

```
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

##### <span style="color: rgb(22, 145, 121);">**Medición de distancia** </span>

```python
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

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

[![2025-04-30 08_18_12-WhatsApp.png](https://libros.catedu.es/uploads/images/gallery/2025-04/scaled-1680-/2025-04-30-08-18-12-whatsapp.png)](https://libros.catedu.es/uploads/images/gallery/2025-04/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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}

# 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](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 :

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="815" src="https://www.youtube.com/embed/H6CovqWfWvc" title="evita obstáculos con Python" width="458"></iframe>

# Sensor de líneas

##### <span style="color: rgb(22, 145, 121);">**Probando la detección de líneas.**</span>

```python
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)
```

{{@13396#bkmrk-extraido-de-https%3A%2F%2F}}  
Como puedes ver va detectando las líneas en los 4 sensores que tiene :

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="635" src="https://www.youtube.com/embed/6gyT5P1kMw8" title="prueba sensor de líneas en mBot2 con Python" width="357"></iframe>

##### <span style="color: rgb(22, 145, 121);">**Más probatinas...**</span>

En [https://github.com/PerfecXX/Python-mBot2/tree/main/example/mbuild/02-Quad%20RGB%20Sensor](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](https://libros.catedu.es/uploads/images/gallery/2025-04/scaled-1680-/2025-04-30-08-32-43-python-mbot2-example-mbuild-02-quad-rgb-sensor-at-main-perfecxx-python-mbot2.png)](https://libros.catedu.es/uploads/images/gallery/2025-04/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 :

- **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

```python
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

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="695" src="https://www.youtube.com/embed/6itHWcvZnUs" title="Sigue líneas con mBot2" width="1236"></iframe>