Taster Simmulieren

Moin Leute,
ich würde bei meiner PS2 gerne die beiden Knöpfe vorne mit Hilfe eines ATTiny 45
"drücken". Der Sinn ist, dass ich das Teil dann per Fernbedinung an/aus schalten der resetten kann
bzw. Laufwerk auf/zu...

Habe erstmal das Gehäuse entfernt und vorsichtig die Buttonsignale per Multimeter gemessen:
Anliegende Spannung 3.6V; die Leitung wird bei Knopfdruck auf Masse gelegt; Der Strom der bei dem Vorgang fließt
beträgt laut Multimeter 116µA.

Um jetzt sowohl Buttons als auch Fernbedinung nutzen zu können würde ich parallel zum Button ein Transistor schalten
der das Signal auf Masse zieht sobald der Tiny IR-Code empfängt (siehe Schaltplan unten).

Meine Frage ist nun, ob es einen Transistor gibt, der für solch kleine Ströme gedacht ist, da mir der BC 337-40 dafür etwas zu überdimmensioniert vorkommt.

Edit:
Oder nimmt man für sowas doch eher etwas anderes als nen Transistor?

Schaltplan:

Wie kommst du auf 100k? Das wird viel zu viel sein. Würde das mit 1k mal testen.

Meine Frage ist nun, ob es einen Transistor gibt, der für solch kleine Ströme gedacht ist, da mir der BC 337-40 dafür etwas zu überdimmensioniert vorkommt.

Dem Transistor sollte es völlig egal sein, wieviel Strom durch ihn hindurchfließt. Nur zu viel sollte es nicht sein.

Wie ich auf die 100kOhm komme:
0.000116A die durch den Collector müssen.
Bei einer Gleichstromverstärkung von 10 (für BC 337-40) ergibt sich ein Basisstrom von ~0.000012A
das Ganze verdopple ich damit der Transistor auch sicher durchschaltet -> Ib = 0.000024A

Berechnung des Wiederstandes:
(3.3V - 0.7V)/0.000024A = 108333.333333Ohm -> 100kOhm

Die Kleinleistungstransistoren haben sogar erheblich mehr als 10 Stromverstärkung. 100K sind also garnicht mal so abwegig.
Wobei ich parallel zum Taster Optokoppler nehmen würde. Die CE Strecke des Fototransistors kommt parallel zum Taster - Emitter an Masse. Die IR-LED im Koppler wird dann wie eine ganz normale LED angesteuert. Wobei dort 10 mA oder sogar weniger ausreichen sollten, so das der Tinny das auch ohne Treibertransistor hinbekommt.

Gruß Gerald

@nix_mehr_frei:
Danke für den Tipp.
Das mit nem Opto zu machen klingt interessant. Dann kann ich das sogar Galvanisch trennen.

Mir ist eben sogar noch eingefallen, dass das auch mit Hilfe der Tristate funktionieren könnte
wird aber wahrscheinlich eher keine Praktische Möglichkeit sein.

Wenn Du den Attiny mit Spannung von der PS2 versorgst braucht es keinen Optokoppler. Was willst Du denn isolieren??
Das Schaltbild mit dem Transistori ist OK; den Basiswiderstand würd ich kleiner nehmen zb 4,7k.

Grüße Uwe

@Uwe:
An eine Versorgungsspannung durch die PS2 hatte ich auch schon gedacht das wäre dann natürlich optimal :smiley:
Allerdings konnte ich auf der kleinen Button Platine bisher noch keine eindeutige Versorgungsspannung finden.
Lediglich die Versorgung der LEDs (ca. 12V) und da die sich ändert (bei Farbwechsel ist wieder ne andere aktiv) sind die nicht geeignet :~.

Darum dachte ich mir ich betreib den Tiny einfach mit einer 3V Knopfzelle.

Eventuell schraub ich da mal komplett auf und werfe mal nen Blick auf die Platine von der die Signale kommen.

Also Leute,
es ist volbracht ... habe es mit Hilfe von 2x Optokoppler, 2x 150 Ohm Wiederständen
einer Knopfzelle + Halterung, einem ATTiny und einem IR-Empfänger gelöst.

Funktioniert echt super :smiley: (nie mehr aufstehn um die PS2 aus zu machen :D)

