Systèmes embarqués |
#include <avr/io.h> #include <util/delay.h> int main(void){ DDRB |= 0x01; while(1){ PORTB ^= 0x01; _delay_ms(500); } }
MULS r10,r11
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 }
#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 } }
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); } }
#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 } }
void setup(){ Serial.begin(9600); // configuration de la vitesse } void loop(){ while(1){ // il y a de l'écho if(Serial.available()){ // un octet disponible ? int c=Serial.read(); // lecture de l'octet reçu Serial.write(c); // envoi d'un octet } }
#include <avr/io.h> void serie_init(long int vitesse){ UBRR0=F_CPU/(((unsigned long int)vitesse)<<4)-1; // configure la vitesse UCSR0B=(1<<TXEN0 | 1<<RXEN0); // autorise l'envoi et la réception UCSR0C=(1<<UCSZ01 | 1<<UCSZ00); // 8 bits et 1 bit de stop UCSR0A &= ~(1 << U2X0); // double vitesse désactivée } void serie_envoyer(unsigned char c){ loop_until_bit_is_set(UCSR0A,UDRE0); UDR0=c; } unsigned char serie_recevoir(void){ loop_until_bit_is_set(UCSR0A, RXC0); return UDR0; } int main(void){ serie_init(9600); while(1){ unsigned char c=serie_recevoir(); serie_envoyer(c); } return 0; }
#include <SPI.h> void setup(void){ SPI.begin(); // Initialisation SPI SPI.setClockDivider(SPI_CLOCK_DIV8); // Horloge F_CPU/64 digitalWrite(SS,HIGH); // Désactive le périphérique } void loop(void){ digitalWrite(SS,LOW); for(i=0;i<64;i++) SPI.transfer(0xe0); digitalWrite(SS,HIGH); }
#include <avr/io.h> #define SPI_DDR DDRB #define SPI_PORT PORTB #define SPI_SS 2 #define SPI_MOSI 3 #define SPI_MISO 4 #define SPI_SCK 5 void spi_init(void){ // Initialisation du bus SPI SPI_DDR |= (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS); // Définition des sorties SPI_DDR &= ~(1<<SPI_MISO); // Définition de l'entrée SPI_PORT |= (1<<SPI_SS); // Désactivation du périphérique SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1); // Activation SPI (SPE) en état maître (MSTR) // horloge F_CPU/64 (SPR1=1,SPR0=0) } void spi_activer(void){ // Activer le périphérique SPI_PORT &= ~(1<<SPI_SS); // Ligne SS à l'état bas } void spi_desactiver(void){ // Désactiver le périphérique SPI_PORT |= (1<<SPI_SS); // Ligne SS à l'état haut } uint8_t spi_echange(uint8_t envoi){ // Communication sur le bus SPI SPDR = envoi; // Octet a envoyer while(!(SPSR & (1<<SPIF))); // Attente fin envoi (drapeau SPIF du statut) return SPDR; // Octet reçu } int main(void){ spi_init(); int i; spi_activer(); for(i=0;i<64;i++) spi_echange(0xe0); // Que de rouge spi_desactiver(); }
#define MATRICE_REG_LUMINE 0xE0 #define MATRICE_SYSTEME 0x20 #define MATRICE_AFFICHAGE 0x80 #define MATRICE_ADR_I2C 0x70 void luminosite(uint8_t adr_i2c,uint8_t lum){ if(lum>15) lum=15; Wire.beginTransmission(adr_i2c); Wire.write(MATRICE_REG_LUMINE|lum); Wire.endTransmission(); } void matrice_init(uint8_t adr_i2c){ Wire.begin(); Wire.setClock(400000UL); Wire.beginTransmission(adr_i2c); Wire.write(MATRICE_SYSTEME|1); // Démarre l'horloge Wire.endTransmission(); Wire.beginTransmission(adr_i2c); Wire.write(MATRICE_AFFICHAGE|1); // Alimente les LED } void matrice_afficher(uint8_t adr_i2c,uint8_t image[8]){ Wire.beginTransmission(i2c_addr); Wire.write((uint8_t)0x00); // Adresse de départ for(uint8_t i=0;i<8;i++){ Wire.write(image[i]); Wire.write(0); } Wire.endTransmission(); }
#include <avr/io.h> #define ERROR 0 #define SUCCESS 1 #define IIC_START 0x08 #define IIC_RESTART 0x10 #define IIC_WADDR_ACK 0x18 #define IIC_WDATA_ACK 0x28 #define IIC_RADDR_ACK 0x40 #define IIC_RDATA_ACK 0x50 #define IIC_RDATA_NACK 0x58 #define SCL_CLOCK 400000L // En Hertz void i2c_init(void){ TWSR=0; // Pas de multiplicateur d'horloge TWBR=((F_CPU/SCL_CLOCK)-16)/2; // Fréquence de l'horloge i2c TWCR=(1<<TWEN); // Activation de l'i2c matériel } static void i2c_start(void){ // Envoi d'un start TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while((TWCR & (1<<TWINT))==0); // Attente de fin d'envoi } static void i2c_stop(void){ // Envoi d'un stop TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN); } static uint8_t i2c_statut(void){ // Etat de la dernière transmission return (TWSR & 0xF8); } void i2c_ecrire(uint8_t octet){ // Envoi d'un octet sur le bus i2c TWDR=octet; // Ecriture de l'octet à envoyer TWCR=(1<<TWINT)|(1<<TWEN); while((TWCR & (1<<TWINT))==0); // Attente de fin d'envoi } uint8_t i2c_lire_ack(void){ // Lecture d'un octet sur i2c avec accusé positif TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA); while((TWCR & (1<<TWINT))==0); return TWDR; } uint8_t i2c_lire_nack(void){ // Lecture d'un octet sur i2c avec accusé négatif TWCR=(1<<TWINT)|(1<<TWEN); while((TWCR & (1<<TWINT))==0); return TWDR; } uint8_t i2c_ecrire_registre(uint8_t adr_i2c,uint8_t reg_val,unsigned char stop){ // Modification de la valeur d'un registre int statut; i2c_start(); statut=i2c_statut(); if(status!=IIC_START && status!=IIC_RESTART) return ERROR; i2c_ecrire(adr_i2c<<1); statut=i2c_statut(); if(status!=IIC_WADDR_ACK) return ERROR; i2c_ecrire(reg_val); statut=i2c_statut(); if(status!=IIC_WDATA_ACK) return ERROR; if(stop) i2c_stop(); return SUCCESS; } uint8_t i2c_ecrire_donnee(uint8_t adr_i2c,uint8_t adresse,uint8_t donnee){ // Ecriture dans la mémoire de l'esclave int statut; i2c_start(); statut=i2c_statut(); if(status!=IIC_START && status!=IIC_RESTART) return ERROR; i2c_ecrire(adr_i2c<<1); statut=i2c_statut(); if(status!=IIC_WADDR_ACK) return ERROR; i2c_ecrire(reg_val); statut=i2c_statut(); if(status!=IIC_WDATA_ACK) return ERROR; i2c_ecrire(donnee); statut=i2c_statut(); if(status!=IIC_WDATA_ACK) return ERROR; TWI_stop(); return SUCCESS; } #define MATRICE_REG_LUMINE 0xE0 #define MATRICE_SYSTEME 0x20 #define MATRICE_AFFICHAGE 0x80 #define MATRICE_ADR_I2C 0x70 int matrice_afficher(uint8_t image[8]){ int dim=0x01; // Ecriture de quelques registres de la matrice i2c_ecrire_registre(MATRICE_ADR_I2C,MATRICE_SYSTEME|1,1); i2c_ecrire_registre(MATRICE_ADR_I2C,MATRICE_REG_LUMINE|dim,1); i2c_ecrire_registre(MATRICE_ADR_I2C,MATRICE_AFFICHAGE|1,1); int i; // Envoi de chaque ligne for(i=0;i<8;i++) i2c_ecrire_donnee(MATRICE_ADR_I2C,2*i,image[i]); return 0; }
const byte LED=8; const byte INT=3; int etat=LOW; void clignote(){ // Procédure d'interruption etat=(etat==LOW)?HIGH:LOW; digitalWrite(LED,etat); } void setup(){ pinMode(LED,OUTPUT); // Sortie pour la LED pinMode(INT,INPUT); // Entrée pour le détecteur infrarouge attachInterrupt(digitalPinToInterrupt(INT),clignote,CHANGE); } void loop(){} // Rien dans la boucle principale
#include <avr/io.h> #include <avr/interrupt.h> #define INT_BAS 0 #define INT_CHANGE 1 #define INT_DESCENTE 2 #define INT_MONTEE 3 void interruption_init // Initialisation d'interruption (uint8_t num,uint8_t mode){ uint8_t isc0=0,isc1=0; switch(mode){ case INT_BAS: // Interruption sur niveau bas isc0=0; isc1=0; break; case INT_CHANGE: // Interruption sur changement d'état isc0=1; isc1=0; break; case INT_DESCENTE: // Interruption sur front descendant isc0=0; isc1=1; break; case INT_MONTEE: // Interruption sur front montant isc0=1; isc1=1; break; } if(num==0){ // Configuration pour INT0 EICRA |= (isc1<<ISC01)|(isc0<<ISC00); EIMSK |= (1<<INT0); } if(num==1){ // Configuration pour INT1 EICRA |= (isc1<<ISC11)|(isc0<<ISC10); EIMSK |= (1<<INT1); } } ISR(INT1_vect){ // Procédure d'interruption PORTB ^= 0x01; } int main(void){ DDRB |= 0x01; DDRD &= ~0x08; interruption_init(1,INT_CHANGE); sei(); // Autorisation des interruptions while(1); return 0; }
#include <avr/io.h> #include <avr/interrupt.h> #define CTC1 WGM12 // Meilleur nom pour le bit #define PERIODE 1000 void init_minuteur(int diviseur,long periode){ TCCR1A=0; // Le mode choisi n'utilise pas ce registre TCCR1B=(1<<CTC1); // Réinitialisation du minuteur sur expiration switch(diviseur){ case 8: TCCR1B |= (1<<CS11); break; case 64: TCCR1B |= (1<<CS11 | 11<<CS10); break; case 256: TCCR1B |= (1<<CS12); break; case 1024: TCCR1B |= (1<<CS12 | 1<<CS10); break; } // Un cycle prend 1/F_CPU secondes. // Un pas de compteur prend diviseur/F_CPU secondes. // Pour une periode en millisecondes, il faut (periode/1000)/(diviseur/F_CPU) pas // soit (periode*F_CPU)/(1000*diviseur) OCR1A=F_CPU/1000*periode/diviseur; // Calcul du pas TCNT1=0; // Compteur initialisé TIMSK1=(1<<OCIE1A); // Comparaison du compteur avec OCR1A } ISR(TIMER1_COMPA_vect){ // Procédure d'interruption int led=(PORTB&0x0f); led >>= 1; if(led==0) led=0x08; PORTB &= 0xf0; PORTB |= led; } int main(void){ DDRB |= 0x0f; // Chenillard sur 4 LED PORTB &= ~0x0f; // LED éteintes init_minuteur(256,PERIODE); sei(); while(1); }
# apt install gcc-avr avr-libc avrdude
$ avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -c -Wall -I. -Os programme.c -o programme.o $ avr-gcc -mmcu=atmega328p -g -lm -Wl,--gc-sections -o interrupts.elf interrupts.o
$ avr-objcopy -j .text -j .data -O ihex programme.elf programme.hex $ stty -F /dev/ttyACM0 hupcl $ avrdude -F -v -p atmega328p -c stk500v1 -b 115200 -P /dev/ttyACM0 -U flash:w:programme.hex
#include <avr/io.h> void ad_init(unsigned char channel){ ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // Résolution maximale ADCSRB = (((channel&0x20)==0?0:1)<<MUX5); // Sélection du canal ADMUX = channel&0x1f; ADMUX |= (0<<REFS1) | (1<<REFS0); // Référence de mesure AVCC ADMUX |= (1<<ADLAR); // Alignement gauche de la valeur ADCSRA |= (1<<ADEN); // Convertisseur activé } unsigned int ad_capture(void){ ADCSRA |= (1<<ADSC); // Début de conversion while(ADCSRA & (1<<ADSC)); // Attente de la fin de conversion return ADCH; // Un seul octet retourné }
#include <avr/io.h> #include <util/delay.h> #define DTH_ERR_TIMEOUT -1 #define DTH_ERR_CHECKSUM -2 typedef struct{ int temperature; int humidity ; } dht_values; #define DTH_DDR DDRD #define DTH_PORT PORTD #define DTH_PIN PIND #define DTH_IO 7 #define DTH_ANSWER_SIZE 40 #define DTH_TIMEOUT (F_CPU/40000) // 2,5 ms #define DTH_WAIT_LOW_MS 20 #define DTH_WAIT_HIGH_US 40 #define DTH_LOOP_CYCLES 2 #define DTH_HIGH_DELAY_US 40 static void dht_trigger(void){ uint8_t mask=(1<<DTH_IO); DTH_DDR |= mask; DTH_PORT &= ~mask; _delay_ms(DTH_WAIT_LOW_MS); DTH_PORT |= mask; _delay_us(DTH_WAIT_HIGH_US); DTH_DDR &= ~mask; } int dht_get(dht_values *values){ uint8_t bits[DTH_ANSWER_SIZE/8]; int i,l; dht_trigger(); // Trigger answer uint8_t mask=(1<<DTH_IO); // Check acknowledgment for(l=DTH_TIMEOUT;l>=0 && (DTH_PIN&mask)==0;l--); if(l<0) return DTH_ERR_TIMEOUT; for(l=DTH_TIMEOUT;l>=0 && (DTH_PIN&mask)!=0;l--); if(l<0) return DTH_ERR_TIMEOUT; for(i=0;i<DTH_ANSWER_SIZE;i++){ // Read values if(i%8==0) bits[i/8]=0; for(l=DTH_TIMEOUT;l>=0 && (DTH_PIN&mask)==0;l--); if(l<0) return DTH_ERR_TIMEOUT; for(l=DTH_TIMEOUT;l>=0 && (DTH_PIN&mask)!=0;l--); if(l<0) return DTH_ERR_TIMEOUT; uint32_t time=l*DTH_LOOP_CYCLES/(F_CPU/1000000L); bits[i/8] <<= 1; if(time<DTH_HIGH_DELAY_US) bits[i/8] |= 0x01; } uint8_t sum=bits[0]+bits[2]; // Verify checksum if(sum!=bits[4]) return DTH_ERR_CHECKSUM; values->humidity=bits[0]; // Convert values values->temperature=bits[2]; return 0; }
const int LED=13; const int trigger=2; const int echo=3; void setup(){ pinMode(trigger,OUTPUT); // Broche pour activer la mesure (sortie) pinMode(echo,INPUT); // Broche pour lire la valeur (entrée) pinMode(LED,OUTPUT); } void loop(){ digitalWrite(trigger,LOW); delayMicroseconds(5); // Activer digitalWrite(trigger,HIGH); delayMicroseconds(10); digitalWrite(trigger,LOW); long duree=pulseIn(echo,HIGH); // Mesurer long distance=(duree/2)/29.1; if(distance<20) digitalWrite(LED,HIGH); // Réagir else digitalWrite(LED,LOW); delay(500); }
#include <avr/io.h> #include <util/delay.h> #define US_DDR DDRD #define US_PORT PORTD #define US_PIN PIND #define US_TRIGGER 2 #define US_ECHO 3 void sonar_init(void){ // Initialiser le sonar US_DDR |= (1<<US_TRIGGER); // Broche pour activer la mesure (sortie) US_DDR &= ~(1<<US_ECHO); // Broche pour lire la valeur (entrée) } uint32_t sonar_mesure(void){ // Mesurer une distance uint8_t statut=0; uint32_t temps=0; _delay_us(2); US_PORT |= (1<<US_TRIGGER); // Activer _delay_us(10); US_PORT &= ~(1 << US_TRIGGER); while(!statut){ while(US_PIN&(1<<US_ECHO)){ // Mesure la durée du signal haut temps++; statut=1; } } return disTime * 0.00862; // Conversion en cm }
const int LED=8; void setup(void){ for(int i=0;i<4;i++) pinMode(LED+i,OUTPUT); for(int i=0;i<4;i++) analogWrite(LED+i,(100-25*i)*255/100); } void loop(void){ }
#include <avr/io.h> #define PWM_DDR DDRD #define PWM_PORT PORTD #define PWM1 5 #define PWM2 6 void PWM_init(void){ // Initialisation de la PWM PWM_DDR |= (1<<PWM1)|(1<<PWM2); // Les ports PWM sont des sorties TCCR0A |= (1<<COM0A1)|(1<<COM0B1); // Les ports PWM se comportent normalement TCCR0A |= (1<<WGM01)|(1<<WGM00); // Minuteur mis en mode PWM TCCR0B |= (1<<CS00); // Pas de pré-diviseur, démarre le compteur } int main(void){ PWM_init(); int pwm=0; while(1){ pwm++; if(pwm>100) pwm=0; OCR0A=pwm*255/100; // PWM pour le port 5 (ramenée à 255) OCR0B=(100-pwm)*255/100; // PWM pour le port 6 (ramenée à 255) _delay_ms(10); } return 0; }
#include <Servo.h> const int SERVO=3; Servo myservo; // Objet servo void setup(){ myservo.attach(SERVO); // Définit la broche du servo-moteur } void loop(){ for(pos=0;pos<=180;pos += 1){ myservo.write(pos); // Impose la position (en degrés) au servo delay(15); } for(pos=180;pos>=0;pos -= 1){ myservo.write(pos); delay(15); } }
#include <avr/io.h> #include <util/delay.h> void servos_init(void){ DDRD |= 0x08; // La broche 3 du port D est controlée par le minuteur 2 DDRB |= 0x08; // La broche 3 du port B est controlée par le minuteur 2 TCCR2A=(1<<COM2A1)|(1<<COM2B1); // COM2A et COM2B à 10 pour signaux normaux TCCR2A |= (1<<WGM21) | (1<<WGM20); // WGM2 à 011 pour mode "fast PWM" TCCR2B = (1<<CS21) | (1<<CS22); // CS2 à 110 pour un pré-diviseur de 256 // Une unité de OCR2A et OCR2B représente donc 256/16000000*1000*1000=16 us // Pour un plateau de 1ms il faut alors 62 unités // Pour un plateau de 2ms il faut alors 125 unités } int main(void){ int a; for(a=0;a<180;a++){ OCR2A=62+a*63/180; _delay_ms(10); } for(a=180;a>0;a--){ OCR2A=62+a*63/180; _delay_ms(10); } }
const int STANDBY=6; const int PWMA=3; const int AIN1=5; const int AIN2=4; const int PWMB=11; const int BIN1=7; const int BIN2=8; const int broches[]={STANDBY,PWMA,AIN1,AIN2,PWMB,BIN1,BIN2,-1}; void setup(void){ int i=0; while(broches[i]>0) pinMode(broches[i++],OUTPUT); digitalWrite(STANDBY,HIGH); // Activation du contrôleur digitalWrite(AIN1,HIGH); // Les moteurs dans le même sens digitalWrite(AIN2,LOW); digitalWrite(BIN1,HIGH); digitalWrite(BIN2,LOW); analogWrite(PWMA,128); // Vitesse modérée analogWrite(PWMB,128); } void loop(void){ }
const int DIR=2; const int STEP=3; const int CYCLE=200; void setup(void){ pinMode(DIR,OUTPUT); pinMode(STEP,OUTPUT); } void loop(void){ digitalWrite(DIR,HIGH); for(int pas=0;pas<CYCLE;pas++){ digitalWrite(STEP,HIGH); delayMicroseconds(2000); digitalWrite(STEP,LOW); delayMicroseconds(2000); } delay(1000); }
#include <Servo.h> #include "IRLibAll.h" #define PIN_TRIG A4 #define PIN_ECHO A3 #define PIN_IR 2 IRrecvPCI myReceiver(PIN_IR); IRdecode myDecoder; #define PIN_MOT1 11 #define PIN_MOT2 5 #define CENTER_MOT1 88 #define CENTER_MOT2 89 #define FACTOR_MOT1 1 #define FACTOR_MOT2 1 Servo motor1; Servo motor2; int speed = 80; int dir = -1; long mesureDistance(void){ digitalWrite(PIN_TRIG,LOW); delayMicroseconds(2); digitalWrite(PIN_TRIG,HIGH); delayMicroseconds(10); digitalWrite(PIN_TRIG,LOW); long duration_hc=pulseIn(PIN_ECHO,HIGH); long distance_hc=duration_hc/58; return distance_hc; } void setup(void){ pinMode(PIN_TRIG,OUTPUT); pinMode(PIN_ECHO,INPUT); myReceiver.enableIRIn(); motor1.attach(PIN_MOT1); motor2.attach(PIN_MOT2); motor1.write(CENTER_MOT1); motor2.write(CENTER_MOT2); } void loop(void){ if(myReceiver.getResults()){ myDecoder.decode(); int value=myDecoder.value&0xff; if(value==2 || value==4 || value==5 || value==6 || value==8) dir=value; switch(value){ case 0x11 : if(speed>0) speed -= 5; break; case 0x10 : if(speed<90) speed += 5; break; } delay(50); myReceiver.enableIRIn(); } long distance=mesureDistance(); if(distance<20 && dir==2) dir=5; switch(dir){ case 2 : motor1.write(CENTER_MOT1+speed*FACTOR_MOT1); motor2.write(CENTER_MOT2-speed*FACTOR_MOT2); break; case 4 : motor1.write(CENTER_MOT1-speed/6*FACTOR_MOT1); motor2.write(CENTER_MOT2-speed/6*FACTOR_MOT2); break; case 5 : motor1.write(CENTER_MOT1); motor2.write(CENTER_MOT2); break; case 6 : motor1.write(CENTER_MOT1+speed/6*FACTOR_MOT1); motor2.write(CENTER_MOT2+speed/6*FACTOR_MOT2); break; case 8 : motor1.write(CENTER_MOT1-speed); motor2.write(CENTER_MOT2+speed); break; } delay(10); }
sorties=['B4','A15','A14','A13'] leds=[] for (i,sortie) in enumerate(sorties): leds.append(machine.Pin(sortie,machine.Pin.OUT)) while True: for led in leds: led.value(1) time.sleep_ms(500) led.value(0)
leds=[] for i in range(0,4): leds.append(pyb.LED(i+1)) while True: for led in leds: led.on() pyb.delay(500) led.off()
b=machine.Pin('B3',machine.Pin.IN,machine.Pin.PULL_UP) l=machine.Pin('B4',machine.Pin.OUT) while True: if(b.value()==0) l.value(1) else l.value(0)
b=pyb.Switch() l=pyb.LED(1) while True: if(b()==1): l.on() else: l.off()
b=pyb.Switch() l=pyb.LED(1) b.callback(lambda: l.toogle())
s=machine.UART(1,9600) s.init(9600,bits=8,parity=None,stop=1) while True: if s.any()>=0: c=s.read(1) s.write(c)
ACCEL_ADDR=0x4c ACCEL_AXIS_X_REG=0x00 ACCEL_AXIS_Y_REG=0x01 ACCEL_AXIS_Z_REG=0x02 ACCEL_MODE_REG=0x07 i2c=machine.I2C(scl=machine.Pin('B6'),sda=machine.Pin('B7')) alim=machine.Pin('B5',machine.Pin.OUT) alim.value(1) i2c.writeto_mem(ACCEL_ADDR,ACCEL_MODE_REG,bytes([1])) while True: x=i2c.readfrom_mem(ACCEL_ADDR,ACCEL_AXIS_X_REG,1) y=i2c.readfrom_mem(ACCEL_ADDR,ACCEL_AXIS_Y_REG,1) z=i2c.readfrom_mem(ACCEL_ADDR,ACCEL_AXIS_Z_REG,1) print(x,y,z) time.sleep_ms(1000)
accel=pyb.Accel() while True: x=accel.x() y=accel.y() z=accel.z() print(x,y,z) pyb.delay(1000)
import microbit while True: if microbit.pin11.read_digital()==0: microbit.pin8.write_digital(1) else: microbit.pin8.write_digital(0) if microbit.pin5.read_digital()==0: microbit.pin12.write_digital(1) else: microbit.pin12.write_digital(0) microbit.sleep(100)
import microbit I2C_MOTORS_ADDR=0x10 MOTOR_A=0 MOTOR_B=2 def moteurs(sensA,puissA,sensB,puissB): microbit.i2c.write(I2C_MOTORS_ADDR,bytes([MOTOR_A,sensA,puissA])) microbit.i2c.write(I2C_MOTORS_ADDR,bytes([MOTOR_B,sensB,puissB])) def moteurs_init(): microbit.i2c.init() moteurs_init() while True: moteurs(0,128,0,128) microbit.sleep(2000) moteurs(1,64,0,64) microbit.sleep(1000)
import microbit import machine import time def ultrason(): # Envoi d'un plateau de 10 us microbit.pin1.write_digital(1) time.sleep_us(10) microbit.pin1.write_digital(0) # Lecture de la taille du plateau en retour t=machine.time_pulse_us(microbit.pin2,1) # Calcul temps vers distance d=340*t/20000 return d def ultrason_init(): microbit.pin1.write_digital(0) microbit.pin2.read_digital() moteurs_init() ultrason_init() while True: if ultrason()<=20: moteurs(0,128,0,128) else: moteurs(1,64,0,64)
import neopixel def pixels_init(): global pixels pixels=neopixel.NeoPixel(microbit.pin15,4) def pixels_couleurs(c1=(0,0,0),c2=(0,0,0),c3=(0,0,0),c4=(0,0,0)): global pixels pixels[0]=c1 pixels[1]=c2 pixels[2]=c3 pixels[3]=c4 pixels.show()
import microbit PCA9685_ADDR=0x43 PCA9685_FREQ=60 def PCA9685_init(): microbit.i2c.init() microbit.i2c.write(PCA9685_ADDR,bytes([0x00,0x10])) prescale=int(25000000.0/4096.0/PCA9685_FREQ+0.5) microbit.i2c.write(PCA9685_ADDR,bytes([0xfe,prescale])) microbit.i2c.write(PCA9685_ADDR,bytes([0x00,0xa0])) def PCA9685(canal,taux): adresse=0x06+4*canal on_l=0x00 on_h=0x00 off_l=0x00 off_h=0x00 if taux==0: off_h=0x10 if taux==100: on_h=0x10 if taux>0 and taux<100: arret=taux*40 off_l=arret&0x00ff off_h=arret>>8 microbit.i2c.write(PCA9685_ADDR,bytes([adresse,on_l,on_h,off_l,off_h])) def PCA9685_LED(r,g,b): PCA9685(4,100-b) PCA9685(5,100-g) PCA9685(6,100-r) def PCA9685_moteurs(sensA,puissA,sensB,puissB): PCA9685(0,0) if sensA==0 else PCA9685(0,100) PCA9685(2,0) if sensA==0 else PCA9685(2,100) PCA9685(1,puissA) PCA9685(3,puissB) PCA9685_init() PCA9685_LED(0,0,100) PCA9685_moteurs(0,50,0,50)
Ce document a été traduit de LATEX par HEVEA