Sony MHC 2600

Me dieron el equipo hace muchos años porque fallaba la pletina, la tiraron y luego no funcionaba lo demás (creo recordar). Es decir tengo el módulo principal (amplificador) el CD y la radio.


El caso es que ahora necesitaba un equipo y pensé en repararlo.

Al probarlo Presenta una pequeña salida de audio residual de radio que si parece corresponder con lo que sintoniza, pero muy apagada y distorsionada.

Tras buscar un poco consigo el manual de servicio con los esquemas y mirando las conexiones del modulo principal veo:
repara;sonymch2600;esquemaconnpg102.jpg

Se aprecia que el sonido del módulo de la radio que entra a traves del conector "System Control 1" pasa directamente al 2 en el que se conectan el CD y el módulo cassette. También se ve que el audio del CD ni siquiera entra al ampli. Asi pues debe ser en el módulo cassette donde se haga la selección de audio.

Encontrando el esquema del mismo:
repara;sonymch2600;esquemaselectororiginal.jpg

Vemos que efectivamente son el IC403 e IC404 (son multiplexores cmos 4051) los que seleccionan la entrada de audio según 3 salidas digitales de un microcontrolador que no puedo encontrar pero al que le llega la señal de un bus digital (AUB).

repara;sonymch2600;senal.jpg

Al mostrar la señal del Bus de Audio (“AUB”), tenemos que al presionar el selector de funciones en la unidad principal aparece una señal en esta linea:
La linea en reposo tiene una tensión de unos 5V, asi que suponemos que los pulsos activos son a nivel bajo.
La siguiente idea es utilizar un arduino como microcontrolador sustituto que lea y decodifique esa señal y nos de la señal digital de 3 bit que lleva el selector original para usar un CMOS-4051 (por cada canal) como el que lleva el original. Para ello podemos usar una de las IRQ del atmega que ademas permite elegir cuando activamos la detección que lo que nos conviene es en flanco de bajada. Momento desde el que empezamos a medir cada pulso.

Después de estudiarlos veo que los pulsos son todos a nivel bajo y lo que distingue si son 1 o 0 es la duración de los mismos. Los pulsos altos son unos 1200us y los bajos unos 1700us. Asi que hacemos el programa que los va midiendo y contando. Salen unos 16 pulsos pero con los distintos cambios de función sólo varían los 6 últimos pero cogiendo sólo los 3 nos salen suficientes códigos diferentes para las posibles selecciones. Esta es la tabla resultante:

Error 000 0
CD 101 5
Tuner 001 1
Phono 010 2
Tape 011 3
DAT 100 4

Aqui os pongo el código del arduino :"DecoMCH2600.ino"
C:
#include <LowPower.h>
int contador = 0; // contara los pulsos recividos
int pulsoini = 0; // para marcar los microsegundos donde empieza un pulso
int pulsodur = 0; // para marcar los microsegundos que dura el pulso
boolean enpulso = 0;  // si estamos en un pulso
int numval = 0;
bool pulsores=0;
int valfin = 0;  // codigo que dan del tren de pulsos
int val = 0;
 
int ledPin1 = 13;  // salida control bit mayor peso
int ledPin2 = 12;  // salida control medio peso
int ledPin3 = 11;  // salida de control de menor peso
int pinerr = 10;   // salida de error para TC_FUNC (pulso bajo pide datos de nuevo)
int pinon = 9;     // salida para chip enable del conmutador
int pinSysOn = 8; // Entrada que nos dice si el equipo está encendido
bool IsSysOn = 1;
int pinCDon = 7; //para apagar el CD cuando no esta seleccionado
int pinRadioOn = 6; //para apagar el CD cuando no esta seleccionado
// Empieza setup **********************************************************
void setup() {
// Serial.begin(115200); //Podemos activar esta y todas las serial si queremos monitorizar valores por serie
  attachInterrupt(digitalPinToInterrupt(3), contar, RISING);
//  Serial.println("Empezando....");
//  Serial.println("");
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(pinerr, OUTPUT);
  pinMode(pinon, OUTPUT);
  pinMode(pinSysOn, INPUT);
  digitalWrite(pinerr, HIGH);
  pinMode(pinCDon, OUTPUT);
  pinMode(pinRadioOn, OUTPUT);
}
// Acaba setup ************************************************************
void loop()
{
 
 pulsodur = micros() - pulsoini;
/* 
Serial.print("Ps: ");
Serial.print(contador);
Serial.print(" NV: ");
Serial.print(numval);
Serial.print(" V");
Serial.println(valfin);
// */
// Detectamos CD   
if (valfin == 7)
  {
  digitalWrite(ledPin1, HIGH);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, HIGH);
  digitalWrite(pinon, LOW);
  digitalWrite(pinCDon, HIGH);
  digitalWrite(pinRadioOn, LOW);
  }
