Este blog está dedicado a mis experiencias, proyectos, dificultades y demás en todo lo relacionado a la electrónica y la programación en general sobre GNU/Linux

Electrónica, PCB, STM32

Modulo I/O digital para BluePill STM32F1 en KiCad

Esta es otra temática, no quise hacer una página como con la placa de desarrollo de AVR. Además quiero que sepan que abandoné el Eagle, luego de que fue adquirido por AutoDesk y me pasé a KiCad. Me llevé una grata, muy grata, sorpresa, porque la última vez que lo quise usar me pareció una mierda demasiado tosco para el diseño de impresos (PCBs). Y ahora nada que ver, es casi igual de fácil de usar que el Eagle (QEPD), incluso en muchos puntos es muy superior. Dicho esto, pasemos al desarrollo.

Antes que nada, quiero aclarar que es un trabajo en proceso, es decir, que está sujeto a cambios, de ubicación de componentes mayormente. Ya que quise hacerlo didáctico, y fui acomodando los periféricos de forma tal que me quedara cómodo de rutear y agrupados, dentro de lo posible, en los mismos puertos. Además de que busque que quedara fácil de rutear, no quería volverme loco para algo que no es para vender sino para enseñar. Pero al hacer eso me perdí algunos puntos fuertes sobre este micro, por ejemplo para leer el encoder :_)

Básicamente es una placa donde uno puede colocar la BluePill y consta de:

  • ENTRADAS:
    • 1x Encoder rotatorio de cuadratura (Rotary Encoder)
    • 4x TouchSwitch/Push-buttons
  • SALIDAS:
    • 5x LEDs (1 RGB)
    • 1x 4-digits 7 segment
  • COM:
    • Pines para conectar a la USART1 (3v3-GND-Tx-Rx)

Se que parece poco, pero para arrancar a dar clases es más que suficiente. Si pensamos que se trata de chicos de secundario y su primera experiencia en programación de µCs, o como primera experiencia no-Arduino. Además, podes hacer las siguientes prácticas:

  1. Manejo básico de Entradas/Salidas.
  2. Programación de Interrupciones externas.
  3. Configuración de Timers (temporizar y PWM)
  4. Manejo del puerto serie.
  5. Multiplexado con los displays (tema jodido difícil de entender para los no iniciados).
  6. Hacer un reloj con el RTC (aunque no puse espacio para una pila ¯\_(ツ)_/¯).

Así que, como ven, a pesar de no haber tantos dispositivos en la placa, las posibilidades son varias, de cada ítem listado anteriormente se pueden pensar varias prácticas. Además es fácil de armar, consta con una sola capa, y gran parte de los componentes son SMD para ahorra todo lo que se pueda el espacio.

Como pueden observar, la placa, es muy sencilla, y la hice con transferencia térmica (con la plancha de ropa) y quedó excelente. Si notan diferencias entre el render y la foto es porque ya hice cambios, como les dije, es un trabajo en proceso y está sujeto a ajustes. Para no olvidarme donde conecte cada cosa y qué lógica tengo que utilizar hice esta imagen:

Y además me hice un .h con definiciones para utilizarlo con libOpenCM3, para los que vienen siguiendo mis tutoriales en este blog.

/**
 * @file stm32basicioboard.h
 * @author Matías S. Ávalos (Telegram: @tute_avalos)
 * @brief Defines para manejar los perifericos de la placa stm32-BasicIO
 * @version 0.1
 * @date 2020-05-19
 * 
 * This file has defines for using with the STM32-BluePill Digital I/O Board
 * <https://github.com/Open-Hardware-Latinoamerica/stm32-bluepill-iomod>.
 * An Open Source Hardware PCB for teaching µControllers programming
 * designed on KiCad EDA Software.
 * 
 * @copyright Copyright (c) 2020
 * 
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 * 
 */
#ifndef __BASIC_IO_BOARD_H__
#define __BASIC_IO_BOARD_H__

#include <stdint.h>

/*****************************************************************************
 *                                  ENTRADAS                                 *
 *****************************************************************************/
#define GPIOSWITCHS     GPIOB
#define GPIOSWITCH_1    GPIO15  // Active LOW
#define GPIOSWITCH_2    GPIO14  // Active LOW
#define GPIOSWITCH_3    GPIO13  // Active LOW
#define GPIOSWITCH_4    GPIO12  // Active LOW
#define GPIOSWITCH_ALL  (GPIOSWITCH_1|GPIOSWITCH_2|GPIOSWITCH_3|GPIOSWITCH_3)

