ゆるエンジニアはいろいろ遊びたい

FAエンジニアが週末にいろいろ遊ぶブログです

RaspberryPi zero 2Wを立ち上げてみた

倒立振子を作るために秋月電子でパーツを買った際、ラズパイ用カメラモジュールの他にラズパイゼロ2Wもついでに購入していました。
今回はラズパイゼロ2Wを立ち上げてみます。

秋月電子ではラズパイゼロ2Wのピンヘッダがついているものが売り切れだったため、ピンを別途購入しはんだ付けします。

はんだごては先の超細いものが使いやすいと思いますが、私は持っていなかったためあまりきれいに付けれませんでした。
一応ちゃんと付けれたので良しとします。
OSのセットアップはラズパイ5と同じようにMicroSDカードにラズベリーパイイマージャーで簡単にできます。
気を付ける点は、Wifiが5GHz帯に対応していない点くらいです。
SSH接続については、WindowsPowerShellではできましたが、VS Codeのリモートエクスプローラーでは繋がってもすぐに落ちてしまいました。
どうやら、リモートエクスプローラーはラズパイ側の処理能力が足りないみたいです。
このままでは作業用PCでプログラミングをしても、ラズパイにファイルを転送できないため、ホームサーバーを構築した際に使ったSambaをラズパイゼロにインストールし、ファイルを共有したいと思います。
PowerShellではSSH接続ができたので、PowerShell上で作業します。
SSh鍵があるディレクトリに移動し、以下のコマンドでラズパイゼロに接続します。

ssh -i "公開鍵のファイル名" "ユーザー名@ホスト名.local

これで接続されれば、ラズパイゼロをコマンドで動かす事ができます。
Sambaをインストールします。

sudo apt update
sudo apt install samba

インストールが完了したら設定変更です。

sudo nano /etc/samba/smb.conf

一番下に下記を追記します。

[pihome]
comment = Pi Home Directory
path = /home/ユーザー名/共有したいフォルダ名
browseable = yes
writable = yes
valid users = ユーザー名
create mask = 0777
directory mask = 0777

保存して閉じたら、ユーザーを設定します。

sudo smbpasswd -a ユーザー名

パスワードの入力を求められるので設定したら、Sambaを再起動します。

sudo systemctl restart smbd

PCで接続する際のアドレスは、\\ラズパイゼロのIPアドレス\pihomeを入力すると入れます。
サーバーと同じようにファイルの読み書きが可能になりました。
VSCodeのターミナルではSSH接続ができたので、リモートエクスプローラと同じような使い方ができました。
これで簡単にラズパイゼロで遊べます。

RaspberryPi5でカメラモジュール2を使う

倒立振子を作るためにギヤモーターやタイヤを購入する際に秋月電子さんを利用したのですが、ほんの数百円の買い物だったので、ついでにちょっと欲しかったラズパイ用カメラモジュール2を購入しました。

カメラ付属のケーブルは幅が広いのでラズパイ5用のケーブルも一緒に購入しました。
ケーブルは爪を上に上げてさします。方向を間違えそうなので気をつけましょう。

カメラをを使うには、rpicamというアプリを使うようです。
ラズパイ5に標準で入っているみたい。

rpicam-hello -t 0

ターミナルでこのコマンドを打つとプレビューが表示されました。
純正のカメラなので得に難しいことでしなくてもすぐに使えます。
物体認識とかできたらおもしろそうですね。

AtomMatrixで倒立振子を作った

AtomMatrixで倒立振子を作っていた記事を見つけたので、マネをして自分も作ってみました。
ネットで検索すると丁寧に作り方を解説している記事が見つかると思いますので、詳しくは書きません。
構成は

  • AtomMatrix
  • AtomicMotionBase V1.2
  • FEETECH ギアードモーター FM90
  • タイヤ FS90R対応

となっています。
モーターとAtomicMotionBaseは両面テープで貼り付けて、裏側にアクリルプレートを貼り付けて補強しています。
重心が後ろよりになっていたため、モーターのみ3mmのアクリルプレートで重心が前よりになるように調整しました。

スケッチはgithubで公開されていたためそれを使いましたが、いろいろ変更しました。

  1. PS4コントローラによるマニュアル運転追加
  2. ジャイロセンサのデッドゾーン追加
  3. バッテリー残量表示追加
  4. ブラウザでのPIDパラメータと目標角度設定追加

動かした動画はXにてポストしています。


githubに公開されているスケッチでは目標角度付近での安定性が低く、デッドゾーンを設定して目標値付近の数値がばたついても無視するようにしたところ、非常に動作が安定しました。
PID制御の方式については、速度型PIDらしくて計算式が通常のPIDと違っていましたが、パラメータの設定で動作が安定するようになりました。
ポイントとしては、目標角度の設定と、水平がとれている走行面で調整をすることです。
走行面の水平が取れていないと重心が変わってしまい、目標角度に到達しても傾いてしまいます。
カーペットなどのぼこぼこした面ではふらつきやすい反面、安定してしまえば微動だにしません。
完全直立を目指していたのですが、いざそれが実現して全くゆらゆらしなくなるとなんかつまらないと感じました。
やっぱり倒立振子はゆらゆら揺れてこそなんだなぁ。と思った次第です。

