Skip to main content

Haritora for hackers

Hello Hackers!

こんにちは、ハッカーさん!あるいは好奇心のあるハッカー候補さん!

このページはHaritoraのハードウェアを使って他の遊びをする人や、自前でコードを書いて遊ぶ人のための技術情報をまとめておきます。

このページの内容は一切の保証、一切の責任を追いません。よろしくお願いします。
機器にダメージを与えるコードを書かない限り(基本的に)HaritoraConfiguratorから製品のファームウェアに戻すことは可能なので、普通の使い方も引き続きお楽しみいただけます。

おもしろいハックが出来たら、こっそり教えて下さい! :)

そして非ハッカーの方は、見てもあまりおもしろくないのでオススメしません…

Haritoraの回路の話

Haritoraは M5StickC→I2C接続→I2Cハブ(マルチプレクサ)→7個のI2Cポート

という回路になっています。

先に書いておくと

となっております。くわしい方ならこの情報だけで、あなたが必要なファームウェアを作れると思います。

以下、具体例を挙げつつ、簡単なサンプルコードを示します。

Haritoraを便利なジャイロセンサの塊として使う

例えば上半身をトラッキングしたい、ロボットアームのトラッキングをしたい、なんらかの姿勢を取得したい。 というときに、Haritoraは最大7個のジャイロセンサを読み込むことが出来るハードウェアとして扱えます。

M5StickCの開発環境を整える

ネットに先人の記事がいっぱいあるので、まずはM5StickC自体の開発環境を整えましょう https://rikoubou.hatenablog.com/entry/2021/03/05/155829

LEDをチカチカさせる以下のコードを書き込んで、動作確認をしましょう。

#include <M5StickC.h>
void setup(){
M5.begin();
// LED ON(GPIO_NUM_10 or M5_LED)
pinMode(GPIO_NUM_10, OUTPUT);
digitalWrite(GPIO_NUM_10, LOW);
}
void loop() {
digitalWrite(GPIO_NUM_10, HIGH);
delay(500);
digitalWrite(GPIO_NUM_10, LOW);
delay(500);
}

Haritora本体だけのジャイロの値を読んでみる

以下のパッケージを追加します。 https://www.arduino.cc/reference/en/libraries/adafruit-bno055/

Haritoraの腰パーツだけを使って画面と有線シリアルポートに腰パーツのIMUの角度x,y,zを表示します。

(M5StickCの電源オンオフ手順は、皆さんもうご存じですね!)


#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <utility/imumaths.h>
#include <M5StickC.h> //M5StickC最新リビジョンではG26とG0でI2Cするとき、これをインクルードしてM5.begin()しないといけない

//imu 0= spine
//imu 1,2 nothing
//imu 3,4 left
//imu 5,6 right
#define BNO055_SAMPLERATE_DELAY_MS (16)
Adafruit_BNO055 bno = Adafruit_BNO055(-1, 0x29);

//multiplexer
#define PAHUB_ADDR 0X70
//Hub range is 0 to 7
void portselect(uint8_t i) {
if (i > 7) return;
Wire.beginTransmission(PAHUB_ADDR);
Wire.write(1 << i);
Wire.endTransmission();
}

void setup() {
//M5StickCの初期化
M5.begin();
//I2C有効化
Wire.begin(0, 26);
//シリアルポート有効化
Serial.begin(115200);
Serial.println("Haritora Mod Test");
M5.Lcd.setRotation(1);

//本体のIMUを初期化
portselect(0);
if (!bno.begin())
{
Serial.println("BNO055 Initialize Fail");
while (1);
} else {
Serial.println("BNO055 Initialize Success");
}

}

void loop() {
M5.update();
portselect(0);

imu::Vector<3> euler = bno.getVector(Adafruit_BNO055::VECTOR_EULER);
char mes[64];
sprintf(mes, "X:%-8.2f Y:%-8.2f Z:%-8.2f", euler.x(), euler.y(), euler.z());

/* Display the floating point data */
Serial.println(mes);
M5.Lcd.fillScreen(BLACK);// #set the default background color
M5.Lcd.setCursor(10, 10);
M5.Lcd.setTextColor(RED); //color

M5.Lcd.print(mes);
delay(BNO055_SAMPLERATE_DELAY_MS);
}

他のマイコンでジャイロの値を読んでみる

「M5Stickの代わりに他のマイコンを使いたい」という場合は Haritoraマザー右上に4ピンのGND,VCC,SDA,SCLがあるので、M5AtomでもProMicroでも、なんでも繋いで遊んでみてください。

(基本的には3.3V駆動を前提にしているので、I2Cは3.3Vになっているマイコンをおすすめします)

センサーデータを偽装する

Haritora ConfiguratorはBT SPP経由のデータをHaritoraだと思い込みます。 なのでセンサーデータを偽装することも可能です。

例えば互換性のあるハードウェアを試しに作る、みたいなことも可能かもしれません。 (注意、その互換ハードウェアをいっぱい売る予定がある場合は一言連絡をください。ビジネスをしましょう)