// Detectamos Tuner   
else if (valfin == 14)
  {
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, HIGH);
  digitalWrite(pinon, LOW);
  digitalWrite(pinCDon, LOW);
  digitalWrite(pinRadioOn, HIGH);
  }
// Detectamos Phono 
else if (valfin == 15)
  {
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, HIGH);
  digitalWrite(ledPin3, LOW);
  digitalWrite(pinon, LOW);
  digitalWrite(pinCDon, LOW);
  digitalWrite(pinRadioOn, LOW);
  }
// Detectamos Tape 
else if (valfin == 13)
  {
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, HIGH);
  digitalWrite(ledPin3, HIGH);
  digitalWrite(pinon, LOW);
  digitalWrite(pinCDon, LOW);
  digitalWrite(pinRadioOn, LOW);
  }
// Detectamos DAT   
  else if (valfin == 6)
  {
  digitalWrite(ledPin1, HIGH);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(pinon, LOW);
  digitalWrite(pinCDon, LOW);
  digitalWrite(pinRadioOn, LOW);
  }
// si  hay otro valor es error encenderemos lo que podamos y pasamos un
// pulso bajo a TP_FUNC para que el qeuipo vuelva a mandar el código.
else
  {
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(pinon, HIGH);
  digitalWrite(pinCDon, LOW);
  digitalWrite(pinerr, LOW);
  digitalWrite(pinRadioOn, LOW);
  delay(500);
  digitalWrite(pinerr, HIGH);
  delay(500);
  }
// El siguiente if es porque cuando apagamos el equipo manda solo 8 pulsos que no completan la
// instruccion de estado que manda el equipo y apagamos los led y el arduino para no consumir
IsSysOn = digitalRead(pinSysOn);
if (IsSysOn == 0) 
  {
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(pinon, HIGH);
  digitalWrite(pinCDon, LOW);
  digitalWrite(pinerr, LOW);
  digitalWrite(pinRadioOn, LOW);
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); //lo manda a dormir 8s salvo que detecte una interrupt
  }
 else  digitalWrite(pinerr, HIGH);
}
// Acaba loop*************************************************************************
 
// funcion que detecta y cuenta los pulsos que hay y a la que llamamos desde la int
// cuando detecta bajada en pin3
void contar(){
  IsSysOn = 0; // Lo pongo pues sino tarda 8seg en detectar encendido
  pulsodur = micros() - pulsoini;
  pulsoini = micros();
  enpulso = 1; 
  if (pulsodur > 3500 || pulsodur < 0) // si llevamos ese tiempo sin variar es que no hay pulsos
     {
     pulsores = 0;
     enpulso = 0;
     contador = 0;
     }
  else if (pulsodur > 1500)  pulsores = 0; //los pulsos bajos duran como 1700 microseg
  else if (pulsodur > 1000) pulsores = 1; //los pulsos altos duran como 1200 microseg   
  if (enpulso == 1) contador ++;
 
// Sólo damos valor a los bit a partir del siguiente: 
  if (contador > 12)
      {
      val = val << 1;
      val = val + pulsores;
      }   
// vamos contando pulsos hasta los 16 que forman el byte (contando el 0) 
  if (contador > 15)
      {
        contador = 0;
        numval ++;
        enpulso = 0;
        valfin = val;
        val = 0;       
       }
}

Y con todo esto y algunos amplificadores para las entradas de phono y tape (por si conecto algún equipo con poca potencia de salida) me sale el siguiente esquema:
esquema-selector-final.jpg
Os pongo adjuntos los archivos del circuito y pcb hechos con KiCAD 5.

Si a alguien le sirve y tiene alguna duda no dudeis en preguntar.

Saludos.
 

Adjuntos

  • selector.rar
    72.1 KB · Visitas: 1
Atrás
Arriba