micro:bitのイベント待ちはブロック言語ではよく分からない

micro:bitで二つのDCモーターを駆動して走らせる車はスイッチサイエンスで購入、

https://www.switch-science.com/products/7957?variant=42398922997958

これに、

Laser距離センサーを動かしてみた

レーザー距離センサーから、ある値以下に障害物に近づいた情報をmicro:bitのP0にパルス(およそ500μs幅)送って方向転換させようとするとイベント待ち、要は割り込み処理、を行おうとした時に、このリファレンスではよく分からないから、

https://makecode.microbit.org/reference

試行錯誤の結果で、

のようにしたら意図したように動いた。

M5stack側のコードは、

https://github.com/chateight/PlatformIO/tree/master/laser_dist_01/src

micro:bit側の全体は、

https://github.com/chateight/mb_car_drv

micro:bitリモコンは、

https://github.com/chateight/mb_car_ctl

 

従って、micro:bitもちゃんと扱うのはC++環境になるんじゃないか

VScodeでmicro:bitを扱うのはこの辺りが取っ掛かりになるだろう

https://jhalfmoon.com/dbc/2020/02/28/鳥なき里のマイコン屋77-vs-codeでmicrobit、デバッガも使え/

 

admin

 

 

iPad Air(五代目)でプロジェクターに接続

iPad Airの五代目は外部コネクタがtype Cが一つでイヤホン端子もありませんが、プロジェクターにはどうやってつなぐかというと、おそらくMacで使えるポートリプリケータでなんとかなるだろうと思ってたけど、なんとかなった。

Lightning用のHDMI接続アダプタもiPhoneがtype-Cになれば用済みになるか?

 

admin

TypeScriptを使ってみる

TypescriptはMicroSoftの開発で今はオープンソースになっていて、大規模プロジェクトで使えるJavaScript上位互換のある「コンパイラ言語」、JavaScriptに型定義などの機能を付加した上位互換なので、JavaScriptの既存ソースはそのまま使えます。

 

<TypeScriptとは何か>

https://qiita.com/EBIHARA_kenji/items/4de2a1ee6e2a541246f6

コードがある程度以上の規模になったら、スクリプト言語で直接実行は辛くなるから、事前にコンパイルで基本的な文法をチェックしてくれる方がありがたいし、それ以外にもinterface, class, type alias, genericなどの大規模プロジェクト向けの拡張機能が使えます。

 

<VScodeで使うための設定>

VScodeとの相性が良いから、この環境で使うのが良いだろう。

https://qiita.com/masakinihirota/items/7ee5c2aa405c2b37d1c5

tsc : コンパイラー

ts-node : jsファイルを作成しないで直接実行、VScodeで実行するとjsファイルを作成しないからts-nodeが動いています。

それぞれの版数、

% ts-node -v

v10.9.1

% tsc -v

Version 4.8.4

 

一番シンプルなコード例、

// .js is a compiled file
// $ tsc ts_basic.ts

function greeter_ts(person: string) {
  return "Hello, " + person;
}

let user_ts = "John";

console.log(greeter_ts(user_ts));

jsファイルにコンパイルすると、

// .js is a compiled file
// $ tsc ts_basic.ts
function greeter_ts(person) {
    return "Hello, " + person;
}
var user_ts = "John";
console.log(greeter_ts(user_ts));

tsファイルで指定した型指定は取れていて、型指定はコンパイル時だけ使用されます、letがグローバル変数にもなっていますが。

 

<実践的な使い方>

https://reffect.co.jp/html/hello-typescript-tutorial#TypeScript

基本のまとめページです

例えば、VScodeでデフォルトだとtscでコンパイルするとjsファイルが同一ディレクトリに作成されてtsファイルと重複してるとエラーメッセージが出ますが、tsconfig.jsonファイルを作成すれば、jsファイルをtsファイルとは別のディレクトリに格納できるというような実践的な記述があるので有用です。

コンパイル時のjjsファイル出力ディレクトリ設定方法は、

% tsc -init

で作成されたtsconfig.jsonファイルでコメントアウトされているoutDir部分に、

“outDir”: “j_s”,
のように設定、ここでj_sはtsファイルが存在するファイル階層に作成したディレクトリを指定しています。
以下がディレクトリ構成です、
この状態で、
% tsc
で、存在するtsファイルをj_s配下にコンパイルしてjsファイルを作成します。ファイル名を指定すると、ディレクトリ指定は有効にならないで同じディレクトリにjsファイルが作成されます。
設定の為の公式ドキュメントは以下のリンクです。

https://www.typescriptlang.org/tsconfig

GitHubのリンクは、

https://github.com/chateight/type_script

 

