質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.03%

  • Linux

    3181questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • Raspberry Pi

    612questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

VOLUMIO 起動時自動再生方法

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 411

horisuke3232

score 100

Raspberry pi3でvolumioを使用しています。
GPIOを使用してボタンを押すと曲を再生するプログラムを使用しています。

※プログラムをコピペしたものです

#!/usr/bin/python
#-*- coding: utf-8 -*-
u'''
http://www.rpiblog.com/2012/09/using-gpio-of-raspberry-pi-to-blink-led.html
https://github.com/if1live/rpi-mpd-controller
http://nw-electric.way-nifty.com/blog/2014/01/volumio-1ad0.html
'''

'''
sudo apt-get update
sudo apt-get -y install python-rpi.gpio python-daemon
'''

import RPi.GPIO as GPIO
import time
import commands
import re
from daemon import daemon 
from daemon.pidlockfile import PIDLockFile  

PIN_PREV_BTN = 8
PIN_PLAY_BTN = 10
PIN_NEXT_BTN = 12
PIN_STOP_BTN = 7
PIN_VOL_UP_BTN = 11
PIN_VOL_DW_BTN = 13

class Player(object):
    def __init__(self):
        self.re_play = re.compile(r'^\[playing\].+$')
        self.re_vol = re.compile(r'^volume:.+% .+$')
        self.play_state = self.is_playing()
        self.shutdown_timer = 0

    def sdtimer(self):
        if self.shutdown_timer is not 0:
            self.shutdown_timer -= 1

    def is_playing(self):
        result = commands.getstatusoutput('mpc')
        line_list = result[1].splitlines()

        playing = False
        for line in line_list:
            if self.re_play.match(line) is not None:
                playing = True

        self.play_state = playing

        for line in line_list:
            if self.re_vol.match(line) is None:
                self.vol_state = False
#                print '## vol False'
            else:
                self.vol_state = True
#                print '## vol True'

        return playing

    def play(self):
        if self.is_playing():
            retval = commands.getoutput('mpc pause')
            self.play_state = False
            print '#pause'
        else:
            retval = commands.getoutput('mpc play')
            self.play_state = True
            print '#play'
        print retval

#        result = commands.getstatusoutput('mpc')
#        line_list = retval[1].splitlines()
#        for line in line_list:
#            if self.re_vol.match(line) is None:
#                self.vol_state = False
#                print '### vol False'
#            else:
#                self.vol_state = True
#                print '### vol True'

    def prev(self):
        retval = commands.getoutput('mpc prev')
        print '#prev'
        print retval

    def next(self):
        retval = commands.getoutput('mpc next')
        print '#next'
        print retval

    def stop(self):
        if self.shutdown_timer is 0:
            self.shutdown_timer = 20
            retval = commands.getoutput('mpc stop')
            print '#stop'
            print retval
        else:
            retval = commands.getoutput('shutdown -h now')

    def volup(self):
        if self.vol_state is True:
            retval = commands.getoutput('mpc volume +2')
            print '#vol up'
            print retval

    def voldw(self):
        if self.vol_state is True:
            retval = commands.getoutput('mpc volume -2')
            print '#vol dw'
            print retval

class Button(object):
    def __init__(self, pin, func):
        self.pin = pin
        self.old_state = 1
        self.func = func
        GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

    def update(self):
        curr_state = GPIO.input(self.pin)
        if self.old_state is 1 and curr_state is 0:
            self.func()
        self.old_state = curr_state


def main():
#    GPIO.cleanup()
    GPIO.setmode(GPIO.BOARD)
    GPIO.setwarnings(False)


    player = Player()

    prev_btn = Button(PIN_PREV_BTN, lambda: player.prev())
    play_btn = Button(PIN_PLAY_BTN, lambda: player.play())
    next_btn = Button(PIN_NEXT_BTN, lambda: player.next())
    stop_btn = Button(PIN_STOP_BTN, lambda: player.stop())
    voldw_btn = Button(PIN_VOL_DW_BTN, lambda: player.voldw())
    volup_btn = Button(PIN_VOL_UP_BTN, lambda: player.volup())

    while True:
        prev_btn.update()
        play_btn.update()
        next_btn.update()
        stop_btn.update()
        voldw_btn.update()
        volup_btn.update()
        player.sdtimer()
        time.sleep(0.05)

