Slide 1

Slide 1 text

All your pins are belong to us Python meets Arduino Alejandro Guirao https://github.com/lekum

Slide 2

Slide 2 text

¿Qué es Arduino? ● Plataforma open-source hardware para prototipar ● El modelo más común es Arduino UNO ● Está basado en un microcontrolador AVR Atmel de 8 bits ● Maneja pines de I/O digitales y analógicos (PWM) ● Alimentación por jack o USB ● Se programa mediante USB ● Se puede comunicar con sistemas externos mediante protocolo UART TTL a través de USB

Slide 3

Slide 3 text

¿Cómo se programa Arduino? ● Tiene un IDE “oficial” que incluye todo el proceso de compilación y carga ○ Alternativa -> pip install ino ● Se programa en lenguaje C / C++ ● “Batteries included” ○ Funciones de gestión de los pines, trigonométricas y matemáticas, de temporización e interrupciones y de comunicación ○ Muchas librerías para manejar HW (LCDs, servos, GSM, WIFI..)

Slide 4

Slide 4 text

“Hola Mundo” - LED que parpadea

Slide 5

Slide 5 text

¿Python? NO podemos ejecutar código Python en Arduino

Slide 6

Slide 6 text

¡Pero podemos controlarlo! Basándonos en la comunicación serie USB, podemos implementar un protocolo de comunicación y control

Slide 7

Slide 7 text

Protocolo “ad hoc” Implementar un sencillo protocolo “ad hoc” de comunicación entre los dos sistemas ● Desde el sketch ○ Se envían datos al sistema externo ○ Se leen las respuestas en una región del bucle principal ● Desde el sistema externo ○ Comunicación en Python (pySerial) Primera aproximación

Slide 8

Slide 8 text

Ejemplo: LED que parpadea

Slide 9

Slide 9 text

Protocolo “ad hoc” Es el tipo de integración es especialmente adecuada cuando hay ciertos elementos en el flujo del sketch ● Librerías de Arduino ● Uso del HW del microprocesador (registros, timers, interrupciones) ● Partes del código que requieren de una temporización muy exigente

Slide 10

Slide 10 text

Protocolo “ad hoc” Cuando la complejidad del protocolo empieza a crecer de manera preocupante…. … es señal de que debemos adoptar otra estrategia void loop() { // Check if characters available in the buffer if (Serial.available() > 0) { operation = Serial.read(); delay(wait_for_transmission); // If not delayed, second character is not correctly read mode = Serial.read(); pin_number = Serial.parseInt(); // Waits for an int to be transmitted if (Serial.read()==':'){ value_to_write = Serial.parseInt(); // Collects the value to be written } switch (operation){ case 'R': // Read operation, e.g. RD12, RA4 if (mode == 'D'){ // Digital read digital_read(pin_number); } else if (mode == 'A'){ // Analog read analog_read(pin_number); } else { break; // Unexpected mode

Slide 11

Slide 11 text

Control del flujo desde Python ● Programar el flujo en un sistema externo ○ Llamadas a funciones para gestión de los recursos de Arduino ■ I/O en pines ● El sketch es un bucle de lectura / escritura por el puerto serie ○ Protocolo bidireccional de comunicación

Slide 12

Slide 12 text

Soluciones existentes ● pyFirmata ○ Sketch muy complejo ○ Potente y completa ○ ¡No funciona en Python3 !

Slide 13

Slide 13 text

LED que parpadea con pyFirmata

Slide 14

Slide 14 text

Soluciones existentes ● Python Arduino Command API ○ ¡No funciona en Python3 !

Slide 15

Slide 15 text

Pero es que me gusta Python3... Solución: desarrollar una librería compatible con Python3 muy sencilla para control de I/O de pines https://github.com/lekum/pyduino

Slide 16

Slide 16 text

Demo: temperature_sensor.py

Slide 17

Slide 17 text

For great justice! (Gracias ^_^)