カイワレスタイル

ゲーム、アニメ、プログラム、興味のあることをツラツラと。

Raspberry Pi 2でDCモーターを制御する

Raspberry Pi 2でDCモーターを制御してみた。
電子工作初心者なので色々間違っているかもしれない。


用意したもの


モータードライバとは

モーターを制御するための装置。
2つの入力信号によってを正転/逆転/ストップ/ブレーキの制御が可能になるらしい。
またPWM制御によって回転数も調整できるらしい。

TA7291Pの端子と役割は以下のとおり。

PIN 端子記号 説明
1 GND Raspberry piと電池のGNDと共有
2 OUT1 モーター側へ
3
4 Vref モーター側出力制御用。固定にするならRaspberry Piの3.3vへ。今回は制御するのでGPIO 18へ
5 IN1 入力端子。GPIO 14へ
6 IN2 入力端子。GPIO 15へ
7 Vcc 制御回路用電源端子。Raspberry Piの5vへ
8 Vs モーター側電源(電池)の+へ
9
10 OUT2 モーター側へ

Raspberry Pi 2のピン配置

Raspberry Pi 2のピン配置は以下のとおり。
ボードの一番角にあるのがPin#02の模様。

f:id:kaiware007:20150707020542p:plain

Raspberry Pi 2 Model B GPIO 40 Pin Block Pinout | element14


配線

テストのためブレッドボード上で配線。
結構配線がグチャグチャになってしまったので写真はやめてブレッドボード図で記す。

f:id:kaiware007:20150707020237p:plain


Raspberry Pi 2側の準備

WiringPiをインストールする。
wiringPiを使うにはI2Cライブラリも入れる必要があるらしい。
wiringPi自体はgitから落としてビルドする必要がある。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libi2c-dev
git clone git://git.drogon.net/wiringPi
cd wiringPi/
./build

ビルドが成功すればインストール完了。
gpioコマンドが実行できればインストール成功。

gpio -v
gpio version: 2.26
Copyright (c) 2012-2015 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Model 2, Revision: 1.1, Memory: 1024MB, Maker: Sony 

試しにターミナルから直接制御してみる。

gpio -g mode 14 out
gpio -g mode 15 out
gpio -g write 14 1 // 正転
gpio -g write 14 0 // ストップ
gpio -g write 15 1 // 逆転
gpio -g write 15 0 // ストップ

プログラム

動作確認のため、5秒正転、5秒逆転、5秒停止のプログラムを作成。

vim motorTest.cpp

以下、ソースコード

#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <unistd.h>

#define MOTOROUT1 14
#define MOTOROUT2 15
#define MOTORPWM 18
#define POW 1024

int main(void) {
    int i = 0;

    if ( wiringPiSetupGpio() == -1) {
        printf("setup error");
        return 1;
    }

    pinMode(MOTOROUT1, OUTPUT);
    pinMode(MOTOROUT2, OUTPUT);
    pinMode(MOTORPWM, PWM_OUTPUT);

    digitalWrite(MOTOROUT1, 0);
    digitalWrite(MOTOROUT2, 0);
    digitalWrite(MOTORPWM, 0);

    while(1) {
        printf("forward\n");
        digitalWrite(MOTOROUT1, 1);
        pwmWrite(MOTORPWM, POW);
        sleep(5);
        
        pwmWrite(MOTORPWM, 0);
        digitalWrite(MOTOROUT1, 0);
        usleep(50000);
        
        printf("back\n");
        digitalWrite(MOTOROUT2, 1);
        pwmWrite(MOTORPWM, POW);
        sleep(5);

        pwmWrite(MOTORPWM, 0);
        digitalWrite(MOTOROUT2, 0);
        printf("STOP\n");
        sleep(5);
    }

    return 0;
}

そしてビルド。-lwiringPiが必要。

g++ motorTest.cpp -lwiringPi

実行はroot権限が必要だった。

sudo ./a.out

GPIO18でPWM制御して出力を調整するようにしたが、512だと出力が弱すぎるのかモーターが回転しなかった。
768〜1024にしたら回転した。

今回は動作確認の為、自動で正転回転を繰り返すだけのプログラムだったけど、
次はコントローラーで制御してみたいなぁ。