Panneau de modération ]

[Commande] Deluxe Line Selector

Une idée ? Creuser un schéma qui vous intéresse ? Besoin d'affiner votre projet avant de le concrétiser ? Parlons en ensemble !

[Commande] Deluxe Line Selector

Messagepar Sebdeploudal le 21 Déc 2017 11:10

Projet :
L’idée n’est pas de cloner, mais de reproduire le comportement de la BOSS LS-2.

Fonctionnement :
6 modes sélectionnables par un rotary switch 6P2T

• A<->B: LINE A ou LINE B;
• A<->Bypass: LINE A ou Bypass;
• B<->Bypass: LINE B ou Bypass;
• A->B->Bypass: LINE A, LINE B ou Bypass;
• A+B Mix -> Bypass: LINE A et LINE B en parallèle ou Bypass;
• Output Select : sortie A, B ou Out

Nous avons donc à gérer 3 entrées et 3 sorties que nous pouvons contrôler avec des relais (ou 2 CD4066 à tester):

____________IN_________________RETURN A________________________RETURN B
OUT________SW_BYPASS________SW_RETURN_A + SW_MIXER________SW_RETURN_B+ SW_MIXER
SEND A______SW_SEND_A
SEND B______SW_SEND_B

Schémas simplifié :
Image

Schémas EAGLE

Implantation DIYLC


Position des relais en fonction de la configuration :

_______________LINE A______LINE B______LINE A et LINE B______Bypass
SW_BYPASS______ouvert______ouvert______ouvert_____________fermé
SW_SEND_A______fermé______fermé______fermé______________ouvert
SW_SEND_B______ouvert_____ouvert______fermé______________ouvert
SW_RETURN_A___fermé______ouvert______fermé______________ouvert
SW_RETURN_B___ouvert______fermé______fermé______________ouvert
SW_MIXER_______fermé______fermé______fermé______________ouvert

Contrôle des relais :
Le contrôle des relais sera assuré par un Arduino NANO. --> relais remplacés par des CD4066
Le changement de fonction se fera par la pression d’un switch momentané.
2 LEDs permettront de vérifié si les boucle A ou B sont actives. --> inutiles si écran LCD
1 écran LCD utilisé pour le paramétrage sera conservé pour affiché le mode. --> Inutile si LED de contrôle.
Je garde une pédale True Bypass part un classique footswitch 3PDT.La LED est remplacée par l'éclairage de l'écaran
Modifié en dernier par Sebdeploudal le 19 Fév 2018 11:05, modifié 6 fois.
le savoir ne vaut que s'il est partagé.
Avatar de l’utilisateur
Sebdeploudal
ELECTRON LIBRE
 
Messages: 774
Enregistré le: 24 Aoû 2010 09:55
Localisation: Bretagne

Messagepar MicMicMan le 30 Déc 2017 00:49

hello,
projet intéressant ça :)
je pense que tu peux te passer des 3 buffers après le 1er, le 1er devrait avoir suffisamment de jus pour driver les 3 lignes
si tu utilises des 4066, il faudra que tu penses à inverser capa de liaison et interrupteur - à ce moment, peut-être que conserver les 3 buffers peut se révéler intéressant, en plaçant un buffer derrière la cellule de 4066 (avant le send).
Avatar de l’utilisateur
MicMicMan
DOCTOR MOC
 
Messages: 6633
Enregistré le: 26 Fév 2009 16:37
Localisation: Lyon

Messagepar Sebdeploudal le 17 Jan 2018 16:17

Oui, sur le Schémas EAGLE, j'ai prévue les capas pour les 4066.
[EDIT du 15 01 2018]
voici le nouveau code
Code: Tout sélectionner
// include the library code:
#include <LiquidCrystal.h>

//INITIALISATION DE L ECRAN
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

//declaration des relays
#define cmd_Relay_1 6
#define cmd_Relay_2 7
#define cmd_Relay_3 8
#define cmd_Relay_4 9
#define cmd_Relay_5 10
#define cmd_Relay_6 A1

//declaration du potentiometre
#define Selector A3
int ValSelector = 0;

//declaration du poussoir
#define Poussoir A2

int ButtonState = LOW; // the current reading from the input pin
int LastButtonState = LOW;

unsigned long LastDebounceTime = 0; // the last time the output pin was toggled
unsigned long DebounceDelay = 50;

//declaration du mode
int Mode = 0;
String MonMode = "";

//declaration du choix
int Choix = 1;
int NextChoix = 2;
int NombreChoix = 0;
String MonChoix = "";

//declaration de la configuration des relay
int ConfigRelay;

