-
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>
#define ADFR 5
#define LIMITE 64
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
}
}