チラシのうら

レゴとか、工作とか。

8pinoでモーターを回してみる

今回も

研修で戴いた、部材を使って8pinoの活用方法を考えます。

で、こちらのセットを使います。 f:id:tetunori_lego:20150605064605j:plain 初心者向けなので、既に研修講師によって配線されたものが配られました。 何てありがたい

ざっと確認して、モーターと電池は何となくわかりますが、コネクタ2つと金属が飛び出ている黒いIC?はよく解りません。 こちらを深堀してみます。

黒いICの理解

目を凝らしてみると、 f:id:tetunori_lego:20150605064950j:plain TOSHIBA JAPAN
TA7291P 1314G
と読み取れました。早速調べます。

メーカーのサイト や、仕様書 は見れたのですが、イマイチ理解が深まらず。

結局、こちらのサイト が一番良く解説してくれてました。

要は、GPIO 2本でStart, Stop, 回転方向の制御を、PWM 1本で回転速度の制御を、それぞれ行う為のICの様です。

GPIO : 回転方向制御 f:id:tetunori_lego:20150605070242j:plain

コネクタとの結線を確認する

f:id:tetunori_lego:20150605070712j:plain

より、詳しく見るために、ICの裏面に番号をふりました。 f:id:tetunori_lego:20150605074235j:plain 対応表はこちら。

ピン番号 ピン名 8pino側 備考
1 GND GND Ground
2 OUT 1 - モーターに繋ぐ
3 - - 未使用
4 Vref PWM モーター速度制御
5 IN 1 GPIO 回転方向制御
6 IN 2 GPIO 回転方向制御
7 Vcc 5.0v IC駆動用電源
8 Vs - モーター駆動用電源
9 - - 未使用
10 OUT 2 - モーターに繋ぐ

 

8pinoと繋ぐ

f:id:tetunori_lego:20150605075555j:plain GPIOはPin3,4を、PWMにはPin0をそれぞれアサインしてみました。
回転制御をシリアル経由で指示してみたかったので、Pin1,2はシリアル接続しています。
Pin数ギリギリ!

制御仕様

ターミナルから下記の様に指示出します。

char コマンド
m Start motor
x Stop motor
+ Speed up
- Speed down

 
f:id:tetunori_lego:20150605180853j:plain
これで、思うように、モーターを制御する事が出来ました。

デモ 1(レゴ StarWars)

何をデモに使おうかなと、思ったのですが、今年はStarWars yearですし、棚に飾ってあったMaster Yodaに、Episode 2を再現させる事にしました。

結果、やっぱり最強のJediです。

ベイダー卿倒す前に、フォース(回転数)を大きくしています。

楽しくて、止まりません。息子とStarWarsごっこ。

何度、ヨーダが外れて、飛んでいったことか。

デモ 2(レゴ ヘリコプター)

レゴで回ると言えばヘリコプター。 羽の部分を取り外して、モーターに取り付けてみました。
こっちはイマイチ。

以上!

次回は、残り物の部材、最後の一点を使った開発となります。

忘れてた。

コードはこちら。

/*
  8pino Motor Control Test
*/

#include <SoftwareSerial.h>

#define _8PINO_SOFTWARE_SERIAL_PIN_RX ( 1 ) 
#define _8PINO_SOFTWARE_SERIAL_PIN_TX ( 2 ) 

#define _8PINO_PROMPT_STRING ( "\r\n8pino > " )

SoftwareSerial mySerial( _8PINO_SOFTWARE_SERIAL_PIN_RX, _8PINO_SOFTWARE_SERIAL_PIN_TX );

#define _8PINO_MOTOR_SPEED_CTRL_PIN ( 0 )
#define _8PINO_MOTOR_ROTATION_CTRL_PIN1 ( 3 )
#define _8PINO_MOTOR_ROTATION_CTRL_PIN2 ( 4 )

#define _8PINO_MOTOR_DEFAULT_SPEED ( 10 )

#define _8PINO_MOTOR_SPEED_MAX ( 100 )
#define _8PINO_MOTOR_SPEED_MIN ( 10 )
int motor_speed = _8PINO_MOTOR_DEFAULT_SPEED;

void setup(){
  
  // set the data rate for the SoftwareSerial port
  mySerial.begin(4800);
  mySerial.println("");
  mySerial.println("--- Hello! from 8pino... ---");
  mySerial.write( _8PINO_PROMPT_STRING );
  
  pinMode( _8PINO_MOTOR_SPEED_CTRL_PIN, OUTPUT );
  pinMode( _8PINO_MOTOR_ROTATION_CTRL_PIN1, OUTPUT );
  pinMode( _8PINO_MOTOR_ROTATION_CTRL_PIN2, OUTPUT );
  analogWrite( _8PINO_MOTOR_SPEED_CTRL_PIN, motor_speed ); 
  stopMotor();
  
  /*
  // TEST 1
  setRotationCW();
  delay( 1000 );
  stopMotor();
  delay( 3000 );
  setRotationCCW();
  delay( 1000 );
  stopMotor();
  */
}

void loop(){
  
  int tmp_char = 0;
  
  if ( mySerial.available() ){
    tmp_char = mySerial.read();
    if( tmp_char == '\r' ){
      mySerial.write( _8PINO_PROMPT_STRING );
    }else if( tmp_char == '+' ){
      if( motor_speed < _8PINO_MOTOR_SPEED_MAX ){
        motor_speed += 10;
        mySerial.write( tmp_char );
        mySerial.write( "\r\nSpeed Up! : " );
        mySerial.print( motor_speed );
        mySerial.write( _8PINO_PROMPT_STRING );
        analogWrite( _8PINO_MOTOR_SPEED_CTRL_PIN, motor_speed ); 
      }
    }else if( tmp_char == '-' ){
      if( motor_speed > _8PINO_MOTOR_SPEED_MIN ){
        motor_speed -= 10;
        mySerial.write( tmp_char );
        mySerial.write( "\r\nSpeed Down! : " );
        mySerial.print( motor_speed );
        mySerial.write( _8PINO_PROMPT_STRING );
        analogWrite( _8PINO_MOTOR_SPEED_CTRL_PIN, motor_speed ); 
      }
    }else if( tmp_char == 'm' ){
      setRotationCW();
      mySerial.write( tmp_char );
      mySerial.write( "\r\nStart Motor!" );
      mySerial.write( _8PINO_PROMPT_STRING );
    }else if( tmp_char == 'x' ){
      stopMotor();
      mySerial.write( tmp_char );
      mySerial.write( "\r\nStop Motor..." );
      mySerial.write( _8PINO_PROMPT_STRING );
    }else{
      mySerial.write( tmp_char );
    }
  }
}

void stopMotor(){
  
  digitalWrite( _8PINO_MOTOR_ROTATION_CTRL_PIN1, LOW );
  digitalWrite( _8PINO_MOTOR_ROTATION_CTRL_PIN2, LOW );
  
}

void setRotationCW(){
  
  digitalWrite( _8PINO_MOTOR_ROTATION_CTRL_PIN1, HIGH );
  digitalWrite( _8PINO_MOTOR_ROTATION_CTRL_PIN2, LOW );
  
}

void setRotationCCW(){
  
  digitalWrite( _8PINO_MOTOR_ROTATION_CTRL_PIN1, LOW );
  digitalWrite( _8PINO_MOTOR_ROTATION_CTRL_PIN2, HIGH );
  
}