Осталось 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") # когда выключаемся, то закрываем плеер
Итак. Почти всё готово. Осталось сделать так, чтоб скрипт запускался при старте нашей малинки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А сейчас я делаю такую милашку ^^
К нему скоро будет камера. Он будет автоматически ездить по квартире. Управление голосом, например «приезжай на кухню». И сам ездить на зарядную станцию.
Комментариев: 12
OPERATOR2
19.08.2013 в 02:27 ответАвтор, мое Вам почтение! Я свои малинки как-то забросил, не до них мне сейчас. А столько планов было... Но читаю такие вот посты как Ваш - и хочецца творить! И я обязательно что-нибудь сотворю :-)
dimonoid9
21.08.2013 в 19:35 ответА про подтяжку почему забыли? Эти резисторы уже есть на самой плате .
Gasinskiy12
21.08.2013 в 21:24 ответТ. е. можно все резисторы по 10 кОм убрать и ничего с Малинкой не случится? А тот который на 200 Ом, я думаю можно заменить резистором номиналам до 1000 Ом. Верно?
SL RU2
29.08.2013 в 12:06 ответДа. Но подтяжки никогда не помешают ;-)
Gasinskiy12
30.08.2013 в 08:40 ответСпасибо за ответы!!! У меня еще несколько вопросов возникло... 1. Резистор (или просто проводник, если без подтяжки) при первой кнопке так же к общему проводу подключать? 2. Я так понимаю можно добавить еще кнопку по аналогичной схеме и подключить ее к GPIO 22. Ну и запрограммировать ее например так: if GPIO.input(22): #предыдущая композиция player.stdin.write("<")? 3. Есть ли еще такие пины к которым можно было бы подсоединить еще кнопки? Думаю в будущем можно будет добавить режим интернет-радио и добавить дисплейчик с двумя строками по 16 символов на микроконтроллере HD44780 для того чтобы выводить информацию, например о проигрываемой песне или радиостанции =)
SL RU2
01.09.2013 в 19:08 ответ1) Да. К земле. Ссори недописовал =) 2) Да. Конечно можно 3) порты gpio 0, 1, 15, 18, 21, 22, 10, 9, 11, 8, 7 полностью свободны
Gasinskiy12
01.09.2013 в 23:06 ответПонял. Я просто думал можно подключать эти самые кнопки только к зеленым пинам (GPIO общего назначения). А оказывается можно использовать все GPIO порты. Кстати, без резисторов 10 кОм похоже никто не подключает кнопки. Видел много схем с кнопками, все все равно используют резисторы. В общем у меня ничего не получилось пока что. При нажатии кнопки на включение у меня Raspberry Pi просто перезагружается. Я запускал программу с правами суперпользователя, но у меня постоянно вылазила ошибка:"...что то там кажется с временем исполнения и ошибка доступа к /dev/mem. Try running as root!"... Потом сделал так чтобы скрипт запускался при старте. Больше ошибок не видел, но чувствую, что программа вообще не работет, поэтому ничего и не получается. Гуглил эту ошибку, но так и не разобрался что это может быть...
SL RU2
11.09.2013 в 21:09 ответЗапускай программу от root. это делается так: sudo #твоя команда
Gasinskiy12
14.09.2013 в 20:22 ответЯ и запускал с правами суперпользователя...
SL RU2
29.08.2013 в 12:08 ответА 200 Ом нельзя максимум можно поставить 500, не больше, а то светодиод очень тускло гореть будет
Gasinskiy12
21.08.2013 в 21:22 ответСпасибо за инструкцию по созданию MP3 плеера))
serb2
12.09.2013 в 10:16 ответПодскажите Чем можно слушать формат АСС.