それでは毛玉諸君、これにて失敬

日々の精進を備忘録的に綴ります。

はじめてのマイコンボード(M5stickC plus その2)

前回はサンプルコードを書きこんでピカピカさせて終わりました。

前回のピカピカ

サンプルコードを読んでみましょう。

// library
#include <M5StickCPlus.h>

void setup()
{
  M5.begin();
  
  // シリアル通信を開始、通信速度を設定
  Serial.begin(115200);
  // 500 ms 待機
  delay(500);

  // シリアルモニタに表示
  Serial.print("M5StickC-plus Start\n");

  // M5StickC Plus のLCD画面に表示
  M5.Lcd.print("Hello World");

  // GPIO 10ピンを出力モードに設定
  pinMode(10, OUTPUT);
}

void loop()
{
  // GPIO 10ピンにHIGH信号を出力 -> LED点灯
  digitalWrite(10, HIGH);
  Serial.print("LED TURN ON\n");
  delay(1000);
  // GPIO 10ピンにLOW信号を出力 -> LED消灯
  digitalWrite(10, LOW);
  Serial.print("LED TURN OFF\n");
  delay(1000);
}

注釈を入れてみました。
setupで初期化を行い、以降はloopの処理が行われます。
シリアルモニタへの出力はSerial Monitorというvscode拡張機能を入れることで見ることができます。

qiita.com

また、LEDを操作するためのピンは本体裏面に記載がありました。

よく見るとLED G10 という記載がある

ボタンに対応するピンの記載もあり、AボタンはG37、BボタンはG39を使えばよさそうな雰囲気があります。

ボタンを押し続けている間だけLEDを光らせる

ボタンPUSHとLED点灯を対応させてみます。
ボタンの信号を入力として受け取り、IF文でGPIO 10ピンに書き込みを行います。

#include <M5StickCPlus.h>

void setup()
{
  M5.begin();
  Serial.begin(115200);
  delay(500);

  Serial.print("M5StickC-plus Start\n");

  M5.Lcd.print("Hello World");

  pinMode(10, OUTPUT);
  // Aボタン
  pinMode(37, INPUT);

}

void loop()
{
  if (digitalRead(37) == HIGH)
  {
    digitalWrite(10, HIGH);
  }
  else
  {
    digitalWrite(10, LOW);
  }
}

できました!
ちなみにボタン管理用のクラスを使うとM5.BtnA.wasPressed() とかでボタンの状態を判定できます。

lang-ship.com

なんとなく書き込み方法が分かってきました。
そろそろ本題の二酸化炭素測定器を作っていこうかと思います。

はじめてのマイコンボード(M5stickC plus その1)

部屋の二酸化炭素濃度を計測したくて色々調べてたら自作する記事に行きつきまして、
マイコン触ったことないけど記事参考にすればすぐ出来るやろ!と思い付きで部品を注文し、ワクワクしながら組み立てるものの全然うまくいかなかったので、同じ失敗をする人を増やさないために記録を残したいと思います。。。

ちなみに記事はこちら

scrapbox.io

筆者プロフィール

  • 電子工作やったことない
  • もちろん半田付けやったことない(中学の授業でやった程度)
  • C / C++ 言語はほぼ書けない

部品を買う

参考ブログをまるっと鵜呑みにしてます。

  • M5StickC Plus

akizukidenshi.com

  • CO2センサーモジュール (MH-Z19C)

akizukidenshi.com

  • M5StickC/Plus用「Co2 HAT(ソケット版)」キット
    • 購入時点で在庫1点でした(現在在庫切れ)

kitto-yakudatsu.booth.pm

合計8,000円くらいです。
注文後3日程度で全部揃いました。

組み立て

ジャーン

袋から出したところ

鮮やかなオレンジがまぶしいです。
組み立ては以下の記事を参考にしながら行いました。

kitto-yakudatsu.com

そして完成。

5分くらいでできた

USB-C を刺すとテンプレートの画面が表示されました。
ここから開発環境を構築していきます。

ファームウェア書き込み

何やらファームウェアを入れる必要があるようです。
ファームウェアとはハードウェアの基本的な制御を行うためのソフトウェアのことだそうです(参考)。

こちらの記事が分かりやすかったです。
特に詰まることなく完了しました。

zenn.dev

開発環境

vscode拡張機能を使うことにしました。
vscode-m5stack-mpyを使っている記事をよく見かけたので入れてみたのですが、うまく設定できず。
調べると対応するvscodeが限られているようです。

