Introducción
- Qué es Arduino Alvik
- Instalar Micropython
- Modo Bootloader
- Hola mundo
- Empezando MicroPython de Alvik
- Introducción al Python
- Arduino Alvik API
- Para saber más Python
Qué es Arduino Alvik
Es un robot con las siguientes características :
- Placa microcontroladora Las placas Arduino tradicionales tenían microcontroladores como el ATMEL MEGA 328P etc..ver micros que no estaban conectados a Internet. EL ARDUINO ALVIK LLEVA EL ESP32 un micro más potente, y con conexión Wifi y Bluetooth mira esta página del curso ESP32 de Aularagon
- Precio unos 130€
- Especificaciones técnicas
- La batería es una 18650, es la mejor, con la protección de no ser accesible, pues tiene sus peligros
- Sensores
- 7 Botones de contacto AT42QT2120
- 3 Sensores sigue líneas
- Acelerómetro
- Giroscopio de 6 ejes LSM6DSOX
- Sensor de color RGB APDS 9660
- Sensor de distancia TOF 8x8 arrray hasta 350cm VL53L7CX
- Actuadores
- 2 Leds RGB
- 2 motores
- Conexiones de ampliación
- 2 conectores para servos
- 2 Conexión I2C
- 2 conexiones Grove
Licencia CC-BY-NC-SA origen https://courses.arduino.cc/explore-robotics-micropython/lessons/getting-started/
Programas predefinidos
Licencia CC-BY-NC-SA origen https://courses.arduino.cc/explore-robotics-micropython/lessons/getting-started/
- Programa rojo: Tocando los botones, se mueve 10 cm delante atrás, giro...
- Programa verde: Sigue la mano
- Programa azul: Seguidor de líneas
Cosas curiosas: A diferencia del típico sensor a distancia SR-04 que funciona por ultrasonidos, el VL53L7CX es mucho más complejo, va por luz (no realiza imágenes, sino por difracción de la luz por lo tanto respeta la privacidad) y nos proporciona muchas más distancia que las cinco que nos da la API
Instalar Micropython
Conceptos previos:
- Los lenguajes de alto nivel, es decir el código, que es entendible por los humanos (C++, Java, Python...) son textos que se tienen que traducir al lenguaje entendible por el procesador MCU (Micro Controler Unit). Este lenguaje de bajo nivel que está escrito en binario es difícil de entender para los humanos
- El Compilador es un programa que Interpreta este texto de lenguaje de alto nivel, y lo convierte en lenguaje de bajo nivel
- El Arduino Alvik se puede programar con Arduino IDE como con Micropytno, los dos son de alto nivel
Tanto Micropython como Arduino IDE son lenguajes de tipo CODIGO por lo tanto sólo se aconseja EN SECUNDARIA
Cuando permita lenguaje tipo BLOQUES como Scratch, ya será adecuado para PRIMARIA
¿Dónde se compila Micropython?
Como puedes ver en este vídeo en 21:20 Python se compila dentro del microcontrolador es decir, dentro del ESP32. A diferencia con otros lenguajes, como el C++, el ordenador tiene el compilador, y se lo da ya en binario.
Fuente vídeo Exploring the Arduino Nano ESP32 | MicroPython & IoT
¿Y a mi qué más me da?
No, para nada, si programas ESP32 con Arduino IDE o Arduino Cloud (que está basado en C++) te has cargado el compilador Python del ESP32 luego si quieres programar en Python, tienes que instalar el compilador dentro del ESP32 (y da problemas, ver Modo Bootloader)
¿Cómo meto el compilador MicroPython dentro del ESP32?
Para meter el programa compilador de MicroPython dentro del ESP32 (cuando un programa se instala en un hardware entonces se llama firmware) tenemos que
- Poner la placa en modo bootloader (ver página siguiente)
- Instalar micropython en el ESP32 con el programa Arduino Micropython Installer de esta página https://labs.arduino.cc/en/labs/micropython-installer
MicroPython Installer
Descargamos el programa y ejecutamos teniendo conectado el ESP32 del Alvik, (no hace falta encender el robot, pues sólo trabajamos con el ESP32) lo detecta y simplemente le damos a Instalar Micropython dentro del chip
¿Y al revés pasar de Micropython a ArduinoIDE hay problemas?
Pues al revés, si ejecutamos Arduino IDE, da error, pues el compilador microPython instalado dentro del ESP32 impide que se ejecuten los programas de Arduino IDE (sale el error No DFU capable USB device available Failed uploading: uploading error: exist status 74) se soluciona tan sencillo como volver a poner el ESP32 en modo Bootloader
¿Y si me paso de Arduino IDE a Micropython?
Pues vuelve a
- Poner la placa en modo bootloader
- Instalar micropython en el ESP32 con el programa Arduino Micropython Installer
¿Y con esto ya puedo crear mis programas con Micropython?
No, con esto tienes el compilador interpretador dentro del chip, pero necesitas un editor en tu PC y que se comunique con el Micropython del chip
Arduino Lab for Micropython
El lenguaje de programación más idóneo para el Arduino Alvik es el MICROPYTHON, de momento Arduino Alvik no esta disponible en programación con bloques. Al ser hardware libre, si se convierte popular, no es de extrañar que lo incorporen los diferentes programadores de entornos de lenguaje en bloques para ser más accesible a niveles educativos de primaria.
Tal y como dice la página https://docs.arduino.cc/micropython/ hay dos editores para cargar MicroPython en el Arduino Alvik
- Arduino Lab for Micropython https://labs.arduino.cc/en/labs/micropython
- OpenMW https://openmv.io/pages/download
Nosotros en este curso elegimos Arduino Lab for Micropython por su sencillez y adaptación al Arduino Alvik
Tal y como dice aquí ES UN PROGRAMA PORTABLE, es decir, no hay que instalarlo, simplemente descomprimir y ejecutar
Ahora, apagamos Arduino Alvik
Licencia CC-BY-NC-SA origen https://courses.arduino.cc/explore-robotics-micropython/lessons/getting-started/
Luego lo conectamos por cable
Licencia CC-BY-NC-SA origen https://courses.arduino.cc/explore-robotics-micropython/lessons/getting-started/
Lo encendemos
Licencia CC-BY-NC-SA origen https://courses.arduino.cc/explore-robotics-micropython/lessons/getting-started/
Ejecutamos el programa que hemos descomprimido:
Al ejecutar el programa, le podemos dar al botón de conectar con la placa y veremos que se comunica correctamente con el compilador instalado dentro del chip
Modo Bootloader
¿Qué es eso del Boodloader? Es un pequeño programa que esta en el microcontrolador (Arduino, ESP32, etc...) que permite que arranque la placa y espere las instrucciones del programa del usuario, digamos que es como un "pequeño sistema operativo de arranque" por ejemplo en el Arduino, se ejecuta en un poco de tiempo cuando arranca la placa o se resetea, y espera el programa IDE por el puerto USB, si llega (él comprueba que es un IDE y no otra cosa) lo almacena en un sitio de la memoria Flash y lo ejecuta, sino, pues ejecuta el que ya esta cargado. El bootloader hace que parpadee el led 13 de un Arduino UNO y se reserva un trozo de memoria para el Bootloader (en el Arduino UNO ocupa sólo 0.5K de los 32K que tiene disponibles el micro para ello). En nuestro caso el ESP32 Nano Arduino igual pero cuando cargamos el micropython nos cargamos ese bootloader por otro que tiene el compilador microPython. Lo de "quemar" o "flashear" el bootlader nos lo podemos encontrar en los cursos de Aularagón en el Zigbee de domótica con Raspberry, o a la hora de quemar el Nano Arduino como Arduino UNO en el curso de mClon
Problema
Cuando instalamos Micropython desde un ESP32 ya formateado con Arduino IDE o al revés hay problemas
Mensajes que aparecen :
- En Arduino IDE :
- No DFU capable USB device available Failed uploading: uploading error: exit status 74
- A serial exception error occurred: Cannot configure port, something went wrong. Original message: PermissionError (13, 'A device attached to the system is not functioning.', None, 31)
- No DFU capable USB device available Failed uploading: uploading error: exit status 74
- En MicroPython Installer : Se queda enganchado sin instalar
- En Arduino Cloud : No detecta
Solución: Resetear el Arduino Bootloader en el Nano ESP32
Al poner el ESP32 en modo Bootloader, se tiene que poner el led en color PURPURA
¿Poner la placa en modo Bootloader?
Aquí te exponemos varios métodos, por nuestra experiencia el método 3 es el que funciona
METODO 1 DOS CLIKS EN RESET
Haz dos cliks rápidos en el botón del ESP32 :
Extraído del vídeo Cómo solucionar el error dfu-util: No DFU capable USB device available Failed uploading: uploading error: exist status 74
METODO 2 CORTOCIRCUITAR GND Y B1
Otra alternativa para ponerlo en modo bootloader es unir los pines GND con B1 (y se enciende el led RGB en verde, el porqué se pone en verde en Parpadeo led)
Fuente vídeo Exploring the Arduino Nano ESP32 | MicroPython & IoT en el 25:12
Yo lo hago con un destornillador y toco las dos puntas, con cuidado de no tocar nada más.
Curiosidad: ¿Por qué al poner la placa en modo Bootloader o cada vez que enciendo Arduino Alvik se enciende y se apaga el led RGB de al lado con los colores Rojo y Verde? Solución en Parpadeo led
METODO 3 RESETEO BOOTLOADER
Tal y como dice en esta página :
- Hacer método 2 cortocircuitar B1 y GND
- Mientras esta cortocircuitado PULSA EL BOTÓN RESET
- Se queda el led en color púrpura,
- si vas a instalar MicroPython, instalalo y sáltate los siguientes pasos
- Si vas a instalar Arduino IDE o trabajar con Arduino Cloud contínua :
- Abrir el programa ARDUINO IDE (cerrar otros, como el Arduino create agent que se queda en segundo plano abajo a la derecha , el MicroPython Installer....)
- Asegurarse que esta instalado la placa Arduino ESP32 correctamente al menos la versión 2.013 (ir a Tools-Boards-BoardManager) si hay una versión anterior, desinstalar el que hay (remove) e instalarlo de nuevo.
- Ir a Tools-Port y seleccionar el puerto
- Ir a Tools > Board - Arduino ESP32 Boards > Arduino Nano ESP32 (o esp32 > Arduino Nano ESP32 )
- Poner Tools-> Programmer- seleccionar ESPTOOL
- Sketch > Upload Using Programmer
- Cuando salga este mensaje pasar al paso 11
Leaving... Hard resetting via RTS pin...
- Apretar el botón RESET y ya puedes o ejecutar un programa en Arduino IDE o instalar MicroPython
Capturas de pantalla :
Paso 4: Cerrar Arduino create agent
Paso 5
Hola mundo
En el programa Arduino Lab for MicroPython ponemos este programa:
from time import sleep
print("Hola mundo, soy un robot que me gusta chatear, ¿cual es tu nombre? ")
student_name = input("Tu nombre : ")
print("Mucho gusto , " + student_name + "! ¿ Cómo quieres llamarme?")
robot_name = input("Mi nombre ? : ")
print(f"{robot_name} es un fantástico nombre. Ya me siento un poco más humano.")
sleep(2) # Use sleep() to make interaction feel more natural
print(f"Okay, {student_name}, voy a ponerte a prueba:")
sleep(2)
print("¿ Has oido hablar que puedo nadar ?")
sleep(4)
print("Je je, es broma..... :D")
sleep(5)
Adaptado de https://courses.arduino.cc/explore-robotics-micropython/lessons/getting-started/
Pulsamos a conectar, nos pregunta por el puerto
Runeamos y vamos contestando a sus preguntas
Empezando MicroPython de Alvik
Inspirado en el esquema del tutorial MicroPython Basics autora Francesca Sanfilippo & Karl Söderby
Hemos visto la función print visualiza un mensaje en la cónsola :
print('Hola mundo !')
Podemos introducir una variable, frase que contenga el texto, la función time.sleep(segundos) que hace una pausa, (para utilizar esta función se necesita importar la librería time con import time ) y dentro de un bucle while que se ejecuta mientras sea verdadero lo que le sigue, en este caso while True se ejecutará siempre:
import time
frase = "Hola mundo !!"
while True:
print(frase)
time.sleep(1)
Aquí se utiliza
- una función con def una variable contador que en la función se declara global de esta manera se puede utilizar dentro de cualquier función del programa (en este caso el programa principal la funcion_contar().
- Vemos la típica operación de cuenta contador = contador + 1
- print visualiza dos cosas, la frase y el contador
import time
frase = "Hola mundo "
contador = 0
def funcion_contar():
global contador
contador = contador + 1
while True:
funcion_contar()
print(frase, contador)
time.sleep(1)
El resultado:
Aquí utilizamos el condicional if con su auxiliar else y la función exit para acabar el programa:
import time
frase = "Hola mundo "
contador = 0
maximo = 20
def funcion_contar():
global contador
contador = contador + 1
while True:
funcion_contar()
if contador>20 :
exit
else :
print(frase, contador)
time.sleep(1)
Lo que provoca que a los 20 finalice
Podemos usar en vez de variables numéricas, variables tipo array para los bucles :
Catedu = ['Javier', 'Santiago', 'Silvia', 'Berta', 'Cristina', 'Nacho', 'Arturo', 'Chefo', 'Vladi', 'Ruben', 'Pablo', 'JuanFran']
def printCatedus():
for persona in Catedu:
print(persona)
printCatedus()
Con esto ya podemos avanzar, pero si quieres
Introducción al Python
Página extraída de Federico Coca Guia de Trabajo de Microbit CC-BY-SA
Palabras reservadas
Son palabras reservadas que tienen un significado especial para el compilador y que no podemos usar para poner nombres a variables o funciones. Todas las palabras, excepto True, False y None se escriben en minúsculas. A continuación se da un listado de todas las palabras reservadas o keywords:
False, None, True, and, as, assert, async, await, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield
El listado al principio nos puede resultar abrumador, pero imaginemos un lenguaje con tan solo esas palabras y entenderemos que no resultará tan complejo familiarizarse, al menos con las mas usuales.
Identificadores
Los identificadores son los nombres que se dan a variables, clases, métodos, etc. No podemos usar palabras reservadas para estos nombres.
Algunas reglas que nos pueden resultar útiles para nombrar identificadores son:
- Los identificadores son sensibles a mayúsculas y minúsculas
- Los identificadores no pueden ser palabras reservadas
- Los espacios en blanco no están permitidos
- Un identificador puede ser una secuencia de letras y números. Siempre debe empezar por una letra o por el símbolo de subrayado "_".
- El primer carácter de un identificador no puede ser un número.
- No podemos utilizar caracteres especiales como la ñ, ¡, ¿ o letras con acentos.
- No podemos utilizar los símbolos como !, @, #, $, etc.
Nos va a resultar muy útil recordar lo siguiente:
- Python es un lenguaje que distingue entre mayúsculas y minúsculas. Esto significa que Variable y variable no son lo mismo
- Damos siempre a los identificadores un nombre que tenga sentido. Aunque que c = 10 es un perfectamente válido, escribir contador = 10 tendría más sentido, y sería más fácil averiguar lo que representa cuando miremo el código pasado un tiempo.
- Las palabras múltiples se pueden separar usando un guión bajo, como por ejemplo esto_es_un_nombre_de_variable_muy_largo.
Variables, constantes y literales
Variables
En programación, una variable es un nombre que se utiliza para referirse a una posición de memoria donde se almacena un valor. De forma más abstracta, puede considerarse como una caja que almacena un valor. El nombre de la caja es el nombre de la variable y el contenido su valor. Todas las variables constan de tres partes: un nombre, un tipo de dato y un valor. En la figura siguiente vemos tres variables de distintos tipos:
Licencia CC-BY-SA fuente
La variable name
contiene la cadena Bob
, la variable winner
es cierta y la variable score
contiene el valor 35
.
Python no dispone de ningún comando para declarar variables. Una variable se crea cuando se le asigna valor por primera vez. La técnica de declarar variables es poner un nombre seguido del signo de asignación (=) y el valor asignado a la variable. En la declaración es importante tener claro que se distinguen mayúsculas de minúsculas y que no están permitidos los caracteres especiales.
En Python no se declara de forma explicita el tipo de la variable pues se trata de un lenguaje inferido. Las variables incluso pueden cambiar de tipo desde el que se establece al asignarle valor la primera vez. Es decir, si declaro valor = 5
inicialmente la variable será de tipo entero (int), pero si en el programa se realizan operaciones que al final hacen que valor = 1.33
ahora valor es de tipo float. Automáticamente sabe que valor
es un número entero y declara la variable valor
como un int
.
Aunque no es necesario si es posible especificar el tipo de dato de una variable, haciendo:
x = str(22) # x será la cadena '22'
y = int(22) # y será el entero 22
z = float(22) # z será el número de coma flotante 22.0
Algunas reglas para nombrar variables que podemos tener en cuenta son:
- Los nombres pueden tener una combinación de letras minúsculas o mayúsculas o números o el símbolo de subrayado "_".
- Crear nombres que tengan sentido, aunque sean largos.
- Si usamos varias palabras para definir el nombre, estas las separamos por "_"
- Python es sensible a mayúsculas y minúsculas.
- Hay que evitar palabras reservadas en nombres de variables.
Constantes
Una constante no es mas que un tipo especial de variable cuyo valor no puede modificarse.
En Python, las constantes suelen declararse y asignarse en un módulo (un nuevo archivo que contiene variables, funciones, etc y que se importa al archivo principal).
Veamos cómo declaramos constantes en un archivo separado y lo usamos en el archivo principal,
Creamos un archivo que nombramos constantes.py y que contendrá:
PI = 3.141592
FUERZA_GRAVEDAD = 9.82
Creamos el archivo principal main.py, que contendrá:
import constantes
print(constantes.PI)
print(constantes.FUERZA_GRAVEDAD)
En el ejemplo creamos el archivo de módulo constantes.py y asignamos el valor constante a PI y FUERZA_GRAVEDAD.
Después, creamos el archivo main.py e importamos el módulo constantes. Finalmente, imprimimos el valor de cada constante.
La convención es nombrarlas en mayúsculas para distinguirlas de las variables.
Literales
Numéricos
Los literales son representaciones de valores fijos en un programa. Pueden ser números, caracteres, cadenas, etc. Por ejemplo, "¡Hola, mundo!", 12, 23.0, "C", etc.
Los literales numéricos son inmutables (no pueden cambiar) y pueden pertenecer a uno de los tres tipos de datos numéricos posibles: Entero, Coma flotante y Complejo. Los tipos son:
- Decimal. Números regulares. Por ejemplo: 5, 22, -40
- Binario. Deben comenzar por 0b. Por ejemplo: 0b110, 0b11
- Octal. Deben empezar con 0o. Por ejemplo: 0o13, 0o7
- Hexadedicmal. Deben empezar con 0x. Por ejemplo 0x13, 0xFF
- Coma flotante. Contienen el punto decimal. Por ejemplo 10.2, 3.14
-
Complejo. Tienen la forma
a + bj
. Por ejemplo: 3 - 2j, -4 + j -
Booleanos
Solamente hay dos literales booleanos True
y False
Cadenas de caracteres
Los literales de caracteres son caracteres unicode encerrados entre comillas, por ejemplo S
. Los literales cadenas de caracteres son cadenas de csaracteres encerradas entre comillas, por ejemplo Python es divertido
.
Especiales
En Python existe un literal especial, None
. Podemos usarlo, por ejemplo, para especificar una variable nula, por ejemplo:
var = None
print(var)
# El resultado será: None
Tipos de datos en Python
En Python, al igual que en programación en general, los tipos de datos especifican el tipo de datos que puede almacenarse en una variable.
Numéricos
Contienen valores numéricos y sabemos que:
- Los números enteros son de tipo int
- Los fraccionarios son de tipo float
- La división (/) siempre devuelve un número en coma flotante
- Para obtener la parte entera de una división se usa el operador //
- Para calcular el resto de una división se usa el operador %
- Para calcular potencias podemos usar el operador **
- Los paréntesis se pueden usar para agrupar expresiones
- El signo igual (=) se utiliza para asignar un valor (números, booleanos, cadenas, …) a una variable
- El tipo de la variable será el del dato asignado, no se declara el tipo de la variable al crearla
- Por convención el nombre comienza en minúscula y si son varias palabras se unen por guión bajo
Los tipos básicos de datos son:
int
: números enteros con signo sin límite de tamaño, ejemplo: entero = 5float
: números reales, decimales o de coma flotante con precisión de hasta 15 decimales, ejemplo: real = 5.6complex
: números complejos, por ejemplo 5.5 - 5j- Para averiguar el tipo de dato usamos la función
type()
.
Podemos realizar conversión de tipos así:
- A entero int(variable)
- A real float(variable)
Cadenas
Contienen secuencias de caracteres. Una cadena es una secuencia de caracteres representada entre comillas simples o dobles.
Las cadenas pueden estar encerradas entre comillas simples ('...') o dobles ("...") con el mismo resultado. Podemos usar para incluir comillas en una cadena.
La función print() devuelve la cadena que encierra entre los paréntesis, omitiendo las comillas que la encierran.
En la imagen siguiente se ven varios ejemplos con cadenas utilizando como editor el IDLE que por defecto se instala con Python y que se abre desde una terminal simplemente invocando a Python.
Federico Coca Guia de Trabajo de Microbit CC-BY-SA
Una cadena raw (cruda) se interpreta tal como se escribe, es decir, se omiten los caracteres especiales expresados con . Las cadenas raw se escriben entrecomilladas y van precedidas del carácter 'r'. En la imagen vemos un ejemplo.
Federico Coca Guia de Trabajo de Microbit CC-BY-SA
Es posible aplicar la operación de multiplicar a textos haciendo que estos se repitan. En la imagen siguientes vemos ejemplos de concatenación y multiplicación, así como un error cometido.
Federico Coca Guia de Trabajo de Microbit CC-BY-SA
Secuencias
Contienen colecciones de datos, como las listas, las tuplas, las colecciones de datos (set) o los diccionarios.
Una lista es una colección ordenada de elementos similares o de distinto tipo separados por comas y encerrados entre corchetes [ ].
Tupla es una secuencia ordenada de elementos, igual que una lista. La única diferencia es que las tuplas son inmutables. Una vez creadas, las tuplas no pueden modificarse. En Python, se utilizan los paréntesis () para almacenar los elementos de una tupla.
Las colecciones de datos son un conjunto desordenada de elementos únicos. Una colección de datos se define por valores separados por comas dentro de llaves { }.
Un diccionario es una colección ordenada de elementos. Almacena los elementos como pares clave/valor. Siendo las claves identificadores únicos que se asocian a cada valor.
Estudiaremos estos últimos tipos mas extensamente cuando los necesitemos.
Los datos de tipo booleano solamente pueden contener True
o False
.
Dado que en programación Python todo es un objeto, los tipos de datos son en realidad clases y las variables son instancias(objeto) de estas clases.
Comentarios en Python
-
Una sola linea : Escribiendo el símbolo almohadilla (#) delante del comentario.
-
Multilinea: Escribiendo triple comillas dobles (“””) al principio y al final del comentario.
En los comentarios, pueden incluirse palabras que nos ayuden a identificar además, el subtipo de comentario:
# TODO esto es algo por hacer
# FIXME (arreglarme) esto es algo que debe corregirse
# XXX esto también, es algo que debe corregirse
Identation o sangría 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.
if 5 > 2:
print("Cinco es mayor que 2")
Lo siguiente sería un error de sintaxis.
if 5 > 2:
print("Cinco es mayor que 2")
El número de espacios de la identation puede ser cualquiera siempre que al menos sea un espacio. Siempre hay que usar el mismo número de espacios en el mismo bloque de código.
Operadores en Python
Los operadores son símbolos especiales que realizan operaciones con variables y valores.
A continuación tenemos una lista de los diferentes tipos de operadores de Python:
- Operadores aritméticos
- Operadores de asignación
- Operadores de Comparación
- Operadores Lógicos
- Operadores Bitwise
- Operadores especiales
Operadores aritméticos
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 |
Operadores de asignación¶
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 |
Operadores de Comparación
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 |
Operadores Lógicos
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 |
En la figura siguiente vemos un ejemplo con lo que devuelve en cada caso.
Federico Coca Guia de Trabajo de Microbit CC-BY-SA
Operadores Bitwise¶
Los operadores bit a bit o bitwise actúan sobre los operandos como si fueran cadenas de dígitos binarios. Operan bit a bit, de ahí su nombre.
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 |
Operadores especiales
El lenguaje Python ofrece algunos tipos especiales de operadores como el operador de identidad (identity
) y el operador de pertenencia (membership
).
- Operadores
identity
En Python, is
e is not
se utilizan para comprobar si dos valores se encuentran en la misma parte de la memoria. Dos variables que son iguales no implica que sean idénticas. Algunos ejemplos aclaran mejor lo dicho.
x1 = 5
y1 = 5
x2 = 'Hello'
y2 = 'Hello'
print(x1 is not y1) # False
print(x2 is y2) # True
Vemos que x1 e y1 son enteros con los mismos valores, por lo que son iguales e idénticos. Lo mismo ocurre con x2 e y2 (cadenas).
- Operadores
membership
En Python, in
y not in
son los operadores de pertenencia. Se utilizan para comprobar si un valor o variable se encuentra en una secuencia (cadena, lista, tupla, conjunto y diccionario).
En un diccionario sólo podemos comprobar la presencia de la clave, no del valor.
Arduino Alvik API
Para acceder a las funciones de Arduino Alvik API tenemos que ejecutar las instrucciones:
alvik = ArduinoAlvik()
alvik.begin()
Entonces ya podemos usar las siguientes: (extraido de https://docs.arduino.cc/tutorials/alvik/api-overview/ )
Luego veremos en el apartado de programación del Arduino Alvik con código Arduino IDE que utilizaremos una biblioteca #include "Arduino_Alvik.h" que importa prácticamente las mismas funciones, ver https://libros.catedu.es/books/arduino-alvik/page/programas-arduino-ide-sin-iot
FUNCION con sus Inputs | Outputs |
stop() | para todas las funciones Alvik |
is_on() | true si esta encendido false si esta apagado |
is_target_reached() | true si ha enviado M o R en el mensaje |
get_ack() | last_ack: el valor del último mensaje |
stop() | para todas las funciones Alvik |
get_orientation() | r: valor de balanceo p: valor de cabeceo y: valor de guiñada |
get_accelerations()
ver uso en |
ax ay az |
get_gyros()
|
gx by gz |
get_imu() | las 6 anteriores |
get_line_sensors() |
left right |
brake() | Frena el robot |
get_battery_charge() | battery_soc: el % de la batería |
get_touch_any() | touch_any es true si se ha apretado cualquier botón |
get_touch_ok() get_touch_cancel() get_touch_center() get_touch_up() get_touch_left() get_touch_down() get_touch_right() |
touch_ok es true si se ha apretado ok etc...
ver ejemplos en https://libros.catedu.es/books/arduino-alvik/page/robotica-para-infantil y en https://libros.catedu.es/books/arduino-alvik/page/mensajes-a-telegram |
get_color_raw() get_color_label() |
color |
get_version() print_status() |
versión del firmware
|
set_behaviour(behaviour: int) | |
rotate(angle: float, unit: str = 'deg', blocking: bool = True) | |
move(distance: float, unit: str = 'cm', blocking: bool = True) | |
get_wheels_speed(unit: str = 'rpm') | left_wheel_speed: the speed value right_wheel_speed: the speed value |
set_wheels_speed(left_speed: float, right_speed: float, unit: str = 'rpm') | |
set_wheels_position(left_angle: float, right_angle: float, unit: str = 'deg') | |
get_wheels_position(unit: str = 'deg') | angular_velocity |
drive(linear_velocity: float, angular_velocity: float, linear_unit: str = 'cm/s',angular_unit: str = 'deg/s') | |
get_drive_speed(linear_unit: str = 'cm/s', angular_unit: str = 'deg/s') | linear_velocity: speed of the robot. angular_velocity: speed of the wheels. |
reset_pose(x: float, y: float, theta: float, distance_unit: str = 'cm', angle_unit: str = 'deg') | |
get_pose(distance_unit: str = 'cm', angle_unit: str = 'deg') | x y theta |
set_servo_positions(a_position: int, b_position: int) | |
set_builtin_led(value: bool) | |
set_illuminator(value: bool) | |
color_calibration(background: str = 'white') | |
rgb2hsv(r: float, g: float, b: float) |
h: hue value s: saturation value v: brightness value |
get_color(color_format: str = 'rgb') |
r or h g or s b or v |
hsv2label(h, s, v) |
color label: like "BLACK" or "GREEN", if possible, otherwise return "UNDEFINED" |
get_distance(unit: str = 'cm') |
lee la distancia del sensor TOF: ver ejemplo en https://libros.catedu.es/books/arduino-alvik/page/evita-obstaculos left_tof: 45° to the left object distance center_left_tof: 22° to the left object distance center_tof: center object distance center_right_tof: 22° to the right object distance right_tof: 45° to the right object distance |
get_distance_top(unit: str = 'cm') |
top_tof: 45° to the top object distance |
get_distance_bottom(unit: str = 'cm') |
bottom_tof: 45° to the bottom object distance |
on_touch_ok_pressed(callback: callable, args: tuple = ()) on_touch_cancel_pressed(callback: callable, args: tuple = ()) on_touch_center_pressed(callback: callable, args: tuple = ()) on_touch_up_pressed(callback: callable, args: tuple = ()) on_touch_left_pressed(callback: callable, args: tuple = ()) on_touch_down_pressed(callback: callable, args: tuple = ()) on_touch_right_pressed(callback: callable, args: tuple = ()) |
He intentado hacer programas con estas instrucciones, pero una vez pulsado la tecla, sigue llamando a callback continuamente
No veo su utilidad teniendo get_touch |
Unidades
- m: centimeters
mm: millimeters
m: meters
inch: inch, 2.54 cm
in: inch, 2.54 cm - deg: degrees, example: 1.0 as reference for the other unit. 1 degree is 1/360 of a circle.
rad: radiant, example: 1 radiant is 180/pi deg.
rev: revolution, example: 1 rev is 360 deg.
revolution: same as rev
perc: percentage, example 1 perc is 3.6 deg.
%: same as perc - 'cm/s': centimeters per second
'mm/s': millimeters per second
'm/s': meters per second
'inch/s': inch per second
'in/s': inch per second - 'rpm': revolutions per minute, example: 1.0 as reference for the other unit.
'deg/s': degrees per second, example: 1.0 deg/s is 60.0 deg/min that is 1/6 rpm.
'rad/s': radiant per second, example: 1.0 rad/s is 60.0 rad/min that is 9.55 rpm.
'rev/s': revolution per second, example: 1.0 rev/s is 60.0 rev/min that is 60.0 rpm.
¿Qué es eso de bloking?
Por ejemplo en rotate(angle: float, unit: str = 'deg', blocking: bool = True)
Si es true, todos los eventos no influyen, es decir el microprocesador esta centrado en esa instrucción
Si es falso, el microprocesador es libre de hacer otra cosa a la vez
Utiliza true si quieres precisión o no quieres que nada interaccione con la acción que estas ejecutando
Para saber más Python
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