micro:bitでサーボモーター動かしてみた

変換基板届いたので、早速動かしてみた。一番の懸念はアナログ方式ならば、概ねどのサーボモーターでも扱えるのかということ。

変換ボードはこんな形、緑色の樹脂は端を捲れば除去できます。

micro:bitはおそらくどちらの面でも挿入できるでしょうが、スイッチサイエンスの写真を参考に以下のように、タッチセンサーが見える面を以下のように挿入しました。端子の並び考えれば、自ずとそうなりますが、おそらく逆向きでも壊れることのないような端子配列にはなっているでしょう、やっては見ませんが。

 

https://isehara-3lv.sakura.ne.jp/blog/2022/01/28/サーボモーターの動作確認m5stack-gray/

ここで使ったサーボモーターに制御信号だけつないで動かしてみた。

ブロックコードは以下のリンクになります。タッチセンサー、環境音センスもしくは照度センサーのオア条件でモーターを起動しています。

https://github.com/chateight/servo_motor

動作している動画は、

このように、非常にあっけなく動かすことができます。

 

admin

 

M5stackでstepping motorを動かす

Arduinoのステッピングモーター駆動は挙動不審、どうも脱調しているかの如く、同じ動作の繰り返しでも段々位置ずれするから、M5stackでも動かしてみる。

ライブラリ使うとブラックボックスになるので、直接ソースで動作を指定しました。

#include <M5Stack.h>

// motor/driver 28BYJ-48/ULN2003
//
// original source https://blog.takumus.io/entry/2016/09/13/190510
//

const int IN1 = 2;
const int IN2 = 16;
const int IN3 = 5;
const int IN4 = 17;

const int d_hs[8] = {   // 1-2 drive, 4096 cycles/turn ; gear ration 64:1
  0B00001000, 
  0B00001100,
  0B00000100,
  0B00000110,
  0B00000010,
  0B00000011,
  0B00000001,
  0B00001001
};

int i = 0;

void step(int d);

void setup()
{
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
}

void loop()
{
  for(int i=0; i < 8*256; ++i)
  { 
    step(1);
    delayMicroseconds(2000);    // it does not work properly lower than 2 ms 
  }
  for(int i=0; i < 8*512; ++i)
  {
    step(-1);
    delayMicroseconds(2000);
  }
  for(int i=0; i < 8*256; ++i) 
  { step(1); delayMicroseconds(2000); 
  } 
}
 
void step(int d) // d = -1 : anticlockwise, d = 1 : clockwise { i += d; if(i > 7) i = 0;
  if(i < 0) i = 7;
  byte b = d_hs[i];
  digitalWrite(IN1, bitRead(b, 0));     // bit position 0 ; LSB
  digitalWrite(IN2, bitRead(b, 1));
  digitalWrite(IN3, bitRead(b, 2));
  digitalWrite(IN4, bitRead(b, 3));
}

M5stackは外部に出ているGPIOピンが少ないので、使用するピンは限定されます。

以下の画像で、3-R0, 18-SCKなどは同じピンがオスメスの違いで出力されているだけです。

最初、2/5/35/36使ったら動かない、35/36は入力専用だから。次に2/5/25/26使うと動いたけど、スピーカーと兼用らしくて五月蝿い。で最終的に2/5/16/17を使用。

 

<結論>

M5stackでは正確に角度を刻める、ただし時間待ちを1,500μsぐらいに小さくすると抜けが出るようです。値を大きく取って、連続して動かしていてもターンテーブルの位置は変わらないから、時間待ちがどうも問題の本質のようです。

あとArduinoIDEはイマイチだから、Arduinoの開発環境もVScodeにしたほうがいいかもしれない。

 

P.S. (2022/5/22)

Arduinoから線引き出して、同じ条件で二つのモーターの動作比較して、

・本体のモーターが片方向しか回転しないのは、モータードライバ基板へのArduino側の配線が一本外れてた。-> これは該当問題とは無縁の突発事象

・外部モーターもライブラリ使わないとFreeRTOS配下ではうまく動作しない。圧電スピーカーでもそうだったけど、どうも時間待ちという処理でFreeRTOSとリソース競合が起こるように見える。

・ライブラリ使っても、ライブラリなしと同様に回転速度を落とさないとパルスが抜けるように見える。

と言うことで、回転速度を” myStepper.setSpeed(5); // 10 -> 5回転/1分に設定、つまりライブラリなしでの時間待ちを長くするに相当、に落とすとまともに動いてるように見えるから、高速では動けないモーターだったということ。

アップデートは、

https://github.com/chateight/arduino/tree/master/smart_car_RTOS

にアップロードしました。

 

admin