Bonjour,
j'ai récemment entrepris la conception et la fabrication d'un amplificateur de casque en pure classe A (je précise que la conception s'arrête autour du circuit d'amplification qui n'est pas de moi).
Le but étant d'avoir un système pleinement opérationnel avec télécommande et les fonctions utile à mes besoins:
- Gestion du volume
- Gestion de l'alimentation
- Gestion des sources/sorties
Le tout dans un coffrage design qui me plait.
Concernant le volume j'ai trouvé mon bonheur avec un atténuateur à étages pilotés par des relais et qui possède déjà sa propre télécommande, elle permet de monter et descendre le volume, mute, changer la luminosité de l'affichage et possède un bouton ON/OFF qui n'était pas pris en charge par le système.
Pour l'alimentation, J'ai donc décider de récupérer le code de ce bouton ON/OFF et de l'utiliser sur une seconde cellule IR avec l'Arduino, en parallèle d'un bouton poussoir en façade.
Les sources sont gérées par l'Arduino à l'aide d'un seul bouton poussoir, chaque appuie change la sortie (dans mon cas elles seront utilisées en sortie).
Les fonctions en détail:
-
Sélection des sorties:
il y en a 3, deux doivent être temporisées (1.5sec) à l'allumage pour éviter le "ploc" de l'ampli, j'ai donc utilisé la variable Millis, la troisième sortie est destinée à mon amplificateur 2x25W, elle fonctionnera comme Pré-amplificateur passif, je souhaite donc couper l'alimentation de l'ampli casque lorsque celle-ci est activée. Partie fonctionnelle indépendamment -
Gestion de l'alimentation:
La gestion du ON/OFF de la télécommande est confié à la bibliothèque IRremote.h, la télécommande utilisée me transmet 2 codes distinct qui varie en fonction du temps d’appui, le bémol c'est qu'il n'est pas possible de le gérer tellement l'écart est faible, autre problèmes, sur un appui court, voir même très court elle m'envoie plusieurs fois le code, j'ai donc géré ce problème avec "delay", comme pour traiter un rebond sur un bouton poussoir.
Pour les 2 codes, j'ai simplement dupliqué la commande avec le second code. Partie fonctionnelle indépendamment -
Concernant l'initialisation de l'ARduino, j'utiliserai un relais sans opto-coupleur pour couper l'alimentation 5v de la batterie de relais de sorties, afin d'éviter le bagotement.
J'ai plusieurs problèmes, mais je souhaiterai les aborder dans l'ordre, le premier réside dans la commande ON/OFF qui fonctionne bien avec le bouton poussoir, mais la télécommande ne donne qu'une impulsion au relais, comment résoudre ce conflit ?
PS: Je programmais à l'époque en Grafcet et schématique sur OMRON, je suis donc novice en "C", merci pour votre compréhension.
PS2: j'ai supprimé une partie des commentaires dans le code car je dépassai les 9000 caractères autorisés ![]()
[code]
//Amplificateur casque
#include <IRRemoteControl.h>
#include <IRRemoteControlInt.h>
#include <IRremote.h>
const int buttonPin = 2; //Bouton-poussoir en broche 2, Sélecteur de sortie
int buttonValue = 0;
int previousButtonValue = 0;
const int buttonPin1 = 3; //Bouton-poussoir en broche 3, bouton ON/OFF
const int RPin1= 9; //relais en broche 09, sortie JACK 6.3
const int RPin2= 10; //relais en broche 10, sortie XLR
const int RPin3= 11; //relais en broche 11, sortie Amplificateur (sortie RCA)
const int RPin5= 13; //relais en broche 13, sortie Alimentation amplificateur casque
int RPin6= 12; //relais en broche 12, sortie Alimentation Générale
int counter= 3; //Variable de compteur[/u]
boolean ETAT_RPin6=HIGH;
boolean ETAT_RPin5=HIGH;
boolean ETAT_buttonPin1=HIGH;
unsigned long currentTime=0;
unsigned long previousTime=0; // variable temps
int prevMillis = 0; // État d'activation de la tempo
int R_delay = 1500; // Temps à l'activation de la tempo
int R_delay1 = 10;
bool RState = 0;
int receptionIr = 4; //signal du récepteur IR
int etat = 0;
IRrecv irrecv(receptionIr); //Initialisation de la récepteion du réceptur IR
decode_results resultat;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(RPin1, OUTPUT);
pinMode(RPin2, OUTPUT);
pinMode(RPin3, OUTPUT);
pinMode(RPin5, OUTPUT);
digitalWrite(buttonPin1, HIGH);
digitalWrite(RPin5, HIGH);
digitalWrite(RPin1, HIGH);
irrecv.enableIRIn();
etat=0;
//GESTION ALIMENTATION RELAIS 5V
pinMode(RPin6, OUTPUT);
digitalWrite(RPin6, LOW);
}
void loop() {
buttonValue = digitalRead (buttonPin);
if(previousButtonValue != buttonValue){
if(buttonValue == LOW){
counter++;
}
}
previousButtonValue = buttonValue;
//RELAIS 1 sortie JACK 6.3
if(counter % 3 == 0 && millis() - prevMillis > R_delay) { //Variable du compteur + temporisation 1500ms
digitalWrite(RPin1,RState);
prevMillis = millis();
}
else if(counter % 3 != 0 && millis() - prevMillis > R_delay1){
digitalWrite(RPin1,HIGH);
delay(10); //Attendre 10ms avant d'intérroger à nouveau le bouton-poussoir
}
//RELAIS 2 sortie XLR
if(counter % 3 == 1 && millis() - prevMillis > R_delay) { //Variable du compteur + temporisation 1500ms
digitalWrite(RPin2,LOW);
prevMillis = millis();
}
else if(counter % 3 != 1 && millis() - prevMillis > R_delay1){
digitalWrite(RPin2,HIGH);
delay(10); //10ms intérroger bp
}
//RELAIS 3 sortie Amplificateur
if(counter % 3==2) { //Variable du compteur sans tempo
digitalWrite(RPin3,LOW);
prevMillis = millis();
}
else
digitalWrite(RPin3,HIGH);
delay(10); //10ms intérroger bp
//GESTION ALIMENTATION SECONDAIRE
if(counter % 3 ==2) //Variable du compteur
digitalWrite(RPin5,HIGH);
else
digitalWrite(RPin5,LOW);
delay(10); //10ms intérroger bp
// GESTION ALIMENTATION GENERALE
if(ETAT_buttonPin1==HIGH){ // Déclaration de l'état initiale du BP
if (digitalRead(buttonPin1)==0) // Lecture de l'état de BP
{
delay(5);
ETAT_RPin6 = !ETAT_RPin6;
ETAT_buttonPin1 = LOW;
}}
else if(digitalRead(buttonPin1)==1){
ETAT_buttonPin1=HIGH;}
digitalWrite(RPin6,ETAT_RPin6);
//GESTION TELECOMMANDE
if (irrecv.decode(&resultat)) //Si il y a reception d'un code qui est stocké dans resulat
{
delay (100);
if (resultat.value==0x2FD) //Si le code reçus vaut le code du bouton que vous avez programmés (ici c'est 0xFF30CF qui est égale au bouton 1 de ma télécommande)
{
if(etat==0) //si etat=0
{
digitalWrite(RPin6 ,HIGH); //Ici le relais est a l'état haut (il est alimenté)
etat=1; //etat est maintenant a 1
} //fin du if
else if(etat==1) //sinon, si etat=1
{
digitalWrite(RPin6 ,LOW); //Ici le relais est a l'etat bas (il n'est pas alimenté)
etat=0; //etat est maintenant a 0
} //fin du else if
}
if (resultat.value==0xAFD) //Si le code reçus vaut le code du bouton que vous avez programmés (ici c'est 0xFF18E7 qui est égale au bouton 2 de ma télécommande)
{
delay (100);
if(etat==0) //si etat=0
{
digitalWrite(RPin6 ,HIGH); //Ici le relais est a l'état haut (il est alimenté)
etat=1; //etat est maintenant a 1
} //fin du if(etat==0)
else if(etat==1) //sinon, si etat=1
{
digitalWrite(RPin6 ,LOW); //Ici le relais est a l'etat bas (il n'est pas alimenté)
etat=0; //etat est maintenant a 0
} //fin du else ifetat==1)
} //Fin du if (resultat.value==0xFF18E7)
irrecv.resume();
}
}
[/code]