Arduino

Винтажный радиоприемник со шкалой и передачами времен Второй мировой войны

Цель этого проекта заключается в том, чтобы сделать из старого радио рабочее устройство. Но не просто радиоприемник, а, чтобы он воспроизводил радиопередачи тех лет.
Давайте посмотрим небольшое видео.

Для реализации проекта мастер будет использовать Rasberry Pi. Однако у него есть свои недостатки, в данном случае это отсутствие звуковой платы и аналоговых входов. Для решения проблемы он будет использовать усилитель Adafruit I2S 3W класса D — MAX98357A, и MCP 3002.
Еще одна проблема заключается в том, что если некорректно выключить Pi, то при следующем включении он может не загрузится. Эта проблема решается установкой модуля On / Off Shim.
Инструменты и материалы:
-Старый радиоприемник;
-Наждачная бумага;
-Шеллак;
-Термоусадочная трубка;
-Raspberry Pi Zero;
-Звуковой монофонический I2S модуль;
-Модуль On / Off Shim;
-Динамик;
-Блок питания;
-Микросхема MPC3002;
-Светодиод;
-Резистор 270R;
-Кнопка выключения;
Шаг первый: радио
Радио мастер приобрел на ebay за 15 фунтов стерлингов.

Разобрал его. Спроектировал и напечатал на 3D-принтере новое шасси.

Шаг второй: ремонт корпуса
Дальше нужно было отреставрировать деревянный корпус. Сначала мастер попытался просто очистить его и сохранить старый вид, но покрытие было в таком состоянии, что пришлось зачищать корпус полностью.
Лак и старую краску он снял, используя средство Nitromors. Затем отшлифовал корпус наждачной бумагой.
Отслоившиеся куски шпона подклеил с помощью столярного клея. Сколы заполнил клеем с опилками. После высыхания отшлифовал корпус и покрыл отделочным материалом. Ткань закрывающую динамик мастер снял и замочил на ночь в моющем средстве. Затем постирал и прополоскал.

Металлические детали очистил с помощью ультразвукового очистителя. Шкалу отполировал.

Шаг третий: Raspberry Pi Zero
Дальше он устанавливает Raspberry и i2S. По его словам, использования этого модуля лучшее решение в данном случае.

Шаг четвертый: шкала
Старую шкалу мастер снял и отсканировал. Обработал изображение в графической программе и заменил частоты на года с 1939 по 1945. Распечатал изображение. Также заменил старое пластиковое стекло.

Шаг пятый: АЦП
Как уже говорилось мастер установил MPC3002, который преобразует аналоговый вход в 10-битное значение.
В сети много кодов для MPC3008, который является 4-канальным устройством, в отличии от двухканального MPC3002. Но мастер нашел код и на MPC3002. Скачать его можно здесь.
В данном случае один канал для громкости, а другой для выбора даты.

Шаг шестой: питание
Для включения и отключения устройства мастер использует в схеме Pimoroni ON / OFF. Для включения нужно один раз нажать кнопку, для безопасного выключения нажать и подержать некоторое время.
Кнопку мастер установил в задней части корпуса. Установил светодиод для индикации работы устройства.
Для питания устройства мастер использует повербанк.

Шаг седьмой: сборка
После установки всех деталей устройство было помещено в корпус. Установлены ручки.

Шаг восьмой: код и звуковые файлы
Мастер использует файлы MP3. Таких файлов времен Второй мировой много на сайте Archive.org.
С сайта были скопированы и перенесены в каталоги PI в основном новости тех лет.

Для работы устройства нужно установить проигрыватель mpg123, а также код. В конфигурации должны быть включены i2s и SPI. Код мастер поместил в каталог / home / pi / volume /
#!/usr/bin/env python
# WW2 Radio — software to read MCP3002 ADC and convert to volume and year adjustment
# Ouput via i2S amplifier 20/10/2018 — Ajax Jones
# Code fragments supplied from https://learn.adafruit.com/adafruit-max98357-i2s-class-d-mono-amp/raspberry-pi-usage
# MCP 3002 Python https://github.com/CaptainStouf/Adafruit-raspi-python/blob/master/Adafruit_MCP3002/MCP3002.py

import RPi.GPIO as GPIO, time, os
from os import listdir
import subprocess
from time import sleep
import random
GPIO.setmode(GPIO.BCM)

# read the SPI data from the MCP3002 chip, 2 possible adc’s (0 and 1)
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
if ((adcnum > 1) or (adcnum < 0)):
return -1
GPIO.output(cspin, True)
GPIO.output(clockpin, False) # start clock low
GPIO.output(cspin, False) # bring CS low

