Shujima Blog

Apple製品,技術系の話をするブログ

オーディオ用減衰器(電子ボリューム) LM1972MをRaspberry Pi (Python)で動かす

Keyword : LM1972M オーディオ 電子ボリューム アッテネータ 減衰 オペアンプ Raspberry Pi 3 Python 2 spidev python-spi

環境

回路

LM1972Mを含むオーディオミキサを製作しました. f:id:masa_flyu:20180927212748j:plain 3入力のオーディオミキサになっており,全ての入力に手動のボリュームが,うち1つの入力に電子ボリュームが入っています.

なお,この回路は真似しない方がいいです.LM1972Mとは無関係なところで,音質がめっちゃ悪かったので...

また,音量の切り替えの際にノイズが乗ります.これを防ぐ方法があるかは不明です.

一応LM1972Mに関わるところで,この回路はオーディオ入出力をコンデンサで直流絶縁し,0[V]になる点をGNDと分離しています.

nabe.adiary.jp

こちらにあるように単純なレールスプリッタで電源の中間電位(12[V]電源なのでおよそ6[V] )をオーディオ回路の0[V]電位としています.

LM1972MはロジックのGNDとアナログのGNDが分かれているため,それぞれ異なる電位に設定しています.

Raspberry Piとは * LOGIC_GND → GND (25番ピンなど) * CLOCK → GPIO 11 (SCKL, 23番ピン) * LOAD/SHIFT → GPIO24 (CE0, 24番ピン) * DATA-IN → GPIO10 (MOSI, 19番ピン) * DATA-OUT → GPIO9 (MISO, 21番ピン) の5本を接続します.

f:id:masa_flyu:20180927210204p:plain

Raspberry Piの準備

spidevをインストールします.

インストール手順は,こちらの記事が参考になります.

qiita.com

spidevのインストールさえできれば,以下のコードが動くはずです.

コード

訳あってPython2で書きました.

#!/usr/bin/env python2
# This is a python 2 program for LM1972M and Raspberry Pi
# (c) shujima1 , 2018

import spidev
import time

# Setup
spi = spidev.SpiDev()
spi.open(0,0) # 0 Channel

spi.max_speed_hz = 1000000 #[Hz]
spi.mode = 0b11 #SPI Mode 3

att = 0
cnt = 0

while True:
    if ( cnt % 400 < 100 ): # volume max
      att = 0
    elif ( cnt % 400 < 200 ): # volume down
      att = ( cnt % 400 - 100 )
    elif ( cnt % 400 < 300 ): # muted
      att = 127
    else: # volume up
      att = 100 - ( cnt % 400 - 300 )
    
    # Byte 0 : Channel , Byte 1 : Value
    resp = spi.xfer2([0,att]) #Channel 0
    resp = spi.xfer2([1,att]) #Channel 1
    
    print "Count: " , cnt , ",  Value:" , att , ",  Attenuation: " ,  
    if ( att != 127 ):
      print -att/2 , " [dB]"
    else:
      print "Muted"
    
    cnt += 1
    time.sleep(0.05)

コードの説明

このコードを実行すると,オーディオの音量がMAXからだんだん小さくなりMuteに,今度はMuteから音量が大きくなりMAXに,を繰り返します.

以下コードを部分ごとに分けてざっくり解説します.

# Setup
spi = spidev.SpiDev()
spi.open(0,0) # 0 Channel

spi.max_speed_hz = 1000000 #[Hz]
spi.mode = 0b11 #SPI Mode 3

SPIの設定をしています.今回はCE0の方に接続しています. モードや速度はデータシートを参照してください.

    if ( cnt % 400 < 100 ): # volume max
      att = 0
    elif ( cnt % 400 < 200 ): # volume down
      att = ( cnt % 400 - 100 )
    elif ( cnt % 400 < 300 ): # muted
      att = 127
    else: # volume up
      att = 100 - ( cnt % 400 - 300 )

変数cntは常に増加し続けます.cntの値に合わせて変数attを台形波状に0〜127の間で変動させます.

    # Byte 0 : Channel , Byte 1 : Value
    resp = spi.xfer2([0,att]) #Channel 0
    resp = spi.xfer2([1,att]) #Channel 1
    
    print "Count: " , cnt , ",  Value:" , att , ",  Attenuation: " ,  
    if ( att != 127 ):
      print -att/2 , " [dB]"
    else:
      print "Muted"

spi.xfer2(spidevの仕様を参照)関数を用いて,[0,att]の2バイト,続けて[1,att]の2バイトを送っています.これは,LM1972Mが備える2つの入力の音量を同時に変化させているためです.

attは音量の減衰量で,0〜-47.5[dB]の間は0.5[dB]刻みで減少します.-47.5[dB]も減衰させればほぼ完全な無音なため,ここでは,それより下を気にせず,-att/2 [dB]として表示しています.

またattの値を127に設定すると完全なMuteになります.

おまけ,

python3 コード(print行が違うだけ)

#!/usr/bin/env python3
# This is a python 3 program for LM1972M and Raspberry Pi
# (c) shujima1 , 2018

import spidev
import time

# Setup
spi = spidev.SpiDev()
spi.open(0,0) # 0 Channel

spi.max_speed_hz = 1000000 #[Hz]
spi.mode = 0b11 #SPI Mode 3

att = 0
cnt = 0

