8pinoでモーターを回してみる
今回も
研修で戴いた、部材を使って8pinoの活用方法を考えます。
で、こちらのセットを使います。 初心者向けなので、既に研修講師によって配線されたものが配られました。 何てありがたい
ざっと確認して、モーターと電池は何となくわかりますが、コネクタ2つと金属が飛び出ている黒いIC?はよく解りません。 こちらを深堀してみます。
黒いICの理解
目を凝らしてみると、
TOSHIBA JAPAN
TA7291P 1314G
と読み取れました。早速調べます。
メーカーのサイト や、仕様書 は見れたのですが、イマイチ理解が深まらず。
結局、こちらのサイト が一番良く解説してくれてました。
要は、GPIO 2本でStart, Stop, 回転方向の制御を、PWM 1本で回転速度の制御を、それぞれ行う為のICの様です。
GPIO : 回転方向制御
コネクタとの結線を確認する
より、詳しく見るために、ICの裏面に番号をふりました。 対応表はこちら。
ピン番号 | ピン名 | 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と繋ぐ
GPIOはPin3,4を、PWMにはPin0をそれぞれアサインしてみました。
回転制御をシリアル経由で指示してみたかったので、Pin1,2はシリアル接続しています。
Pin数ギリギリ!
制御仕様
ターミナルから下記の様に指示出します。
char | コマンド |
---|---|
m | Start motor |
x | Stop motor |
+ | Speed up |
- | Speed down |
これで、思うように、モーターを制御する事が出来ました。
デモ 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 ); }