PR

ロボット制作⑰ ロボットカーをつくってみる
今回はDCモータを使って、ロボットカーをつくってみた。赤外線リモコンで動く戦車のような見た目で、今までで一番の駆動力を発揮した。

加工・組み立て

現在、ロボットヘッドの制作を行っているのですが、駆動系の制作が完成していないため同じ位置で少し方向を変える程度の事しか実現出来ていません。そこで、比較的簡単だろうと勝手に想像してラジコンカーを見本に車輪で移動出来る駆動力を手に入れて、ロボットカーをつくってみようと思います。

この記事の制作には、とても時間がかかりました。何度も試行錯誤してやっと動いた時には、取り組み始めて一か月が経過していました。その中でのあれやこれやなので、内容も盛り沢山になっています。

DCモーター動かしてみる

DCモーターで車輪を動かすために以下の2つを購入しました。

DCモーター

DCモーターは、マブチモーター社製で標準的なものです。DCモーターで最も有名なものは、130タイプですが、上にJetson NanoもしくはRaspberry Piを載せて走らせようとしているので、軽量なおもちゃに使用する130タイプよりも少しトルク(駆動力)のあるものを選びました。

仕様項目FA-130RA-2270RE-280RA-2865RS-385PH-4045
標準電圧1.5V3.0V6.0V
電圧範囲DC1.5-3.0VDC1.5-4.5VDC3.0-9.0V
無負荷時電流0.2A(0.26Amax)0.16A(0.20Amax)0.48A(0.62Amax)
無負荷時回転数8,100-9,900rpm9,200rpm12,100rpm
定格負荷時電流0.66A(0.85Amax)0.87A(1.13Amax)2.7A(3.5Amax)
定格負荷時回転数7,000rpm7,770rpm10,300rpm
負荷6.0g・cm20.0g・cm90g・cm
負荷出力0.43W1.6W9.5W
効率44%61%60%
静止電流2.2A4.8A15A
静止トルク26g・cm129g・cm610g・cm
軸径Φ2mmΦ2mmΦ2.3mm
重量約17g約41g約77g
DCモーターの主な仕様(秋月電子通商のサイトより)

ここで重要なのは、静止トルクです。これ以上の負荷がかかると止まってしまいますので、DCモーターにかかるトルクをこの値以下、出来るだけ負荷の値に近づける必要があります。
例えば、ロボットカーの重量が200gだとすると以下のようになります。

F(荷重) = 200gf … 重量200gのものを動かすのに必要な力(gf)
R(ホイールの半径) = 3.6cm … 車輪の半径(cm)
T(トルク) = F(gf) × R(cm) [単位: gf・cm]

200(gf) × 3.6(cm) = 720(gf・cm)

ロボットカーを動かそうとするとかなり強力な駆動力が必要なのですね。

L298N(DCモータードライバモジュール)

DCモーターの制御は、比較的安価(1個約400円)で使いやすいL298Nモジュールを使います。このモジュールは、DCモーターの正転・逆転・速度制御などが可能です。DCモーターの駆動には、大きな電流が必要なためArduinoとは別の外部電源を使う必要があります。(Arduino 5V からは小さな電流しか流すことができません。)

項目仕様
ロジック電圧5V
駆動電圧5V – 35V
ロジック電流36mA
駆動電流2A(max)
最大出力電力25W
内部回路Hブリッジドライバ(デュアルHブリッジ)
サイズ43 mm x 43 mm x 27 mm
重量60 g
Amazon 商品説明ページより

駆動電圧が12V以下であれば、ロジック電圧は繋ぐ必要がありません。5V enable ピンにジャンパーピンが刺さった状態となっていれば、逆に5Vの電圧が取り出せます。駆動電圧が12Vを超える場合は、5V enable ジャンパーピンを外して外部から5V電源を繋ぐ必要があります。

端子ピン用途
モーター接続端子OUT1
OUT2
1つ目のモーターを接続する端子
OUT3
OUT4
2つ目のモーターを接続する端子
電源端子+12V Powerモーター駆動用の電源端子。
ここに印加する電圧がモーターの最大駆動電圧になります。PWM制御時は、出力を最大値の255にした時にこの電圧が出力されます。
GNDGND端子。
モーター駆動用電源のGNDとArduino のGND端子を共通にして使います。
+5V Power5V Enable のジャンパピンが接続されている場合は、この端子から5Vが出力されます。
Arduino用の電源をここから引いて使うこともできます。
+12V Power に12Vを超える電源電圧を接続する場合は、5V Enableのジャンパピンを外して、ここにArduinoの5V出力端子を接続してください。
5V Enable上記の5V出力を使う際に接続するジャンパです。
制御端子ENAモーター①をPWM制御で動かす場合に使用します。
デジタル制御(ON/OFFのみ)で動かす場合は、ジャンパーピンは接続した状態にします。
ENBモーター②をPWM制御で動かす場合に使用します。
デジタル制御(ON/OFFのみ)で動かす場合は、ジャンパーピンは接続した状態にします。
IN1
IN2
モーター①の制御用の端子。(回転方向を決める)
IN3
IN4
モーター②の制御用の端子。(回転方向を決める)
各ピンの用途

