ブラシレスモータと格闘 ーリアクションホイールへの道1ー
前々からリアクションホイールによる姿勢制御に興味があり、2020年6月号のトラ技からJAXAの3軸姿勢制御モジュールの連載も開始され自作してみたい欲が爆発中でございました。
http://www.kenkai.jaxa.jp/research/innovation/triaxial.html
↑凄いですよねコレ。10cm立方らしいです。
目次
この道の目的
JAXAのような小型の3軸姿勢制御モジュールは到底無理ですので
1軸の姿勢制御モジュール(倒立振子)の実現を目指します。
将来的には以前製作したスマート靴占い装置に実装したいと考えております。
靴を空中に投げた際にその地点の明日の天候データを受信し、リアクションホイールで靴の着地姿勢を制御したいのです。
AliExpress
Twitterで姿勢制御キューブがAliExpressで売ってることを教えていただきました。
コレに動画ありますね.値段もピンきりでありますから,高いのとの差が知りたいですね.https://t.co/7GkH24hQvE
— yakatano (@Yakatano) June 13, 2020
1軸制御が23,455 円
3軸制御が43,912 円
とのことで恐らく破格の安さなのでしょうが、それでも私には買えない価格です。
あと自作したいので完成品には興味持てないということもございます。
もうすこしAliExpressをまさぐると以下のモータとフライホイールだけの商品を見つけました。自作派の私にピッタリの商品ではないでしょうか。
タイプ 3: フライホイールの直径: 80 ミリメートル、dcブラシレス光学エンコーダ (ロングタイプ)
を購入いたしました 。
ブラシレスモータ ID-549XW
AliExpressで6/13に購入し7/21に商品が到着しました。
なんか写真と違うモータがきた。
回せるか不安#リアクションホイールへの道#Aliexpress pic.twitter.com/eECIAIgReT— HomeMadeGarbage (@H0meMadeGarbage) July 29, 2020
モータの型番にはID-549XWとありましたが情報がほとんどなく
これまたAliExpressでID-549XWの販売ページを見つけ、そのページの以下の画像のみが頼りになりそうな情報でした。
読めない箇所もありますが。。実機で試行錯誤しながら動かしてみました。
エンコーダ動作
上の写真でA相、B相は光学エンコーダの出力で左から3番目の青線がロジック電圧だと予想できましたのでADALM2000で観測してみました。
配線の状態は以下の通りです。
左から1番目 (信号A相):オシロ 1 Ch
左から2番目(信号B相):オシロ 2 Ch
左から3番目(ロジック電源):5V印可
左から7番目:GND
A相 B相はこういう事だよね
ロジック電源も分かった。モータ電源も赤黒で確定だと思うが
回し方わからん pic.twitter.com/l701K954uU— HomeMadeGarbage (@H0meMadeGarbage) July 29, 2020
モータの軸を回すとA相、B相からパルスが出力され、回転方向によって位相が変わることを確認できました。
上記情報によると1周で100パルス出力します。
回転動作
回転のさせ方がよくわからなかったのですが、モータ電源に6V以上印可しPWM信号印可でやっと回転を確認しました。
PWM入力でスピード制御
0V(Duty 0%)で高速、5V(Duty 100%)で低速というか停止残りの線はブレーキと回転方向制御線でした。 pic.twitter.com/DAIJCquRk9
— HomeMadeGarbage (@H0meMadeGarbage) July 29, 2020
配線の状態は以下の通りです。
左から1番目 (信号A相):オシロ 1 Ch
左から2番目(信号B相):オシロ 2 Ch
左から3番目(ロジック電源):5V印可
左から4番目(回転制御):オープンで時計回り、プルダウンで反時計回り
左から5番目(PWM入力):20kHz、ON Duty 0%で最高速度、100%で停止
左から6番目(ブレーキ):プルダウンで回転停止
左から7番目:GND
左から8番目(モータ電源):12V印可
ID-549XW配線
以上より、モータの配線内容を理解することができました。
M5ATOMでエンコーダ動作制御
モータの素性を把握できましたので、リアクションホイールへの道の第一歩としてM5Stack ATOM Matrixでエンコーダ出力を観測し、モータの回転数をカウントしてみました。
モータとATOM Matrixの配線は以下の通りです。
左から1番目 (信号A相):G22
左から2番目(信号B相):G19
左から3番目(ロジック電源):3.3V
左から7番目:GND
動作
モータの軸を回転させATOM MatrixのLEDに回転数を表示させています。
Arduinoコード
ロータリーエンコーダのA相、B相端子をそれぞれ ATOM Matrixnのピンに接続して出力変化で割り込んで回転数を検出します。
以下の記事で紹介されたコードを使用して回転位置を観測しています。
M5Stack ATOM MatrixのLEDに回転カウント数を表示するためにFastLED_NeoMatrixライブラリを使用しました。
FastLED NeoMatrixライブラリを使用するためには Adafruit-GFX なども必要となります。
Arduino IDEのライブラリマネージャでFastLED NeoMatrixをインストールすれば必要なライブラリも同時にインストールされます。現在(2020/7/30) FastLED NeoMatrixライブラリのバージョンは1.1.0です。
また表示用のフォントとして Adafruit-GFXライブラリのOrg_01フォント を使用しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
#include <FastLED.h> #include <FastLED_NeoMatrix.h> #include <Fonts/Org_01.h> const int stepsPerRotate = 100; int rot = 0, rotOld = -1; #define ENC_A 22 #define ENC_B 19 volatile byte pos; volatile int enc_count = 0; #define PIN 27 #define mw 5 #define mh 5 #define NUMMATRIX (mw*mh) #define Bright 20 CRGB matrixleds[NUMMATRIX]; FastLED_NeoMatrix *matrix = new FastLED_NeoMatrix(matrixleds, mw, mh, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE ); int ledR = 255; int ledG = 0; int ledB = 0; String text[10] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; void setup() { Serial.begin(115200); pinMode(ENC_A, INPUT); pinMode(ENC_B, INPUT); attachInterrupt(ENC_A, ENC_READ, CHANGE); attachInterrupt(ENC_B, ENC_READ, CHANGE); matrix->setFont(&Org_01); FastLED.addLeds<NEOPIXEL,PIN>(matrixleds, NUMMATRIX); matrix->begin(); matrix->setTextWrap(false); matrix->setBrightness(Bright); matrix->setTextColor(matrix->Color(ledR, ledG, ledB)); } void loop() { rot = enc_count / stepsPerRotate; if(rot != rotOld && rot >= 0 && rot < 10){ Serial.println(rot); rotOld = rot; matrix->fillScreen(0); matrix->setCursor(0, 4); matrix->print(text[rot]); matrix->show(); } } 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; } } |
おわりに
フライホイール付きのブラシレスモータを入手しましたので、
これで1軸の姿勢制御モジュールの実現を目指したいと思います。
ひとまず次回は現状私が保有している知識のみで実現できるか試してみます。
慣性センサで角度を導出し、PID制御でモータを回転させて倒立するか試してみます。
それでは、また次の道でお会いしましょう。
素晴らしき記事に感心しました。俺も倒立振子に興味深いです。この前の「倒立振子への道」でとても勉強になりました。つい最近、俺もリアクションホイールによる倒立振子を色々試している最中なんです。今回の「リアクションホイールへの道」はかなり詳しいようですので、読むのがとても楽しみにしています。
ありがとうございます!
倒立振子の完成を楽しみにいております!