Tumblrお久しぶりです。皆さんのおかげで、無事にロボコン、BG財団、Makeと多くのイベントを無事に終了できました。ロボコンでは多くの皆さんのご参加をいただき、たくさんの個性的なロボットが出てきました。モータを5つ以上使ったチームもあり改造に幅が出てきたと思います。これらについては記事をまとめたいと考えていますのでしばらくお待ちいただければと思います。今回の記事は、このモータを5つ以上動かす方法についてまとめたいと思います。6基モータが回せればかなりの改造の幅が広がるかと思います。最新版マニュアルの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[]配列にデータを格納します。格納順は下記のようになります。motorspeed)はmotornomで回転させるモータが選択でき、Motorspeedでモータの回転数が選べる形になっています。Motorspeedは-255~255で速度を指定することができます。今回の作業では、回路側に対してはPWMが流れるようにパターンカットとバイパスを行います。プログラム側では、接続した回路のピンに合わせてMotorDrive関数に分岐を追加することでモータを動かせるようにして、if(receive_end)のループ内にモータ回転に対する命令を組み込むという流れになります。時計回り8方向0-4500-9000-13500-18000-22500-27000-315002.パターン切断まず、もともとつながっている回路のパターンを切断します。これは、もともと不要な接続がArduinoとモータ回路の間で行われているためです。このパターンは、ArduinoMicroのPin4につながっているため、このPin4を今後用いる予定がないならば無理に切断する必要はありません。3.バイパスを接続ArduinoMicroのPin3とモータ回路の接続を行います。写真の青線のようにバイパス線をつないでください。(マニュアルの図8-19は間違っています。)回路の準備はこれだけです。4.MotorDrive関数に書き足しMotorDrive関数に下記のプログラムを書き足してください。コピペすればOKです。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を押したら逆回転、どちらも押してないなら停止するプログラムを示します。//サンプルプログラムは先にVector変数に代入後、データの足切りをしてからMotorDrive関数に入れていが、直接書き込んでも問題ない。0){//Xが押されている//サンプルプログラムは先にVector変数に代入後、データの足切りをしてからMotorDrive関数に入れていが、直接書き込んでも問題ない。・Motor6を使う場合は、PWMがI2Cと干渉することに注意していください。・Servo関数を使う場合、Motor4と5が使えなくなります。おまけ:2018年度までの提供プログラムには追記が必要ですが、mark3test-2018には最初から1~6まで対応した形でプログラムを書いています。これを使う場合は、モータ回転数は下記のコメント範囲の部分でVector変数に代入すれば動きます。PMうまく動作しなくて困っています。電源をつないでプログラムを走らせた時点で正転します。Xボタンを押しても変化無しです。Yボタンを押すと回転がゆっくりになります。PM上に上げた内容の質問者です。解決しました!pinmode設定の部分のpinMode(A0,OUTPUT);//Motor1pinMode(A1,OUTPUT);//Motor2pinMode(A2,OUTPUT);//Motor3pinMode(A3,OUTPUT);//Motor4pinMode(A4,OUTPUT);//Motor5pinMode(9,OUTPUT);//Motor1pinMode(10,OUTPUT);//Motor2pinMode(11,OUTPUT);//Motor3pinMode(13,OUTPUT);//Motor4pinMode(14,OUTPUT);//Motor5の各段落の最初の1行を忘れていたことが原因でした。お騒がせしてすみません。したことですが、解決するとうれしいです。大会でもお世話になります。コメントをキャンセルメールアドレスが公開されることはありません。UsContactAuthorRightsForum。