admin

レーザー距離測定でLCDは光学的に特別の性質なのか

色々なターゲットで距離測定しつつ反射光の検出強度を測定してみた。

環境はArduino IDEでも動かせるし、以前のようにM5stackのビルドも遅くないから、使ってみた。

Arduino IDEで使うライブラリはこれ、

距離値はビジュアル化できる、

APIで反射光のセンサー値(検出強度)を読み出せる、強さが1,000以下は不安定と判断してfailにされている

色々なターゲットでの検出強度、特徴的なのはターゲットがLCD面だと値が大きく変動することで、おそらく偏向特性が関連しているように思う

結構検出精度は高いように思います、検出エリアは公称18度ぐらいですが。可視光と赤外線では見え方が違うだろうから、人の目には明らかでもレーザー光では反射率が低下するようなターゲットもあるでしょう。

P.S. 2022/9/26

鏡でやってみても同じ特性を持つから、単にLCDや鏡は反射特性が指向性を持つからだろう。

 

admin

たぶん今更、(ユニバーサルコントロール)

iPadとMacBookを両方使っているときに、MacのマウスがiPadに行って戻ってこないことが時折、

メニューバーに見慣れないアイコンが、あってiPadと『キーボードとマウスをリンク』になっていたからこの機能を停止。

で、これはユニバーサルコントロールというらしくて、わりと最近の実装のようです。

この機能の設定はシステム環境設定のディスプレイからできて、以下のユニバーサルコントロールをクリックすると、

以下のようなポップアップが出てきて、設定できます。

 

サイドカーの拡張のようなものですが、それほど使うことはないかもしれない、サイドカー自体滅多に使うこともないのは複数画面必要な時はMacBook二台立ち上げだから。

 

admin

 

Laser距離センサーを動かしてみた

<距離センサー>

熱中症指数計も要らなくなったので、M5stackの転用先を考えてみた。距離センサーで超音波方式はそれほど精度も出ないし、速度も遅いからレーザー方式を試してみようと。

デバイスは新しめの、

https://www.switch-science.com/catalog/8183/

上記のリンク先は、

https://learn.adafruit.com/adafruit-vl53l4cx-time-of-flight-distance-sensor/arduino

対象の数まで検出可能というところが優れもの。i2cデバイスで、シリアルにデバイスを拡張できるから基板にコネクタが二個付いている。

しかし、VL53L4のライブラリとサンプルコードでは動かない、デバイスの初期化でエラーが帰る。実はQwiicの接続だけでは不足しているような気がする、故に以下のサンプルコードとライブラリで動かした(VL53L1用だけどL4でも機能限定で動くんだとあったから)

https://learn.sparkfun.com/tutorials/qwiic-distance-sensor-vl53l1x-vl53l4cd-hookup-guide/all

APIが載っているので、こちらは使いやすい。

コードは比較的単純、

https://github.com/chateight/PlatformIO/tree/master/laser_dist_01/src

バッテリー残量表示はデフォルトで必要だと思うから入れてます。

 

距離測定中、タブレットの画面までの距離を表示してます。

アタッチメント、モジュールはいつもの両面テープ貼り付け

動いてるとこ、

Fusion360で作成したピース、

<おまけ>

VL53L4のドキュメントを見ると追加ピンが2本あるのでその役割

・GPIOとXSHUTの役割(i2cのアドレス変更で使う)

Qwiic以外の追加のインターフェースです。

The host hardware design must ensure the sensor XSHUT pins can be controlled individually. Each XSHUT pin must be connected to a host MCU GPIO pin.

To change the I2C address, the host must :

1. Put the device in HW standby by setting the XSHUT pin low on all the VL53L4CD devices

2. Raise the XSHUT pin of one of the VL53L4CD (e.g. current_tof)

3. Call VL53LX_SetDeviceAddress(current_tof, newAddress) to program the new address

4. Repeat the steps from [2 to 3] to change the address of all ToFs.

 

admin

VScodeのPlatfromIOでライブラリ組み込むとエラーになる?

以下のレーザー距離センサーのM5stack用の開発環境準備のために調べてみた結果です。

https://www.switch-science.com/products/8183

① Arduino IDEではライブラリを選択して、Arduino用のデモプログラムを持って来ればコンパイル完了

https://learn.adafruit.com/adafruit-vl53l4cx-time-of-flight-distance-sensor/arduino

もちろんArduino IDEでM5stackを使えるような準備は必要です

 

② PlatformIOではライブラリ無いからソース持ってきてコンパイルしようとしてもエラー

ライブラリのソースは上記のリンク先のGitHubから、

https://github.com/stm32duino/VL53L4CX

