「姿勢制御装置」タグアーカイブ

姿勢制御モジュール 5重倒立挑戦 ーリアクションホイールへの道57ー

前回は極小姿勢制御モジュールを製作し報告させていただきました。

極小姿勢制御モジュール SHISEIGYO-1 DC センサレス Jr. ーリアクションホイールへの道56ー

 

製作した極小姿勢制御モジュール “SHISEIGYO-1 DC センサレス Jr.” を頂点に多段重ねの倒立も試しました。

前回は4段倒立がなかなかできない状況でしたが、ここではもろもろ調整して5段倒立を目指しましたので報告します。

 

 

以前の状況

まずは極小姿勢制御モジュールの完成以前の多段重ね倒立の状況を記します。

記録としては4段重ねで1分15秒が最高記録でした。

姿勢制御モジュール 4重倒立挑戦3 ーリアクションホイールへの道49ー

 

4段の構成は下段から以下の通りです。

 

専用基板製作

極小姿勢制御モジュール “SHISEIGYO-1 DC センサレス Jr.” 用の専用基板を製作して仕上がりをスッキリさせました。

3重倒立

SHISEIGYO-1 DC センサレス Jr. を専用基板で仕上げて更に制御パラメータを調整したところ、
長時間の3重倒立が実現されました。

一番下の SHISEIGYO-1 Jr. のフライホイールもナットを追加して重量を増しています。

4重倒立

続いて4重倒立に挑戦。

まだまだ安定倒立には程遠い状況です。。

モータ変更

SHISEIGYO-1 DC センサレス Jr. のトルクが足りないように感じたので、モータのサイズを大きくしてみました。

左が購入品 右が従来のモータ。
なんか太いからコイルや磁石いっぱい詰まっててトルクも大きいだろ。きっと。

[amazonjs asin=”B07CQW4HQT” locale=”JP” title=”GUOOL モーター 高速モーター  ヘリ マルチコプターボディパーツ 全3選択  , モータ電圧3.7V, 8.5x20x5mm(モーターサイズ)”]

3重倒立

モータ変更後に3重倒立お試し。かなり安定度が向上しました。

4重倒立

SHISEIGYO-1 DC センサレス Jr. 自体のトルクは十分なのですが、最上部で倒立させるために電源線を引き延ばしており配線の重さが影響して長時間倒立ができない様子でした。

 

電源ワイヤレス

SHISEIGYO-1 DC センサレス Jr. 自体が小さく軽いために電源線の重さでもバランスに影響を与えるのでバッテリ内蔵化しました。

 

LiPoバッテリを5V DCDCで昇圧して機体に電源供給しています。

4重倒立

早速 4重倒立。一番上のSHISEIGYO-1 DC センサレス Jr. の電源ワイヤレス化によって安定性が急激に向上しました。

4重倒立で5分以上は驚くべき記録と言えます。
5重倒立に向けた準備は十分だとお考えます。

 

5重倒立

準備が整いましたので
いよいよ5重倒立に挑戦です。

時間は短いですが1stトライで5重倒立が達成できました!
極小姿勢制御モジュール SHISEIGYO-1 DC センサレス Jr. の実現と入念な準備の賜物です。

段数増加に伴いまして一番下の SHISEIGYO-1 the END のホイールの重量を増やしております。

 

2nd トライ!!

 

20秒の5重倒立に成功。
やはりかなり難しいです。。NG集もどうぞ (ポリスストーリーのエンディングテーマを心に流してみていただきたいです)。

 

 

おわりに

ここでは極小姿勢制御モジュール SHISEIGYO-1 DC センサレス Jr. を頂点とした5重倒立に挑戦いたしました。

SHISEIGYO-1 DC センサレス Jr. の実現までは夢にも考えなかった5重倒立の実現に大変喜んでおります。

これからも工学勉強を更に強化して様々なことに挑戦したいと思います。

極小姿勢制御モジュール SHISEIGYO-1 DC センサレス Jr. ーリアクションホイールへの道56ー

前回は電流センシング機能付きのモータドライバDRV8876を使用してエンコーダなしのセンサレス姿勢制御モジュールを製作しました。

極小姿勢制御モジュール SHISEIGYO-1 DC センサレス Jr. ーリアクションホイールへの道56ー

ここではミニ四駆用のモータより更に小さいモータを使用して、モジュールの小型化を目指します。
 

 

コアレスモータ

モータ電流からモータ回転速度を推定できるようになったことで、回転検知エンコーダが必要なくなりました。
それに伴ってモータ選定の幅が大きく広がりました。

ここでは姿勢制御モジュールの小型化を目指して、小型ドローンで使用されるコアレスモータの使用を検討します。

[amazonjs asin=”B07CQW4H4M” locale=”JP” title=”コアレスモーター 高速モーター プロペラ ヘリ マルチコプターボディパーツ 全3選択   – モータ電圧3.7V, 7x20x5mm(モーターサイズ)”]

 

単純にミニ四駆モータからコアレスモータに変えただけですが、回転制御は問題なくできそうです。

 

極小姿勢制御モジュール完成

コアレスモータ専用の筐体を製作しました。

 
専用のホイールも製作して、極小姿勢制御モジュール “SHISEIGYO-1 DC センサレス Jr.”の完成です。

 

制御の構成は前回と全く同様で、ATOMS3でモータドライバDRV8876を介してモータを制御しています。
 

5重倒立を目指して

今回作成したSHISEIGYO-1 DC センサレス Jr. をこれまで最小であったSHISEIGYO-1 DC に載せてみました。

なんと問題なく載せることができ、11分以上倒立しました。
ノーカット版は以下

 

こうなると以前挑戦した4重倒立のその上を目指したくなるのがチャレンジャーの性というもの。

3重倒立

SHISEIGYO-1 DC センサレス Jr.、SHISEIGYO-1 DC、SHISEIGYO-1 Jr. の3重に挑戦

まぁまぁイケてる。

4重倒立

さらに下にSHISEIGYO-1を置いて4重に挑戦。

ちょっと厳しい。。。
調整と練習が必要ですね。

5重倒立実現にむけて努力します!

 

専用基板作製

DRV8876専用の基板も作製しました。

専用基板によって更に小型化できましたので、5重倒立に向けて検討進めたいと思います!

次の記事

姿勢制御モジュール 4重倒立挑戦3 ーリアクションホイールへの道49ー

DRV8876を採用してセンサレス姿勢制御モジュール ーリアクションホイールへの道55ー

前回は電流センサでモータ電流を検知して回転速度を推定し、磁気エンコーダなしでのセンサレス姿勢制御モジュールの倒立動作を実現しました。

SHISEIGYO-1 DC 完成!  ーリアクションホイールへの道47ー

 

ここでは電流センシング機能付きモータドライバを採用して更に部品点数の削減を試みました。

 

 

モータドライバ DRV8876

DRV8876は電流センシング機能付きのモータドライバです。
電流は以下のデータシートの図の通りドライバ下部のシャント抵抗で検知します。

