JH1LHVの雑記帳

和文電信好きなアマチュア無線家の雑記帳

スポンサーリンク

BPI-Bit で morse を鳴らす ~その1~

micro:bit のような ESP32 なマイコン。
その名は BPI-Bit

いつものように中華に注文したいたモノが届いたので、とりあえず動かしてみました。

Banana Pi - BPI Single Board Computers Official Website


f:id:JH1LHV:20190629205237j:plain
BPI-Bit 本体(左)と、アクリルケース(右)を購入しました。

f:id:JH1LHV:20190629205525j:plain
大きさは micro:bit とほぼ同じです。(少しだけ縦に長い。)

f:id:JH1LHV:20190701115752j:plain

f:id:JH1LHV:20190701120008j:plain
(Bpi Wiki から転載)

価格は送料入れて 2千円ちょっとと、ほぼ micro:bit と同じです。

micro:bit とのスペック比較によれば、搭載されているメモリ量も桁違いに大きく、また WiFi が標準で使えるなど、BPI-Bit が圧倒的に優位なことがわかります。

以前、和文モールス練習機を作ろうとしてメモリ不足でできなかったことが、この BPI-Bit でできるようになるんじゃないかと期待しているところです。

 

ソフトウェア開発環境

BPI-Bit のプログラムは、次のソフトウェア環境で作成することができます。

Arduino なら Arduino IDE の環境設定だけでプログラムは作れますが、これまで micro:bit で MicroPython を使ってたりするので、この BPI-Bit でも MicroPython が使えるように設定することにしました。
(Webduino、Scratch では細かな処理ができないといった多少制限があります。)

  

USB シリアルドライバ

BPI-Bit の USBシリアルドライバは、いつもの中華ドライバの CH340 です。
すでにセットアップ済みなら microUSB ケーブルで PC と接続すれば、PC のデバイスマネージャーに CH340 のポートが表示されるはずです。
 

f:id:JH1LHV:20190629211044j:plain
こんな感じに表示されなければ、「CH340 ドライバ」でググるなどして、ドライバのインストールが必要です。

 

MicroPython 環境設定(イメージ書き込み)

BPI-Bit で MicroPython を使うため、まずはじめにイメージを書き込みます。
基本的には、この Bpi Wiki に書かれているとおり進めていきますが、一部 ?なところがありました。
ちなみに、私の環境は Windows 10 です。 

① Firmware イメージをダウンロード

BPI-Bit で MicroPython を使うためのイメージファイル(Firmware)を以下の GitHub からダウンロードします。

https://github.com/BPI-STEAM/BPI-BIT-MicroPython/releases

f:id:JH1LHV:20190629212241j:plain

現在の最新バージョンは「firmware-20190623.bin」のようです。

② イメージ書き込みツールのダウンロード 

Wiki の説明では  AutoErase.exe、AutoFlash.exe の2つのツールを使って書き込むとありますが、これらのツールの所在が 404 になっていたりと・・・探してみ見つからなかったので、GUI の  FlashTool.exe を使ってイメージを書き込みました。

https://github.com/BPI-STEAM/BPI-BIT-MicroPython/releases/tag/FlashTool


FlashMicroPython-20190528.zip をダウンロードして解凍します。
そして解凍した同じフォルダの中にイメージ(firmware-20190623.bin)をコピーします。(!)
 

f:id:JH1LHV:20190629231013j:plain

FlashTool.exe を起動。
Com Port を設定して「Flash」ボタンを押下。
あとは勝手に Erase してから Firmware が書き込まれます。

 

MicroPython 動作試験

mpy-editor を使って、LED マトリクスに ”JH1LHV” の文字をスクロールさせてみました。

f:id:JH1LHV:20190629232759j:plain

f:id:JH1LHV:20190629233216j:plain
”JH1LHV” がスクロールしたので、ここまでの環境構築は OK です。

 

電源投入後の自動起動 

BPI-Bit の電源投入後に作成したプログラムを自動で起動するには、main.py というファイ名のプログラムファイルを本体に転送する必要があります。  

MicroPython を使った MPU では一般的な(?)、mpfshell というツールをインストールして対応します。 

gist.github.com

Git - Downloading Package


ここの GitHub のページ通りに作業すれば mpfshell をインストールすることができると思います。
(Git が未インストールなら、Git のインストールも必要です。)

cmd から mpfshell で起動
f:id:JH1LHV:20190630172815j:plain 

mpfs[/]> open com12  <--- open comxx で接続します 


ls で BPI:Bit に保存されているファイルを確認

f:id:JH1LHV:20190630173051j:plain
Image 書き込み直後のため、ファイルはまだ boot.py と wifi_cfg.py しかありません。
ここに作成したプログラムの main.py を保存すれば、本体リセット後にプログラムは自動でスタートします。

f:id:JH1LHV:20190701160117j:plain
最初から入ってる boot.py と wifi_cfg.py の中を一応確認しておきました。
WiFi で接続するなら、この wifi_cfg.py に各種設定を記述します。

mpfshell の put コマンドで main.py を転送します。f:id:JH1LHV:20190701161050j:plain

mpfs[/]> put main.py  <--- put コマンドで main.py を MPU へ転送します 

PC のロカールに main.py を置いてないと正しく put してくれませんでした。
(なお、PC のローカルは、mpfshell のコマンド ”lls” で確認できます。)

(参考)mpfshell のコマンド 
put <----- PC のロカールから BPI-Bit へファイルを転送
lls <----- PC のローカルフォルダにあるファイル表示
lcd <----- PC 側のディレクトリ変更

 

とりあえず morse を鳴らす 

BPI-Bit には標準で圧電スピーカが付いてます。
最初このスピーカを使って morse が鳴らせないかと試験をしていたのですが、結論から言ってイマイチだったので、この搭載されているスピーカを使うことは止めました。 