Falls Interesse besteht kann ich die Pläne + den Aktuellen Sketch und paar Fotos hier rein schreiben.

Danke für die Tips :wink:

Kannst gerne mal reinstellen.

Um welche PS2 handelt es sich bei dir? Habe noch die PS2 Slim im Keller. Kann die gerne mal für dich aufmachen und schauen, dass ich für dich eine dauerhaft anliegende Spannung finde. Es geht dir nur um die Versorgungsspannung für den Attiny, richtig? Vermutlich hat das Laufwerk bereits dafür einen Dauerhaften Plus. Ich schau mal nach.

@Serenifly:
Jop es ging um die Versorgung des Tinys über eine Versorgungsleitung der PS2.
Ich hab die FAT, also die alte große.
Wäre cool, wenn du etwas findest, danke für die Mühe ;).

Hier die versprochenen Sachen:

Schaltplan:

Edit:
Ich benutze anders als im Schaltplan andere Optokoppler, konnte die im Programm nicht finden.
Das einzige was bei meinen etwas anders ist, ist das Emitter und Kolektor vertauscht sind.
Bauteilnummer: SF H510A-1

Bilder:

Sketch (sind noch ein paar Bugs drinnen):

#include <avr/sleep.h>

#define PIN_DATA 4
#define PIN_CHAN_POW 1
#define PIN_CHAN_CDD 0

#define NEC_START_MIN 8500
#define NEC_START_MAX 9500
#define NEC_PAUSE_MIN 4000
#define NEC_PAUSE_MAX 5000

#define NEC_BRUST_MIN 480
#define NEC_BRUST_MAX 640

#define NEC_ONE_MIN  480
#define NEC_ONE_MAX  640
#define NEC_ZERO_MIN 1610
#define NEC_ZERO_MAX 1770

#define CODE_ON  0x4DB242FF
#define CODE_OFF 0x4CB342FF
#define CODE_CD  0x4FB042FF

#define TIME_OUT 5000

boolean error;
volatile boolean sleep = true;
volatile unsigned long lastTime;

void setup()
{
  ADCSRA &= ~(1 << ADEN);
  ACSR   |=  (1<< ADC);
  PRR     = 11;
  
  pinMode(PIN_DATA, INPUT);
  pinMode(PIN_CHAN_POW, OUTPUT);
  pinMode(PIN_CHAN_CDD, OUTPUT);
  
  error = false;
  
  enableSleep();
}

void loop()
{
  if(sleep != true)
  {
    if(isNecCode() == true)
    { 
      unsigned long res = getNecCode();
    
      if(error == false)
      {
        if(res == CODE_ON)
          turnOn();
        else if(res == CODE_OFF)
          turnOff();
        else if(res == CODE_CD)
          cdOpenClose();
          
        lastTime = millis();
      }
      else
      {
        error = false;
      }
    }
    
    if(millis() - lastTime >= TIME_OUT)
      enableSleep();
  }
}

//Stellt fest ob es ein NecCode ist
boolean isNecCode()
{
  unsigned long startTime = micros();
  while(digitalRead(PIN_DATA) == LOW);
  startTime = micros() - startTime;
  
  if(startTime > NEC_START_MIN && startTime < NEC_START_MAX)
  {
    startTime = micros();
    while(digitalRead(PIN_DATA) == HIGH);
    startTime = micros() - startTime;
    
    if(startTime > NEC_PAUSE_MIN && startTime < NEC_PAUSE_MAX) 
      return true;
    else
      return false;
  }
  return false;
}

//Entschlüsselt ein einzelnes Bit
unsigned long getBit()
{
  unsigned long startTime = micros();
  while(digitalRead(PIN_DATA) == LOW);
  startTime = micros() - startTime;
  
  if(startTime > NEC_BRUST_MIN && startTime < NEC_BRUST_MAX)
  {
    startTime = micros();
    while(digitalRead(PIN_DATA) == HIGH)
    {
      if(micros() - startTime > NEC_ZERO_MAX) break;
    }
    startTime = micros() - startTime;
    
    if(startTime > NEC_ONE_MIN && startTime < NEC_ONE_MAX) 
      return 1;
    else if(startTime > NEC_ZERO_MIN && startTime < NEC_ZERO_MAX)
      return 0;
    else
      return startTime;
  }
  
  return startTime;
}

