怠惰になるために本気出す

電子工作で色々作ってます

WF-1000xm4が2台同時接続可能に!

発売されてから1年以上経っていると思いますが依然としてワイヤレスイヤホン界で高い評価を受けているWF1000xm4。

前作のWF-1000xm3を使用していて音は言わずもがな良い音なのですが、

  • ノイズキャンセリングが強すぎて長時間使用していると耳が痛くなる
  • ケースを含め全体的に大きい
  • イヤホン自体バランスが悪く、イヤホンのボタンが押しにくい

など致命的な不満が多くあり自然と使わなくなってしまいました。

後継機のWF-1000xm4は優秀

最近WF-1000xm4に買い換えたのですが、前作の悪い点が全て払拭されていて音楽を聴くことが楽しくなり頻繁に持ち歩いています。

それに加えて今年の冬のアップデートでマルチポイントに対応するようです!
av.watch.impress.co.jp


マルチポイントとは?
www.ankerjapan.com


マルチポイントが使えるようになると例えば iphoneipadを持っていて、普段は iphoneで使いたいけど動画見る時はipadで使いたい時にイヤホンの電源が入った時に2台同時に接続してくれるため、ipadで動画見てる時に iphoneに着信があった際は装着してるイヤホンで電話を受けることができます。

数多あるワイヤレスイヤホンで音のいいイヤホンでマルチポイント対応しているものは実はあまりないため今回のアップデート非常にありがたいです。


【QOL】単四電池へ統一化

家で使用しているパソコンのキーボードやマウス、置時計で単一や単三などそれぞれ違う電池をしようしているため別々に電池を購入していたのですが、そんなに頻繁に交換するものでもないのにずっと置いておくのも邪魔でなのでどうにかできないものかと考えていたら今の世の中便利なもので電池のスペーサーというものがあるようです。


単四電池をある程度購入しておき、その他の電池を使用する場合は
単四電池+スペーサー =単三電池
単四電池+スペーサー =単一電池
という感じでそれぞれの電池として使用できるようになるため単四電池以外購入する必要がなくなります。
さらに単四電池もEneloop等の充電式電池にしてしまえばわざわざ電池を買いに行く必要もなくなってしまいます。

体温計で使われるボタン電池も改造して単四電池用の電池ボックスをつけて動かせるようにしようかと思ったのですがさすがにそこまですると邪魔になりそうなのでやめました。

とはいえ管理する電池が単四電池だけでよくなったことは大きいです。

格安SIMの選び方(私の場合)

これまではUQモバイルを契約して特に不満なく快適に利用していたのですが、データの使いすぎで先日久しぶりに通信制限をくらってしまいました。幸い月末で外出する機会がなかったので事なきを得ましたが、これを機に契約を見直してみようと重い腰を上げました。

なので私が新たに契約したMVNO及びプランを紹介していこうと思います。

 

条件

音声通話

→数分間無料プランならなんでも可

データ通信

→大容量(最低20GB以上)かつテザリングが可能

 

音声通話はLINEがあり電話はほとんど使わないので何かあった時用に数分間無料プランを、データ通信は車や新幹線など移動する機会が多いのでそういった場合でも困らないように大容量プランを探しました。

 

現段階の個人的な最適解

povo2.0

au格安simで基本料金無料。自分好みにトッピング選択ができ自由度が高いです。仮にデータ使いすぎた場合でもデータ使い放題(24時間)プランもあるので困ることはなさそうです。

povo.jp

 

DTI SIM

docomo回線で大容量使える企業の一つです。

大容量のSIMというと多くがsoftbank回線で、softbank回線だとオプションプランに加入するとテザリングできるようになるようなのですが、MVNOの企業でテザリングを選択できるプランがあるケースはほとんどありません。

そのため、オプションで加入する必要がないdocomo回線であるこちらにしました。

dream.jp

 

 

以前

  企業 プラン 合計
通話 UQモバイル 10分間無料プラン 約2900円
データ 3GBプラン(Sプラン?)

 

新規契約

  企業 プラン 料金 合計
通話 povo2.0 5分間無料プラン 550円/月 2970円/月
データ DTI SIM 1.4ギガ使い切り 2420円/月

 

最近の iphoneはデュアルSIMとなっているためnano simをDTI SIM、eSIMをuqモバイルで使用しています。

 

値段ほぼ変わらずデータ容量が大幅に増えました。

 

当初の予定ではFUJI SIMのSIMプランの50Gプランにするつもりでしたが、FUJI SIMはsoftbank回線であり残念ながらテザリングができないため断念しました。

