Timemachineのバックアップ初めて使った、

condaが挙動不審、

conda installを実行すると、

% conda install anaconda-clean

# >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<<<<<<<<<<<<<<<<<

    Traceback (most recent call last):
      File "/Users/usamiryuuichi/miniforge3/lib/python3.10/site-packages/conda/exceptions.py", line 1129, in __call__
        return func(*args, **kwargs)

以下省略〜〜

と言われて実質何もできなくなったから。仮想ディレクトリでも同じだし、そもそも中身を変更するようなコマンドは全滅で、新しい仮想ディレクトリも作れないからデッドロック状態。

それゆえNASのTimemachineバックアップから、

miniforge3ディレクトリを復元したらとりあえず復旧したようです。ディレクトリ復元だけではうまくいかない場合もあるでしょうが、今回は問題なくということでしょう。

原因は恐らくbasicディレクトリでpipインストールしたからの可能性が一番高い。

 

admin

DJI TelloはUDPでテキストコマンド送れば制御できる

TelloにはDJIの提供する標準のアプリもありますが、Tello自体はテキストコマンドで制御できる、つまり専用のドライバなどは不要、ということで簡単にカスタムアプリができます。

UDP/ポート8889でソケット接続すれば、ドライバ不要でテキストモードでコマンド送信とレスポンス受信ができます。

 

<コマンド一覧>

SDK

The Tello SDK connects to the aircraft through a Wi-Fi UDP port, allowing users to control the drone with text commands

https://alfredo-reyes-montero.gitbook.io/tello-dji/sdk

 

<サンプル>

以下のサンプルプログラムを持ってきて、

https://github.com/dji-sdk/Tello-Python

Python2.7なので一部3形に書き換え必要なので書き換えて、

https://github.com/chateight/tello_python

に置いてあります、Python3への変換(except文とprint文)は機械的にできます。

コマンドはテキストファイル(以下ではcommand.txt)で一番単純であろうコマンドを定義して、

command
takeoff
delay 1
land

最初のcommand文はAPIモードに入る宣言として必要です。

 

<実行結果>

コマンドの引数でコマンドファイル(command.txt)を指定します。

% python tello_test.py command.txt
sending command: command to 192.168.10.1
from ('192.168.10.1', 8889): b'ok'
Done!!! sent command: command to 192.168.10.1
sending command: takeoff to 192.168.10.1
from ('192.168.10.1', 8889): b'ok'
Done!!! sent command: takeoff to 192.168.10.1
delay 1.0
sending command: land to 192.168.10.1
from ('192.168.10.1', 8889): b'ok'
Done!!! sent command: land to 192.168.10.1
Traceback (most recent call last):
  File "/Users/xxxxxx/github/tello_python/tello_test.py", line 28, in 
    out = open('log/' + start_time + '.txt', 'w')
FileNotFoundError: [Errno 2] No such file or directory: 'log/2022-10-26 13:06:37.254305.txt'

ログファイルができてないと言われてますが、それはlogディレクトリ作成してないからで、logディレクトリ作成するときちんとログが取れました。

id: 0
command: command
response: b'ok'
start time: 2022-10-26 14:27:31.283580
end_time: 2022-10-26 14:27:31.309985
duration: 0.026405


id: 1
command: takeoff
response: b'ok'
start time: 2022-10-26 14:27:31.310001
end_time: 2022-10-26 14:27:38.808229
duration: 7.498228


id: 2
command: land
response: b'ok'
start time: 2022-10-26 14:27:39.813307
end_time: 2022-10-26 14:27:42.531767
duration: 2.71846

 

ソケットで接続すれば良いだけなので、言語はPythonに限らず今時の言語ならなんでもつながるということになるので、ライブラリ次第で使い分けでしょう。

例えば、ScratchのTello拡張だと、Node.js使ってソケット接続しています。

TelloEDUモデル(編隊飛行だけでなく)だとクライアントモードでつながるので、クラウドサービス(例えばGoogle TM)を使った画像認識とかもできますね。EDUモード買えばよかった。

 

admin

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