現在、ロボットヘッドの制作を行っているのですが、駆動系の制作が完成していないため同じ位置で少し方向を変える程度の事しか実現出来ていません。そこで、比較的簡単だろうと勝手に想像してラジコンカーを見本に車輪で移動出来る駆動力を手に入れて、ロボットカーをつくってみようと思います。
この記事の制作には、とても時間がかかりました。何度も試行錯誤してやっと動いた時には、取り組み始めて一か月が経過していました。その中でのあれやこれやなので、内容も盛り沢山になっています。
DCモーター動かしてみる
DCモーターで車輪を動かすために以下の2つを購入しました。
DCモーター
DCモーターは、マブチモーター社製で標準的なものです。DCモーターで最も有名なものは、130タイプですが、上にJetson NanoもしくはRaspberry Piを載せて走らせようとしているので、軽量なおもちゃに使用する130タイプよりも少しトルク(駆動力)のあるものを選びました。
仕様項目 | FA-130RA-2270 | RE-280RA-2865 | RS-385PH-4045 |
---|---|---|---|
標準電圧 | 1.5V | 3.0V | 6.0V |
電圧範囲 | DC1.5-3.0V | DC1.5-4.5V | DC3.0-9.0V |
無負荷時電流 | 0.2A(0.26Amax) | 0.16A(0.20Amax) | 0.48A(0.62Amax) |
無負荷時回転数 | 8,100-9,900rpm | 9,200rpm | 12,100rpm |
定格負荷時電流 | 0.66A(0.85Amax) | 0.87A(1.13Amax) | 2.7A(3.5Amax) |
定格負荷時回転数 | 7,000rpm | 7,770rpm | 10,300rpm |
負荷 | 6.0g・cm | 20.0g・cm | 90g・cm |
負荷出力 | 0.43W | 1.6W | 9.5W |
効率 | 44% | 61% | 60% |
静止電流 | 2.2A | 4.8A | 15A |
静止トルク | 26g・cm | 129g・cm | 610g・cm |
軸径 | Φ2mm | Φ2mm | Φ2.3mm |
重量 | 約17g | 約41g | 約77g |
ここで重要なのは、静止トルクです。これ以上の負荷がかかると止まってしまいますので、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 |
駆動電圧が12V以下であれば、ロジック電圧は繋ぐ必要がありません。5V enable ピンにジャンパーピンが刺さった状態となっていれば、逆に5Vの電圧が取り出せます。駆動電圧が12Vを超える場合は、5V enable ジャンパーピンを外して外部から5V電源を繋ぐ必要があります。
端子 | ピン | 用途 |
---|---|---|
モーター接続端子 | OUT1 OUT2 | 1つ目のモーターを接続する端子 |
OUT3 OUT4 | 2つ目のモーターを接続する端子 | |
電源端子 | +12V Power | モーター駆動用の電源端子。 ここに印加する電圧がモーターの最大駆動電圧になります。PWM制御時は、出力を最大値の255にした時にこの電圧が出力されます。 |
GND | GND端子。 モーター駆動用電源のGNDとArduino のGND端子を共通にして使います。 | |
+5V Power | 5V 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 R3 | L298N | 補足説明 |
---|---|---|
D4 | IN1 | モーター①のデジタル制御 |
D5 | IN2 | モーター①のデジタル制御 |
D6 | IN3 | モーター②のデジタル制御 |
D7 | IN4 | モーター②のデジタル制御 |
- | ENA | ジャンパ接続 |
- | ENB | ジャンパ接続 |
GND | GND | 電源のマイナスと共用 |
以下のコードで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モーター取付台とプロペラを取り付けて動かしてみました。
東京バードさんのブログ「ぶらり@web走り書き」を大変参考にさせて頂きました。
ギアボックスをつくってみる
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 rpm | 1019 rpm | 339 rpm | 113 rpm | 37 rpm |
トルク | 8.0 g・cm | 93.8 g・cm | 275.4 g・cm | 807.8 g・cm | 2368.4 g・cm |
ギアボックスを組み立てて、上と同じ回路とプログラムで動かしてみました。
既製品のダブルギアボックスで、トルクの大幅アップが出来ました。そのパワーを確認するため、このギアボックスを使って、実際に走ることが出来るベルト駆動のトラックを作ってみたいと思います。
クローラー車を赤外線リモコンで動かしてみる
さて、ダブルギアボックスで車として動く一歩手前まできました。このまま、このダブルギアボックスを使ってベルト型のクローラー車(キャタピラ車)を作り、赤外線リモコンで操縦するところまで試してみたいと思います。
こちらの工作キットは、駆動部分しかないので、本体部分は、自分で作るか、同じ工作シリーズのユニバーサルプレートセットを購入して使うかのどちらかが必要です。私の場合は、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(2024/08/03 追記)
CADデータとプログラムについて
CADデータが欲しいとのリクエストがありましたので、GitHub でリポジトリ作成しました。
URL: https://github.com/chikuma-creator/crawler_vehicle
ロボットカーを作ってみる
さて、一旦、上のクローラー車で公開を行いますが、ロボットカーを作成するのが目的です。現在、鋭意作成中ですが、あまりにも公開までに時間がかかってしまっているので、上手くいったら後で追記していこうと思っています。
なお、最終的なロボットカーは、完全リモートで動かしたいため、以下の改良を行おうと考えています。
- 乾電池ではなくバッテリーに置き換える。
- 赤外線通信ではなく、無線通信に置き換える。これは、ESP32かトワイライトにする予定。
- オリジナルのギアボックスを作成する。
- DCモーターのパワーアップを行う。
以上
コメント
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!
> 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.