Androidのメモとか

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

気づいたらClova Friends miniを買ってた

こわいこわい。

ポキオ Clova Friends mini

買っちゃった

以前からGoogle Homeをちょいちょい触ってました。

relativelayout.hatenablog.com

relativelayout.hatenablog.com

これだけスマートスピーカーが面白いと、ほかのスピーカーも面白いのではと思い、気づいたら買ってしまいました。Amaz○nのアレでもよかったんですが、どうしてもクレジットカード登録が必要というのが嫌いなので、今回はClovaを買ってみました。

Unboxing

かわいい。小さい。かわいい。

ポキオ Clova Friends mini

ブラウン氏はもともと好きなんですが、これがスマートスピーカーになっちゃうと更に可愛いですね。そしてGoogle Home miniと比較してもコンパクトです。

取り急ぎ設定

Clovaアプリをスマホにインストールして、設定を粛々とやっていきます。

ポキオ Clova Friends mini

面白いのは以下の通り。

ウェイクアップワードを変えられる

「Clova」「ねぇClova」はいいんですが、「Jessica」も設定ができます。突然のJessicaに驚きつつ、かっこいいのでJessicaに設定してみました。

バッテリー内蔵

これは地味に嬉しいですね。ハンズオンなどでも重宝しそうなフィーチャーで、ほかのスマートスピーカーではあまりありませんね。

給電はUSB 5V

Type-Cのケーブルがあれば、様々な方法で給電できます。特殊のコネクタ形状ではないので、どこでも充電できそうです。

M5STACKでダァシエリイェス(上級)

ついに完成。

ポキオ M5STACK FIRE LED MicroPython

前回までのあらすじ

relativelayout.hatenablog.com

relativelayout.hatenablog.com

MFT2018で購入したM5Stack FIREを使って、京急線の運行情報監視ガジェットを作ってきました。定期的にHPを監視したり、運行情報に応じてSDカード上の画像を表示したりしてきました。今回は最終回として、LEDを光らせてみようと思います。

LEDを光らせる

LEDを光らせるには、Neopixelモジュールをインポートすればいいのですが、

  • LEDは10個だが、LEDの番号は0始まりではなく1始まり
  • LEDを光らせるにはひとつずつset()していく

というのがポイントです。

relativelayout.hatenablog.com

これを使って、

  • 遅延時:黄色点滅
  • 大幅な遅延時:橙色点滅
  • 運転見合わせ時:赤色点滅

させてみようと思います。また、(主にJRからの)振替輸送受託のために京急が遅延した際は、以前のガジェット同様にパリピ点滅させます。

で、作ってみました

DEMOモードで光らせるとこんな感じ。

#m5stack でダァ完成。 train info display with M5Stack FIRE.

A post shared by pokio (@pokiiiiio) on

ポキオ M5STACK FIRE LED MicroPython

ポキオ M5STACK FIRE LED MicroPython

M5Stack FIREのLEDを活かしながら、マグネットでどこでも貼り付けられるので、オフィスや冷蔵庫に貼っておくのもいいですねぇ。

動作確認中に、本当に遅延して驚くなど。

クソコードはこちら

from m5stack import lcd
import urequests
import uos
import utime
import machine
import random

uos.mountsd()
interval_sec = 60 * 10
led_pin = 15
led_num = 10
leds = machine.Neopixel(led_pin, led_num)

def setColor(neopixel, color, brightness):
    leds.brightness(brightness)
    for i in range(led_num):
        neopixel.set(i + 1, color)

def blinkSoftly(neopixel, color, sec = 1):
    for i in range(sec):
        setColor(neopixel, 0x000000, 0)
        for j in range(8):
            setColor(neopixel, color, 32 * (j + 1) - 1)
            utime.sleep_ms(62)
        for j in range(8):
            setColor(neopixel, color, 255 - 32 * j)
            utime.sleep_ms(62)
        setColor(neopixel, 0x000000, 0)

def blinkLikePartyPeople(neopixel, sec = 1):
    leds.brightness(255)
    for i in range(sec):
        for i in range(10):
            for k in range(led_num):
                color = 0xff0000 * random.randrange(2) + 0x00ff00 * random.randrange(2) + 0x0000ff * random.randrange(2)
                neopixel.set(k + 1, color)
            utime.sleep_ms(100)

