秋月電子で新しいブツを仕入れる

緊急事態宣言下ではありますが、途中のルートでしたので秋葉原の秋月電子https://akizukidenshi.com/catalog/によって新しいブツを仕入れてきました。

新しいブツ

温湿度、気圧、ガスの複合センサのBME680とブレッドボードです。

まずはブレッドボードです。以前にもちょくちょく買ってたんですが、直近で買ったやつがいけない。

左側が前に買ったやつで、右が今回買ってるのと同じブレッドボードです。見て分かるようにESP32は幅が広いため5:5のブレッドボードだと、片側のみしか使えないんですよね。今回購入したブレッドボードは、6:6なので、両サイドでも最低1本はピンを刺すことができます。これに気がつかないとテスト配線するのに大きな不都合が出てきます。

次に新しいセンサBME680ですが、これはBOSCH製の複合センサですが、秋月電子の方で必要な部品を取り付けてあります。

1番上のセンサがBOSCH製のセンサです。左下の黒い部品がI2CレベルコンバータICです。このBOSCH製のセンサはSPII2C対応ですが、このキットではI2Cクロックアップ用に付いているみたいです。右下は定番の電源用の三端子レギュレータです。老眼が進み、細かい半田付けも厳しくなってきましたが、引き続き頑張ります。

キャリートラック(DA63T)サーモスタット交換

事業用のキャリートラックですが、先日車検時にサーモスタット不良を指摘されていましたので、交換しました。

この型式のサーモは手の入りにくいところにあるということで、ネットで予習をしておきました。

まずは助手席の背もたれと、シートを外します。

このシートの2個のボルトを外せばオープンです。

ですが、それでもサーモスタットまでは手が入りません。

全然手が入りません。ミッションのノブをネジって外し、4駆のトランスファーレバーのネジを外してレバーを外し、ピンを外してやっとセンターコンソールが外れます。

プラスを切ってある10ミリのボルトを4個外したら、動くかと思ったら動きません。ミッションレバーの前方の12ミリネジ2個を外します。

これでやっとプレートが動きますが、渋いので輪止めをかけて、サイドブレーキを外します。そうして運転席側にずらしますが、まだ足りないので、最終的には運転席側のシートベルトソケットの14ミリのボルトまで外しました。サーモスタットカバーの手前側の12ミリはユニバーサル付きのソケットで緩め、奥側のボルトはメガネでなんとか緩めました。サーモスタットカバーについているエア抜き用の10ミリボルトはエクステンション二個延長でなんとか緩めました。手前側のボルトはソケットですから、さっさと抜けましたが、奥側はスペースもないので、スパナでシコシコ回してやっと抜けました。サーモスタットカバーをなんとか外し、やっとサーモとご対面です。

ピンボケでした。すいません。

新品との比較をしてみると、完全に開きっぱなしでした。左側が古いサーモです。

後はひたすら組立るだけです。組み付けが終了したら、エア抜きをする必要があります。ボンネットを開けると、冷却水交換後のエア抜きの仕方のシールが貼ってあります。

このホースを外して、サーモスタットカバーのエア抜きのボルトを緩めるんですがなかなかエア抜きできません。よく読んだら、ラジエターのキャップも開けるんですね。よく読まないと。エア抜き終了し、クーラントを継ぎ足したら終了です。試運転して、漏れてないことを確認して終了です。

ESP32からMariaDBにデータをとばす

センサからのデータもとれるようになり、Wi-Fiにつながり、NTPで時計の補正もできるようになりました。

IoTを進める中で必要なのはデータベースにひたすらデータを放り込み、その中で、異常のあるデータをいかに早く見つけ出すかが重要になります。このため、今回はデータベースにMariaDBを用い、ESP32からデータをPHPにPOSTしデータベースに取り込む一連の流れを紹介します。

まずはデータベースを作成します。MariaDBのインストールその他は省略しまして、既にesp_dataというデータベースを作成してあるところから始めます。phpMyAdminを使用してデータベース中にSensorDataというテーブルを作ります。次のSQL文をphpMyAdminのSQLクエリを実行し、テーブルを作ります。今回テストの都合でMACadd列は省略してあります。

