ajout de tous les cours et TP préparés cet été

This commit is contained in:
2026-01-17 23:10:49 +01:00
parent ed9415bc81
commit 301cf5a98f
125 changed files with 21614 additions and 542 deletions

263
Soc/CORRIGE.md Normal file
View File

@@ -0,0 +1,263 @@
# Corrigé des exercices — Circuits intégrés et SoC
---
## Exercice 1 : Loi de Moore (QCM)
1. **Réponse : b)** Le nombre de transistors double environ tous les deux ans (à coût constant)
2. **Réponse : d)** Toutes les réponses ci-dessus
- Les transistors approchent de la taille atomique
- L'effet tunnel quantique perturbe le fonctionnement
- La chaleur dégagée devient difficile à évacuer
3. **Réponse : b)** Multiplier le nombre de cœurs
- L'augmentation de la fréquence génère trop de chaleur
- La multiplication des cœurs permet d'augmenter la puissance totale sans augmenter la fréquence unitaire
---
## Exercice 2 : Composants d'un SoC
1. **Composants intégrables dans un SoC :**
- ✅ CPU
- ✅ GPU
- ❌ Disque dur mécanique
- ✅ Contrôleur Wi-Fi
- ✅ Mémoire cache
- ✅ NPU (Neural Processing Unit)
- ❌ Écran
- ✅ Contrôleur USB
2. **Pourquoi un disque dur mécanique ne peut pas être intégré :**
- Un disque dur mécanique contient des pièces mobiles (plateaux rotatifs, têtes de lecture)
- Ces composants mécaniques ne peuvent pas être miniaturisés à l'échelle d'une puce
- La technologie est fondamentalement différente (mécanique vs électronique)
- Les SSD (mémoire flash) peuvent en revanche être intégrés car ils sont purement électroniques
3. **Avantages et inconvénients :**
| Avantages | Inconvénients |
|-----------|---------------|
| Compacité : tout tient sur une puce | Non évolutif : impossible de remplacer un composant |
| Consommation réduite : moins de distance entre composants | Obsolescence : tout le système vieillit ensemble |
| Performance : communication ultra-rapide | Réparation difficile : panne = remplacement total |
| Coût de production réduit en masse | Impact environnemental : recyclage complexe |
---
## Exercice 3 : Calculs sur les transistors
1. **Facteur multiplicatif entre Intel 4004 et Apple M1 :**
```
Facteur = 16 000 000 000 / 2 300
Facteur = 6 956 521,7
Facteur ≈ 7 millions
```
Le nombre de transistors a été multiplié par environ **7 millions** en 49 ans.
2. **Calcul théorique selon la loi de Moore :**
Entre 1971 et 2020, il y a 49 ans, soit 49/2 = 24,5 doublements.
```
Transistors théoriques = 2 300 × 2^24,5
Transistors théoriques = 2 300 × 23 726 566
Transistors théoriques ≈ 54,6 milliards
```
3. **Comparaison :**
- Valeur théorique : ~54,6 milliards de transistors
- Valeur réelle (Apple M1) : 16 milliards de transistors
L'Apple M1 a **moins** de transistors que prévu par la loi de Moore pure. Cependant, la loi de Moore a été globalement respectée jusqu'aux années 2010, puis le rythme a légèrement ralenti. De plus, l'Apple M3 (2023) atteint 37 milliards, montrant que la progression continue.
---
## Exercice 4 : ARM vs x86
| Critère | Architecture x86 | Architecture ARM |
|---------|------------------|------------------|
| Type d'instructions | CISC | **RISC** |
| Consommation électrique | **Élevée** | Faible |
| Utilisation principale | **PC, serveurs** | Smartphones, tablettes |
| Exemples de fabricants | Intel, AMD | **Apple, Qualcomm, ARM Ltd** |
| Complexité des instructions | Élevée | **Faible** |
---
## Exercice 5 : Systèmes embarqués
### 1. Thermostat connecté
| Élément | Description |
|---------|-------------|
| **Capteurs** | Température (thermistance), humidité, présence (infrarouge) |
| **Contraintes** | Faible consommation (fonctionnement sur batterie ou alimentation continue), connectivité Wi-Fi stable |
| **SoC possible** | ESP32 (Wi-Fi + Bluetooth intégrés, faible coût) |
### 2. Système ABS d'une voiture
| Élément | Description |
|---------|-------------|
| **Capteurs** | Capteurs de vitesse de roue (effet Hall), accéléromètres |
| **Contraintes** | Temps réel strict (réaction en millisecondes), fiabilité critique (sécurité), résistance aux vibrations et températures |
| **SoC possible** | Microcontrôleur automobile certifié (ex: Infineon AURIX, NXP S32) |
### 3. Montre connectée (smartwatch)
| Élément | Description |
|---------|-------------|
| **Capteurs** | Accéléromètre, gyroscope, cardiofréquencemètre optique, GPS |
| **Contraintes** | Ultra-faible consommation (autonomie de plusieurs jours), miniaturisation extrême, connectivité Bluetooth |
| **SoC possible** | Qualcomm Snapdragon Wear, Apple S9 |
---
## Exercice 6 : Impact environnemental
### 1. Trois problèmes environnementaux liés à la fabrication des SoC :
1. **Extraction des terres rares** : mines polluantes, déforestation, contamination des sols et des eaux
2. **Consommation d'eau** : les usines de fabrication (fabs) utilisent des millions de litres d'eau ultra-pure par jour
3. **Consommation énergétique** : la fabrication d'une puce de quelques grammes nécessite plusieurs kWh d'énergie
### 2. Pourquoi les SoC contribuent à l'obsolescence programmée :
- **Non évolutivité** : impossible de remplacer uniquement le GPU ou d'ajouter de la RAM
- **Fin des mises à jour** : les fabricants cessent de supporter les anciens SoC après quelques années
- **Incompatibilité logicielle** : les nouvelles applications nécessitent des fonctionnalités absentes des anciens SoC
- **Batterie soudée** : souvent associée à un SoC, rendant le remplacement difficile
### 3. Trois actions concrètes pour réduire l'impact :
1. **Allonger la durée de vie** : utiliser ses appareils le plus longtemps possible, faire réparer plutôt que remplacer
2. **Acheter reconditionné** : donner une seconde vie aux appareils
3. **Recycler correctement** : déposer les appareils en fin de vie dans les points de collecte dédiés (pas à la poubelle)
---
## Exercice 7 : Analyse d'un SoC réel
### 1. Pourquoi des cœurs à différentes fréquences ?
Architecture **big.LITTLE** (ou hétérogène) :
- **Cœurs performants** (3.3 GHz) : pour les tâches exigeantes (jeux, montage vidéo)
- **Cœurs efficients** (2.3 GHz) : pour les tâches légères (veille, notifications)
Avantages :
- Meilleure autonomie : les tâches simples utilisent les cœurs économes
- Puissance disponible : les cœurs performants interviennent quand nécessaire
### 2. Rôle du NPU :
Le **NPU** (Neural Processing Unit) est optimisé pour les calculs d'intelligence artificielle :
- Reconnaissance faciale et vocale
- Amélioration des photos (mode nuit, flou d'arrière-plan)
- Traduction en temps réel
- Suggestions de texte prédictif
Il est plus efficace que le CPU/GPU pour ces tâches spécifiques.
### 3. Avantage du modem 5G intégré :
- **Consommation réduite** : moins de distance entre le modem et le CPU = moins d'énergie
- **Latence réduite** : communication plus rapide entre composants
- **Compacité** : gain de place sur la carte mère
- **Coût** : moins de composants à assembler
### 4. Rapport de fréquence :
```
Rapport = 3.3 GHz / 2.3 GHz
Rapport = 1,43
```
Le cœur le plus rapide est **1,43 fois** plus rapide que le cœur le plus lent (soit 43% de plus).
---
## Exercice 8 : RISC-V et open source
### 1. Définition "open source" pour une architecture :
- Les **spécifications** de l'architecture sont publiques et libres d'utilisation
- N'importe qui peut concevoir un processeur RISC-V sans payer de licence
- Contrairement à ARM (licence payante) ou x86 (propriétaire Intel/AMD)
### 2. Deux avantages de RISC-V :
1. **Pas de royalties** : économie sur les coûts de licence
2. **Personnalisation** : possibilité d'ajouter des instructions spécifiques à ses besoins
### 3. Domaine adapté :
- **IoT et objets connectés** : coût très faible par unité
- **Recherche et éducation** : possibilité d'étudier et modifier l'architecture
- **Systèmes embarqués spécialisés** : personnalisation pour des tâches précises
### 4. Intérêt des grandes entreprises :
- **Indépendance** : ne pas dépendre d'ARM ou Intel
- **Réduction des coûts** : pas de licence à payer sur des millions d'unités
- **Souveraineté technologique** : certains pays (Chine) veulent des alternatives aux technologies occidentales
- **Innovation** : liberté de créer des designs optimisés pour leurs besoins spécifiques
---
## Exercice 9 : Conversion et calculs
### 1. Conversions de 3 nm :
```
3 nm = 3 × 10⁻⁹ m
En micromètres :
3 nm = 0,003 µm = 3 × 10⁻³ µm
En mètres :
3 nm = 0,000000003 m = 3 × 10⁻⁹ m
```
### 2. Nombre d'atomes de silicium :
```
Diamètre d'un atome de Si ≈ 0,2 nm
Nombre d'atomes = 3 nm / 0,2 nm = 15 atomes
```
Environ **15 atomes** de silicium peuvent tenir sur une largeur de 3 nm.
### 3. Limites de la miniaturisation :
- Avec seulement 15 atomes, le contrôle des électrons devient très difficile
- L'**effet tunnel quantique** permet aux électrons de "traverser" les barrières
- Les fluctuations statistiques (un atome de plus ou de moins) ont un impact significatif
- La chaleur générée par unité de surface devient extrême
- On approche des **limites fondamentales de la physique**
---
## Exercice 10 : Synthèse
**Exemple de rédaction :**
Les systèmes sur puce (SoC) ont révolutionné l'informatique mobile en permettant d'intégrer tous les composants essentiels d'un ordinateur sur une seule puce de silicium. Cette intégration offre des avantages majeurs : une compacité remarquable permettant de créer des smartphones toujours plus fins, une consommation énergétique réduite grâce à la proximité des composants, et des performances accrues par une communication ultra-rapide entre le CPU, le GPU et la mémoire.
Les architectures ARM, avec leur philosophie RISC, ont particulièrement contribué à cette révolution en proposant un excellent rapport performance/consommation. Les récents processeurs Apple Silicon démontrent que ces architectures peuvent désormais rivaliser avec les processeurs x86 traditionnels, même sur ordinateur.
Cependant, l'avenir des SoC fait face à des défis importants. La miniaturisation approche ses limites physiques : avec des transistors de 3 nm (environ 15 atomes), les effets quantiques perturbent le fonctionnement normal des circuits. Les fabricants doivent explorer de nouvelles pistes comme l'empilement 3D, les nouveaux matériaux, ou les architectures hétérogènes.
Enfin, l'impact environnemental devient une préoccupation majeure. La fabrication des SoC nécessite des ressources rares et beaucoup d'énergie, tandis que leur nature non évolutive contribue à l'obsolescence programmée. L'industrie devra concilier innovation technologique et responsabilité écologique pour un avenir durable.
---
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.

View File

@@ -0,0 +1,537 @@
"""
Corrigé du TP Station Météo IoT — Simulation d'un système embarqué
"""
import random
import time
import json
import math
# =============================================================================
# PARTIE 1 : Simulation des capteurs
# =============================================================================
class Capteur:
"""Simule un capteur embarqué sur SoC."""
def __init__(self, nom, unite, val_min, val_max, precision=1):
"""
Initialise un capteur.
:param nom: (str) Nom du capteur
:param unite: (str) Unité de mesure
:param val_min: (float) Valeur minimale possible
:param val_max: (float) Valeur maximale possible
:param precision: (int) Nombre de décimales
"""
self.nom = nom
self.unite = unite
self.val_min = val_min
self.val_max = val_max
self.precision = precision
self._derniere_valeur = None
def lire(self):
"""
Simule une lecture du capteur.
Retourne une valeur réaliste (proche de la précédente).
:return: (float) Valeur mesurée
"""
if self._derniere_valeur is None:
# Première lecture : valeur aléatoire dans la plage
valeur = random.uniform(self.val_min, self.val_max)
else:
# Lectures suivantes : variation réaliste (±10% de la plage)
amplitude = (self.val_max - self.val_min) * 0.1
variation = random.uniform(-amplitude, amplitude)
valeur = self._derniere_valeur + variation
# S'assurer que la valeur reste dans les limites
valeur = max(self.val_min, min(self.val_max, valeur))
# Arrondir selon la précision
valeur = round(valeur, self.precision)
self._derniere_valeur = valeur
return valeur
def __repr__(self):
return f"Capteur({self.nom}, {self.unite})"
# =============================================================================
# PARTIE 2 : Buffer circulaire
# =============================================================================
class BufferCirculaire:
"""
Buffer circulaire pour stocker les dernières mesures.
Mémoire fixe, adapté aux systèmes embarqués.
"""
def __init__(self, taille):
"""
Initialise le buffer.
:param taille: (int) Nombre maximum d'éléments
"""
self.taille = taille
self.donnees = [None] * taille # Pré-allocation
self.index = 0
self.compte = 0
def ajouter(self, valeur):
"""
Ajoute une valeur au buffer.
Écrase la plus ancienne si plein.
:param valeur: La valeur à ajouter
"""
self.donnees[self.index] = valeur
self.index = (self.index + 1) % self.taille
if self.compte < self.taille:
self.compte += 1
def moyenne(self):
"""
Calcule la moyenne des valeurs stockées.
:return: (float) Moyenne ou None si vide
"""
if self.compte == 0:
return None
total = sum(self.donnees[i] for i in range(self.compte))
return total / self.compte
def min_max(self):
"""
Retourne le minimum et le maximum.
:return: (tuple) (min, max) ou (None, None) si vide
"""
if self.compte == 0:
return (None, None)
valeurs = [self.donnees[i] for i in range(self.compte)]
return (min(valeurs), max(valeurs))
def ecart_type(self):
"""
Calcule l'écart-type des valeurs stockées.
:return: (float) Écart-type ou None si vide
"""
if self.compte < 2:
return None
moy = self.moyenne()
variance = sum((self.donnees[i] - moy) ** 2 for i in range(self.compte)) / self.compte
return math.sqrt(variance)
def valeurs(self):
"""Retourne la liste des valeurs stockées."""
return [self.donnees[i] for i in range(self.compte)]
def est_plein(self):
"""Vérifie si le buffer est plein."""
return self.compte >= self.taille
def __len__(self):
return self.compte
# =============================================================================
# PARTIE 3 : Station météo complète
# =============================================================================
class StationMeteo:
"""
Station météo IoT simulant un système sur SoC.
"""
# Constantes de consommation (en mW)
CONSO_VEILLE = 0.5
CONSO_MESURE = 10
CONSO_ENVOI = 50
CONSO_CALCUL = 5
def __init__(self, nom, taille_buffer=10):
"""
Initialise la station.
:param nom: (str) Identifiant de la station
:param taille_buffer: (int) Taille des buffers de données
"""
self.nom = nom
# Capteurs
self.capteurs = {
'temperature': Capteur("Température", "°C", -20, 50, 1),
'humidite': Capteur("Humidité", "%", 0, 100, 0),
'pression': Capteur("Pression", "hPa", 950, 1050, 1)
}
# Buffers pour chaque capteur
self.buffers = {
nom: BufferCirculaire(taille_buffer)
for nom in self.capteurs
}
# Compteur de mesures
self.nb_mesures = 0
# Mode économie d'énergie
self.mode_eco = False
# Consommation énergétique
self.energie_totale = 0 # mWh consommés
# Buffer d'envoi pour mode éco
self.buffer_envoi = []
def _consommer(self, activite, duree_ms):
"""
Enregistre la consommation d'énergie.
:param activite: (str) Type d'activité
:param duree_ms: (int) Durée en millisecondes
"""
conso = {
'veille': self.CONSO_VEILLE,
'mesure': self.CONSO_MESURE,
'envoi': self.CONSO_ENVOI,
'calcul': self.CONSO_CALCUL
}
# Convertir en mWh : mW * (ms / 3600000)
self.energie_totale += conso.get(activite, 1) * (duree_ms / 3600000)
def mesurer(self):
"""
Effectue une mesure sur tous les capteurs.
:return: (dict) Dictionnaire des mesures
"""
self._consommer('mesure', 50) # 50ms pour une mesure
mesures = {}
for nom, capteur in self.capteurs.items():
valeur = capteur.lire()
mesures[nom] = valeur
self.buffers[nom].ajouter(valeur)
self.nb_mesures += 1
return mesures
def statistiques(self):
"""
Calcule les statistiques sur les données collectées.
:return: (dict) Statistiques par capteur
"""
self._consommer('calcul', 20) # 20ms pour les calculs
stats = {}
for nom, buffer in self.buffers.items():
unite = self.capteurs[nom].unite
moy = buffer.moyenne()
min_val, max_val = buffer.min_max()
stats[nom] = {
'moyenne': round(moy, 1) if moy else None,
'min': min_val,
'max': max_val,
'nb_mesures': len(buffer),
'unite': unite
}
return stats
def detecter_anomalies(self):
"""
Détecte les valeurs anormales.
Une anomalie est une valeur qui s'écarte de plus de 2 écarts-types
de la moyenne.
:return: (list) Liste des anomalies détectées
"""
self._consommer('calcul', 30)
anomalies = []
for nom, buffer in self.buffers.items():
if buffer.compte < 3:
continue
moy = buffer.moyenne()
ecart = buffer.ecart_type()
if ecart is None or ecart == 0:
continue
for valeur in buffer.valeurs():
if abs(valeur - moy) > 2 * ecart:
anomalies.append({
'capteur': nom,
'valeur': valeur,
'moyenne': round(moy, 2),
'ecart_type': round(ecart, 2)
})
return anomalies
def envoyer_cloud(self, donnees):
"""
Simule l'envoi de données vers le cloud.
:param donnees: (dict) Données à envoyer
:return: (bool) Succès de l'envoi
"""
self._consommer('envoi', 200) # 200ms pour un envoi
# Simuler une latence réseau
time.sleep(0.1)
# Simuler un échec occasionnel (5% de chance)
if random.random() < 0.05:
print(f"[{self.nom}] Échec d'envoi - Données mises en cache")
self.buffer_envoi.append(donnees)
return False
# Afficher les données "envoyées"
timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
print(f"\n[{self.nom}] Envoi cloud @ {timestamp}")
for cle, valeur in donnees.items():
if isinstance(valeur, dict):
print(f" {cle}: moy={valeur['moyenne']}{valeur['unite']}, "
f"min={valeur['min']}, max={valeur['max']}")
else:
print(f" {cle}: {valeur}")
return True
def activer_mode_eco(self):
"""Active le mode économie d'énergie."""
self.mode_eco = True
print(f"[{self.nom}] Mode économie activé")
def desactiver_mode_eco(self):
"""Désactive le mode économie d'énergie."""
self.mode_eco = False
print(f"[{self.nom}] Mode économie désactivé")
def rapport(self):
"""
Génère un rapport formaté.
:return: (str) Rapport textuel
"""
self._consommer('calcul', 10)
lignes = [
f"Station : {self.nom}",
f"Nombre total de mesures : {self.nb_mesures}",
f"Mode économie : {'Oui' if self.mode_eco else 'Non'}",
"",
"Statistiques par capteur :"
]
stats = self.statistiques()
for nom, data in stats.items():
lignes.append(f" {nom.capitalize()} :")
lignes.append(f" Moyenne : {data['moyenne']} {data['unite']}")
lignes.append(f" Min/Max : {data['min']} / {data['max']} {data['unite']}")
lignes.append(f" Échantillons : {data['nb_mesures']}")
anomalies = self.detecter_anomalies()
if anomalies:
lignes.append("")
lignes.append(f"Anomalies détectées : {len(anomalies)}")
for a in anomalies[:5]: # Limiter à 5
lignes.append(f" - {a['capteur']}: {a['valeur']} "
f"(moy={a['moyenne']}, σ={a['ecart_type']})")
return "\n".join(lignes)
# =========================================================================
# BONUS : Persistance locale
# =========================================================================
def sauvegarder_local(self, fichier="backup.json"):
"""Sauvegarde les données en local (simulation de mémoire flash)."""
donnees = {
'station': self.nom,
'timestamp': time.strftime("%Y-%m-%d %H:%M:%S"),
'nb_mesures': self.nb_mesures,
'energie': self.energie_totale,
'buffers': {}
}
for nom, buffer in self.buffers.items():
donnees['buffers'][nom] = buffer.valeurs()
with open(fichier, 'w') as f:
json.dump(donnees, f, indent=2)
print(f"[{self.nom}] Données sauvegardées dans {fichier}")
def charger_local(self, fichier="backup.json"):
"""Charge les données depuis la sauvegarde locale."""
try:
with open(fichier, 'r') as f:
donnees = json.load(f)
for nom, valeurs in donnees.get('buffers', {}).items():
if nom in self.buffers:
for v in valeurs:
self.buffers[nom].ajouter(v)
self.nb_mesures = donnees.get('nb_mesures', 0)
print(f"[{self.nom}] Données chargées depuis {fichier}")
return True
except FileNotFoundError:
print(f"[{self.nom}] Aucune sauvegarde trouvée")
return False
# =========================================================================
# BONUS : Protocole MQTT simulé
# =========================================================================
def publier(self, topic, message):
"""Publie un message sur un topic (simulation MQTT)."""
timestamp = time.strftime("%H:%M:%S")
print(f"[MQTT {timestamp}] {self.nom}/{topic} -> {message}")
# =============================================================================
# PARTIE 5 : Programme principal
# =============================================================================
def main():
"""Programme principal de la station météo."""
# Créer la station
station = StationMeteo("STATION_01", taille_buffer=20)
print("=" * 60)
print(" STATION MÉTÉO IoT - Simulation SoC")
print("=" * 60)
# Tenter de charger une sauvegarde précédente
station.charger_local()
# Simuler 30 mesures (accéléré pour le test)
nb_mesures = 30
intervalle = 0.5 # Secondes entre les mesures
try:
for i in range(nb_mesures):
# Effectuer une mesure
mesure = station.mesurer()
print(f"\rMesure {i+1:3d}/{nb_mesures}: "
f"T={mesure['temperature']:5.1f}°C, "
f"H={mesure['humidite']:3.0f}%, "
f"P={mesure['pression']:6.1f}hPa", end="")
# Publier sur MQTT (simulation)
if (i + 1) % 5 == 0:
station.publier("temperature", mesure['temperature'])
# Envoyer au cloud toutes les 10 mesures
if (i + 1) % 10 == 0:
stats = station.statistiques()
station.envoyer_cloud(stats)
# Sauvegarder localement toutes les 15 mesures
if (i + 1) % 15 == 0:
station.sauvegarder_local()
# Simuler le mode éco après 20 mesures
if i == 19:
station.activer_mode_eco()
# Attendre avant la prochaine mesure
time.sleep(intervalle)
except KeyboardInterrupt:
print("\n\nArrêt demandé par l'utilisateur.")
# Rapport final
print("\n\n" + "=" * 60)
print("RAPPORT FINAL")
print("=" * 60)
print(station.rapport())
print(f"\nÉnergie totale consommée : {station.energie_totale:.6f} mWh")
# Sauvegarde finale
station.sauvegarder_local()
# =============================================================================
# TESTS
# =============================================================================
if __name__ == "__main__":
print("=" * 60)
print("TEST 1 : Capteur")
print("=" * 60)
capteur_temp = Capteur("Température", "°C", -20, 50, 1)
print(f"Capteur créé : {capteur_temp}")
print("Lectures :", [capteur_temp.lire() for _ in range(5)])
print("\n" + "=" * 60)
print("TEST 2 : Buffer circulaire")
print("=" * 60)
buffer = BufferCirculaire(5)
for i in range(1, 8):
buffer.ajouter(i)
print(f"Ajout {i}: données={buffer.donnees}, compte={buffer.compte}")
print(f"Moyenne : {buffer.moyenne()}")
print(f"Min/Max : {buffer.min_max()}")
print("\n" + "=" * 60)
print("TEST 3 : Station météo complète")
print("=" * 60)
main()
# =============================================================================
# RÉPONSES AUX QUESTIONS DE SYNTHÈSE
# =============================================================================
"""
1. Pourquoi utiliser un buffer circulaire ?
- Allocation mémoire fixe et prévisible
- Pas de fragmentation mémoire
- Temps d'accès constant O(1)
- Adapté aux contraintes des microcontrôleurs (RAM limitée)
2. Compromis fréquence/consommation :
- Plus de mesures = meilleure précision mais plus de consommation
- Mode éco : réduire la fréquence quand les données varient peu
- Adapter dynamiquement selon l'activité détectée
3. Gestion de la perte de connexion :
- Stockage local temporaire (mémoire flash)
- File d'attente des messages
- Renvoi automatique à la reconnexion
- Compression des données pour économiser la bande passante
4. Différences Python vs microcontrôleur :
- Python : haut niveau, garbage collector, pas de contraintes temps réel
- Microcontrôleur : C/C++/MicroPython, gestion manuelle mémoire,
interruptions matérielles, accès direct aux registres
5. Optimisation SoC pour l'IoT :
- Composants faible consommation intégrés
- Modes de veille profonde
- Réveil sur interruption (capteur ou timer)
- Accélérateurs matériels pour crypto et radio
"""

View File

@@ -0,0 +1,252 @@
# Circuits intégrés et Systèmes sur Puce (SoC)
---
## 1. Rappels de Première
### 1.1. Composition d'un ordinateur
Nous avons vu en Première que l'évolution de l'architecture des ordinateurs a abouti à l'architecture de Von Neumann.
Cette architecture possède les composants suivants :
- **Mémoire**
- Mémoire de masse (disque dur, SSD)
- Mémoire vive (RAM)
- **Processeur (CPU)**
- **Carte graphique (GPU)** (optionnel)
- **Périphériques d'entrée**
- Souris, clavier, microphone
- **Périphériques de sortie**
- Écran, haut-parleurs
Tous ces composants sont reliés par des **bus** (dans le cas d'un ordinateur de bureau, il s'agit de pistes sur la carte mère et de câbles).
### 1.2. Évolution de la taille des ordinateurs
- **1945 - ENIAC** : Le premier ordinateur électronique programmable faisait 167 m² et pesait 30 tonnes.
![ENIAC](assets/Eniac.jpg)
*L'ENIAC en 1945 (Source : Wikipédia)*
- **1981 - IBM PC 5150** : Le premier ordinateur personnel grand public, tenant sur un bureau.
![IBM PC 5150](assets/IBMPC5150.jpg)
*L'IBM PC 5150 (Source : Wikipédia)*
- **Aujourd'hui** : Ordinateurs portables, tablettes, smartphones... La puissance de l'ENIAC tient désormais dans une puce de quelques millimètres carrés.
### 1.3. Évolution de la puissance : la loi de Moore
**Gordon E. Moore**, cofondateur d'Intel en 1968, a formulé en 1965 une observation empirique devenue célèbre :
> **Loi de Moore** : À coût constant, le nombre de transistors dans un microprocesseur double environ tous les deux ans.
Cette loi s'est vérifiée pendant plus de 50 ans, permettant une croissance exponentielle de la puissance de calcul.
**Limites physiques :**
La miniaturisation des transistors atteint ses limites physiques :
- En 2024, les processeurs les plus avancés utilisent une gravure en **3 nm** (environ 15 atomes de silicium)
- Les effets quantiques (effet tunnel) deviennent problématiques en dessous de 5 nm
- La dissipation thermique devient un défi majeur
**Évolution des stratégies :**
Face à ces limites, les fabricants adoptent de nouvelles approches :
- **Augmentation du nombre de cœurs** : Les processeurs modernes ont 8, 16, voire 24 cœurs
- **Architectures hybrides** : Mélange de cœurs performants et de cœurs économes (big.LITTLE, Intel Hybrid)
- **Accélérateurs spécialisés** : NPU pour l'IA, GPU pour le calcul parallèle
| Processeur | Année | Transistors | Gravure | Cœurs |
|------------|-------|-------------|---------|-------|
| Intel 4004 | 1971 | 2 300 | 10 µm | 1 |
| Intel Pentium | 1993 | 3,1 millions | 800 nm | 1 |
| Intel Core 2 | 2006 | 291 millions | 65 nm | 2 |
| Apple M1 | 2020 | 16 milliards | 5 nm | 8 |
| Apple M3 Pro | 2023 | 37 milliards | 3 nm | 12 |
---
## 2. Systèmes sur Puce (SoC)
### 2.1. Définition
Un **SoC** (*System on Chip* ou *Système sur Puce*) est un circuit intégré qui regroupe sur une seule puce tous les composants essentiels d'un système informatique :
- Processeur (CPU)
- Processeur graphique (GPU)
- Mémoire cache
- Contrôleur mémoire
- Contrôleurs d'entrées/sorties
- Parfois : modem, NPU (Neural Processing Unit), DSP...
### 2.2. Avantages des SoC
| Avantage | Explication |
|----------|-------------|
| **Compacité** | Tous les composants sur une seule puce |
| **Consommation réduite** | Moins de distance entre composants = moins d'énergie |
| **Performance** | Communication ultra-rapide entre composants |
| **Coût** | Production en masse moins chère |
| **Fiabilité** | Moins de connexions = moins de points de défaillance |
### 2.3. Inconvénients des SoC
| Inconvénient | Explication |
|--------------|-------------|
| **Non évolutif** | Impossible de remplacer un composant individuellement |
| **Obsolescence** | Le système entier devient obsolète si un composant est dépassé |
| **Réparation** | En cas de panne, tout le SoC doit être remplacé |
| **Recyclage** | Difficile de séparer les différents matériaux |
### 2.4. Exemples de SoC
- **Smartphones** : Apple A17 Pro (iPhone), Qualcomm Snapdragon 8 Gen 3 (Android)
- **Ordinateurs** : Apple M3 (Mac), Qualcomm Snapdragon X Elite (PC Windows)
- **Objets connectés** : ESP32, Raspberry Pi Pico
- **Consoles** : AMD APU (PS5, Xbox Series X)
![Raspberry Pi](assets/raspberryPI.png)
*Raspberry Pi : un micro-ordinateur basé sur un SoC ARM (Source : Wikipédia)*
---
## 3. Architectures ARM vs x86
### 3.1. Deux philosophies différentes
| Caractéristique | x86/x64 (Intel, AMD) | ARM |
|-----------------|----------------------|-----|
| **Philosophie** | CISC (Complex Instruction Set) | RISC (Reduced Instruction Set) |
| **Instructions** | Nombreuses et complexes | Peu nombreuses et simples |
| **Consommation** | Élevée | Faible |
| **Performance brute** | Très élevée | Élevée (en progression) |
| **Utilisation** | PC, serveurs | Smartphones, tablettes, embarqué |
### 3.2. Convergence récente
Depuis 2020, la frontière s'estompe :
- **Apple Silicon (M1, M2, M3)** : Architecture ARM rivalisant avec x86 sur ordinateurs
- **Windows on ARM** : Support des applications x86 par émulation
- **Serveurs ARM** : Amazon Graviton, Ampere Altra
### 3.3. RISC-V : l'architecture libre
**RISC-V** est une architecture de processeur **open source** :
- Pas de royalties à payer
- Personnalisable selon les besoins
- Adoptée par de nombreux fabricants (SiFive, Alibaba, Google)
- Présente dans certains objets connectés et microcontrôleurs
---
## 4. Systèmes embarqués et IoT
### 4.1. Définition
Un **système embarqué** est un système informatique dédié à une tâche spécifique, intégré dans un appareil plus large. Il se caractérise par :
- Ressources limitées (mémoire, puissance)
- Contraintes temps réel
- Faible consommation énergétique
- Fiabilité élevée
### 4.2. Exemples de systèmes embarqués
| Domaine | Exemples |
|---------|----------|
| **Transport** | ABS, ESP, GPS, pilote automatique |
| **Médical** | Pacemaker, pompe à insuline, IRM |
| **Domotique** | Thermostat connecté, serrure intelligente |
| **Industrie** | Automates programmables, robots |
### 4.3. Internet des Objets (IoT)
L'**IoT** (*Internet of Things*) désigne l'interconnexion d'objets du quotidien via Internet :
- **Capteurs** : température, humidité, mouvement, luminosité
- **Actionneurs** : moteurs, LED, relais
- **Communication** : Wi-Fi, Bluetooth, LoRa, Zigbee
- **Cloud** : stockage et traitement des données
**Enjeux de l'IoT :**
- Sécurité (objets souvent vulnérables)
- Vie privée (collecte massive de données)
- Interopérabilité (standards multiples)
- Consommation énergétique
---
## 5. Impact environnemental
### 5.1. Fabrication
La production des SoC a un impact environnemental significatif :
- **Terres rares** : extraction polluante et énergivore
- **Eau ultra-pure** : des millions de litres par jour pour une usine
- **Énergie** : fabrication très consommatrice
### 5.2. Obsolescence
Les SoC contribuent à l'obsolescence programmée :
- Impossibilité de mise à niveau
- Arrêt des mises à jour logicielles
- Incompatibilité avec les nouveaux standards
### 5.3. Recyclage
Le recyclage des composants électroniques reste un défi :
- Mélange de matériaux difficile à séparer
- Présence de substances toxiques
- Faible taux de recyclage effectif (< 20% mondial)
**Initiatives positives :**
- Indices de réparabilité obligatoires (France)
- Droit à la réparation (Union Européenne)
- Éco-conception des produits
---
## Synthèse
```
┌─────────────────────────────────────────────────────────────┐
│ SYSTÈME SUR PUCE (SoC) │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────────────┐ │
│ │ CPU │ │ GPU │ │ NPU │ │ Contrôleurs │ │
│ │ (ARM/ │ │ │ │ (IA) │ │ (USB, PCIe, │ │
│ │ x86) │ │ │ │ │ │ Wi-Fi, etc.) │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────────────┘ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Mémoire Cache ││
│ └─────────────────────────────────────────────────────────┘│
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Bus interne haute vitesse ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
│ │
▼ ▼
┌──────────┐ ┌──────────────┐
│ RAM │ │ Stockage │
│(externe) │ │ (SSD/eMMC) │
└──────────┘ └──────────────┘
```
**Points clés à retenir :**
1. Un **SoC** intègre tous les composants d'un ordinateur sur une seule puce
2. Les architectures **ARM** dominent le mobile grâce à leur efficacité énergétique
3. Les architectures **x86** restent dominantes sur PC et serveurs (mais ARM progresse)
4. **RISC-V** est une alternative open source prometteuse
5. Les **systèmes embarqués** et l'**IoT** utilisent massivement les SoC
6. L'**impact environnemental** est un enjeu majeur de l'industrie des semi-conducteurs
---
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.

169
Soc/EXERCICES.md Normal file
View File

@@ -0,0 +1,169 @@
# Exercices — Circuits intégrés et SoC
---
## Exercice 1 : Loi de Moore (QCM)
1. La loi de Moore prédit que :
- [ ] a) La vitesse des processeurs double tous les ans
- [ ] b) Le nombre de transistors double environ tous les deux ans (à coût constant)
- [ ] c) La consommation électrique diminue de moitié tous les ans
- [ ] d) Le prix des processeurs double tous les deux ans
2. Pourquoi la loi de Moore atteint-elle ses limites physiques ?
- [ ] a) Les transistors ne peuvent pas être plus petits qu'un atome
- [ ] b) Les effets quantiques perturbent le fonctionnement sous 5 nm
- [ ] c) La dissipation thermique devient ingérable
- [ ] d) Toutes les réponses ci-dessus
3. Quelle stratégie les fabricants utilisent-ils pour contourner ces limites ?
- [ ] a) Augmenter la fréquence indéfiniment
- [ ] b) Multiplier le nombre de cœurs
- [ ] c) Utiliser des matériaux radioactifs
- [ ] d) Réduire la taille de la RAM
---
## Exercice 2 : Composants d'un SoC
Un SoC moderne comme l'Apple M3 contient plusieurs composants.
1. Parmi les éléments suivants, lesquels peuvent être intégrés dans un SoC ? (Plusieurs réponses possibles)
- [ ] CPU
- [ ] GPU
- [ ] Disque dur mécanique
- [ ] Contrôleur Wi-Fi
- [ ] Mémoire cache
- [ ] NPU (Neural Processing Unit)
- [ ] Écran
- [ ] Contrôleur USB
2. Expliquer pourquoi un disque dur mécanique ne peut pas être intégré dans un SoC.
3. Donner deux avantages et deux inconvénients de l'intégration de tous ces composants sur une seule puce.
---
## Exercice 3 : Calculs sur les transistors
Le tableau suivant donne l'évolution du nombre de transistors dans les processeurs :
| Processeur | Année | Transistors |
|------------|-------|-------------|
| Intel 4004 | 1971 | 2 300 |
| Intel 8086 | 1978 | 29 000 |
| Intel Pentium | 1993 | 3 100 000 |
| Intel Core i7 (1ère gén.) | 2008 | 731 000 000 |
| Apple M1 | 2020 | 16 000 000 000 |
1. Calculer le facteur multiplicatif du nombre de transistors entre l'Intel 4004 et l'Apple M1.
2. Si la loi de Moore était parfaitement respectée (doublement tous les 2 ans), combien de transistors devrait avoir un processeur en 2020, en partant de 2 300 transistors en 1971 ?
3. Comparer avec le nombre réel de l'Apple M1. La loi de Moore a-t-elle été respectée ?
---
## Exercice 4 : ARM vs x86
Compléter le tableau comparatif suivant :
| Critère | Architecture x86 | Architecture ARM |
|---------|------------------|------------------|
| Type d'instructions | CISC | ... |
| Consommation électrique | ... | Faible |
| Utilisation principale | ... | Smartphones, tablettes |
| Exemples de fabricants | Intel, AMD | ... |
| Complexité des instructions | Élevée | ... |
---
## Exercice 5 : Systèmes embarqués
Pour chaque système embarqué ci-dessous, identifier :
- Le type de capteurs utilisés
- Les contraintes principales (temps réel, consommation, fiabilité)
- Un exemple de SoC qui pourrait être utilisé
1. **Thermostat connecté**
2. **Système ABS d'une voiture**
3. **Montre connectée (smartwatch)**
---
## Exercice 6 : Impact environnemental
Un smartphone contient environ 50 matériaux différents, dont des terres rares.
1. Citer trois problèmes environnementaux liés à la fabrication des SoC.
2. Pourquoi les SoC contribuent-ils à l'obsolescence programmée ?
3. Proposer trois actions concrètes qu'un consommateur peut entreprendre pour réduire l'impact environnemental de ses appareils électroniques.
---
## Exercice 7 : Analyse d'un SoC réel
Voici les spécifications du SoC **Qualcomm Snapdragon 8 Gen 3** (2023) :
- CPU : 8 cœurs (1 × 3.3 GHz + 3 × 3.2 GHz + 2 × 3.0 GHz + 2 × 2.3 GHz)
- GPU : Adreno 750
- NPU : Hexagon
- Gravure : 4 nm
- Modem 5G intégré
- Wi-Fi 7, Bluetooth 5.4
1. Expliquer pourquoi le CPU possède des cœurs à différentes fréquences.
2. À quoi sert le NPU (Neural Processing Unit) dans un smartphone moderne ?
3. Quel est l'avantage d'avoir le modem 5G intégré au SoC plutôt que sur une puce séparée ?
4. Calculer le rapport de fréquence entre le cœur le plus rapide et le cœur le plus lent.
---
## Exercice 8 : RISC-V et open source
RISC-V est une architecture de processeur open source.
1. Expliquer ce que signifie "open source" dans le contexte d'une architecture de processeur.
2. Citer deux avantages de RISC-V par rapport à ARM ou x86.
3. Donner un exemple de domaine où RISC-V est particulièrement adapté.
4. Pourquoi les grandes entreprises (Google, Alibaba) s'intéressent-elles à RISC-V ?
---
## Exercice 9 : Conversion et calculs
1. Un processeur utilise une gravure de 3 nm. Convertir cette valeur en :
- Micromètres (µm)
- Mètres
2. Sachant qu'un atome de silicium mesure environ 0,2 nm de diamètre, combien d'atomes de silicium peuvent théoriquement tenir sur une largeur de 3 nm ?
3. Pourquoi ce calcul montre-t-il les limites de la miniaturisation ?
---
## Exercice 10 : Synthèse
Rédiger un paragraphe de 10 à 15 lignes expliquant pourquoi les SoC ont révolutionné l'informatique mobile et quels sont les défis pour l'avenir.
Votre réponse doit aborder :
- L'intégration des composants
- L'efficacité énergétique
- Les limites physiques de la miniaturisation
- Les enjeux environnementaux
---
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.

