マイコン温度通知システムの製作20 モジュールなし、Wi-FiまたはBluetoothで接続

simカードを差すモジュール(SIM800L)を購入しましたが、2Gのみ対応で、契約したsimカードが3GとLTEにしか対応しておらず、通信することができませんでした。

温度通知システムを使用する日が近づいているので、ひとまずスマートフォンを介してインターネットに接続することを試してみます。

10分しか接続できず断念

oppoのスマートフォンを使っていましたが、Wi-Fi接続はパーソナルホットスポットという機能でできました。

しかし、この機能は10分後でオフになってしまうため断念しました。

最新の機種のはオフを回避できるようですが、自分の持っている古い端末だとそのアップデートがなされていないようでした。

Bluetooth接続を試す

そこでBluetooth接続を試すことにしました。

ところが、必要なライブラリをインストールしたはずが、以下の周辺にBluetooth機器を検索するコードが動きませんでした。

import bluetooth

def scan_devices():
    nearby_devices = bluetooth.discover_devices(duration=10, lookup_names=True, flush_cache=True, device_id=-1)
    print("Nearby devices:")
    for addr, name in nearby_devices:
        print(f"{addr} - {name}")

if __name__ == "__main__":
    scan_devices()

・エラー

Traceback (most recent call last):
  File "micropython/bluetooth.py", line 10, in <module>
    scan_devices()
  File "micropython/bluetooth.py", line 4, in scan_devices
    nearby_devices = bluetooth.discover_devices(duration=10, lookup_names=True, flush_cache=True, device_id=-1)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: module 'bluetooth' has no attribute 'discover_devices'

そこで、bluetoothのライブラリが正常にインストールされているか確認したところ、エラーが出ました。

・エラー