テザリングしないという方なら大容量で料金も安いのでおすすめです。

fuji-wifi.jp

 

まとめ

使い始めて一週間経過しました。音声通話は遅延等はありませんでした。また、データ通信は通勤時や昼休憩時などは全く使えないと聞いていましたが、通勤は徒歩でビルが密集する地域でもないため昼休憩時も回線が重たいということも特段ありませんでした。が、先日大阪駅に行く機会があり20時頃に使おうとしたのですが動画だけでなくWEBページさえ開くことができませんでした。住んでいる地域や利用する場所によって大勢の人が利用しようとするとつながりにくくなっているようです。これはどこのMVNOでもかかえる問題なので仕方がありません。

とはいえ、料金プランを見直すことで支払い料金が以前とほぼ変わらずデータの容量を大幅に増やすことができました。

 

料金プランの見直しは正直面倒です。一人当たりだと大した金額ではないかもしれませんが家族単位となると大幅に変わる可能性があります。これを機に一度見直してみてはどうでしょうか?

 

USB扇風機におやすみタイマーとゆらぎ風を作ってみた

夏ということで扇風機を使うようになったのですが、安物のUSBタイプの扇風機なので弱と強の二択しかない貧弱なやつなのでずっと扇風機にあたっていると体が冷えるし、かといって扇風機を回していないと暑いのでどうにかならないかと思っていました。

「鳴かぬなら鳴かせてみようホトトギス」信長さんもなんて言うし「ないのなら作ってみせようリズム風」ということで作りました。せっかくなら車中泊する際に体が冷えすぎないようにおやすみタイマーもつけておいて汎用性を高くしたいと思います。

私が持っている扇風機は扇風機側のスイッチを入れた状態で電源(USB)を接続すると勝手に動き出すタイプ(ハードスイッチ)なので、USBを抜き差ししたらリズム風はできます。が、手動でやるには限界があるのでこの作業をマイコンにやらせる形です。(扇風機自体にマイコンが使われているものに対しては使えません)
マイコンの出力電流は最大で40mAに対して扇風機の最大電流が700mAなので、直接つなぐと扇風機がマイコンから過剰に電流を引き出そうとするため、最悪マイコンを壊しかねません。そこで活躍するのがmosfetと呼ばれる部品で別電源をマイコンの出力でON/OFFのスイッチングを行います。
deviceplus.jp

回路図

今回作成するリズム風用の回路図です。
回路図ではトランジスタになっていますが、実際はNch MOSFETを使用しています。
回路図上の抵抗は全てプルダウン抵抗です。


必要なもの

・DC5Vの扇風機(後述) 当時Amazonで1700円ぐらい

・延長ケーブル CanDo110円

マイコン
ELEGOOから販売しているarduino nanoの互換機を当時一個500円ぐらいで購入したのですが久しぶりに見たら販売ページ自体がなくなってました。
ちょっと高いですがarduino nanoでいいと思います。


・タクトスイッチ
(電源ON/OFF、リズム風ON/OFF、おやすみタイマー切替用のスイッチ)
3Pトグルスイッチ 1回路2接点 パネル取付用: パーツ一般 秋月電子通商-電子部品・ネット通販
3Pトグルスイッチ 中点OFF付 1回路2接点 パネル取付用: パーツ一般 秋月電子通商-電子部品・ネット通販

・抵抗10kΩ (プルダウン抵抗用)
カーボン抵抗(炭素皮膜抵抗) 1/4W10kΩ (100本入): パーツ一般 秋月電子通商-電子部品・ネット通販

マイコンを覆う物 家に転がっていた容器

・nch mosfet
NchパワーMOSFET 30V5.7A AO3400A (10個入): 半導体(モジュール) 秋月電子通商-電子部品・ネット通販

充電器(ハードオフで適当に購入)
今回使用する扇風機は最大700mAなのでApple製(5V 1A)の充電器を使用

ハード作成

まずは配線等のハード側から作っていきます。
延長ケーブルはケーブルの中間ぐらいで切ります。オス側のケーブルは充電器からマイコンへの電源供給用、メス側はマイコンから扇風機への電源供給用として使います。
一番外側の被覆を向いたらわかるのですが、中には4本の線が入っています。4本中2本がデータ通信用のプラスとマイナス、残りの2本が電源供給用のプラスとマイナスとなっています。今回データ通信はしないので電源供給用の赤色(プラス)と黒色(マイナス)を使用して分岐させてマイコンと扇風機に電源供給していきます。


ハード完成

