User:Wordfa/oldphonehack: Difference between revisions
No edit summary |
|||
Line 202: | Line 202: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
This didn't really work, just worked for us to record the sound and play it back on the handset. | |||
We gave up on pygame and used instead.<syntaxhighlight lang="py" line="1"> | |||
#!/usr/bin/env python3 | |||
"""Create a recording with arbitrary duration. | |||
The soundfile module (https://python-soundfile.readthedocs.io/) | |||
has to be installed! | |||
""" | |||
import argparse | |||
import tempfile | |||
import queue | |||
import sys | |||
import sounddevice as sd | |||
import soundfile as sf | |||
import numpy # Make sure NumPy is loaded before it is used in the callback | |||
assert numpy # avoid "imported but unused" message (W0611) | |||
def int_or_str(text): | |||
"""Helper function for argument parsing.""" | |||
try: | |||
return int(text) | |||
except ValueError: | |||
return text | |||
parser = argparse.ArgumentParser(add_help=False) | |||
parser.add_argument( | |||
'-l', '--list-devices', action='store_true', | |||
help='show list of audio devices and exit') | |||
args, remaining = parser.parse_known_args() | |||
if args.list_devices: | |||
print(sd.query_devices()) | |||
parser.exit(0) | |||
parser = argparse.ArgumentParser( | |||
description=__doc__, | |||
formatter_class=argparse.RawDescriptionHelpFormatter, | |||
parents=[parser]) | |||
parser.add_argument( | |||
'filename', nargs='?', metavar='FILENAME', | |||
help='audio file to store recording to') | |||
parser.add_argument( | |||
'-d', '--device', type=int_or_str, | |||
help='input device (numeric ID or substring)') | |||
parser.add_argument( | |||
'-r', '--samplerate', type=int, help='sampling rate') | |||
parser.add_argument( | |||
'-c', '--channels', type=int, default=1, help='number of input channels') | |||
parser.add_argument( | |||
'-t', '--subtype', type=str, help='sound file subtype (e.g. "PCM_24")') | |||
args = parser.parse_args(remaining) | |||
q = queue.Queue() | |||
def callback(indata, frames, time, status): | |||
"""This is called (from a separate thread) for each audio block.""" | |||
</syntaxhighlight>This is our first recording with this code: | |||
[[File:Output-11.11.2024.mp3|thumb]] | |||
== Refs and resources == | == Refs and resources == |
Revision as of 19:52, 11 November 2024
Press #1 For:
Description
From getting your BSN to installing internet in your new home to renting a car, rigid mazes of bureaucratic systems hold us all hostage. In the spirit of collective catharsis 'Press One For' invites you to share and listen to stories of how these systems frustrated you, or how you frustrated them.
Cookbook
Parts Required
USB interface to 3.5mm
https://www.adafruit.com/product/1475
3.5mm Cables
Old phone (T65)
Raspberry Pi
TRS 3.5 Jack x2
Loads of wires
old headphones with a mic (apple earpod works best)
Things we done
- We got one phone from ScrapXL Rotterdam and one from Marktplaats. The first one was a T65
- We took the phone apart and got the speaker to work by connecting the blue and red cables from the phone out to the audio jack to the soundcard to the computer. played show me the body, was good.
- Then we tried the microphone but its a carbon mic and it didnt work. so we atttached a battery and hoped. didnt work.
- We took apart wired headphones that had mic in them to see if we could use the mic from it rather than the carbon mic in the telephone.-> didnt work, headphone cable is TRRS not TRS:
spent a day trying to wire up TRRS to an audio cable, turns out the audio jack was the wrong kind.
then wired it directly to a TRS jack, worked!!!!!!!!!!!!!
then cable managed, looks beautiful now. now we have working speakers and working mic.
This is how you could make it work too (Schema 1)
From the headphones you need to...
Connect th Blue (Ground) to the Sleeve of the TRS jack
Connect the Red (mic) to Pin (Ring) 1 or 2 of the TRS jack
MAKE SURE THE HEADPHONES CONNECTION IS CLOSED!
Next Steps:
We need to work out how to read the keypad input on the raspberrypi. Mark Powers has a snippet of code that supposedly works with this: https://marks.kitchen/blog/rotary_phone_running_linux/
To test our phone we used this GitHub project: https://github.com/ralphcrutzen/PTT-Tafeltjes-Telefoon?tab=readme-ov-file. > This project turns the phone into a math game where a child asks you a times table question and you are supposed to give the correct answer using the rotary keypad. When you dial the answer the py code reads it as 2 separate entires and gives you a Goed zo! if you gave the correct answer.
Fred is translating the code to eng. He also thinks I can't do times tables.
Set up the raspberrypi, named it telephone.(tut here:https://nematicslab.com/how-to-enable-ssh-without-using-a-monitor/)
Fred made me a user(Sevgi) as well and we tested the connections first, adjusted the code accordingly. Fred tested the connections like this (this is the final working version):
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(24, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(25, GPIO.IN, pull_up_down = GPIO.PUD_UP)
while True:
print('-')
if GPIO.input(23):
print('23')
if GPIO.input(25):
print('25')
if GPIO.input(24):
print('24')
Here is how we set up the wires and the raspberry pi:
This wiring worked for us at first, but then we had to put the ground cables in different Rbpi GND's for it to work again.
Here is the eng version of the dutch code: https://pzwiki.wdka.nl/mediadesign/User:Wordfa/oldphonehack/PTT_Tafeltjes_Telefoon
We now reverted back to writing the code Ralph Crutzen's way, using pygame. We pulled this code from: https://github.com/pygame/pygame/blob/main/examples/audiocapture.py
""" pygame.examples.audiocapture
A pygame 2 experiment.
* record sound from a microphone
* play back the recorded sound
"""
import pygame as pg
import time
import wave
from pygame._sdl2 import (
get_audio_device_names,
AudioDevice,
AUDIO_F32,
AUDIO_ALLOW_FORMAT_CHANGE,
)
from pygame._sdl2.mixer import set_post_mix
# sound length (seconds, a float)
SOUNDLEN = 2.0
# sound frequency (in Herz: the number of vibrations per second)
SOUNDFREQ = 1000
# maximal amplitude
MAXAMP = 32767 / 2
# sampling frequency (in Herz: the number of samples per second)
SAMPLINGFREQ = 44100
# the number of channels (1=mono, 2=stereo)
NCHANNELS = 2
pg.mixer.pre_init(44100, 32, 2, 512)
pg.init()
# init_subsystem(INIT_AUDIO)
names = get_audio_device_names(True)
print(names)
sounds = []
sound_chunks = []
def callback(audiodevice, audiomemoryview):
"""This is called in the sound thread.
Note, that the frequency and such you request may not be what you get.
"""
# print(type(audiomemoryview), len(audiomemoryview))
# print(audiodevice)
sound_chunks.append(bytes(audiomemoryview))
def postmix_callback(postmix, audiomemoryview):
"""This is called in the sound thread.
At the end of mixing we get this data.
"""
print(type(audiomemoryview), len(audiomemoryview))
print(postmix)
set_post_mix(postmix_callback)
audio = AudioDevice(
devicename=names[0],
iscapture=True,
frequency=44100,
audioformat=AUDIO_F32,
numchannels=2,
chunksize=512,
allowed_changes=AUDIO_ALLOW_FORMAT_CHANGE,
callback=callback,
)
# start recording.
audio.pause(0)
print(audio)
print(f"recording with '{names[0]}'")
time.sleep(2)
print("Turning data into a pg.mixer.Sound")
sound = pg.mixer.Sound(buffer=b"".join(sound_chunks))
snd = pg.mixer.Sound(sound)
# open new wave file
sfile = wave.open('pure_tone.wav', 'w')
# set the parameters
sfile.setnchannels(NCHANNELS)
# write raw PyGame sound buffer to wave file
sfile.writeframesraw(snd.get_raw())
# close file
sfile.close()
print("playing back recorded sound")
sound.play()
time.sleep(2)
pg.quit()
This didn't really work, just worked for us to record the sound and play it back on the handset.
We gave up on pygame and used instead.
#!/usr/bin/env python3
"""Create a recording with arbitrary duration.
The soundfile module (https://python-soundfile.readthedocs.io/)
has to be installed!
"""
import argparse
import tempfile
import queue
import sys
import sounddevice as sd
import soundfile as sf
import numpy # Make sure NumPy is loaded before it is used in the callback
assert numpy # avoid "imported but unused" message (W0611)
def int_or_str(text):
"""Helper function for argument parsing."""
try:
return int(text)
except ValueError:
return text
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument(
'-l', '--list-devices', action='store_true',
help='show list of audio devices and exit')
args, remaining = parser.parse_known_args()
if args.list_devices:
print(sd.query_devices())
parser.exit(0)
parser = argparse.ArgumentParser(
description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter,
parents=[parser])
parser.add_argument(
'filename', nargs='?', metavar='FILENAME',
help='audio file to store recording to')
parser.add_argument(
'-d', '--device', type=int_or_str,
help='input device (numeric ID or substring)')
parser.add_argument(
'-r', '--samplerate', type=int, help='sampling rate')
parser.add_argument(
'-c', '--channels', type=int, default=1, help='number of input channels')
parser.add_argument(
'-t', '--subtype', type=str, help='sound file subtype (e.g. "PCM_24")')
args = parser.parse_args(remaining)
q = queue.Queue()
def callback(indata, frames, time, status):
"""This is called (from a separate thread) for each audio block."""
This is our first recording with this code:
Refs and resources
Microphone from handset
https://www.youtube.com/watch?v=rIkIkbOw3OQ&t
Rotary Pi
- Really good write up with code:
- https://marks.kitchen/blog/rotary_phone_running_linux/
- Linking Video
- https://www.youtube.com/watch?v=M4eCrctDMEc
Lofi Mic
https://www.youtube.com/watch?v=7gorBkdk8zY
Schematic (v scary)
https://easyeda.com/editor#id=7d0350ec43844219912695cec1a0e156
Rotary MP3 Player
https://www.whizzbizz.com/en/gpo746-t65-rotary-dial-phone-mp3-wav-player
Info on the T65
https://www.cryptomuseum.com/phone/t65/index.htm(there is a wire list here as well)
Carbon Mic
https://www.youtube.com/watch?v=cwPPoVvljOw
https://www.youtube.com/watch?v=pb-Lu2kzKYc&t=221s
Dutch guide on rotary dail
https://github.com/ralphcrutzen/PTT-Tafeltjes-Telefoon?tab=readme-ov-file
Guide on getting Keypad Working (Matrix should be tried)
https://web.archive.org/web/20130919160654/http://www.keesvanweert.nl/blog/?p=1
Weird Stuff
how does a carbon mic work
https://wonderfoon.jimdosite.com/
https://www.youtube.com/@ruudshangout/search?query=t65
Event Rider:
Items Needs
- Table [ ]
- Chair [ ]
- Phone [x]
- Lamp [ ]
- Calendar [ ]
- Forms on table? [ ]
- Assorted Desk Items [ ]
Space Needs
- 2m x 2m (UBIK)
- Power (UBIK)
- Low light preferred
Time Needs
- Async/ All day