while True:
    if ( cnt % 400 < 100 ): # volume max
      att = 0
    elif ( cnt % 400 < 200 ): # volume down
      att = ( cnt % 400 - 100 )
    elif ( cnt % 400 < 300 ): # muted
      att = 127
    else: # volume up
      att = 100 - ( cnt % 400 - 300 )
    
    # Byte 0 : Channel , Byte 1 : Value
    resp = spi.xfer2([0,att]) #Channel 0
    resp = spi.xfer2([1,att]) #Channel 1
    
    print ( "Count: " , cnt , ",  Value:" , att , ",  Attenuation: " , end="" )
    if ( att != 127 ):
      print (-att/2 , " [dB]" )
    else:
      print ("Muted")
    
    cnt += 1
    time.sleep(0.05)

OMRON 環境センサ (2JCIE-BL01)の使い方

環境

ウェザーニュースのWxBeacon2でも動くと思われます.

セットアップ

モードの変更

買ってきたままのセンサを公式GitHubの通りに設定しても動きません.

qiita.com

にあるようにiPhoneまたはAndroidのアプリ「BLE Scanner」などを用いて,センサのモードを変更する必要があるようです.

上のQiita 記事では加速度センサを含まない代わりに不快指数などを含むEPモードに変更しています.

全センサの値を含めたい場合は下記記事を参照してください.

masa-flyu.hatenablog.com

理由はこちらを見なければわからないようですが,初見でこんなもの見せられてわかるわけないじゃ無いですか...

https://omronmicrodevices.github.io/products/2jcie-bl01/communication_if_manual.html

あとは公式GitHubページ

github.com

の通りに設定します.

正しく設定した状態で

$ python2 ./envsensor-observer.py

などのコマンドで実行すると,

----------------------------------------------------
sensor status : 2018-09-26 20:43:00.396593 (Intvl. 300sec)
 FA65BB20CE06 : EP : ACTIVE (2018-09-26 20:42:59.658104)

のようにEPに設定されたデバイスが発見されます.

初期設定のままだと,最初の表示までに5分かかります.

なお,前述のモード変更を行わないと,

----------------------------------------------------
sensor status : 2018-09-26 20:43:00.396593 (Intvl. 300sec)

のように,5分ごとに表示されますが,これはセンサデータを受信できていません.

公式Githubのソースを読んでみる

唯一まともであるはずの公式ライブラリですが,正直これを見て改変するのも容易じゃないという印象です. main文が長すぎますし,他から参照するのも大変でしょう. というわけで,結構長い時間をかけてソースを読んでみました.

別に大したことは書いていませんが,メモ程度にコメントを追加したりしたので一応載せておきます.

公式GitHubのソースは以下のファイルに分かれています.

  • envsensor_observer.py
  • ble.py
  • conf.py
  • csv_logger.py
  • sensor_beacon.py
  • str_util.py

それぞれの中身を読んでみます.

sensor_beacon.py

とても重要なファイルです. SensorBeaconクラスを保持しています.クラスのメンバは

    bt_address = ""
    seq_num = 0
    val_temp = 0.0
    val_humi = 0.0
    val_light = 0.0
    val_uv = 0.0
    val_pressure = 0.0
    val_noise = 0.0
    val_di = 0.0
    val_heat = 0.0
    val_ax = 0.0
    val_ay = 0.0
    val_az = 0.0
    val_battery = 0.0

    rssi = -127
    distance = 0
    tick_last_update = 0
    tick_register = 0

    flag_active = False

    sensor_type = "UNKNOWN"
    gateway = "UNKNOWN"

などがあり,センサのデータを保持しています.

ble.py

Bluetooth Low Energyパケットを解読するファイルです. 基本的に弄らなくても良いようです.

conf.py

様々な設定ができます. デバッグ中は5分待つのが大変なので,

CHECK_SENSOR_STATE_INTERVAL_SECONDS = 10

などに設定しておくと良いでしょう.

ただし電池持ちには注意です.

csv_logger.py

CSVファイルに書き込むためのファイルです. 書き込み処理の大部分はloggerモジュールに依存しているようで,中身はほとんどありません.

str_util.py

数値の形式を変換する関数の集まりです.

envsensor_observer.py

main文を内包し,環境センサの値を読むための実行ファイルです.

グローバル変数

使用されているグローバル変数は以下の通りです.

  • VER
    • バージョン用定数
  • GATEWAY
    • ホスト名
  • sensor_list[]
    • センサの情報を入れるSensorBeaconクラスのリスト.2JCIE-BL01が1つならばリスト長は1になる(温度センサ,加速度センサ,,と数えるわけではない)
  • flag_update_sensor_status
    • センサ情報をアップデートされたというフラグ.eval_sensor_state()関数内通過でTrue.

main内の変数

  • flag_scanning_started
    • main開始からBLEソケットが開くまでの間Falseその後ずっとTrue
  • args
    • プログラム起動時に渡される引数("-d"とか)をarg_parse()関数によって整理したもの.
    • args.debug
  • debug
    • プログラム起動時にdebugモードを指定されたときにmain文内でTrue.以降変化なしで,プログラム全体で使用される.
  • influx_client
  • csv_path
  • loghndl
    • CSVログファイルへのハンドル
  • form
    • CSVファイルの書式
  • log
  • sock
    • BLEソケットのハンドル
  • timer
    • eval_sensor_state()関数を走らせるタイマースレッドのインスタンス.conf.CHECK_SENSOR_STATE_INTERVAL_SECONDS 秒後から開始される.なお,eval_sensor_state()関数内にも同じコードがあり,30秒ごとに自分を呼び出す.
  • old_filter
    • bluezのBLE端末検索条件を変更する前に以前の状態を記憶しておく変数.プログラム終了時に書き戻す.
  • flt
    • 新規に取得したフィルタ

