前回リミットスイッチの設置を行いましたので、今回はそのプログラム編です。
これは盛大にハマりましたよ~~~www
あっ、まず大前提として各パートのarduinoが起動したら、ギア、翼、キャノピー関係は閉じる方向に一旦動きリミットスイッチを押します。エルロンは一旦上方限界まで動いてリミットスイッチを押した後にセンターに戻ります。
まずは脚パートのメインギア可動用のリミットスイッチですが、ここは前回でもご紹介した通り結構すんなり進んで、徹底安全プログラムとしました。
1,リミットスイッチを押すと止まる
2,もし閉鎖方向で一定時間リミットスイッチが押されなければ、故障として機能停止後ランディングライトが1分間点滅
3,開く方向には一定の時間可動して止まる。
4,ちょっとでも開く方向に動いて停止した場合は、リミットスイッチを一旦押さないと開く方向には動けない。
てな感じで徹底的に管理ww
で、この辺は結構すんなり出来ましたw
ただ、これが組み立ててI2Cで動かそうとするべクターノズルがおかしいwwww
ランデイングギアとか他の機能は全部動くのでI2C自体はちゃんと動いていますし、ベクターノズルの離陸前の可動テスト自体は動くのです。単体で動かそうとすると動かない・・・・・・
なんでだ・・・・・と悩む事2日w
これがスレイブ側のプログラムの一部です。xという数字がマスターから送られてくる信号です。
254のコマンドではベクターノズルは完全に動いています。
50~55のコマンドではベクターノズルが全くうごきませんw
気が付かれましたww???????
そうなんですよwww
動いていないコマンドの部分ではvector_upとかの関数の後ろに()が無いんですよwwww
これでコンパイル通っちゃうんですよねwwww
これらに()を書き加えるだけで簡単に治りましたww
で、次の問題児は機体内部のI2C会員番号10番のarduino!
コイツは翼の開閉のステップモーター、エルロンのDCモーター、キャノピーのDCモーター、ノーズギアのDCモーターを制御しています。
同時可動を実現するために、モーターの可動時間はタイマー割り込みで管理しています。
とりあえず脚パートと同じような仕様でプログラム組んでみました。
このフラッグのための変数の多さがその面倒さをよく表していると思いますwww
で、見て頂きたいところは最後の2行w
これエルロンの動き用の時間を決めるフラッグなのですが、この位細かく分岐させないといけませんw
初めは左右同じ時間で動かしていたのですが、何回か右ロール、左ロール、アップ、ダウンを繰り返すと
センター状態で終わったはずなのにwwwwwwwww
全然左右で有っていませんw
同じモーター、同じ構造なのにこれだけの差が出てしまいます。
もしこの状態でエルロンをダウンに動かせば・・・・・・
モーターがギリギリギリ―――――――――ッ!!
の音と共にまた故障ですwてか、また一回壊しましたwwww
前回の故障したギアでの予備ギア有りましたのでそれで修復^^
てなことで各動きの時間をそれぞれ実際に動かしながら決定して
これだけ動いてセンターがあの位合っていたらとりあえず合格点ですw
正直この調整とプログラム調整で2日位費やしましたよwww
なんせ、まず、ギミック自体がワイヤー使っているのでリッジドに動いていなく、毎回微妙に違いが有ったり、ワイヤーの閉まる方向緩む方向での違いも有ります。
さらに、どこまで動かせるかですね。動きが少ないと安全ですが、見た時動き少なくてつまらない。
バランス取っていくのがホント大変でしたww
この辺アシェットはよく考えられてて(ある意味ちょっとずるいw)、
センターボタンはもちろん有って、一旦下に動いてセンターに戻る動作をします。この動作だけ基板が制御して、あとはリモコンのボタンを押している間ずっと動く形式で、他の動作後のセンターはリモコンボタン押してる人任せwwタイミングよくボタン離してね~形式ww
話を戻して、念のためこの辺は全部EEPROM使用で、後でメインマイコンからの変更も可能にしておきました。
右のフラップだけでコマンドを5個も追加ですww左ももちろん5個w
よしこれでオッケ~~~~~~!
で、これで機体を組みなおして稼働させると!
ギリギリギリギリ――――――――ッ!!!
ちょっwwwおまっwww
あれだけ調整したじゃんか!!!なんでよ????!!!!!
で、よく考えたら上の動画の時はモーター用に5Vの電源使っていたんですよねwww
機体ではアシェツトの当初の設定の6Vで動くようになっていますw
たった1Vですが元々この部分のモーターの可動時間なんてアップ→ダウンのフルに動いても0.2秒の可動時間ww
1V違えば随分違うんですよね^^;
なら機体側を5Vにしたらarduinoとかとも共存出来て昇圧機とか使わなくても良いじゃないか!
とも思い、機体側も5V仕様にしたのですが、すると今度はエンジンのベクターノズルが動かなくなりましたwあいつノズルが金属製でかなり重いのでモーターにパワーが要るんですよねww
てなことで6V仕様にもどしてエルロンは再度初めから時間調整ですwwwwww
それにしてもうっかり連鎖がひどいwwwwww
今この記事書いててふと思ったのですが、もしかしてアシェットのこのエルロン部分のモーターの電圧は3Vとかで5Vより低いんじゃない??それなら、あのエルロンの時間の大きな誤差(改造前のエルロンの可動時間と改造後のエルロンの可動時間の差が大きかった)もわかるし、リミットスイッチ無い状態でモーターに負荷がかかってもギアの破壊が起こりにくいし。
元の状態でモーター自体に行ってる電圧は測っていなかったな・・・・・・これもうっかりかww
次に、キャノピーですがここは簡単にリミットスイッチは機能してくれました。
ただ、思っていたよりはリミットスイッチが押されていないらしくて、プラ板を挟んでしっかりと押されるように調整しました。
次はノーズギアのリミットスイッチです。ここが今回最大のハマりポイントwwww
ここはリミットスイッチを追加して以降は全く動かなくなってしまいました。
最悪だ~と思いながらリミットスイッッチを外したのですが、それでも動かないwww
モータードライバー疑ったり、ギアボックスを疑ったり色々しましたが、そもそもarduinoから信号が出ていない事が分かりました。
このarduino以前ショートさせてますので壊れているのかな・・・・・と思いながら、念のためリミットスイッチプログラムを除去して稼働させてみるとノーズギア動きましたww
どうやらリミットスイッチのプログラムに問題が有るようです。ただ、このプログラムは、脚部パートのメインギアやキャノピー開閉のためのリミットスイッチ付きのプログラムをコピペしたものですから、動くはずなんですよね・・・・・・・
で、シリアルでリミットスイッチを確認してみました。
するとなんと!!!リミットスイッチ押してもいなにのに
digitalRead(gear_limit)は「0」が返ってきましたww
(つまりリミットスイッチが押されてるとarduinoは申しておりますwww)
なんじゃこりゃww
そこで問題を切り分けるためにこんなプログラムを試してみました。
何もarduinon nanoに取り付けない状態で上記のプログラム実行したら普通ならシリアルには「1」返ってきますよね。でも「0」が返ってくるんですよw
やっぱりarduino nanoの故障かと思い新品でやっても同じ結果。
でね、さらにわけわからんのが、これをarduino UNOで実行するとちゃんと「1」が返ってくるんですよ・・・・・・・・
ネットで色々と調べるもわけわからずw悩んだ末にツイッターで聞いてみました。
すると色々と意見を頂き、まずはこういう結論に
こんな感じで13番ピンに接続されているビルトインLED(L表記部分)が微妙に点灯しているのが分かると思います。
PULLUPしてもこちらに電流が逃げているので戻り値が「0」になっていると思われたので、削り取っちゃいましたw
すると、ちゃんと戻り値は「1」を返すようになりました(^_^)/
よしよしこれでプログラムも正常に動くと思っていたのですが、新たな問題が・・・
今回のリミットスイッチはarduinoが立ち上がる時ONの状態、つまりスイッチは閉じた状態でマイナスにつながっています。この時に13番ピンが出力になるとショートしてしまいます。
てなことで13番ピンの入力は諦めました。
その後、さらにどろぼうひげさんからコメント頂き
こちらのリンクを教えて頂きました。
http://radiopench.blog96.fc2.com/blog-entry-961.html
http://igarage.cocolog-nifty.com/blog/2019/04/post-74f2bb.html
arduino使う方は必見の情報と思います。この2つのブログを見るとnanoとUNOでの13番ピンのLEDの回路の違いなどが載っていて納得できました^^
てなことで、また分解して基盤の配線を直して、リミットスイッチを12番ピンに、12番ピンに接続していたステップモータードライバーのENABLEピン用を13番ピンに接続して、全プログラム正常に稼働するようになりました^^
いや~ホントarduinoは色々とハマるポイント有るねw
ちなみに備忘録の為に今までハマった事を纏めときますw
1,13番ピンは入力として使うな。
2,割り込み処理内で変数の変化が有るような場合はvolatileが必要な時がある。
3,arduinoではintは2バイトで最大値は32767、最小値は-32768
4,VarSpeedServo.hライブラリーを使う時は9,10ピンのPWMは使えない
5,IRremote.hライブラリーを使う時は3,11ピンのPWMは使えない
6、arduinoIDEのコンパイルは構文ミスがあるのに通る事があるが、正常稼働しない。
例えば以前、mp3_vol=mp3_vol++;とインクリを間違って記述
今回の様に関数の後ろに()が無い場合
皆さんもお気をつけあそばせwww
ところでふと思ったけど、うちのブログは1記事が長すぎかな^^;
読むのめんどくさそう_(:3」∠)_
関連すると思われる記事:
- None Found
こんばんは
今回も(は)盛大にハマりましたか! お疲れ様です。
関数の()の記述忘れは、しょっちゅうはまっています。でもESP32の場合は、たしか何かのコンパイルERRで教えてくれたと思いますが。
エルロンなどの可動のワイヤー仕様は、なかなか調整が大変なようですね。どうしても捻じれの回転方向によるズレが再現性に影響するのですね。適当な太さのピアノ線か、スプリングなどは使えないでしょうか?
ArduinoのPINの仕様による「問題」は、私も悩んだ経験が。PICでいう、オープンコレクタピンの挙動で困った記憶が。
私は先週から、「ビデオ再生でリセットがかかる」、「ESP32とNANOのリンクの不正」と格闘していました!(笑)
なんかそういえばd13ピンの絡んだ
サーボモーターでどハマりしたような
しないような?
あのへんの二桁の出力は
さけたほうが良いような気がしますね!
Vividさん こんばんは!
盛大にハマってましたよw
あの()ね。あれたまに教えてくれる時も有りますよねw
今回はやすやすとコンパイル通過していましたwww
ワイヤーの捻じれはなかなか大変でした。リッジドな物ではあの主翼に入れるのが困難なのでしかたたないですね^^、そうそう!あれからやはり気になり元の基板出してきて調べたんですが、やはり2V程度であのエルロンは動かしているようでしたww
ギアが壊れることなく停止するはずですよねw
PINの仕様はなかなかのハマりっぷりでしたよww
初めは全く原因がわかりませんでしたww
こんばんは。
Arduino大量投入してさらにそれぞれ結構フルに使い切ってるのに気合いのプログラムで正常動作するようになるってだけでもすごいと思いますよ。多少のウッカリ(バグ)は致し方ないかと。読んでる方はその方が楽しいしww
DCモーターの時間制御は難儀ですね。モーターの回転抵抗が気温に左右されて夏になったらオーバーランしたりして、、、放熱機構もつけとかないと???
てつのさん こんばんは!
13番ピンにサーボの信号線ン繋げていたらarduinoの起動時に暴れるかもですねwww
他のピンは大丈夫ですw
PWMを使う時は一緒に使っているライブラリーとの相談が必要そうですね。
なおさん こんばんは!
えええっw夏になったらやばいのか・・・・・・・
てかその時々でやはりモーターの調整が必要そうですね。
EEPROMの書き換えで対応できるようにしておいて正解だったww
展示前に調整必須かなw
arduino大量投入と私のスペックフル活用ですwもうこれ以上は無理ww
ホント我ながらよく動いていると思いますww
お疲れさまでしたw
よくまあこんなややこしい物まとめますね。
D13で引用されていたサイトは、どちらもArduino覚え始めたときに拝見していた記憶が。。
ひげちゃんはたまたま検索してくれたんでしょうかね?
もしかして、遂にPICを捨ててこちら側の世界に移籍しつつあるのかもw
gyoさん こんばんは!
ホントここまで込み入ったもの初めてww
何とか纏りましたよ~!
arduino覚えたてであのサイトはレベル高すぎるでしょwww
どろぼうひげさんたまたま検索してくれたんでしょうね。
違うマイコンとは言えプログラムも有ったからちょっと興味がわいたのかもですねw