Además de la conexión USB-serial que usamos para el REPL, también existe un UART por hardware que puedes utilizar. ¡Esto es útil para hablar con dispositivos como GPSs, algunos sensores y otras microcontrladoras!

Este ejemplo para iniciar muestra como puede crear un dispositivo UART para comunicarse por hardware con dispositivos seriales.

Para utilizar este ejemplo, necesita algo que pueda generar datos UART. ¡Nosotros hemos usado un GPS! Note que el GPS va a enviar datos UARL sin necesidad de tener fija tu ubicación. ¡Ustedes puede probar este ejemplo desde su escritorio! Vas a tener datos para poder leer, simplemente que puede que no incluyan tu ubicación.

¡Vas a necesitar a la librería adafruit_bus_device copiada a la carpeta /lib si no lo has hecho todavía! La puedes conseguir del Compilador de Librerías para CircuitPython. Si necesita ayuda instalando las librerías, puedes revisar la página sobre Librerías para CircuitPython.

Copie y pegue el código dentro de code.py utilizando su editor favorito y salve el archivo.

# CircuitPython Demo - USB/Serial echo

import board
import busio
import digitalio

led = digitalio.DigitalInOut(board.D13)
led.direction = digitalio.Direction.OUTPUT

uart = busio.UART(board.TX, board.RX, baudrate=9600)

while True:
    data = uart.read(32)  # read up to 32 bytes
    # print(data)  # this is a bytearray type

    if data is not None:
        led.value = True

        # convert bytearray to string
        data_string = ''.join([chr(b) for b in data])
        print(data_string, end="")

        led.value = False

El Código

Primero creamos un objeto UART. Le enviamos los pines que vamos a utilizar, board.TX and board.RX, y le configuramos baudrate=9600. Mientras estos pines están etiquetados en la mayoría de las tarjetas, tenga cuidado que RX y TX no están etiquetados en las Gemma, y están etiquetados por debajo de las Trinket. Vea los diagramas a continuación para ayuda encontrando los pines correctos para su tarjeta.

Una vez que el objeto ha sido creado, usted leer los datos de entrada conread(numbytes) donde se le puede especificar el número máximo de bytes a leer. Va a retornar un objeto de arreglo de bytes si ha recibido algo. ¡Note que siempre va a retornar inmediatamente porque hay un buffer interno! Así que lea tantos datos como pueda procesar.

Si no hay datos disponibles, read() va a retornar None, así que revise esto antes de continuar.

Los datos retornados vienen en un arreglo de bytes, si lo quieres convertir a una cadena, puede utilizar este útil código que ejecuta chr() en cada byte:

datastr = ''.join([chr(b) for b in data]) # convert bytearray to string

Sus resultados se van a ver algo como esto:

Para más información sobre como los datos que estás leyendo y sobre el Ultimate GPS, revise la guía Ultimate GPS: https://learn.adafruit.com/adafruit-ultimate-gps

Cableándolo

Vas a necesitar un par de cosas para conectar tu GPS a tu tarjeta.

Para las Gemma M0 y las CircuitPlayground Express, usted puede utilizar cables de lagarto para conectarse al Flora Ultimate GPS Module.

Para las Trinket M0, Feather M0 Express, Metro M0 Express y ItsyBitsy M0 Express, vas a necesitar una tabla de prototipado y cables para conectarse al Ultimate GPS Breakout.

Hemos incluido diagramas para mostrarte como conectar el GPS a tu tarjeta. En estos diagramas, el color de los cables son los mismos pines en todas las tarjetas:

  • El cable negro conecta entre los pines de tierra (ground).
  • El cable rojo conecta los pines de alimentación (power) entre el GPS y tu tarjeta.
  • El cable azul conecta TX del GPS al RX en tu tarjeta.
  • El cable blanco conecta RX del GPS al TX en tu tarjeta.

¡Revise la lista a continuación para un diagrama específico para tu tarjeta!

¡Cuidado! ¡Una confusión típica con seriales UART es que RX en una tarjeta se conecta a TX de la otra! Sin embargo, algunas tarjetas tienen a RX etiquetado como TX y viceversa. ¡Así que vas a querer comenzar RX con TX, pero si eso no funciona, trata cambiando los cables!