if __name__ == '__main__':
    with daemon.DaemonContext(pidfile=PIDLockFile('/var/run/mpd_ctrl.pid')):
        main()
        GPIO.cleanup()

起動して、上記のプログラムを実行しボタンを押すと曲が流れます。

今回、モニターを外して使えるように、起動時に自動で上記のプログラムを実行したいと思い、下記のようにexit0の前に設定しました。
(今回のプログラムファイル mp.py)

/usr/bin/python /home/mp.py

exit 0

再起動してみましたが、実行されませんでした。

volumioを起動すると最初にloginとpwを聞かれるため、自動起動はそもそもできないものなのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

初めまして。
パスが間違っているのではないでしょうか?
/usr/bin/python /home/mp.py とありますが、 /home 以下には各ユーザーごとのディレクトリがあったと記憶しています。
ユーザー名が pi で、ソースコードのファイルがホームディレクトリにあるのであれば、 /usr/bin/python /home/pi/mp.py このような記述になります。
パスが正しいか、確認してみてください。
※OSはRaspbianを使用している想定で回答しました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/18 01:04

    回答ありがとうございます。

    mp.pyが置いてあるディレクトリを確認するためにpwdコマンドを打ってみました。/home/volumio となっていました。

    そこで、
    /usr/bin/python /home/mp.py &

    /usr/bin/python /home/volumio/ mp.py &
    とし、再起動しましたが、自動起動されませんでした。

    /home/volumio/ mp.py &
    も試してみましたがだめでした。

    初心者のため解りやすくお伝えできずすみません。

    キャンセル

  • 2017/09/18 01:10 編集

    /home/volumio/とmp.pyの間に半角スペースが入っています。
    半角スペースを取り除いて実行してみてください。

    キャンセル

  • 2017/09/18 01:16

    回答ありがとうございます。

    半角スペースを取り除いてみましたがダメでした。

    キャンセル

  • 2017/09/18 01:24

    そうですか…
    ちなみにsudoをつけて実行するとどうですか?
    sudo /usr/bin/python /home/volumio/mp.py &
    ↑これで実行するとどうでしょうか?

    キャンセル

  • 2017/09/18 01:35

    何度もありがとうございます。

    sudoをつけて実行してみましたができませんでした。

    キャンセル

  • 2017/09/18 01:43

    「起動して、上記のプログラムを実行しボタンを押すと曲が流れます。」
    とありますが、一度動かすことかできたということでしょうか?
    もしそうであれば、手順が違うということはありませんか?

    キャンセル

  • 2017/09/18 01:48

    早い回答ありがとうございます。

    ログイン後にpython mp.py でプログラムが起動し、ボタンを押すと曲が流れることは確認がとれています。

    キャンセル

  • 2017/09/18 01:53 編集

    「exit0の前に設定しました。」とあるのは、/etc/rc.localに追記したということでしょうか?
    /etc/rc.localに記述した処理はroot権限で実行されるため、先ほどsudoで動作しなかったことを踏まえると別の方法を試したほうが良いかもしれません。
    こちらのサイトに他の方法が載っています。
    http://hendigi.karaage.xyz/2016/11/auto-boot/

    キャンセル

0

過去に僕自身がraspberrypiやりたかった事で調べた事なのですが

「/etc/rc.local」 はraspberrypiが起動直後から実行されるようで

今回の場合はraspberrypiがある程度自分自身を立ち上げて(自分の環境を整えて)からhorisuke3232さんのプログラムを実行した方がいいと思います

「/etc/profile」というものが「raspberrypi」ログイン後に実行されるコマンドの様です

僕の過去のお話しで申し訳ないですが
「su」(root権限)

nano /etc/profile
と入力
一番最後の行
fi
以降に

sudo python /home/mp.py &

と記述すればいけるかもしれません
あくまでもかもなので…僕の時はこれで行けました

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Linux

    3181questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • Raspberry Pi

    612questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。