回路を繋いで動かしてみる

以下の回路を接続して動かしてみたいと思います。

実際の接続は、右の表のように繋いでいます。外部電源は、単三電池4本の並列に繋いだ電池ボックスから接続しています。1.5V×4本で約6Vですが、5.8Vと少し6Vより低い状態です。

Arduino UNO R3L298N補足説明
D4IN1モーター①のデジタル制御
D5IN2モーター①のデジタル制御
D6IN3モーター②のデジタル制御
D7IN4モーター②のデジタル制御
ENAジャンパ接続
ENBジャンパ接続
GNDGND電源のマイナスと共用
Arduino と L298N の接続端子

以下のコードでDCモータを制御しています。前進1秒、右回転0.5秒、後退1秒、左回転0.5秒を繰り返しています。

const int IN1 = 4;
const int IN2 = 5;
const int IN3 = 6;
const int IN4 = 7;

void setup() {
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  Serial.begin(9600);
  Serial.println("DC Moter move start.");
}

void stop(int n) {
  Serial.println("stop");
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delay(n);
}

void forward(int n) {
  Serial.println("forward");
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  delay(n);
}

void back(int n) {
  Serial.println("back");
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  delay(n);
}

void right(int n) {
  Serial.println("right");
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  delay(n);
}

void left(int n) {
  Serial.println("left");
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  delay(n);
}

void loop() {
  forward(1000);
  stop(1500);
  right(500);
  stop(1500);
  back(1000);
  stop(1500);
  left(500);
  stop(1500);
}
C

モーター取付台とプロペラを取り付けて動かしてみました。

ギアボックスをつくってみる

L298Nを使ってDCモーターを正転/逆転などのデジタル制御で動かすところまで出来ました。しかし、DCモーターのパワーでは、到底、車を動かす駆動力にはなりません。そこでギア比により動力(トルク)をパワーアップしたいと思います。

こちらも1から自分で作り上げることは難しいので、おもちゃのギアボックスを購入して見本にさせて貰いました。

このギアボックスは、組み立て時のギアの噛み合わせによりギア比を4段階から選ぶことが出来ます。ギア比を大きくするとトルクは上がりますが、回転速度が落ちてしまいます。
身近なもので例えると、自転車の変速ギアですね。ローギアだと速度は出ませんが坂道でも楽にペダルを漕ぐことができます。トップギアだとペダルは重くなりますが、速い速度で進みます。

DCモーターのトルクをそのまま使ったのでは、非常に軽いものしか動かすことはできませんし、そのままの回転数で車輪を回すと早すぎて制御が困難になります。
例えば、RE-260RAだと、定格トルクは「20.0g・cm」なので、半径1cmの車輪で車体重量が20g以下のものしか動かせません。車輪の半径が2cmになれば半分の10gになります。また、回転速度は、1分間に7,700回転もするので1秒間だと約128回転もすることになります。

さて、話をタミヤのダブルギアボックスに戻します。このギアボックスに付属のDCモーターは、130タイプだと思いますがマブチモーター社のFA-130RAよりも回転速度も速く、回転トルクも大きいようです。回転速度は13000rpm、回転トルクは8.0g・cmとしています。
タミヤのDCモーターの出力は、ギア比により理論値では、以下の性能に変わるはずです。各歯車間での伝導効率は、歯車の噛み合わせの回数で、94%、92%、90%、88%、86%と2%ずつ下がっていくものとして計算しています。

項目(定格)FA-130RAギア比
12.7:1
ギア比
38.2:1
ギア比
114.7:1
ギア比
344.2:1
回転数13,000 rpm1019 rpm339 rpm113 rpm37 rpm
トルク8.0 g・cm93.8 g・cm275.4 g・cm807.8 g・cm2368.4 g・cm
※伝導効率は、12.7は92%、38.2は90%、114.7は88%、344.2は86%として計算しています。

ギアボックスを組み立てて、上と同じ回路とプログラムで動かしてみました。

既製品のダブルギアボックスで、トルクの大幅アップが出来ました。そのパワーを確認するため、このギアボックスを使って、実際に走ることが出来るベルト駆動のトラックを作ってみたいと思います。

クローラー車を赤外線リモコンで動かしてみる