parse_events(sock, loop_count=10)

BLE通信で受信したあらゆるパケットについて,bleモジュールを利用して解析します.

OMRON製品かつデバイスの名前(Local Name)が"EP"または"IM"など,複数の条件を満たしたパケットの場合はble.verify_beacon_packet()がTrueとなります.

これを利用して,環境センサからのパケットを判別し,発見したパケットが,どのセンサから送られたものかを調べ,sensor_listを更新します .

handling_data(sensor)

センサのデータを各出力先(クラウドCSV)に渡します.

eval_sensor_state()

この関数自体がCHECK_SENSOR_STATE_INTERVAL_SECONDS(標準で5分)の間隔で定期的に実行されます.

センサからの信号がタイムアウトに設定した時刻以内に来ているかを確認し,来ていなければタイムアウト処理をします.

その後,"flag_update_sensor_status"フラグを立てて,main関数内で,状態をprintさせます.

print_sensor_state()

main関数から呼ばれる,print用の関数です.

return_number_packet

return_string_packet(pkt)

find_sensor_in_list(sensor, List)

List(SensorBeaconクラスの配列)の中からsensor( SensorBeaconクラス)と同じセンサを探索します.

判断にはアドレスを用いており,一致するアドレスのセンサがあれば,その要素の番号,無ければ-1を返します.

init_fluentd()

fluentdをセットアップします

create_influx_database()

influxをセットアップします

arg_parse()

"envsensor_observer"実行時の引数(--debugなど)をチェックします

main

mainです.

# main文だけ抜き出している.


# main function
if __name__ == "__main__":
    try:
        flag_scanning_started = False

        # 引数の受け取り(--debug)
        # process command line arguments
        debug = False
        args = arg_parse()
        if args.debug:
            debug = True


        # reset bluetooth functionality
        try:
            if debug:
                print "-- reseting bluetooth device"
            # ble通信の開始
            ble.reset_hci()
            if debug:
                print "-- reseting bluetooth device : success"
        except Exception as e:
            print "error enabling bluetooth device"
            print str(e)
            sys.exit(1)

        # クラウド(influxDB)の設定(デフォルトではオフ)
        # initialize cloud (influxDB) output interface
        try:
            if conf.INFLUXDB_OUTPUT:
                if debug:
                    print "-- initialize influxDB interface"
                influx_client = InfluxDBClient(conf.INFLUXDB_ADDRESS,
                                               conf.INFLUXDB_PORT,
                                               conf.INFLUXDB_USER,
                                               conf.INFLUXDB_PASSWORD,
                                               conf.INFLUXDB_DATABASE)
                influx_client.create_database(conf.INFLUXDB_DATABASE)
                if debug:
                    print "-- initialize influxDB interface : success"
        except Exception as e:
            print "error initializing influxDB output interface"
            print str(e)
            sys.exit(1)

        # fluentdの設定(デフォルトではオフ)
        # initialize fluentd forwarder
        try:
            if conf.FLUENTD_FORWARD:
                if debug:
                    print "-- initialize fluentd"
                init_fluentd()
                # create database when using influxDB through fluentd.
                if conf.FLUENTD_INFLUXDB:
                    create_influx_database()
                if debug:
                    print "-- initialize fluentd : success"
        except Exception as e:
            print "error initializing fluentd forwarder"
            print str(e)
            sys.exit(1)

        # CSVファイルの設定
        # initialize csv output interface
        try:
            if conf.CSV_OUTPUT:
                if debug:
                    print "-- initialize csv logger"

                if not os.path.isdir(conf.CSV_DIR_PATH):
                    os.makedirs(conf.CSV_DIR_PATH)
                csv_path = conf.CSV_DIR_PATH + "/env_sensor_log.csv"
                # create time-rotating log handler
                loghndl = csv_logger.CSVHandler(csv_path, 'midnight', 1)
                form = '%(message)s'
                logFormatter = logging.Formatter(form)
                loghndl.setFormatter(logFormatter)

                # create logger
                log = logging.getLogger('CSVLogger')
                loghndl.configureHeaderWriter(envsensor.csv_header(), log)
                log.addHandler(loghndl)
                log.setLevel(logging.INFO)
                log.info(envsensor.csv_header())

                if debug:
                    print "-- initialize csv logger : success"
        except Exception as e:
            print "error initializing csv output interface"
            print str(e)
            sys.exit(1)

        # 
        # initialize bluetooth socket
        try:
            if debug:
                print "-- open bluetooth device"
            sock = ble.bluez.hci_open_dev(conf.BT_DEV_ID)
            if debug:
                print "-- ble thread started"
        except Exception as e:
            print "error accessing bluetooth device: ", str(conf.BT_DEV_ID)
            print str(e)
            sys.exit(1)

        # set ble scan parameters
        try:
            if debug:
                print "-- set ble scan parameters"
            ble.hci_le_set_scan_parameters(sock)
            if debug:
                print "-- set ble scan parameters : success"
        except Exception as e:
            print "failed to set scan parameter!!"
            print str(e)
            sys.exit(1)

        # start ble scan
        try:
            if debug:
                print "-- enable ble scan"
            ble.hci_le_enable_scan(sock)
            if debug:
                print "-- ble scan started"
        except Exception as e:
            print "failed to activate scan!!"
            print str(e)
            sys.exit(1)

        flag_scanning_started = True
        print ("envsensor_observer : complete initialization")
        print ""

        # activate timer for sensor status evaluation
        timer = threading.Timer(conf.CHECK_SENSOR_STATE_INTERVAL_SECONDS,
                                eval_sensor_state)
        timer.setDaemon(True)
        timer.start()

        # preserve old filter setting
        old_filter = sock.getsockopt(ble.bluez.SOL_HCI,
                                     ble.bluez.HCI_FILTER, 14)
        # perform a device inquiry on bluetooth device #0
        # The inquiry should last 8 * 1.28 = 10.24 seconds
        # before the inquiry is performed, bluez should flush its cache of
        # previously discovered devices
        flt = ble.bluez.hci_filter_new()
        ble.bluez.hci_filter_all_events(flt)
        ble.bluez.hci_filter_set_ptype(flt, ble.bluez.HCI_EVENT_PKT)
        sock.setsockopt(ble.bluez.SOL_HCI, ble.bluez.HCI_FILTER, flt)


        #無限ループ
        while True:
            # ble通信のイベントをチェック
            # parse ble event
            parse_events(sock)
            # "flag_update_sensor_status"フラグが立ったら
            # eval_sensor_state()内でCHECK_SENSOR_STATE_INTERVAL_SECONDSごとにフラグを立てている(デフォルトで5分ごと)
            if flag_update_sensor_status :
                # センサの情報を表示する
                print_sensor_state()
                # フラグを戻す
                flag_update_sensor_status = False

    except Exception as e:
        print "Exception: " + str(e)
        import traceback
        traceback.print_exc()
        sys.exit(1)

    finally:
        if flag_scanning_started:
            # restore old filter setting
            sock.setsockopt(ble.bluez.SOL_HCI, ble.bluez.HCI_FILTER,
                            old_filter)
            ble.hci_le_disable_scan(sock)
        print "Exit"

