スポンサーサイト

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

かわロボミキサー

13070702

只今最後の仕上げ中!!
前回の記事で触れた「前進中にそのまま旋回したい」希望を盛り込んだArduino用プログラムに書き換えてみました。

言うならVテールミキサーならぬ「かわロボミキサー」といったところでしょうか。

続きを読む

スポンサーサイト

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

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

Arduinoプラグイン「ArduBlock」

13052000
手軽なマイコンボードArduinoのプログラム環境を、プログラム言語を知らない段階から利用したい。
できればすぐにでもマイコンボードを動かしたい。
という、一件無茶な要求にも答えられる環境がArduinoIDE用のプラグインとして提供されています。

「ArduBlock」(英語サイト)

プラグインの追加の仕方や簡単な使い方は、「IDEA★HACK」のページを見ると比較的良く分かります。

13052001
少々独特(笑)な日本語化された環境で、簡単にプログラムを組むことが出来ます。

まず言語やソースコード構築の仕方が分からない段階ではArduBlockで、生成されたソースコードを見てなんとなく分かってきたらArduinoIDEで直にソースを書く、といった段階的な学習に向いていると思います。
【送料無料】電脳Arduinoでちょっと未来を作る

【送料無料】電脳Arduinoでちょっと未来を作る
価格:1,890円(税込、送料込)




Arduinoを、PS2ワイヤレスコントローラで動かす(2)

とりあえず動かしてみたプログラムを紹介します。

今回は

・ 十字キー+LRキーは押されている間走行を続ける
・ ○△□×キーは、押されたタイミングで一回だけ動作
・ スタート/セレクトキーは今回動作無し
・ 振動は無し(デュアルショックなのに・・・w)

で作っています。

<<<<< 参考プログラム >>>>>

#include // PS2コントローラ対応ライブラリ読み込み

PS2X ps2x; // コントローラクラスを生成

int error = 0; // エラー変数とタイプ識別は今回使っていません
byte type = 0;
byte vibrate = 0;


void Front() // 前進
{
analogWrite(5,0);
digitalWrite(9,HIGH);
analogWrite(6,0);
digitalWrite(8,HIGH);
}

void LTurn() // 左旋回
{
analogWrite(5,0);
digitalWrite(9,HIGH);
analogWrite(6,250);
digitalWrite(8,LOW);
}

void LFTurn() // 左前方カーブ
{
analogWrite(5,0);
digitalWrite(9,HIGH);
analogWrite(6,0);
digitalWrite(8,LOW); //125
}

void LBTurn() // 左後方カーブ
{
analogWrite(5,250);
digitalWrite(9,LOW);
analogWrite(6,0); //125
digitalWrite(8,LOW);
}

void RTurn() // 右旋回
{
analogWrite(5,250);
digitalWrite(9,LOW);
analogWrite(6,0);
digitalWrite(8,HIGH);
}

void RFTurn() // 右前方カーブ
{
analogWrite(5,0);
digitalWrite(9,0); //125
analogWrite(6,0);
digitalWrite(8,HIGH);
}

void RBTurn() // 右後方カーブ
{
analogWrite(5,0); //125
digitalWrite(9,LOW);
analogWrite(6,250);
digitalWrite(8,LOW);
}

void Rear() // 後進
{
analogWrite(5,250);
digitalWrite(9,LOW);
analogWrite(6,250);
digitalWrite(8,LOW);
}

void Stop()
{
analogWrite(5,255);
digitalWrite(9,HIGH);
analogWrite(6,255);
digitalWrite(8,HIGH);
}

void setup()
{
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);

Serial.begin(57600);

}

void loop()
{
ps2x.read_gamepad(false, vibrate); // コントローラのバイブレーション機能を使用できるようにしておきます

// if(ps2x.Button(PSB_START))
// {
// }
// if(ps2x.Button(PSB_SELECT))
// {
// }

if(ps2x.Button(PSB_PAD_UP))
{ // Front
Front();
delay(50);
}
if(ps2x.Button(PSB_PAD_RIGHT))
{ // Right
RTurn();
delay(50);
}
if(ps2x.Button(PSB_PAD_LEFT))
{ // Left
LTurn();
delay(50);
}
if(ps2x.Button(PSB_PAD_DOWN))
{ // Rear
Rear();
delay(50);
}
if(ps2x.Button(PSB_L1))
{
LFTurn();
delay(50);
}
if(ps2x.Button(PSB_R1))
{
RFTurn();
delay(50);
}
if(ps2x.Button(PSB_L2))
{
LBTurn();
delay(50);
}
if(ps2x.Button(PSB_R2))
{
RBTurn();
delay(50);
}


if (ps2x.NewButtonState()) // 新しくボタンが押された時の処理(押しっぱなしは1回のみ入力)
{
if(ps2x.Button(PSB_GREEN))
{
Front();
delay(50);
}
if(ps2x.Button(PSB_RED))
{
RTurn();
delay(50);
}
if(ps2x.Button(PSB_PINK))
{
LTurn();
delay(50);
}
if(ps2x.Button(PSB_BLUE))
{
Rear();
delay(50);
}

}

Stop();
delay(30);
}