% python3
Python 3.9.6 (default, Aug 11 2023, 19:44:49) 
[Clang 15.0.0 (clang-1500.0.40.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import bluetooth
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'bluetooth'

これでbluetoothライブラリがインストールされていないことがわかりました。

ネットで検索してみると、Macbook M1ではPybluezの依存関係の一部がサポートされておらず、Pybluezをインストールしてもbluetoothライブラリが使えないようでした。

そのためblueutilでBluetooth機器を探すことにしました。

brew install blueutil
blueutil
address: x-x-x-x-x-x, connected (master, -54 dBm), not favourite, paired, name: "XXX", recent access date: 2024-03-28 15:32:34 +0000

上記のコードでMACアドレスを取得することができました。

ampyコマンドが一部動作して一部エラーになる

ここで以下のコードを実行しようとしました。

import bluetooth

# スマートフォンのMACアドレス
DEVICE_MAC_ADDRESS = "b4:cb:57:6a:c8:f8"

# Bluetoothソケットを作成
sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)

# スマートフォンに接続
sock.connect((DEVICE_MAC_ADDRESS, 1))

# 接続が成功したことを表示
print("接続成功")

# データの送受信を行う
# ...

# ソケットを閉じる
sock.close()

・エラー

$ ampy --port /dev/tty.usbserial-0001 run main.py
Traceback (most recent call last):
  File "/Users/user/anaconda3/bin/ampy", line 8, in <module>
    sys.exit(cli())
             ^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/ampy/cli.py", line 338, in run
    output = board_files.run(local_file, not no_output, not no_output)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/ampy/files.py", line 309, in run
    self._pyboard.execfile(filename, stream_output=True)
  File "/Users/user/anaconda3/lib/python3.11/site-packages/ampy/pyboard.py", line 285, in execfile
    return self.exec_(pyfile, stream_output=stream_output)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/ampy/pyboard.py", line 279, in exec_
    raise PyboardError('exception', ret, ret_err)
ampy.pyboard.PyboardError: ('exception', b'', b'Traceback (most recent call last):\r\n  File "<stdin>", line 7, in <module>\r\nAttributeError: \'module\' object has no attribute \'BluetoothSocket\'\r\n')

する上記のエラーになったので、ESP32にampyでbluetoothライブラリをインストールしようとしたところ、以下のエラーが出ました。

$ ampy --port /dev/tty.usbserial-0001 put main.py
$ ampy --port /dev/tty.usbserial-0001 install micropython-bluetooth
Usage: ampy [OPTIONS] COMMAND [ARGS]...
Try 'ampy --help' for help.

Error: No such command 'install'.
$ ampy --version
Traceback (most recent call last):
  File "/Users/user/anaconda3/bin/ampy", line 8, in <module>
    sys.exit(cli())
             ^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1077, in main
    with self.make_context(prog_name, args, **extra) as ctx:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 943, in make_context
    self.parse_args(ctx, args)
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1644, in parse_args
    rest = super().parse_args(ctx, args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1408, in parse_args
    value, args = param.handle_parse_result(ctx, opts, args)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 2400, in handle_parse_result
    value = self.process_value(ctx, value)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 2362, in process_value
    value = self.callback(ctx, self, value)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/decorators.py", line 506, in callback
    raise RuntimeError(
RuntimeError: 'ampy' is not installed. Try passing 'package_name' instead.
$ ampy --version
Traceback (most recent call last):
  File "/Users/user/anaconda3/bin/ampy", line 8, in <module>
    sys.exit(cli())
             ^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1077, in main
    with self.make_context(prog_name, args, **extra) as ctx:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 943, in make_context
    self.parse_args(ctx, args)
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1644, in parse_args
    rest = super().parse_args(ctx, args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1408, in parse_args
    value, args = param.handle_parse_result(ctx, opts, args)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 2400, in handle_parse_result
    value = self.process_value(ctx, value)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 2362, in process_value
    value = self.callback(ctx, self, value)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/anaconda3/lib/python3.11/site-packages/click/decorators.py", line 506, in callback
    raise RuntimeError(
RuntimeError: 'ampy' is not installed. Try passing 'package_name' instead.

どうもmacbook M1でanacondaの環境ではダメらしいので、VS code(anaconda)ではなくターミナルで(非anacondaで)実施することにしました。

ampyの前に必要なライブラリをインストールします。

pip3 install --upgrade pip setuptools
pip3 install blosc2 cython FuzzyTM
pip3 install ampy
ampy --version
ampy, version 0.1.1

ようやくampyがインストールされ、バージョンが確認できました。

しかし以下のようにinstallコマンドが使えませんでした。

ampy --port /dev/tty.usbserial-0001 install micropython-bluetooth
Usage: ampy [OPTIONS] COMMAND [ARGS]...
Try 'ampy --help' for help.

Error: No such command 'install'.

どうもinstallというコマンドが通らないようです。

そこでESP32にインストールされているmicropythonにライブラリとしてbluetoothがあるのか対話モードで確認しました。

screen /dev/tty.usbserial-0001 115200
>>> help('modules')
__main__          bluetooth         heapq             select
_asyncio          btree             inisetup          socket
_boot             builtins          io                ssl
_espnow           cmath             json              struct
_onewire          collections       machine           sys
_thread           cryptolib         math              time
_webrepl          deflate           micropython       uasyncio
aioespnow         dht               mip/__init__      uctypes
apa106            ds18x20           neopixel          umqtt/robust
array             errno             network           umqtt/simple
asyncio/__init__  esp               ntptime           upysh
asyncio/core      esp32             onewire           urequests
asyncio/event     espnow            os                webrepl
asyncio/funcs     flashbdev         platform          webrepl_setup
asyncio/lock      framebuf          random            websocket
asyncio/stream    gc                re
binascii          hashlib           requests/__init__

するとbluetoothライブラリは存在しているようです。

しかし、対話モードにてライブラリのバージョンを確認しようとするとエラーになりました。

>>> import bluetooth
>>> print(bluetooth.__version__)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute '__version__'

どうも、ライブラリが存在するもののバージョンが古く__version__属性がないことが原因らしいです。

色々と調べた結果、どうやらBluetoothSocketがきちんと機能するようにbluetoothの機能をビルドするときに含める必要があるようでした。

そこまでする時間がないので一度断念しました。

別角度の発想 スマートフォンのホットスポットをアプリで無制限にする

ここで別の方法を思いつきました。

スマートフォンのホットスポット機能が時間制限があるのなら、無制限で出来るスマホアプリを使えば良いのです。

そこで、Androidアプリでホットスポットを設定できるものを試してみました。

タイトルとURLをコピーしました