- 
Trois ports (ports B, C et D) pour les E/S numériques.
 - Un port (port C) pour les entrées analogiques.
 - Les entrées et sorties numériques travaillent à GND ou VCC.
 - Les entrées analogiques sont mesurées entre 0 (GND) et 1024 (AREF).
 - Limite absolue de 40mA par sortie pour un total de 200mA.
 - Il est possible de configurer une résistance de tirage aux entrées :
 - Exemple d’utilisation d’une entrée et d’une sortie numériques :
 - Gestion des entrées-sorties numériques avec l’IDE Arduino :
const int LED=8;
const int BOUTON=9;
void setup(){
pinMode(LED,OUTPUT);          // Sortie pour la LED
pinMode(BOUTON,INPUT_PULLUP); // Entrée pour le bouton (résistance de tirage)
}
void loop(){
int etat=digitalRead(BOUTON); // Lecture de l'état du bouton
if(etat==HIGH) digitalWrite(LED,LOW); // LED éteinte
else digitalWrite(LED,HIGH);            // LED allumée
}
 - Gestion des entrées-sorties numériques avec avr-gcc :
#include <avr/io.h>
#define LED     8
#define BOUTON  9
int main(void){
DDRB |= 0x01;                // Sortie pour la LED
DDRB &= ~0x02;               // Entrée pour le bouton
PORTB |= 0x02;               // Configuration de la résistance de tirage
while(1){
  if(PINB & 0x02) PORTB &= ~0x01;      // LED éteinte
  else PORTB |= 0x01;                  // LED allumée
  }
}
 - Exemple d’utilisation d’une entrée analogique :
 - Gestion des entrées analogiques avec l’IDE Arduino :
const int LED_G=8;
const int LED_D=9;
const int LIGNE_G=A0;
const int LIGNE_M=A1;
const int LIGNE_D=A2;
const int LIMITE=128;
void setup(){
pinMode(LED_G,OUTPUT);
pinMode(LED_D,OUTPUT);
}
void loop(){
int lg=analogRead(LIGNE_G);             // Valeurs des détecteurs de ligne
int lm=analogRead(LIGNE_M);
int ld=analogRead(LIGNE_D);
if(lg<LIMITE) digitalWrite(LED_D,HIGH); // Ligne perdue à gauche, tourner à droite
if(ld<LIMITE) digitalWrite(LED_G,HIGH); // Ligne perdue à droite, tourner à gauche
if(lm<LIMITE){                          // Sur la ligne continuer tout droit 
  digitalWrite(LED_D,LOW);
  digitalWrite(LED_G,LOW);
  }
}
 - Gestion des entrées analogiques avec avr-gcc :
#include <avr/io.h>
void ad_init(unsigned char channel){    // Sélectionne un canal
ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // Division de fréquence 128 => 125KHz
ADCSRA &= ~(1<<ADFR);                       // Mode conversion unique
ADMUX |= (1<<REFS0)|(1<<ADLAR);             // Référence de mesure AVCC
ADMUX=(ADMUX&0xf0)|channel;             // Selection du canal   
ADCSRA|=(1<<ADEN);                      // Convertisseur activé
}
unsigned int ad_capture(void){          // Acquisition de tension
ADCSRA|=(1<<ADSC);                      // Début de conversion
while(bit_is_set(ADCSRA, ADSC));        // Attente de la fin de conversion
return ADCH;                            // Résultat sur 8 bits car ADLAR=1
}
int main(void){
DDRB |= 0x03;
int lg,lm,ld;
while(1){
  ad_init(0); lg=ad_capture();
  ad_init(1); lm=ad_capture();
  ad_init(2); ld=ad_capture();
  if(lg<LIMITE) PORTB |= 0x02; // Ligne perdue à gauche, tourner à droite
  if(ld<LIMITE) PORTB |= 0x01; // Ligne perdue à droite, tourner à gauche
  if(lm<LIMITE) PORTB &= ~0x03;  // Sur la ligne continuer tout droit
  }
}