Androidのメモとか

ポキオの日記です。今日も遅延してない。

macOS Big Surのインストール用USBドライブを作ってみる

ビッグサア。

ポキオ macOS Big Sur 起動ディスク

Big Surでましたねぇ

でちゃいましたねぇ。

www.apple.com

そして、

たまには家でゆっくりクリーンインストールするのも悪くないなと思い、インストール用のUSBドライブを作ってみました。

つくりかた

公式はこちら。

support.apple.com

What you need to create a bootable installer

  • A USB flash drive or other secondary volume, formatted as Mac OS Extended, with at least 12GB of available storage

  • A downloaded installer for macOS Big Sur, Catalina, Mojave, High Sierra, or El Capitan

16GBのUSBメモリがあれば大丈夫そうです。とりあえず、App StoreからBig Surのインストーラーをダウンロードしたうえで、USBメモリ(ここではNO NAMEという名前)をmacに挿して、

$ sudo /Applications/Install\ macOS\ Big\ Sur.app/Contents/Resources/createinstallmedia --volume /Volumes/NO\ NAME/

これを実行。macのパスワードを聞かれるので入力すると、USBドライブが作成されます。

Ready to start.
To continue we need to erase the volume at /Volumes/NO NAME/.
If you wish to continue type (Y) then press return: Y
Erasing disk: 0%... 10%... 20%... 30%... 100%
Copying to disk: 0%... 10%... 20%... 30%... 40%... 50%... 60%... 70%... 80%... 90%... 100%
Making disk bootable...
Install media now available at "/Volumes/Install macOS Big Sur"

完成!

あとは、このメディアをBig Surをクリーンインストールしたいmac挿してから電源オン、からのoptionボタンをホールドするとUSBメモリからBig Surが起動できるようになりますー。

ゲーマーじゃないけどPS5買ってみた話

買っちゃいました。

ポキオ PlayStation5

当たっちゃった

ソニーストアの抽選に当たっちゃいました。

ちなみに、プレイステーション系のハードは買ったことがなくPS5が初めて。そもそもあんまりゲームをやらないタイプで、NintendoのTVにつなぐ系のハードもSwitchが初めてというタイプ。なので、ゲームのことに関してはズブの素人なわけなんだけど、きっと話題だから楽しいに違いないとおもい購入。

というわけで、実際に遊んでみました。

とりあえず設置

こんな感じでテレビ台にインストール。

ポキオ PlayStation5

PS5は横置き。なんか思った以上にデカイけど、まぁいい。SonosのPlaybarで臨場感のある音を期待しつつ、まさかのディスプレイはFHD…。これは4K買わないとなぁ。

ポキオ PlayStation5

あと、PS5の光り方がなんだか妖艶で。起動直後はこんな感じの青。すごくラブホっぽい。(褒めてる)

ポキオ PlayStation5

プレイ中は白くなって、スタンバイ中は黄色くなる。こういうさりげないインジケーターが本当におしゃれ。

ソフトは買ったの?

買ったはいいものの、特にやりたいゲームはなくて、強いて言うなら

  • GTA5がPS5向けにも出るらしので、おいおいそれを買いたい
  • PS4向けだけど電車でGOが出るらしので、それも買いたい

みたいな感じで、別にPS4でもいいんじゃないの?と言われればそれまでなんですが、取り急ぎこれを購入。

Need for Speed:Hot Pursuit Remastered - PS4

Need for Speed:Hot Pursuit Remastered - PS4

  • 発売日: 2020/11/06
  • メディア: Video Game

ゲーム機は持っていなかったけど、小さい頃にPCでやったNFS3 Hot Pursuitが忘れられず、PS4版のNFS Hot Pursuitを購入。これが楽しくて仕方がない。PS4版のゲームも、ディスクを挿入してPS5のSSDにインストールが完了すると、ちゃんとPS5でも遊べるっていうんだから素敵。コンパイルし直してるのかしら・・・。

要はパトカーを振り切ったり、逆にパトカーで追跡したりするゲーム。警察無線の感じとかすごくいい。(語彙力)

Sonos Playbarのおかげで、いわゆる迫力のある音が楽しめる一方で、警察無線の声とかもはっきり聞こえます。あとはディスプレイさえ4Kにできれば本当に最高なんですけどねぇ。バジェットがががが。

PS5らしさを楽しむ

とまぁ、ここまでは完全にPS4でも良かった話。結局NFS Hot Pursuitも、PS5で遊べるといっても、PS5の良さ味をあまり活かしきれず、タッチパネルとかハプティックなコントローラーのパフォーマンスを試せずにいました。