DRV8876データシート

検知した電流をミラーしてIPROPIに流して外付け抵抗で電圧として測定できます。

 

ここではPololuのモジュールを購入しました。

Pololuのモジュールは電流センス用の抵抗やは逆起電力対策回路も内蔵で非常に使いやすかったです。

 

DRV8876による回転と電流検知

PololuのDRV8876モジュールで回転と電流検知を確認して観ます。

回転は以下のようにPhase / Enableモードで制御しました。

ENピンにPWM信号を入力し、PHピンで正転/反転を指示します。
CSピンの電圧で電流が検知できます。
 
 

ATOMS3をコントローラとして回転させました。
可変抵抗でENピンへのPWM信号のデューティ比を指定しています。
ボタンで正転/反転。

電流値も観測できました!
モータ電流の方向までは検知できないため、正転/反転信号で符号反転しました。

 

姿勢制御モジュール作製

DRV8876モジュールによる回転動作と電流センシングが確認できましたので、前回と同様にモータ電流を検知して回転速度を推定し、姿勢制御モジュールの倒立動作を目指します。

モータは普通のミニ四駆モータを使用します。
固定具を3Dプリントしました。

 

ATOMS3とDRV8876モジュールも配線。
モジュールに逆起電力対策回路や電源コンデンサもしっかり載ってるので非常に簡単に制御基板ができました。

 

動作

DRV8876によるセンサレス姿勢制御モジュールが完成しました!!
電流による推定回転速度でも力強い倒立が実現できております。

 

おわりに

これまではDCモータを用いた1軸 姿勢制御モジュールとしてSHISEIGYO-1 DCの製法レシピを販売しておりました。

SHISEIGYO-1 DC の製作レシピ

 
電流センサによって回転推定ができることがわかり磁気エンコーダが削減され、
モータもダブルシャフトではなく普通のモノが使用できるようになりました。
更にこの度モータドライバDRV8876を採用することで外付けの電流センサも必要がなくなり、部品点数の少ない1軸 DCモータ 姿勢制御モジュールが実現できました。

専用基板を設計して、より親しみやすいDCモータ 1軸 姿勢制御モジュールの製作レシピを完成できればと考えております。

次の記事

DRV8876を採用してセンサレス姿勢制御モジュール ーリアクションホイールへの道55ー

センサレス姿勢制御モジュール完成 ーリアクションホイールへの道54ー

先日は電流センサを用いて回転速度を推定するDCモータのセンサレス制御について学習しました。

SHISEIGYO-1 DC 完成!  ーリアクションホイールへの道47ー

 

ここではこのセンサレス回転速度制御を姿勢制御モジュールに応用してみます。

 

 

SHISEIGYO-1 DC 改造

1軸姿勢制御モジュール SHISEIGYO-1 DC をモータ電流をセンシングできるように改造して、回転速度を推定しての倒立を目指します。

SHISEIGYO-1 DC の製作レシピ

 

電流センサは以下を使用して、モータ配線間に挿入します。

[amazonjs asin=”B08QMCCYVZ” locale=”JP” title=”Hailege 2個セット ACS712 20A電流センサーモジュールACS712 20A電流検出範囲Arduino用”]

 
コントローラはセンサレス回転制御の検討時と同様にATOMS3を採用しました。

 

回転速度を推定するので磁気エンコーダは除去しました。
今回使用した基板はモータドライバ (DRV8835)を裏面に実装する古いものを使用しました。

 

回転速度推定

1軸姿勢制御モジュール SHISEIGYO-1 DC は以下のようにモジュールの姿勢角($θ_b$) とその角速度($\dotθ_b$) とモータの回転速度($\omega$) からモータに入力するべき電圧 (実際にはモータドライバに印可するPWM信号のデューティ比)を導出しています。
 $K_p$、$K_d$、$K_w$は調整パラデータ

$$V = K_p・θ_b+K_d・\dotθ_b+K_w・\omega (1)$$

ここではモータの回転速度($\omega$) を磁気エンコーダによるものから電流センサによる推定値に変更します。

モータは以下のようにモデル化できます。$E_m$は誘起電圧

上のモデルより回転速度($\omega$)は以下で導出できます。

$$\omega=\frac{V-(R+sL)I}{\Phi_m}\fallingdotseq\frac{V-RI}{\Phi_m}   (2)$$

インダクタンスの微分項は無視します。倒立時の応答はそれなりに早いので無視できない可能性ありますが簡単のために省略します!
Vは式(1)で算出された値、Iは電流センサで検出した値を用います。

モータの抵抗$R$と磁束密度$\Phi_m$は前回測定した値を使用します。

式(2)で得た推定回転速度を式(1)の$\omega$にフィードバックして姿勢制御回転をさせます。

参考文献

[amazonjs asin=”4789846342″ locale=”JP” title=”高トルク&高速応答! センサレス・モータ制御技術 (パワー・エレクトロニクス・シリーズ)”]

 

倒立動作

電流センサで回転速度を推定して倒立動作の検証を実施しました。

問題なく倒立動作が実現されました。
この変更に際して式(1)の$K_p$、$K_d$、$K_w$は再調整しました。

 

おわりに

ここでは電流を検知して回転速度を推定し、磁気エンコーダなしでの姿勢制御モジュールの倒立動作を実現しました。

センサレス姿勢制御モジュールの爆誕です!
(まぁ電流センサ使ってるんだけど。。)

DCモータはフライホイールと磁気エンコーダ用の円盤磁石を取り付けるためにダブルシャフトモータを使っておりました。

この度 磁気エンコーダの除去が実現されたので、普通のモータでも姿勢制御できそうです。
また、電流センシング機能付きモータドライバを採用することで更にコンパクトなシステムが実現できるかもしれません。

次の記事

DRV8876を採用してセンサレス姿勢制御モジュール ーリアクションホイールへの道55ー

ATOMS3 で姿勢制御モジュール  ーリアクションホイールへの道53ー

先日 ATOMS3 という製品がM5Stack社から発売されました。