void setup() {
   // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
 
   //initialisation des relays
   pinMode(cmd_Relay_1, OUTPUT);
   pinMode(cmd_Relay_2, OUTPUT);
   pinMode(cmd_Relay_3, OUTPUT);
   pinMode(cmd_Relay_4, OUTPUT);
   pinMode(cmd_Relay_5, OUTPUT);
   pinMode(cmd_Relay_6, OUTPUT);
   
   //initialisation du Pot
   pinMode(Selector, INPUT_PULLUP);
   
   //initialisation du bouton
   pinMode(Poussoir, INPUT);
   
   //initialisation des relay
   ConfigRelay = 0;
}

void loop() {
  //digitalWrite (LedTest, HIGH);
   int reading = digitalRead(Poussoir);
     
   if (reading != LastButtonState)
   {
      LastDebounceTime = millis();
   }
   
   if ((millis() - LastDebounceTime) > DebounceDelay)
   {
      if (reading != ButtonState)
      {
         ButtonState = reading;
         if (ButtonState == HIGH)
         {
            Choix = NextChoix;
            NextChoix = Choix + 1;
         }
      }
   }
      
   LastButtonState = reading;   
   ValSelector=analogRead(Selector);
  delay(25);
   
   if (930<ValSelector && ValSelector<950) //lit la valeur du pot
   {   Mode = 6;
   }
   else
      if (880<ValSelector && ValSelector<900) //lit la valeur du pot
      {   
         Mode = 5;
   }
   else
      if (840<ValSelector && ValSelector<860) //lit la valeur du pot
      {   
         Mode = 4;
   }
   else
      if (780<ValSelector && ValSelector<800) //lit la valeur du pot
      {   
         Mode = 3;
   }
   else
      if (690<ValSelector && ValSelector<710) //lit la valeur du pot
      {   
         Mode = 2;
   }
   else
      if (515<ValSelector && ValSelector<535) //lit la valeur du pot
      {   
         Mode = 1;
   }
   
   switch (Mode) {
      case 1:
         NombreChoix = 2;
         MonMode = "     A<-->B     ";
      //lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(MonMode);
         if (Choix > NombreChoix)
         {   Choix = NombreChoix ;
            NextChoix = 1;
         }
         break;
      case 2:
         NombreChoix = 2;
         MonMode = "  A<-->Bypass   ";
      //lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(MonMode);
      Serial.print(MonMode);
      Serial.print("\t");
         if (Choix > NombreChoix)
         {   Choix = NombreChoix ;
            NextChoix = 1;
         }
         break;
      case 3:
         NombreChoix = 2;
         MonMode = "  B<-->Bypass   ";
      lcd.setCursor(0, 0);
      lcd.print(MonMode);
      if (Choix > NombreChoix)
         {   Choix = NombreChoix ;
            NextChoix = 1;
         }
         break;
      case 4:
         NombreChoix = 3;
         MonMode = " A-->B-->Bypass ";
      lcd.setCursor(0, 0);
      lcd.print(MonMode);
         break;
      case 5:
         NombreChoix = 2;
         MonMode = "A+B MIX-->Bypass";
      lcd.setCursor(0, 0);
      lcd.print(MonMode);
         if (Choix > NombreChoix)
         {   Choix = NombreChoix ;
            NextChoix = 1;
         }
         break;
      case 6:
         NombreChoix = 3;
         MonMode = "  A-->B-->OUT   ";
      lcd.setCursor(0, 0);
      lcd.print(MonMode);
         break;
   }
   if (Choix == NombreChoix)
   {   NextChoix = 1;
   }
   
   ConfigRelay = ((10*Mode)+Choix);
   
   switch (ConfigRelay) {
      case 11:
         MonChoix = "     LINE A     ";
      lcd.setCursor(0, 1);
      lcd.print(MonChoix);
         digitalWrite(cmd_Relay_1, LOW);
         digitalWrite(cmd_Relay_2, HIGH);
         digitalWrite(cmd_Relay_3, LOW);
         digitalWrite(cmd_Relay_4, HIGH);
         digitalWrite(cmd_Relay_5, LOW);
         digitalWrite(cmd_Relay_6, HIGH);
         break;
      case 12:
         MonChoix = "     LINE B     ";
      lcd.setCursor(0, 1);
      lcd.print(MonChoix);
         digitalWrite(cmd_Relay_1, LOW);
         digitalWrite(cmd_Relay_2, LOW);
         digitalWrite(cmd_Relay_3, HIGH);
         digitalWrite(cmd_Relay_4, LOW);
         digitalWrite(cmd_Relay_5, HIGH);
         digitalWrite(cmd_Relay_6, HIGH);
         break;
      case 21:
         MonChoix = "     LINE A     ";
      lcd.setCursor(0, 1);
      lcd.print(MonChoix);
         digitalWrite(cmd_Relay_1, LOW);
         digitalWrite(cmd_Relay_2, HIGH);
         digitalWrite(cmd_Relay_3, LOW);
         digitalWrite(cmd_Relay_4, HIGH);
         digitalWrite(cmd_Relay_5, LOW);
         digitalWrite(cmd_Relay_6, HIGH);
         break;
      case 22:
         MonChoix = "     Bypass     ";
            lcd.setCursor(0, 1);
      lcd.print(MonChoix);
         digitalWrite(cmd_Relay_1, HIGH);
         digitalWrite(cmd_Relay_2, LOW);
         digitalWrite(cmd_Relay_3, LOW);
         digitalWrite(cmd_Relay_4, LOW);
         digitalWrite(cmd_Relay_5, LOW);
         digitalWrite(cmd_Relay_6, LOW);
         break;
      case 31:
         MonChoix = "     LINE B     ";
            lcd.setCursor(0, 1);
      lcd.print(MonChoix);
         digitalWrite(cmd_Relay_1, LOW);
         digitalWrite(cmd_Relay_2, LOW);
         digitalWrite(cmd_Relay_3, HIGH);
         digitalWrite(cmd_Relay_4, LOW);
         digitalWrite(cmd_Relay_5, HIGH);
         digitalWrite(cmd_Relay_6, HIGH);
         break;
      case 32:
         MonChoix = "     Bypass     ";
            lcd.setCursor(0, 1);
      lcd.print(MonChoix);
         digitalWrite(cmd_Relay_1, HIGH);
         digitalWrite(cmd_Relay_2, LOW);
         digitalWrite(cmd_Relay_3, LOW);
         digitalWrite(cmd_Relay_4, LOW);
         digitalWrite(cmd_Relay_5, LOW);
         digitalWrite(cmd_Relay_6, LOW);
         break;
      case 41:
         MonChoix = "     LINE A     ";
            lcd.setCursor(0, 1);
      lcd.print(MonChoix);
         digitalWrite(cmd_Relay_1, LOW);
         digitalWrite(cmd_Relay_2, HIGH);
         digitalWrite(cmd_Relay_3, LOW);
         digitalWrite(cmd_Relay_4, HIGH);
         digitalWrite(cmd_Relay_5, LOW);
         digitalWrite(cmd_Relay_6, HIGH);
         break;
      case 42:
         MonChoix = "     LINE B     ";
            lcd.setCursor(0, 1);
      lcd.print(MonChoix);
         digitalWrite(cmd_Relay_1, LOW);
         digitalWrite(cmd_Relay_2, LOW);
         digitalWrite(cmd_Relay_3, HIGH);
         digitalWrite(cmd_Relay_4, LOW);
         digitalWrite(cmd_Relay_5, HIGH);
         digitalWrite(cmd_Relay_6, HIGH);
         break;
      case 43:
         MonChoix = "     Bypass     ";
            lcd.setCursor(0, 1);
      lcd.print(MonChoix);
         digitalWrite(cmd_Relay_1, HIGH);
         digitalWrite(cmd_Relay_2, LOW);
         digitalWrite(cmd_Relay_3, LOW);
         digitalWrite(cmd_Relay_4, LOW);
         digitalWrite(cmd_Relay_5, LOW);
         digitalWrite(cmd_Relay_6, LOW);
         break;
      case 51:
         MonChoix = "LINE A + LINE B ";
           lcd.setCursor(0, 1);
      lcd.print(MonChoix);
         digitalWrite(cmd_Relay_1, LOW);
         digitalWrite(cmd_Relay_2, HIGH);
         digitalWrite(cmd_Relay_3, HIGH);
         digitalWrite(cmd_Relay_4, HIGH);
         digitalWrite(cmd_Relay_5, HIGH);
         digitalWrite(cmd_Relay_6, HIGH);
         break;
      case 52:
         MonChoix = "     Bypass     ";
            lcd.setCursor(0, 1);
      lcd.print(MonChoix);
         digitalWrite(cmd_Relay_1, HIGH);
         digitalWrite(cmd_Relay_2, LOW);
         digitalWrite(cmd_Relay_3, LOW);
         digitalWrite(cmd_Relay_4, LOW);
         digitalWrite(cmd_Relay_5, LOW);
         digitalWrite(cmd_Relay_6, LOW);
         break;
      case 61:
         MonChoix = "    Sortie A    ";
            lcd.setCursor(0, 1);
      lcd.print(MonChoix);
         digitalWrite(cmd_Relay_1, LOW);
         digitalWrite(cmd_Relay_2, HIGH);
         digitalWrite(cmd_Relay_3, LOW);
         digitalWrite(cmd_Relay_4, LOW);
         digitalWrite(cmd_Relay_5, LOW);
         digitalWrite(cmd_Relay_6, LOW);
         break;
      case 62:   
         MonChoix = "    Sortie B    ";
      lcd.setCursor(0, 1);
      lcd.print(MonChoix);
         digitalWrite(cmd_Relay_1, LOW);
         digitalWrite(cmd_Relay_2, HIGH);
         digitalWrite(cmd_Relay_3, LOW);
         digitalWrite(cmd_Relay_4, LOW);
         digitalWrite(cmd_Relay_5, LOW);
         digitalWrite(cmd_Relay_6, LOW);
         break;
      case 63:
         MonChoix = "   Sortie OUT   ";
      lcd.setCursor(0, 1);
      lcd.print(MonChoix);
         digitalWrite(cmd_Relay_1, HIGH);
         digitalWrite(cmd_Relay_2, LOW);
         digitalWrite(cmd_Relay_3, LOW);
         digitalWrite(cmd_Relay_4, LOW);
         digitalWrite(cmd_Relay_5, LOW);
         digitalWrite(cmd_Relay_6, LOW);
         break;         
   }   
}