ちょっと悔しかったので、PS5にプリインされていたAstro's Playroomというゲームで遊んでみることに。

これがまたすごい。震え方が尋常じゃないというか、振動の強弱だけでなく、コントローラーがどこかに持っていかれるような感触を味わえるうえに、トリガーボタンもゲーム内容によって負荷がかかるような感触が味わえる。なんかコントローラーからも音が出てくるし、もう体験がすごい。とにかくすごい。(語彙力)

買ってよかったの?

ここがポイントで、正直まだ良くわからない。Astro's Playroomも、PS5の良さは体験できたものの、好きなタイプのゲームではなかったのが残念。NFSなどのPS4系のゲームをするなら、PS4で良かったといえばそのとおり。あとはこれから出てくるゲームで、好きなやつがあって、それでPS5の良さが体験できれば良いんだけど…。気長に待つとしますかねぇ。PS5版のGTA5がどこまでPS5のハードウェアを使い倒してくれるかが本当に気になるところ。せっかくすごいコントローラーなんだけどなぁ。

あと、単純に動画再生機としても、惜しい部分があり。普段はAmazonのFire TV StickでAbemaとかを見がちなんですが、PS5はAbema非対応っぽく・・・。せっかくYouTubeとかAmazon Prime Videoも見られるので、個人的にはAbemaが見られたらPS5でいろいろ事足りてしまうので良かったのですが…。Abemaに限った話ではないですが、もう少しいろんなストリーミングサービスに対応してほしかったなぁと。

いろいろ文句を言ってますが、確実に僕の時間を溶かしにかかっていることは間違いないです。

静電容量センサーをつかってファファファファーン

またファーンしてます。

ポキオ Raspberry Pi Speaker pHat サンプラー

前回まで

サンプラー買うお金がないので、Raspberry Piで作っています。

relativelayout.hatenablog.com

relativelayout.hatenablog.com

relativelayout.hatenablog.com

誰か買ってください。

ボタンの押下音がうるさい件

やっぱりうるさいんですよね、ボタンを押したときの音が。

ポキオ Raspberry Pi Speaker pHat サンプラー

そこで、ボタンの代わりのインターフェイスを探すことに。で、押してダメならタッチでどうだ、ということで静電容量センサを使うことに。

この投稿をInstagramで見る

導電性の糸で遊んでる(仕事しろ)

pokio(@pokiiiiio)がシェアした投稿 -

モジュールのインターフェイスはi2cになっていて、RPi以外にもArduinoでも使えてしまうやつ。モジュールには10個の入力端子がついていて、触るなどして静電容量が変化を検知できるというわけです。

静電容量センサーでファファファファファーン

というわけで、このモジュールを使ってユーザーインターフェイスを作成。モジュールをブリキの板につないでボタンの代わりにしてみました。

ポキオ Raspberry Pi Speaker pHat サンプラー

こんな感じ。で、これでファファファファーンしてみました。

この投稿をInstagramで見る

ファファファファーン

pokio(@pokiiiiio)がシェアした投稿 -

まぁまぁいいんじゃないですかねぇ。目的であったボタンの押下音はなくなりました。

ただ、今度目立ってきたのは「押したのに音がならないことがある」ということ。一難去ってまた一難。センサーが反応できていないのか、音を鳴らすプロセスが詰まってるのか…?なにはともあれ、本物のサンプラーに近づくのはなかなか難しいものですね。

コードはこちら

静電容量センサモジュールのライブラリ(adafruit_mpr121)がPython3向けだったため、Python3で動作させています。

import pygame.mixer
import time
import board
import busio
import adafruit_mpr121
import threading
 
i2c = busio.I2C(board.SCL, board.SDA)
mpr121 = adafruit_mpr121.MPR121(i2c)

input_state1 = False
input_state2 = False
input_state3 = False
input_state4 = False
input_state5 = False
input_state6 = False

pygame.mixer.init()

sound1 = pygame.mixer.Sound("/home/pi/Music/sound1.wav")
sound2 = pygame.mixer.Sound("/home/pi/Music/sound2.wav")
sound3 = pygame.mixer.Sound("/home/pi/Music/sound3.wav")
sound4 = pygame.mixer.Sound("/home/pi/Music/sound4.wav")
sound5 = pygame.mixer.Sound("/home/pi/Music/sound5.wav")
sound6 = pygame.mixer.Sound("/home/pi/Music/sound6.wav")

