SE3Binome2023-3

De projets-se.plil.fr
Aller à la navigation Aller à la recherche

Voiture VigiCar

Notre projet est une voiture commandée par USB. Lorsqu'elle détecte un obstacle, elle s'arrête et déclenche un signal d'alerte (Warning). Quand l'obstacle est enlevé, elle continue son chemin.

L'utilisateur peut donner différentes instructions : avancer, reculer, s’arrêter pendant une durée définie, ou exécuter une instruction tant qu'aucun obstacle n'est détecté.

Limitations et fonctionnalités

  • Taille de la carte : 10x10 cm maximum
  • Éclairage :
    • 4 LEDs oranges à l'avant et à l'arrière pour les feux de warning
    • 2 LEDs jaunes à l'avant pour les phares avant
    • 2 LEDs blanches à l'arrière pour les feux de recul
    • 2 LEDs rouges à l'arrière pour les feux stop
  • Programmation : Par USB
  • Gestion de l’énergie : Par batterie LiPo
  • Détection d'obstacles : Capteur de proximité placé à l'avant

Matériel

Composants.png
  • Batterie LiPo
  • Puce de contrôle MAX1811
  • 4 LEDs oranges
  • 2 LEDs jaunes (qui ressortent oranges au final)
  • 2 LEDs blanches
  • 2 LEDs rouges
  • 2 Mini moteurs continus & Pilotes des moteurs
  • Capteur de proximité
  • Port USB







Déroulé du Projet

Séance du 5 Mars 2024

Nous avons choisi d'intégrer un capteur de proximité à notre voiture pour améliorer sa réactivité aux obstacles. Pour assurer une autonomie adéquate, nous utiliserons une alimentation par batterie. De plus, la voiture sera capable d'exécuter divers programmes prédéfinis, lui permettant de naviguer de manière autonome tout en répondant aux commandes de l'utilisateur.

Séance du 12 Mars 2024

Nous avons finalisé le choix des composants et commencé la conception du schéma électrique de notre PCB. Cependant, le problème qu'il pourrait y avoir en mettant les LEDs en série comme nous l'avons fait est qu'elle ne seront pas alimentées correctement. Nous allons donc les mettre en parallèle afin de résoudre cette complication. Dans tout les cas, cela ne posera pas de problème pour la programmation des LEDs.

Schematics1.pdf

Séance du 19 Mars 2024

Le schéma électrique est terminé. Nous avons corrigé le layout du PCB en respectant les contraintes de taille, le problème d'alimentation des LEDs, et nous avons rajouté les éléments manquants tels que l'alimentation et le contrôleur moteur.

SE3-pad.pdf

SE3-pad-Alim + gestion moteur.pdf

Mypcb.png

Myvue3d.png

Séance du 2 Avril 2024

Création de notre archive GIT pour la gestion des versions et le suivi du projet.

Séance du 7 Mai 2024

Soudure part 1.jpg





Nous avons reçu notre PCB. Nous commençons à souder les composants (ATmega16u4, Quartz, Port USB, ISP, etc.). L'ATmega16u4 a déjà un Bootloader préinstallé.





Séance du 14 Mai 2024

Nous avons continué les soudures, en particulier le contrôleur de moteur. Il reste maintenant à le tester.

Séance du 21 Mai 2024

Lors de la séance précédente, nous avions fini de souder le contrôleur de moteur. Nous soudons un des moteurs à l'aide de fils que nous replierons sur eux-mêmes à la fin. Pour tester le moteur, nous écrivons un programme.

Dans un premier temps, nous écrivons un programme qui consiste seulement à faire tourner le moteur :

Code1.png






Ensuite, nous cherchons à manipuler la vitesse de rotation du moteur. Nous écrivons un programme permettant d'augmenter progressivement la vitesse de ce dernier :

Code2.png

Séance du 28 Mai 2024