ソフトはあとからどうにでもなるしとりあえずハードから作ろうと見切り発車したおかげで非常にブサイクになりました。
当初の予定ではトグルスイッチを切り替えたときに即時出力が切り替わるようにしようと思っていました。が、外部割込みが行えるピンがD2及びD3のみでしか使用できないようで、それを知らずにソフトを後回しにして適当に入力ピンを選んでいたせいでハードも作り直しという最悪の展開になってしまいました。しかも外部割込み関数の上手な使い方がわからず結局普通のデジタルピンとして使用しているので本当に無駄骨でした。

ソフト作成

無駄の結晶に入っているソフトです。

int rism, t1, t2, tm1, tm2, timer1, timer2;
int t=0;
int out=11;

void setup(){
  pinMode(out, OUTPUT); //出力ピン
  pinMode(2,INPUT); //タイマー1入力
  pinMode(3,INPUT); //タイマー2入力
  pinMode(5,INPUT); //リズム風用入力
}

void loop(){
  t1=digitalRead(2);
  t2=digitalRead(3);
  if(t1==HIGH && t==0){ //タイマー1がON
    timer1=10799; //タイマー1に10799秒(3時間)
    while(tm1<=timer1){
      if(digitalRead(5)==HIGH){
        Rism();
      }else{
        Normal();
      }
      if(tm1==timer1){ //タイマーが満了時
        t=1;
      }
      tm1=tm1+1;
      if(digitalRead(2)==LOW){
        tm1=0;
        break;
      }
    }
  }else{
    if(t2==HIGH && t==0){ //タイマー2がON
      timer2=21599; //6時間
      while(tm2<=timer2){
        if(digitalRead(5)==HIGH){
          Rism();
        }else{
          Normal();
        }
        if(tm2==timer2){  //タイマー満了時
          t=2;
        }
        tm2=tm2+1;
        if(digitalRead(3)==LOW){
          tm2=0;
          break;
        }
      }
    }else{
      if(t1==LOW && t2==LOW){ //通常時
        t=0;
        tm1=tm2=0;
        if(digitalRead(5) == HIGH){
          Rism();
        }else{
          Normal();
        }
      }else{ //タイマー満了時OFF
        if(t1==HIGH && t==2){
          t=0;
        }else{
          if(t2==HIGH && t==1){
            t=0;
          }else{ //タイマーが正常に終了
            digitalWrite(out,LOW);
            delay(200);
          }
        }
      }
    }
  }
}

void Normal(){
  digitalWrite(out,HIGH);
  delay(10000);
}

void Rism(){
  digitalWrite(out,HIGH);
  delay(7000);
  digitalWrite(out,LOW);
  delay(3000);
}


動作確認がこちら↓
youtube.com


ソフトを読み込むとわかるのですが、リズム風ON/OFF時それぞれ10秒サイクルで回っているのですが、10秒経過しないとトグルスイッチの状態を読み取ってくれない仕様となっています。これが製品だったらクレームいれるレベルですが、切り替え時間が早くなったところで劇的に涼しくなるわけでもないですしこれを使うのは私自身だけで困らないのでヨシッ!!
当初の予定では市販の扇風機と同じように風量のボタンを押すと即時「リズム風のON/OFF」や「タイマーON/OFF」が切り替わる、という感じのソフトにしたかったのですが、技量が足りずにできませんでした。外部割込みを使っていけるかも?と作ってみたものの市販の扇風機の廉価版のような動きしませんでした。
これ以上改善できる気がしないので試行錯誤した残骸を本記事の最下部に載せておきます。一応動きはしますが挙動不審です。(分かる方いらしたら教えてください)



と、しばらくほったらかしにしていたのですが後日やる気スイッチが入りソフトを修正しました。
iotblog5296.hatenablog.com

終わりに

トランジスタmosfetの勉強を学生の頃していたはずなのですが、綺麗さっぱり忘れていて非常に勉強になりました。
学生の頃は座学ばかりで実地がなく、勉強している部品がどのような場面で使われているか想像が全くつかず講義がお経にしか聞こえなかったあの頃。自分で回路を組みだすと、進研〇ミみたいに「あ!これ授業でやった計算だ!」とこれまでの知識が数年越しに開花してちょっと嬉しくなりました。

トランジスタは電化製品のいたるところで使われているので今後は電子工作に多用していきたいところです。

参照:

DCモーターをArduinoUnoで動かしてみる(その1) by R_Castle | elchika



外部割込み関数を使おうと試みた残骸

中国地方「道の駅」カード

