Raspberry Pi Pico とモータドライバを使って小型のDCモータを制御します。
速度と回転方向を制御します。
モータドライバTB6612FNG(md08a)と、2種類のDRV8833を評価します。
今回紹介するもの
DCモータドライバ(md08a)
特徴
1個または2個のDCモータを個別に制御ができます。
PWM制御によりモータの回転数を制御できます。
モータの回転方向を設定できます。
製品情報
出力 | 1A |
モータ電源電圧 | 4.5 ~ 13.5V |
ロジック電源電圧 | 2.7 ~ 5.5V |
PWM制御 | 最大 100kHz |
Switch sienceで購入できます。
検索 : TB6612FNG (\770) Sep/2022
ピン配置
外観
DCモータドライバ(DRV8833(R))
同じIC(DRV8833)の赤い基板と黒い基板のタイプがあります。
識別のためにDRV8833(R)赤い基板とDRV8833(B)黒い基板と識別します。
特徴
できることは md08a(TB6612FNG)と同じですが、安価で入手性もよい。
1個または2個のDCモータを個別に制御ができます。
PWM制御によりモータの回転数を制御できます。
モータの回転方向を設定できます。
製品情報
モータ電源電圧 | 2.7 ~ 10.8V |
ロジック電源電圧 | 0 ~ 5V |
Amazonで購入できます。
検索 : DRV8833 (R)(\130~\200) Sep/2022
ピン配置
外観
DCモータドライバ(DRV8833(B))
同じIC(DRV8833)の赤い基板と黒い基板のタイプがあります。
識別のためにDRV8833(R)赤い基板とDRV8833(B)黒い基板と識別します。
特徴
DRV8833(R)に比べて4ピン少ないが、できることはDRV8833(R)と同じ。
1個または2個のDCモータを個別に制御ができます。
PWM制御によりモータの回転数を制御できます。
モータの回転方向を設定できます。
製品情報
出力 | 1.5A |
モータ電源電圧 | 3 ~ 10V |
ロジック電源電圧 | – |
Amazonで購入できます。
検索 : DRV8833 (\120~\190) Sep/2022
ピン配置
外観
DCモータ
特徴
小型のラジコンやミニ4駆で使われるモータです。
電流の流れる方向で回転方向、電圧で回転数を制御できますが、今回回転数はPWMにより制御します。
外観
軸には回転がわかるようにするためにシャフトが取り付けてあります。
使ってみて
DCモータと複数のモータドライバをRaspberryPi Picoを使って制御してみました。
md08aは高価で配線が多いですが、モータの回転数が最もなめらだだったと思います(主観)
電気効率が最も良いと想像しています。
DRV8833はRもBも安価で配線が少ないので導入は早いですが、md08aと比べると回転が重そうに感じました。
確認できる方法が見つかりましたら追記します。
DCモータは高速な回転動力を得るために使用します。
ミニ四駆やプラレールなど動きっぱなし用途では手軽に利用できます。
今回紹介したDCモータドライバを使用すれば、回転速度の調整や回転方向の制御を手軽に行うことができました。
ただ、回転量や回転速度の精度を求める制御が難しく、精度の必要な位置決めや、厳格な速度コントロール用途には不向きです。
精度の必要な位置決めや速度制御にはステッピングモータやサーボモータなどが使われます。
準備
使うもの
絵 | 名称(型番) | 用途 |
---|---|---|
汎用DCモータ | 今回の主役。回ってもらいます。 | |
DCモータドライバ TB6612FNG (md08a) | マイコン基板から指示を受け、DCモータを制御する。 | |
DCモータドライバ (DRV8833(R)) | マイコン基板から指示を受け、DCモータを制御する。 | |
DCモータドライバ (DRV8833(B)) | マイコン基板から指示を受け、DCモータを制御する。 | |
制御マイコン基板 RaspberryPi Pico | 回転数や方向を指示するマイコン基板。 | |
制御マイコン基板 RP2040-Zero | RaspberryPi Pico の代わり どちらを使ってもかまいません。 | |
ブレッドボード | マイコン基板、ドライバを配置する。 | |
ジャンパワイヤ 両端ワニ口クリップ | マイコンやドライバとの配線に使用。 | |
バッテリー | モータの電源に使用。 今回充電式電池 単3を2本直列(2.4V)を使用します。 | |
スライド抵抗 | つまみの位置により抵抗が変化します。 モーターの回転数や方向の設定に使用します。 |
ライブラリ
ボードライブラリ
マイコン基板 | ライブラリ |
---|---|
Raspberry Pi Pico | Raspberry Pi RP2040 Boards(x.x.x)※ > Raspberry Pi Pico |
動作 TB6612FNG(md08a)
TB6612FNG(md08a)の配線
Raspberry Pi Pico | 配線色 | TB6612FNG (md08a) | 配線色 | DCモータ | 配線色 | 可変抵抗 | 配線色 | バッテリー |
---|---|---|---|---|---|---|---|---|
3.3V | 赤 | VCC | ||||||
3.3V | 赤 | STBY | ||||||
3.3V | 赤 | 赤 | P1 | |||||
GND | 黒 | GND | 黒 | P3 | 黒 | -minus | ||
GP16 | 緑 | PWMA | ||||||
GP18 | 白 | AIN1 | ||||||
GP19 | 黄 | AIN2 | ||||||
GP28 | 紫 | 紫 | P2 | |||||
VMOT | 赤 | 赤 | +plus | |||||
AO1 | 赤 | M1 | ||||||
AO2 | 黄 | M2 |
スケッチ TB6612FNG(md08a)
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
About Licence当サイトで掲載しているスケッチのライセンスについて OSSの利用について 当サイトで掲載しているスケッチおよびプログラム(以下プログラム)は、Open Source Software(以下OSS)を利用しています。誰でも当サイトに掲載されて...
【スケッチの説明】
Raspberry Pi Pico 基板で使用できます。
DCモータドライバを使用して、DCモータの回転方向と回転速度を制御します。
スライド抵抗の抵抗値を読み出し、中間値より大きい場合は正回転、小さい場合は逆回転します。
中間値から離れるほど回転速度が速くなります。
【ライブラリ】
Raspberry Pi RP2040 Boards(2.3.2) > Raspberry Pi Pico
【準備】
Raspberry Pi Pico - モータドライバ md08a
3.3V -> VCC, STBY
GND -> GND
GP16 -> PWM(速度制御)
GP18 -> AIN1(回転方向1)
GP19 -> AIN2(回転方向2)
Raspberry Pi Pico - スライド抵抗
3.3V -> スライド抵抗電源
GND -> スライド抵抗
GP28 -> 出力
Raspberry Pi Pico - バッテリー
GND -> -
モータドライバ md08a - DCモータ
AO1 -> どちらか
AO2 -> どちらか
モータドライバ md08a - バッテリー
VMOT -> +
【バージョン情報】
2022/7/26 : 新規
**********************************************************************/
#define PIN_POTADC 28 //スライド抵抗からの電圧信号
#define PIN_PWM 16 //PWMによる回転速度制御
#define PIN_DIR1 18 //モータの回転方向1
#define PIN_DIR2 19 //モータの回転方向2
#define ADC_SIZE 1024 //ADCのサイズ(10bit)
#define PWM_SIZE 256 //PWMのサイズ(8bit)
void setup()
{
//各ピンの出力方向の設定
pinMode(PIN_POTADC, INPUT); //固定抵抗は電圧の読み取りを行う
pinMode(PIN_PWM,OUTPUT); //回転速度と方向の出力
pinMode(PIN_DIR1,OUTPUT);
pinMode(PIN_DIR2,OUTPUT);
}
void loop()
{
int pot_adc = analogRead(PIN_POTADC) - (ADC_SIZE / 2); //スライドの位置が半分より左側ならマイナス、右側ならマイナスにする
int pwm = pot_adc / (ADC_SIZE / PWM_SIZE); //ADCの読み取り分解能10bit(1024)を、PWMの設定分解能8bit(256)へ変換する
//速度がマイナス側なら逆転、プラス側なら正転
if(pwm < 0)
{
digitalWrite(PIN_DIR1, LOW);
digitalWrite(PIN_DIR2, HIGH);
}
else
{
digitalWrite(PIN_DIR1, HIGH);
digitalWrite(PIN_DIR2, LOW);
}
//速度の設定を行う。
//マイナスを使うため半値オフセットしていたため、倍にして最大PWM設定値を使用できるようにする。
//整数のみ設定するため、abs()を使う
analogWrite(PIN_PWM, abs(pwm) * 2);
}
結果
動作 DRV8833(R) & DRV8833(B)
DRV8833の動作は簡単にするために可変抵抗を使わないで、回転方向と速度を変更します。
端子が違うので配線はそれぞれ違いますが、同じスケッチを使用します。
配線図では単三2本を使って弱弱しく回転する程度なので、3.7Vバッテリー以上を推奨します。
DRV8833(R)の配線
RP2040 Zero | 配線色 | DRV8833(B) | 配線色 | DCモータ | 配線色 | バッテリー |
---|---|---|---|---|---|---|
GND | 黒 | GND | 黒 | -minus | ||
GP1 | 白 | IN1 | ||||
GP2 | 黄 | IN2 | ||||
VM | 赤 | 赤 | +Plus | |||
OUT1 | 赤 | M1 | ||||
OUT2 | 黄 | M2 |
DRV8833(B)の配線
RP2040 Zero | 配線色 | DRV8833(R) | 配線色 | DCモータ | 配線色 | バッテリー |
---|---|---|---|---|---|---|
GND | 黒 | GND | 黒 | 黒 | -minus | |
GP1 | 白 | AIN1 | ||||
GP2 | 黄 | AIN2 | ||||
VM | 赤 | 赤 | +Plus | |||
AO1 | 赤 | M1 | ||||
AO2 | 黄 | M2 |
スケッチ DRV8833(R) & DRV8833(B)
このスケッチはDRV8833(R)でもDRV8833(B)のどちらでも使用できます。
DRV8833(B)の時はSTBY端子がないので、配線しない状態で使用します。
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
About Licence当サイトで掲載しているスケッチのライセンスについて OSSの利用について 当サイトで掲載しているスケッチおよびプログラム(以下プログラム)は、Open Source Software(以下OSS)を利用しています。誰でも当サイトに掲載されて...
【スケッチの説明】
RP2040 搭載基板で使用できます。
※LogicLevel 3.3Vの基板であれば使用できると思いますが、動作確認はしていません。
DCモータドライバを使ってDCモータの回転方向と回転速度を制御します。
起動後、正回転で徐々に回転速度を上げてから徐々に回転速度を下げていきます。
その後、逆回転で徐々に回転速度を上げてから徐々に回転速度を下げていきます。
【ライブラリ】
Raspberry Pi RP2040 Boards(2.3.2) > Raspberry Pi Pico
【準備】
Raspberry Pi Pico - モータドライバ md08a
3.3V -> STBY ※DRV8833(B)のときは不要
GND -> GND
GP1 -> AIN1(回転方向1)
GP2 -> AIN2(回転方向2)
モータドライバ DRV8833 - DCモータ
AO1 -> どちらか
AO2 -> どちらか
モータドライバ DRV8833 - バッテリー
VM -> +
GND -> -
【バージョン情報】
2022/9/6 : 新規
**********************************************************************/
#define VIN1 1
#define VIN2 2
void setup()
{
pinMode(VIN1, OUTPUT);
pinMode(VIN2, OUTPUT);
}
void loop()
{
int i = 0;
//正回転
digitalWrite(VIN2, LOW);
//回転速度を上げる
for(i = 0; i < 256; i ++)
{
analogWrite(VIN1, i);
delay(10);
}
//回転速度を下げる
for(i = 0; i < 256; i ++)
{
analogWrite(VIN1, 0xff - i);
delay(10);
}
//逆回転
digitalWrite(VIN1, LOW);
//回転速度を上げる
for(i = 0; i < 256; i ++)
{
analogWrite(VIN2, i);
delay(10);
}
//回転速度を下げる
for(i = 0; i < 256; i ++)
{
analogWrite(VIN2, 0xff - i);
delay(10);
}
}
結果
DRV8833(R)の結果
DRV8833(B)の結果
コメント