スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ArduinoでVテールミキサーを作る(かわロボ用)

13070405
競技用ロボット(ここでは「かわロボ」)用に、Attack4WDなどのVテールミキシング機能を持たない安価な送信機からの出力信号で、Vテールミキサー機能を利用できる様にしてみました。今回はリバース動作時グリットブレーキ機能の無いESC×2個を制御できる様にしてあります。

<使用した機材>
プロポ:FUTABA Attack 4YWD(2.4GHz)
ESC:FUTABA MC231CR×2

13070406
まずは受信機にFUTABAの2.4GHz 4chプロポ「Attack 4YWD」を取り付け、マイコンボードに接続します。
基本的には以前作った操縦支援プログラムと、更にその前に作った、ラジコン信号でTA7291Pを使った自作ラジコンの制御プログラムを合体させたものです。
ひとまずは普通に、Vテールミキサーとしてプログラムしてみます。
とりあえずの試作プログラムなので、一部問題点も残っていますが、一通り動作可能になったので参考までにご覧ください。

まずはセットアップからLOOPの手前まで。

// プロトタイプ試作Ver.1.02(ArduinoUno+プロトタイプシールド使用)
#include

int rcv1 = 8; // 1ch目、上下スティックの信号を入力するポート番号を8番に設定
int rcv2 = 9; // 同上、2ch目を9番に設定
int RV1; // 受信機から読み取った1ch目の値を格納する変数
int RV2; // 同上、2ch目

int RVout1; // ESC 1ch目に出力する値を格納する変数
int RVout2; // 同上、2ch目
int inv1; // 1ch目の反転チェック変数
int inv2; // 同上、2ch目

int RV10; // 起動時にプロポの1ch目のニュートラル位置を読み取り格納する
int RV20; // 同上、2ch目


Servo Sout1; // 1ch目のESC出力用変数
Servo Sout2; // 同上、2ch目

// 起動時セットアップ
void setup()
{
pinMode(rcv1,INPUT); // 受信機の信号線を入力するのでINPUT
pinMode(rcv2,INPUT); // 同上

inv1 = 0; // 反転チェック初期値をゼロに設定
inv2 = 0; // 同上

Sout1.attach(4); // 1ch目、ESCへの出力信号をポート番号4番から出力
Sout2.attach(5); // 同上、2ch目を5番から出力

// 起動時にプロポの信号を一回だけ読み取り、これをニュートラル値とする。
RV10 = pulseIn(rcv1,HIGH); // PulseがHIGHになったら計測開始
RV20 = pulseIn(rcv2,HIGH); // 同上
// 注)起動時にプロポのスティックがどこかに傾いていた等した場合
// 正常に動作できなくなるので注意。
// また、電池の残量低下で競技中にリセットがかかる可能性もあるので電源に
// 余裕を持たせておくこと
}


実はsetup()の中に問題点が残っていまして、現時点のプログラムでは、マイコン起動時にプロポのニュートラル位置を読み取って後の制御に利用しています。
これが曲者で、試合中に急に電圧降下が発生してマイコンにリセットがかかった時、気付かずプロポのスティックをどこかの方向に入れたままだと、突然どこか一方向の動作が出来なくなります。
これについては後で改良しようと思います。

で続き。loop()の前半部分、2ch分の入力からESCへの信号出力を決める部分です。


void loop()
{
RV1 = pulseIn(rcv1,HIGH); // PulseがHIGHになったら計測開始
RV2 = pulseIn(rcv2,HIGH); // 同上

// その1:1ch目の値が1550より大きい
if ( RV1 > 1550)
{
if ( RV2 > 1550)
{ // 右折1
RVout1 = RV10;
RVout2 = RV1;
}

if ( RV2 < 1450)
{ // 左折1
RVout1 = RV1;
RVout2 = RV20;
}

if ( RV2 < 1550 && RV2 > 1450)
{ // 前進(又は後進)
RVout1 = RV1;
RVout2 = RV1;
}
}

// その2:1ch目の値が1450より小さい
if ( RV1 < 1450)
{
if ( RV2 > 1550)
{ // 右折2
RVout1 = RV10;
RVout2 = RV1;
}

if ( RV2 < 1450)
{ // 左折2
RVout1 = RV1;
RVout2 = RV20;
}

if ( RV2 < 1550 && RV2 > 1450)
{ // 後進(又は前進)
RVout1 = RV1;
RVout2 = RV1;
}
}

// その3:1chの値が1550~1450の間
if ( RV1 < 1550 && RV1 > 1450)
{
if ( RV2 > 1550)
{ // 右旋回
RVout1 = (1900);
RVout2 = (1100);
}

if ( RV2 < 1450)
{ // 左旋回
RVout1 = (1100);
RVout2 = (1900);
}

if ( RV2 < 1550 && RV2 > 1450)
{ // 入力のまま出力(停止扱い)
RVout1 = RV1;
RVout2 = RV2;
}
}


前に高校の学内ロボコン用に作ったRC制御プログラムの流用です。
今回はモータードライブICへのHigh/Lowではなく、2つのESCに出力するパルス信号の値を(変数で)決めています。
次にloop()後半、準備された変数に基づいて、ESCを制御するプログラム部分です。



// ここからはVer.1.00同様のクローラ未対応ESC制御プログラム

// 1ch目の信号出力
if (RVout1 > 1550)
{
if (inv1==1) {
Sout1.writeMicroseconds(RVout1);
}
else if(inv1==0){
Sout1.writeMicroseconds(RVout1);
delay(100);
Sout1.writeMicroseconds(RV10);
delay(100);
Sout1.writeMicroseconds(RVout1);
inv1=1;
}
}
else
{
Sout1.writeMicroseconds(RVout1);
inv1 = 0;
}


// 2ch目の信号出力
if (RVout2 > 1550)
{
if (inv2==1) {
Sout2.writeMicroseconds(RVout2);
}
else if(inv2==0){
Sout2.writeMicroseconds(RVout2);
delay(100);
Sout2.writeMicroseconds(RV20);
delay(100);
Sout2.writeMicroseconds(RVout2);
inv2=1;
}
}
else
{
Sout2.writeMicroseconds(RVout2);
inv2 = 0;
}

delay(100); // 動作を追いかけやすくする為、0.1秒おきに動作。

}


こちらはほぼ、過去製作の操縦支援プログラムのままです。
トリガータイプのプロポで作ったプログラムなので、if分の信号範囲を2.4GHzプロポ用に調整してあります。
モーターの回転方向等は、各自で調整してみて下さい。

正常に配線、プログラムのダウンロードが出来ると、
13070400
スティックを倒して前進
13070401
13070402
進みながら左右で右左折
13070403
13070404
ニュートラルからスティックを左右に倒す事でその場でターンが出来るようになります。

Vテールミキサーとしての機能はこれで基本部分が完成したのですが・・・なんか競技ロボット用としてはなんとなく物足りない。
前進したまま左右にスティックを振ると右左折・・・一瞬片方の脚が止まるけどそれでいいのか??

と言う事で、これから上記の問題点改良&ミキシングのパターンを変えた「かわロボミキサー」にプログラム変更してみたいと思います。

楽天市場/スーパーwifi

お得なスーパーwifi

さて、稼ぎますか!

楽天市場/お勧め

楽天市場/ホビー

楽天トラベル

amazon/パソコン周辺機器

検索フォーム

更新カレンダー

04 | 2017/05 | 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -

最新記事

携帯用QRコード

QR

Amazon:通販

amazon/TVゲーム

amazon/模型関係

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。