VS Codeで Add M5Stack ボタンが出て来ない件│チラシの裏

vscodeは普段の開発でも使用するのでバージョン固定はあまりしたくない、、、
なのでPlatformIO IDを使用することにしました。
こちらも参考記事があったので見よう見まねで設定します。

qiita.com

サンプルコードもそのまま使いまわし、書き込みを行うと、、、

ピカピカ

あーー!ピカピカしてる!かわいい!!!

おわりに

というわけで二酸化炭素測定器を自作しようとした結果、何かピカピカするものを作ってしまいました。
しかしとても楽しい!
二酸化炭素測定器のコードは公開されているので書き込めば終わりですが、今はなるべく遠回りして色々試していこうと思います。

地球上の2地点間の距離を計算する方法

問題

地球上の2地点それぞれの緯度と経度が与えられます。その地点間の距離を計算してください。
* ただし地球は球体と仮定し、半径は6378kmとします。

用語

  • 緯度
    • 基準は赤道。北極点を北緯90度、南極点を南緯90度とする
  • 経度
  • 大円
    • 球の中心を通るように球を切った時の切り口
  • 大円距離
    • 球面上の距離計測対象の2地点を結ぶ大円の弧の長さ

解法

円弧の長さ Lは、半径 rと中心角 \theta \quad (0 \le \theta \le 2\pi)を用いて、

 \displaystyle
L = r \theta

で求められる。
また、2地点の緯度経度をそれぞれ (\phi_1, \lambda_1), (\phi_2, \lambda_2)とするときの中心角は、球面三角法の余弦定理より

 \displaystyle
\theta = \arccos(\sin \phi_1 \sin \phi_2 + \cos \phi_1 \cos \phi_2 \cos(\lambda_1 - \lambda_2))

で求められる。よって、2地点間の距離 Lは、

 \displaystyle
L = 6378 \arccos(\sin \phi_1 \sin \phi_2 + \cos \phi_1 \cos \phi_2 \cos(\lambda_1 - \lambda_2))

となる。

補足

球面三角法の余弦定理の導出

図1の球面三角形は角 A, B, Cと辺 a, b, cからできている(この球の半径は1とする)。

図2は、頂点 Aで球面に接する平面を考え、 この平面と

  • 直線 OBとの交点を B'
  • 直線 OCとの交点を C'

とする。
このとき、平面三角形 AB'C' \angle Aの大きさは球面三角形 ABC \angle Aの大きさと等しい。

https://orsj.org/wp-content/corsj/or60-12/or60_12_701.pdf から引用

平面三角形 AB'C' OB'C'は辺 B'C'を共有しているので、平面三角形の余弦定理から、

 \displaystyle

\overline{B'C'}^2 = \overline{AB'}^2  + \overline{AC'}^2 - 2 \overline{AB'} \cdot \overline{AC'} \cos A \\

\quad  \quad \quad = \overline{OB'}^2  + \overline{OC'}^2 - 2 \overline{OB'} \cdot \overline{OC'} \cos a

が成り立つ。
 \triangle OAB' \triangle OAC'は直角三角形なので \overline{AB'} = \tan c, \quad \overline{AC'} = \tan b, \quad
 \overline{OB'} = \frac{1}{\cos c}, \quad \overline{OC'} = \frac{1}{\cos b}が成り立つ。これらを先ほどの式に導入し整理すれば導くことが出来る(途中 \tan ^ 2 \theta = \frac{1}{\cos ^2 \theta}を利用する)。

球面三角法の余弦定理と緯度経度との対応

地球を模した半径 rの球面上に、北極 Nと地点 P(緯度  \phi_1、経度 \lambda_1)と地点 Q(緯度  \phi_2、経度 \lambda_2)を頂点とする球面三角形 NPQを考える(図3)。
 PQの角度を \thetaとして余弦定理を適用すると、辺 NPの角度は \pi / 2 - \phi_1、辺 NQの角度は \pi / 2 - \phi_2 \angle A \lambda_1 - \lambda_2となるので、これらを先ほど導出した式に代入することで中心角を導出できる。

https://orsj.org/wp-content/corsj/or60-12/or60_12_701.pdfから引用

参考資料

https://orsj.org/wp-content/corsj/or60-12/or60_12_701.pdf

meria21.hamazo.tv

vldb.gsi.go.jp

ja.wikipedia.org