« SE3Groupe2024-4 » : différence entre les versions
Aucun résumé des modifications |
|||
(18 versions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 32 : | Ligne 32 : | ||
=== Schématique === | === Schématique === | ||
[[Fichier:Capture_1.png | [[Fichier:Capture_1.png|vignette|302x302px|Chargeur LiPo, Microphone, Ecran et Mode d'Alimentation|néant]] | ||
[[Fichier:Capture2.png|alt=schéma partie 2|suite schématique|328x328px|néant|vignette]] | [[Fichier:Capture2.png|alt=schéma partie 2|suite schématique|328x328px|néant|vignette]] | ||
Ligne 42 : | Ligne 42 : | ||
Le câblage a été réalisé selon les différentes datasheets. | Le câblage a été réalisé selon les différentes datasheets. | ||
[[Fichier:LTC Datasheet.png | [[Fichier:LTC Datasheet.png|vignette|417x417px|Extrait de la datasheet du régulateur|néant]] | ||
Pour le régulateur, nous nous sommes basés sur la datasheet du LTC5351ES6-3.3 pour le schéma. | Pour le régulateur, nous nous sommes basés sur la datasheet du LTC5351ES6-3.3 pour le schéma. | ||
Ligne 50 : | Ligne 50 : | ||
Pour l'écran, le modèle utilisé est ADM1602K, qui peut marcher en 4 ou 8 bits. Pour des raisons de praticité, nous avons décidé de travailler en 4 bits. | |||
[[Fichier:Extrait datasheet ADM.png|vignette|Extrait de la datasheet de l'écran.|néant|530x530px]] | |||
On voit sur la datasheet que les pins de 7 à 10 ne sont pas nécessaire. Nous avons alors branché ceux de DB4 à DB7 à notre atmega. Nous les avons mis sur des sorties analogiques, comme nécesssaire selon la datasheet du même produit.<br> | |||
===Routage=== | ===Routage=== | ||
Le routage nous donne la carte ici présente : | Le routage nous donne la carte ici présente : | ||
[[Fichier:Routage global.png|gauche|vignette|Image globale du routage sur kicad]] | [[Fichier:Routage global.png|gauche|vignette|Image globale du routage sur kicad|619x619px]] | ||
[[Fichier:Zoom autour de l'AVR.png|centré|vignette|Image zoomée sur le | [[Fichier:Zoom autour de l'AVR.png|centré|vignette|Image zoomée sur le microcontrôleur|662x662px]] | ||
[[Fichier:Image 3D carte.png|vignette|Plan 3D de la carte|539x539px|néant]] | |||
On obtient une carte occupée en majeure partie par l'écran. | |||
Autour de l'antenne, nous avons modifié le ground, car selon la datasheet, l'antenne ne doit pas être sur la même base de masse que les autres composant afin d'éviter les interférences. | |||
===Réalisation=== | |||
Lors du routage, nous nous sommes rendu compte d'une erreur lors du choix de l'inductance du régulateur, nous avons donc choisit d’alimenter notre carte en 5V, car les deux composant principaux de notre carte (le micro et l'écran) sont supposé fonctionner en 5V selon leur datasheet. | |||
==LEDS== | |||
Pour tester les leds, on les fait clignoter avec le programme suivant :<syntaxhighlight lang="c"> | |||
#include <avr/io.h> | |||
#include <util/delay.h> | |||
int main() { | |||
DDRB |= 1<<PB6 | 1<<PB7; | |||
while(1) { | |||
PORTB ^= 1<<PB6 ^ 1<<PB7; | |||
_delay_ms(10); | |||
} | |||
} | |||
</syntaxhighlight> | |||
On remarque que seul la LED sur PB7 fonctionne. | |||
Pour la suite, nous nous sommes concentré sur la programmation du micro et de l'écran et avons donc mis le NRF et la batterie de coté. La LED sur PB6 ne nous intéresse donc pas. | |||
Voici notre carte soudé avec les composants que nous allons utiliser : | |||
[[Fichier:Photo cartePSE.jpg|néant|vignette]] | |||
==Micro== | |||
Pour vérifié le bon fonctionnement du micro, nous avons essayé d'afficher la valeur d'entrée du port analogique PF0 (ADC0) | |||
Pour se faire nous avons utiliser la LUFA et plus précisément la demo VirtualSerial que nous avons modifié pour renvoyer la valeur de PF0. | |||
Dans la fonction SetupHardware nous avons ajouté : <syntaxhighlight lang="c"> | |||
// Sélectionner la référence de tension pour l'ADC (AVCC) | |||
ADMUX = (1 << REFS0); | |||
// Activer l'ADC et définir le facteur de division d'horloge | |||
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); | |||
</syntaxhighlight>et dans la fonction CDC_Task : <syntaxhighlight lang="c"> | |||
// Sélection du canal ADC0 | |||
ADMUX = (1 << REFS0) | (0 & 0x07); | |||
// Démarrer la conversion ADC | |||
ADCSRA |= (1 << ADSC); | |||
// Attendre la fin de la conversion | |||
while (ADCSRA & (1 << ADSC)); | |||
if(ADC>0) { | |||
itoa(ADC, ReportString, 10); | |||
//ReportString = "test\r\n"; | |||
} | |||
else ActionSent = false; | |||
</syntaxhighlight> | |||
Malheureusement, minicom n'affichant rien, nous avons opté pour une seconde possibilité faire clignoter une LED lorsque lorsque nous dépassons une certaine valeur<syntaxhighlight lang="c"> | |||
#include <avr/io.h> | |||
#include <util/delay.h> | |||
#include <stdio.h> | |||
void ADC_Init() { | |||
ADMUX = (1 << REFS0); | |||
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); | |||
} | |||
uint16_t ADC_Read(uint8_t channel) { | |||
ADMUX = (1 << REFS0) | (channel & 0x07); | |||
ADCSRA |= (1 << ADSC); | |||
while (ADCSRA & (1 << ADSC)); | |||
return ADC; | |||
} | |||
int main(void) { | |||
ADC_Init(); | |||
DDRB |= 1<<PB7; | |||
while (1) { | |||
uint16_t sensorValue = ADC_Read(0); | |||
if(sensorValue > 980) PORTB ^= 1<<PB7; | |||
_delay_ms(10); | |||
} | |||
} | |||
</syntaxhighlight>Nous nous somme donc rendu compte d'un problème : la valeur semble constante (environ 980) | |||
==Ecran== | |||
Pour l'écran, nous l'avons soudé après le micro. À l'aide de la datasheet et de ressources en ligne, nous avons essayé de faire fonctionner le code suivant sur notre carte : <syntaxhighlight lang="c" line="1" start="1"> | |||
#include <avr.io> | |||
#include <util/delay.h> | |||
// Définition des broches utilisées pour le LCD, selon notre câblage | |||
#define RS PD0 | |||
#define EN PD1 | |||
#define D4 PD4 | |||
#define D5 PD5 | |||
#define D6 PD6 | |||
#define D7 PD7 | |||
//Fonction du gère les commandes données au LCD | |||
void LCD_Commandgiver(unsigned char comand){ | |||
PORTD = (PORTD & 0x0F) | (comand & 0x0F); | |||
PORTD &= (1<<EN); | |||
_delay_ms(1); | |||
PORTD &= ~(1<<EN); | |||
_delay_ms(10); | |||
PORTD = (PORTD & 0x0F) | (comand << 4); | |||
PORTD |= (1<<EN); | |||
_delay_ms(2); | |||
PORTD &= ~(1<<EN); | |||
_delay_ms(2); | |||
} | |||
//Gère l'envoi d'un paramètre char | |||
void LCD_Character( unsigned char data_00){ | |||
PORTD = (PORTD & 0x0F) | (data_00 & 0xF0); | |||
PORTD |= (1<<RS); | |||
PORTD |= (1<<EN); | |||
_delay_ms(1); | |||
PORTD &= ~(1<<EN); | |||
_delay_ms(2); | |||
PORTD = (PORTD & 0x0F) | (data_00 << 4); | |||
PORTD |= (1<<EN); | |||
_delay_ms(1); | |||
PORTD &= ~(1<<EN); | |||
_delay_ms(2); | |||
} | |||
//Initialise le LCD et active les registres pour écrire | |||
void LCD_Initializer (void){ | |||
DDRD = 0xFF; | |||
_delay_ms(20); | |||
LCD_Commandgiver(0x02); | |||
LCD_Commandgiver(0x28); | |||
LCD_Commandgiver(0x0c); | |||
LCD_Commandgiver(0x06); | |||
LCD_Commandgiver(0x01); | |||
_delay_ms(2); | |||
} | |||
//Gère l'envoi d'une chaîne de caractère au contrôleur | |||
void LCD_String(char *string_00){ | |||
int ci; | |||
for(ci = 0; string_00[ci] != 0; ci++){ | |||
LCD_Character (string_00[ci]); | |||
} | |||
} | |||
//Clear l'écran | |||
void LCD_Clear(){ | |||
LCD_Commandgiver(0x01); | |||
_delay_ms(2); | |||
LCD_Commandgiver(0x80); | |||
} | |||
//fonction principale | |||
int main(){ | |||
LCD_Initializer(); | |||
LCD_String("PSE !"); | |||
LCD_Commandgiver(0xC0); | |||
LCD_String("Volume :"); | |||
while(1); | |||
} | |||
</syntaxhighlight>Nous avons réussi à compiler le code et le flasher sur l'atmega, cependant, il n'y avait pas de résultat s'affichant sur l'écran. | |||
==Programmation== | ==Programmation== | ||
Ligne 90 : | Ligne 245 : | ||
Au cours du module de programmation de système embarqué, nous avons donc schématisé, soudé et programmé un AVR ATMega8u2. | Au cours du module de programmation de système embarqué, nous avons donc schématisé, soudé et programmé un AVR ATMega8u2. | ||
[[Fichier:Photo carte.jpg|néant|vignette]] | |||
Cette carte est composée notamment de 2 Led et d'un bouton afin d'effectuer les tests de programmation. | |||
Nous avons donc réussi à faire clignoter la led D1 avec le code suivant : <syntaxhighlight lang="c"> | |||
#include <avr/io.h> | |||
#include <util/delay.h> | |||
#define D1 5 | |||
int main() { | |||
DDRC |= 1<<D1; | |||
while(1) | |||
{ | |||
PORTC ^= 1<<D1; | |||
_delay_ms(50); | |||
} | |||
} | |||
</syntaxhighlight>Avec la LUFA on simule un port série avec la demo VirtualSerial. | |||
dans VirtualSerial.c, on a modifié la fonction CDC_Task et implémenté le code suivant <syntaxhighlight lang="c"> | |||
char* ReportString = NULL; | |||
static bool ActionSent = false; | |||
/* Device must be connected and configured for the task to run */ | |||
if (USB_DeviceState != DEVICE_STATE_Configured) | |||
return; | |||
if ((1<<7 & PINB) == 1<<7) | |||
ReportString = "Button Pressed\r\n"; | |||
else | |||
ActionSent = false; | |||
</syntaxhighlight>en pressant le bouton de notre carte, on pouvait afficher dans le minicom que le bouton était bel et bien pressé. | |||
[[Fichier:Test led D1.mp4|vignette|néant]] | [[Fichier:Test led D1.mp4|vignette|néant]] |
Version actuelle datée du 15 juin 2025 à 21:44
Description
Objectif
Concevoir un petit objet affichant le volume sonore en décibels et enregistrant les voix environnantes.
Cahier des charges
Notre système devra :
- afficher le volume en décibels
- Si un certaine valeur est atteinte
- faire clignoter une LED
- l'audio est enregisté puis transmis au PC
- allumer une LED en cas de batterie faible
Spécification techniques
- Notre système sera alimenté par batterie et rechargeable/programmable par USB.
- Un écran LCD nous servira à afficher le volume en décibels.
- LED :
- Pour la batterie
- Pour l'enregistrement
- Une puce NRF24L01 permettra la reception des données par communication radio.
- Un capteur de son ou microphone servira à récupérer le volume et l'enregistrement.
- Nous utilisons un ATmega32u4 pour la transmission, par un USB de type carte son, des données vers un PC
ReX : rien sur la connexion USB ?!
Lien vers le Gitea du Projet
Carte électronique
Schématique
La schématique des éléments de notre carte pour le projet.
Nous travaillons donc avec un atmega32u4.
Le câblage a été réalisé selon les différentes datasheets.
Pour le régulateur, nous nous sommes basés sur la datasheet du LTC5351ES6-3.3 pour le schéma.
Pour le microphone, nous avons décidé d'utiliser un montage constitué d'un transistor pour des raisons d'économie et de praticité.
Pour l'écran, le modèle utilisé est ADM1602K, qui peut marcher en 4 ou 8 bits. Pour des raisons de praticité, nous avons décidé de travailler en 4 bits.
On voit sur la datasheet que les pins de 7 à 10 ne sont pas nécessaire. Nous avons alors branché ceux de DB4 à DB7 à notre atmega. Nous les avons mis sur des sorties analogiques, comme nécesssaire selon la datasheet du même produit.
Routage
Le routage nous donne la carte ici présente :
On obtient une carte occupée en majeure partie par l'écran.
Autour de l'antenne, nous avons modifié le ground, car selon la datasheet, l'antenne ne doit pas être sur la même base de masse que les autres composant afin d'éviter les interférences.
Réalisation
Lors du routage, nous nous sommes rendu compte d'une erreur lors du choix de l'inductance du régulateur, nous avons donc choisit d’alimenter notre carte en 5V, car les deux composant principaux de notre carte (le micro et l'écran) sont supposé fonctionner en 5V selon leur datasheet.
LEDS
Pour tester les leds, on les fait clignoter avec le programme suivant :
#include <avr/io.h>
#include <util/delay.h>
int main() {
DDRB |= 1<<PB6 | 1<<PB7;
while(1) {
PORTB ^= 1<<PB6 ^ 1<<PB7;
_delay_ms(10);
}
}
On remarque que seul la LED sur PB7 fonctionne.
Pour la suite, nous nous sommes concentré sur la programmation du micro et de l'écran et avons donc mis le NRF et la batterie de coté. La LED sur PB6 ne nous intéresse donc pas.
Voici notre carte soudé avec les composants que nous allons utiliser :
Micro
Pour vérifié le bon fonctionnement du micro, nous avons essayé d'afficher la valeur d'entrée du port analogique PF0 (ADC0)
Pour se faire nous avons utiliser la LUFA et plus précisément la demo VirtualSerial que nous avons modifié pour renvoyer la valeur de PF0.
Dans la fonction SetupHardware nous avons ajouté :
// Sélectionner la référence de tension pour l'ADC (AVCC)
ADMUX = (1 << REFS0);
// Activer l'ADC et définir le facteur de division d'horloge
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
et dans la fonction CDC_Task :
// Sélection du canal ADC0
ADMUX = (1 << REFS0) | (0 & 0x07);
// Démarrer la conversion ADC
ADCSRA |= (1 << ADSC);
// Attendre la fin de la conversion
while (ADCSRA & (1 << ADSC));
if(ADC>0) {
itoa(ADC, ReportString, 10);
//ReportString = "test\r\n";
}
else ActionSent = false;
Malheureusement, minicom n'affichant rien, nous avons opté pour une seconde possibilité faire clignoter une LED lorsque lorsque nous dépassons une certaine valeur
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
void ADC_Init() {
ADMUX = (1 << REFS0);
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
}
uint16_t ADC_Read(uint8_t channel) {
ADMUX = (1 << REFS0) | (channel & 0x07);
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC));
return ADC;
}
int main(void) {
ADC_Init();
DDRB |= 1<<PB7;
while (1) {
uint16_t sensorValue = ADC_Read(0);
if(sensorValue > 980) PORTB ^= 1<<PB7;
_delay_ms(10);
}
}
Nous nous somme donc rendu compte d'un problème : la valeur semble constante (environ 980)
Ecran
Pour l'écran, nous l'avons soudé après le micro. À l'aide de la datasheet et de ressources en ligne, nous avons essayé de faire fonctionner le code suivant sur notre carte :
#include <avr.io>
#include <util/delay.h>
// Définition des broches utilisées pour le LCD, selon notre câblage
#define RS PD0
#define EN PD1
#define D4 PD4
#define D5 PD5
#define D6 PD6
#define D7 PD7
//Fonction du gère les commandes données au LCD
void LCD_Commandgiver(unsigned char comand){
PORTD = (PORTD & 0x0F) | (comand & 0x0F);
PORTD &= (1<<EN);
_delay_ms(1);
PORTD &= ~(1<<EN);
_delay_ms(10);
PORTD = (PORTD & 0x0F) | (comand << 4);
PORTD |= (1<<EN);
_delay_ms(2);
PORTD &= ~(1<<EN);
_delay_ms(2);
}
//Gère l'envoi d'un paramètre char
void LCD_Character( unsigned char data_00){
PORTD = (PORTD & 0x0F) | (data_00 & 0xF0);
PORTD |= (1<<RS);
PORTD |= (1<<EN);
_delay_ms(1);
PORTD &= ~(1<<EN);
_delay_ms(2);
PORTD = (PORTD & 0x0F) | (data_00 << 4);
PORTD |= (1<<EN);
_delay_ms(1);
PORTD &= ~(1<<EN);
_delay_ms(2);
}
//Initialise le LCD et active les registres pour écrire
void LCD_Initializer (void){
DDRD = 0xFF;
_delay_ms(20);
LCD_Commandgiver(0x02);
LCD_Commandgiver(0x28);
LCD_Commandgiver(0x0c);
LCD_Commandgiver(0x06);
LCD_Commandgiver(0x01);
_delay_ms(2);
}
//Gère l'envoi d'une chaîne de caractère au contrôleur
void LCD_String(char *string_00){
int ci;
for(ci = 0; string_00[ci] != 0; ci++){
LCD_Character (string_00[ci]);
}
}
//Clear l'écran
void LCD_Clear(){
LCD_Commandgiver(0x01);
_delay_ms(2);
LCD_Commandgiver(0x80);
}
//fonction principale
int main(){
LCD_Initializer();
LCD_String("PSE !");
LCD_Commandgiver(0xC0);
LCD_String("Volume :");
while(1);
}
Nous avons réussi à compiler le code et le flasher sur l'atmega, cependant, il n'y avait pas de résultat s'affichant sur l'écran.
Programmation
Programmation AVR
Au cours du module de programmation de système embarqué, nous avons donc schématisé, soudé et programmé un AVR ATMega8u2.
Cette carte est composée notamment de 2 Led et d'un bouton afin d'effectuer les tests de programmation.
Nous avons donc réussi à faire clignoter la led D1 avec le code suivant :
#include <avr/io.h>
#include <util/delay.h>
#define D1 5
int main() {
DDRC |= 1<<D1;
while(1)
{
PORTC ^= 1<<D1;
_delay_ms(50);
}
}
Avec la LUFA on simule un port série avec la demo VirtualSerial. dans VirtualSerial.c, on a modifié la fonction CDC_Task et implémenté le code suivant
char* ReportString = NULL;
static bool ActionSent = false;
/* Device must be connected and configured for the task to run */
if (USB_DeviceState != DEVICE_STATE_Configured)
return;
if ((1<<7 & PINB) == 1<<7)
ReportString = "Button Pressed\r\n";
else
ActionSent = false;
en pressant le bouton de notre carte, on pouvait afficher dans le minicom que le bouton était bel et bien pressé.
Tests
Rendus
Archive GIT
lien du git: https://gitea.plil.fr/tdelobel/SE3_2024_B4.git
Autres rendus
Projet KiCAd programmateur AVR : Fichier:2024-PSE-G4-Prog.zip