iPad Pro × Apple Pencil にオススメなメモ,ノートアプリ比較

iPad Pro 10.5インチとApple Pencilを買いました.

これで快適にペーパーレス!!と思ったのですが,意外にも,きちんとApple Pencilでの手書きに対応したアプリが少ないんです(2017年時点での体感).

後々比較が出てきますが,今回調査対象としたアプリのうち,Apple純正意外のアプリは全てPencilの傾き検知に対応していませんでした.

「じゃあApple純正アプリがいいんだね!」と思った方,残念ながら,純正アプリはゴミです.

メモは複数枚に渡るノートを取るのには不適切ですし,Pagesもページに直接書くというより,Pencil編集モードのように切り替わってしまうため,たくさんノートを取ることを想定していません.

それどころか,ペンの太さなどがあまり選べず,筆記に適していない細すぎる鉛筆や,太すぎるペンなどしかあらず,書き心地が悪い有様です.

iOSiWorkのアップデートがなされるまで使うことはないでしょう.

iOS 10から11で機能削減が行われたのであまり期待できませんが...

ということで,Apple Storeでいくつかアプリを買いあさり,比較してみました.

なお,私がノートアプリに求めた機能は

  • Apple Pencilですらすら書ける
  • Apple Pencilの筆圧検知や傾き検知に対応している
  • Split View,Slide Overに対応している
  • テキストや図を切り替えずに書ける

Split ViewとはiPadで2つのアプリを同時に使用できる機能です. Slide Overは他のアプリの上に小さく(1/4幅で)重ねて使用できる機能です.

f:id:masa_flyu:20180910220001j:plainf:id:masa_flyu:20180910220003p:plain
←2つのAppを同時に使えるSplit View , 別のAppの手前にAppを表示できるSlide Over→

私の環境

調査対象アプリ

Pages

Pages

  • Apple
  • 仕事効率化
  • 無料

Notability

Notability

  • Ginger Labs
  • 仕事効率化
  • ¥1,200

MyScript Nebo

MyScript Nebo

  • MyScript
  • 仕事効率化
  • ¥960

MetaMoJi Note

MetaMoJi Note

  • MetaMoJi Corporation
  • 仕事効率化
  • ¥960

Whink

Whink

  • Rama Krishna
  • 仕事効率化
  • ¥600

Tayasui Memopad

Tayasui Memopad

  • Tayasui.com
  • 仕事効率化
  • 無料

比較表

2018年 9月10日現在

機能 メモ Pages Notability MyScript Nebo MetaMoJi Note Whink Note Tayasui Memopad
Apple Pencil
パームリジェクション
筆圧検知 × ×
ペン傾き検知 × × × × ×
Split View ×
Slde Over ×
文字認識 × × × × ×
テキスト入力
直線を描く × × ×
iCloud × × ×
他のクラウド × × ×
書き心地(主観) -
有料版価格 付属 付属 1,200円 960円 960円 600円 -
無料版 付属 付属 × × ×
追加課金 付属 付属 - - - -