while True:
    setColor(leds, 0x000000, 0)
    response = urequests.get('http://unkou.keikyu.co.jp/')
    unko = response.text.split("<div class=unko-panel>")[1].split("</div>")[0]
    response.close()
    
    lcd.clear()
    if unko.find("受託") > 0:
        lcd.image(0, 0, file="/sd/5.jpg", scale=0, type=lcd.JPG)
        blinkLikePartyPeople(leds, interval_sec)
    elif unko.find("見合わせ") > 0:
        lcd.image(0, 0, file="/sd/4.jpg", scale=0, type=lcd.JPG)
        blinkSoftly(leds, 0xff0000, interval_sec)
    elif unko.find("乱れ") > 0:
        lcd.image(0, 0, file="/sd/3.jpg", scale=0, type=lcd.JPG)
        blinkSoftly(leds, 0xff8000, interval_sec)
    elif unko.find("遅れ") > 0 or unko.find("運休") > 0:
        lcd.image(0, 0, file="/sd/2.jpg", scale=0, type=lcd.JPG)
        blinkSoftly(leds, 0xffff00, interval_sec)
    elif unko.find("平常") > 0:
        lcd.image(0, 0, file="/sd/1.jpg", scale=0, type=lcd.JPG)
        utime.sleep(interval_sec)
    else:
        lcd.clear()
        lcd.setCursor(0, 0)
        lcd.setColor(lcd.WHITE)
        lcd.print("unknown state.")
        utime.sleep(interval_sec)

京急電鉄ぴあ (ぴあMOOK)

京急電鉄ぴあ (ぴあMOOK)

  • 発売日: 2018/03/30
  • メディア: ムック

M5Stack FIREのLEDをMicroPythonで光らせたときのメモ

メモメモ。

ポキオ M5STACK FIRE LED MicroPython

tl;dr

とりあえず、これが一番簡単そう。

from machine import Neopixel

led_pin = 15
led_num = 10
leds = Neopixel(led_pin, led_num)

for i in range(led_num):
    leds.set(i + 1, 0xff0000)
  • ピンは15番っぽい
  • LEDはNeoPixelのアレで、左右に5個ずつ、計10個ある
  • LEDを光らせるにはひとつずつset()していく
  • LEDの番号は0始まりではなく、なぜか1始まりっぽい
  • 色はRGBをHEXで指定

LEDを光らせるには

公式のREADMEは多分これ。

github.com

サンプルとして載ってるコードはこちら。

import machine, time

np = machine.Neopixel(machine.Pin(22), 24)

def rainbow(loops=120, delay=1, sat=1.0, bri=0.2):
    for pos in range(0, loops):
        for i in range(0, 24):
            dHue = 360.0/24*(pos+i);
            hue = dHue % 360;
            np.setHSB(i, hue, sat, bri, 1, False)
        np.show()
        if delay > 0:
            time.sleep_ms(delay)

def blinkRainbow(loops=10, delay=250):
    for pos in range(0, loops):
        for i in range(0, 24):
            dHue = 360.0/24*(pos+i);
            hue = dHue % 360;
            np.setHSB(i, hue, 1.0, 0.1, 1, False)
        np.show()
        time.sleep_ms(delay)
        np.clear()
        time.sleep_ms(delay)

setHSB()してからshow()するサンプルコード。RGB脳な自分にはちょっとアレなのですが、確かにこの方法でも色は変えられます。

setHSB()で光らせてみる

実際にこんな感じでサンプルコードを動かしてみると、いい感じに光ります。

from machine import Neopixel

led_pin = 15
led_num = 10
leds = Neopixel(led_pin, led_num)

for i in range(led_num):
    leds.setHSB(i, 180, 1.0, 0.2, 1, False)

leds.show()

ポキオ M5STACK FIRE LED MicroPython

ただし、左側面の一番左のLEDが光ってないです。なので、LEDの番号をひとつずらして、以下のようにするとちゃんと光ります。なんなんだろう。

from machine import Neopixel

led_pin = 15
led_num = 10
leds = Neopixel(led_pin, led_num)

for i in range(led_num):
    leds.setHSB(i + 1, 180, 1.0, 0.2, 1, False)

leds.show()

たしかに、M5GOのサンプルコードも、LEDの番号が1-10になっているので、そういうものなのかもしれません。

set()で光らせてみる

そうそう、M5GOのサンプルコードではset()で色指定をしていたので、そっちも試してみたいと思います。

from machine import Neopixel

led_pin = 15
led_num = 10
leds = Neopixel(led_pin, led_num)

