Interfaces Materielles
Pour interagir avec l'utilisateur, nos systemes embarques ont besoin d'ecrans, de claviers et de boutons. Decouvrons comment connecter ces interfaces !
Objectifs du cours
- Comprendre les protocoles de communication I2C, SPI et UART
- Connecter un ecran LCD ou OLED a un microcontroleur
- Utiliser un clavier matriciel
- Programmer l'affichage de donnees
- Creer une interface homme-machine complete
Erreurs courantes a eviter
- Confondre les protocoles I2C et SPI
- Oublier les resistances pull-up pour I2C
- Ne pas verifier l'adresse I2C du peripherique
- Utiliser des cables trop longs pour les communications rapides
**Comment les composants se parlent**
Les peripheriques communiquent avec le microcontroleur via differents protocoles.
**I2C (Inter-Integrated Circuit)**
* 2 fils : SDA (donnees) + SCL (horloge) * Plusieurs peripheriques sur le meme bus * Chaque peripherique a une adresse unique * Vitesse : 100kHz (standard) a 3.4MHz (high-speed)
``` MCU Ecran Capteur RTC SDA ◄──────►─────────►─────────► SCL ────────────────────────────► ```
Adresses I2C courantes : - 0x3C ou 0x3D : OLED SSD1306 - 0x27 ou 0x3F : LCD avec adaptateur - 0x68 : MPU6050, DS3231
**SPI (Serial Peripheral Interface)**
* 4 fils : MOSI, MISO, SCK, CS * Plus rapide que I2C * Un fil CS par peripherique
``` MCU MOSI ──────► Peripherique 1 MISO ◄────── SCK ──────► CS1 ──────► CS2 ──────────────────► Peripherique 2 ```
**UART (Universal Asynchronous)**
* 2 fils : TX et RX * Point a point (1 a 1) * Pas d'horloge : vitesse (baud) predeterminee
``` MCU Peripherique TX ────────────► RX RX ◄──────────── TX ```
# Comparaison des protocoles de communication
protocols = {
"I2C": {
"fils": 2,
"noms_fils": ["SDA (donnees)", "SCL (horloge)"],
"vitesse": "100 kHz - 3.4 MHz",
"multi_device": True,
"max_devices": 127,
"distance": "~1 metre",
"avantages": ["Peu de fils", "Multi-peripheriques", "Adressage simple"],
"inconvenients": ["Plus lent que SPI", "Pull-ups necessaires"],
"usages": ["Capteurs", "EEPROM", "Ecrans OLED", "RTC"]
},
"SPI": {
"fils": 4,
"noms_fils": ["MOSI", "MISO", "SCK", "CS"],
"vitesse": "Jusqu'a 50 MHz",
"multi_device": True,
"max_devices": "Limite par CS",
"distance": "Quelques cm",
"avantages": ["Tres rapide", "Full duplex", "Simple"],
"inconvenients": ["Plus de fils", "Un CS par device"],
"usages": ["Ecrans TFT", "Cartes SD", "Flash", "ADC rapides"]
},
"UART": {
"fils": 2,
"noms_fils": ["TX", "RX"],
"vitesse": "9600 - 921600 baud",
"multi_device": False,
"max_devices": 1,
"distance": "Plusieurs metres",
"avantages": ["Simple", "Longue distance", "Standard"],
"inconvenients": ["Point a point", "Pas d'horloge"],
"usages": ["GPS", "Bluetooth", "Debug", "PC"]
}
}
print("=== COMPARAISON DES PROTOCOLES ===\n")
for nom, info in protocols.items():
print(f"\n{'='*50}")
print(f" {nom}")
print('='*50)
print(f"Fils: {info['fils']} ({', '.join(info['noms_fils'])})")
print(f"Vitesse: {info['vitesse']}")
print(f"Multi-device: {'Oui' if info['multi_device'] else 'Non'}")
print(f"Distance: {info['distance']}")
print(f"\nAvantages:")
for a in info['avantages']:
print(f" + {a}")
print(f"Inconvenients:")
for i in info['inconvenients']:
print(f" - {i}")
print(f"Usages: {', '.join(info['usages'])}")
# Guide de choix
print("\n" + "="*50)
print(" GUIDE DE CHOIX")
print("="*50)
print("""
Besoin de connecter plusieurs capteurs lents ?
-> I2C (simple, peu de fils)
Besoin de vitesse (ecran, SD card) ?
-> SPI (rapide mais plus de fils)
Communication avec PC ou module externe ?
-> UART (standard, longue distance)
""")Quiz de validation
1. Combien de fils utilise le protocole I2C ?
2. Quel protocole est le plus rapide pour communiquer avec un ecran ?
3. Comment fonctionne un clavier matriciel 4x4 avec seulement 8 fils ?
4. Quelle fonction Arduino permet de jouer une note sur un buzzer ?
5. Quelle est l'adresse I2C courante d'un ecran OLED SSD1306 ?