使ってないので比較してない有名どころアプリ:Evernote,GoodNotes 4,NoteShelf 2,Note Always ,Notes Plus

※記事を書くために試したのでは無く,自分で納得のいくアプリを探していた結果いろんなアプリを試すことになったため,有名なアプリでも使っていないものが多々あります.Notabilityを気に入ってしまったので,今後使うことは無いでしょう.

1位 Notability

f:id:masa_flyu:20180910212107p:plain

※字が汚いのは私のせいです.

この記事はこのアプリを推したいがために書きました.私の求める用途には一番合ってます.

普通に文字を書くことが一番綺麗にできます.

UIもシンプルで,ペンの種類を変えたりするのも簡単です.

月に1回以上の頻度で数年間アップデートを続けており,新機能への対応も早いです.

f:id:masa_flyu:20180910212110p:plain

App Storeのストーリーがありましたが,これ書いた人使ってないんじゃないでしょうか.

このアプリの売りは,ノートを取りながら録音できること...らしいのですが,はっきり言ってどうでもいいです.

いえ,録音が不要なのではなく,単純なノートアプリとしての完成度が一番高いことをもっと宣伝してくれ!って言いたい.

また,今年前半のアップデートで,手書き文字の認識に対応しました.

別の方の紹介ブログ

it-education.hatenablog.com

検索バーでは,テキスト文字と手書き文字を区別無く検索できるほか.. f:id:masa_flyu:20180916233220p:plain

文字を囲って「テキストに変換」を選択すれば.. f:id:masa_flyu:20180916233459p:plain

この通りテキストに置き換えられました. f:id:masa_flyu:20180916233437p:plain

iPadを買おうか迷っている方,今すぐ買って,ノートをデジタル化しないと後悔しますよ?ってレベルです.

iPad 6th + Apple Pencil + 紙風フィルム + Notability 5万円で始まるペーパーレス生活.

ようこそ未来へ.

Apple iPad Pro Appleペンシル/MK0C2J/A

Apple iPad Pro Appleペンシル/MK0C2J/A

四方八方隙のないようにみえるNotabilityですが,唯一の欠点はアイコンがダサいことですね.

メモ帳とマイク機能くっつけた雑なアプリなんだろうなーと思って,いい評判を聞き流して,別のアプリばかり試していました.

もっと早く買えば良かったと後悔しています.

他のアプリで書いてしまったノートがもったい無い...

Notability

Notability

  • Ginger Labs
  • 仕事効率化
  • ¥1,200

2位 MyScript Nebo

f:id:masa_flyu:20180910214138p:plain

(以下を書いた時,まだNotabilityのテキスト認識対応アップデートを知りませんでした.今ではNeboのメリットはかなり薄れてしまいました.)

手書きの文字を自動でキー入力のテキストに変換してくれる,素晴らしいアプリです.

画面下に書いたクソ汚い文字を見てください.こんな汚くても1文字しか間違えません!(なお,誤認識文字をタップすると5つくらい候補が出てきます)

残念ながら私の用途にマッチしなかったため1位にはなりませんでしたが,購入する価値は十分にありました.

友人たちが愛用しており,僕も人に勧めることが多いアプリです.

自分に合わないなーと思った理由は,私がノートに場所を気にせず殴り書きしたいタイプだからです.

このアプリは

  • 罫線に沿った文字記入
  • 明示的に用意した記入欄に図を描く

必要があるため,ちょっと難ありです.

手書きの雑なノートを勝手に清書してくれるという,本来の目的に沿っていれば,非常に素晴らしいアプリです.

MyScript Nebo

MyScript Nebo

  • MyScript
  • 仕事効率化
  • ¥960

3位 MetaMoJi Note

f:id:masa_flyu:20180910215359p:plain

とても良くできたノートアプリです.

基本的なノートとしての機能が高く,タブ表示などをサポートしています.

書き味も悪くないです.

独自のクラウドでバックアップもされます.

至れり尽くせりですが,アップデート頻度とその内容が乏しいという問題があります.

Split ViewどころかSlide Over(小さい側)すら対応していません.

また,iPad Pro 10.5インチの解像度に対応しておらず,少しぼやけます.

私はiPad Pro購入後しばらく愛用していましたが,Notabilityを試しに買ってハマったので,それ以来使ってません.

モダンな機能に興味が無い,9.7インチiPad(もしかしたら12.9インチも)を使ってる人におすすめです.

無料版があるので,そちらでも十分だと思います.

MetaMoJi Note

MetaMoJi Note

  • MetaMoJi Corporation
  • 仕事効率化
  • ¥960

無料版は以下

MetaMoJi Note Lite

MetaMoJi Note Lite

  • MetaMoJi Corporation
  • 仕事効率化
  • 無料

Apple Watch Series 2とSeries 3 両方買ってみた比較(ついでに4とも)

AppleオタクなのにブログがAppleオタク感無いことに気づいて,急遽書きました.

Apple Watch Series 2 アルミニウムモデルとSeries 3 ステンレスモデルの比較です.

両方買ったオタクは少ないんじゃないでしょうか.

両方購入の背景

2017年4月「Appleオタクであることを証明するものが欲しい」という理由だけで,Apple Watchを買ってしまいました.

買ってしまった以上,活かさねばという思いで始めたランニングが,体調,性格の明るさにまで影響するようになり,本当にいい買い物でした.