CREATE TABLE SensorData (
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
//    MACadd VARCHAR(30) NOT NULL,
    value1 VARCHAR(10),
    value2 VARCHAR(10),
    value3 VARCHAR(10),
    reading_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)

テーブルが出来上がったら、適当にデータを入れてみます。

INSERT INTO SensorData(value1, value2, value3) VALUES (12.3,23.4,35.3)

実行を押すとSQL文が実行され、行が挿入されます。ここまで確認したら、次はMicroPython上でjsonを用いたPOST文を作成します。

MicroPythonではpythonで使用するjsonとrequestsの頭にuをつける形になります。この形でpostできます。

次にデータを受けるphp側を作成します。

コマンドラインからampyを用いて上記MicroPythonのプログラムを走らせた結果が次です。

C:\Users\>ampy -p com4 run c:\micropython\posttest.py
New record created successfully

phpMyAdminで確認しても新しいレコードが挿入されています。

 編集 コピー削除 削除1712.323.435.32021-02-25 19:35:51

ESP32 時計まわり

ESP32をWi-Fiにてネットワークにつなぎましたので、次は時計まわりを整備します。

ESP32にはリアルタイムクロック(RTC)が実装されていますので、まずはどのような反応が出るか見ます。

>>> from machine import RTC
>>> rtc=RTC()
>>> rtc.datetime()
(2000, 1, 1, 5, 0, 2, 41, 237515)

2000年1月1日ですね。これでは時計として使えませんので、NTPサーバーに接続して現在時刻(UTC)に合わせます。

>>> import ntptime
>>> ntptime.settime()
>>> rtc.datetime()
(2021, 2, 22, 0, 22, 6, 52, 654317)

2021年2月22日22時6分52秒ですか、4個目の0は多分曜日を表しており月曜日、654317は・・・

>>> import utime
>>> utime.localtime()
(2021, 2, 22, 22, 16, 34, 0, 53)

utimeでローカルタイム表示で見てみましょう。

2021年2月22日22時16分34秒月曜日、年内の通算日数53日目(31+22=53)これはUTCですので、JSTに合わせます。

>>> utime.mktime(utime.localtime())
667355194
>>> utime.mktime(utime.localtime())+(9*3600)
667387595
>>> utime.localtime(utime.mktime(utime.localtime())+(9*3600))
(2021, 2, 23, 9, 26, 38, 1, 54)

9時間進めますutime.mktime()関数でローカルタイムを秒数の整数に戻します。この整数にJSTは9時間進んでいますので9時間×3600秒を足してあげます。この整数をutime.localtime()関数で時間に戻します。すると2021年2月23日9時26分38秒火曜日54日経過と日本時間に変更できました。

全体のプログラムです

実行経過です。

C:\Users\>ampy -p com4 run c:\micropython\timetest1.py
network config: ('192.168.11.25', '255.255.255.0', '192.168.11.1', '192.168.11.1')
2021/2/23 9:39:41

ESP32 ネットワーク接続

今回はESP32をWi-Fi接続してみました。

Wi-Fi接続は結構簡単で、MicroPython DocのESP32用クイックリファレンスhttps://micropython-docs-ja.readthedocs.io/ja/latest/esp32/quickref.htmlに詳しく書かれています。今回はこれをそっくり踏襲します。

まずはTera Term上でコマンドでの反応を見ます。