Atom Matrixで6軸ジャイロセンサーを使う

Atom Matrixでネットの情報を参考に倒立振子を作成している中、ジャイロセンサーについて本体と軸の関係が分からなかったので、センサーからの数値をLEDに変換してバー表示できるようなスケッチを作ってみました。

#include <M5Atom.h>

float accX, accY, accZ;
float gyroX, gyroY, gyroZ;

float brightness = 0.7;  // ★ 輝度30% に設定

int xy2i(int x, int y) {
  return y * 5 + x;
}

//LED色設定
uint32_t rgb(int r, int g, int b) {
  r = r * brightness;
  g = g * brightness;
  b = b * brightness;
  return ((r & 255) << 16) | ((g & 255) << 8) | (b & 255);
}

//Accデータを5段階に変換
int mapAccToLevel(float v) {
  v = constrain(v, -1.0, 1.0);
  return (int)((v + 1.0) * 2.5);
}


void setup() {
  M5.begin(true, true, true);
  M5.IMU.Init();
}


void loop() {
  M5.IMU.getAccelData(&accX, &accY, &accZ);
  M5.IMU.getGyroData(&gyroX, &gyroY, &gyroZ);

  int levelX = mapAccToLevel(accX);
  int levelY = mapAccToLevel(accY);
  int levelZ = mapAccToLevel(accZ);

  M5.dis.clear();

  // X軸(左列)
  for (int i = 0; i < levelX; i++) {
    M5.dis.drawpix(xy2i(0, 4 - i), rgb(255, 0, 0));
  }

  // Y軸(中央列)
  for (int i = 0; i < levelY; i++) {
    M5.dis.drawpix(xy2i(2, 4 - i), rgb(0, 255, 0));
  }

  // Z軸(右列)
  for (int i = 0; i < levelZ; i++) {
    M5.dis.drawpix(xy2i(4, 4 - i), rgb(0, 0, 255));
  }

  delay(100);
}

これを実行すると、X軸が赤、Y軸が緑、Z軸が青のバー表示となって、AtomMatrixの傾きに応じてLEDが光ります。

モニターを正面にして前後がY軸、左右がX軸、天地がZ軸となっていました。

Atom MatrixでPS4コントローラを使う

AtomMatrixでPS4コントローラを接続してみました。
まずはAtom MatrixのMACアドレスを調べます。

#include <WiFi.h>

void setup() {
  Serial.begin(115200);
  delay(2000);

  WiFi.mode(WIFI_STA);
  Serial.print("MAC: ");
  Serial.println(WiFi.macAddress());
}

void loop() {}

書き込んで、USBケーブルを一度差しなおすとシリアルモニタに表示されるのですが、なぜか全て「0」が表示されました。
chatGPTに聞いたところ、ESP32のバージョンを落とせと言われたので、バージョン3.3.5→2.0.17にダウングレードしました。
ダウングレード後はボードの再設定をしてスケッチを書き込んだところ、MACアドレスが表示されました。

PS4との接続

SixaxisPairToolというフリーソフトを作業用PCにインストールし、PS4にAtomMatrixのMACアドレスを設定します。
sixaxispairtool.en.lo4d.com
PS4コントローラをPCに有線で接続し、SixaxisPairToolを実行すると下記のようなウィンドウが表示されます。
黒塗りの部分は現在設定されている機器のMACアドレスなので、Change Masterの枠にAtom MatrixのMACアドレスを設定します。

Atom Matrix側では、PS4Controller by Juan Pablo Marquezというライブラリをインストールして、以下のスケッチを書き込みます。

#include <PS4Controller.h>

void setup() {
  Serial.begin(115200);
  delay(2000);

  PS4.begin("00:00:00:00:00");  // ← AtomMatrixのMACアドレスを書く

  Serial.println("Waiting for PS4 Controller...");
}

void loop() {
  if (PS4.isConnected()) {
    Serial.println("PS4 Connected!");
    delay(500);
  }
}

書き込んだら、AtomMatrixの横にあるボタンを押してリセットします。
シリアルモニタで「Waiting for PS4 Contoroller・・・」と表示されたら、PS4コントローラのPSボタンのみを1回押すと、ペアリングされ「PS4 Connected!」と表示されれば成功です。
void loop()を以下のように変えれば、ボタンとスティックの入力を表示できました。

void loop() {
  if (PS4.isConnected()) {
     Serial.printf(
    "LX:%4d LY:%4d RX:%4d RY:%4d  L2:%3d R2:%3d\n",
    PS4.LStickX(), PS4.LStickY(),
    PS4.RStickX(), PS4.RStickY(),
    PS4.L2Value(), PS4.R2Value()
  );

  if (PS4.Cross())   Serial.print(" X");
  if (PS4.Circle())  Serial.print(" O");
  if (PS4.Square())  Serial.print(" □");
  if (PS4.Triangle())Serial.print(" △");
  if (PS4.L1())      Serial.print(" L1");
  if (PS4.R1())      Serial.print(" R1");
  Serial.println();
  delay(500);
  }
}

