デアゴ サンダーバード2号&救助メカ その16 ミサイル台の電動化

<追記>この改造をすると本体の稼動用のモーターとギア一が入らなくなります。この改造は行わない方がいいです。私もこのギミックを取っ払って修正しました。

デアゴ・サンダーバード2号のミサイルハッチを前回電動化しましたが、今回はミサイル台の方も電動化してみました。

2016_06_16_15_45_54.jpg

こちらの改造は比較的簡単でした。

ただはじめ上下するパーツの部分がガタガタするので少しプラ棒を貼りつけてガタガタを少なくしたのですが、

2016_06_16_15_43_11.jpg

やはり多少ガタつきが残りサーボで動かすには少し心配です。

これ後で気がついたのですが、ボディー下のパーツがあの棒を支えてガタつきが少なくなるようになってたんですね〜。気がつかずに結局改造しちゃいましたw

2016_06_16_13_26_09.jpg

とりあえず、此の棒の部分にサーボのヒンジを取り付けていくのですが、もう少し棒の位置が中央にきて欲しいので

棒を一旦切断して、受け側に穴を開けて棒の位置を移動しました。

2016_06_16_13_26_21.jpg

棒の基部あたりに穴を開けてここにサーボリンケージからのワイヤーを入れていきます。

テストするとワイヤーがこの棒の接続部分で奥に行ったりしてガタつくので、今回は小さなワッシャーを接着しておきました。

2016_06_16_13_26_38.jpg

で、最終的にサーボの位置も決めて此のような感じになりました。

2016_06_16_13_26_49.jpg

右のサーボがハッチを開けるためのサーボで、左の物がミサイル台をせり上げるためのサーボです。

動かした動画がこちら。

ここまでは順調だったのですが、この後にこの2つのサーボを動かすプログラムでドツボにw

3日間くらい悩みましたw

で、vividさんに泣きついて、プログラムを見ていただこうとおもったのですが、ほんの些細なプログラムのミスで動いていないことがわかり、どうにか動作しました。

元のプログラムはvividさんのこちらのプログラムを使用させていただきました。

これを少しいじらせてもらって2つのサーボを制御してみました。

まずは動作を見てもらいましょう。

スピードが少し遅いのでもう少し早くしたいと思います。これは非常に簡単なので後日^^。

スイッチを押すと2つのサーボが連携して動作し、離すと元の状態に戻ります。

プログラムをいじった部分は

まずは点滅設定定義エリアのRB6とRB7の配列の0番を16にします。

此のプログラムでは16という数字がここにあるとなんの動作もしない出力端子になります。

スクリーンショット 2016-06-16 16.15.33.png

次に変数初期設定の部分にそれぞれのサーボのフラッグ sw0fとsw1fを初期設定0で付け足しました。

スクリーンショット 2016-06-16 16.43.23.png

それで、メインプログラムのこのスイッチの動作が記載されている部分を

スクリーンショット 2016-06-16 16.46.56.png

この数行を下のように書き換えました。

この部分のプログラムの動作内容は

スイッチを入れると、サーボ0が動いてハッチを開けて、そこでサーボ0は稼働停止してサーボ1が動き始めミサイル台をせり上げます。スイッチを離すとサーボ1がミサイル台を下げて稼働停止し、その後にサーボ0が再度稼働してハッチを閉めます。

という動作をするために以下のようにプログラムしてみました。

 

if (sw0 == 0){//スイッチが押されたら
if(sw0f==0 && sw1f==0){//サーボ1,0が稼働していないなら
if(current<150){//サーボ0目標150届いていないなら
parameter[11][0]=16;//サーボ1停止
parameter[12][0]=15;//サーボ0を稼働
parameter[12][2] =250;
}
if(current>=150){//サーボ0の目標150に到達したら
parameter[12][0]=16;//サーボ0停止
sw0f=1;//サーボ0目標到達フラッグ1
}
}//ここまででハッチが開いた
if(sw0f==1 && sw1f==0){//サーボ0の目標到達フラッグあり(ハッチ開いている)
current=0;//サーボ1用の初期位置
parameter[12][0]=16;//サーボ0停止
parameter[11][0]=15;//サーボ1稼働
parameter[11][2]=140;//サーボ1の目標値140
sw1f=1;//サーボ1目標到達フラッグ1
}//ミサイルがせり上がった状態
}

