Mark3にモータを増設する方法(サンプルも公開)

Pocket
このエントリーを Google ブックマーク に追加

お久しぶりです。

皆さんのおかげで、無事にロボコン、BG財団、Makeと多くのイベントを無事に終了できました。

特にロボコンでは多くの皆さんのご参加をいただき、たくさんの個性的なロボットが出てきました。

モータを5つ以上使ったチームもあり改造に幅が出てきたと思います。

これらについては記事をまとめたいと考えていますのでしばらくお待ちいただければと思います。

 

さて、今回の記事は、このモータを5つ以上動かす方法についてまとめたいと思います。

6基モータが回せればかなりの改造の幅が広がるかと思います。

Mark3で複数のモータを回す方法

  1. プログラムの基本的な構造
  2. パターン切断
  3. パイパスを接続
  4. MotorDrive関数に書き足し
  5. SerialRead関数のコメントアウト
  6. コントローラに対応する任意のプログラムを書き込む
  7. 注意事項

1.プログラムの基本的な構造
最新版マニュアルのP91と同様の内容を書いています。
Mark3におけるプログラムはPCソフトウェアとArduinoプログラムの二つに分かれています。

PCソフトウェアの役割は3つです。
・コントローラの値を取得する
・シリアル通信でコントローラの値を送信する
・カメラがつながれている場合にカメラのデータを表示する

Arduinoの役割は3つです.
・シリアル通信で得た値をモータ出力の形に変換する
・センサの値を読み込む(プログラムした場合)
・シリアル通信でセンサなどの値をソフトウェアに送り込む(プログラムした場合)

本プロジェクトとしては、参加者側がPC側のソフトを改変することは考えていません。
(希望者がソフトを自作することを妨げるものではありません)
Arduino側のプログラムを改変することで動作を変更する方向で開発しています。

そこで、Arduinoのプログラムを説明していきます。
なお、今回の記事に合わせてプログラムを改変しました。
従来のプログラムに改変改変して使うこともできますが、こちらを使う方が楽かと思います。
DataLibraryにファイルをアップしておりますので,そちらでご確認ください.

プログラムの構造は上の様になっています。
大きく分けて、setup関数、Loop関数、SerialRead関数、MotorDrive関数の4つです。

setup関数は、変数とPINを初期化しています。

Loop関数は無限ループが組み込まれています。
SerialRead関数で読み込んだPCから来たコントローラのデータがすべてそろった場合、
if(receive_end)の分岐に入ります。
分岐に入ると、コントローラの値からモータの回転数に変換が行われます。
モータの動きを変更する場合はココの部分を書き換えれば大丈夫です。

SerialRead関数は、シリアルで送られてきたコントローラのデータを蓄積し、
すべての揃った段階でChkstr[]配列にデータを格納します。
格納順は下記のようになります。

MotorDrive(char motornom,int motorspeed)はmotornomで回転させるモータが選択でき、Motorspeedでモータの回転数が選べる形になっています。
Motorspeedは-255~255で速度を指定することができます。

今回の作業では、回路側に対してはPWMが流れるようにパターンカットとバイパスを行います。プログラム側では、接続した回路のピンに合わせてMotorDrive関数に分岐を追加することでモータを動かせるようにして、if(receive_end)のループ内にモータ回転に対する命令を組み込むという流れになります。

chkstr配列の格納変数表(int)で格納

chkstr[0]=左軸横(右が正) 255~-255 chkstr[1]=左軸縦(上が正) 255~-255 chkstr[2]=右軸縦(上が正) 255~-255 chkstr[3]=右軸横(右が正) 255~-255
chkstr[4]=A(押下で1) chkstr[5]=B(押下で1) chkstr[6]=X(押下で1) chkstr[7]=Y(押下で1)
chkstr[8]=LB chkstr[9]=RB chkstr[10]=Back chkstr[11]=Start
chkstr[12]=左軸おしこみ chkstr[13]=右軸おしこみ chkstr[14]=NC chkstr[15]=NC
chkstr[16]=方向キー デフォルト-1 時計回り8方向
0-4500-9000-13500-18000-22500-27000-31500

 

2.パターン切断

まず、もともとつながっている回路のパターンを切断します。これは、もともと不要な接続がArduinoとモータ回路の間で行われているためです。このパターンは、ArduinoMicroのPin4につながっているため、このPin4を今後用いる予定がないならば無理に切断する必要はありません。

 