[bc url=”https://docs.m5stack.com/en/core/AtomS3″]

M5ATOM MatrixのLEDマトリクスがLCD (128×128ピクセル)に変更され、コントローラとしてESP32-S3が採用されています。

この度 ATOMS3 を入手し姿勢制御モジュールを製作しましたので報告させていただきます。

 

 

ATOMS3

待ちわびた製品が到着。白くてカワイイ

 

コントローラがESP32-S3に変わったのでピン番号が変わっていますが、電源・GNDやIMUのI2Cピンなど構成はMatrixと同様です。

 

姿勢制御モジュールで味見

試しにM5ATOM Matrix を使って製作したSHISEIGYO-1  Jr. をATOMS3で試してみました。

 

ATOMS3のArduinoライブラリが用意されていましたが、この時点 (2022/12/28)ではコンパイルエラーで使用できませんでした。

ATOMS3ライブラリは使用せずにSHISEIGYO-1  Jr. のコードをそのまま使用し、対応するGPIOの番号を変えるのみで動作しました。
Arduino IDEでのボードは”ESP32S3 Dev Module”を選択。
ディスプレイはまだ駆動できていません。

もう1点 Matrixと比較してIMUセンサMPU6886の軸が異なっていました。
ATOM MatrixはLED基板の裏に実装されていましたが、ATOMS3は恐らく本体基板に普通に実装されてるようです (中みていないので確定ではないですが)。

傾きを算出する際に注意が必要となります。

 

ディスプレイ表示

ATOMS3には128×128のLCDが搭載されております。ピンアサインはパッケージに記載があるのですがドライバが不明で良くわからず。。
しかも専用ライブラリは現状使えないので途方に暮れていたのですが、Twitter上でM5GFXライブラリで表示可能との情報を得ました。

[bc url=”https://github.com/m5stack/M5GFX”]

 

早速 表示実験

M5GFXライブラリのおかげで何の設定もなしに簡単に表示できました。ありがたや。
小さいディスプレイですがコントラストも良く視野角も広くて素晴らしいです。

 

SHISEIGYO-1 Jr. S3

ディスプレイ表示ができるようになったので、姿勢制御モジュールを仕上げました。

SHISEIGYO-1 Jr. S3 爆誕
ということで ATOMS3 の白いボディに合わせて真っ白に仕上げてみました。
ディスプレイ表示もいい感じです♪

Arduino IDEコード

SHISEIGYO-1  Jr. のサンプルコードをベースにコーディングしました。

#include "MPU6886.h"
#include <Kalman.h>
#include "FastLED.h"
#include <WiFi.h>
#include <WebServer.h>
#include <Preferences.h>
#include <M5GFX.h>

M5GFX lcd;

WebServer server(80);

const char ssid[] = "SHISEIGYO-1 Jr.";  // SSID
const char pass[] = "password";   // password

const IPAddress ip(192, 168, 22, 10);      // IPアドレス
const IPAddress subnet(255, 255, 255, 0); // サブネットマスク

#define ENC_A 5
#define ENC_B 6
#define brake 7
#define rote_pin 1
#define PWM_pin 2
#define button 41

MPU6886 IMU;

unsigned long oldTime = 0, loopTime, nowTime;
float dt;

volatile byte pos;
volatile int  enc_count = 0;

float Kp = 1.8;
float Kd = 2;
float Kw = 0.4;
float IDRS = 0.6;

float getupRange = 0.1;
float injectRatio = 14;
int rotMaxL = 720;
int rotMaxR = 790;

int delayTime = 2;

int pwmDuty;
int GetUP = 0;
int GetUpCnt = 0;

float M;
float Aj = 0.0;

float accX = 0, accY = 0, accZ = 0;
float gyroX = 0, gyroY = 0, gyroZ = 0;
float temp = 0;

float theta_acc = 0.0;
float theta_dot = 0.0;

Kalman kalmanY;
float kalAngleY, kalAngleDotY;

Preferences preferences;


//加速度センサから傾きデータ取得 [deg]
float get_theta_acc() {
  IMU.getAccelData(&accX,&accY,&accZ);
  //傾斜角導出 単位はdeg
  theta_acc  = atan(-1.0 * accX / accZ) * 57.29578f;
  return theta_acc;
}

//Y軸 角速度取得
float get_gyro_data() {
  IMU.getGyroData(&gyroX,&gyroY,&gyroZ);
  theta_dot = gyroY;
  return theta_dot;
}

//起き上がり
void getup(){
  digitalWrite(brake, HIGH);
  int rotMax;
  //回転方向
  if(kalAngleY < 0.0){
    rotMax = rotMaxL;
    digitalWrite(rote_pin, LOW);
    GetUP = 1;
  }else{
    rotMax = rotMaxR;
    digitalWrite(rote_pin, HIGH);
    GetUP = 2;
  }

  for(int i = 1023; i >= rotMax; i--){
    ledcWrite(0, i);
    delay(5);
  }
  ledcWrite(0, rotMax);
  delay(300);
  
  if(kalAngleY > 0.0){
    digitalWrite(rote_pin, LOW);
  }else{
    digitalWrite(rote_pin, HIGH);
  }
}


//Core0
void display(void *pvParameters) {
  for (;;){
    lcd.setTextFont(4);
    lcd.setCursor(10, 2);
    lcd.printf("%+05.1f", kalAngleY);

    int yy = map(kalAngleY, 20, -20, 0, 127);
    yy = constrain(yy, 0, 127);
    uint32_t colorY;

    if(fabs(kalAngleY) <= 1.0){
      colorY = 0x00FF00U;
    }else if(fabs(kalAngleY) <= 15){
      colorY = 0x0000FFU;
    }else{
      colorY = 0xFF0000U;
    }
    lcd.fillRect(yy - 2, 25, 5, 128, colorY);
    delay(33);
    lcd.clear();

    disableCore0WDT();
  }
}

//ブラウザ表示
void handleRoot() {
  String temp ="<!DOCTYPE html> \n<html lang=\"ja\">";
  temp +="<head>";
  temp +="<meta charset=\"utf-8\">";
  temp +="<title>SHISEIGYO-1 Jr.</title>";
  temp +="<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">";
  temp +="<style>";
  temp +=".container{";
  temp +="  max-width: 500px;";
  temp +="  margin: auto;";
  temp +="  text-align: center;";
  temp +="  font-size: 1.2rem;";
  temp +="}";
  temp +="span,.pm{";
  temp +="  display: inline-block;";
  temp +="  border: 1px solid #ccc;";
  temp +="  width: 50px;";
  temp +="  height: 30px;";
  temp +="  vertical-align: middle;";
  temp +="  margin-bottom: 20px;";
  temp +="}";
  temp +="span{";
  temp +="  width: 120px;";
  temp +="}";
  temp +="button{";
  temp +="  width: 100px;";
  temp +="  height: 40px;";
  temp +="  font-weight: bold;";
  temp +="  margin-bottom: 20px;";
  temp +="}";
  temp +="</style>";
  temp +="</head>";
  
  temp +="<body>";
  temp +="<div class=\"container\">";
  temp +="<h3>SHISEIGYO-1 Jr.</h3>";
  
  //起き上がりボタン
  temp +="<button type=\"button\" ><a href=\"/GetUp\">GetUp</a></button><br>";

  //Kp
  temp +="Kp<br>";
  temp +="<a class=\"pm\" href=\"/KpM\">-</a>";
  temp +="<span>" + String(Kp) + "</span>";
  temp +="<a class=\"pm\" href=\"/KpP\">+</a><br>";

  //Kd
  temp +="Kd<br>";
  temp +="<a class=\"pm\" href=\"/KdM\">-</a>";
  temp +="<span>" + String(Kd) + "</span>";
  temp +="<a class=\"pm\" href=\"/KdP\">+</a><br>";

  //Kw
  temp +="Kw<br>";
  temp +="<a class=\"pm\" href=\"/KwM\">-</a>";
  temp +="<span>" + String(Kw) + "</span>";
  temp +="<a class=\"pm\" href=\"/KwP\">+</a><br>";

  //Rot Max L
  temp +="Rot Max L<br>";
  temp +="<a class=\"pm\" href=\"/rotMaxLm\">-</a>";
  temp +="<span>" + String(rotMaxL) + "</span>";
  temp +="<a class=\"pm\" href=\"/rotMaxLp\">+</a><br>";

  //Rot Max R
  temp +="Rot Max R<br>";
  temp +="<a class=\"pm\" href=\"/rotMaxRm\">-</a>";
  temp +="<span>" + String(rotMaxR) + "</span>";
  temp +="<a class=\"pm\" href=\"/rotMaxRp\">+</a><br>";

  //IDRS
  temp +="IDRS<br>";
  temp +="<a class=\"pm\" href=\"/IDRSm\">-</a>";
  temp +="<span>" + String(IDRS) + "</span>";
  temp +="<a class=\"pm\" href=\"/IDRSp\">+</a><br>";
  
  temp +="</div>";
  temp +="</body>";
  server.send(200, "text/HTML", temp);
}

void handleGetUp() {
  handleRoot();
  if(GetUP == 0){
    getup();
  }
}

void KpM() {
  if(Kp >= 0.1){
    Kp -= 0.1;
    preferences.putFloat("Kp", Kp);
  }
  handleRoot();
}

void KpP() {
  if(Kp <= 30){
    Kp += 0.1;
    preferences.putFloat("Kp", Kp);
  }
  handleRoot();
}

void KdM() {
  if(Kd >= 0.1){
    Kd -= 0.1;
    preferences.putFloat("Kd", Kd);
  }
  handleRoot();
}

void KdP() {
  if(Kd <= 30){
    Kd += 0.1;
    preferences.putFloat("Kd", Kd);
  }
  handleRoot();
}

void KwM() {
  if(Kw >= 0.1){
    Kw -= 0.1;
    preferences.putFloat("Kw", Kw);
  }
  handleRoot();
}

void KwP() {
  if(Kw <= 30){
    Kw += 0.1;
    preferences.putFloat("Kw", Kw);
  }
  handleRoot();
}

void handleRotMaxLm() {
  if(rotMaxL >= 10){
    rotMaxL -= 10;
    preferences.putInt("rotMaxL", rotMaxL);
  }
  handleRoot();
}

void handleRotMaxLp() {
  if(rotMaxL <= 1010){
    rotMaxL += 10;
    preferences.putInt("rotMaxL", rotMaxL);
  }
  handleRoot();
}

void handleRotMaxRm() {
  if(rotMaxR >= 10){
    rotMaxR -= 10;
    preferences.putInt("rotMaxR", rotMaxR);
  }
  handleRoot();
}

void handleRotMaxRp() {
  if(rotMaxR <= 1010){
    rotMaxR += 10;
    preferences.putInt("rotMaxR", rotMaxR);
  }
  handleRoot();
}

void IDRSm() {
  if(IDRS >= 0.1){
    IDRS -= 0.1;
    preferences.putFloat("IDRS", IDRS);
  }
  handleRoot();
}

void IDRSp() {
  if(IDRS <= 10){
    IDRS += 0.1;
    preferences.putFloat("IDRS", IDRS);
  }
  handleRoot();
}

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

  lcd.begin();
  lcd.setTextColor(0xFFFFFFU, 0x000000U); //1つ目の引数が文字色、2つ目の引数が背景色
  
  
  pinMode(ENC_A, INPUT);
  pinMode(ENC_B, INPUT);
  pinMode(brake, OUTPUT);
  pinMode(button, INPUT);
 
  attachInterrupt(ENC_A, ENC_READ, CHANGE);
  attachInterrupt(ENC_B, ENC_READ, CHANGE);

  IMU.Init();

  //フルスケールレンジ
  IMU.SetAccelFsr(IMU.AFS_2G);
  IMU.SetGyroFsr(IMU.GFS_250DPS);

  kalmanY.setAngle(get_theta_acc());

  ledcSetup(0, 20000, 10);
  ledcAttachPin(PWM_pin, 0);
  
  pinMode(rote_pin, OUTPUT);
  digitalWrite(brake, LOW);

  preferences.begin("parameter", false);

  //パラメータ初期値取得
  rotMaxL = preferences.getInt("rotMaxL", rotMaxL);
  rotMaxR = preferences.getInt("rotMaxR", rotMaxR);
  Kp = preferences.getFloat("Kp", Kp);
  Kd = preferences.getFloat("Kd", Kd);
  Kw = preferences.getFloat("Kw", Kw);
  IDRS = preferences.getFloat("IDRS", IDRS);
 

  WiFi.softAP(ssid, pass);           // SSIDとパスの設定
  delay(100);                        // 追記:このdelayを入れないと失敗する場合がある
  WiFi.softAPConfig(ip, ip, subnet); // IPアドレス、ゲートウェイ、サブネットマスクの設定
  
  IPAddress myIP = WiFi.softAPIP();  // WiFi.softAPIP()でWiFi起動

  server.on("/", handleRoot); 
  server.on("/GetUp", handleGetUp);
  
  server.on("/KpP", KpP);
  server.on("/KpM", KpM);
  server.on("/KdP", KdP);
  server.on("/KdM", KdM);
  server.on("/KwP", KwP);
  server.on("/KwM", KwM);
  
  server.on("/rotMaxLm", handleRotMaxLm);
  server.on("/rotMaxLp", handleRotMaxLp);
  server.on("/rotMaxRm", handleRotMaxRm);
  server.on("/rotMaxRp", handleRotMaxRp);

  server.on("/IDRSp", IDRSp);
  server.on("/IDRSm", IDRSm);
  
  server.begin();

  //回転位置検出 タスク
  xTaskCreatePinnedToCore(
    display
    ,  "display"   // A name just for humans
    ,  4096  // This stack size can be checked & adjusted by reading the Stack Highwater
    ,  NULL
    ,  1  // Priority, with 3 (configMAX_PRIORITIES - 1) being the highest, and 0 being the lowest.
    ,  NULL 
    ,  0);
}


void loop() {
  server.handleClient();
  
  //オフセット再計算&起き上がり
  if (digitalRead(button) == 0){
    getup();
  }
  
  nowTime = micros();
  loopTime = nowTime - oldTime;
  oldTime = nowTime;
  
  dt = (float)loopTime / 1000000.0; //sec
  
  //モータの角速度算出
  float theta_dotWheel = -1.0 * float(enc_count) * 3.6 / dt;
  enc_count = 0;
  
  //カルマンフィルタ 姿勢 傾き
  kalAngleY = kalmanY.getAngle(get_theta_acc(), get_gyro_data(), dt);
  
  //カルマンフィルタ 姿勢 角速度
  kalAngleDotY = kalmanY.getRate();


  if(GetUP == 1 || GetUP == 2){
    if(GetUP == 1 && kalAngleY >= getupRange){
      digitalWrite(brake, LOW);
      GetUP = 99;
    }else if(GetUP == 2 && kalAngleY <= -getupRange){
      digitalWrite(brake, LOW);
      GetUP = 99;
    }else{
      if(GetUP == 1 && kalAngleY < 0 || GetUP == 2 && kalAngleY > 0){
        ledcWrite(0, max(1023 - int(injectRatio * fabs(kalAngleY)), 0));
      }else {
        ledcWrite(0,511);
      }
    }
  }else {
    if (fabs(kalAngleY) < 1 && GetUP == 0){
      GetUP = 80;
    }

    /*
    Serial.print("Kp: ");
    Serial.print(Kp);
    Serial.print(", Kd: ");
    Serial.print(Kd,3);
    Serial.print(", Kw: ");
    Serial.print(Kw, 3);
    Serial.print(", kalAngleY: ");
    Serial.print(kalAngleY);
    */
      
    
    if(GetUP == 99 || GetUP == 80){
      //ブレーキ
      if(fabs(kalAngleY) > 15.0){
        digitalWrite(brake, LOW);
        Aj = 0.0;
        GetUP = 0;
      }else{
        digitalWrite(brake, HIGH);
      }
        
      //モータ回転
      if(GetUP == 80){
        M = Kp * kalAngleY / 90.0 + Kd * kalAngleDotY / 500.0 + Kw * theta_dotWheel / 20000.0;
        GetUpCnt++;
        if(GetUpCnt > 100){
          GetUpCnt = 0;
          GetUP = 99;
        }
      }else{
        Aj +=  IDRS * theta_dotWheel / 1000000.0;
        M = Kp * (kalAngleY + Aj) / 90.0 + Kd * kalAngleDotY / 500.0 + Kw * theta_dotWheel / 10000.0;
      }
      M = max(-1.0f, min(1.0f, M));
      pwmDuty = 1023 * (1.0 - fabs(M));
      
        
      //回転方向
      if(M > 0.0){
        digitalWrite(rote_pin, LOW);
        ledcWrite(0, pwmDuty);
      }else{
        digitalWrite(rote_pin, HIGH);
        ledcWrite(0, pwmDuty);
      }
    }
      
    
    Serial.print(", loopTime: ");
    Serial.print((float)loopTime / 1000.0);
    
    
    delay(delayTime);
      
    Serial.println("");
  }
}

//ブラシレスモータエンコーダ出力 割り込み処理
//参考:https://jumbleat.com/2016/12/17/encoder_1/
void ENC_READ() {
  byte cur = (!digitalRead(ENC_B) << 1) + !digitalRead(ENC_A);
  byte old = pos & B00000011;
  byte dir = (pos & B00110000) >> 4;
 
  if (cur == 3) cur = 2;
  else if (cur == 2) cur = 3;
 
  if (cur != old)
  {
    if (dir == 0)
    {
      if (cur == 1 || cur == 3) dir = cur;
    } else {
      if (cur == 0)
      {
        if (dir == 1 && old == 3) enc_count--;
        else if (dir == 3 && old == 1) enc_count++;
        dir = 0;
      }
    }
 
    bool rote = 0;
    if (cur == 3 && old == 0) rote = 0;
    else if (cur == 0 && old == 3) rote = 1;
    else if (cur > old) rote = 1;
 
    pos = (dir << 4) + (old << 2) + cur;
  }
}

 

ESP32-S3対応のためにGPIO番号を修正しています。
MPU6886.cppのI2Cピン番号も変更が必要です。 [ Wire1.begin(38,39,100000); ]

カルマンフィルタで誤差算出をするので、事前のIMUのオフセットの導出は必要ないことに気づいたので廃止しました。

ディスプレイはデュアルコアにしてcore0で表示させています。

 

モジュールの各変数はAPモードでESP32-S3とつなげて、ブラウザから調整できるようにしています。
調整した値は電源OFF後もフラッシュで記憶されます。
起き上がり動作ボタンも実装しています。

コードでは “SHISEIGYO-1 Jr.” にWiFi接続して (パスワード:”password”)、192.168.22.10にブラウザアクセスで設定画面が表示されます。

 

おわりに

ATOMS3を用いて姿勢制御モジュールの製作を楽しみました。
小型ですがきれいなディスプレイもついて しかも低価格なのでATOMS3は非常におすすめの製品です。

まだライブラリが整ていないようで、ツギハギのコードになってしまいましたが動けばこっちのもんです。

しかしこれまでのSHISEIGYO-1 もATOM Matrixのライブラリが成熟する前に製作したので、今度どこかのタイミングで最新ライブラリでコードをきれいにまとめたいなぁなんて思っています。

次の記事

SHISEIGYO-1 DC 完成!  ーリアクションホイールへの道47ー

DCモータで点倒立 SHISEIGYO-2 DC  ーリアクションホイールへの道52ー

以前、ミニ四駆のDCモータを用いて1軸の姿勢制御モジュール SHISEIGYO-1 DC を製作いたしました。

SHISEIGYO-1 DC の製作レシピ

 

ここではミニ四駆 DCモータを用いての2軸 姿勢制御モジュールを製作し点倒立を目指しました。

 

 

構成

構成は単純にSHISEIGYO-1 DC のモータ駆動部を2倍にしただけです。
ホイールが倍になり制御ピンが増えたのでコントローラにはM5Stack Core2 を採用しました。

モータドライバDRV8835はモータを2個駆動できますが駆動能力向上のためにモータ1個に対してドライバ出力をパラにして使用しています。

モータの回転は磁気エンコーダで検出します。

部品

  • コントローラ M5Stack core2
    [amazonjs asin=”B09MT5T6XR” locale=”JP” title=”M5Stack Core2 IoT開発キット”]
  • モータドライバ DRV8835
    [bc url=”https://akizukidenshi.com/catalog/g/gK-09848/”]
  • ダブルシャフトDCモータ
    [bc url=”https://store.shopping.yahoo.co.jp/omokimu-hobby/17400078.html”]
  • 磁気エンコーダ
    [bd url=”https://www.pololu.com/product/3499/resources”]

筐体ベース組立て

筐体は3Dプリンタで製作しました。

 

M5Stack core2 はM5Stack Japan Creativity Contest 2021 の景品の金ぴかのモノを使用します。実にゴージャスです。

制御コードは以前ブラシレスモータで製作したSHISEIGYO-2のものをベ-スにDCモータ用にカスタマイズしました。

 

モータとエンコーダを3Dプリントした筐体に固定

 

電気結線

モータドライバやエンコーダをブレッドボードを使用しつつマイコンに接続してピン配を検討します。

 

使用ピン決定後にはんだ付け。
結線にはM5Stack用BUSモジュールを用いました。

 

[amazonjs asin=”B084X83WXQ” locale=”JP” title=”M5Stack用BUSモジュール”]

 

 

倒立動作確認

いよいよ倒立動作を目指します。

倒立時のモータの制御パラメータは以前のSHISEIGYO-2の時と同様にCore2のタッチパネルで調整します。

辺倒立

以下のような三角柱の治具を3Dプリントして、まずは辺倒立動作を確認します。

 

X軸 OK

 

Y軸 OK

点倒立

各軸での辺倒立が確認できましたので、三角柱を点倒立用の棒に変えて倒立動作を目指します。

 

だいぶ いい感じに

 

点倒立達成!!


比較的大きなCore2を載せてDCモータで2軸での点倒立の実現には若干の不安がありましたが無地に達成することができました。

 

次の記事

ATOMS3 で姿勢制御モジュール  ーリアクションホイールへの道53ー

姿勢制御装置とバーサライタの融合2 ーリアクションホイールへの道51ー

前回は 1軸 姿勢制御モジュール SHISEIGYO-1のホイールにLEDをつけてバーサライタ動作させてみました。

姿勢制御装置とバーサライタの融合 ーリアクションホイールへの道50ー

 

姿勢制御モジュールのホイールはバランス状況によって正転・逆転及び回転スピードが変わるので、安定した画の表示は出来ませんでした。

 

スリップリング

前回はホイールにLEDと制御用のマイコン(Adafruit Trinket M0)と回転検出用フォトリフレクタを載せてワイヤレスチャージモジュールで無線電源給電しました。

ここでは画の表示にホイールを駆動するブラシレスモータのエンコーダ出力を使用したいと考えました。
エンコーダによる回転検出値でLEDの点灯パターンを制御すればホイールの正転・逆転及び回転スピードが変わっても表示する画に影響はありません。
しかし問題はどのようにエンコーダ出力値をLED制御に反映させるかです。

そこで遂にスリップリングに手を出してしまいました。

[bc url=”https://ja.aliexpress.com/item/4000338803341.html”]

 

スリップリングは回転部に電源線や信号線を接続できるコネクタです。

 

ここでは4線のスリップリングを用いて回転部のSPI入力LEDと接続します。

 

SHISEIGYO-1 POV 構築

購入したスリップリングをSHISEIGYO-1のモータに通したかったのですが、シャフトが短く埋もれてしまいました。。

 

マウントハブと平行ピンでシャフトを延長してスリップリングとフライホイールを固定しました。

 

凄く仰々しくなってしまいました。。

完成

スリップリングの回転部用の配線に11セルのLEDを接続し、他方の配線をSHISEIGYO-1のコントローラであるATOM Matrixに接続します。

 

ATOM Matrix (デュアルコア) で姿勢制御しつつモータエンコーダ出力(1周100分解能)に基づいてSPI LEDを制御します。

 

動作

まずはホイール1周を4分割して4色で発光
エンコーダで回転位置を検出してホイール速度や正転・逆転に依存しない表示を確認。

倒立動作も問題なく出来ています。

 

アニメーション表示

LEDのセル数が少なく回転速度も一定ではなくそれほど早くないので、きれいな表示は出来ていませんがスリップリングの使用によってかつてない表現が実現できました。

 

おわりに

ここでは初めてのスリップリング体験を堪能し、姿勢制御モジュールとPOVの融合による新たな表現を検証いたしました。

今後はスリップリングを用いたガチPOVの製作も検討したいなと考えております。

それではまた。

次の記事

DCモータで点倒立 SHISEIGYO-2 DC  ーリアクションホイールへの道52ー

姿勢制御装置とバーサライタの融合 ーリアクションホイールへの道50ー

姿勢制御モジュールのホイールにLEDを付けてバーサライタにしてみてはどうだろう。

思いついてしまったので どうなるかは考えずに作り上げることだけを考えて手を動かした。
ちょうど祝日 天皇誕生日。俺なりの祝いの儀式だ。

 

 

とにかく作る

1軸 姿勢制御モジュール SHISEIGYO-1のホイールにLEDをつけてバーサライタ動作させます。

回転部への給電はハンディバーサライタ PovRanianの機構をそのまま利用してワイヤレスチャージモジュールを使用します。

 

ワイヤレスチャージモジュール送信側をSHISEIGYO-1の筐体に固定。
電源は5V DCDC出力に接続しました。

 

ホイールにLEDやワイヤレスチャージモジュールの受信部を固定する治具を3Dプリントいたしました。

マイコンはAdafruit Trinket M0 を使用しました。

[amazonjs asin=”B07MLWKK6V” locale=”JP” title=”Trinket M0″]

 

SPI入力のLEDを11セル前面に固定。
更にホイールに固定後に回転を検出するフォトリフレクタセンサも固定します。

[amazonjs asin=”B07VGH4XSQ” locale=”JP” title=”APA102 5050 SMD高輝度チップLEDピクセルフレキシブルストリップライトDC 5V (白 PCB, 1M 144leds IP20)”]

 

ホイールを固定して完成!

筐体に貼ったマスキングテープの白マーカをフォトリフレクタで検出します。

 

動作

 

プログラム的にはフォトリフレクタセンサで回転時間を検出して、1周の時間を4分割してLEDを赤、緑、青、黄で光らせます。

姿勢制御モジュールの場合は回転速度常時変化するのでマーカ1個で回転検出するPovRanian形式だときれいな絵を出すのが難しいです。

ブラシレスモータのエンコーダ出力を利用できれば回転速度や正転・逆転に関係なく絵が出せそうですが無線では厳しいと思います。

いつかスリップリングを使用した有線でのバーサライタ動作も試してみたいです。

次の記事

姿勢制御装置とバーサライタの融合2 ーリアクションホイールへの道51ー

姿勢制御モジュール 4重倒立挑戦3 ーリアクションホイールへの道49ー

久々に姿勢制御モジュールの4段倒立に挑戦しました。

DCモータで姿勢制御 SHISEIGYO-1 DC 爆誕  ーリアクションホイールへの道43ー

 

前回の倒立時間は31秒でした。今回はそれ以上を目指します。

 

 

前回の課題

前回の時点で3段倒立までは非常に安定しておりましたが、3段目に載せているSHISEGYO-1 Jr.のホイールのトルクが足りないかなと感じていました。

このトルク増加によって4段目のSHISEIGYO-1 DCの積載の影響が減り安定するのではと予想しました。

 

調整

前回の課題なども考慮しつつ諸々調整しました。

SHISEIGYO-1 DC 底面調整

SHISEIGYO-1 DCの底を滑りにくくするためにTPUフィラメント製にしました。
大変滑りにくくなりました。

SHISEIGYO-1 Jr.  ホイールトルク調整

前回からの課題であったSHISEGYO-1 Jr.のホイールのトルク不足を解消するために、ナットを増やしました。

この変更によってホイール質量は28g から 50g になりました。

安定性が増して3重で25分以上の倒立が実現できました。

SHISEIGYO-1 the END 重量調整

一番下の姿勢制御モジュール SHISEIGYO-1 the ENDの重量を増して安定化をはかりました。

1軸なので使用しないのですが、ホイールを2個追加でして増量しました。

 

記録会

上記調整を施して記録会実施しました。

47秒の4重倒立を達成しました!

 

再調整

記録会からまたまた気になる点が出てきたので再調整します。

記録会では倒立崩壊時に下から2番目のSHISEIGYO-1の制御が乱れた印象を受けました。
恐らくSHISEGYO-1 Jr.のトルク向上のためにホイール重量を増したことが影響したのだと思います。

SHISEIGYO-1 Jr.  ホイールトルク再調整

SHISEGYO-1 Jr.のホイール重量を増やし過ぎたため少し減らします。

3重だったナットを2重にしました。

この変更によってホイール質量は50g から 43g になりました。

SHISEIGYO-1 DC  ホイールトルク再調整

下から2番目のSHISEIGYO-1の負担をさらに減らすために1番上のSHISEIGYO-1 DCのホイールのネジを減らしました。

この変更によってホイール質量は22g から 15g になりました。

 

これでもSHISEIGYO-1 DC自身は問題なく倒立できることを確認しました。

 

再記録会

1分15秒の4重倒立を達成できました!!

バランスを持ち直す動作がかなりの頻度で出来ているので、もっと良い記録も目指せそうです。

置き方の鍛錬も進めたいと思います。

 

おわりに

今回の調整によって30秒以上の4重倒立は高い確率で実現できるようになりました。

置き方など研究して更なる高みを目指したいと思います!

次の記事

姿勢制御装置とバーサライタの融合 ーリアクションホイールへの道50ー

姿勢制御モジュール 4重倒立挑戦2 ーリアクションホイールへの道48ー

HomeMadeGarbage Advent Calendar 2021 |15日目

前回 挑戦した姿勢制御モジュールの4段倒立。
このたび再挑戦しましたので報告します。

DCモータで姿勢制御 SHISEIGYO-1 DC 爆誕  ーリアクションホイールへの道43ー

 

 

4逓倍

4段倒立は以下の順番で積み上げます。

SHISEIGYO-1 the END、SHISEIGYO-1、SHISEIGYO-1 Jr.はモータの回転を、使用しているブラシレスモータのエンコーダ出力 1周100パルスをカウントして検出しております。

SHISEIGYO-1 DC の製作でエンコーダ出力を4逓倍する技術を身に着けましたので
上記3機種の回転検出を4逓倍して1周 400カウントで検出できるように改良しました。

 

SHISEIGYO-1 DC は1周 5パルスの磁気エンコーダを4逓倍して1周 20カウントで制御しています。

DCモータで姿勢制御 SHISEIGYO-1 DC 爆誕  ーリアクションホイールへの道43ー

 

4逓倍によって制御のきめが細かくなった気がいたします。

 

4段倒立再挑戦

 

4段倒立 最高記録は31秒でした。

 

テクノロジーと自身との戦い

課題

本挑戦により安定倒立を目指して更なる課題が見つかりました。

 

3段目に載せているSHISEGYO-1 Jr.のホイールのネジを増やしてトルク上げてみたいと思います。
現状で3段倒立までは非常に安定しておりますので、このトルク増加によって4段目のSHISEIGYO-1 DCの積載の影響が減り安定するのではと予想します。

また載せ方の鍛錬も重ねて次回の挑戦に臨みたいと考えております。

次の記事

姿勢制御装置とバーサライタの融合 ーリアクションホイールへの道50ー

一脚 屈伸ロボ 爆誕

HomeMadeGarbage Advent Calendar 2021 |10日目

SHISEIGYO-2 Go 弐を応用して1脚ロボットを製作いたしましたので報告します。

SHISEIGYO-2 Go 爆誕 ーリアクションホイールへの道39ー

サーボテスト

手元にトルクの大きいサーボがありましたのでロボット足に使用できるのではとテスト

[amazonjs asin=”B07GNYZR3T” locale=”JP” title=”Goolsky サーボ DSSERVO DS3225 25KG メタルギア 高トルク 防水 デジタルサーボ RC Traxxas HSP カー ボート ヘリコプター ロボット 飛行機 用”]

 

アルミのアームも付いて力強くていい感じだったのでもう1個買って検証

 

なんだかいい感じ♪
このサーボで足を構築することにいたしました。
 

足構築

3Dプリンタでひざ下部 (素材: PLAフィラメント) を作製し、足先は滑り防止を兼ねてTPUフィラメントで構成しました。

いい感じの屈伸運動です。
 

一脚ロボ 検証

SHISEIGYO-2 のリアクションホイールを合体させました。
ホイールはそれぞれ2枚重ねにしてトルクを増強しています。

屈伸動作検証

リアクションホイールによる姿勢制御のゲイン調整を施して比較的安定した屈伸運動が実現できました。

 

足を延ばしすぎたり、急な高さ変動にはまだ追従できていません。

 

起き上がり機能追加

リアクションホイールの回転制御による自立も実現できました。

 

完成

リアクションホイールと足は別マイコンで検証していましたが、
M5Stack CORE2ひとつでの制御にまとめました。

 

 

構成はSHISEIGYO-2 Go 弐 とほぼ同様で球体駆動用360度連続回転サーボが足用サーボになっただけです。

[amazonjs asin=”B08J7YPH66″ locale=”JP” title=”M5Stack 開発ボード M5Stack Core2 開発キットデュアルコア32ビット240Mhz LX6プロセッサーUIFlow, MicroPython, A r d u i n o用”]

 

おまけ

開発途中で一脚ロボをAgility Roboticsのロボットと比較してみました 😆 

 

タムラトウサクさん

HomeMadeGarbage Advent Calendar 2021 |9日目

 

 
エンジニアや研究者は使用技術や着想の引用元を明確にするべきである
という教育を受けた

教育はされたが守るとは言っていない

やりたいからやった
むしゃくしゃしてやった

 

 

 

 

[amazonjs asin=”B001VZJDZ6″ locale=”JP” title=”タミヤ 楽しい工作シリーズ No.145 ナロータイヤセット 58mm径 (70145)”]

 

特殊球体ホイール バランスロボット SHISEIGYO-2 Go 弐

HomeMadeGarbage Advent Calendar 2021 |7日目

以前製作した球体ホイールによるバランスロボットを改良いたしましたので報告いたします。

SHISEIGYO-2 Go 球体ホイールを検討 ーリアクションホイールへの道41ー

 

SHISEIGYO-2 Go 弐

以前作った SHISEIGYO-2 Goをバッテリ駆動にして電源ラインを排除し、より自由に移動できるようにいたしました。

3セルのリポバッテリ(11.1V)を24Vに昇圧してモータに給電します。

  • 24V昇圧DCDCコンバータ
    [bc url=”https://store.shopping.yahoo.co.jp/suzakulab/pololu-2582.html#”]
  • 3セル LiPoバッテリ
    [amazonjs asin=”B017VOKXRC” locale=”JP” title=”Kypom K6 11.1V 450mAh 35C70C リポ バッテリー”]

 

また球体ホイールの左右間に細いスリットを設けて右折左折がよりスムーズに実行できる工夫も施しました。

 

360度連続回転サーボで半球をそれぞれ独立で制御して移動します。

  • 360度連続回転 Feetech FS90R マイクロサーボ
    [amazonjs asin=”B076F5VWG7″ locale=”JP” title=”360度連続回転 Feetech FS90R マイクロサーボ 6V 9G 5個入り”]

 

動作

 

バッテリ内蔵によって縦横無尽に移動が可能になりました。
左右への旋回もスムーズです。

 

 

M5Stack Japan Creativity Contest 2021

SHISEIGYO-2 Go 弐を M5Stack Japan Creativity Contest 2021 に応募しましたところ 3位入賞することができました!

[bc url=”https://protopedia.net/prototype/2418″]

 

M5Stack社のジミー・ライ社長が受賞作品を選定しコメントをくれて、しかも参加賞までいただける素晴らしいコンテストなので是非来年も実施してほしいです (ジミー社長 非常にお忙しいでしょうが。。)。

 

 

追記

2022/1/15 3位入賞 賞品が届きました!

特別色でキンピカでラグジュアリーなM5Stack CORE2をいただきました。
キレイ!嬉しい!

SHISEIGYO-1 DC 完成!  ーリアクションホイールへの道47ー

HomeMadeGarbage Advent Calendar 2021 |1日目

手頃に姿勢制御装置を楽しみたいということで入手が容易な部品での製作を目指してミニ四駆モータを用いた SHISEIGYO-1 DC の開発を進めております。

前回はモータドライバの発熱によって長時間動作ができないことを報告いたしました。

SHISEIGYO-1 DC の改善検討  ーリアクションホイールへの道44ー

ここでは発熱の改善を目指して色々検証しましたので報告いたします。
最後にお知らせもございますので何卒宜しくお願い致します。

 

 

モータドライバ変更

これまではモータドライバにDRV8835を使用してきました。
ここではDRV8835より出力トランジスタのオン抵抗の小さい TC78H653 を試してみました。

DRV8835がRon 305mΩに対してTC78H653 は220mΩということで発熱が抑えられるのではないかという算段です。

空中配線などで無理やり基板にTC78H653 を実装いたしました。
DRV8835 -> TC78H653 

 

TC78H653実装完了!

動作

早速動かしてみたのですが。。

回転する瞬間に止まる。。。 スタンバイピンをLowで復帰するので過電流保護が利いてるようです。。

程よいスピードで動かす分には動くのですが。。。

モータ変更や配線のケアで救える可能性なくもないですが、一旦過電流保護が作動するとラッチしてしまい非常に使いにくいのでTC78H653は不採用!!

 

基板修正

当初の基板ではモータドライバを裏面に実装しており、モータドライバが基板とモータの間に配置されます。
放熱性が良くないと思いモータドライバを上面に配置するように基板を修正しました。

 

結果としてはさほど大きな改善はありませんでした。。
ヒートシンクもつけてみましたがこれまためちゃくちゃな改善はありませんでした。

[amazonjs asin=”B0832JT1ML” locale=”JP” title=”waves 8個 アルミ ヒートシンク 10x10x10mm 3M 8810 熱伝導テープ付き”]

 

モータ変更

モータがグレードアップパーツを使用しているためハイパワーで電流が多いのではと思い、

[amazonjs asin=”B07YMVLNN1″ locale=”JP” title=”タミヤ ミニ四駆 グレードアップパーツ No.487 トルクチューン2モーターPRO 15487″]

 

ノーマルダブルシャフトモータを試してみました。

[bc url=”https://store.shopping.yahoo.co.jp/omokimu-hobby/17400078.html”]

 

なんと電流が半分以下に減って 姿勢制御もゲイン調整で問題なくできてしまいました。

初めからノーマルでやっとけばよかったかな。。 
ミニ四駆のモータってこんなにもモノによって性能違うんですね。勉強になりました。

ノーマルダブルシャフトモータの使用によって発熱問題はあっさり解決いたしました 🙄 。

乾電池駆動

ノーマルダブルシャフトモータによって消費電流も減りミニ四駆のように乾電池駆動も確認できました。

 

レシピ販売

ミニ四駆モータで気軽に楽しめる姿勢制御モジュールが完成しましたので、製作レシピの販売を開始いたしました。
乾電池でも駆動可能ですので非常にフランクに姿勢制御できます。

SHISEIGYO-1 DC の製作レシピ

サンプルコードや筐体3Dモデルは上記リンクより無料でダウンロード可能です。
是非ご確認ください。

 

専用基板も以下で販売中です。

SHISEIGYO-1 DC 専用基板

 

3Dプリント済みの筐体組み立てキットも以下で販売中です。

SHISEIGYO-1 DC 筐体組み立てキット

次の記事

姿勢制御装置とバーサライタの融合 ーリアクションホイールへの道50ー

SHISEIGYO-1 DC の現状と今後  ーリアクションホイールへの道46ー

DCモータを用いたSHISEIGYO-1 DC につきまして色々試しましたので報告いたします。

[amazonjs asin=”B07YMVLNN1″ locale=”JP” title=”タミヤ ミニ四駆 グレードアップパーツ No.487 トルクチューン2モーターPRO 15487″]

 

前回の報告は以下

SHISEIGYO-1 DC の改善検討  ーリアクションホイールへの道44ー

 

 

筐体修正

前回のテストで物理ブレーキなしでの起き上がり倒立は難しいことがわかりましたので、支点のRを20mmから10mmに変更しました。

 
 
いい感じの倒立具合です。

 

基板試作

基板を試作してみました。空中配線が減ってスッキリしました。

 

長時間動作検証

SHISEIGYO-1 DC を長時間動かすと、急にコントローラが停止して
その後もモータ駆動の瞬間にコントローラが停止する現象が起きます。

しばらく休むと正常に動作します。

 

モータドライバDRV8835のサーマルシャットダウン(TSD)が利いてるのではないかというアドバイスをいただきました。

 

シャットダウン時にコントローラも落ちる理由が不明ですが、モータドライバのTSDが要因で間違いなさそうです。

シャットダウン時のHブリッジの各素子のステータスがどうなるのか記載ないので何とも言えませんがタイミング悪く両サイドONして瞬間的に電流が流れてコントローラも落ちるのかもしれません。

DRV8835は制御基板とモータの間に配置してしまったので排熱は難しいですね。。
ちょっとモータドライバの選定からやり直します。

 

おわりに

だいぶSHISEIGYO-1 DCのことがわかってきました。
残念ながら現状長時間動作ができない状況ですが更に検討・改善を進めていきたいと思います。

次の記事

SHISEIGYO-1 DC 完成!  ーリアクションホイールへの道47ー