else {//スイッチが押されていない時
if(sw0f==1 && sw1f==1){//サーボ0、1の目標到達フラッグ1(ハッチ開、ミサイル上)
if(current>0){//currentは140から
parameter[12][0]=16;//サーボ0を停止
parameter[11][0]=15;//サーボ1を稼働
parameter[11][2]=0;//サーボ1の目標値0
}
if(current<=0){//サーボ1の目標値0到達したら
parameter[11][0]=16;//サーボ1停止
current=150;
sw1f=0;//サーボ1目標到達フラッグ0

} //ここまででミサイルが下がる
}
if(sw0f==1 && sw1f==0){//ここからハッチが閉まる
if(current>0){
parameter[11][0]=16;//サーボ1停止
parameter[12][0]=15;//サーボ0稼働
parameter[12][2]=0;//サーボ0の目標値0
}
if(current<=0){
parameter[11][0]=16;//停止
parameter[12][0]=16;//停止
sw0f=0; //フラッグなし
current=0;
}
}
}

ちなみにはじめは2つのサーボは逆方向に動くと思い込んでいて、プログラムの数字が現在とはかなり違っていました^^;

これでなんとか動画のように動いてくれるようになりました。

はじめから基本的な考え方は間違っていなかったようなのですが、フラッグを立てるタイミングや扱い方が間違っていたようで、結構悩みました^^;

ちなみに、vividさんのこのプログラムは本当よくできていて、今回は2つのサーボ動かしてみましたが、理論上は14個のサーボまで扱えます。まっ、電源と対応するプログラムの改修を行えばですが。

このプログラムで、サーボのみではなくLEDの点滅等も制御できますので、このままコクピットの電飾にも使用する予定です。

なお、vividさんのお許しがあれば後日電飾の設定等すべて終了したら、プログラムをアップしたいと思います。

 

 

 

関連すると思われる記事:

15 comments

  1. こんばんは!

    すごい、すごい!!
    やりましたね!
    かっこ良過ぎます!
    ちゃんとカバーがすーっと開いて、そしてミサイルがぐぐっと出てきて、
    仕舞う時はその逆で、見ていてとても感動します!
    電飾も完成したら是非公開してくださいね!

    ひとつ確認ですが、サーボの動作に、TMR割り込みの改良版の方を御利用ですか?
    サーボ制御パルスの最初の部分をDelay関数に置き換えた方です。
    そのほうがサーボの動きのカクカク感が少ないと思います。

  2. Vividさん こんばんは!

    なんとか2つのサーボをタイミングを変えて動かせました^^;
    フラッグを立てるの考えついていたのですが、そのフラッグの立て方が間違っていていたりしてなかなかうまく動きませんでした。
    今日再度考え直してみて、フラッグの経つ位置を変えてみたら簡単に動いてしまいました^^;
    あとはあのコクピットの電飾を少し作ってサンダーバード2号も少しおあずけ状態に戻します。

    プログラムは改良版の方を使用させていただきました。動きが少しぎこちないのは、サーボのリンケージと繋げているピアノ線が細くて弾性があるからと思われます。まっ、この弾性がパーツやサーボを破損から守ってくれてもいるのですが、なかなか難しいですね。

  3. こんにちは!

    こんなことができるなんてすごいっす!
    めっちゃかっこいいです!
    これからの制作にぜひ使わせてください。

    やばいっす!サンダーバードほしくなりました!^_^;

  4. こんにちは。
    うわ~!
    Vividさんのプログラムをアレンジしてサーボの連動ですか!?
    これって、もともと手動で開閉出来る所だったんですよね?
    それをサーボ稼働に改造してしかもミサイルと連動させるとは…
    動画の動きもカッコイイ!
    素晴らしいです!

    そんな応用の方法も出来るのですね~。
    Vividさんのプログラムが凄いのはもちろんですが、6jiroさんの理解力と応用力のスゴさにも脱帽です。

    理論上14個のサーボ制御が可能ということは、14個とはいかないまでも、3~4個位をこのように次から次と連動させて動かすことも出来るのでしょうか?
    これは凄い!!

    自分も、もうちょっと本腰入れてCを学ばないと、話題について行けなくなってしまいますね…
    というより既について行けてません(>_<;)むぅ

  5. Quasimodoさん こんばんは!

    ありがとうございます!
    サーボの設置は一見難しそうに見えるのですが、実は意外と簡単なんですよ。Quasimodさんレベルの高い工作力あれば簡単にできてしまいます。トライしてみませんか~^^。

  6. mitachi39さん こんばんは!

    ありがとうございます!
    これもmitachi39さんが試されていたvivvidさんのプログラムのおかげなんですよ^^。私は少しいじって使わせていただいただけなんです。
    ですから、mitachi39さんでも出来るので、何か機会があればぜひ試してみてください。
    LEDのチカチカも初め動いたとき感動しますが、サーボでギミックを仕込んでそれがうまく動いた時もまた感動しますよ!
    是非に!

  7. yangminさん こんばんは!

    この部分はもともと手動で開閉するようになっていました。ですからガイドとかはあったので工作自体はそこまで難しものにはなりませんでした。

    正直vividさんのプログラムを見せていただいてから、ワクワクが止まりませんでしたwとりあえず何かに使ってみたくてwちょうどサンダーバード2号のミサイルハッチが目に入ったのでここを改造してみました。

    サーボの動きに関しては、私が説明させていただくのはおこがましいのですが、電源とプログラムを多少いじれば13個(PWM端子を除く)連動も出来ます。ただし、少し制限があります。
    例えば、1個目のサーボを右回りで150まで動かして止めて、2個目のサーボは左回りに250から100まで動かして止めて、3個目のサーボを右回りで120から200まで動かして止めて・・・・・・・。という感じで1つずつ連動させていく場合は基本的に制限はありません。

    さらにいっぺんに複数のサーボを同じ方向に0から動かす場合、1個目は100で止めて、2個目は150で止めて3個目は200で止めて・・・・。も可能です。

    さらに、1個目が50に到達したら2個目50から動き始めて一緒に2つが動く等は可動範囲の制限はありますが、出来ます。ただこれが、1個目が50に到達して2個目が0から動き始めて一緒に動くということはできません。

    無理なのは、1つ目は右回り、2つ目は左回り・・・といった同時に方向が違う場合です。ただ、たぶんvividさんなら可能だととは思いますが^^;

    yangminさんもお気づきだとは思いますが、このプログラムの凄いのは最初の{15,128,0}という配列部分の0個目の数字を変えるとサーボが動いたり止まったり、することなのです。つまり複数のサーボを付けた時にはサーボの選択がこの数字を変えるだけで簡単にできるんですよね。
    なんかあまりうまく伝えられないのですが、ホント凄く便利なプログラムで凄い可能性を持っていると思います。

    私もまだまだ分からないことだらけなので一緒にc勉強していきましょう^^。

  8. ご親切に長文での詳しい解説をありがとうございましたm(_ _)m

    右回り・左回りは数値を昇順か降順に記述すれば良いんですね~!
    しかも同時に逆回りには動かせなくても、連続では動かせるんですね!(-o-)スゴイな~

    > {15,128,0}という配列部分の0個目の数字を変えるとサーボが動いたり止まったり、することなのです。
    そうだったのですか?知りませんでした…というか、最近まで、ゆっくり記事を拝見している時間的余裕がなかったので、ざっと記事とお二人のやりとりを拝見しただけだったのですが、その際、こりゃもう自分には分からないな…(^◇^;)と思って詳しく記述を読んでないんですよ(^^;)

    記述を詳しく読んでもおらず、Vividさんにも伺わないで、この場で6jiroさんに伺うのは変な話かもしれませんが、話が出たので、よろしければ事前知識としてお伺いしたいのですが、「0個目の数字を変えると…」というのは {15,128,0}の最後の「0」の部分の数字を変えるとPICの該当するポート番号が変わり、そのポートに接続しているサーボに制御が切り替わる…ということなのでしょうか?

    ちなみにやっと少し時間が出来てきたので、遅まきながら自分もVividさんのプログラムを、まずは勉強のために、そのままコンパイルしてみようと思って、今までMPLAB X IDE v2.35でアセンブラを使っていて、追加でMPLAB IDE v8.63とMPLAB XC Compilersをインストールしてみたのですが、プロジェクトウィザードからニュープロジェクトでPIC16F876Aを指定してツール選択画面になった時に、Microchip MPLAB XC8 Toolsuite(Cのコンパイラですよね?)が表示されないので選択出来ず、いきなり出鼻を挫かれて、ネットで検索してみてもなぜなのか分からず、途方に暮れ気味です(^o^;)
    今までアセンブラを選択していたのが何らかの問題になっているような気もするのですが…

    6jiroさんは無事にMPLABのインストールも済んでプロジェクト作成も出来たのですよねぇ?
    重ねてのお願いで申し訳ありませんが、もし何かその際の情報(コツ?)がありましたら、
    お教えいただけると助かりますm(_ _)m

  9. こんばんは!
    先のコメントには、色々とご質問を書いちゃってご面倒をお掛けしてすみませんでした。
    Cコンパイラーの件は、たった今、元々使用していた「MPLAB X IDE v2.35」でニュープロジェクトを作成したところ、V1.37のCコンパイラーが選択出来て、無事にビルドが終わりました。
    「MPLAB IDE v8.63」をわざわざインストールして使用してみましたが、必要なかったようですorz
    お騒がせして申し訳ありませんでしたm(_ _;)m

  10. yangminさん こんばんは!

    >右回り・左回りは数値を昇順か降順に記述すれば良いんですね~!
    >しかも同時に逆回りには動かせなくても、連続では動かせるんですね!
    おっしゃる通りです。

    コンパイラーの件は解決したようでよかったです^^。
    質問を受けるのは私も勉強になりますので大歓迎です!
    じつは、コンパイラーの件は聞かれても正直わからなかったかもしれませんが^^;

    で、ご質問の{15,128,0}の部分なのですが、プログラムの場合、数を数える場合0から始まりますよね。0個目というのはこの場合15を指します。128が1個目で0が2個目となります。プログラム中のparameter[12][0]の[12]は点滅設定定義エリアの{1,1,20}(これが0個目)から始まって12個目つまりRB7(サーボ0){16,128,100}のことをを示します。[0]はその{16,128,100}の0番目つまり16を示します。

    この0個目の数字が1〜12なら順次点灯の番号になり、13なら定期点滅で、0ならランダム点滅となり、15ならサーボ稼働となりそれ以外の数字(16とか17とかなんでもです。)その場合はそのポートは稼働停止になります。つまりポートのこの番号を変えるとさっきまでLED点滅のポートだったところがたちまちサーボ稼働用のポートに様変わりするんですね。これがすごいですよね。

    ついでに行くと、{15,128,100}の場合は0個目が15ですのでサーボ駆動、1個目の128はポートの番号(この場合RB7を示します)ですのでここは触ってはダメです。2個目の100はサーボの初期目的数値ですが、ここはスイッチなどで変化させる部分なのでとりあえずの数字で大丈夫です。

    私がスイッチの部分で書いているプログラムはこの0個目の数値を変えることによってサーボを動かしたり止めたりしています。
    parameter[12][0]=16というのはRB7ポートを{16,128,100}と書き換え替えます。これによりそのRB7ポートは停止します。そしてparameter[12][0]=15とするとRB7は{15,128,100}と書き換えられてRB7に接続されているサーボが稼働します。
    また、parameter[12][2]=140というのはポートRB7([12]がポート番号を示していますね。)が {15,128,140}と書き換えられます。これでRB7のサーボが140にめがけて動き始めます。
    そしてcurrentは現在のサーボの角度を示しますので、その数値を条件文に入れて何度の角度になったら今のサーボが停止して次のサーボが稼働してねという命令を書いています。

    yangminさんには是非cを理解して欲しいです。あれだけの作品を作られるので、このプログラムを使えばきっと凄い作品を作られると思います!
    私で分かることでしたらお答えしますのでいつでもどうぞ^^。

  11. こんにちは。
    投稿出来ていなかったとの事でしたので、前回の内容を思い出しながらもう一度挑戦してみました(^o^;)

    夜遅い時間にも関わらず、大変丁寧なご説明を本当にありがとうございました。

    無事にコンパイル出来た時はホッとしました。
    そういえば、以前Cに挑戦しようとコンパイルしようと思ったら、同じようにコンパイル出来ず、出鼻を挫かれて嫌になって諦めたことを思い出しました(苦笑)

    「0個目」と仰っていたのは、最初のLED点滅設定用のパラメーター(順次[0-12]・定期[13]・ランダム[14]・サーボ[15]・無効[16-])指定箇所の事だったのですね。

    parameter[12][0]というのは、12個(行?)目の定義の0桁目というように見れば良いのですね~。

    それで、
    parameter[12][0]=16;//サーボ0停止
    parameter[11][0]=15;//サーボ1稼働
    などは、
    12個目(サーボ0が接続されているRB7ポート用)の内容を{16,128,100}に、
    11個目(サーボ1が接続されているRB6ポート用)の内容を{15,64,0}に、
    変えるということになるのですね?

    そしてスイッチが押された事によりsw0fとsw1fの状態を変化[0][1]させて、
    比較して条件によってサーボ0とサーボ1を制御しているのですね。
    その時に同時にparameter[12][2] =250とサーボの目標値も変えているので、
    順次制御でなら制御可能という考え方で良いのでしょうか?

    それにしても、このようなプログラムアレンジを思い付くなんて凄いです!
    そして、このようなプログラムを開発出来るVividさんは物凄いです!!

    サーボの回転方向については、Vividさんのプログラム内の
    targetとcurrentの比較判断によって、
    減算・加算でサーボの回転方向が変わるのですよね?
    (この機構も凄いです!)

    度重なるご質問となり申し訳ありませんが、
    分からないのでよろしければ教えていただきたいのですが
    「メインプログラムのこのスイッチの動作が記載されている部分を」の下の
    プログラム内容を抜粋していただいている画像ですが
    コメントが「//SWがON(0)ならサーボパラメータを20に」となっていますが、
    「//SWがON(0)ならサーボパラメータを0に」ではないのでしょうか?

    その下のテキストで書かれたプログラムの6行目の
    parameter[12][2] =250;
    ですが、サーボ0の目標値を250にしているということになりますよね?
    これはif(current>=150でcurrentが150(本当の目標値?)になるまで動作させるため、
    150より上の「上限値(250)」を入れているという考えでよろしいのでしょうか?

    以上2点なのですが、
    またちんぷんかんぷんな事をいっているようでしたら、すみませんm(_ _;)m

  12. yangminさん こんにちは!

    再度のコメント本当お手間をかけさせてしまい申し訳ありませんでしたm(_ _)m

    なるほど!以前もコンパイルでつまずかれていたんですね・・・。今回は上手くいって本当よかったです。

    プログラムについてのご質問については、全くおっしゃる通りで正しいです。
    Cの配列は初めなかなかわかりにくいですよね。

    サーボの可動停止について、配列の0個目。スイッチのフラッグについてはサーボの切り替え条件。とyangminさんのおっしゃる通りです。このフラッグを立てるという考え方がなかったらサーボの切り替えができなかったと思います。で、このフラッグの考え方は、実はカウンタックのプログラムの時にも使っていたので、その応用でした^^。さらに言えば、このフラッグの立て方がおかしくて上手く作動せずに悩んでいたところでもあります^^;最初の変数定義でのsw0f=0を、sw0f1として変数の宣言だけして、初期値0が入っていなかったのでif文が上手く動かないという、超初歩的なミスしていましたw

    プログラムを作ることはできませんが多少はアレンジできるようになってきました^^。もともとこのプログラムがすごい可能性を秘めているのでできたことです。

    サーボの方向性もyangminさんのおっしゃる通りで、始動前にcurrentを指定すると、その位置からの目標値を入れることでサーボを望む方向に動かせます。

    >コメントが「//SWがON(0)ならサーボパラメータを20に」となっていますが、
    >「//SWがON(0)ならサーボパラメータを0に」ではないのでしょうか?
    そうですね。この部分はvividさんのプログラムの記載が20となってるままを写真で撮りましたのですが、書き間違えと思います。

    parameter[12][2] =250;の部分もyangminさんのおっしゃる通り、ただそっち方向に動かして150まで来たら止まるので、150以上の数字を入れてあるだけで、深い意味はありません。

    yangminさんすごく理解されていると思います。アセンブラとCも理解されるとは凄いですね。私なんてアセンブラはチンプンカンプンです^^;
    些細なことでもわからないことあればコメントください。私で分かる範囲ならお答えしますね^^。ただ・・・・難しいことはvividさんへw

  13. こんばんは!

    度々の返信と回答をありがとうございました。
    コメント欄の「20」は当初からの記述だったのですね(^0^;)
    このあたりでも、ちゃんと目を通していないのがバレてしまいますね、お恥ずかしいです(-.-;)

    6jiroさんのとても分かり易い配列の読み方の説明とプログラム内のコメント文のおかげで、やっと少し分かるようになっただけなのですが、少しだけ前進出来たような気がします。
    お手数をお掛けして申し訳ありませんでした。

    本来Vividさんへ伺うべき内容もあったのだろうと思いますが、何をどう聞いて良いのかも分からない状況だったので助かりました。

    長文のご質問にお付き合いいただきまして、本当にありがとうございましたm(_ _)m

  14. yangminさん こんにちは!

    私自身が結構配列に慣れるまで苦労したので、yangminさんが理解しにくいだろうな〜というところがよくわかります^^。
    プログラムの学習も独学なので、多分ここがわかりにくいだろうな〜というところがなんとなくわかります。実際今回のプログラムでも、実は、前の条件でサーボを停止させているので、再度停止命令出さなくてもいいのですが、再度停止命令を記載していたりしています。たぶんyangminさんなら気づかれていると思いますが^^。

    学校の勉強でも先生に聞くには聞きにくいが同級生なら聴きやすいしわかりやすいと言う場合あるじゃないですかwあれと同じですよね。なにか疑問に思ったら聞いてくださいね。私も勉強になりますので。
    それと、vividさんのプログラムはすごく細かく解説が入っています。ただプログラムを公開してくださっているだけでなく、わかりやすいように解説まで入っています。相当なお時間をかけて作られていると思います。この解説を読んで、さらにそのプログラムのブログ記事とコメントを読むと理解が深まると思います。

Leave a Reply

メールアドレスが公開されることはありません。

wp-puzzle.com logo