(理由)

  • 搭載されているスピーカでは micro:bit のような PWM 処理できなかった
    (pwm 処理を行う関数でエラーがでてしまう。未対応?)
  • music としての音階は出力できるが、単純なブザーのようなオン/オフ動作ができなかった
    (出力できる音の最低の長さが 125msec と、morse を鳴らすには長すぎる)
  • 音量がとても小さい 

ということで、何か解決策が見つかるまで、搭載されているスピーカの使用は止めることにしました。

続いて、micro:bit の拡張ボードである電源供給基板を使用する方法です。
BPI-Bit は Micro:bit の拡張ボードが使えるようにピン配置に互換性があるので、これを使ってみることにしました。
しかしこれもイマイチで・・・この拡張ボードを使うことも断念しました。

f:id:JH1LHV:20190630195759j:plain
micro:bit の電源供給基板には割と大きな圧電スピーカも付いててよかったのですが、使えませんでした。

(理由)

  • ボタン電池では起動しない
  • 電源供給基板と BPI-Bit 本体の接続時、電源供給基板の電池ホルダと BPI-Bit の ESP32 チップがぶつかり、ショートの危険と、ネジ止めができない

f:id:JH1LHV:20190630204626j:plain
BPI-Bit の MPU は ESP32 だったりするので、WiFi が使えたりと・・・結構な電流食い!
常に 150mA くらいの電流が流れていて、ボタン電池じゃ電圧降下も大きく、起動すらしませんでした。

f:id:JH1LHV:20190630204734j:plain
ちなみに、micro:bit は 25mA 程度の電流が流れます。

~この電流調査で気付いたこと~
CR2032 の標準負荷電流は 0.3mA です。(SANYO の資料)
この BPI-Bit では普通に 150mA も流れるので、実に500倍もの標準放電電流が流れることになります。
micro:bit でも 25mA なので 80倍 もの電流が流れます。

標準放電電流に比べてこんなにも大きな電流が流れれば、当然ながら電圧降下は大きくなり、そして電圧は足りなくなって起動なんてするはずはありません。

こんな過大電流の環境下で、ボタン電池の内部でどんなことが起こっているかわからないし、なにか事故があってからでは遅いので、こういう規格外での使用は止めた方がいいと思います。

ましてや子供用のマイコンと謳っている micro:bit ではなおさらで、こんなに大きな電流が流れるところにボタン電池を推奨するような「電源供給基板」ってどうなの、って思うけど、まぁこういうことがわかっちゃったし、子どもが使うときは、大人がそばで気にかけてあげることだけは最低限必要でしょうね。

電源は外部からちゃんと取れ・・・ということですね。 

f:id:JH1LHV:20190702213828j:plain

SANYO 技術資料から抜粋

SANYO の技術資料によれば、連続で流せる最大放電電流は 4mA、間欠的なパルスでも 20mA ですから、この BPI-Bit や micro:bit の電源としての使用は最初から無謀ということです。
こういったボタン電池は、基本的に腕時計や電卓、メモリバックアップ用として使うものとして認識しておくことが必要です。


ということで、結局、BPI-Bit のピンにブザーを取りつけて、電源は USB から供給することで morse を鳴らすことに落ち着きました。 

f:id:JH1LHV:20190701170435j:plain


今回使ったテストプログラムです。

# by JH1LHV
from microbit import *

dot_speed = 60 

msg = "JH1LHV JH1LHV JH1LHV" 

morsetab = {
    'A': '.-', 
    'B': '-...', 
    'C': '-.-.', 
    'D': '-..', 
    'E': '.', 
    'F': '..-.', 
    'G': '--.', 
    'H': '....', 
    'I': '..', 
    'J': '.---', 
    'K': '-.-', 
    'L': '.-..', 
    'M': '--', 
    'N': '-.', 
    'O': '---', 
    'P': '.--.', 
    'Q': '--.-', 
    'R': '.-.', 
    'S': '...', 
    'T': '-', 
    'U': '..-', 
    'V': '...-', 
    'W': '.--', 
    'X': '-..-', 
    'Y': '-.--', 
    'Z': '--..', 
    '0': '-----', 
    '1': '.----', 
    '2': '..---', 
    '3': '...--', 
    '4': '....-', 
    '5': '.....', 
    '6': '-....', 
    '7': '--...', 
    '8': '---..', 
    '9': '----.', 
    ' ': '       ', 
    '?': '..--..', 
    ';': '-.-.-.', 
    ':': '---...', 
    '-': '-....-', 
    '/': '-..-.', 
    '(': '-.--.-', 
    ')': '-.--.-', 
    '_': '..--.-',
} 

def dot(): 
    pin0.write_analog(128)
    sleep(dot_speed) 
    pin0.write_analog(0)

def dash(): 
    pin0.write_analog(128)
    sleep(dot_speed * 3) 
    pin0.write_analog(0)

for m in msg.upper(): 
    for c in morsetab[m]: 
        if c == '.': 
            dot() 
        elif c == '-': 
            dash() 

        sleep(dot_speed)

    sleep(dot_speed * 3) 

 

接続したブザーを単純に analog(128) でオン/オフしてるだけなので、音としては不満が残ります。

こんな甲高い音・・・練習だとしても、いつまでも聞いてられませんよね。
ん~、正弦波のキレイな音でモールスが聞けるように、拡張ボードを作るしかなさそうです。

フラッシュメモリも4メガもあるし。
もうメモリ不足で悩むこともなくなったしね。
少しまともな「モールス練習機」を作ってみたくなりました。

M5Stack でも同じようなことやってますが・・・
しばらく、この BPI-Bit で遊んでみることにします。