Arduinoを、PS2用ワイヤレスコントローラで動かす

12120900
先日のラジコンに続き、今度はPS2コントローラいってみました。

世界中で使われているArduinoですから、
一通り思いつくものは大体誰かしらがもうやっているというww

すごい量のデータや資料が世の中にあふれている、とても便利で
手軽なマイコン環境です。初心者から人柱(爆)までお勧めです。

今回は(今回もw)とても判り易い説明をして頂けている
「ROBOMIC」様のブログ記事を参考にさせてもらいながら
デュアルショックのワイヤレスコントローラで動かしてみました。

車台は「ロボット技術検定」4級試験キットのものをほぼそのまま
使用しています。



Arduinoでラジコン受信機を読み取る(2)

作ってみたプログラムを忘れないうちに。

12120200
前回2つの信号を読み取るところまではやったので、
信号の値を比較して模型戦車が動かせる様にプログラムをしてみます。

12112900
画像は使いまわしw
目標はラジコンのVテールっぽい動きをする事なので、
スロットルとステアリングの値で動作の関係を表にして、
動作の条件式を明確にします。

12120201

Arduinoのプログラミング構成の一例。
スロットルがそれぞれ
 「引かれている時」
 「戻されている時」
 「ニュートラルの時」
の、ステアリングの状態によって動作を決めるif命令分を
書きます。

<<<<<以下、参考プログラム>>>>>

// 参考プログラムその2

// ラジコン受信機のパルスを読みとるビットを設定。
int rcv1 = 5; //1ch目、スロットル
int rcv2 = 6; //2ch目、ステアリング
int RV1 = 0; // 1ch目読み取り用変数
int RV2 = 0; // 2ch目読み取り用変数

// モータ制御にはモータドライブIC「TA7291P」を
// 試用します。
// 3番、9番ピンをモータ1、10番、11番ピンをモータ2
// の制御に使用します

void setup()
{
pinMode(rcv1,INPUT); // 受信機の信号線を入力するのでINPUT
pinMode(rcv2,INPUT); // 同上

// 今回は操縦プログラムにするので、シリアル通信は無し
}

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

// 以下、スロットルとステアリングの値による条件分岐
// 実際に値は使用する送信機の仕様で異なります。
// 今回は1ch目 1900~1500~1100、
// 2ch目 1700~1500~1300 の範囲で変化する
// タイプのプログラムになっています。

// その1:1ch目の値が1700より大きい
if ( RV1 > 1700)
{
if ( RV2 > 1600)
{ // 右折
analogWrite(3,0);
analogWrite(9,0);
analogWrite(10,0);
analogWrite(11,125);

delay (30);

}
if ( RV2 < 1400)
{ // 左折
analogWrite(3,0);
analogWrite(9,125);
analogWrite(10,0);
analogWrite(11,0);

delay(30);

}
if ( RV2 < 1600 && RV2 > 1400)
{ // 前進
analogWrite(3,0);
analogWrite(9,125);
analogWrite(10,0);
analogWrite(11,125);

delay(30);

}
}

// その2:1ch目の値が1300より小さい
if ( RV1 < 1300)
{
if ( RV2 > 1600)
{ // 右後方
analogWrite(3,0);
analogWrite(9,0);
analogWrite(10,125);
analogWrite(11,0);

delay(30);

}
if ( RV2 < 1400)
{ // 左後方
analogWrite(3,125);
analogWrite(9,0);
analogWrite(10,0);
analogWrite(11,0);

delay(30);

}
if ( RV2 < 1600 && RV2 > 1400)
{ // 後進
analogWrite(3,125);
analogWrite(9,0);
analogWrite(10,125);
analogWrite(11,0);

delay(30);

}
}

// その3:1chの値が1700~1300の間
if ( RV1 < 1700 && RV1 > 1300)
{
if ( RV2 > 1600)
{ // 右旋回
analogWrite(3,125);
analogWrite(9,0);
analogWrite(10,0);
analogWrite(11,125);

delay(30);

}
if ( RV2 < 1400)
{ // 左旋回
analogWrite(3,0);
analogWrite(9,125);
analogWrite(10,125);
analogWrite(11,0);

delay(30);

}
if ( RV2 < 1600 && RV2 > 1400)
{ // 停止
analogWrite(3,0);
analogWrite(9,0);
analogWrite(10,0);
analogWrite(11,0);

delay(30);

}

}

}



楽天市場/スーパー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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。