Mudanças entre as edições de "PVE-500"

De Garoa Hacker Clube
Ir para navegação Ir para pesquisar
 
(10 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 3: Linha 3:
 
Veja uma foto aqui: http://cfs7.tistory.com/image/33/tistory/2008/07/05/08/20/486eb038c97da
 
Veja uma foto aqui: http://cfs7.tistory.com/image/33/tistory/2008/07/05/08/20/486eb038c97da
   
Eu (Juca) e o Leandro Pereira abrimos pra ver o que tem dentro. Descobrimos que o bicho tem 2 processadores Z80 e duas EPROMS de 32kb cada. O controle remoto dos video cassetes é feito via conexões RS422. A EDL (edit decision list) gerada em uma sessão de edição de vídeo pode ser salva em um arquivo de computador por meio de uma interface RS232.
+
Eu (Juca) e o Leandro Pereira abrimos pra ver o que tem dentro. Descobrimos que o bicho tem 2 processadores Z80 e duas EPROMS (uma de 64kb para a CPU principal e uma de 32kb para a cpu secundária). O controle remoto dos video cassetes é feito via conexões RS422. A EDL (edit decision list) gerada em uma sessão de edição de vídeo pode ser salva em um arquivo de computador por meio de uma interface RS232.
   
O painel tem botoes redondos para edição de timestamp, que são bem bacanas. Ficamos com a idéia fixa de hackear esse aparelho pra virar um jogo de PONG :-D
+
O painel tem botões redondos para edição de timestamp, que são bem bacanas. Ficamos com a idéia fixa de hackear esse aparelho pra virar um jogo de PONG :-D
   
 
Mapeei a pinagem do conector que liga a placa-mãe ao painel de leds de 7 segmentos (temos 3 grupos de 8 digitos cada e um pequeno de 3 digitos). Segue abaixo as minhas anotações, uma foto, e um código de arduino pra controlar esse painel.
 
Mapeei a pinagem do conector que liga a placa-mãe ao painel de leds de 7 segmentos (temos 3 grupos de 8 digitos cada e um pequeno de 3 digitos). Segue abaixo as minhas anotações, uma foto, e um código de arduino pra controlar esse painel.
  +
  +
== emulação ==
  +
  +
Em 19/Jan/2014 eu fiz o dump das duas EPROMs e criei um esqueleto de driver para o MESS. Arranjei também o manual de serviço do equipamento.
  +
  +
O driver experimental (não funciona ainda) foi incorporado ao release 0.153 do MESS em 07/Abr/2014.
  +
  +
Ver também: [[UVW-1200]]
  +
  +
== placa-mãe ==
  +
* [[PVE500/pcb]]
   
 
== controle do painel de 7 segmentos pelo arduino ==
 
== controle do painel de 7 segmentos pelo arduino ==
Linha 110: Linha 121:
   
 
=== TECLADO ===
 
=== TECLADO ===
  +
Na madrugada de 23 para 24 de Março de 2012, Eu (Juca) e o Victor Scattone trabalhamos no mapeamento da pinagem de leitura da matriz de teclas do teclado, descrita abaixo.
  +
 
====layout====
 
====layout====
   
  +
A tabela abaixo representa a configuração da matrix do teclado.
* P1
 
  +
* P2
 
  +
Os números da primeira coluna indicam os pinos de seleção de linha do flat-cable.
* FROM TO
 
  +
* A/B
 
  +
Os números na última linha indicam os pinos de leitura do status de cada coluna no flat-cable.
* TRANS
 
  +
* ASMBLY
 
  +
{| class="wikitable" style="text-align: center;"
* V
 
  +
| 7 || ENTRY || || REC || EDIT || PLAY_DIREITA || STILL_DIREITA || REW_DIREITA || FF_DIREITA
* A1
 
  +
|-
* A2
 
  +
| 8 || ENTRY || MENOS || MAIS || IN_ESQUERDA || OUT_ESQUERDA || GO_TO || IN_DIREITA || OUT_DIREITA
* REC
 
  +
|-
* EDIT
 
  +
| 9 || ENTRY || PLAY_ESQUERDA || STILL_ESQUERDA || REW_ESQUERDA || FF_ESQUERDA || PREVIEW (S30) || AUTO_EDIT (S31) || RVW/JUMP
* PLAY_ESQUERDA
 
  +
|-
* STILL_ESQUERDA
 
  +
| 10 || ENTRY || A1 || V || ASMBLY || A2 || AUDIO_SPLIT (S16) || LAST_EDIT (S19) || ALL_STOP
* REW_ESQUERDA
 
  +
|-
* FF_ESQUERDA
 
  +
| 11 || ENTRY || || || P1 || P2 || FROM_TO || A/B || TRANS
* AUDIO SPLIT
 
  +
|-
* MENOS
 
  +
| || 20 || 21 || 22 || 23 || 24 || 25 || 26 || 27
* MAIS
 
  +
|}
* LAST EDIT
 
  +
* PLAY_DIREITA
 
  +
==== código arduino para leitura do teclado ====
* STILL_DIREITA
 
  +
* REW_DIREITA
 
  +
'''Este código ainda não funciona completamente'''
* FF_DIREITA
 
  +
* IN_esquerda
 
  +
<pre>
* OUT_esquerda
 
  +
// Este código está lançado ao domínio público
* GOTO
 
  +
* IN_direita
 
  +
#include <stdarg.h>
* OUT_direita
 
  +
void p(char *fmt, ... ){
* ENTRY
 
  +
char tmp[128]; // resulting string limited to 128 chars
* PREVIEW
 
  +
va_list args;
* AUTO EDIT
 
  +
va_start (args, fmt );
* RVM/JUMP
 
  +
vsnprintf(tmp, 128, fmt, args);
* ALL STOP
 
  +
va_end (args);
  +
Serial.print(tmp);
  +
}
  +
  +
int linhas[5] = {2,3,4,5,6}; //pinos 7, 8, 9, 10, 11 do flat-cable
  +
int colunas[7] = {7,8,9,10,11,12,13}; //pinos 21, 22, 23, 24, 25, 26, 27 do flat-cable
  +
//estou por enquanto ignorando o pino 20 (tecla ENTRY) por falta de pinos no arduino.
  +
  +
boolean keyboard[5][7];
  +
char* tecla[5][7]={{"---", "REC", "EDIT", "PLAY_DIR", "STILL_DIR", "REW_DIR", "FF_DIR"},
  +
{"MENOS", "MAIS", "IN_ESQ", "OUT_ESQ", "GO_TO", "IN_DIR", "OUT_DIR"},
  +
{"PLAY_ESQ", "STILL_ESQ", "REW_ESQ", "FF_ESQ", "PREVIEW", "AUTO_EDIT", "RVW/JUMP"},
  +
{"A1", "V", "ASMBLY", "A2", "AUDIO_SPLIT", "LAST_EDIT", "ALL_STOP"},
  +
{"---", "---", "P1", "P2", "FROM_TO", "A/B", "TRANS"}
  +
};
  +
  +
void setup(){
  +
Serial.begin(9600);
  +
int l,c;
  +
for (l=0;l<5;l++){
  +
for (c=0;c<7;c++){
  +
keyboard[l][c] = false;
  +
}
  +
}
  +
  +
for(l=0;l<5;l++){
  +
pinMode(linhas[l], OUTPUT);
  +
}
  +
  +
for (c=0;c<7;c++){
  +
pinMode(colunas[c], INPUT);
  +
}
  +
  +
}
  +
  +
void loop(){
  +
int l, c, i;
  +
for (l=0; l<5; l++){
  +
for (c=6; c<7; c++){
  +
//AQUI TEMOS UM PROBLEMA!
  +
// Estou lendo apenas uma linha corretamente.
  +
// Se eu mudar a linha acima para o loop for fazer a leitura de múltiplas linhas do teclado,
  +
// a leitura não funciona direito, ainda não sei bem por que.
  +
delay(10);
  +
//lendo linha l
  +
for (i=0; i<5; i++){
  +
digitalWrite(linhas[i], i==l ? HIGH : LOW);
  +
}
  +
delay(10);
  +
if (digitalRead(colunas[c]) == HIGH){
  +
if (keyboard[l][c]==false){
  +
p("KEY_DOWN (%d,%d) %s\n", l, c, tecla[l][c]);
  +
keyboard[l][c] = true;
  +
}
  +
} else {
  +
if (keyboard[l][c]==true){
  +
p("KEY_UP (%d,%d)\n", l, c);
  +
keyboard[l][c] = false;
  +
}
  +
}
  +
}
  +
}
  +
}
  +
</pre>
  +
  +
[[categoria:engenharia reversa]]

Edição atual tal como às 20h09min de 12 de setembro de 2020

O Garoa recebeu um Sony PVE-500 de doação. Trata-se de um painel de controle remoto para edição de video.

Veja uma foto aqui: http://cfs7.tistory.com/image/33/tistory/2008/07/05/08/20/486eb038c97da

Eu (Juca) e o Leandro Pereira abrimos pra ver o que tem dentro. Descobrimos que o bicho tem 2 processadores Z80 e duas EPROMS (uma de 64kb para a CPU principal e uma de 32kb para a cpu secundária). O controle remoto dos video cassetes é feito via conexões RS422. A EDL (edit decision list) gerada em uma sessão de edição de vídeo pode ser salva em um arquivo de computador por meio de uma interface RS232.

O painel tem botões redondos para edição de timestamp, que são bem bacanas. Ficamos com a idéia fixa de hackear esse aparelho pra virar um jogo de PONG :-D

Mapeei a pinagem do conector que liga a placa-mãe ao painel de leds de 7 segmentos (temos 3 grupos de 8 digitos cada e um pequeno de 3 digitos). Segue abaixo as minhas anotações, uma foto, e um código de arduino pra controlar esse painel.

emulação

Em 19/Jan/2014 eu fiz o dump das duas EPROMs e criei um esqueleto de driver para o MESS. Arranjei também o manual de serviço do equipamento.

O driver experimental (não funciona ainda) foi incorporado ao release 0.153 do MESS em 07/Abr/2014.

Ver também: UVW-1200

placa-mãe

controle do painel de 7 segmentos pelo arduino

const int num_dig=5;
int seg[7] = {2,3,4,5,6,7,8};
int comum[num_dig] = {9,10,11,12,13};

void setup(){
  int i;
  for (i=0; i<num_dig; i++){
    pinMode(comum[i], OUTPUT);
  }
  for (i=0; i<7; i++){
    pinMode(seg[i], OUTPUT);
  }
}

int digito=0;
int count=0;
int _A=0b1111011;
int _a=0b1000011;
int _b=0b1010111;
int _C=0b0110110;
int _c=0b1000110;
int _d=0b1001111;
int _e=0b1110110;
int _f=0b1110010;
int _G=0b1110111;
int _g=0b1111101;
int _H=0b1011011;
int _h=0b1010011;
int _i=0b0000001;
int _j=0b0001111;
int _k=0b1010010;
int _L=0b0010110;
int _l=0b0010010;
int _r=0b1000010;
int _o=0b1000111;
int _U=0b0011111;
int _u=0b0000111;
int _=0;

const int txtlen = 22;
int texto[txtlen] = {_G, _a, _r, _o, _a, _, _H, _a, _c, _k, _e, _r, _, _C, _l, _u, _b, _e, _, _, _, _};

void loop(){
  int i;

  for (digito=0; digito<num_dig; digito++){
    for (i=0; i<num_dig; i++){
      digitalWrite(comum[i], i==digito ? HIGH : LOW);
    }
  
    for (i=0; i<7; i++){
      digitalWrite(seg[i], (texto[digito]>>i)%2==1 ? LOW : HIGH);
    }
    delay(2);
  }
  
  count++;
  if (count>30){
    count=0;
    int tmp = texto[0];
    for (i=0;i<txtlen-1;i++){
      texto[i]=texto[i+1];
    }
    texto[txtlen-1]=tmp;
  }
}

foto

TODO

anotações - pinagem dos displays de 7seg

8seg latch-out  latch-in flat
1    16 O6      17 D6    30     
2    15 O5      14 D5    32
3     6 O2       7 D2    31
4    xx xx       
13    5 O1       4 D1    29
14    9 O3       8 D3    33
15   19 O7      18 D7    28
16   12 O4      13 D4    34
LE   ------------------- 38
GND -------------------- 49 e 50
VCC -------------------- 1, 2 e 3

ano/cat
comum   flat
0       11
1       10
2       09
3       08
4       07
5       06
6       05
7       04


TECLADO

Na madrugada de 23 para 24 de Março de 2012, Eu (Juca) e o Victor Scattone trabalhamos no mapeamento da pinagem de leitura da matriz de teclas do teclado, descrita abaixo.

layout

A tabela abaixo representa a configuração da matrix do teclado.

Os números da primeira coluna indicam os pinos de seleção de linha do flat-cable.

Os números na última linha indicam os pinos de leitura do status de cada coluna no flat-cable.

7 ENTRY REC EDIT PLAY_DIREITA STILL_DIREITA REW_DIREITA FF_DIREITA
8 ENTRY MENOS MAIS IN_ESQUERDA OUT_ESQUERDA GO_TO IN_DIREITA OUT_DIREITA
9 ENTRY PLAY_ESQUERDA STILL_ESQUERDA REW_ESQUERDA FF_ESQUERDA PREVIEW (S30) AUTO_EDIT (S31) RVW/JUMP
10 ENTRY A1 V ASMBLY A2 AUDIO_SPLIT (S16) LAST_EDIT (S19) ALL_STOP
11 ENTRY P1 P2 FROM_TO A/B TRANS
20 21 22 23 24 25 26 27

código arduino para leitura do teclado

Este código ainda não funciona completamente

// Este código está lançado ao domínio público

#include <stdarg.h>
void p(char *fmt, ... ){
        char tmp[128]; // resulting string limited to 128 chars
        va_list args;
        va_start (args, fmt );
        vsnprintf(tmp, 128, fmt, args);
        va_end (args);
        Serial.print(tmp);
}

int linhas[5] = {2,3,4,5,6}; //pinos 7, 8, 9, 10, 11 do flat-cable
int colunas[7] = {7,8,9,10,11,12,13}; //pinos 21, 22, 23, 24, 25, 26, 27 do flat-cable
//estou por enquanto ignorando o pino 20 (tecla ENTRY) por falta de pinos no arduino.

boolean keyboard[5][7];
char* tecla[5][7]={{"---", "REC", "EDIT", "PLAY_DIR", "STILL_DIR", "REW_DIR", "FF_DIR"},
{"MENOS", "MAIS", "IN_ESQ", "OUT_ESQ", "GO_TO", "IN_DIR", "OUT_DIR"},
{"PLAY_ESQ", "STILL_ESQ", "REW_ESQ", "FF_ESQ", "PREVIEW", "AUTO_EDIT", "RVW/JUMP"},
{"A1", "V", "ASMBLY", "A2", "AUDIO_SPLIT", "LAST_EDIT", "ALL_STOP"},
{"---", "---", "P1", "P2", "FROM_TO", "A/B", "TRANS"}
};

void setup(){
  Serial.begin(9600);
  int l,c;
  for (l=0;l<5;l++){
    for (c=0;c<7;c++){
      keyboard[l][c] = false;
    }
  }

  for(l=0;l<5;l++){
    pinMode(linhas[l], OUTPUT);
  }

  for (c=0;c<7;c++){
    pinMode(colunas[c], INPUT);
  }
  
}

void loop(){
  int l, c, i;
  for (l=0; l<5; l++){
    for (c=6; c<7; c++){
 //AQUI TEMOS UM PROBLEMA!
 // Estou lendo apenas uma linha corretamente.
 // Se eu mudar a linha acima para o loop for fazer a leitura de múltiplas linhas do teclado,
 //  a leitura não funciona direito, ainda não sei bem por que.
      delay(10);
      //lendo linha l
      for (i=0; i<5; i++){
        digitalWrite(linhas[i], i==l ? HIGH : LOW);
      }
      delay(10);
      if (digitalRead(colunas[c]) == HIGH){
        if (keyboard[l][c]==false){
          p("KEY_DOWN (%d,%d)   %s\n", l, c, tecla[l][c]);
          keyboard[l][c] = true;
        } 
      } else {
        if (keyboard[l][c]==true){
          p("KEY_UP (%d,%d)\n", l, c);
          keyboard[l][c] = false;
        }
      }
    }    
  }
}