#define GPIOROTARY      GPIOA
#define GPIOROTARY_A    GPIO15  // Active LOW
#define GPIOROTARY_B    GPIO12  // Active LOW
#define GPIOROTARY_SW   GPIO11  // Active LOW
#define GPIOROTARY_ALL  (GPIOROTARY_A|GPIOROTARY_B|GPIOROTARY_SW)

/*****************************************************************************
 *                                  SALIDAS                                  *
 *****************************************************************************/
#define GPIOLEDS        GPIOB
#define GPIOLED_1R      GPIO9   // Active LOW
#define GPIOLED_1G      GPIO8   // Active LOW
#define GPIOLED_1B      GPIO7   // Active LOW
#define GPIOLED_2       GPIO6   // Active LOW
#define GPIOLED_3       GPIO5   // Active LOW
#define GPIOLED_4       GPIO4   // Active LOW
#define GPIOLED_5       GPIO3   // Active LOW
#define GPIOLED_ALL     (GPIOLED_1R|GPIOLED_1G|GPIOLED_1B|GPIOLED_2|GPIOLED_3|GPIOLED_4|GPIOLED_5)

#define GPIOSEGS        GPIOA
#define GPIOSEG_A       GPIO7   // Active HIGH
#define GPIOSEG_B       GPIO5   // Active HIGH
#define GPIOSEG_C       GPIO3   // Active HIGH
#define GPIOSEG_D       GPIO1   // Active HIGH
#define GPIOSEG_E       GPIO0   // Active HIGH
#define GPIOSEG_F       GPIO6   // Active HIGH
#define GPIOSEG_G       GPIO4   // Active HIGH
#define GPIOSEG_P       GPIO2   // Active HIGH
#define GPIOSEG_ALL             (GPIOSEG_A|GPIOSEG_B|GPIOSEG_C|GPIOSEG_D|GPIOSEG_E|GPIOSEG_F|GPIOSEG_G|GPIOSEG_P)
#define GPIOSEG_ALL_NOTP        (GPIOSEG_A|GPIOSEG_B|GPIOSEG_C|GPIOSEG_D|GPIOSEG_E|GPIOSEG_F|GPIOSEG_G)

#define GPIODIGITS      GPIOB
#define GPIODIG_1       GPIO0   // Active LOW
#define GPIODIG_2       GPIO1   // Active LOW
#define GPIODIG_3       GPIO10  // Active LOW
#define GPIODIG_4       GPIO11  // Active LOW
#define GPIODIG_ALL     (GPIODIG_1|GPIODIG_2|GPIODIG_3|GPIODIG_4)

                    //    AFBGC.DE
#define SEGMCODE_0      0b11101011
#define SEGMCODE_1      0b00101000
#define SEGMCODE_2      0b10110011
#define SEGMCODE_3      0b10111010
#define SEGMCODE_4      0b01111000
#define SEGMCODE_5      0b11011010
#define SEGMCODE_6      0b11011011
#define SEGMCODE_7      0b10101000
#define SEGMCODE_8      0b11111011
#define SEGMCODE_9      0b11111000
#define SEGMCODE_A      0b11111001
#define SEGMCODE_B      0b01011011
#define SEGMCODE_C      0b11000011
#define SEGMCODE_D      0b00111011
#define SEGMCODE_E      0b11010011
#define SEGMCODE_F      0b11010001
#define SEGMCODE_P      0b00000100

static const uint8_t seg7code[] = {
        SEGMCODE_0, SEGMCODE_1, SEGMCODE_2, SEGMCODE_3,
        SEGMCODE_4, SEGMCODE_5, SEGMCODE_6, SEGMCODE_7,
        SEGMCODE_8, SEGMCODE_9, SEGMCODE_A, SEGMCODE_B,
        SEGMCODE_C, SEGMCODE_D, SEGMCODE_E, SEGMCODE_F};

#endif // __BASIC_IO_BOARD_H__

Este proyecto está en el Gihub oficial de Open Hardware Latinoamerica, específicamente, acá: https://github.com/Open-Hardware-Latinoamerica/stm32-bluepill-iomod

Pasen por el gurpo de Telegram de Open Hardware Latinoamerica, es un lugar copado, con buena gente, compartiendo información, tutoriales, anécdotas sobre todo lo que pasa con respecto a la electrónica en esta gran parte del globo. Les dejo esta foto final que me encanta:

Dejar una respuesta