3.バイパスを接続

ArduinoMicroのPin3とモータ回路の接続を行います。
写真の青線のようにバイパス線をつないでください。
(マニュアルの図8-19は間違っています。申し訳ありません。)

回路の準備はこれだけです。

 

4.MotorDrive関数に書き足し

MotorDrive関数に下記のプログラムを書き足してください。
コピペすればOKです。

case 1://活用にはバイパスが必要
 analogWrite(3,(-1) * motorspeed);
  if(motorspeed <= 0){
    digitalWrite(A0,LOW);
  }else{
    digitalWrite(A0,HIGH);
  }
  break;
case 6:
  analogWrite(11,(-1) * motorspeed);
  if(motorspeed <= 0){
    digitalWrite(A5,LOW);
  }else{
    digitalWrite(A5,HIGH);
  }
  break;

5.SerialRead関数のコメントアウト

SerialRead()上にある下記のプログラムをコメントアウトしてください。
digitalWrite(11,HIGH);
digitalWrite(11,LOW);
これはArduinoMicro上で通信中にLEDを光らす処理を止める作業です。
MotorDrive関数上にあるPWMピンにPIN11を用いるため、これを残していると干渉して挙動が安定しないためです。
これですべての動作準備が整いました。
対応するモータドライブ基盤を作り、コントローラの指示で動く回路を追加すれば動作させられます。

6.コントローラに対応する任意のプログラムを書き込む

後は、loop(){}内にあるif(recieve_end){}内にモータコントロール系の命令を入れれば命令に沿ってどうさせることができます。
サンプルとして、下記にボタンXが押されているときにM1モータを正回転、ボタンYを押したら逆回転、どちらも押してないなら停止するプログラムを示します。

if(chkstr[6] != 0){
 //Xが押されている
 //サンプルプログラムは先にVector変数に代入後、データの足切りをしてからMotorDrive関数に入れていが、直接書き込んでも問題ない。
 MotorDrive(1,255);//M1
}else if(chkstr[7] != 0){
 //Yが押されている
 MotorDrive(1,-255);//M1
}else{
 //どちらも押されていない
 MotorDrive(1,0);//M1
}

7.注意事項

・Motor6を使う場合は、PWMがI2Cと干渉することに注意していください。
・Servo関数を使う場合、Motor4と5が使えなくなります。

おまけ:2018年度までの提供プログラムには追記が必要ですが、mark3test-2018には最初から1~6まで対応した形でプログラムを書いています。
これを使う場合は、モータ回転数は下記のコメント範囲の部分でVector変数に代入すれば動きます。

//コントローラ命令を書き込む部分ここから
//コントローラ命令を書き込む部分ここまで

 

“Mark3にモータを増設する方法(サンプルも公開)” への3件の返信

  1. うまく動作しなくて困っています。
    このページを参考にして、というよりもほとんどまねて、
    ジャンパ線もつなぎ、
    4.MotorDrive関数に書き足し
    5.SerialRead関数のコメントアウト
    6.コントローラに対応する任意のプログラムを書き込む
    をして
    M1をXボタンで正転とYボタンで逆転を目指しましたが、
    電源をつないでプログラムを走らせた時点で正転します。
    Xボタンを押しても変化無しです。
    Yボタンを押すと回転がゆっくりになります。
    どのあたりをチェックするといいのでしょうか?御教示願います

    1. 上に上げた内容の質問者です。
      解決しました!
      pinmode設定の部分の

      pinMode(A0,OUTPUT);//Motor1
      pinMode(A1,OUTPUT);//Motor2
      pinMode(A2,OUTPUT);//Motor3
      pinMode(A3,OUTPUT);//Motor4
      pinMode(A4,OUTPUT);//Motor5

      pinMode(9,OUTPUT);//Motor1
      pinMode(10,OUTPUT);//Motor2
      pinMode(11,OUTPUT);//Motor3
      pinMode(13,OUTPUT);//Motor4
      pinMode(14,OUTPUT);//Motor5

      の各段落の最初の1行を忘れていたことが原因でした。
      お騒がせしてすみません。ちょっとしたことですが、解決するとうれしいです。では大会でもお世話になります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です