gsm_logger.py

Arduino MKR GSM 1400 · Archivo : gsm_logger.py · Lenguaje : Python · Uso : Archiver sur PC les traces série du modem via pyserial

Un script Python que registra en el PC todo lo que el MKR GSM 1400 envía a su puerto serie: cada línea se fecha en el ordenador y se añade a un CSV. Perfecto para depurar una campaña de medidas o auditar reenvíos GPRS.

Hardware

Una Arduino MKR GSM 1400 (microcontrolador SAMD21, módem celular 2G/GPRS, antena externa, alimentada por batería LiPo en el conector J6 o por USB). Un PC con Python 3, pyserial (pip install pyserial) y la placa MKR GSM conectada por USB.

Cableado

Solo un cable micro-USB entre la placa y el PC; basta el puerto serie USB nativo del SAMD21, sin adaptador.

Funcionamiento

pyserial abre el puerto ACM a 9600 baudios; readline() vacía el flujo línea a línea, cada lectura recibe la marca de tiempo del ordenador antes de escribir el CSV con flush para no perder nada.

Ejecución

En el IDE de Arduino, instala el paquete Arduino SAMD Boards, selecciona la placa MKR GSM 1400 y carga. Los ejemplos de red suponen una SIM de datos activa insertada, la antena enroscada y cobertura 2G todavía disponible en tu zona.

Variantes

Filtra líneas con una palabra clave, pasa a SQLite para volúmenes grandes o reconecta el puerto serie automáticamente tras un desconchado.

gsm_logger.py

#!/usr/bin/env python3
"""Archive les traces serie d'un MKR GSM 1400 dans gsm_log.csv.

Branchez la carte en USB, adaptez PORT, puis : python gsm_logger.py
"""
import csv
import datetime as dt
import serial

PORT = "COM7"  # Linux : /dev/ttyACM0 ; macOS : /dev/cu.usbmodem*
BAUD = 9600


def main() -> int:
    try:
        port = serial.Serial(PORT, BAUD, timeout=1)
    except serial.SerialException as exc:
        print(f"Port {PORT} indisponible : {exc}")
        return 1
    with open("gsm_log.csv", "a", newline="", encoding="utf-8") as fh:
        w = csv.writer(fh)
        try:
            while True:
                ligne = port.readline().decode(errors="replace").strip()
                if ligne:
                    ts = dt.datetime.now().isoformat(timespec="seconds")
                    w.writerow([ts, ligne])
                    fh.flush()
        except KeyboardInterrupt:
            print("Termine.")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())

← Volver a la ficha