def play1():
    sound1.stop()
    sound1.play()

def play2():
    sound2.stop()
    sound2.play()

def play3():
    sound3.stop()
    sound3.play()

def play4():
    sound4.stop()
    sound4.play()

def play5():
    sound5.stop()
    sound5.play()

def play6():
    sound6.stop()
    sound6.play()

while True:
    if mpr121[0].value == True and input_state1 == False:
        print('Button1 Pressed')
        input_state1 = True
        threading.Thread(target=play1).start()    
    else:
        input_state1 = mpr121[0].value

    if mpr121[2].value == True and input_state2 == False:
        print('Button2 Pressed')
        input_state2 = True
        threading.Thread(target=play2).start()   
    else:
        input_state2 = mpr121[2].value

    if mpr121[4].value == True and input_state3 == False:
        print('Button3 Pressed')
        input_state3 = True
        threading.Thread(target=play3).start()   
    else:
        input_state3 = mpr121[4].value

    if mpr121[7].value == True and input_state4 == False:
        print('Button4 Pressed')
        input_state4 = True
        threading.Thread(target=play4).start()   
    else:
        input_state4 = mpr121[7].value

    if mpr121[9].value == True and input_state5 == False:
        print('Button5 Pressed')
        input_state5 = True
        threading.Thread(target=play5).start()   
    else:
        input_state5 = mpr121[9].value

    if mpr121[11].value == True and input_state6 == False:
        print('Button6 Pressed')
        input_state6 = True
        threading.Thread(target=play6).start()   
    else:
        input_state6 = mpr121[11].value

Raspberry Piでサンプラーを作ってファファファファーン

ファファファファーン

ポキオ Raspberry Pi Speaker pHat サンプラー

前回まで

サンプラー買うお金がないので、Raspberry Piで作っています。

relativelayout.hatenablog.com

relativelayout.hatenablog.com

誰か買ってください。

ハードボタンがなきゃサンプラーじゃない

とりあえず、Raspberry PiとSpeaker pHatPythonで好きな音を再生・停止できるところまでできました。

あとは、ボタンを複数揃えて、ボタンに違う音をアサインして、ボタンを押して音を出す。これがしたいんですよねぇ。

ポキオ Raspberry Pi Speaker pHat サンプラー

とりあえず、部屋に転がっていた電子工作用のボタンをいくつか用意して、GPIOとGNDをつないでみました。

ポキオ Raspberry Pi Speaker pHat サンプラー

これをRaspberry Piに接続。Python側でプルアップ抵抗を有効化して、ボタン押下を検知。それをトリガーに音を鳴らすコードを書いてみました。ボタンを連打したときのために、再生中の音を止める実装も入れてみました。

いざ演奏

とりあえず、エアホーンだけですが。

こんな感じです。

  • ボタンの押下時の音がうるさい
  • レスポンスが遅い

など、色々思うところがありますが、とりあえず色々な音源で試してみたいですねぇ。

コードはこちら

import RPi.GPIO as GPIO
import pygame.mixer
import time

GPIO.setmode(GPIO.BOARD)

pin1 = 15
pin2 = 11
pin3 = 29
pin4 = 37
pin5 = 18
pin6 = 16