2018年1月,悟りを開き「AppleオタクならステンレスWatchを持っていないと恥ずかしいのでは?」という思想に至りました.

9ヶ月しか使っていないSeries 2を友人に高値で売却し,Series 3のステンレスセルラーモデルを購入するに至りました.

f:id:masa_flyu:20180910182447j:plain

写真に写ってるバンドは一緒に買った,

  • Apple純正のモダンレザー
  • Amazonで安かったクラシックレザーもどき

Apple Watch バンド アップルウォッチ交換バンド Apple Watch革ベルト 柔らかい高級 牛革スマートウォッチ 時計バンド Apple Watchレザーバンド 38mm 42mmに対応 the band for Apple watch series1/Apple watch series2/Apple watch series3

です.

Series 2はNikeコラボのスポーツバンド,Series 3はミラネーゼループをつけて買ったので,一時期4つのバンドを持ってました.

f:id:masa_flyu:20180910183530j:plain (その後クラシックレザーもどきはSeries2と一緒に友達にあげました)

そんな金どっから出てきたんだよって自分でも思います.

さすがにSeries 4は買いません.たぶん...

カタログスペックの差

で,本題ですが,Series 2とSeries 3は何がどのくらい違うのでしょう? まず,カタログスペックで見てみましょう.

項目 Series 2 (GPS) Series 3 GPS Series 3 GPS+セルラー Series 4 GPS+セルラー
SoC Apple S2 S2より70%高速な Apple S3 S2より70%高速な Apple S3 S3より2倍高速な Apple S4
ストレージ 8GB 8GB 16GB 16 GB
GPS
気圧計 ×
LTE × ×
Bluetooth 4.0 4.2 4.2 5.0
Wチップ × W2 W2 W3
ディスプレイサイズ[mm2] 563 563 563 759
心拍センサ 光学式 光学式 光学式 光学式+電気式
加速度・ジャイロ 高感度
厚さ[mm] 11.4 11.4 11.4 10.7

Series 3とSeries 4はディスプレイの大きさや本体サイズなど多くの違いがあります(バンドは互換性あり).

一方で,Series 2とSeries 3の主な違いは「セルラーに対応しているかいないか」くらいで,他の性能については,それほど目立った差はありません.

セルラーモデルやSeries 4を買う場合はともかくとして,Series 2とSeries 3のGPSモデルでは,些細な性能の差しかないように思えます.

体感の差 (Series 2 vs Series 3)

では,本題ですが,Series 2 と Series 3は実際使ってみて何が違うのでしょうか?

体験談を書き出してみました.

Suica決済が早い

実用上最も差が大きい部分です.

Apple Watch Series 2では改札に当ててから0.3秒ほど間があいてから「ピピッ」っとなってました.

たった0.3秒ですが,一度立ち止まらなければならず,後ろの人がぶつかりそうになることもしばしばでした.

Series 3では一般的なカードのSuicaと同等なスピードに改善されています.

Suicaを使いたい人は,Series 2はあまりおすすめできません.

余談ですが,Series 3では改札タッチ時に少し離れていても反応します.

改札タッチ面に触れなくても,その横に垂直に触れても反応するので楽です.

f:id:masa_flyu:20180914090005j:plain

電池持ちは改善

セルラーになって電池持ち悪くなったのでは?という考えもあるかもしれませんが,普通に暮らしていたらまったく影響ありません

あくまで自分の体感ですが,全体的に電池持ちは向上しているようです.

使用内訳 Series 2 Series 3
電池持ち:日常的な使用(ワークアウトなし) 30時間 40時間
電池持ち:日常的な使用(ワークアウト30分) 20時間 30時間
電池持ち:日常的な使用(エクスプレスカード) 15時間 35時間
ワークアウト30分での減少量: 20% 15 %

※数値はかなりおおまか

※僕はSeries 2のときエクスプレスカードの設定でめちゃめちゃ減りました.初代Apple Watchでエクスプレスカード付けっ放しにしてる人もいたので,普通はそんなに減らないのかもしれません.

ワークアウト(Apple Watchの運動アプリ)を行わない場合,1泊2日なら充電なしで問題なくいけます.

30分,セルラー環境でランニングしても10〜20%しか減りません.

ランニング中はApple Watchのセンサーをフル活用するため,Series 2でも同等かそれ以上減ります.

Series 2 時代は節電のためにSuicaのエクスプレスカード(常にSuica決済が有効になる)設定をこまめに入切していたのですが,その必要もありません.

UIのもたつきは若干少ない

ホームを開いた時,アプリを起動した時などのロード時間はほとんど変わった印象はありません.

watchOS3 から 4への変化の方が大きかったです.

Bluetoothペアリングが早くなった

Bluetoothのバージョンの変化,W2チップの搭載によるものか分かりませんが,イヤホン( Power Beats 3 )との接続がとても早くスムーズになりました.

以上のまとめ

Apple Watch Series 2とSeries 3はスペック差はほとんどありません.

しかしながら,細部の進化は無視できず,特にSuicaを使う人にとっては大きなアドバンテージだと思います.

よってこれから旧世代のApple Watchを買う方はSeries 2よりSeries 3をお勧めします.

セルラーモデルであるべきか否か

実はこのブログはSeries 4発売に向けて友人たちに販促するために書いてるわけですが,友人たちにいつも言ってるのは「セルラーモデルじゃなくていい」です.