道の駅というと運転の休憩所として利用される場合が多いと思いますが、道の駅によってもらうきっかけにしてもらおうと、先月の4月22日に中国地方にある道の駅で「道の駅カード」が発売されました。

chugoku-michinoeki.jp


各県の特定の道の駅で「道の駅カード」が販売されていて、購入するとと購入場所の道の駅カードとスタンプを貰えます。


各県の道の駅カードをゲットし、全てのスタンプを押してもらったスタンプカードを応募すると先着500名にコンプリートカードがもらえようです。

さらに各県のコンプリートカードを揃えると中国5県のコンプリートカードが先着順でもらえるようです。
中国5県分で105駅だそうなのでさすがに骨が折れそうですね。

道の駅で販売されている道の駅カードにはシリアル番号が記載されていて、場所によって多少ばらつきはあったものの5月6日に購入したカードには100~140番の記載があったため、発売されて約2週間で100人以上購入されていることになります。

コンプリートカードは先着順なのでなくなるのも時間の問題です。

中国5県のコンプリートカードは揃えるのは厳しそうですが、2県分ぐらいなら狙えそうなのでちょっとチャレンジしてみようと思います!

Apple製品を安く買う裏技

Apple製品を購入する方法として、
・公式や各家電量販店を新品で定価で購入(保証付き)
・メルカリやヤフオクなど新品or中古品を購入(個体差あり&保証なし)
この二通りが一般的だと思います。

が、実はもう一つ方法がありapple公式に「整備済製品」と呼ばれる製品があることをご存知でしょうか?

整備済製品とは?

整備済製品は初期不良等で返品があった製品をapple側で修理して再度販売している商品のことで簡単に言うと新中古品みたいなものです。
一度誰かが使用していた物だとバッテリーの持ちなどを心配される方がいると思いますが、外装及びバッテリーはappleが修理の際に交換されているので見た目もバッテリーも新品です。

www.apple.com

メリット

・最大16.5%割引(割引併用時)
整備済み製品の最大の利点といっても過言ではないのですが、Apple公式で購入すると最大15%割引されます。

楽天リーベイツ(Rebates)|あの有名通販サイトやブランド公式ストアでのお買い物でも、楽天ポイントが貯まる!

また、楽天が運営する「楽天リーベイツ」を経由して購入すると購入金額に対して1.5%ポイント(21年3月19日現在)としてキャッシュバックされます。
なので最大16.5%割引となり非常にお得になります。
※キャッシュバックの対象外となる製品もあるので自分が購入したい製品が対象かどうか事前に確認してください
下記リンクから新規登録後30日以内に一回で3000円以上購入すると500ポイント貰えます!
Rebates初回購入者限定キャンペーン|楽天のポイントサイト|楽天リーベイツ(Rebates)

・購入後1年保証がついている
メーカーの保証がついているため、不具合が発生しても安心して対応して貰えます。

デメリット

・最新モデルが整備済製品としてラインナップへ登場するのは半年~1年後ぐらい
これまでの傾向から新製品の整備済製品への追加は約半年~1年後といわれており、1~2世代前のモデルしか販売されていません。ipad mini6は21年9月に発売されて約半年経ちますがいまのところ整備済製品にはありませんでした。

・入荷するタイミングが不明
「整備済み製品」なので壊れたものを修理して再度販売となるため常に在庫があるわけではありません。
非公式ですが新しく製品済製品が出た場合に教えてくれるTwitterがあるのでそちらを参考にしてください

Appleストア整備済製品の入荷速報 (@apple_refurb) | Twitter

少しでも安く、かつappleの保証がついているものを購入されたいという方にはおすすめの方法です。

最近のipadは新しい世代が発売されてもコアな使い方をされない限り性能的な違いを感じる機会はほとんどありません。そうなるといよいよ新品を買う意味がなくなってきます。
なので、最新型をあえて狙わずに型落ちしたモデルを安価に手に入れるのも一つの手段ではないでしょうか。

Sesame解錠編④ エラー時にブザーを鳴らす

ラズパイの本体には剣山のようなものがありますが、当たり前ですが花を生けるものではありません。
GPIOピンと言ってデジタル信号の入出力用のものです。電子工作をしていくうえでLチカ(LEDをチカチカさせること)をやる言わば電子工作の登竜門のような作業です。

