星期二, 2月 28, 2017

老電話的旋轉撥號盤

旋轉撥號與按鍵撥號
接收了前輩提供的一個舊型電話的旋轉撥號盤,這種機械結構的裝置雖然可能至少有三、四十年以上的歷史,但還堪用,此回用它接在 RPi 上當做輸入裝置來玩玩。

回顧早期電話系統的旋轉撥號,是使用旋轉撥號盤在局部迴路上送出不同數量的連續脈波信號表示撥號數字,而當今的電話系統的撥號應該皆改進為音頻撥號,使用按鈕鍵送出雙音多頻 (DTMF) 信號為之。

旋轉撥號的電話系統,可能現在需在博物館或電影裡才得一見,其最初的自動交換機和用戶撥號裝置是 Almon Brown Strowger 在十九世紀末時設計的,關於此有個趣聞是據說他原是一位殯葬業者,因為電話接線員竟然是他競爭對手的老婆,並將他顧客的來電轉接給他的競爭對手,促使他構思要發明一個免除人工插線的自動機器,並從此開展新的事業。(參考連結:https://en.wikipedia.org/wiki/Rotary_dial)



動作原理

撥號盤背面組成
歷經改良後的撥號盤,現在背面可見主要由三組開關簧片及數個大小齒輪加上彈簧和調速器等構成。三個開關在靜止時,開關(1):常開,(2)與(3):常閉。(參見撥號盤背面組成照片及手繪撥號盤原理圖)

當正面的旋轉盤經手指撥動時會同步帶動背面中心的大齒輪,附在齒輪上的盤片有突起會先使開關(1)閉合,繼續轉動則使開關(2)放開,保持此狀態直到手指鬆開旋轉盤。

當手指放開後,旋轉盤因彈簧力量拉回,在開關(3)兩隻簧片間有一片蝴蝶盤開始轉動而讓開關(3)重複放開又再閉合的動作,重複次數會隨撥動幅度增加。例如,手指在號碼 1 的位置撥動轉盤到止撥點後放開,撥號盤開始回轉到停止,開關(3)簧片會重複 3 次開合動作,若撥號碼 2 則開關(3)的重複開合會發生 4 次,以此類推。

在每次撥號盤回轉的末期,即開關(3)的最後兩次開合期間,已打開的開關(2)回復閉合,又因為在迴路 A--B 上開關(2)與開關(3)並聯,所以在此迴路上可產生脈波數是開關(3)開合次數 n - 2。

旋轉盤終止回轉,回復到開關(1):開,(2)與(3):閉的靜止狀態。

撥號盤原理

程式測試

一般來說,計算迴路 A--B 的脈波數量即足以指示播號數字了,但觀察迴路 A--C 的狀態可以明確知道每次撥號期間的起始與結束,方便脈波計數。所以,將 A 接 GND,B 和 C各自接在 GPIO 某腳位,在此將 B, C 分別接在 GPIO #38, #37。

class RotaryDial:
    def __init__(self, pinC, pinB):
        self.dial = {'C': pinC, 'B': pinB, 'start': False, 'n': 0}
        self.str = ''
    def eventHandler(self, channel):
        if channel == self.dial['C']:
            time.sleep(0.01)
            if GPIO.input(self.dial['C']):
                self.dial['start'] = False
                print 'dial number',self.dial['n'] % 10
                self.str += `self.dial['n']%10`
            elif not self.dial['start']:
                self.dial['start'] = True
                self.dial['n'] = 0
                print 'dial cycle start'
            else:
                print '.'
        elif channel == self.dial['B']:
            self.dial['n'] += 1
            print '+'
    def clear(self):
        self.str = ''
    def test(self):
        GPIO.setwarnings(False)
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(self.dial['C'], GPIO.IN, GPIO.PUD_UP)
        GPIO.setup(self.dial['B'], GPIO.IN, GPIO.PUD_UP)
        GPIO.add_event_detect(self.dial['C'], GPIO.BOTH, self.eventHandler, 100)
        GPIO.add_event_detect(self.dial['B'], GPIO.RISING, self.eventHandler, 100)
        lcd = LCD12864B(0,0)
        lcd.reset()
        lcd.display(0,0, "Rotary Dial...")
        n = 0
        try:
            while True:
                if n != len(self.str):
                    n = len(self.str)
                    print self.str
                    lcd.display(1,0, self.str)
        except KeyboardInterrupt:
            GPIO.cleanup()
            lcd.close()
# test the rotary dial
d = RotaryDial(37,38)
d.test()


測試程式將撥號輸出至 LCD 好方便觀察,如影片。

2 則留言:

  1. 請問老式轉盤話機可以外接此機構而能撥打電話嗎?

    回覆刪除
    回覆
    1. 本文僅嘗試探索舊式電話撥號盤的原理,並無作用撥打電話。

      刪除