PVE-500
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; } } } } }