GPIO.setup(pin1, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(pin2, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(pin3, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(pin4, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(pin5, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(pin6, GPIO.IN, pull_up_down=GPIO.PUD_UP)

input_state1 = True
input_state2 = True
input_state3 = True
input_state4 = True
input_state5 = True
input_state6 = True

pygame.mixer.init()

sound1 = pygame.mixer.Sound("/home/pi/Music/sound1.wav")
sound2 = pygame.mixer.Sound("/home/pi/Music/sound2.wav")
sound3 = pygame.mixer.Sound("/home/pi/Music/sound3.wav")
sound4 = pygame.mixer.Sound("/home/pi/Music/sound4.wav")
sound5 = pygame.mixer.Sound("/home/pi/Music/sound5.wav")
sound6 = pygame.mixer.Sound("/home/pi/Music/sound6.wav")

while True:
    if GPIO.input(pin1) == False and input_state1 == True:
        print('Button1 Pressed')
        input_state1 = False
        sound1.stop()
        sound1.play()
    else:
        input_state1 = GPIO.input(pin1)

    if GPIO.input(pin2) == False and input_state2 == True:
        print('Button2 Pressed')
        input_state2 = False
        sound2.stop()
        sound2.play()
    else:
        input_state2 = GPIO.input(pin2)

    if GPIO.input(pin3) == False and input_state3 == True:
        print('Button3 Pressed')
        input_state3 = False
        sound3.stop()
        sound3.play()
    else:
        input_state3 = GPIO.input(pin3)

    if GPIO.input(pin4) == False and input_state4 == True:
        print('Button4 Pressed')
        input_state4 = False
        sound4.stop()
        sound4.play()
    else:
        input_state4 = GPIO.input(pin4)

    if GPIO.input(pin5) == False and input_state5 == True:
        print('Button5 Pressed')
        input_state5 = False
        sound5.stop()
        sound5.play()
    else:
        input_state5 = GPIO.input(pin5)

    if GPIO.input(pin6) == False and input_state6 == True:
        print('Button6 Pressed')
        input_state6 = False
        sound6.stop()
        sound6.play()
    else:
        input_state6 = GPIO.input(pin6)

    if not (input_state1 and input_state2 and input_state3 and input_state4 and input_state5 and input_state6):
        time.sleep(0.05)
        print('block')

ファーンだけじゃなくファファファファファーンができるようになった

ファーン。

ポキオ Raspberry Pi Speaker pHat Air Horn

ファーン?

前回はこちら。

relativelayout.hatenablog.com

要はエアホーンの効果音をRaspberry Piで鳴らしたいよっていうお話なんですが、前回のNode-REDのノードの場合、音声ファイルをノードで再生中に、更に音声ファイルをノードに対して再生させようとすると、正しく再生されなくなってしまいます。つまり、エアホーンのファーンという音は鳴らせても、それを連続して再生してファファファファファーンみたいな鳴らし方はできませんでした。

Pythonで再生してみる?

Node-REDではノードで再生中の音楽を途中で止めるすべがなさそうだったので、Pythonを使って愚直にコーディングしてファファファファファーンしてみようと思います。

Pythonではpygameというゲーム用モジュールを使うと簡単にMP3を再生できそうだったので、それを使って実装してみます。

$ pip list

手元のRaspberry PiRaspberry Pi OS)にはプリインされてるようで、上記コマンドでモジュール一覧を表示したところ、

Package           Version    
----------------- -----------
(中略)
pygame            1.9.4.post1

pygameは入っていました。良かった良かった。これを使ってMP3を連続再生してみようと思います。

import pygame.mixer
import time

def main():
    pygame.mixer.init()    
    time.sleep(1)  

    pygame.mixer.music.load("./Music/airhorn.mp3")    
    pygame.mixer.music.play(1)          
    time.sleep(0.2)                   
    pygame.mixer.music.stop()   

    pygame.mixer.music.load("./Music/airhorn.mp3")    
    pygame.mixer.music.play(1)          
    time.sleep(0.2)                   
    pygame.mixer.music.stop()   

    pygame.mixer.music.load("./Music/airhorn.mp3")    
    pygame.mixer.music.play(1)          
    time.sleep(0.2)                   
    pygame.mixer.music.stop()

    pygame.mixer.music.load("./Music/airhorn.mp3")    
    pygame.mixer.music.play(1)          
    time.sleep(0.2)                   
    pygame.mixer.music.stop()

    pygame.mixer.music.load("./Music/airhorn.mp3")    
    pygame.mixer.music.play(1)          
    time.sleep(2)                   
    pygame.mixer.music.stop()

if __name__ == '__main__':
    main()

便利なことに、再生だけでなく、再生中の音楽を止めたりもできるので、まずはsleepで時間を少しずつづらしながら、再生中のファーンを停止し、そのまま再度ファーンを再生させながら、ファファファファファーンをしてみました。

この投稿をInstagramで見る

Pythonでファファファファファーンできたお

pokio(@pokiiiiio)がシェアした投稿 -

おーーー。いい感じ。あとは、これをサンプラーみたいにボタン操作でファファファファファーンしたいところ。

Raspberry PiでMP3を再生させてエアホーンをいつでも鳴らせるようにする

気分はパリピ

ポキオ Raspberry Pi Speaker pHat

RPiでMP3再生

今回は以前購入したSpeaker pHatを使って音を鳴らしてみようと思います。

relativelayout.hatenablog.com

Pimoroni Speaker pHAT - スピーカー pHAT キット

Pimoroni Speaker pHAT - スピーカー pHAT キット

  • メディア: エレクトロニクス

というのも、Raspberry PiからGoogle Homeとかを喋らせることとかは結構やりましたが、Raspberry Pi上でMP3を再生することはあまりありませんでした。wavファイルであればコマンドラインからaplayコマンドで再生できましたが、MP3の再生コマンドがデフォルトでは入ってないっぽいようでした。

ひとまずコマンドラインからMP3を再生すべく、mpg321をインストールしてみました。

$ sudo apt install mpg321
$ mpg321 ./Music/airhorn.mp3 

これでMP3が再生できました。

Node-REDからはどうか?

サクッと調べた感じ、node-red-contrib-play-audio-fileで再生できそうだったので、早速インストール。このノードもmpg321をベースに動作するようなので、予めmpg321をインストールしておく必要がありそうです。

ポキオ Raspberry Pi Speaker pHat

予めノードでファイルパスを指定したり、msg.filenameで流し込んだりして、特定のMP3を再生できます。ただ、再生中に再度ノードを発火させてしまうと、正しく再生されないのでちょっと使い方には注意が必要そうです。

そしてエアホーン

パリピがファファファファーンって鳴らしてそうな、アレのことです。アレを鳴らせばきっとパリピな感じになれそうですよね。

はい。こんな感じです。先程のNode-REDから再生できるようにしたので、Injectionノードを叩けばいつでもエアホーンが鳴らせるようになりました。ただ、ファーンしかならず、ノードの制約でファファファファーンができないのが非常に残念です。

できればMPCやサンプラーのように、色々な音を好きなように再生したいんですけどねぇ。それはおいおい。

神奈川県内のCovid-19の新規陽性者数をM5StickCで表示してみる

減ったり増えたり。

ポキオ M5StickC Node-RED Covid-19

前回はM5StickC”もどき”に表示させてました

前回はこちら。

relativelayout.hatenablog.com

眠っていたM5StickCの火入れを行ったので、UI Flowでちょっぱやで実装して、神奈川県のCovid-19陽性者数をM5StickCでも表示してみようと思います。

今回も裏ではNode-REDが活躍しています

前回、Node-RED上に神奈川県のCovid-19陽性者数の情報を取得しパースする仕組みを作りました。

ポキオ Covid-19 Node-RED ESP32

今回も、これを利用していきます。具体的には、M5StickCでNode-RED経由で情報を取得し、その結果をM5StickCのディスプレイに表示させてみようと思います。

UI Flowで爆速実装

気安く爆速という単語を多用してますが、UI Flowは本当に爆速でした。

ポキオ M5StickC Node-RED Covid-19

とはいえ、最初はBlockyで実装していたものの、簡単な文字列操作ができなかったので結局Pythonで実装しちゃいました。ただ、Blockyのおかげで、フルスクラッチPythonを書くよりかは簡単に実装できたので、まずはBlockyで大まかに実装してしまって、細かい部分をPythonで実装するのがいいのかもしれないですねぇ。

さっそく実行

いい感じで動いてますね。データが更新されるのが毎日夕方〜夜なので、ポーリングはせずにボタン押下時にデータ更新を行うようにしています。

そして、今日(2020/09/26)は91人でした。早く収まるといいなぁ。

この投稿をInstagramで見る

今日は91人。

pokio(@pokiiiiio)がシェアした投稿 -

M5StickC

M5StickC

  • メディア:

実際のコード

クソコードはこちらです。

from m5stack import *
from m5ui import *
from uiflow import *
import wifiCfg
import urequests
import time

setScreenColor(0x000000)

label0 = M5TextBox(79, 10, "connecting", lcd.FONT_DejaVu18,0xFFFFFF, rotate=90)
label1 = M5TextBox(49, 10, "to Wi-Fi", lcd.FONT_DejaVu18,0xFFFFFF, rotate=90)
label2 = M5TextBox(19, 10, "access point...", lcd.FONT_DejaVu18,0xffffff, rotate=90)

def buttonA_wasPressed():
  # global params
  label0.setText('getting')
  label1.setText('covid-19')
  label2.setText('data...')
  try:
    req = urequests.request(method='GET', url='http://xx.xx.xx.xx:1880/covid', headers={})
    label0.setText(str(req.text.split('\n')[0]))
    label1.setText(str(req.text.split('\n')[1]))
    label2.setText(str(req.text.split('\n')[2]))
  except:
    label0.setText('*****')
    label1.setText('error')
    label2.setText('*****')
  pass
btnA.wasPressed(buttonA_wasPressed)

wifiCfg.doConnect('MASARU-Wi-Fi_elecom', 'linkinpark123')
label0.setText('press')
label1.setText('button A')
label2.setText('to get data...')
「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。