質問:M5stackへのPythonモジュールのインストール方法



  • 多分大変初歩的なとこだとは思うのですが、分かる方教えてください。

    やりたいこと

    wav|mp3を流しながら(バックグラウンド再生しながら)、別の動作(画面遷移|servo動作)させたい
      このために、m5stackにpythonの外部モジュールpyaudioをインストールして使いたい

    環境

    windows10/m5stack core2
      普段はUIFlowからblocky/micropythonを書いているが、
      Teratermとarduino-ideも使用可能

    やってみたこと①

    /flash/res/pyaudio.py を追加して import pyaudio でやってみたが、
      pyaudioの依存元portaudioがないため動作しない

    やってみたこと②

    https://stackoverflow.com/questions/48135955/installation-of-pyaudio-on-raspberry-pi-3-fails-with-gcc-error
      https://qiita.com/Nyanpy/items/cb4ea8dc4dc01fe56918
      https://qiita.com/yukky-k/items/0d18ec22420e8b35d0ac
      を参考に、sudo pip install pyaudioでインストールできそうなことは分かったが、
      TeratermからUSB接続したm5stackを見ても、micropython(uiflow)として動いており
      sudo pip install pyaudioのコマンドが通せない


  • Global Moderator

    ESP32はラズパイのようにLinuxOSはないので、パッケージを入れることはできません。サウンド制御の部分も独自のドライバでUIFlowからは使えるようになっています。

    恐らくなのですが、portaudio部分を自分で実装しないとpyaudioは使用できないと考えます。(そのままでは動かすのは不可。)

    Pythonで完結するように_threadを使用してサーボ制御と音声の再生を行う方法を模索するしかないでしょう。(UIFlowのMicroPythonでは細かいタスクやスレッドの優先度の制御はできないのでかなり難しいと思います。)


  • Global Moderator

    TwitterでA_P_Delchiさんという方がMicroPythonでサーボの動作と別の処理をスレッドで実現しています。(WAV/MP3再生はしていません。)
    こちらが参考になると思います。

    https://twitter.com/A_P_Delchi/status/1609525689342119938

    https://github.com/apdelchi/sign-chan



  • 情報ありがとうございます!
    _threadを使用する方向でも検討してみます。



  • おっしゃる通り、_threadsで渡すようにしたら
    バックグラウンド再生しつつサーボ制御できました!

    from m5stack import *
    from m5stack_ui import *
    from uiflow import *
    
    import module
    import time
    import math
    import _thread
    
    
    
    def chika_led():
      speaker.playWAV('/sd/head2.wav')
    
    def chika_scr():
      i = 0
      while i < 15 :
        servo2.position(7,150)
        wait_ms(100)
        servo2.position(7,158)
        wait_ms(100)
        i = i + 1
    
    
    
    screen = M5Screen()
    screen.clean_screen()
    screen.set_screen_bg_color(0)
    servo2 = module.get(module.SERVO2)
    
    _thread.start_new_thread(chika_led,())
    _thread.start_new_thread(chika_scr,())```