>>> wlan = network.WLAN(network.STA_IF)   #Wi-Fiをステーションモードにします
>>> wlan.active(True)             #アクティブ化確認します
True
>>> wlan.connect('essid','password')     #essidにはつなぐWi-Fiのessidを、passwordにはパスワードを入れます
>>> print('network config:',wlan.ifconfig()) #Wi-Fi接続のコンフィギュレーションをプリントします、ipアドレス、サブネット、ゲートウェイアドレス、DNSアドレス
network config: ('192.168.11.25', '255.255.255.0', '192.168.11.1', '192.168.11.1')
>>>
>>> wlan.scan()                 #Wi-Fiの電波のスキャンをします
[(b'Buffalo-G-****', b'4=\xc4\xc3\x17\x98', 11, -41, 3, False), (b'rs500m-e17ec9-1', b'\x10KF\xe1~\xcc', 6, -67, 3, False), (b'rs500m-e17ec9-2', b'\x12KF\xe1~\xcc', 6, -69, 3, False), (b'TOBU_Free_Wi-Fi', b'\x00\x14\x06(\x191', 1, -84, 0, False), (b'aterm-36fa28-g', b'\x10f\x82M\xd2\x08', 8, -85, 4, False), (b'SPWH_H33_129E8B', b'0\xa1\xfa\x12\x9e\x8b', 2, -86, 4, False)]
>>>

これで、Wi-Fiへの接続ができることを確認しました。実際のプログラムではクイックリファレンスにあるように、関数で定義して、つなげばオッケーです。

ampyを使用してプログラムを走らせると、以下のような結果になります。

C:\Users\>ampy -p com4 run c:\micropython\wifitest.py
connecting to network...
network config: ('192.168.11.25', '255.255.255.0', '192.168.11.1', '192.168.11.1')

エーゼット 燃料添加剤を入れる その2

先週、セロー250にエーゼットの燃料添加剤FCR-062を入れて、50km程走ってきました。効果の程が科学的に判断できないため、DEPSTECH社のDS450というファイバースコープを購入して、ピストン上の汚れがどうなるのか視覚的に検討してみます。

DS450

添加剤入れる前に購入すれば良かったのですが、まずは50km走行後のピストン内部の状態です。

50km走行後のピストン

右上の部分はカーボン付いていませんが、最初からなかったのかよく分かりません。白い結晶状のものがあるんですが、これはなんなんでしょうか?シリンダーに影響がなければ良いんですが。

今日は軽トラックの車検が出来上がったので80km程走ってきました。添加後130km後の画像が下の写真です。

130km走行後のピストン

あんまり変わりませんね。白い結晶状のものが浮いてきてるように思えますが…

500km程度走行してみないと分かりませんね。また、その3で報告します。

温度センサADT7410を用いた温度測定

前回のDHT11から、時間がたちましたが、ブレッドボードに乗っていたADT7410を用いて、温度測定をしてみたいと思います。DHT11はワンワイヤーで、ESP32自体でライブラリをもっていたので楽でしたが、ADT7410ではしっかりとメーカーの仕様を読んでおかないといけません。

メーカーのアナログデバイシスのホームページから、資料をダウンロードします。https://www.analog.com/media/en/technical-documentation/data-sheets/ADT7410.pdfの12~13ページに書いてありますが、13ビットでの測定では0x00から2バイト拾って、くっつけて、うしろの3ビット分を切ると言う作業が必要になります。

今回はsclを18ピンにsdaを19ピンに設定しました。ADT7410もプルアップが必要なので、まずはプルアップします。

>>> from machine import SoftI2C, Pin
>>> p18 = Pin(18, Pin.IN, Pin.PULL_UP)
>>> p19 = Pin(19, Pin.IN, Pin.PULL_UP)

その後softi2cでデータを読み込みます。

>>> data = SoftI2C(scl = Pin(18), sda = Pin(19), freq = 10000).readfrom_mem(0x48, 0x00, 2)

ここで、2バイト分のデータを見てみます。

>>> print(data[0])
10
>>> print(data[1])
224

10進数でプリントされるので、2進数でプリントさせます。

>>> print(bin(data[0]))
0b1010
>>> print(bin(data[1]))
0b11100000

data[0]は00001010、data[1]は11100000となってます。data[0]を左に8ビットずらしてdata[1]をつなげます。

>>> print(bin(data[0]<<8 |data[1]))
0b101011100000

0000101011100000となりました。右側3ビットは不要ですから、右に3ビットずらします。

>>> print(bin((data[0]<<8 |data[1]) >>3))
0b101011100

0000101011100になりました。10進数に治すと、