Petite modif sur le Montage car A6 et A7 ne peuvent pas être des sortie digitales
Image

[EDIT du 17 01 2018]
simplification du schéma :
Image
Modifié en dernier par Sebdeploudal le 26 Jan 2018 10:39, modifié 3 fois.
le savoir ne vaut que s'il est partagé.
Avatar de l’utilisateur
Sebdeploudal
ELECTRON LIBRE
 
Messages: 774
Enregistré le: 24 Aoû 2010 09:55
Localisation: Bretagne

Messagepar Sebdeploudal le 25 Jan 2018 11:28

Image
le savoir ne vaut que s'il est partagé.
Avatar de l’utilisateur
Sebdeploudal
ELECTRON LIBRE
 
Messages: 774
Enregistré le: 24 Aoû 2010 09:55
Localisation: Bretagne

Messagepar shaddo le 25 Jan 2018 13:22

Ca va être chouette ! :D
Le Docteur Posture a dit : "... si la folie se résumait à ce que l'on rencontre sur ce forum, alors le monde irait bien mieux !"
#JeSuisCharlie
Avatar de l’utilisateur
shaddo
PLAYBOY VINTAGE
 
Messages: 12521
Enregistré le: 06 Aoû 2004 15:38
Localisation: Copacabana (Lorraine)