Lors de cette séance, nous nous sommes séparés pour, d'une part, réparer les problèmes de soudure des LEDs, souder le capteur de proximité et d'autre part, préparer un code pour manipuler les LEDs et vérifier leur fonctionnement.

Concernant la soudure du capteur de proximité, nous avons opté pour du "bricolage". En effet, le capteur devant être monté à la verticale, il faut relier les PINs du dessus à la carte. Pour cela nous utiliserons des fils.

Capteur off.png
Datasheet proxi.png

A la première tentative, le capteur ne fonctionnait pas, nous avons donc cherché la cause de ce problème (test de la camera, mesure de la tension dans les PINs, etc.). En regardant la datasheet du capteur nous voyons que le capteur ne supporte une température de 260°C que pendant 10 secondes. Nous l'avions donc bien rendu inutilisable. Nous testons un nouveau capteur avant toute soudure. Nous le mettons en place sur la carte:

Capteur is on.jpg

Nous avons donc ressoudé un autre capteur en faisant plus attention. Reste maintenant à le programmer. Voici une première version de notre code :

#include <util/delay.h>
#include <avr/io.h>

#define PWM_DDRB         DDRB
#define PWM_PORTB        PORTB
#define PWM_DDRD         DDRD
#define PWM_PORTD        PORTD
#define CAPTEUR         5
#define AIN1            6
#define AIN2            5
#define BIN1            1
#define BIN2            2
#define PWM1            7
#define PWM2            0

#define LED_G1 PF0
#define LED_G2 PF4
#define LED_D1 PC6
#define LED_D2 PD4
#define LED_STOP_G PF6
#define LED_STOP_D PD5
#define LED_PHARES_G PF1
#define LED_PHARES_D PC7
#define LED_RECUL_G PF7
#define LED_RECUL_D PD3
#define JTD 7

void PWM_init(void){               // Initialisation de la PWM
    PWM_DDRB |= (1<<PWM1);      // Les ports PWM sont des sorties
    PWM_DDRD |= (1<<PWM2);
    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
}

void LED_init(void)
{
    DDRD |= (1<<LED_D2) |(1<<LED_STOP_D)|(1<<LED_RECUL_D);
    DDRC |= (1<<LED_D1) |(1<<LED_PHARES_D);
    DDRF |= (1<<LED_G1) |(1<<LED_G2)|(1<<LED_STOP_G)|(1<<LED_PHARES_G) |(1<<LED_RECUL_G);
}

void capteur_init(void)
{
    DDRF &= ~(1<<CAPTEUR);
}
int main(void){

    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)
    
    MCUCR |= (1<<JTD);
    MCUCR |= (1<<JTD);
    PWM_init();
    LED_init();
    capteur_init();
    int pwm=0;
    PWM_DDRB |= (1<<AIN1)|(1<<AIN2);
    PWM_PORTB |= (1<<AIN1)|(0<<AIN2);
    PWM_DDRD |= (1<<BIN1)|(1<<BIN2);
    PWM_PORTD |= (0<<BIN1)|(1<<BIN2);
    while (1)
    {
        pwm++;
        if ((PORTF>>CAPTEUR) &1){
            pwm=0;
            PORTC|=0x00;
        }
        if (pwm >255) pwm=0;
        OCR0A=pwm;
        OCR0B=pwm;
        PORTC |=0b11000000;
        PORTD |=0b00111000; 
        PORTF |=0b11010011;  
        _delay_ms(100);
    }
    return 0;
}

Ce code nous a permi de vérifier le fonctionnement des LEDs mais pas celui du capteur pour le moment.

Séance du 4 Juin 2024

Aujourd'hui nous avons avancé sur le contrôle des LEDs et du capteur de proximité que nous avons enfin fait fonctionner. Nous avons désormais une voiture qui roule, phares allumés. Si elle rencontre un obstacle, elle s'arrête puis déclenche ses warnings. Elle possède aussi un bouton start qui lance le programme.