commandout = adcnum << 1;
commandout |= 0x0D # start bit + single-ended bit + MSBF bit
commandout <<= 4 # we only need to send 4 bits here

for i in range(4):
if (commandout & 0x80):
GPIO.output(mosipin, True)
else:
GPIO.output(mosipin, False)
commandout <<= 1
GPIO.output(clockpin, True)
GPIO.output(clockpin, False)

adcout = 0

# read in one null bit and 10 ADC bits
for i in range(11):
GPIO.output(clockpin, True)
GPIO.output(clockpin, False)
adcout <<= 1
if (GPIO.input(misopin)):
adcout |= 0x1
GPIO.output(cspin, True)

adcout /= 2 # first bit is ‘null’ so drop it
return adcout

# Use these pinouts for the raspberry pi zero
SPICLK = 11
SPIMOSI = 10
SPIMISO = 9
SPICS = 8

# set up the SPI interface pins
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPICS, GPIO.OUT)

# Note that bitbanging SPI is incredibly slow on the Pi as its not
# a RTOS — reading the ADC takes about 30 ms (~30 samples per second)
# which is awful for a microcontroller but better-than-nothing for Linux

# list year , this retrieves a list of files from the specified directory and returns the list
def list_year(radio_year):
war_dir = ‘/home/pi/radio/WWII_News_’+radio_year
mp3_files = [ f for f in listdir(war_dir) if f[-4:] == ‘.mp3’ ]
if not (len(mp3_files) > 0):
print «No mp3 files found!»
return mp3_files

print «—WW2 Radio —————————————————————«
last_read = 0 # store the last position of the volume pot
last_year = 0 # store the last position of the frequency pot
tolerance = 5 # allow a small tolerance so slight movement of the pots doesnt cause a change

while True:
trim_pot_changed = False
year_pot_changed = False

for adcnum in range(2):
ret = readadc(adcnum, SPICLK, SPIMOSI, SPIMISO, SPICS)
if (adcnum == 0): # read the pot for the year selector to see it has moved
year_adjust = abs(ret — last_year)
if ( year_adjust > tolerance+10):
year_pot_changed = True

if (year_pot_changed): # Values for the if then checks can be made after its built
subprocess.call([‘killall’, ‘mpg123’]) # kill any MP3 running
sleep(0.1);
if ret <=50:
war_year=»1939″
elif (ret >50 and ret <150):
war_year=»1940″
elif (ret >=150 and ret <250):
war_year=»1941″
elif (ret >=250 and ret <350):
war_year=»1942″
elif (ret >=350 and ret <450):
war_year=»1943″
elif (ret >=450 and ret <550):
war_year=»1944″
elif (ret >=550):
war_year=»1945″

# save the value of the pot for the next time around the loop
last_year = ret
print («Playing from «),
print (war_year),
print (» number of files=»),
war_dir = ‘/home/pi/radio/WWII_News_’+war_year+’/’
play_list = list_year(war_year)
num_of_files = len(play_list)
print num_of_files
play_file = random.randint(1,num_of_files) # randomly select one of the files to play
war_mp3 = war_dir + play_list[play_file]

subprocess.Popen([‘mpg123’, war_mp3]) # Use mpg123 as the player for the audio
sleep (0.1); # provide a slight pause before continuing

if (adcnum == 1): # read the volume pot
pot_adjust = abs(ret — last_read)
if ( pot_adjust > tolerance):
trim_pot_changed = True

if ( trim_pot_changed ):
set_volume = ret / 10.24 # convert 10bit adc0 (0-1024) pot value into a 0-100 volume level
set_volume = round(set_volume)# round out decimal value
set_volume = int(set_volume) # cast volume as integer

# Use the value from the pot to send a level to the amixer prog
print ‘Volume = {volume}%’ .format(volume = set_volume)
set_vol_cmd = ‘sudo amixer cset numid=1 — {volume}% > /dev/null’ .format(volume = set_volume)
os.system(set_vol_cmd) # set volume

# save the potentiometer reading for the next loop
last_read = ret

# A pause after changing the volume so we dont act on too many changes if the pot changes fast
time.sleep(0.5)
Для автозагрузки ПО при запуске устройства нужно выполнить следующую команду

sudo crontab -e p>
Затем ввести

@reboot python /home/pi/volume/year.py & p>
При следующей загрузке все должно заработать.
В принципе все готово, в планах мастера-самодельщика сделать еще один радиоприемник с годами и передачами «космической гонки» между СССР и США. Начиная от запуска первого спутника Земли и заканчивая высадкой на Луну.

Источник

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть
Закрыть