Messagepar Sebdeploudal le 31 Jan 2018 23:22

Pour le splitter le LT1058 ne fonctionne pas car "JFET input" je viens juste de recevoir 4 samples de LT1114 (3 pour mon VT BASS DI) qui fonctionnent.

la solution était là

SONELEC a écrit:Attention : si l'AOP est alimenté en mono-tension (broche d'alim V- reliée à la masse par exemple, ce point est abordé plus loin) alors sa sortie délivre une tension égale à sa tension de déchet, tant que la tension d'entrée (appliquée sur l'entrée non-inverseuse) est inférieure à cette tension de déchet. Exemple : si la tension de déchet de l'AOP est de 1 V sur le rail V-, alors toute tension d'entrée comprise entre 0 V et +1 V conduira à une tension de +1 V en sortie. Dans cette plage de tension d'entrée, le montage ne se comporte plus comme un suiveur de tension. Solution : utiliser un AOP "rail-to-rail" ou l'alimenter avec une tension symétrique (double).
le savoir ne vaut que s'il est partagé.
Avatar de l’utilisateur
Sebdeploudal
ELECTRON LIBRE
 
Messages: 774
Enregistré le: 24 Aoû 2010 09:55
Localisation: Bretagne

Messagepar Sebdeploudal le 12 Fév 2018 07:23

Petite modification, j'utilise la broche 15 de l'écran et sa résistance comme une Led reliée au footswitch pour indiquer si la pédale fonctionne ou non.
le savoir ne vaut que s'il est partagé.
Avatar de l’utilisateur
Sebdeploudal
ELECTRON LIBRE
 
Messages: 774
Enregistré le: 24 Aoû 2010 09:55
Localisation: Bretagne


Retourner vers CONCEPTION

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités

cron