娘のためにその7:センサーを読む[30分]

娘に読ませる以外の意図はなく、よって質問や指摘には対応していません。すなわちネットの浄化作用が働いていない不正確な内容になりますので、正しい情報を求める方は閲覧をご遠慮ください。公開しているのは、通信手段としての利便性のためです。

プログラムについて最低限解説すべきことはまだまだたくさんあるが、実践を踏まえないと退屈してしまうだろう。少し気分を変えて、動くものを作ってみよう。今回は micro:bit のセンサーの値を読み取ってみる。

micro:bit は比較的新しいデバイスで、加速度センサーや磁力センサーを搭載している。値段や大きさを考えると、かなりすごい代物だ。3年前なら腰を抜かすところだ。こういう小さなデバイスの進化は、よく触れているパソコンよりも速さを感じる。数年経てばもっとすごいことになっているのだろう(この文章の執筆は 2020/02/24)。

なお、micro:bitでセンサーを読み取ることだけを目標にするなら、もっと整った簡易な方法が存在するが、ここはあくまでC言語などの低レベル(=ハードウェアに近い、未整備に近い状態を表現する技術用語)なプログラミングを目的とするので、Arduinoで作業する。トラブルに見舞われる可能性が高い、整備されていない道であることをあらかじめ断っておこう。

では始めよう。加速度センサーを読み取りたいので、"micro:bit Arduino acceleration" のように検索するとこのページがヒットするだろう。https://learn.adafruit.com/use-micro-bit-with-arduino/accelerometer-and-magnetometer 

Adafruit という会社は様々なデバイスを販売しており、それらを動作させるためのライブラリを公開してくれる大変ありがたい、そして信頼のおける会社だ。ここで言う信頼とは、多くのユーザが使用している、という意味だ。

ページの先頭に画像があり、micro:bit には2種類あるから自分の手持ちのデバイスを確認するところから始まる。ぜひ確認して欲しい。渡した micro:bit は加速度センサーと磁気センサーが一体になったタイプで、LSM303AGR というライブラリを利用することになるはずだ。

下に進めば  "You can install it via the Library Manager. Just search for LSM303AGR and pick the one from STM32duino:" という記述を見つけられるだろう。このとおりに、Arduino IDE からライブラリマネージャを開いてこれをインストールしよう。

画像1

次にサンプルプログラムを実行してみよう。ページの下部に one example というリンクがある。

画像2

リンク先は github(ギットハブ)だ。github は、git というツールを通じてソースコードを共有するシステムで、多くの個人プログラマおよび企業がここで自分のコードを公開している。公開場所としては、現在のスタンダードと言えるだろう。

コードを使用する上でのライセンスについても注意が必要だが、自分の趣味や勉強で使用するぶんには気にする必要はない。ただし成果物を公開する段階になったら、ライセンスについての知識が必要になる。いずれ解説するだろう。もしかしたら公開なんて実感が沸かないかもしれないが、プログラマであるからには貢献も必要だし、githubでの成果物で就職が決定する、などということは今ではよく聞く話だ。とにかく「自分が貢献する側にまわる可能性がある」ということは意識しておこう。サイトで見えている、お世話になるものはすべて、「普通の」プログラマによって作られたものだ。プログラムが法律と大きく違うのはここで、自分のちょっとした活動が誰かを助けることもある。プログラムの醍醐味のひとつと言えるだろう。

話がそれた。開いたページのプログラムを実行しよう。ファイルをダウンロードする方法もあるが、たったひとつのファイルなのでコピペするのが便利だ。方法は、

画像3

この RAW を押すと「ナマ」のページが開かれるので、command+a などで全体をコピーし、Arduino の新規プロジェクトにペーストする。micro:bit に転送するとコンソール(シリアルモニタ)に現在の値が表示されるはずだ。机の上に置くなどして動かさないでおくと似た数値が流れ、手に持つなどして動かすと加速度や磁力を検知して数値が変化するだろう。

次に、加速度の値をmicro:bitのLEDで表示してみる。

このページに従い、Adafruit Libraries をインストールする。3つのライブラリ( BLEPeripheral 、Adafruit GFX 、 Adafruit Microbit )をインストールすることになるはずだ。

動作例として、加速度の値をLEDに反映させるプログラムを作ってみた。実行してみよう。うまくいけば micro:bit を傾けることでLEDの光る位置が移動するプログラムが動くはずだ。

#include <LSM303AGR_ACC_Sensor.h>
#include <Adafruit_Microbit.h>
Adafruit_Microbit_Matrix microbit;
LSM303AGR_ACC_Sensor *Acc;
void setup() {
 Wire.begin();
 Acc = new LSM303AGR_ACC_Sensor(&Wire);
 Acc->Enable();
 microbit.begin();
}
void loop() {
 int32_t accelerometer[3];
 Acc->GetAxes(accelerometer);
 int px = map(accelerometer[0], -400, 400, 0, 4);
 int py = map(accelerometer[1], 400, -400, 0, 4);
 for (int x = 0; x < 5; ++x) {
   for (int y = 0; y < 5; ++y) {
     if (x == px && y == py)
       microbit.drawPixel(x, y, LED_ON);
     else
       microbit.drawPixel(x, y, LED_OFF);
   }
 }
 delay(100);
}

なお、手元では Softdevice を S110 に設定しないとエラーが出てしまった。

画像4

もしかしたら、他にも何らかの環境の違いでうまくいかないかもしれない。試行錯誤は無駄ではないが、あまりにもヒントがない場合は諦めたほうがいい。慣れていないと解決できない問題はけっこう多い。質問して欲しい。

今回は具体的に学習するポイントは多くはないが、github 上のソフトウェアを利用するという大事な実習になっている。作者への感謝を忘れず、ありがたく使わせてもらおう。

つづく

この記事が気に入ったらサポートをしてみませんか?