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(...). Схема сверх простая 0_b3cfd_9966f2de_origРеализация примерно такая (извините за такой вид. Просто сделано за пол часа...)Фотки0_b3d0e_afd02862_orig0_b3d0d_28c423c7_orig0_b3d0c_c7c3b57_origУстанавливаем mplayer:
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") # когда выключаемся, то закрываем плеер
Итак. Почти всё готово. Осталось сделать так, чтоб скрипт запускался при старте нашей малинки1) редактируем файл
sudo nano /etc/init.d/StartPlayer
2) пишем в редакторе нано это:
#! /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А сейчас я делаю такую милашку ^^0_b3d24_aa5d0300_orig0_b3d27_a165d361_origК нему скоро будет камера. Он будет автоматически ездить по квартире. Управление голосом, например «приезжай на кухню». И сам ездить на зарядную станцию.

Комментарии:

OPERATOR2
Автор, мое Вам почтение! Я свои малинки как-то забросил, не до них мне сейчас. А столько планов было... Но читаю такие вот посты как Ваш - и хочецца творить! И я обязательно что-нибудь сотворю :-)
dimonoid9
А про подтяжку почему забыли?
Эти резисторы уже есть на самой плате .
Т. е. можно все резисторы по 10 кОм убрать и ничего с Малинкой не случится? А тот который на 200 Ом, я думаю можно заменить резистором номиналам до 1000 Ом. Верно?
Да.
Но подтяжки никогда не помешают ;-)
Спасибо за ответы!!! У меня еще несколько вопросов возникло...

1. Резистор (или просто проводник, если без подтяжки) при первой кнопке так же к общему проводу подключать?
2. Я так понимаю можно добавить еще кнопку по аналогичной схеме и подключить ее к GPIO 22. Ну и запрограммировать ее например так:
if GPIO.input(22): #предыдущая композиция
player.stdin.write("<")?
3. Есть ли еще такие пины к которым можно было бы подсоединить еще кнопки?

Думаю в будущем можно будет добавить режим интернет-радио и добавить дисплейчик с двумя строками по 16 символов на микроконтроллере HD44780 для того чтобы выводить информацию, например о проигрываемой песне или радиостанции =)
1) Да. К земле. Ссори недописовал =)
2) Да. Конечно можно
3) порты 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 #твоя команда
Я и запускал с правами суперпользователя...
А 200 Ом нельзя максимум можно поставить 500, не больше, а то светодиод очень тускло гореть будет
Gasinskiy12
Спасибо за инструкцию по созданию MP3 плеера))
serb2
Подскажите Чем можно слушать формат АСС.

Для написания комментариев необходимо зарегистрироваться