for i in range(led_num):
    leds.set(i + 1, 0xff0000)

はい、こちらは問題なく光らせることができました。set()であれば、RGBで色指定ができます。ただし、Brightnessは指定できないので、別途brightness()で指定する必要があります。引数は0-255っぽいです。

ほかにやり方はあるの?

11. Controlling NeoPixels — MicroPython 1.14 documentation

ESP8266向けのMicroPythonだと、こんな感じで色指定をしますが、これはM5Stackでは使えなさそうでした。

np[0] = (255, 0, 0) # set to red, full brightness
np[1] = (0, 128, 0) # set to green, half brightness
np[2] = (0, 0, 64)  # set to blue, quarter brightness
np.write()

というわけで、よいNeoPixelライフを。

M5STACKでダァシエリイェス(中級)

ステップアップ!

ポキオ M5STACK FIRE 京急

前回は初級編でした

relativelayout.hatenablog.com

初級編では、京急の運行情報ページから運行情報を取得して、平常運転か否かを確認するプログラムを書きました。今回はこれに加えて、以下のフィーチャーを追加してみようと思います。

  • 定期的な実行
  • 様々な状況へ対応
  • 運行情報に応じてLCDの表示を変える
  • LCDの表示はSDに保存した画像を表示する

これでようやく実用的な京急遅延チェッカーが完成します。

クソコードはこちら

from m5stack import lcd
import urequests
import uos
import utime

uos.mountsd()

while True:
    response = urequests.get('http://unkou.keikyu.co.jp/')
    unko = response.text.split("<div class=unko-panel>")[1].split("</div>")[0]
    response.close()
    
    lcd.clear()
    if unko.find("受託") > 0:
        lcd.image(0, 0, file="/sd/5.jpg", scale=0, type=lcd.JPG)
    elif unko.find("見合わせ") > 0:
        lcd.image(0, 0, file="/sd/4.jpg", scale=0, type=lcd.JPG)
    elif unko.find("乱れ") > 0:
        lcd.image(0, 0, file="/sd/3.jpg", scale=0, type=lcd.JPG)
    elif unko.find("遅れ") > 0 or unko.find("運休") > 0:
        lcd.image(0, 0, file="/sd/2.jpg", scale=0, type=lcd.JPG)
    elif unko.find("平常") > 0:
        lcd.image(0, 0, file="/sd/1.jpg", scale=0, type=lcd.JPG)
    else:
        lcd.setCursor(0, 0)
        lcd.setColor(lcd.WHITE)
        lcd.print("unknown state.")
    
    utime.sleep(60 * 5)
  • SDカード上のファイルへはuos.mountsd()してから、よしなにアクセス
  • 定期実行はwhile Trueループで実装
  • urequests.get()したら必ずclose()すること
  • 運行情報判断ロジックは以前作ったESP8266向けライブラリを転用

こんな感じです。画像は大人事情的に問題なさそうな範囲で自作しました。テスト表示させた様子がこちら。

ポキオ M5STACK FIRE 京急

ポキオ M5STACK FIRE 京急

いい感じですね。

M5Stack Gray(9軸IMU搭載)

M5Stack Gray(9軸IMU搭載)

  • メディア: おもちゃ&ホビー

M5STACKでダァシエリイェス(初級)

取り急ぎダァ。

ポキオ M5Stack Fire

君のLチカ、僕のダァ。

とりあえずボードを買ったら、まずは京浜急行の運行情報を取得したくなるのは人間の性というもの。致し方ないですね。MicroPythonでちゃちゃっと情報取得して、LCDの表示を出し分けるプロトを作ってみました。

クソコードはこちら

from m5stack import lcd
import urequests

lcd.clear()
lcd.setCursor(0, 0)
lcd.setColor(lcd.WHITE)

response = urequests.get('http://unkou.keikyu.co.jp/')
unko = response.text.split("<div class=unko-panel>")[1].split("</div>")[0]

status = ""

if unko.find("平常")>0:
    status = "OK"
else:
    status = "NG"

lcd.print(status)

HTTP-GETにはurequestsを使うんですね・・・勉強になります。今回はとりあえず、「平常運転」か否かだけを判断するコードになっています。

いざ実行

OKという表示。

ポキオ M5Stack Fire

まぁ、遅れてないですわな。

とりあえず成功?

M5Stack Gray(9軸IMU搭載)

M5Stack Gray(9軸IMU搭載)

  • メディア: おもちゃ&ホビー