さて、ダブルギアボックスで車として動く一歩手前まできました。このまま、このダブルギアボックスを使ってベルト型のクローラー車(キャタピラ車)を作り、赤外線リモコンで操縦するところまで試してみたいと思います。

こちらの工作キットは、駆動部分しかないので、本体部分は、自分で作るか、同じ工作シリーズのユニバーサルプレートセットを購入して使うかのどちらかが必要です。私の場合は、3Dプリンタで本体部分やシャフト固定部品、アングル材などを作って組み立ててみました。

レシピは、以下の通りです。

  • ダブルギアボックス
  • トラック&トレーラーセット
  • Arduino UNO R3
  • L298N DCモーターコントローラーモジュール
  • 単三電池ボックス、4本直列タイプ
  • ハトメ 3.5mm
  • M3ネジ 8mm×6本、10mm×12本、30mm×6本
  • 3Dプリンターで印刷した、上下段のプレート、スペーサー、軸受け等

レシピの一部の商品リンクを以下に置いておきます。

動画中に出てくるArduino UNO R3やL298N等の基板CADデータを入出していた3DCADデータのライブラリです。

クローラー車を動かすプログラムです。

#include <IRremote.h>

const int IN1 = 4;
const int IN2 = 5;
const int IN3 = 7;
const int IN4 = 6;
const int reciever  = 11;  // Signal pin of IR receiver to Arduino Digital Pin 11

IRrecv irrecv(reciever);
decode_results results;

void transrateIR() {
  switch (results.value) {
    case 0xFF30CF:
      Serial.println("1");
      leftForward();
      break;
    case 0xFF18E7:
      Serial.println("2");
      forward();
      break;
    case 0xFF7A85:
      Serial.println("3");
      rightForward();
      break;
    case 0xFF10EF:
      Serial.println("4");
      left();
      break;
    case 0xFF38C7:
      Serial.println("5");
      stop();
      break;
    case 0xFF5AA5:
      Serial.println("6");
      right();
      break;
    case 0xFF42BD:
      Serial.println("7");
      leftBack();
      break;
    case 0xFF4AB5:
      Serial.println("8");
      back();
      break;
    case 0xFF52AD:
      Serial.println("9");
      rightBack();
      break;
    default:
      Serial.println("Push other button.");
  }
  delay(5);
}

void setup() {
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  Serial.begin(9600);
  Serial.println("Tank move start.");
  irrecv.enableIRIn();
}

void stop() {
  Serial.println("stop");
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
}

void forward() {
  Serial.println("forward");
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
}

void back() {
  Serial.println("back");
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
}

void right() {
  Serial.println("right");
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
}

void rightForward() {
  Serial.println("rightForward");
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
}

void rightBack() {
  Serial.println("rightBack");
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
}

void left() {
  Serial.println("left");
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
}

void leftForward() {
  Serial.println("leftForward");
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
}

void leftBack() {
  Serial.println("leftBack");
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
}

void loop() {
  if (irrecv.decode(&results)) {
    transrateIR();
    irrecv.resume();
  }
}
C
Expand

ロボットカーを作ってみる

さて、一旦、上のクローラー車で公開を行いますが、ロボットカーを作成するのが目的です。現在、鋭意作成中ですが、あまりにも公開までに時間がかかってしまっているので、上手くいったら後で追記していこうと思っています。
なお、最終的なロボットカーは、完全リモートで動かしたいため、以下の改良を行おうと考えています。

  • 乾電池ではなくバッテリーに置き換える。
  • 赤外線通信ではなく、無線通信に置き換える。これは、ESP32かトワイライトにする予定。
  • オリジナルのギアボックスを作成する。
  • DCモーターのパワーアップを行う。

以上

コメント

  1. googletest より:

    First of all I want to say wonderful blog!
    I had a quick question in which I’d like to ask
    if you do not mind. I was interested to know how you center yourself and clear your thoughts before
    writing. I have had a difficult time clearing my thoughts in getting my ideas out.
    I do enjoy writing however it just seems like the first 10 to 15 minutes tend to be wasted
    simply just trying to figure out how to begin. Any recommendations or tips?

    Many thanks!

    • chikuma chikuma より:

      > How to clear your thoughts before writing?
      I’ve never thought about it that deeply, but in fact, most of the articles I write involve electronic work or robot production while thinking about how to write them. Therefore, when writing an article, the story is already complete.
      Instead, if there are any discrepancies in the story during electronic work or robot production, you will have to rework or redo it.
      In the end, it’s the same as you. That’s the difference between reporting and writing. However, in any case, if you keep your goal in mind while doing it, you will naturally feel excited and your concentration will improve.

タイトルとURLをコピーしました