Raspberry Pi 2でDCモーターを制御する
Raspberry Pi 2でDCモーターを制御してみた。
電子工作初心者なので色々間違っているかもしれない。
用意したもの
- Raspberry Pi 2
モータードライバ(TA7291P)
モータードライバー TA7291P (2個入): 半導体 秋月電子通商 電子部品 ネット通販DCモーター(FA-130RA-2270)
DCモーター FA−130RA−2270: パーツ一般 秋月電子通商 電子部品 ネット通販電池ケース(単3電池x2)
電池ボックス 単3×2本用(フタ付プラスチック・スイッチ付): パーツ一般 秋月電子通商 電子部品 ネット通販単3電池2本
モータードライバとは
モーターを制御するための装置。
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の模様。
Raspberry Pi 2 Model B GPIO 40 Pin Block Pinout | element14
配線
テストのためブレッドボード上で配線。
結構配線がグチャグチャになってしまったので写真はやめてブレッドボード図で記す。
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にしたら回転した。
今回は動作確認の為、自動で正転回転を繰り返すだけのプログラムだったけど、
次はコントローラーで制御してみたいなぁ。