M5STACK FIREことはじめ(最初からMicroPython)

やっぱりMicroPython。

ポキオ M5Stack Fire

FIREに火入れする

イカーフェアで買ったっきり、触ってなかったこの子。今日こそ触ってみようと思います。が、色々泣きそうになったのでメモ。

環境

ASUSのTRANSBOOK T101HAにXubuntuを入れています。

NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

ファームウェアの書き込み

いままでのM5TACKとあまり変わらない。

sudo pip install esptool

esptoolが入っていなければ、まず入れておきます。

そして、M5STACK FIREにM5Cloudのファームウェアを書き込んでいきます。公式のインストールガイドも日本語ローカライズされているので、最高です。

github.com

まずはここからm5cloud-psram-20180516-v0.4.0.binをダウンロード。

そして、このファームウェアをM5STACK FIREに書き込んでいきます。

esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash
esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash --flash_mode dio -z 0x1000 ./Downloads/m5cloud-psram-20180516-v0.4.0.bin 

私の環境だと、ttyUSB0として認識していました。書き込みが完了すると、こんな画面が表示されます。

ポキオ M5Stack Fire

あとは、M5Cloudと連携するだけ!

relativelayout.hatenablog.com

つまづいたポイント

aptesptoolを入れると動かない

ついついやりがちなんですが、これではできませんでした。

sudo apt install esptool

ちゃんとpipしましょう。

なかなかUSBが認識されず焦った

以前買ったM5STACKに付属していたクッソ短いUSBケーブルを使ったんですが、これが悪かったのでしょうか・・・。とりあえず、なんどか挿抜してなんとか認識・・・。

FacebookのAPIが改悪されたのでBloggerをやめようと思う

ころころ変わるやつ。

ポキオ Facebook API 変更

tl;dr

ブログの更新をGASで監視し、IFTTTでFBに投稿してたけど、それがAPI変更でできなくなったので、Bloggerをやめてはてなブログに一本化しつつ、手動でFBに投稿することに決めた。

突然のAPI変更

何がユーザーデータ保護だよ。

developers.facebook.com

japan.cnet.com

これによって、IFTTTからのFacebookへの投稿ができなくなりました。これ、地味に痛いんですよね。個人的には大打撃です。というのも、今までのブログはIFTTT経由でFacebook投稿をしてました。

今までのブログのワークフロー

もともと、こんな感じでブログを書いていました。

ポキオ Facebook API 変更

StackEditというブラウザ上でMarkdownが扱えるエディターに一時期ハマっていて、Google Photosにアップした写真を簡単に貼り付けられたり、Bloggerへの投稿も簡単だったので愛用していました。Markdownに非対応だったBloggerの欠点も補えたので、Bloggerを使っていました。

とはいえ、はてなブログも捨てがたく、手軽にいい感じのデザインテンプレートも使えるし、カード上のリンクも簡単に扱える上に、なんといってもMarkdownに対応しているのがアツいわけです。

relativelayout.hatenablog.com

また、自作のElectronアプリで、Google PhotosからMarkdownへの変換が可能になった今、StackEditに頼ることなくブログを書けるようになったので、はてなブログも簡単にかけるようになりました。となると、Markdownに対応していないBloggerを使う積極的理由は少なくなったわけです。

ブログの常時監視はGASにやらせていました

書いたあとは何もせずに、自動でFacebookTwitterに投稿されるような仕組みを構築していました。

ポキオ Facebook API 変更

GASでブログを監視し、IFTTT経由でSNSに投稿していました。投稿予約をしていた記事も、ちゃんと拾ってくれるので便利でしたが、今回のAPI変更によりそれもできなくなりました。遺憾の意です。

幸い、はてなブログは投稿後にTwitterFacebookへの投稿が簡単にできるUIになっているので、もういっそのことはてなブログで行こうかなと。

というわけで

  • BloggerMarkdownに対応していない
  • だけどStackEditが便利だったからなんとなくBloggerをやってた
  • GooglePhotoMarkdownerを作ったらStackEditがなくても良くなった
  • だったら、Markdownに対応しているはてなブログでもいいのでは
  • FBの仕様変更でIFTTTから自動投稿ができなくなった
  • はてなブログに一本化して、手動投稿が楽そう

というわけで、はてなブログに一本化しようと思います。

下記ブログをよろしくおねがいします。

relativelayout.hatenablog.com

upgti.hatenablog.com

pokio-ringyo.hatenablog.com

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

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