* この記事はドライバのダウンロードなどを説明していますが、行う際はすべて自己責任でお願いします。
EQIS-1という素晴らしい商品があります。PRIORIS社が販売している、加速度センサとOLEDのディスプレイ、Raspberry Pi Picoのようなマイコンボードである Seeed XIAO RP2040 を積んだ代物です。
本エントリでは、こちらの EQIS-1 を使用してOLEDに好きな文字を書き込む、加速度センサから値を取る方法についてできるだけわかりやすく解説します。
対象読者
Arduino を使ったことがないユーザー
リポジトリ
ソースコードなどはcateiru/eqis-1
のリポジトリに置いています。参考にしてください。
環境を作成する
加速度センサやOLEDを使う前に、はじめに Seeed XIAO RP2040 について理解する必要があります。Seeed XIAO RP2040 は Raspberry Pi財団の RP2040 チップと搭載したマイコンボードです。Arduino IDE を使用することでプログラムを書き込むことができます。 C以外にも MicroPython なども使用できるようですが、加速度センサのドライバがCで書かれている*1ようなのでCで書くことをおすすめします。
Arduino IDE のセットアップ
Arduino IDE をインストールしましょう。VSCodeでも拡張機能を入れることで開発できるようですが、自分の環境ではうまく行かなかったため*2今回は説明しません。
ただインストールしてもそのまま書き込めるわけではありません。ボードを選択する必要があります。公式ドキュメントを参考にセットアップしていきます。
まずは追加のドライバにドキュメントにあるhttps://github.com/.../package_rp2040_index.json
のURLを追加します。基本設定 >追加のボードマネージャーのURL に貼り付けます。そうするとボードマネージャーでRP2040
がヒットするようになるのでRaspberry Pi Pico/RP2040をインストールしてください。
次に、ボードを設定します。ツール >ボード > Raspberry Pi Pico/RP2040 > Seeed Studio XIAO RP2040を設定します。
これで書き込む準備ができました。あとは、USBで接続し、プログラムを書いてポートを指定して書き込むだけです。 試しに、以下のコードで書き込んでみるとシリアルコンソールからHello, World が出力されるかと思います。
voidsetup() { Serial.begin(115200); while (!Serial); } voidloop() { Serial.println("Hello,World"); delay(1000); }
OLEDディスプレイに文字を表示させる
OLEDは SSD1306 の I2C接続なので多分調べれば複数出てくるのでそちらを見ると良いかもしれません。
はじめに、Arduino IDE のライブラリマネージャーから Adafruit GFX Library
, Adafruit BusIO
, Adafruit SSD1306
をインストールしてください。あとは#include
すれば使えるので以下のようにシュッとプログラムを書きます。
#include <Arduino.h>#include <SoftwareSerial.h>#include<Wire.h>#include<Adafruit_GFX.h>#include<Adafruit_SSD1306.h>#define SCREEN_WIDTH 128// OLED 幅#define SCREEN_HEIGHT 64// OLED 高さ#define OLED_RESET -1// リセット端子(未使用-1)// インスタンス作成 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); int n = 0; voidsetup() { // ディスプレイの初期化// 0x3C は OLED デバイスアドレス display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.display(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(25, 28); display.print("Hello, world!"); display.display(); } voidloop() { delay(1000); display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(15, 28); display.printf("count: %d", n); display.display(); n++; }
このプログラムを書き込むとディスプレイに初回はHello, world!が、その後1秒おきにカウントアップしていきます。
加速度センサの値を読み取る
この EQIS-1 は LSM6DSO という加速度センサが組み込まれているためそれ用のドライバをIDEに読み込みます。
IDEのライブラリマネージャーから検索できたらいいのですが、残念ながら存在しないのでGitHubから入れてあげる必要があります。まずは、GitHubからzipをダウンロードしてください*3。
次にダウンロードしたzipを IDE にインストールします。最近の IDE は便利で スケッチ >ライブラリをインクルード > .ZIP形式のライブラリをインストール から簡単にインストールすることが可能なのでシュッとやりましょう。
そのあと、プログラムを書きます。
#include <Arduino.h>#include <SoftwareSerial.h>#include <SPI.h>#include <LSM6DSOSensor.h>#define CS_PIN D3// インスタンス作成 LSM6DSOSensor AccGyr(&SPI, CS_PIN); voidsetup() { Serial.begin(9600); SPI.begin(); AccGyr.begin(); AccGyr.Enable_X(); AccGyr.Enable_G(); } voidloop() { int32_t accelerometer[3]; int32_t gyroscope[3]; AccGyr.Get_X_Axes(accelerometer); AccGyr.Get_G_Axes(gyroscope); Serial.printf("accelerometer: (%d, %d, %d)\tgyroscope: (%d, %d, %d)\n", accelerometer[0], accelerometer[1], accelerometer[2], gyroscope[0], gyroscope[1], gyroscope[2]); delay(10); }
このセンサで取得できる値は2種類あり、Get_X_Axes
からは加速度センサの値、Get_G_Axes
はジャイロセンサの値っぽいです。
いかがでしたか
プログラムの書き方と各種センサ類の使い方を解説しました。このエントリの解説は必要最低限ですが、組み合わせることで加速度センサの値から震度を計算*4してディスプレイに表示することが可能となりますのでぜひ試してみてください。
私も色々遊んでいるのでまたネタが見つかれば記事にしていこうかと思います。
ではではノシ
*1:https://github.com/stm32duino/LSM6DSO
*2:多分Linux環境をSSHで作業しているせい
*3:Windows環境でしか試していないのでわからないのですが、LinuxやMac環境だとtar.gzとかになりそう
*4:https://github.com/ingen084/seismometerを使うと良いかもしれないです。