意見の理由

Apple Watchでのインターネットとの通信の優先順位は,上から順に

  • BluetoothでiPhone経由で通信
  • 周囲のWi-Fi経由で通信
  • セルラーで通信

となります.iPhoneが近くにあるとき,あるいは家の中にいるときは,基本的にセルラーを使用しません.

ではそうでない局面はといえば

  • ランニング中
  • 水泳中

くらいじゃないでしょうか.

セルラーが嬉しいとき

運動中の通知

ランニング中も通知が受け取れるようになります.

簡単なLINEの返信などもできるため,友人たちに驚かれることもあります.

また,水泳のような長時間のワークアウトはセルラーモデルの恩恵が大きいなと思いました.

通知が邪魔なら切れますし.

Apple Music

Apple Musicを使っている人は,運動中に聴く音楽をストリーミング再生できます.

ただし,セルラーモデルでなくともiPhoneのミュージックライブラリの一部を勝手にダウンロードして再生できるようになってるので,きちんと設定しておけば,それほど大きな違いではありません.

緊急通報

滅多に使うものじゃありませんが,大変重要な機能です.

人気のないところでランニング中に体調を崩した時,セルラーモデルなら本体のボタンを長押しするだけですぐ救急に電話できます.

なぜセルラーじゃなくてもいいか

価格差に見合わないからです.

セルラーとそうでない機種の価格差は9000円もあります.

にも関わらず,その恩恵が受けられるのは上記に示した運動中くらいだけです.

この9000円の価格差に見合う恩恵を受けられる人は現状限られるのではないでしょうか?

なお,Apple Payについては,基本的に通信は関係ありません

iPhoneが近くになくても,問題なくSuicaやクレジットカードを使用できます.

セルラーモデルを使える人は限られている

上記を読んだ上で,9000円の価格差ならとセルラーモデルを選ぶ人もいるでしょう.

購入する前に確認していただきたいですが,あなたのiPhone,セルラーモデルに対応していますか?

より正確に言えば,あなたのiPhoneに入ってるSIMはセルラーモデルのApple Watchに対応したものですか?

現状日本では,格安SIMでApple Watchに対応したものはありません.iPhoneには3大キャリア(docomo,au,SoftBank)のいずれかのSIMが入っている必要があります.

対応を目指しているMVNOもありますので,最新の情報を調べてから購入してください.

www.huawei-report.com

アルミとステンレスどちらが良いか

さて,さらに余談になりますが,アルミニウムケースとステンレスケースの違いについて述べます.

私の意見は,アルミニウムモデルが良いと思いました.別にステンレスモデルを買ったことを後悔してる訳ではありませんが,次はアルミニウムモデルにするかもなーと思っています.

デザイン

これは好みでしょう.

基本的にアルミはサラサラとした梨地,ステンレスはツルツルとした鏡面仕上げという差があります.

私はどちらも好きです.

ただ,高級感という面ではステンレスの勝利でしょう.

傷のつきやすさ(ガラス)

アルミニウムモデルはガラスがiPhoneのディスプレイと同じタイプ,ステンレスモデルはiPhoneのカメラ部と同じサファイアクリスタルを用いています.

ガラスの場合

傷のつきやすさはYoutubeとかで検証されている通りサファイアクリスタルの方が低いのですが,ぶっちゃけ日常生活では差がありません.

Series 2のとき,思いっきり金属にぶつけたことがありますが,傷一つつきませんでした.

サファイアガラスの場合

今の所アルミニウムモデルと同じく傷はありません.

サファイアならもっと傷つきにくいのでしょうが,今の所そんなにぶつけないのでわかりません.

傷のつきやすさ(ケース)

アルミニウムモデルの場合

これについては,一番差が大きい部分と思われるでしょうが,これも微妙です.

アルミニウムモデルはiPhoneと同じく傷がつきやすいと思われます.

ただ,iPhoneと違ってApple Watchはまず落としません.

1回だけ,付け外しの時にアスファルトの地面に落としましたが,本体の軽さもあって,特に傷はつきませんでした.

結局,1年弱使って,目視で分かる傷は1つもつきませんでした.

ステンレスモデルの場合

一方のステンレスモデルですが,こちらは非常に細かい傷がたくさんつきます.

なぜステンレスの方が傷ついているかといえば,それは仕上げの問題だと思います.

アルミニウムモデルの梨地の場合,細かい傷は梨地のデザインに埋もれてわかりません.

ステンレスモデルの鏡面の場合,光の反射を見ることで,細かい傷まで見えてしまいます.

じゃあその傷がデザインを損なうかと言われると,それは違います.

傷はまじまじと見なければ,気づかないですし,硬いステンレスのおかげで,汚い傷ではなく,連続的な綺麗な傷になります.

ただ,売るとなると傷は傷ですから,中古価格を気にする方はステンレスモデルの取り扱いには気をつけた方がいいかと思います.

masa-flyu.hatenablog.com

masa-flyu.hatenablog.com

masa-flyu.hatenablog.com

iPhone/iPadを12Wで高速充電する回路

概要

iPhone/iPadはUSB経由で充電を行いますが,標準的なUSB2.0規格であれば500[mA]しか流すことができません.

iPhone/iPadに対応した充電器は,USBのデータ通信線D+とD-に規定の電圧を流すことで,より多くの電流に対応していることをiPhone/iPadに伝えます.

