« SE3Binome2023-4 » : différence entre les versions
Ligne 75 : | Ligne 75 : | ||
Nous avons ensuite implémenté un programme afin de faire tourner les moteurs mais celui-ci n'a pas pu être testé à cause de l’absence de détection du mode DFU. | Nous avons ensuite implémenté un programme afin de faire tourner les moteurs mais celui-ci n'a pas pu être testé à cause de l’absence de détection du mode DFU. | ||
1 | |||
2 | |||
3 | |||
4 | |||
5 | |||
6 | |||
7 | |||
8 | |||
9 | |||
10 | |||
11 | |||
12 | |||
13 | |||
14 | |||
15 | |||
16 | |||
17 | |||
18 | |||
19 | |||
20 | |||
21 | |||
22 | |||
23 | |||
24 | |||
25 | |||
26 | |||
27 | |||
28 | |||
29 | |||
30 | |||
31 | |||
32 | |||
33 | |||
34 | |||
35 | |||
36 | |||
37 | |||
38 | |||
39 | |||
40 | |||
41 | |||
42 | |||
43 | |||
44 | |||
45 | |||
46 | |||
47 | |||
48 | |||
49 | |||
50 | |||
51 | |||
52 | |||
53 | |||
54 | |||
55 | |||
56 | |||
57 | |||
58 | |||
59 | |||
60 | |||
61 | |||
62 | |||
63 | |||
64 | |||
65 | |||
66 | |||
67 | |||
68 | |||
69 | |||
70 | |||
#include <avr/io.h> | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <util/delay.h> | |||
#define PWM_DDRD DDRD | |||
#define PWM_PORD PORTD | |||
#define PWM1 1 | |||
#define PWM2 0 | |||
#define AIN1 5 | |||
#define AIN2 4 | |||
#define BIN1 1 | |||
#define BIN2 0 | |||
#define JTD 7 //cf ds p82 atmega8u2 | |||
void configuration(){ | |||
MCUCR |= (1<<JTD); | |||
MCUCR |= (1<<JTD); | |||
//leds et moteurs | |||
DDRB |= 0x80; //D2 sur PB7 | |||
DDRC |= 0x80; //D4 sur PC7 | |||
DDRD |= 0x04; //D3 sur PD2 | |||
DDRE |= 0x40; //D5 sur PE6 | |||
DDRF |= 0x80; //D1 sur PF7 | |||
} | |||
void test_leds(){ | |||
PORTB ^= 0x80; //D2 | |||
PORTC ^= 0x40; //D4 | |||
PORTD ^= 0x04; //D3 | |||
PORTE ^= 0x40; //D5 | |||
PORTF ^= 0x80; //D1 | |||
_delay_ms(1000); //tps en ms | |||
} | |||
void PWM_init(void){ // Initialisation de la PWM | |||
PWM_DDRD |= (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(){ | |||
configuration(); | |||
CLKSEL0 = 0b00010101; // sélection de l'horloge externe | |||
CLKSEL1 = 0b00001111; // minimum de 8Mhz | |||
CLKPR = 0b10000000; // modification du diviseur d'horloge (CLKPCE=1) | |||
CLKPR = 0; // 0 pour pas de diviseur (diviseur de 1) | |||
PWM_init(); | |||
int pwm=0; | |||
PWM_DDRD |= (1<<AIN1)|(1<<AIN2); | |||
PWM_PORD |= (1<<AIN1)|(0<<AIN2); | |||
PWM_DDRD |= (1<<BIN1)|(1<<BIN2); | |||
PWM_PORD |= (0<<BIN1)|(1<<BIN2); | |||
while(1){ | |||
test_leds(); | |||
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; | |||
} |
Version du 7 juin 2024 à 14:11
Sujet : voiture commandée par USB
Cahier des Charges
Le projet consiste à concevoir une voiture autonome en terme d'énergie, avec l'utilisation d'une batterie au lithium ainsi que la mise en place d'une alimentation intégrée sur la carte.
Cette voiture sera équipée de deux moteurs continus de petite taille (2 cm) situés au niveau des roues avant. Cette configuration présente plusieurs avantages, notamment la réduction des contraintes mécaniques grâce à l'utilisation d'un pont en H et l'inversion des sens de rotation des roues. De plus, cela permet de diminuer le poids de la voiture, ce qui se traduit par moins de contraintes sur la taille de la carte électronique.
Le système comprendra également quatre leds de surface, dont deux seront placées à l'avant et deux à l'arrière de la voiture. Ces leds serviront à indiquer le sens de déplacement de la voiture, par exemple en allumant la led gauche avant pour tourner à gauche en avançant.
L'utilisateur pourra choisir le programme de déplacement de la voiture grâce à un logiciel implanté sur un ordinateur, qui sera ensuite transféré sur la carte via le port USB.
Concernant la carte électronique, elle sera équipée d'un microcontrôleur ATmega16u4 ou ATmega32u4 (différence en fonction de l'espace dédié à la flash).
Optimisation : detecteur d'obstacles.
Lien GIT
https://archives.plil.fr/sdeparis/projet_voiture_sd_ah.git
Partie électronique
Schématique Kicad
Routage
On place des vias afin d'uniformiser le plan de masse.
Vue 3D
Soudure
On doit ensuite souder les moteurs à l'avant de la voiture. Problème : après avoir soudé le premier moteur, la carte n'est plus reconnue en mode DFU. Par conséquent, il est inutile de souder le deuxième moteur et le détecteur d'obstacle. Il faudrait recommencer une carte mais nous manquons maintenant de temps pour souder à nouveau tous les composants sur une nouvelle carte. Nous avons donc préféré avancer sur le projet de la manette.
Partie programmation
Programmation des leds
Le programme ci-dessous nous permet de faire clignoter les leds de la voiture.
Programmation des moteurs
Nous avons ensuite implémenté un programme afin de faire tourner les moteurs mais celui-ci n'a pas pu être testé à cause de l’absence de détection du mode DFU.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
- include <avr/io.h>
- include <stdio.h>
- include <stdlib.h>
- include <util/delay.h>
- define PWM_DDRD DDRD
- define PWM_PORD PORTD
- define PWM1 1
- define PWM2 0
- define AIN1 5
- define AIN2 4
- define BIN1 1
- define BIN2 0
- define JTD 7 //cf ds p82 atmega8u2
void configuration(){
MCUCR |= (1<<JTD); MCUCR |= (1<<JTD); //leds et moteurs DDRB |= 0x80; //D2 sur PB7 DDRC |= 0x80; //D4 sur PC7 DDRD |= 0x04; //D3 sur PD2 DDRE |= 0x40; //D5 sur PE6 DDRF |= 0x80; //D1 sur PF7
}
void test_leds(){
PORTB ^= 0x80; //D2 PORTC ^= 0x40; //D4 PORTD ^= 0x04; //D3 PORTE ^= 0x40; //D5 PORTF ^= 0x80; //D1 _delay_ms(1000); //tps en ms
}
void PWM_init(void){ // Initialisation de la PWM
PWM_DDRD |= (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(){
configuration(); CLKSEL0 = 0b00010101; // sélection de l'horloge externe CLKSEL1 = 0b00001111; // minimum de 8Mhz CLKPR = 0b10000000; // modification du diviseur d'horloge (CLKPCE=1) CLKPR = 0; // 0 pour pas de diviseur (diviseur de 1) PWM_init(); int pwm=0; PWM_DDRD |= (1<<AIN1)|(1<<AIN2); PWM_PORD |= (1<<AIN1)|(0<<AIN2); PWM_DDRD |= (1<<BIN1)|(1<<BIN2); PWM_PORD |= (0<<BIN1)|(1<<BIN2);
while(1){ test_leds(); 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;
}