Lチカに関する記事は腐るほどあるので出力の確認作業のみ行います。
ブザーを鳴らすタイミングは2通りで、
①登録してあるICカード以外のものがタッチされたときピッと0.5秒鳴らす
②何らかの影響でネットワークにエラーが発生してレスポンスが200以外のものが返ってきたときにピッピッピッ(0.5秒ONを3サイクル)と鳴らす
の二通りにしました。 毎回解錠処理の度にブザーが鳴ると鬱陶しそうな気がしたので何か不具合があったときだけにしました。

import datetime, base64, requests, json, binascii, nfc, os, time
import RPi.GPIO as GPIO
from threading import Thread, Timer
from Crypto.Hash import CMAC
from Crypto.Cipher import AES

            
idm1 = b"お手持ちのICカード1" 
idm2 = b"お手持ちのICカード2"

pin = 40 #GPIOのピン指定

#ICカード待受の1サイクル秒
TIME_cycle = 1.0
#ICカード待受の反応インターバル秒
TIME_interval = 0.2
#タッチされてから次を開始するまでの無効化する秒
TIME_wait = 3

#NFC接続リクエストのための準備
#212F(Felica)で設定
target_req_ic = nfc.clf.RemoteTarget("212F")
#0003(IC cart)
target_req_ic.sensf_req = bytearray.fromhex("0000030000")

print('ICカードをタッチしてください...')

while True:
    
    #USB接続されたカードリーダーをインスタンス化
    clf = nfc.ContactlessFrontend('usb')
    #ICカード待受開始
    target_res = clf.sense(target_req_ic, iterations=int(TIME_cycle//TIME_interval)+1, interval=TIME_interval)
    
    if not target_res is None:
        tag = nfc.tag.activate_tt3(clf, target_res)
        tag.sys = 3
        
        #IDmを取り出す
        idm = binascii.hexlify(tag.idm)
        print(idm)
        
        #特定のIDmだった場合のアクション
        if idm == idm1 or idm == idm2:
            uuid = '個人のUUID'
            secret_key = '個人のシークレットキー'
            api_key = '個人のAPIキー'

            # HTTP header
            headers = { 'x-api-key': api_key }

            # signの生成
            cmac = CMAC.new(bytes.fromhex(secret_key), ciphermod=AES)
            message = int(datetime.datetime.now().timestamp()).to_bytes(4, 'little', signed=False)[1:4]
            cmac.update(message)
            sign = cmac.hexdigest()
            
            print("【 特定のIDmにより施解錠 】")
            #鍵の状態取得
            surl = f'https://app.candyhouse.co/api/sesame2/{uuid}'
            sres = requests.get(surl, headers=headers) #リクエスト
            print(sres.text)
            
            if "unlocked" in sres.text:
                print("close")
                cmd = 82
                history = 'close (Web API)'

            else:
                print("open")
                cmd = 83
                history = 'open (Web API)'
            history = base64.b64encode(history.encode()).decode() #履歴に「open」or「close」を記載
            url = f'https://app.candyhouse.co/api/sesame2/{uuid}/cmd'
            body = {
                'cmd': cmd,
                'history': history,
                'sign': sign
            }
            res = requests.post(url, json.dumps(body), headers=headers)
            print(res.status_code, res.text)
            str_res = str(res.status_code)
            #ネットワークでエラーが発生して200が返ってこない場合の処理
            if not "200" in str_res:
                print("NG")
                #GPIOピン設定
                GPIO.setmode(GPIO.BOARD)
                GPIO.setup(pin,GPIO.OUT)
                GPIO.output(pin, 1)
                time.sleep(0.5)
                GPIO.output(pin, 0)
                time.sleep(0.5)
                GPIO.output(pin, 1)
                time.sleep(0.5)
                GPIO.output(pin, 0)
                time.sleep(0.5)
                GPIO.output(pin, 1)
                time.sleep(0.5)
                GPIO.output(pin, 0)
                time.sleep(0.5)                
                GPIO.cleanup()               
            time.sleep(TIME_wait)
            
        else:
            print("カードが違います")
            #GPIOピン設定
            GPIO.setmode(GPIO.BOARD)
            GPIO.setup(pin, GPIO.OUT)
            GPIO.output(pin, 1)
            time.sleep(0.5)
            GPIO.output(pin, 0)
            GPIO.cleanup()
            time.sleep(TIME_wait)
            
    clf.close()
#end while


記事にしながらプログラムを見返していたんですなんとも見にくい書き方してますね。
正常に動くし見栄えが悪いだけなので特に書き直す予定はありませんが。

完成したプログラムから必要なところを抜粋しながら書いているのでもしかしたら抜けてるところがあってうまく動かないかもしれません。
その際はご指摘いただければと思います。