これを使えば、PS4コントローラからAtomMatrixを動かすことができますね。

AtomMatrixとAtomic Motionベース v1.2でモーターを動かす

AtomMatrixでLチカができたので、AtomicMotionベースv1.2を接続してモーターを動かしてみました。
slowtech.hateblo.jp
AtomMatrixとAtomicMotionベースv1.2はスイッチサイエンスさん、モーターは秋月電子さんで購入。

ライブラリはM5Atom、M5Unifield、M5AtomicMotionが必要らしいのですが、前回M5Atom by M5Stackをインストールしているので全て入っていました。
M5AtomicMotionはライブラリマネージャーで検索してインストールしました。
スケッチは以下

#include <M5Unified.h>
#include <M5GFX.h>
#include <M5AtomicMotion.h>

M5AtomicMotion AtomicMotion;

void setup() {
  auto cfg = M5.config();
  M5.begin(cfg);
  AtomicMotion.begin();
  Serial.println("Atomic Motion Base Test Start");
}

void loop() {
  // モーター0を正転
  AtomicMotion.setMotorSpeed(0, 200);   // 速度100で回転
  delay(1000);

  // モーター0を逆転
  AtomicMotion.setMotorSpeed(0, -200);  // 速度-100で逆回転
  delay(1000);

  // モーター停止
  AtomicMotion.setMotorSpeed(0, 0);
  delay(1000);
}

書き込みをして、AtomicMotionのスイッチをONにすると動きました。


pythonと違うのは、同じフォルダ内にaruduinoのファイルが複数あるとそれもまとめてコンパイルするらしく、エラーが出るみたいでした。
pythonみたいに同じフォルダに複数のpythonファイルを作って、どんどん試していくみたいなやり方ができないのはカルチャーショックですね。

Atom Matrixを使ってみた。基本のLチカ

電子工作についてWEBで検索していると、RaspberryPiの他にArduinoという言葉を良く目にします。
FA業界は長いこといるのでだいたいわかるのですが、電子工作は素人なので全くわかりません。
Arduinoってなに?みたいな状態ですが、電子工作ではラズパイよりもArduinoを使う人が多い印象を感じました。
ラズパイ5はホームサーバー専用機として運用していてこれ以上何かして壊れると困ります。違うマイコンで、動くものを作りたいと思っていたところAtrom Matrixで倒立振子を作っている記事を目にしました。
非常に面白そうだったので、Atom Matrixを購入して使ってみました。

とても小さいAtom Matrix

スイッチサイエンスさんからAtom Matixを購入したのですが、想像以上に小さくで驚きました。

消しゴムくらいの大きさで、これでいろいろ制御できるのはすごいですね。
Atom Matrixは「ESP32ベースの小型IoT開発ボード」でArduino IDEやUiFlowで制御できるようです。
ということなので、とりあえずArduino IDEをインストールします。
Arduino IDEで検索するとすぐにでてきます。最新のバージョンは2.3.7のようです。

https://www.arduino.cc/en/software/


インストールして起動すると、いろいろ許可しますか?みたいに聞かれるので、全て許可します。
多分ドライバ関係をインストールするときにセキュリティに引っかかっているのかな?
日本語化は「File」から「prefarence」を選択し、「Language」を日本語にすると設定できます。

ボードのインストール

続いて、「ツール」から「ボード」→「ボードマネージャ」を選択し、「ESP」で検索してESP32 by Espressif Systemsをインストールします。

Atom Matrixを接続し、ボードを選択します。「atom」を検索し、M5Atomを選択、また、接続されているUSBのCOM番号を選択してOKします。

スケッチ

はじめにM5Atomのライブラリをインストールします。
「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」を選択し、検索にM5Atomと入力します。
「M5Atom by M5Stack」が出てくるのでインストールします。
AtomMatrixは本体にLEDを内蔵しているので、これを光らせてみます。

#include <M5Atom.h>

void setup() {
  M5.begin(true, false, true);  
  M5.dis.setBrightness(20);   // 輝度を20に設定(推奨20〜40)
}

void loop() {
  M5.dis.fillpix(CRGB::Red);  // 全LEDを赤色で点灯
  delay(1000);

  M5.dis.clear();             // 消灯
  delay(1000);
}

書き込みをすると、自動的にRUNします。


ラズパイはOSが入っているのでラズパイ内にいろいろなpythonスクリプトを入れて、好きな時に好きなプログラムを走らせるのが簡単です。
サーバーとして機能しながら、OLEDディスプレイの表示をしたり、さらに合成音声の再生をさせたりと非常に柔軟な使い方ができます。
一方、AtomMatrixは1つしかプログラムを走らせることができないので、単一プログラムで動く電子工作などに適しているなと感じました。
コンパイルからデータ転送まで地味に時間がかかるので、pythonみたいにサクサク実行してデバッグを繰り返す事ができないのが難点かな。

とりあえず動作できる環境が作れたので良かった。