MP3 плеер за полчаса
-
Осталось 2 часа до долгой поездки. Собираешь вещи, готовишься. Проверяешь всё. А тут бац! и плеер не работает. Печалька( На телефоне нет памяти, так что не получится с него слушать. Что же делать? Конечно же собирать самому. Особенно если есть Raspberry Pi.
Сначала думаем что он должен уметь:
- кнопка следующая песня
- кнопка пауза
- воспроизводить музыку в случайном порядке
- кнопка выключение
- кнопки звук больше меньше
- светодиод-индикатор
В наличии была ардуинка, куча разных atmeg. Но мой выбор пал на Raspberry pi model B 512 Mb. Решил, что это будет самый простой вариант. У неё есть разъёмы gpio, которые можно использовать для кнопок и светодиода. На малинке стоит Raspbian. Писать решил на python'e через редактор nano, работа c gpio через библиотеку RPi.GPIO, а что бы не мучиться с python кодеками и несовместимостью с arm — буду взаимодействовать со сторонним проигрывателем mplayer через subprocess.Popen(...).
Схема сверх простая
Реализация примерно такая (извините за такой вид. Просто сделано за пол часа...) Фотки
sudo apt-get install mplayer
Эээээх… программа… только не орите! Я знаю что это самое ужасное, что я когда либо писал. Когда ехал сильно мучила совесть. Особенно за использование sleep()
Фейспалмная программа на питоне:import RPi.GPIO as GPIO from time import sleep import subprocess import os from random import randint Mfiles = [] path = "/home/pi/Music/" #Папка, где находится музыка files = os.listdir(path) MPFiles = images = filter(lambda x: x.endswith('.mp3'), files); i=0 for mf in MPFiles: MPFiles[i] = path+mf i = i+1 Mfiles = list(MPFiles) Mlen = len(Mfiles) count = 1 CurrentSong = 0 i=0 while i= 10: #если кнопку держат долго,то выходим s = "q" LedState = 0 else: #иначе пауза или воспроизведение if i > 0: player.stdin.write("p") if LedState != 1: LedState = 1 #если воспроизведение, то зажигаем светодиод else: LedState = 2 #иначе моргаем i=0 if GPIO.input(4): #звук выше player.stdin.write("*") if GPIO.input(17): #звук ниже player.stdin.write("/") if GPIO.input(23): #следующая композиция player.stdin.write(">") if LedState == 2: #тут режимы светодиода if lastLed == 1: GPIO.output(24, GPIO.LOW) lastLed = 0 else: GPIO.output(24, GPIO.HIGH) lastLed = 1 else: if LedState == 1: GPIO.output(24, GPIO.HIGH) else: GPIO.output(24, GPIO.LOW) sleep(0.2) #Фэйспалм player.stdin.write("q") # когда выключаемся, то закрываем плеер
Итак. Почти всё готово. Осталось сделать так, чтоб скрипт запускался при старте нашей малинки
- редактируем файл
sudo nano /etc/init.d/StartPlayer
- пишем в редакторе нано это:
#! /bin/sh # /etc/init.d/StartPlayer sudo python /путь_к_питнон_скрипту.py
вместо /путь_к_питнон_скрипту.py напишите путь к вашему питон скриптунажимаем ctrl + xYEnter3)
sudo chmod 755 /etc/init.d/StartPlayer sudo update-rc.d StartPlayer defaults
Всё готово! Загружаем музыку в папку /home/pi/Music/Ставим на вашей SD карточки замок lock, чтобы при случайном выключении питания ничего не сломалось и всё. Плеер готов!!!
P.S. может позже сделаю следующую версию плеера. С нормальным исполнением и программой(без sleep()) и без стороннего плеера
OFFTOPА сейчас я делаю такую милашку ^^
К нему скоро будет камера. Он будет автоматически ездить по квартире. Управление голосом, например «приезжай на кухню». И сам ездить на зарядную станцию.
-
Автор, мое Вам почтение! Я свои малинки как-то забросил, не до них мне сейчас. А столько планов было... Но читаю такие вот посты как Ваш - и хочецца творить! И я обязательно что-нибудь сотворю
-
А про подтяжку почему забыли?
Эти резисторы уже есть на самой плате . -
Спасибо за инструкцию по созданию MP3 плеера))
-
Т. е. можно все резисторы по 10 кОм убрать и ничего с Малинкой не случится? А тот который на 200 Ом, я думаю можно заменить резистором номиналам до 1000 Ом. Верно?
-
Да.
Но подтяжки никогда не помешают -
А 200 Ом нельзя максимум можно поставить 500, не больше, а то светодиод очень тускло гореть будет
-
Спасибо за ответы!!! У меня еще несколько вопросов возникло...
- Резистор (или просто проводник, если без подтяжки) при первой кнопке так же к общему проводу подключать?
- Я так понимаю можно добавить еще кнопку по аналогичной схеме и подключить ее к GPIO 22. Ну и запрограммировать ее например так:
if GPIO.input(22): #предыдущая композиция
player.stdin.write("<")? - Есть ли еще такие пины к которым можно было бы подсоединить еще кнопки?
Думаю в будущем можно будет добавить режим интернет-радио и добавить дисплейчик с двумя строками по 16 символов на микроконтроллере HD44780 для того чтобы выводить информацию, например о проигрываемой песне или радиостанции
-
- Да. К земле. Ссори недописовал
- Да. Конечно можно
- порты gpio 0, 1, 15, 18, 21, 22, 10, 9, 11, 8, 7 полностью свободны
-
Понял. Я просто думал можно подключать эти самые кнопки только к зеленым пинам (GPIO общего назначения). А оказывается можно использовать все GPIO порты. Кстати, без резисторов 10 кОм похоже никто не подключает кнопки. Видел много схем с кнопками, все все равно используют резисторы. В общем у меня ничего не получилось пока что. При нажатии кнопки на включение у меня Raspberry Pi просто перезагружается. Я запускал программу с правами суперпользователя, но у меня постоянно вылазила ошибка:"...что то там кажется с временем исполнения и ошибка доступа к /dev/mem. Try running as root!"... Потом сделал так чтобы скрипт запускался при старте. Больше ошибок не видел, но чувствую, что программа вообще не работет, поэтому ничего и не получается. Гуглил эту ошибку, но так и не разобрался что это может быть...
-
Запускай программу от root. это делается так:
sudo #твоя команда -
Подскажите Чем можно слушать формат АСС.
-
Я и запускал с правами суперпользователя...