gsm_logger.py

Arduino MKR GSM 1400 · Fichier : gsm_logger.py · Langage : Python · Usage : Archiver sur PC les traces série du modem via pyserial

Un script Python pour journaliser sur PC tout ce que le MKR GSM 1400 envoie sur son port série : chaque ligne est horodatée côté ordinateur puis ajoutée à un CSV. Parfait pour déboguer une campagne de mesures ou auditer les retransmissions GPRS.

Matériel requis

Une Arduino MKR GSM 1400 (microcontrôleur SAMD21, modem cellulaire 2G/GPRS, antenne externe, alimentation par batterie LiPo sur le connecteur J6 ou par USB). Un PC avec Python 3, pyserial (pip install pyserial), et la carte MKR GSM connectée en USB.

Câblage

Un simple câble micro-USB entre la carte et le PC ; le port série USB natif du SAMD21 suffit, aucun adaptateur.

Fonctionnement

pyserial ouvre le port ACM à 9600 bauds ; readline() débite le flux ligne à ligne, chaque lecture reçoit l'horodatage local de l'ordinateur avant écriture CSV avec flush pour ne rien perdre.

Exécution

Dans l'IDE Arduino, installez le package Arduino SAMD Boards, sélectionnez la carte MKR GSM 1400, puis téléversez. Les exemples réseau supposent une carte SIM data active insérée, broche antenne vissée, et un réseau 2G encore couvert dans votre région.

Variantes

Filtrez les lignes contenant un mot-clé, basculez sur SQLite pour de gros volumes, ou relancez automatiquement la connexion série en cas de débranchement.

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())

← Retour à la fiche