//Gibt den NEC Code zurrück
unsigned long getNecCode()
{
  unsigned long result = 0;
  
  for(int i = 0; i < 32; i++)
  {
    unsigned long tempBit = getBit();
    if(tempBit == 1) { 
      result |= (1UL << i);
    } else if(tempBit != 0) {      
      error = true;
      break;
    }
  }   
  
  return result;
}

//Schaltet die Konsole an
void turnOn()
{
  digitalWrite(PIN_CHAN_POW, HIGH);
  delay(100);
  digitalWrite(PIN_CHAN_POW, LOW);
}

//Schaltet die Konsole aus
void turnOff()
{
  digitalWrite(PIN_CHAN_POW, HIGH);
  delay(3000);
  digitalWrite(PIN_CHAN_POW, LOW);
}

//CD-Laufwerk auf/zu
void cdOpenClose()
{
  digitalWrite(PIN_CHAN_CDD, HIGH);
  delay(100);
  digitalWrite(PIN_CHAN_CDD, LOW);
}

//Schlafmodus Funktionen
void enableSleep()
{
  pinMode(PIN_CHAN_POW, INPUT);
  pinMode(PIN_CHAN_CDD, INPUT);
  sleep = true;
  
  interrupts();
  attachInterrupt(0, disableSleep, LOW);
  
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();                  
  sleep_cpu(); 
}

void disableSleep()
{
  detachInterrupt(0);
  noInterrupts();
  
  pinMode(PIN_CHAN_POW, OUTPUT);
  pinMode(PIN_CHAN_CDD, OUTPUT);
  
  sleep_disable();
  
  sleep    = false; 
  lastTime = millis();
}

Sehe gerade, die FAT unterscheidet sich doch stark von der SLIM. Du hast gar kein externes Netzteil. Da hätte ich gesagt, greif die Spannung direkt hinterm PowerJack ab.

Was mir aber auffällt, die FAT hat auch USB Anschlüsse! Somit hättest du dort schonmal direkt 5V zur Verfügung.

Ok, dann werde ich da mal nachschauen.
Danke für den Tip :wink:

Die Spannung düfte auch bei ausgeschalteter PS2 (Standby) weiterhin geschaltet sein. Somit kannste dann auch starten.

Ich hatte mal einen Sketch auf einem Uno, mit dem ich einen PS2 Controller auswerten konnte. So wie ich das in Erinnerung habe, hat dieser nichts mehr gemacht, als Timings abgeglichen. Das wäre vielleicht die Lösung. Werde mal die nächsten Tage das Projekt wieder auskramen. Dann könnte man mit einem kleinnen Attiny einfach den Bus abhorchen und warten, bis eine oder zwei Tasten gleichzeitig für X-Sekunden gedrückt wurden und entsprechend schalten. Dazu müsste ich erst einmal schaun, ob die Kontroller versorgt werden, wenn die PS2 aus ist. Sollte das gehen, werden ich meine PS2 mal so modifizieren.

Cool, falls du das Projekt wiederfindest
könntest du mir den Code zum Auswärten des Busses schicken?

Das könnte man sich so zu nutze machen dass man damit einen
Controller simmuliert xD. Ich spiele gerade mit der Idee
einen Funkkontroller auf Basis eines Originalen zu bauen.

Lesen kein Problem, aber ich glaube nicht, dass du daraus auch einen eigenen Controller erstellen kannst.
Ich habe den Controller ohne PS2 betrieben. Hier mal die ersten Gedankengänge
http://forum.arduino.cc/index.php?topic=216685.15
Sketch habe ich nicht mehr. War auch nicht 100% fertig. Die Teile liegen hier noch immer in einer Kiste verstaut rum.

Danke für den Link ;),
also meine Idee war das Kabel eines Originalen Kontrollers abzuschneiden
und da jeweils eigene Stromversorgung + Sender (& Empfänger) dran zu bauen.

Der Tiny steuert dann den Sender indem er die Signale des Kontrollers abhorcht....
Auf Steckerseite muss es dann halt nur anders herum laufen.

Denke man kann die Lib dahingehend modifizieren, dass sie auch senden kann.
Mal gucken vlt. wirds was. Zuerst werd ich mich wohl an dieModifizierung der Lib setzen,
bevor ich meine Kontroller auseinander schneide.