【備忘録】EQIS-1 でプログラムを書き込む

* この記事はドライバのダウンロードなどを説明していますが、行う際はすべて自己責任でお願いします。

EQIS-1という素晴らしい商品があります。PRIORIS社が販売している、加速度センサとOLEDのディスプレイ、Raspberry Pi Picoのようなマイコンボードである Seeed XIAO RP2040 を積んだ代物です。

quake.one

www.kadenken.com

本エントリでは、こちらの EQIS-1 を使用してOLEDに好きな文字を書き込む、加速度センサから値を取る方法についてできるだけわかりやすく解説します。

対象読者
Arduino を使ったことがないユーザー

リポジトリ

ソースコードなどはcateiru/eqis-1のリポジトリに置いています。参考にしてください。

github.com

環境を作成する

加速度センサやOLEDを使う前に、はじめに Seeed XIAO RP2040 について理解する必要があります。Seeed XIAO RP2040 は Raspberry Pi財団の RP2040 チップと搭載したマイコンボードです。Arduino IDE を使用することでプログラムを書き込むことができます。 C以外にも MicroPython なども使用できるようですが、加速度センサのドライバがCで書かれている*1ようなのでCで書くことをおすすめします。

Arduino IDE のセットアップ

Arduino IDE をインストールしましょう。VSCodeでも拡張機能を入れることで開発できるようですが、自分の環境ではうまく行かなかったため*2今回は説明しません。

www.arduino.cc

ただインストールしてもそのまま書き込めるわけではありません。ボードを選択する必要があります。公式ドキュメントを参考にセットアップしていきます。

wiki.seeedstudio.com

まずは追加のドライバにドキュメントにある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 が出力されるかと思います。

void setup() {
    Serial.begin(115200);
    while (!Serial);
}

void loop() {
    Serial.println("Hello,World");
    delay(1000);
}

OLEDディスプレイに文字を表示させる

OLEDは SSD1306 の I2C接続なので多分調べれば複数出てくるのでそちらを見ると良いかもしれません。

kenchi-blog.com

はじめに、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;

void setup() {
    // ディスプレイの初期化
    // 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();
}

void loop() {
    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に読み込みます。

github.com

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);

void setup() {
    Serial.begin(9600);
    SPI.begin();

    AccGyr.begin();
    AccGyr.Enable_X();
    AccGyr.Enable_G();
}

void loop() {
    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 を使うと良いかもしれないです。