デモプロはArduino IDEの時と同じくArduino用をそのまま、

試行錯誤の結果、PlatformIOでM5stackライブラリを組み込むとダメ、ライブラリ使わないようにすればコンパイルはうまくいく、ただしM5stackの機能を使うために、

#include<M5Stack.h>
を追加するとM5stackライブラリ無しでは当然コンパイルできないし、include文を追加すればコンパイルエラーも出ない。従ってArduino専用のサンプルプログラムの時(M5stackライブラリ不要時)にはM5stackライブラリをPlatformIOに組み込んではいけないということになります。おそらくArduino.hとM5Stack.hでコンフリクトしている(多分中身はかなり共通)んじゃないか想像できます。M5stackではArduino.hは不要だからArduino.hを削除してM5Stack.hだけ残しても問題なくコンパイルできるから。

 

コンパイル結果ですが、メモリ少ないデバイスでは動かないよと言われるように、結構メモリを消費しています。

 

admin

 

 

includePathが見つからない(Intel Mac)他

久々にIntelMacとM1MacでVScode環境でc++コンパイルしようとしたらいくつかのエラー発生。IntelMacは問題が二箇所で、M1Macは一箇所だけでしたが

— Intel Mac —

<問題1:includePathが見つからない>

以下を参考にパスを追加

https://jpdebug.com/p/151056

% g++ -v -E -x c++ –

で検索されたパスをc_cpp_properties.jsonに追記してコンパイルはできるようになったけど波線(つまり見つからないエラー)は消えないので、以下を追加

c_cpp_properties.jsonの、

“compilerPath”: “/usr/bin/clang”,

“compilerPath”: “/usr/bin/g++”,

に変えたら解決したようだ、これは即ち

% where g++ 

/usr/bin/g++

で示されるパスですが

<問題2:無限にXcodeコマンドラインツールをインストールしろメッセージ>

Xcodeコマンドラインツールをインストールしろと怒られて、何回インストールしても直らない

https://qiita.com/arks22/items/bb1a70a4803881c4e4e1

が該当していて、エラーメッセージの中に確かに解決案が提示されてます

~~~~~

Please ensure Xcode packages are up-to-date — try running ‘xcodebuild -runFirstLaunch’.

~~~~~

で以下の実行で解決したようです

% xcodebuild -runFirstLaunch

どこかのOSのアップデート、恐らく至近、で問題が出るようになったんでしょう

 

— M1Mac —

MacBook Air(M1)ではg++の版数を再指定(古い版数でコンパイルされたので)しなければいけなかったし、これもアップデート影響なのか

感覚的にはかりそめの解決のような気もするけれども、元々開発環境とはそういうものだろう

 

admin

co2センサー(MH-Z19)のキャリブレーション

測定値が、風通しの良い場所でも800ppmとか高い値になっていて、場所を変えてもダメだったのキャリブレーションしてみた。

https://github.com/UedaTakeyuki/mh-z19/wiki/CALIBRATION-&-detection-range

Pythonライブラリ関連の情報の中にキャリブレーションツールも用意されているのでそれを使いました。

co2センサーはシリアルでRaspberry PIとつながっているのでroot権限で実行しないといけませんが、

$ sudo python -m mh_z19 –zero_point_calibration

Call Calibration with ZERO point.

で実行できました。多少低すぎの感もありますが、いずれまたズレていくんじゃないか(以下の③によって)と思います。

ソースを見ると、以下で規定されるゼロキャリブレーション方法の②のコマンドによって実行しています。

https://www.winsen-sensor.com/d/files/MH-Z19B.pdf

ゼロキャリブレーションには① ハード的にピンを一時的に短絡、② コマンド送信、③ 自動キャリブレーションの三つの方法があるとなっていますが③の有効/無効化もコマンドで対応できるのでライブラリから指定できるようになっています。

また、コマンドパラメータに-hでヘルプ、何も付けないと辞書型({“co2”: 414} のように)で測定値が返ります。

ゼロキャリブレーション以外にスパンキャリブレーションというのもありますが、これはスケール精度、つまり1000ppmや2000ppmの値の倍率(スケール)精度用ですが、正確な1000ppm環境など作れないから省略。

P.S. 2022/9/18

限りなく外気に触れる場所で測定値の収束時間を見てみました。

 

保存していた部屋(おそらくco2濃度1000ppm近く)から無人の部屋の窓を開けて、窓辺に放置して時間経過と測定値。おそらく最初は部屋のガスが取り込まれて高い値を示していますが、徐々に大気の値に近づいていきます。おおむね20分放置しろとデバイスのマニュアルに書かれてますから、初期値が高かったらその程度の放置時間は必要そうです。

 

admin