Difference between revisions of "Coinvox 22"
(added snippets of information everywhere. added image. small typo fixes) |
m (status updated) |
||
(6 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
{{Project | {{Project | ||
− | |State= | + | |Featured=No |
+ | |State=Stalled | ||
|Members=xopr | |Members=xopr | ||
|Description=Get an old payphone to work again | |Description=Get an old payphone to work again | ||
+ | |GitHub=coinvox | ||
+ | |Picture=Coinvox_22_front.jpg | ||
}} | }} | ||
− | [[Image:Coinvox 22 | + | [[Image:Coinvox 22 inside.jpg|thumb|185px|Coinvox 22 looks complete but is stripped empty :(]] |
− | |||
[[Image:Coinvox 22 keypad.jpg|thumb|185px|Keypad I<sup>2</sup>C interfaced]] | [[Image:Coinvox 22 keypad.jpg|thumb|185px|Keypad I<sup>2</sup>C interfaced]] | ||
== synopsis == | == synopsis == | ||
Line 12: | Line 14: | ||
No coin mech, no ringer, no phone. | No coin mech, no ringer, no phone. | ||
+ | |||
+ | == update == | ||
+ | Got contacted by Jaytaph who was working on it as well. [https://gist.github.com/jaytaph/15aa92c4e2e8c6a1c5398f97322e2430 He wrote a snippet] that actually looks better than the hacky code I ([[User:Xopr|xopr]]) wrote last october. | ||
== inside == | == inside == | ||
Line 81: | Line 86: | ||
! col4 (P6) | ! col4 (P6) | ||
|- | |- | ||
− | ! row1 ( | + | ! row1 (P0) |
| n/c | | n/c | ||
| {{k|1}} | | {{k|1}} | ||
Line 106: | Line 111: | ||
|} | |} | ||
− | To read out the keypad (on interrupt pullup), set one row low and read the column nibble. Repeat for each row. Low bit means key pressed. | + | To read out the keypad (on interrupt pullup), set one row low and read the column nibble. Repeat for each row. Low bit means key pressed. Theoretically, 1178 key combinations (up to 4 simultaneous keys) can be detected. Key ghosting occurs when pressing keys in the shape of an L (including the 'corner' key), and can be detected if more than one row ''and'' more than one column is low when scanning individual lines. |
Text on the PCB: | Text on the PCB: | ||
Line 117: | Line 122: | ||
:Version.mec: A | :Version.mec: A | ||
:Date fab : 02/95 | :Date fab : 02/95 | ||
+ | |||
+ | == keypad ghosting == | ||
+ | Since the keypad is a simple matrix, pressing multiple keys can introduce key ghosting (getting positive result on a key that isn't pressed). | ||
+ | |||
+ | A simple explanation: If '1', '2' and '4' are pressed together, and the rows are scanned by setting each column low for a moment, row 0 and 1 will be pulled low in both the iteration of column 0 and 1 being low. Column 1 low brings a special scenario: row 0 is pulled low by pressing '2' and therefore ''column'' 0 will be pulled low as well by the pressing of '1'. By having '4' pressed and column 0 low, row 1 will also be pulled low, which in the case of the iteration of column 1, '5' will be marked as pressed which it isn't. | ||
+ | |||
+ | Here is a javascript snippet (can be run in a browser's console) that determines the allowed key combination before ghosting occurs. Estimated is that 'corners' in key combination trigger ghosting: | ||
+ | <div class="mw-collapsible mw-collapsed" id="mw-customcollapsible-ghostingtest_js"> | ||
+ | <div class="mw-customtoggle-ghostingtest_js mw-code">Click here to view the source code</div> | ||
+ | <pre class="mw-collapsible-content"> | ||
+ | // See keypad as 4x4 = 16 bit matrix | ||
+ | var allowedKeys = []; | ||
+ | for ( var keys = 1; keys < (1<<16); keys++ ) | ||
+ | { | ||
+ | var flaggedBits = 0b0000; | ||
+ | var excludedBits = 0b0000; | ||
+ | var ghosting = false; | ||
+ | |||
+ | // Disallow 2 keys since they are missing on the designated phone keypad | ||
+ | if ( keys & 0b1000100000000000 ) | ||
+ | ghosting = true; | ||
+ | |||
+ | for ( var nibbleIdx = 0; nibbleIdx < 4; nibbleIdx++ ) | ||
+ | { | ||
+ | var nibble = (keys >>> (nibbleIdx * 4)) & 0xf; | ||
+ | |||
+ | // Current nibble & exclude overlap: ghosting | ||
+ | if ( nibble & excludedBits ) | ||
+ | { | ||
+ | ghosting = true; | ||
+ | continue; | ||
+ | } | ||
+ | |||
+ | if ( nibble === 0b0001 || nibble === 0b0010 || nibble === 0b0100 || nibble === 0b1000 ) | ||
+ | { | ||
+ | // Single bit: flag | ||
+ | flaggedBits |= nibble; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | // Multi bit: exclude | ||
+ | excludedBits |= nibble; | ||
+ | } | ||
+ | |||
+ | // Flag bits already processed | ||
+ | //flaggedBits |= nibble; | ||
+ | |||
+ | if ( ghosting ) | ||
+ | continue; | ||
+ | } | ||
+ | |||
+ | // flag & exclude overlap: ghosting | ||
+ | if ( flaggedBits & excludedBits ) | ||
+ | ghosting = true; | ||
+ | |||
+ | // No ghosting? Add this combination | ||
+ | if ( !ghosting ) | ||
+ | allowedKeys.push( keys ); | ||
+ | } | ||
+ | |||
+ | // Show amount of allowed keys and its 'int' value | ||
+ | console.log( allowedKeys.length, allowedKeys ) | ||
+ | allowedKeys.forEach( function( _k ) | ||
+ | { | ||
+ | // display a keypad matrix of pressed keys '*' for all 821 allowed combinations | ||
+ | for ( var nibbleIdx = 0; nibbleIdx < 4; nibbleIdx++ ) | ||
+ | { | ||
+ | var nibble = ((_k >>> (nibbleIdx * 4)) & 0xf).toString( 2 ); | ||
+ | nibble = ("000" + nibble).substr( -4 ).replace( /0/g, " " ).replace( /1/g, "*" ); | ||
+ | console.log( nibbleIdx, nibble ); | ||
+ | } | ||
+ | console.log( "---" ); | ||
+ | } ); | ||
+ | </pre> | ||
+ | </div> | ||
== plans == | == plans == | ||
Line 130: | Line 210: | ||
* find an old mechanical phone bell | * find an old mechanical phone bell | ||
* <s>identify ICs, obtain datasheet, determine pinouts</s> Success! | * <s>identify ICs, obtain datasheet, determine pinouts</s> Success! | ||
+ | |||
+ | Location: at [[Location::User:xopr|xopr's]] |
Latest revision as of 11:31, 24 May 2017
Project: Coinvox 22 | |
---|---|
Featured: | No |
State | Stalled |
Members | xopr |
GitHub | coinvox |
Description | Get an old payphone to work again |
Picture | |
Contents
synopsis
I got myself a Coinvox 22, reasonably cheap. The downside is: the inner workings have been stripped out, so it's just a metal box with keypad and display, a handset with hook-switch and a small transformer.
No coin mech, no ringer, no phone.
update
Got contacted by Jaytaph who was working on it as well. He wrote a snippet that actually looks better than the hacky code I (xopr) wrote last october.
inside
handset / hook-switch
The handset is tested and is in good shape. It is connected to a PCB.
- 2 different reed switches
- 4 coils
- 2 3-pin SOT 23 (SMD) diodes(?) (D1, D2: A7 P 45)
J1 Handset connector. Layout is (male) PCB connector side.
|o spk |o| mic - |o| mic + |o spk
J2 Connector which ought to go into the main PCB. Layout is (female) connector side.
mic+ 2 |oo| 1 spk spk 4 |oo| 3 mic- NC1 6 |oo |5 n/c NO1 8 |oo| 7 P1 P2 10|oo| 9 NO2
Note: SW1 switches first (about 2mm) when hanging up, probably used for muting the microphone.
keypad / display
- IC2: PCF8576T (Universal LCD driver for low multiplex rates, I2C address 38h)
- IC3: PCF8574T (Remote 8-bit I/O expander for I2C-bus with interrupt)
- Addresses tied to ground; address 20h.
J Display/keypad connector. Layout is (female) connector side. Int needs pullup, and print is found working at 5V.
SCL 2 |oo| 1 SDA 4 |oo| 3 GND 6 |oo |5 VCC 8 |oo| 7 Int 10|oo| 9
Display
- 8 × 14 segment display, characters are filled from the right
- 52 pins with the only the outer 9 connected (36)
- uses 4 back-plane mode (all corners)
Segment layout. Note that bit 3 is not used, which aligns the characters to 16 bit.
15 _________ | \11 | / | 2| \ |7 /6 |14 | \ | / | 10---- -----5 | / | \ | 1| / | \4 |13 | /9 |8 \ | __________ 0 o12 bit 3: not used
Keypad
col1 (P7) | col2 (P4) | col3 (P5) | col4 (P6) | |
---|---|---|---|---|
row1 (P0) | n/c | 1 | 2 | 3 |
row2 (P1) | n/c | 4 | 5 | 6 |
row3 (P2) | N | 7 | 8 | 9 |
row4 (P3) | Vol | * | 0 | # |
To read out the keypad (on interrupt pullup), set one row low and read the column nibble. Repeat for each row. Low bit means key pressed. Theoretically, 1178 key combinations (up to 4 simultaneous keys) can be detected. Key ghosting occurs when pressing keys in the shape of an L (including the 'corner' key), and can be detected if more than one row and more than one column is low when scanning individual lines.
Text on the PCB:
- LGCO-CH BTC15 DESKII
- 4 431 4223 0 22
Text found on some stickers:
- Landis & GYR
- 412197580 A
- Version.mec: A
- Date fab : 02/95
keypad ghosting
Since the keypad is a simple matrix, pressing multiple keys can introduce key ghosting (getting positive result on a key that isn't pressed).
A simple explanation: If '1', '2' and '4' are pressed together, and the rows are scanned by setting each column low for a moment, row 0 and 1 will be pulled low in both the iteration of column 0 and 1 being low. Column 1 low brings a special scenario: row 0 is pulled low by pressing '2' and therefore column 0 will be pulled low as well by the pressing of '1'. By having '4' pressed and column 0 low, row 1 will also be pulled low, which in the case of the iteration of column 1, '5' will be marked as pressed which it isn't.
Here is a javascript snippet (can be run in a browser's console) that determines the allowed key combination before ghosting occurs. Estimated is that 'corners' in key combination trigger ghosting:
// See keypad as 4x4 = 16 bit matrix var allowedKeys = []; for ( var keys = 1; keys < (1<<16); keys++ ) { var flaggedBits = 0b0000; var excludedBits = 0b0000; var ghosting = false; // Disallow 2 keys since they are missing on the designated phone keypad if ( keys & 0b1000100000000000 ) ghosting = true; for ( var nibbleIdx = 0; nibbleIdx < 4; nibbleIdx++ ) { var nibble = (keys >>> (nibbleIdx * 4)) & 0xf; // Current nibble & exclude overlap: ghosting if ( nibble & excludedBits ) { ghosting = true; continue; } if ( nibble === 0b0001 || nibble === 0b0010 || nibble === 0b0100 || nibble === 0b1000 ) { // Single bit: flag flaggedBits |= nibble; } else { // Multi bit: exclude excludedBits |= nibble; } // Flag bits already processed //flaggedBits |= nibble; if ( ghosting ) continue; } // flag & exclude overlap: ghosting if ( flaggedBits & excludedBits ) ghosting = true; // No ghosting? Add this combination if ( !ghosting ) allowedKeys.push( keys ); } // Show amount of allowed keys and its 'int' value console.log( allowedKeys.length, allowedKeys ) allowedKeys.forEach( function( _k ) { // display a keypad matrix of pressed keys '*' for all 821 allowed combinations for ( var nibbleIdx = 0; nibbleIdx < 4; nibbleIdx++ ) { var nibble = ((_k >>> (nibbleIdx * 4)) & 0xf).toString( 2 ); nibble = ("000" + nibble).substr( -4 ).replace( /0/g, " " ).replace( /1/g, "*" ); console.log( nibbleIdx, nibble ); } console.log( "---" ); } );
plans
- upload reference material of the Coinvox phones (hacktic, 't klaphek, telephone museums ([1][2][3][4][5][6][7])
- experiment with my (front fed) coin mech (or look for a top fed mech that fits)
- experiment with a cisco phone (see if I can use the softkeys and the AUX port to read quarters or just Euro coins
- connect an ATA to an old phone
todo
- upload display/keypad initialization commands
- write a library for the display/keypad (fix the hacky code)
- see if the serial protocol of a Cisco phone is of any use
- find an old mechanical phone bell
identify ICs, obtain datasheet, determine pinoutsSuccess!
Location: at xopr's