geoloc-cellules.ino
Sans GPS, la cellule radio suffit souvent : le MKR NB 1500 lit son TAC, son identifiant de cellule et le niveau de signal, puis transmet le tout vers un service de géolocalisation par cellules. Idéal pour suivre un objet stationnaire ou valider une couverture.
Matériel requis
Une Arduino MKR NB 1500 (microcontrôleur SAMD21, modem u-blox LTE-M/NB-IoT, antenne externe, alimentation LiPo sur J6 ou USB). SIM IoT enregistrée sur le réseau, antenne ; compte gratuit sur un service OpenCelliD pour la conversion.
Câblage
Aucun câblage ; fonctionne carte seule, en mobilité lente (piéton, conteneur).
Fonctionnement
CEREG expose le Tracking Area Code et le CellIdentity de la cellule servie ; CESQ détaille RSRP/RSRQ. Ces couplets correspondent aux clés des bases de données de tours cellulaires.
Exécution
Installez le package Arduino SAMD Boards et la bibliothèque MKRNB, sélectionnez la carte, téléversez. Prévoyez une carte SIM IoT (LTE-M ou NB1) activée et une bonne réception : l'attachement au réseau peut demander plusieurs minutes.
Variantes
Complétez par un scan des cellules voisines (CEREG avec l'option 2) pour affiner le triangle, ou ajoutez un petit GPS I2C quand la précision devient critique.
geoloc-cellules.ino
// Geolocalisation par cellule : LAC/CI + RSSI via le modem SARA-R4.
// Utile quand le GPS n'est pas alimente/couvert : precision 100 m - km.
#include <MKRNB.h>
const char PIN_SIM[] = "0000";
NB nb;
void setup() {
Serial.begin(9600);
while (!Serial);
if (nb.begin(PIN_SIM) != NB_READY) while (true);
while (nb.getStatus() != NETWORK_JOINED) delay(2000);
}
void loop() {
// Le core MKRNB expose l'operateur ; les infos fines de cellule
// passent par les commandes AT dediees du SARA-R4 :
nb.sendCheckConfig("COPS?"); // operateur + MCC/MNC
nb.sendCheckConfig("CEREG?"); // LAC/TAC + CellId enregistree
nb.sendCheckConfig("CESQ?"); // RSSI/RSRP detailles
// CEREG renvoie par ex : +CEREG: 0,1,"812F","0A3B5C2",7
// -> TAC 0x812F, CellID 0x0A3B5C2, niveau 7
// Transmettez ce couple a un service de localisation par cellules
// (OpenCelliD, Google Geolocation) pour obtenir lat/lon.
Serial.print(F("RSSI module : "));
Serial.println(nb.signalQuality());
delay(300000); // un point toutes les 5 min
}