Interfaces Materielles

Pour interagir avec l'utilisateur, nos systemes embarques ont besoin d'ecrans, de claviers et de boutons. Decouvrons comment connecter ces interfaces !

Difficulte:
35 min
+40 XP
Ecrans
Claviers
Audio
Protocoles

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 ```

Python / Arduino
# 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 ?

Pixel