473
Soc/TP_Station_Meteo_IoT.md Normal file
View File

@@ -0,0 +1,473 @@
# TP : Station Météo IoT — Simulation d'un système embarqué
## Contexte
Vous travaillez pour une startup spécialisée dans les objets connectés. Votre mission est de développer le logiciel embarqué d'une **station météo connectée** basée sur un SoC (System on Chip).
Cette station doit :
- Collecter des données de capteurs (température, humidité, pression)
- Traiter ces données localement (calculs de moyennes, détection d'anomalies)
- Simuler l'envoi vers le cloud
- Optimiser la consommation énergétique
L'objectif est de comprendre comment fonctionne un système embarqué sur SoC et les contraintes associées.
---
## Objectifs pédagogiques
- Comprendre le fonctionnement d'un système embarqué
- Manipuler des données de capteurs simulés
- Implémenter des algorithmes de traitement de données
- Appréhender les contraintes de ressources limitées
- Découvrir les concepts de l'IoT
---
## Partie 1 : Simulation des capteurs
### 1.1. Classe Capteur
Un capteur embarqué a des caractéristiques spécifiques :
- Un nom (température, humidité, etc.)
- Une unité de mesure
- Une plage de valeurs valides
- Une précision (nombre de décimales)
Créer la classe `Capteur` :
```python
import random
import time
class Capteur:
"""Simule un capteur embarqué sur SoC."""
def __init__(self, nom, unite, val_min, val_max, precision=1):
"""
Initialise un capteur.
:param nom: (str) Nom du capteur
:param unite: (str) Unité de mesure
:param val_min: (float) Valeur minimale possible
:param val_max: (float) Valeur maximale possible
:param precision: (int) Nombre de décimales
"""
self.nom = nom
self.unite = unite
self.val_min = val_min
self.val_max = val_max
self.precision = precision
self._derniere_valeur = None
def lire(self):
"""
Simule une lecture du capteur.
Retourne une valeur réaliste (proche de la précédente).
:return: (float) Valeur mesurée
"""
# À compléter
pass
def __repr__(self):
return f"Capteur({self.nom}, {self.unite})"
```
**Consignes pour la méthode `lire()` :**
- Si c'est la première lecture, générer une valeur aléatoire dans la plage
- Sinon, générer une valeur proche de la précédente (±10% de la plage)
- Arrondir selon la précision
- S'assurer que la valeur reste dans les limites
### 1.2. Création des capteurs de la station
Créer trois capteurs pour notre station :
```python
# Capteur de température : -20°C à 50°C, précision 0.1°C
capteur_temp = Capteur("Température", "°C", -20, 50, precision=1)
# Capteur d'humidité : 0% à 100%, précision 1%
capteur_hum = Capteur("Humidité", "%", 0, 100, precision=0)
# Capteur de pression : 950 hPa à 1050 hPa, précision 0.1 hPa
capteur_pres = Capteur("Pression", "hPa", 950, 1050, precision=1)
```
**Test :**
```python
>>> for _ in range(5):
... print(f"T={capteur_temp.lire()}°C, H={capteur_hum.lire()}%, P={capteur_pres.lire()}hPa")
T=22.3°C, H=65%, P=1013.2hPa
T=23.1°C, H=67%, P=1012.8hPa
T=22.8°C, H=66%, P=1013.5hPa
...
```
---
## Partie 2 : Gestionnaire de données
### 2.1. Buffer circulaire
Les systèmes embarqués ont une mémoire limitée. On utilise un **buffer circulaire** pour stocker les N dernières mesures sans allouer de mémoire dynamiquement.
```python
class BufferCirculaire:
"""
Buffer circulaire pour stocker les dernières mesures.
Mémoire fixe, adapté aux systèmes embarqués.
"""
def __init__(self, taille):
"""
Initialise le buffer.
:param taille: (int) Nombre maximum d'éléments
"""
self.taille = taille
self.donnees = [None] * taille # Pré-allocation
self.index = 0
self.compte = 0
def ajouter(self, valeur):
"""
Ajoute une valeur au buffer.
Écrase la plus ancienne si plein.
:param valeur: La valeur à ajouter
"""
# À compléter
pass
def moyenne(self):
"""
Calcule la moyenne des valeurs stockées.
:return: (float) Moyenne ou None si vide
"""
# À compléter
pass
def min_max(self):
"""
Retourne le minimum et le maximum.
:return: (tuple) (min, max) ou (None, None) si vide
"""
# À compléter
pass
def est_plein(self):
"""Vérifie si le buffer est plein."""
return self.compte >= self.taille
def __len__(self):
return self.compte
```
**Principe du buffer circulaire :**
```
Taille = 5, après ajout de 1, 2, 3, 4, 5, 6, 7 :
Étape 1-5 : [1, 2, 3, 4, 5] (remplissage normal)
Étape 6 : [6, 2, 3, 4, 5] (6 écrase 1)
Étape 7 : [6, 7, 3, 4, 5] (7 écrase 2)
L'index "tourne" : index = (index + 1) % taille
```
---
## Partie 3 : Station météo complète
### 3.1. Classe StationMeteo
Assembler les composants pour créer la station :
```python
class StationMeteo:
"""
Station météo IoT simulant un système sur SoC.
"""
def __init__(self, nom, taille_buffer=10):
"""
Initialise la station.
:param nom: (str) Identifiant de la station
:param taille_buffer: (int) Taille des buffers de données
"""
self.nom = nom
# Capteurs
self.capteurs = {
'temperature': Capteur("Température", "°C", -20, 50, 1),
'humidite': Capteur("Humidité", "%", 0, 100, 0),
'pression': Capteur("Pression", "hPa", 950, 1050, 1)
}
# Buffers pour chaque capteur
self.buffers = {
nom: BufferCirculaire(taille_buffer)
for nom in self.capteurs
}
# Compteur de mesures
self.nb_mesures = 0
# Mode économie d'énergie
self.mode_eco = False
def mesurer(self):
"""
Effectue une mesure sur tous les capteurs.
:return: (dict) Dictionnaire des mesures
"""
# À compléter
pass
def statistiques(self):
"""
Calcule les statistiques sur les données collectées.
:return: (dict) Statistiques par capteur
"""
# À compléter
pass
def detecter_anomalies(self):
"""
Détecte les valeurs anormales.
Une anomalie est une valeur qui s'écarte de plus de 2 écarts-types
de la moyenne.
:return: (list) Liste des anomalies détectées
"""
# À compléter (bonus)
pass
def rapport(self):
"""
Génère un rapport formaté.
:return: (str) Rapport textuel
"""
# À compléter
pass
```
### 3.2. Simulation d'envoi cloud
Dans un vrai système IoT, les données sont envoyées vers le cloud. Simuler cette fonctionnalité :
```python
def envoyer_cloud(self, donnees):
"""
Simule l'envoi de données vers le cloud.
En mode éco, regroupe les envois.
:param donnees: (dict) Données à envoyer
:return: (bool) Succès de l'envoi
"""
# Simuler une latence réseau
import time
time.sleep(0.1) # 100ms de latence simulée
# Simuler un échec occasionnel (5% de chance)
if random.random() < 0.05:
print(f"[{self.nom}] Échec d'envoi - Nouvelle tentative...")
return False
# Afficher les données "envoyées"
timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
print(f"[{self.nom}] Envoi cloud @ {timestamp}")
for cle, valeur in donnees.items():
print(f" {cle}: {valeur}")
return True
```
---
## Partie 4 : Gestion de l'énergie
### 4.1. Mode économie d'énergie
Les systèmes embarqués doivent économiser l'énergie. Implémenter un mode économie :
```python
def activer_mode_eco(self):
"""
Active le mode économie d'énergie.
- Réduit la fréquence des mesures
- Regroupe les envois cloud
"""
self.mode_eco = True
print(f"[{self.nom}] Mode économie activé")
def desactiver_mode_eco(self):
"""Désactive le mode économie d'énergie."""
self.mode_eco = False
print(f"[{self.nom}] Mode économie désactivé")
```
### 4.2. Simulation de consommation
Ajouter un suivi de la consommation énergétique simulée :
```python
class StationMeteo:
# Constantes de consommation (en mW)
CONSO_VEILLE = 0.5
CONSO_MESURE = 10
CONSO_ENVOI = 50
CONSO_CALCUL = 5
def __init__(self, ...):
...
self.energie_totale = 0 # mWh consommés
def _consommer(self, activite, duree_ms):
"""
Enregistre la consommation d'énergie.
:param activite: (str) Type d'activité
:param duree_ms: (int) Durée en millisecondes
"""
conso = {
'veille': self.CONSO_VEILLE,
'mesure': self.CONSO_MESURE,
'envoi': self.CONSO_ENVOI,
'calcul': self.CONSO_CALCUL
}
# Convertir en mWh : mW * (ms / 3600000)
self.energie_totale += conso[activite] * (duree_ms / 3600000)
```
---
## Partie 5 : Programme principal
### 5.1. Boucle de fonctionnement
Créer le programme principal qui simule le fonctionnement de la station :
```python
def main():
"""Programme principal de la station météo."""
# Créer la station
station = StationMeteo("STATION_01", taille_buffer=20)
print("=" * 50)
print(" STATION MÉTÉO IoT - Simulation SoC")
print("=" * 50)
# Simuler 1 heure de fonctionnement (1 mesure par minute = 60 mesures)
nb_mesures = 60
intervalle = 1 # Secondes entre les mesures (accéléré pour la simulation)
try:
for i in range(nb_mesures):
# Effectuer une mesure
mesure = station.mesurer()
print(f"\nMesure {i+1}/{nb_mesures}: T={mesure['temperature']}°C, "
f"H={mesure['humidite']}%, P={mesure['pression']}hPa")
# Envoyer au cloud toutes les 10 mesures
if (i + 1) % 10 == 0:
stats = station.statistiques()
station.envoyer_cloud(stats)
# Attendre avant la prochaine mesure
time.sleep(intervalle)
except KeyboardInterrupt:
print("\n\nArrêt demandé par l'utilisateur.")
# Rapport final
print("\n" + "=" * 50)
print("RAPPORT FINAL")
print("=" * 50)
print(station.rapport())
print(f"Énergie consommée : {station.energie_totale:.4f} mWh")
if __name__ == "__main__":
main()
```
---
## Partie 6 : Extensions (Bonus)
### 6.1. Détection d'anomalies
Implémenter la méthode `detecter_anomalies()` qui identifie les valeurs aberrantes.
### 6.2. Persistance locale
Ajouter une fonctionnalité de sauvegarde locale (fichier JSON) pour conserver les données en cas de perte de connexion :
```python
def sauvegarder_local(self, fichier="backup.json"):
"""Sauvegarde les données en local (simulation de mémoire flash)."""
pass
def charger_local(self, fichier="backup.json"):
"""Charge les données depuis la sauvegarde locale."""
pass
```
### 6.3. Protocole de communication
Simuler un protocole de communication simple (type MQTT) :
```python
def publier(self, topic, message):
"""Publie un message sur un topic (simulation MQTT)."""
print(f"[MQTT] {topic} -> {message}")
```
### 6.4. Multi-stations
Créer un réseau de plusieurs stations qui communiquent entre elles et agrègent leurs données.
---
## Questions de synthèse
1. Pourquoi utilise-t-on un buffer circulaire plutôt qu'une liste dynamique sur un système embarqué ?
2. Quels sont les compromis à faire entre fréquence de mesure et consommation énergétique ?
3. Comment un vrai système IoT gère-t-il la perte de connexion réseau ?
4. Quelles sont les différences entre le code Python de simulation et le code réel sur un microcontrôleur ?
5. Comment l'architecture SoC permet-elle d'optimiser la consommation dans ce type d'application ?
---
## Barème indicatif
| Partie | Points |
|--------|--------|
| Partie 1 : Capteurs | 3 |
| Partie 2 : Buffer circulaire | 4 |
| Partie 3 : Station complète | 5 |
| Partie 4 : Gestion énergie | 3 |
| Partie 5 : Programme principal | 3 |
| Partie 6 : Bonus | 2 |
| **Total** | **20** |
---
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.

BIN
Soc/assets/Eniac.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
Soc/assets/IBMPC5150.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
Soc/assets/bo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

BIN
Soc/assets/raspberryPI.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB