Ene-1GP

セグウェイドリフトを買った話

 流行に後れること数か月、セグウェイドリフトを買いました。
 自分は特にどこから買うとかいうこだわりはないので、適当に↓のアマゾンチョイスのやつを買いました。きちんと届きさえすればどこで買っても同じ商品なはずです。

 
 ↓のグラフはここで売っているセグウェイドリフトの価格推移なのですが、去年の5月ぐらいから値段が下がってきており、今(2021/1)では1万円ちょっとで買うことができます。スクリーンショット 2021-01-21 144445

 一応乗り方が説明書に書いてますが、”傾いている方向に進む”ぐらいしか有益な情報はないので、習うより慣れろ状態です。一応コツとしては、乗っている人はバランスを取らずにセグウェイに任せ、行きたい方向に倒れるくらいです。
 私含め家族にも乗ってもらったのですが、みんな30分くらい練習すれば↓の動画くらいは乗れるようになりました。


 この動画撮っているスペースが200cm*50cmくらいしかなかったのですが、まあなれればこのくらいのスペースで乗れます。片足立ちとかスクワットとかもできるので、極めれば二人でガンダムシリーズのドムごっこができると思います。

三相モーターをArduinoと自作VVVFで回した話

2021年になったので景気づけに三相モーターを回してみました。

 使った回路はこのときと同じで、↓のとおりとなります。
VVVFhbd_回路図
 使ったプログラムは最後に書いておきます。

 こんな感じで回してました。
 YouTubeにも上げました。


 そんなこんなで2021年もよろしくお願いします。

 以下コード(これもリンク先の記事と同じはずです。)
  1. const int IN_U = 3;
  2. const int SD_U = 2;
  3. const int IN_V = 5;
  4. const int SD_V = 4;
  5. const int IN_W = 9;
  6. const int SD_W = 8;

  7. int delayTime;

  8. void setup() {
  9.   pinMode(IN_U, OUTPUT);
  10.   pinMode(IN_V, OUTPUT);
  11.   pinMode(IN_W, OUTPUT);
  12.   pinMode(SD_U, OUTPUT);
  13.   pinMode(SD_V, OUTPUT);
  14.   pinMode(SD_W, OUTPUT);

  15.   analogWrite(IN_U, 0);
  16.   analogWrite(IN_V, 0);
  17.   analogWrite(IN_W, 0);
  18.   digitalWrite(SD_U, HIGH);
  19.   digitalWrite(SD_V, HIGH);
  20.   digitalWrite(SD_W, HIGH);
  21. }
  22. void loop() {
  23.   if (millis() < 8000) {
  24.     delayTime = 5 - millis() / 2000;
  25.   }

  26.   analogWrite(IN_U, 250);
  27.   analogWrite(IN_V, 0);
  28.   analogWrite(IN_W, 0);
  29.   digitalWrite(SD_U, HIGH);
  30.   digitalWrite(SD_V, LOW);
  31.   digitalWrite(SD_W, HIGH);
  32.   delay(delayTime);

  33.   analogWrite(IN_U, 250);
  34.   analogWrite(IN_V, 0);
  35.   analogWrite(IN_W, 0);
  36.   digitalWrite(SD_U, HIGH);
  37.   digitalWrite(SD_V, HIGH);
  38.   digitalWrite(SD_W, LOW);
  39.   delay(delayTime);

  40.   analogWrite(IN_U, 0);
  41.   analogWrite(IN_V, 0);
  42.   analogWrite(IN_W, 250);
  43.   digitalWrite(SD_U, LOW);
  44.   digitalWrite(SD_V, HIGH);
  45.   digitalWrite(SD_W, HIGH);
  46.   delay(delayTime);

  47.   analogWrite(IN_U, 0);
  48.   analogWrite(IN_V, 0);
  49.   analogWrite(IN_W, 250);
  50.   digitalWrite(SD_U, HIGH);
  51.   digitalWrite(SD_V, LOW);
  52.   digitalWrite(SD_W, HIGH);
  53.   delay(delayTime);

  54.   analogWrite(IN_U, 0);
  55.   analogWrite(IN_V, 250);
  56.   analogWrite(IN_W, 0);
  57.   digitalWrite(SD_U, HIGH);
  58.   digitalWrite(SD_V, HIGH);
  59.   digitalWrite(SD_W, LOW);
  60.   delay(delayTime);

  61.   analogWrite(IN_U, 0);
  62.   analogWrite(IN_V, 250);
  63.   analogWrite(IN_W, 0);
  64.   digitalWrite(SD_U, LOW);
  65.   digitalWrite(SD_V, HIGH);
  66.   digitalWrite(SD_W, HIGH);
  67.   delay(delayTime);
  68. }

Ene-1GPに向けた機体制作

 コロナの影響で、2020年のEne-1GPがなかった?ので期待をお披露目する場所がありませんでした。それなので、年を越してしまいましたが作っていた機体のお披露目をします。

 この機体ができるまでに1機違う機体があったのですが、それはいろいろあった影響で信頼性がなかったので今回は形にすることを目標にやりました。
 それなのでまだ未完成な部分がありますが、一応完成という形にしています。今年の状況の中で大会が開かれるかわからないですが、またサークルのメンバーが4年になってしまうので大会があっても参加できるかわかりませんが、これからもアップデートはしていきたいと思います。まあ逆に、大学卒業しちゃえば知り合いを動員して大会に参加できます。

 そんなこんなでできた機体は↓の動画の通りになります。


 見てもらえばわかる通り車用のバッテリーと775モーターを使ったものになります。

 こうなった経緯を1つ1つ説明すると...
  1.  レギュレーションとしては乾電池40本なのに車用バッテリーを使った理由としては、単純に充電がめんどくさいからです。あと、これをケースに入れて配線するのもめんどくさいからです。実際には乾電池20本を直列につないで30Vで走行するのですが、今回は車用バッテリー12.5Vで走行しています。また本来電流制限があるのですが、どう頑張っても越えられそうにもないので今回は無視しています。
  2.  また775モーターを利用した理由ですが、ある程度小型で、ある程度出力があり、ある程度安いモーターがほかになかったからです。ブラシレスモーターとか高くてあきらめました。
 です。また今回はインバーターを使わずに単純にFETのスイッチだけで動かしているので効率が悪いです。また、電圧も大会に出場する際の半分ほどなので、これを改善すればもっとスピードが出ると思います。

 こんな感じに今回の機体を作りました。インバータは近いうちに作ろうと思いますが、以前の大会で使っていた電池がどうも怪しいので、電源を変えるのは当分先かなと思います。
 最近は、プログラミングして動画編集してブログ書いて…と忙しいので、この改良をする前に色々片付けることになりそうです。

直流大電流をArduinoで測る方法(ACHS-7124)

 電動バイクを作っていて、インバータを作成する際にモーターに流れている電流を測定する必要があります。ただ、直接直流電流を測る方法は限られています。

 電流計測の方法としてよく出てくるのはCTセンサーを使う方法です。ただしこれは基本的に交流電流を測るものです。
 次に出てくる方法は、シャント抵抗を使用したものです。ただし、モーターにシャント抵抗を付けると燃えかねません。
 それなので、専用のモジュールを使います。

 今回は秋月でも売っている(https://akizukidenshi.com/catalog/g/gK-14796/)電流センサモジュールを使います。これは±40Aまで測れる優秀なヤツです。メーカーのページではいろいろ種類があって±50Vまでのチップもあったのですが、秋月で売っているものは±40V耐圧のようです。

 モジュールの使い方としては、基板に書いてある通りに配線します。
OUT-アナログ入力ピン
Vcc-5V
GND-GND
です。また、↓の画像のようにスルーホールに測りたい電流を流します。
Ep5zeLNVQAAPjgi

 プログラムは適当にanalogRead()で大丈夫です。公式サイトによると、2.5Vを中心に1Aあたり50mV変化するらしいのでmap(analogRead(),0,1023,-50,50)で電流が分かるはずです。ただし、ある程度の誤差とノイズは考慮してください。

 実際にanalogRead()でとった値をそのままシリアルプロッタに出力すると下のようになります。
スクリーンショット 2020-12-23 160317

 家にある直流安定化電源は数年前に買った安物で、3Aしか流せないのでほとんど変化がないうえにノイズが載っています。しかし、電流はきちんと測れているようです。

BMX055とENC-03RをArduinoで使ってみた話

 今回はどちらも秋月で売っているやつを使います。これ(http://akizukidenshi.com/catalog/g/gK-13010/)と、これ(http://akizukidenshi.com/catalog/g/gK-04912/)です。

 BMX055は秋月にサンプルコードが載っているのでそれを入れるとデータをとることができます。
 配線もサンプルコードの上の方に書いてある通りにつなげれば大丈夫です。
コメント 2020-06-30 235451



 ENC03Rは普通にanalogReadで読む感じになります。
 配線は説明書に書いてある通り
1->analogRead
2->analogRead
7->GND
8->VCC
とつなぎます。
コメント 2020-07-01 000509



 今回は以上です。これらのセンサーは使う時が来たら使います。なんとなくセンサー買って使ってないみたいなことが結構あるので今回も使わないかもしれません。それではまた今度。

Arduino+ESCでブラシレスモーターを回した話

 前回は自分でドライバを作ってブラシレスモーターを回しましたが、Amazonなどでも売っているESCというものを使うことで簡単に回すことができます。

 今回は下のセットを使いました。

 これは12Aまで流せるもので、ブラシレスモーター本体もついてくるので便利でした。
 配線は
・黄→D9ピン
・赤→5Vピン
・黒→GND
につなぎます。また、太い赤と黒の線は10V程度の電源とGNDにつなぎ、太い青い線は適当にBLDCモーターにつなぎます。

 また、ESCの制御はサーボの制御と一緒でパルス信号で制御します。それなので、プログラムは公式ライブラリのServo.hを使います。コードは以下の通りです。
#include <Servo.h>

const int throttle_high = 2000;
const int throttle_low = 1000;

Servo throttle;
int level = throttle_low;

void setup(){
  throttle.attach(9);
  throttle.writeMicroseconds(level);
  delay(1000);
}

void loop() {
  for (level = throttle_low; level <= throttle_high; level += 100) {
    throttle.writeMicroseconds(level);
    delay(1000);
  }
  for (level = throttle_high; level >= throttle_low; level -= 100) {
    throttle.writeMicroseconds(level);
    delay(1000);
  }
}
 level1の値を1000~2000の間で変化させることでモーターの回転速度を制御します。
 動作させると下のような感じになります。

 ESCを使うと簡単にブラシレスモーターを回すことができるので、難しいことを考えないときにはいいかもしれません。それではまた今度。

Arduinoでブラシレスモーターを回してみた話

 暇なのでBLDCモーターを回してみました。
 基本的にはVVVFインバータのときと変わりません。

・6ステップ制御
 ブラシレスモーターはコイルによってできる磁束の方向を回し、その磁力と永久磁石の磁力の作用で回すという構造になっています。それなので、コイルにかかる電流を変化させることでコイルにより発生する磁力を回転させる必要があります。
 ブラシレスモーターの三相それぞれをU,V,Wとすると、
・U →V
・W→V
・W→U
・V →U
・V →W
・U →W
の方向に電気を流す6つのステップを繰り返すことで回すことができます。下の動画はそれを図式的に表してくれているので、ブラシレスモーターの回転原理がよくわかると思います。



 この動画で説明している制御方法がまさに6ステップ制御です。これをするにあたって必要な回路は下の通りです。
VVVFhbd_回路図
 基本はVVVFの時と同じですが、ハーフブリッジドライバのSDも操作するため、3番ピンもArduinoにつないでおきます。SDを使うことで、ハーフブリッジドライバからの出力を切ることができ、動作に必要ないFETに通電させないことができます。こうすることで各相の出力を以下のようにすることができます。
Untitled Diagram

 これを実現するためのプログラムは以下のようになります。
const int IN_U = 3;
const int SD_U = 2;
const int IN_V = 5;
const int SD_V = 4;
const int IN_W = 9;
const int SD_W = 8;

int delayTime;

void setup() {
  pinMode(IN_U, OUTPUT);
  pinMode(IN_V, OUTPUT);
  pinMode(IN_W, OUTPUT);
  pinMode(SD_U, OUTPUT);
  pinMode(SD_V, OUTPUT);
  pinMode(SD_W, OUTPUT);

  analogWrite(IN_U, 0);
  analogWrite(IN_V, 0);
  analogWrite(IN_W, 0);
  digitalWrite(SD_U, HIGH);
  digitalWrite(SD_V, HIGH);
  digitalWrite(SD_W, HIGH);
}
void loop() {
  if (millis() < 8000) {
    delayTime = 5 - millis() / 2000;
  }

  analogWrite(IN_U, 250);
  analogWrite(IN_V, 0);
  analogWrite(IN_W, 0);
  digitalWrite(SD_U, HIGH);
  digitalWrite(SD_V, LOW);
  digitalWrite(SD_W, HIGH);
  delay(delayTime);

  analogWrite(IN_U, 250);
  analogWrite(IN_V, 0);
  analogWrite(IN_W, 0);
  digitalWrite(SD_U, HIGH);
  digitalWrite(SD_V, HIGH);
  digitalWrite(SD_W, LOW);
  delay(delayTime);

  analogWrite(IN_U, 0);
  analogWrite(IN_V, 0);
  analogWrite(IN_W, 250);
  digitalWrite(SD_U, LOW);
  digitalWrite(SD_V, HIGH);
  digitalWrite(SD_W, HIGH);
  delay(delayTime);

  analogWrite(IN_U, 0);
  analogWrite(IN_V, 0);
  analogWrite(IN_W, 250);
  digitalWrite(SD_U, HIGH);
  digitalWrite(SD_V, LOW);
  digitalWrite(SD_W, HIGH);
  delay(delayTime);

  analogWrite(IN_U, 0);
  analogWrite(IN_V, 250);
  analogWrite(IN_W, 0);
  digitalWrite(SD_U, HIGH);
  digitalWrite(SD_V, HIGH);
  digitalWrite(SD_W, LOW);
  delay(delayTime);

  analogWrite(IN_U, 0);
  analogWrite(IN_V, 250);
  analogWrite(IN_W, 0);
  digitalWrite(SD_U, LOW);
  digitalWrite(SD_V, HIGH);
  digitalWrite(SD_W, HIGH);
  delay(delayTime);
}

 このプログラムは簡易的な加速機能がついており、8秒間かけて3ステップの加速をします。また、delayTimeはモーターによって回転数が違うので調節してください。
 これを使ってブラシレスモーターを回すとこうなりました。


・疑似正弦波制御
 6ステップ制御を発展させたものとして正弦波制御というものがあります。これは、6ステップ制御とは違い、コイルに(疑似)正弦波を入力することでモーターを滑らかに回すというものです。
 これによってコイルによって発生する磁束の方向が滑らかに変化するのでモーターを滑らかに回すことができます。ただし、ArduinoのanalogWriteはPWMなので正確に正弦波を出せるわけではない上、出力がLOWの時は回路上その部分の出力はGNDに短絡されてしまいます。
 そのような不具合はありますが、一応回路図とプログラムを挙げておきます。VVVFhbd_回路図
 6ステップ制御との違いは正弦波制御ではSDを使わないためVCCに短絡させてしまっている点だけです。プログラムは以下のようになります。
const int IN_U = 11;
const int IN_V = 10;
const int IN_W = 9;

int delayTime = 1;
double pwm[360];

void setup() {
  // put your setup code here, to run once:
  pinMode(IN_U, OUTPUT);
  pinMode(IN_V, OUTPUT);
  pinMode(IN_W, OUTPUT);
  analogWrite(IN_U, 0);//UVWのPWM 0〜255
  analogWrite(IN_V, 0);
  analogWrite(IN_W, 0);
  delayMicroseconds(1);

  for (int i = 0 ; i < 360 ; i++) {
    pwm[i] = 125 * sin(i * PI / 180) + 125;
  }
}

void loop() {
  //1 U->W
  for (int i = 0; i < 60; i++) {
    analogWrite(IN_U, pwm[i]);
    analogWrite(IN_V, pwm[i - 240]);
    analogWrite(IN_W, pwm[i - 120]);
    delayMicroseconds(delayTime);
  }

  //2 U->V
  for (int i = 60; i < 120; i++) {
    analogWrite(IN_U, pwm[i]);
    analogWrite(IN_V, pwm[i - 240]);
    analogWrite(IN_W, pwm[i - 120]);
    delayMicroseconds(delayTime);
  }

  //3 W->V
  for (int i = 120; i < 180; i++) {
    analogWrite(IN_U, pwm[i]);
    analogWrite(IN_V, pwm[i - 240]);
    analogWrite(IN_W, pwm[i - 120]);
    delayMicroseconds(delayTime);
  }

  //4 W->U
  for (int i = 180; i < 240; i++) {
    analogWrite(IN_U, pwm[i]);
    analogWrite(IN_V, pwm[i - 240]);
    analogWrite(IN_W, pwm[i - 120]);
    delayMicroseconds(delayTime);
  }

  //5 V->U
  for (int i = 240; i < 300; i++) {
    analogWrite(IN_U, pwm[i]);
    analogWrite(IN_V, pwm[i - 240]);
    analogWrite(IN_W, pwm[i - 120]);
    delayMicroseconds(delayTime);
  }

  //6 V->W
  for (int i = 300; i < 360; i++) {
    analogWrite(IN_U, pwm[i]);
    analogWrite(IN_V, pwm[i - 240]);
    analogWrite(IN_W, pwm[i - 120]);
    delayMicroseconds(delayTime);
  }
}
 この肝はsetup()の段階で360°分の出力値を計算しておき、プログラム実行中の動作を軽くしている点です。ただしこれをやると変数の容量を食うので、今回はArduino UNOのグローバル変数を70%も使います。
 実際に動かすと下のようになります。

 そんなこんなで一応回すことはできたので、これから発展させていきたいと思います。あと今は、フォトカプラが欲しいです。それではまた今度。

AliExpressaから荷物が届いた話。

AliExpressに頼んでいた荷物が届いていたので、その時にやったやり方を書いていこうと思います。

①会員登録
 トップページを開き、右上のsigh inと書かれたら辺にカーソルを合わせるとウィンドウが出てくるので、sign inを押します。するとページが変わり、Quick accessにツイッターのアイコンがあるのでそこを押します。(自分はツイッターでアカウントを作りましたが、それ以外でも問題なくできると思います。)そうすると、アプリ認証のページに飛ぶのでそこで認証すれば登録完了です。

②設定1
 デフォルトだと、値段がUS$になっていて分かりにくいのでこれを変更していきます。まあ特に難しくなく、右上のShip to/JPYというところをクリックして、出てきたCurrencyの中から選ぶだけです。

③買い物
 お買い物の方法はアマゾンと一緒で、適当に検索したりカテゴリーから検索したりします。いい感じに日本語に機械翻訳されているので、特に不自由はないと思います。ほしい商品があったら、色とか、素材とか、どこの倉庫から送るかとか、数量とかを入力し、カートに追加していきます。送り主の倉庫がいくつかある場合、その場所によって値段が違ったりするので気を付けてください。

 買いたいものがすべて決まったらカートに移動します。カートの中の欲しいものを選択していくとそれを買うものという扱いになり、右にその分の合計金額が表示されていきます。なお、ここで選択しなかったものは買えないので注意してください。そして、購入というボタンを押すと購入できます。この時に配送先と支払方法を決めないといけないのですが、そこそこめんどくさいので別の項で説明します。

④送り先
 海外のサイトなので送り先の丹生力が日本と違い分かりにくいです。キャプチャ
 この画面を埋めていく必要があるのでそれぞれの行ごとに説明していきます。全体を通して、Japan以降の住所は日本郵政がわかれば問題ないので、多少おかしくても多分届きます。読むのがめんどくさい人は下の完成例を参考に入力してください。
  • 1行目...名前と携帯番号です。名前は姓名どういう順番でも日本郵政が理解できる形なら大丈夫です。次に携帯番号ですが、080,090,070の一番先頭の0を消し、80,90,70という風に書き始め、あとは普通に入力します。
  • 2行目...streetには、何丁目何番何号、町名を入力していきます。皇居で例えると千代田1-1の部分です。これは、数字→町名の順番で入力します。また、右のApartment,Unit,etcにはその名の通りマンション名とか部屋番号とかを入れていきます。部屋番号は#○○○みたいな感じで入力しとくと言いそうです。
  • 3行目...ここは書いてあることそのまま国,都道府県,市区町村を入力していきます。皇居で言う、東京都千代田区の部分です。
  • 4行目郵便番号です。
 これを入力するとこのようになります。保存しておきたいはチェックマークにチェックしておくと保存できます。

キャプチャ2


⑤支払方法
 だいたいの人はクレジットカード払いをすると思います。その人は普通にカード番号とカード名義と有効期限とセキュリティーコードを入力するだけです。

 ただ、クレジットカード情報を中国企業に渡したくないという人もいると思います。AliExpressでクレジットカード情報が盗まれたみたいな話は聞いたことがありませんが、まあそれでも不安な人はVプリカを使うといいと思います。これは、VISAがやっているプリペイドカードで、ネットで簡単に課金ができるうえに、これ本体はただのプリペイドカードなので課金した金額以上は絶対に使えないのでもし何かあっても被害があまりないという優れものです。
 何年か前までクレジットカードを持ってない未成年がMinecraftを買うにはこれをコンビニで買うしかなかったので、使ったことがある人もいるかもしれません。
 Vプリカのサイトは普通のサイトなので普通に使えると思います。それでもできなかったときはFAQでも読んでくだしあ。
 Vプリカはクレジットカード名? を自分で決めるのですが、これを入力するとき最初の一文字の後スペースを入れて疑似的に姓名っぽくすると認証される必要があります。


 まあそんなこんなで注文すると業者にもよりますがそこそこの日数で届きます。私は1/29に注文したもののうち一つは届きましたが、もう一つはまだ届いていません。荷物が届かないこともなくはないらしいですが、その時は運営に連絡すると返金してくれるようです。というのも、荷物が客のところに届いたのが確認されるまではお金は運営一時的に預かっているという扱いになるらしく、AliExpressの注文履歴から届いたということを入力しない限り業者にお金が払われないようです。それなので荷物が届いたらなるべく早く注文履歴から荷物が届いたことを報告してあげてください。

 そんなこんなで無事に中国から荷物が送られてきました。
IMG_2095IMG_2094

 Amazonで買った時も思いましたが、中国から贈られてくるものは基本的に梱包が雑です。以前モーターを買ったときは、プチプチシートで包んだ生身のモーターが送られてきたのですが、これを運んでくれる日本郵政ってすごいんだなぁと思います。

 今回はこれで終わりです。ARゴーグルもどきのver2ができているのでそのことも近く記事にすると思います。それではまた今度。

ソレノイドで星形5気筒エンジンを作った話

 なんとなくソレノイドを使ってエンジンを作ることにしました。
 実用性は求めていないので、見た目的に美しく構造も簡単な星形エンジンにすることにしました。

 まず、星形エンジンを作るにあたって、Fusionでモデルを作ってシミュレーションしてみました。
 それがこちらです。なんか適当に作っても回る気がしてきました。

 これを実際に印刷して動くようにするのはめんどくさいので、あくまで参考にしつつ3Dプリントしてきちんと動くようにしていきます。この作業はまあまあめんどくさく、例えばM2のビスを通すときの穴の大きさは2.6mmだったり、520ベアリングがはまる穴の大きさは5.4mmだったりするのを経験則であてはめながらモデルを作っていきます。

 キャプチャ

 いい感じにビス頭とかの空間を開けつついい簡易に干渉しないように作っていきます。めんどくさいのでベアリングやビスは作りませんし、設計段階でソレノイドの正確な位置を決めるのもぶっちゃけめン独裁のでいい感じにレールだけ作っておきます。

 これを3Dプリンタで印刷して、組み立てて、適当に回路を組み、プログラムも適当に描くと動きました。
 なんかかくかく言っているのでプログラムの回転数を小さくしてみるといい感じになりました。


 配線の具合を整えたらこんな感じになります。apxl8-zesbz

 見た目もきれいですし、見ていて楽しいので昨日から意味もなく机の上で回したりしています。

 最近ガラスカッターを買って、100均の鏡が簡単に切れるようになったので、ARデバイスver2の開発をしています。春休みは、台湾に短期留学するのとTMMFに呼ばれている以外絶妙に暇なので、来週中にも完成させてブログに書けるぐらいまで進めたいと思います。それではまた今度。

センサー付きブラシレスモーターを回した話

 Ene1-GPも終わりもうそろそろ一年が終わりそうな今日この頃、来年の大会のためにもブラシレスモーターの制御を始めることにしました。うちのサークルで使っているモーターは、ブラシレスモーター でかつセンサーがついているので、今回はそれと同じ構造のモーターをAmazonで買い回してみました。

 全然関係ないんですが、fritzing有料化しました? ダウンロードページのデザインが変わっていて、無料ダウンロードのリンクがみつからないんですよね。何か知っている方がいたら教えてください。

 今回使ったモーターはこういうやつです。

 実際に買ったやつは在庫がないらしく検索ではヒットしなかったですが、こんな感じのやつでした。

 システムの概略としてはこんな感じです。
Untitled Diagram
 いつものvvvfを使い、その制御にブラシレスモーター からのセンサー入力を利用する方法をとっています。
 追加された回路はこんな感じです。
brushless_回路図
 モーターのセンサーの取り扱い回路とセンサーの値で決まるステップ表示用のLEDを増やしただけです。

 今回もプログラムは特筆すべきところがないのでコメントだけつけて最後に書いておきます。

 実際に回してみるとこんな感じです。

 まあほどほどにいい感じじゃないでしょうか? ただ問題があって、ブラシレスモーターはやたらと電流が流れるのでブレッドボードが溶けました。 まあ高校生の時に先生の前でVVVFを動かしてブレッドボードを溶かしたこともあるし問題ないです。ただ、このままで良いわけでもないのできちんと基板を作ろうと思います。それではまた今度。

見る価値があるか怪しいプログラムです。一応少しだけコメントをつけておきます。
#define thre 200

int nstep;
int bstep;
unsigned long timeset;
int delaytime;

void setup()  {
  Serial.begin(9600);
  //各出力ピンのモードを出力に設定
  pinMode(2, OUTPUT);//インダクタ接続
  pinMode(3, OUTPUT);//
  pinMode(4, OUTPUT);//
}
void loop()  {
  //センサーの値を見てステップを判断
  Serial.println(delaytime);
  if (analogRead(0) > thre) {
    if (analogRead(1) > thre) {
      if (analogRead(2) > thre) {
        nstep = 1;
      }
      else {
        nstep = 2;
      }
    }
    else {
      if (analogRead(2) > thre) {
        nstep = 3;
      }
      else {
        nstep = 4;
      }
    }
  }
  else {
    if (analogRead(1) > thre) {
      if (analogRead(2) > thre) {
        nstep = 5;
      }
      else {
        nstep = 6;
      }
    }
    else {
      if (analogRead(2) > thre) {
        nstep = 7;
      }
      else {
        nstep = 8;
      }
    }
  }

  
  //現在のステップを表示
  switch (nstep) {
    case 4:
      digitalWrite(2, HIGH);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      break;

    case 2:
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, LOW);
      break;

    case 6:
      digitalWrite(2, LOW);
      digitalWrite(3, HIGH);
      digitalWrite(4, LOW);
      break;

    case 5:
      digitalWrite(2, LOW);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      break;

    case 7:
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, HIGH);
      break;

    case 3:
      digitalWrite(2, HIGH);
      digitalWrite(3, LOW);
      digitalWrite(4, HIGH);
      break;

    case 1:
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      break;

    case 8:
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      break;
  }


  //ステップの切り替えタイミングを計算
  if (nstep != bstep) {
    delaytime=(millis()-timeset)/5;
    timeset = millis();
  }


  //VVVFを駆動
  if ((millis() - timeset) > delaytime) {
    switch (nstep) {
      case 4:
        analogWrite(9, 250);
        analogWrite(10, 250);
        analogWrite(11, 0);
        break;

      case 2:
        analogWrite( 9, 0);
        analogWrite(10, 250);
        analogWrite(11, 0);
        break;

      case 6:
        analogWrite( 9, 0);
        analogWrite(10, 250);
        analogWrite(11, 250);
        break;

      case 5:
        analogWrite( 9, 0);
        analogWrite(10, 0);
        analogWrite(11, 250);
        break;

      case 7:
        analogWrite(9, 250);
        analogWrite(10, 0);
        analogWrite(11, 250);
        break;

      case 3:
        analogWrite(9, 250);
        analogWrite(10, 0);
        analogWrite(11, 0);
        break;

      case 1:
        break;

      case 8:
        break;
    }
  }
  bstep = nstep;
}
/*センサーの値とステップの関係
   HHH 1
   HHL 2
   HLH 3
   HLL 4
   LHH 5
   LHL 6
   LLH 7
   LLL 8
*/
/*ステップの流れる順番
   4 2 6 5 7 3
*/
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

読者登録
LINE読者登録QRコード