Circuit Playground Express y Circuit Playground Bluefruit

  • Conecte 3.3v en su CPX a 3.3v en su GPS.
  • Conecte GND en su CPX a GND en su GPS.
  • Conecte RX/A6 en su CPX a TX en su GPS.
  • Conecte TX/A7 en su CPX a RX en su GPS.

Trinket M0

  • Conecte USB de la Trinket hacia VIN del GPS.
  • Conecte Gnd de la Trinket hacia GND del GPS.
  • Conecte D3 de la Trinket hacia TX del GPS.
  • Conecte D4 de la Trinket hacia RX del GPS.

Gemma M0

  • Conecte 3vo de la Gemma a 3.3v del GPS.
  • Conecte GND de la Gemma a GND del GPS.
  • Conecte A1/D2 de la Gemma a TX del GPS.
  • Conecte A2/D0 de la Gemma a RX del GPS.

Feather M0 Express y Feather M4 Express

  • Conecte USB de la Feather a VIN del GPS.
  • Conecte GND de la Feather a GND del GPS.
  • Conecte RX de la Feather a TX del GPS.
  • Conecte TX de la Feather a RX del GPS.

ItsyBitsy M0 Express y ItsyBitsy M4 Express

  • Conecte USB de la ItsyBitsy a VIN del GPS
  • Conecte G de la ItsyBitsy a GND del GPS.
  • Conecte RX/0 de la ItsyBitsy a TX del GPS.
  • Conecte TX/1 de la ItsyBitsy a RX del GPS.

Metro M0 Express y Metro M4 Express

  • Conecte 5V de la Metro a VIN del GPS.
  • Conecte GND de la Metro a GND del GPS.
  • Conecte RX/D0 de la Metro a TX del GPS.
  • Conecte TX/D1 de la Metro a RX del GPS.

¿Donde está mi UART?

En las SAMD21, tenemos la flexibilidad de poder usar una gama de pines para UART. Compare esto a algunos chips como los ESP8266 con pines fijos para UART. La buenas noticia es que puedes usar muchos pero no todos los pines. Por la gran cantidad de tarjetas con chips SAMD que tenemos, es imposible garantizar cualquier otra cosa que el uso de los etiquetados en 'TX' y 'RX'. Así que si requiere usar otra combinación, o múltiples UARTs, ¿como vas a encontrar esos pines? ¡Sencillo! Hemos escrito una script útil.

Todo lo que necesitas hacer es copiar este archivo a tu tarjeta, renombrarlo como code.py, conectar a la consola serial, ¡y ver la salida! El resultado imprime una bonita lista de pares de pines TX y RX que puedes utilizar.

Así es como se ven los resultados en una Trinket M0, tu salida puede variar y puede que sea muy larga. Para más detalles sobre UARTs y comunicaciones seriales revise nuestra guía detallada, aquí

import board
import busio
from microcontroller import Pin


def is_hardware_uart(tx, rx):
    try:
        p = busio.UART(tx, rx)
        p.deinit()
        return True
    except ValueError:
        return False


def get_unique_pins():
    exclude = ['NEOPIXEL', 'APA102_MOSI', 'APA102_SCK']
    pins = [pin for pin in [
        getattr(board, p) for p in dir(board) if p not in exclude]
            if isinstance(pin, Pin)]
    unique = []
    for p in pins:
        if p not in unique:
            unique.append(p)
    return unique


for tx_pin in get_unique_pins():
    for rx_pin in get_unique_pins():
        if rx_pin is tx_pin:
            continue
        else:
            if is_hardware_uart(tx_pin, rx_pin):
                print("RX pin:", rx_pin, "\t TX pin:", tx_pin)
            else:
                pass

Trinket M0: Crear UART antes de I2C

En las Trinket M0 (solamente), si estás utilizando tanto busio.UART y busio.I2C, debes crear el objeto de UART primero, de esta forma:

Download: file
>>> import board,busio
>>> uart = busio.UART(board.TX, board.RX)
>>> i2c = busio.I2C(board.SCL, board.SDA)

Si creas primero busio.I2C no funciona:

Download: file
>>> import board,busio
>>> i2c = busio.I2C(board.SCL, board.SDA)
>>> uart = busio.UART(board.TX, board.RX)
Traceback (most recent call last):
File "", line 1, in 
ValueError: Invalid pins

This guide was first published on Jun 24, 2020. It was last updated on Jun 24, 2020.

This page (UART Serial en CircuitPython) was last updated on Oct 25, 2020.