課題 長沢先生の説明によると象限を決めなければならない。方位角を求めるには arctan を使う。arctanからは2つの解が出てくるので、どちらの象限にあるかということを決定しなければならない。数UBで学んだな。天文に進んだ私は大学でも使っていただろうけど...忘れている(^^;) 未だに、どのスケッチも時にとんでもない回答をすることがある。間違いを追跡して分析したら、私の間違いを突き止められるのだろうな。
2024 7 15 FuncCallの追加2
またまた追加のFunction。
(26) 山行相談は、とりあえず行ってみたい山の行程を喋らせているだけ(^^;) 現在時刻を取得し、登山口までの所要時間を与えておいて、到着時刻に応じて行動を場合分けする。車中泊とか、何時のバスに乗って次の場所に移動するとか。歩き出してからは、おおよその歩行時間を与えて、小屋に到着する時間で場合分けして、宿泊するか歩き続けるかを判断する。最終的に目的とする山頂への登頂時刻を算出して喋らせる。
(27) GPSはM5Stackで以前取り組んでいた。しかし、忘れている。過去の記録を読み返して、どうにかCapsuleのSSD1306で表示することができた。
GPSは初めて電源を入れると、コールドスタートと言って衛星の捕捉に30秒ほどの時間がかかる。いったん捕捉すると次の計測は速い。スタックチャンに喋らせるに、30秒は長い(^^;)
さらに、スケッチのどこに記述すればいいのか試行錯誤。すると、完動
GPS関係はinoの方ではなく、全てFunctionCall.cppに記述する。TinyGPS++.hとSoftwareSerial.hを頭の方でインクルードしておく。String get_gps(){の中で、
static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
を入れておき、
とする。Groveポートをソフトウェアシリアルポートとして使うんだね。北緯の読込みデータが0の間繰り返す。
(28) 赤外線による家電コントロールも以前やっていた。これも復習してから。スケッチやコントローラの赤外線パルスデータも残っていたので楽だった。
やはり全てFunctionCall.cppに記述する。IRremoteESP8266.hとIRsend.hを頭の方でインクルードしておく。
String get_lightON(){ の中で、
IRsend irsend(4);
irsend.begin();
として
rawData0[84]を
irsend.sendRaw(rawData0, 84, 38);
によって5回ほど繰り返す。rawData0[84]は下図のようなデータ。
動作は不安定(^^;) データが悪いかな? M5Stackだと確実に動作するんだけど、M5Capsuleでは不安定。M5AtomS3ではなお不安定(^^;) バッテリーの強さかな
2024 2 9 FuncCallの追加
追加のFunctionができている。
上下のFunction24種類のうち、10〜24までが自作。25は20とほぼ同じ。11〜17は天文分野で、必要な係数はFuncCall.cppの先頭に配列に入れており、それを使って計算させて回答を得ている。10・17・21・23・24は回答すべきデータをcppの先頭に配列に入れており、日時に合致する回答を得たり、乱数でカイトを得たりしている。
19の温度は、bmp180センサーからのデータを得ている。また、バッテリー容量も1つのGPIOピンから電圧を測定している。
質問をするときは、基本ボタンを押すようにしているが、Groveポートにモーションセンサーを付けてスイッチに代用することにしてみたが、単純にCDSセンサを付けて明るさでスイッチに代用することもできる。ただ、GPIOピンが限られているので(本当は倍くらいあるのだが、Capsuleでは使いにくい)Groveポートに付けてしまうと、I2Cデバイスがつけられない。Groveポートを拡張すると大きさが損なわれる。工夫が要る。
FuncCallを増やす手順は次の通り。
2023 12 12 FuncCallの種類
motohさんの、FuntionCallingを使った様々な機能を真似させて頂いて、これまでに作成して機能を列挙します。
使わせて頂いているmotohさんの作品
2023 12 12 Mini OLEDユニット注文
ssd1306をG1・G3に回したことにより、CapsuleのGroveAで他のI2Cを自由に使えるようになったので、Mini OLEDユニットを注文した。明日来るらしい。
このMini OLEDユニットはCapsuleの左側に配置して、GroveAと結ぶ。ユニットの反対側にはGroveポートがあるので、そこに温度センサーをつなぐ予定。問題は、Mini OLEDユニットのアドレスが0x3Cであること。Mini OLEDユニットの大きさを見てから温度センサーをBMP180にするか、BME280にするか決める。それぞれ、0x77と0x78のアドレスなので、並列接続で問題なさそうだが、ssd1306は0x3CなのでOLEDユニットと競合するのか。ssd1306は裏側の抵抗接続変更で0x3Dに変えられるようなので、そこを操作するかだ。いずれにしても明日のMini OLEDユニット到着までお預け。
Capsuleに回答してもらう際に、FuncCallでの回答にいろいろ数値を出すようにしているのだが、とぎれて聞こえにくくなるときがある。そんなときに、数値データだけはMini OLEDユニットに表示してもらおうかと思ったのがきっかけだ。金星や月の欠け具合などもグラフィック表示できればおもしろいかも。
2023 12 8 金星の位置計算
月・太陽・惑星の位置計算をしてきたので、よく目立つ金星の位置計算もしてみた。ほぼ同じ作業&計算式なので問題ないと思ったのだが、距離に大きな誤差が出た。他ではやっていなかったところなので、精査したところ、それぞれの係数に* cos(θ*i) をしていなかった。これの処理でそれなりの値が出るようになった。
距離が出れば、太陽と地球、金星の3体位置関係で、視直径の変化や欠け具合の変化などを知ることができる。
2023 11 30 2代目到着
注文品を待ち望んでいたところに、到着メールが届いた。早速郵便受けを探索したところ到着していた。組み立ててみた。おおっ、Capsuleちゃんが復活した(^^)/ AボタンとBootボタンを付けたので、書き替えや電源入れなどの操作性が増した。
作成手順は下記の通り。Capsuleと同じ程度の基板を用意。なるべく薄くしたいので、SPK2の基板が入るところを空けておく。リード線を使って配線。ssd1306の配線をする。画像では、G13とG15を使っているが、その後G1とG3に変更した。黄色のボタンはGNDとG42に結線。黒のボタンはGNDとG0に結線。このボタンを押したまま電源を入れると書き込みモードになる。
全体の基板幅は9穴あるので、ssd1306をその穴に合わせようとすると中央がズレるので、ssd1306の穴にはリード線を入れて基板中央の穴をよけて配線半田付けしている。これによってssd1306が中央に配置できる。
この後、気温気圧センサーのBMP180をGroveAにさして使ってみた。けれど、BMP180とSSD1306は共存しなかった。そこで、下のように基板の方で、G13・G15につなげた液晶ssd1306をG1・G3に付け替えることで解決した。
最初につけていたG13・G15はGroveAで使っているのだ。GroveAでアドレス0x77のBMP180と0x3CのSSD1306の両方使うことはできるのだろうが、setupに記述する書式が不明なので、このような処理をした。
2つのI2CポートのうちGroveポートは0だろうから(^^;) ssd1306は cfg.unit_glass2.i2c_port = I2C_NUM_1; に。FuncCallでは、Wire.begin(15, 13); Adafruit_BMP085 bmp;bmp.begin(0x77); で一応解決。
2023 11 28 Capsule修理 2代目注文
以前、開腹加工をしていた時に失敗してはがしてしまったGroveポートのコネクタを元通りにしてみたのだが、結局一時は直ったものの、再び剥がれ、その後のCapsuleFace実験での失敗もあり、結局もう一台のCapsuleを注文することになった(^^;)
2023 11 27 CapsuleFace完成
完成したのだが、動作を試すCapsuleがないので、手持ちのCapsuleに差し込んでみた。これが大きな間違い。
こんな具合に動作はした。しかし、この動作実験でか、Capsuleのブザーが消えた(^^;) ボタンAも動作しない( ゚Д゚) 仕方がないので、M5CapsuleとSPK2を注文した...
2023 11 26 Capsuleちゃんへ
M5Stack Capsule Kit w/ M5StampS3というのがM5STACKさんで販売されている。これを1枚半つなぎにしてCapsule本体を覆って基板と本体の間にSKP2の基板をサンド。基板にSSD1306とスピーカ&タクトスイッチを付けて、本体加工無しを考案中。
結果として、販売を待てなかったので、手持ちの汎用基板でやってみた。
SSD1306やSPK2の中のMAX98357はピンを半田ごてで溶かして外した使い回しなので正常に動くかどうか(^^;) 左下の基板の上にSSD1306が乗る。完成したら、Capsuleに差し込むだけ。本体を加工しなくて済むからいいかなと思う。
2023 11 26 花粉情報を知る
長年花粉症を患っている身としては、花粉情報は大切なものだ。ウェザーニュズのポールンロボによる全国的な観測データの公表はとてもありがたい。2023年の春はBasicGRAYで表示させていたが、来年はCapsuleちゃんに報告してもらおうかと。そこで、その前にスケッチを作っておく。
ウェザーニュズの花粉飛散数データの無料ダウンロードサイトでAPIを叩くと、CSV形式でデータを取得することができるので、これを必要に応じて加工してCapsuleちゃんに回答してもらう。過去のデータを使ってテストをしてみた。前日の一日の花粉総量と、最大飛散の時間と個数を回答するようにして上手くいったので、来春は楽しみだ。
こんな具合。花粉総量の間違いは修正済み(^^;)
大赤斑予報
木星がまだ見頃なので、大赤斑が中央に来る時刻を知ろうと計画。自転による木星面の動きは複雑すぎるので、真木さんのホームページでの予報データをスケッチに入れておいて、それを回答するようにしました。真木さんありがとうございます。
M5StackCore2の高性能?
天文関係の計算による回答は、FuncCallを使っているのだが、Capsuleの場合は、こちらで指定した回答スタイルに則って回答してくれる。ところが、性能の良い(?)Core2はスタイルを変更するにとどまらず、関連項目をネットで拾って付加してくれるようで、時にはとんでもないことを回答してくれる場合がある(^^;)
たとえば、スケッチではこうresponseを設定した場合。
response = "恒星時は" + String(LH) + "時" + String(LM) + "分です。" + hosi[LH] + "などが見えそうです。";
と問われた場合に、
Core2回答「恒星時20時32分の時に見えている星座は、以下のようなものです。 夏の大三角:ベガ、デネブ、アルタイル、 北極星:ポラリス、 おうし座:アルデバラン、ふたご座:カストル、ポルックス、しし座:レグルス、おおいぬ座:シリウス。上記の星座が一部ですが云々... 」という具合です。
Capsuleは「恒星時は20時32分です。わし座やはくちょう座などが見えそうです。」という模範回答です。
まあ、Core2は聞かれたことを答えるだけでなく、話題を広げてくれるということかもしれません。
太陽の入出没計算
前項では、月の位置計算をテーマにしたが、その前に表によらない太陽の入出没計算をしていた。
天体位置計算参考書
天体位置計算をするには、長沢 工先生の「天体の位置計算」や「日の出・日の入りの計算」という本が参考書になる。前者はだいぶ前に購入していたもの。後者は、図書館で借りたものだ。
特に、後者には「表によらない月位置の計算」というのがあった。データを入れるとなると、その年限りになってしまうことがあって、いちいち次の年のデータを入れて再コンパイルしなければならないこともある。データを必要としないのには大助かりだ。
月位置計算では、係数の多い長い式があったがスキャナ読み取りなしで頑張って入力。2000年基準のものなのに、23年経った今計算しても精度の高さに驚き(^^) 当たり前か(^^;).....
詳しい説明が必要な場合は、長沢先生の本を借りてください。中央図書館であれば、どこの県や市の図書館にもあると思うので。
天体位置計算式係数の取り込み
PDFから必要な部分をコピーして、エクセルにペーストするのが便利です。私の場合は18行で十分です。縦1列に取り込まれますが、さらにそれをコピーして、縦横変換ペーストで1行に取り込みます。
N、RA、DEG、DISTで1セットですので、0〜17までPDFと同様に整形します。
整形したものをコピーして、秀丸にペースト。スケッチに入るように体裁を整えます。
全体をコピーして、スケッチにペースト。といった順序です。
天体位置計算
海上保安庁さんが天体位置計算式の係数の提示を止めてしまったようで、困っていたんだけど、探していたら、ぬくもりからすさんが公開してくださっていました。感謝です(^^)/ 木星と土星のデータを切り出して前に作っていたスケッチに入れてみたら概ね良好な値が出ました。
太陽と惑星のデータを見てみると、1年を3期に分けて、視赤緯・視赤経・地心距離それぞれに41個の係数が記されています。これを海上保安庁さんのコンピュータ用天体位置計算式にあてはめて計算すればいいのです、言うのは簡単ですけど(^^;) 面倒だし、そんなに精度を求めないので、私は41個ある係数のうち、最初の18個だけを使っています。
恒星時計算
ネットから時刻をもらってきて、年月日時分の変数に入れる。(頭の方で変数を定義しておく doubleがいいと思う)最近は2000年を基準にしているようなので、380行からそのようにしてみた。392行が決め手だ。出てきたsiderealは角度になっているので注意が必要。三角関数で計算するにはラジアンに変更しなければならない。 toRad = 0.0174533 を剰じてやればよい。ラジアンを角度に変更する時には、 toDeg = 57.2958 を使う。
角度から時刻に変換するには、396〜397行のようにしている。
月齢を求めるプログラム
難しい設定の月齢を求めることはないだろうから、簡略化する。
2023/10/15の2:55が朔だったので、その時のJDを求めて基準にする。月齢を知りたい日のJDとの差を求めて、平均朔望月29.53日で割った時の余りを求める月齢とする。
このスケッチを作ってから2年後に動作させても、それなりに正しい値が出たので良しとする(^^)
R5.11.21 オリジナル・アバター顔に戻す
真っ白になってしまうのは残念なので、オリジナルのアバター顔に戻す。Balloonによるテキストも表示したいのだが、座標を指定するのが難しい。もともとどういう座標系になっているのかが分からないうえに、縮小表示にしたのでさらに分からない。そこで、試行錯誤。忘れないように記録を残す。今は、cx=280、cy=160で表示させている。
どうやらRamちゃんの画面が白くなるのは、スケッチが上手く書けていないからのようだ。今後の課題。バッテリー残量をFuncCallで試みたが挫折(^^;) M5CapsuleはM5.Power.getBatteryLevel()に対応しているか...不明なので、今後の課題。
R5.10.28 M5CapsuleにRamちゃんを
順調に出来上がってくると、robo8080さんのRamちゃんも実現できるのでは? やってみると。
大きさ&位置調整できれば表示できますね。
ということで、試行錯誤すると、setPosition無しで、
avatar.setScale(0.4);
だけで表示できました。
これで完成かな、と思ったら、時々画面が真っ白になってしまう(^^;) ソフトの問題かハードの問題か、半田付けうまくいってないからね.....まあ、完成ということで。
R5.10.27 M5Capsuleのアバターを適正な大きさにする
M5Capsule+SSD1306だと、setScaleは0.5がちょうどいいくらいの大きさです。下の画像のようになります。ただ、M5Stack_AvatarのEffectやBalloonは画面からはみ出してしまうので、表示座標を変えてやらないといけません。表示する座標の変更は、avatarのBalloon.hとEffect.hで調整します。
Balloonの三角形の部分を使うと表示が困難なので、断念して削除しました。
これができると、他の所にも応用が利くので便利です、私だけか?(^^;) ポジションは avatar.setPosition(-25,-20); でした。
そうそう、M5AvatarとAquesTalkを使うとき、LipSync.hの中の float open = min(1.0, f); で、数値の型がマッチしてないよ!(たぶん)のエラーが出ました。それまで出たことがないのに?(出てたのかもしれない(^^;)
そこで、float open = min(float(1.0), f); にしたらエラーが消えました(^^) float open = min(1.0f, f); でもいいのかな。何かの時に消してしまったのかも。あるいは、他のライブラリとの相性でエラーが出たのかも。しっかりエラーコードを読め! ということですね(^^;)
R5.10.27 その後のM5Capsule
PortAのソケットが外れてしまった件。修正方法は3通りあったのだが、結局、SSD1306のコードを直接M5Capsule基板上の4つの端子に半田付けした。GPIOピンに比べたら面積が格段に広いので。結果、上手く動作している。時々、接触不良様の現象が出るが(^^;)
ここで、robo8080さんの「Capsule + Glass2でAvatar動いた」というPostを思い出した。確か、Glass1からSTM32マイコンを廃して、直接SSD1309にアクセスするように変更された、というのを見ていたので、それならSSD1306を直接動作させられるのではないかと。
robo8080さんのアドバイスで、M5Unifiedのサンプルを吟味。Nochiさんのアドバイス、M5GFX を見てみると、そのM5UnitGLASS2.h中では、なんとSSD1309ではなく、SSD1306!だったので強行したら動作しましたよ。
どうやらSSD1309と1306とは互換性があるような姉妹関係らしいです。
なんやかんやあって、結局下のような設定でavatarも表示できました。
こんな感じの表示。一通りの変化はつけることができます。Balloonも。ただし、setScaleとsetPositionの関係性は今ひとつ理解不能です。試行錯誤でやってます。
R5.10.23 内蔵のTFカードを使ってみる
ChatGPTでFunctionCallが動作したので、メモ機能に挑戦した。どうもTFカードにアクセスできないんだよね。結果として分かったのは、M5UnifiedはM5製品に共通の土俵を持たせて簡単に使えるようにしてくれたプログラムなんだけど、M5製品が増殖しすぎてどうも言うことを聞いてくれなくなった(^^;)感じですか? 違ったらごめんなさい。そこで、SDカード関連はM5Unifiedから外れているし今回のSPI関連も外れている(?)ので、使う人が自分のM5に合わせてピン設定を宣言してやらねばいけないのですね。またまた違ったらごめんなさい。
ともあれ、SDのCSピンは、これまでのM5製品ではG4でしたが、M5CapsuleではG4は赤外線で使っているので、裏のラベルにあるようにCS11、MISO39、MOSI12、SCK14になっています。小さすぎて見えなかったんだけど(^^;)
M5Unified.cppにはM5Capsuleの_pin_table_spi_sdがラベルにあったように設定されているけれど、esp32_2.0.14のボード情報にはM5Capsuleというのがなかったりして、だからいつもボードはesp32_2.0.14のEAP32S3-Dev-Moduleを使ったりSTAMP-S3を使ったりしてますが....混乱してました(^^;)
そこへ、タカオさん、らびやんさんから的確なアドバイス。感謝です(^^)
らびやんさんのアドバイス。これは汎用ですね、きっと最近のM5製品でSDカードにアクセスするには必要かな。
SPI.begin( M5.getPin(m5::sd_spi_sclk), M5.getPin(m5::sd_spi_miso), M5.getPin(m5::sd_spi_mosi));
auto pin_sd_cs = M5.getPin(m5::pin_name_t::sd_spi_cs);
while (!SD.begin(pin_sd_cs, SPI, 25000000)) { M5.delay(500); }
SPI.begin ( 14 , 39 , 12 );
SD.begin(11, SPI, 25000000);
としてTFカードにアクセスできたのでした(^^)/
R5.10.23 SPK2アンプ内蔵
K.YamaさんがSKP2アンプを内蔵していたので、私もやってみた。色気を出して位置を変えてみたら、収まりが微妙〜 エィッとやって、ちょっと無理したのか、portAのソケットが外れた(^^;) ア〜ア..... まあ、どうにか音は出るのでこれで運用するかな(^^;)
もっとも、冷静に考えると、PortAのG13とG15は本体の横に出ているのでした。また、使っていないG1とG3もあるので、どうにかはなるのでしょう。しかし、再び開腹して配線をするとなるとさらに既に配線したところが取れたりするなど、困難は予想されます(^^;)
R5.10.22 ChatGPTでFunctionCallが動作!
リセットばかりしていたM5CapsuleスタックチャンのChatGPTに、motohさんのFuncCallを導入できた。あれこれ試行錯誤をやりすぎて、何が良かったのか不明(^^;) robo8080さんのM5Unified_AtomEcho_ChatGPTのスケッチとmotohさんのメインのスケッチやFunctionCall.cppを左右に見比べながら、違うところを一つ一つ変更しながら試してみたのが功を奏したみたい。
R5.10.21 ChatGPTが動作!
M5CapsuleとSPK2でChatGPTの応答成功(^^)/ きっかけはK.YamaさんのPost。ブザーをfalse!にすること。ほぼ同時に、M5Unifiedスケッチ例のspeaker.inoに方法が書いてあるのを発券していた。i2sのpin指定すればM5Unifiedがやってくれるのでした。感謝(^^)
R5.10.16 M5CapsuleでSPK2を使う2
SKP2からボードを外し、ピンの黒い樹脂部分を半田ごてで溶かして取り去ってから慎重に真直ぐに伸ばすと、期待するボード状態になる。これを汎用基盤にセットしてM5Capsuleに結合する。
さらにちょこっと改善。BB-8のようなドロイドの声をランダムに再生しようかな、と考えてます(^^) となると、動きが欲しくなるな(^^;)
この時はまだChatGPTが綺麗な声で応答できていない。
R5.10.15 M5CapsuleでSPK2を使う
以前M5AtomLiteでずんだもんの声をSPK2に出させたときのスケッチを使ってM5CapsuleにWAV再生やらせてみた。ビープ音より格段に良かったので、使うことにする。コンパクトにM5Capsuleに装着する方法を考えなくては...
R5.10.13 M5CapsuleでChatGPT
K.Yamaさんという方がM5CapsuleでChatGPTをしていることに衝撃。私も挑戦。robo8080さんのM5Unified_AtomEcho_ChatGPTを使うらしい。LEDピンを21、ボリュームの最大値が不明だが400(255らしい、16進FFだものね)。 setupの最初で単純にauto cfg = M5.config();M5.begin(cfg);だけ、他のスピーカ設定関係は削除。動作した(^^)/ すごい、お二人に感謝。
勢いつけて、FunctionCalling機能を導入してみたが、この時はまだ使うとリセットする。
R5.10.11 M5Capsule画面に表情を!
画面を持つと、顔を表示したい。avatarをssd1306に表示するのは、私の手に負えないので実績のあるesp32-facesにする。と言ってもやはり、しかるのちさんのスケッチを利用させていただいてます(^^;) 若干の変更が手間(すべてのファイルで、AtomをCapsuleにするのとM5Stick関連を削除)だった。
ビープ音だけれども、ドレミ音階を出せるので、効果音として簡単なメロディーの演奏もできそうです(^^)
R5.10.10 M5Capsuleに画面を結合させる
ブレッドボードでは動きが悪いので、M5Capsule本体に画面をくっつけることにした。
半田付けも少なくするために、SSD1306のVCC以外の足を基板を突き抜けて直接M5Capsuleに差し込むようにしてみた。SDAをG5、SCLをG7として設定。
しかし、スケッチを書き替えようと思ったら、基板ごと外さねばならないのが面倒(^^;)
R5.10.8 M5Capsuleに画面をつける
やはりCapsuleにも画面が欲しいので、余っていたSSD1306をつけてみることにしたが、やはり自己解決には至らなかったので(^^;)ネットを探索。 「Arduino環境でESP32-S3搭載 M5STAMP S3を使う」という、たまねぎさんのブログで解決。なかなか素晴らしい内容で、感謝です(^^)
R5.10.7 M5Capsule 始まる
突然ゲットしたM5Capsule。頂いたからには使わねばいけない。しかし、このM5Capsuleというものは、M5StampS3をCoreにした拡張システムだ。下左の画像の左側の黒い部分がM5StampS3。それにバッテリー・SDカードスロットなどが拡張されている。
基本はM5StampS3なので、これまでに使っていたM5StackやM5Atomとはだいぶ違う。まず、スケッチの書き込みにひと作業必要。
BTN 0を押してからUSBケーブルを差し込んで、書き込みモードにする ことから始まる。
StampS3にシールを貼っているので、ボタンが見えないし押しにくい。
予めプログラムが書き込んであるので、PCとUSBケーブルでつないで電源を確保すると動作する。StampS3にもバッテリーがあるので、単体でも、Wakeボタンを押すとその時だけ動作する。しかし、ボタンを離すとOFFになる。M5Stackのドキュメントを読むと、Wakeボタンを押して起動したら、G46をHIGHになるようにプログラム上で記述すればいいらしい。次の2行をsetupに記述しておく。
pinMode(46, OUTPUT);
digitalWrite(46, HIGH);