>>> print(((data[0]<<8 |data[1]) >>3))  # temp=print(((data[0]<<8 |data[1]) >>3))
348

これを13ビットですから、資料にあるとおり16で割ります。

>>> print(((data[0]<<8 |data[1]) >>3)/16)
21.75

これで温度21.75度が出てきました。

このセンサではマイナスになるとファーストビットに1が立つので、13ビットで1000000000000は10進数で4096ですから、tempがこの数より大きい場合はマイナスの温度になるのでtemp=temp-8192とすればOKです。例フルビット1111111111111は10進数で8191ですから、8191-8192=-1これを16で割って-0.0625度となります。

温湿度計DHT11を用いた温湿度測定

今回はESP32を用い、一番簡単なセンサーによる温湿度の測定について紹介します。

ESP32はMicropythonにて簡単にプログラムを書くことができ、IoTには最適なデバイスです。今回はこれにDHT11という温湿度センサを接続し、温度と湿度を測定するプログラムを紹介します。

まずはブレッドボードを用いてESP32とDHT11を接続します(写真の青色のセンサです。左型のセンサは別途紹介します)。

写真のとおり左からVCC(3.3Vもしくは5Vに接続)、信号線(今回はピン4に接続)、一個飛ばして一番右のピンはアース(GND)に接続します。信号線は2ピンとワンワイヤーのセンサーとなります。参考資料はこちらです。https://akizukidenshi.com/download/ds/aosong/DHT11_20180119.pdf

ESP32ではDHT ドライバはソフトウェアで実装され、すべてのピンで動作するとのことで、Micropythonの公式ホームページhttps://micropython-docs-ja.readthedocs.io/ja/latest/esp32/quickref.html#dht-driverに書いてある例を用いて、動かしてみます。

>>> import dht
>>> import machine
>>>
>>> d = dht.DHT11(machine.Pin(4))
>>> d.measure()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "dht.py", line 17, in measure
OSError: [Errno 110] ETIMEDOUT

いきなりエラーです。DHT11の上記リンクにのせたプロダクトサービスをよく読むとI/Oは電源とプルアップした回路にしなさいと書いてあります。

プルアップ用の抵抗は持っていますが、ESP32のGPIOにはプルアップもソフト的に使えますので、そちらで対応です。

>>> import dht
>>> import machine
>>> from machine import Pin   #class Pinをインポート
>>>
>>> p4 = Pin(4, Pin.IN, Pin.PULL_UP)  #4番ピンをプルアップ
>>> d = dht.DHT11(machine.Pin(4))
>>> d.measure()
>>> print(d.temperature(),'C')
20 C
>>> print(d.humidity(),'%rh')
44 %rh

これで、温度と湿度が測定できます。(温度は少数点以下ありませんが・・・)

後日、精度高い温度計での測定をします。

宇佐美南線 小室桜 満開です

宇佐美南線 小室桜

午前中恒例のお散歩に出掛けました。宇佐美南線の小室桜は満開です。

今晩から天気は悪くなる予報ですが、風雨が強くなければ良いのですが…

小室桜の花弁は大きくて色もきれいです。

小室桜の花弁

お寿司屋さんの2階のベランダでネコちゃんが植木と戯れていました。

何か遊んでいたのでしょうか?

すしとめのネコちゃん

プチツーリングしながら花見

セロー250に燃料添加剤を添加したので花見ながらプチツーリングしてきました。

宇佐美地区では早くから小室桜の植樹に力を入れており、今がちょうど満開の季節になります。宇佐美南線の桜も満開ですが、今日は大丸山に向かう道を経由して亀石峠に向かいました。

阿原田の桜

大丸山ハイキングコースの分岐のカーブ地点は丁度満開です。

大丸山分岐の桜

その後、亀石峠に抜けてサイクルスポーツセンターを経由して、修善寺駅方面に抜けました。伊豆総合高校(旧修善寺工業高校)ちょと手前の所ですが、ここには紅白の梅が植えられており、こちらも満開です。

修善寺の梅
修善寺の梅

週末は暖かく伊豆半島は河津桜を筆頭に花満開です。