今回,D+とD-を複数の組み合わせで試し,iPadを高速に充電するためにはD+を2.7[V],D-を2.7または2.0[V]とすべきであると結論づけました.

なお,iPhoneは機種ごとに最大給電電力が異なるため,12Wフルで活用されることはありません.

はじめに

スマートフォンやタブレットはUSB経由で充電します.

しかしながら,充電器で一般的なUSB 2.0端子は500[mA]しか流せません.

iPhoneやiPadは,より高速な充電のためにD+,D-の電圧がある特定の値のとき,より多くの電流を受けるようになっています.

Apple公式のドキュメントというのは公開されていないようなので,ネットで情報を集めた感じ次のような電圧のようです.

stevenchen886.blogspot.com

D+の電圧 D-の電圧 設定最大電流[A](おそらく)
2.0 2.0 0.5
2.0 2.7 1.0
2.7 2.0 2.1
??? ??? ???

らしいです.というわけで,ちょっと実験してみました.

実験1

実験方法

通常の充電器の性質を知るために,iPadを高速に充電できる,充電器について,D+,D-の電圧,iPad充電時の電流を調べました.

なお,D+,D-の電圧はiPad未接続時

実験環境

項目 内容 備考
端末 iPad Pro 2017 10.5 バッテリー残量は10〜20%
配線 Apple 純正 ライトニングケーブル(1m)
電源 ALINCO DM-330MV 5Vに設定
テスタ METEX M-6000H

Anker PowerPort 2 Eco (12W 2ポート USB急速充電器) iPhone/iPad/MacBook/Android 各種対応【折り畳み式プラグ/PowerIQ & BoltageBoost】(ホワイト)

実験結果

電圧

データ線 iPad未接続時の電圧[V] iPad接続時の電圧[V]
D+ 2.678 3.245
D- 2.675 0.029

電流

1.60[A] f:id:masa_flyu:20180908225144j:plain

考察

iPad 未接続時の電圧はD+,D-共に約2.7[V]でした.

これは事前に調べた,どの組み合わせにもあてはまりません.

このパターンも含めて回路を自作して試すことにします.

実験2

実験方法

以下の回路図に示すような回路を用意し,それぞれの端子にiPadを接続したときの電流値を測定しました.

f:id:masa_flyu:20180908223038p:plain

4つのUSB端子について,D+とD-の電圧を4パターン試してみました.

上記記事の3つに加えて,D+,D-ともに2.7[V]となる組み合わせも試しました.

左から順に1.0[A],2.1[A],???[A],0.5[A]となるように設定しました(上記の記事が正しければ).

実験環境

項目 内容 備考
端末 iPad Pro 2017 10.5 バッテリー残量は10〜20%
配線 Apple 純正 ライトニングケーブル(1m)
電源 ALINCO DM-330MV 5Vに設定
テスタ METEX M-6000H

基板の事前測定

電源電圧 5.091[V]時

設定最大電流 D+ 目標電圧 D+測定電圧 D- 目標電圧 D-測定電圧
0.5 2.0 2.042 2.0 2.044
1.0 2.0 2.028 2.7 2.726
2.1 2.7 2.723 2.0 2.023
2.4 2.7 2.724 2.7 2.723

実験結果

f:id:masa_flyu:20180908223909j:plainf:id:masa_flyu:20180908223917j:plain

左:1.0[A],右:2.1[A]

f:id:masa_flyu:20180908223933j:plainf:id:masa_flyu:20180908223926j:plain

左:???[A],右:0.5[A]

D+の電圧 D-の電圧 設定最大電流[A](おそらく) 実測電流[A]
2.0 2.0 0.5 0.47
2.0 2.7 1.0 0.95
2.7 2.0 2.1 1.46
2.7 2.7 ??? 1.54

設定最大電流の小さい2つ(0.5[A],1.0[A])は実測電流がそれよりわずかに下回る値を測定しました.

0.5[A]のときは,iPadのステータスバーに「充電していません」と表示されました.

f:id:masa_flyu:20180908235152p:plain

設定最大電流2.1[A]のとき,実測電流は1.46[A]と,大きく下回りました.

設定最大電流のわからない組み合わせのとき,実測電流は1.54[A]と設定されました.

考察とまとめ

一番大きな電流が流れたのは,D+,D-共に2.7[V]の1.54[A]でした.実験1の結果と,以上の結果を踏まえるに,設定最大電流は

D+の電圧 D-の電圧 設定最大電流[A]
2.0 2.0 0.5
2.0 2.7 1.0
2.7 2.0 2.1
2.7 2.7 2.4?

と埋められるべきではないでしょうか.

一方で,電流は最大でも1.6[A]以下しか流れませんでした.

バッテリは残量10〜20%になるまで減らしてあるので,てっきり2.4[A]ギリギリまで流れる組み合わせがあると思っていたのですが,実際には異なりました.

iPadの充電電流についてもっと調べる必要がありそうです.

とりあえず,iPadを高速充電するにはD+を2.7[V],D-を2.7または2.0[V]とすべきであるとは言えそうです.

現状,最良の選択肢は,D+,D-共に2.7[V]となる組み合わせです.

データ線 ハイサイド抵抗[Ω] ローサイド抵抗[Ω]
D+ 39k 47k
D- 39k 47k
当ブログをご利用いただく際には免責事項をお読みください。