Arduinoで電子工作する前に、整数論の考え方がちょっと役立つ話

未分類

きっかけ

いや、これがですね。Arduinoでセンサーの値を読み取るとき、「なんか数値がブレるな…」ってなること、ありませんか?

自分もずっとそれに悩んでて、移動平均とかフィルタリングとか調べてたんですけど、最近独学で整数論やってる中で「あ、これ繋がるやん」ってなった話です。

信号の”離散”と整数の世界

Arduinoの analogRead() が返す値って、0〜1023の整数なんですよね。つまりアナログ信号をデジタルに変換した時点で、自分たちは整数の世界で勝負してるわけです。

ここで整数論的な視点が効いてくるポイントをまとめると:

  • 剰余(mod)の感覚 → センサー値を一定周期でまとめたり、リングバッファを回すとき index % N を使う。Nの選び方で効率が変わる
  • 最大公約数(GCD) → サンプリング周期と信号の周期のGCDを意識すると、エイリアシング(偽の波形が見える現象)の原因が整理できる
  • 整数の丸め誤差 → 割り算の切り捨てが積み重なるとズレる。これ、マジで地味にハマるポイント

実際にやってみた例

温度センサー(LM35)の値を10回読んで平均を取る、よくあるやつ。

`cpp

int sum = 0;

for(int i = 0; i < 10; i++){

sum += analogRead(A0);

}

int avg = sum / 10;

`

これ、sum / 10 の時点で小数点以下が消えるんですよね。10回じゃなくて8回(2のべき乗)にすればビットシフトで割れるし、精度の扱いも見通しが良くなる。整数論やってると「なぜ2のべき乗が便利なのか」が感覚でわかるようになります。

わからないから面白い

正直、整数論と信号処理の関係って自分もまだ全然わかってないです。フーリエ変換の離散版(DFT)にも剰余の構造が関わってるらしいんですけど、そこはまだ手が届いてない。

でも「わからんけど繋がってそう」って感覚がある瞬間が、一番ワクワクするんですよね。

答えを先に見るより、自分の手で回路組んでコード書いて「あー、なるほど、そういうことか」ってなる方が絶対楽しいと思うんで、気になった人はぜひ試してみてください。

失敗するほど学べるんで、そこは保証します。

コメント

タイトルとURLをコピーしました