3Dプリンタ2号機~その6~

前回の投稿では1層目の貼り付きが悪いと言って一生懸命Z軸のレベル調整を行なった挙句、結局はプリントベッドをアルコールで拭いたら改善したというオチでした。その後も貼り付き性には問題なく、ネットで調べたらアルコール拭きは常識みたいですね。勉強不足でした。

コントロールPCのラズパイ化検討

3Dプリンタ1号機ではこの時設定したUbuntuマシンをまだ使っていました。たしかCPUはPentium4だったかな?
2号機もコイツで動かしてもいいのですが、レーザー加工機の制御PCも兼ねているので両方同時に使えないんですよね。また先日はボタン電池が切れて交換したし、そろそろいつ止まっても不思議ではない状態です。
他に使えるPCもないのでわが家に何個かあるラズパイで試してみようと思います。

Raspberry Pi1 ModelB

ラズパイの中では最も古いModelBです(+でも2でも、もちろん3でもないヤツ)。動作速度がどうかなーと思いますが、まずは試してみます。

3DP26_1

Raspberry Pi1 ModelB

Pronterfaceをインストール

Pronterfaceをインストールするのですが、まずはその前に今このRaspberry Piに入っているOSはいつのだか判らないので最新版のRaspbian(STREATCHと言うそうです)を入れ直しました。
その後・・・
’sudo apt-get install printrun’ で何事もなくインストール完了。

実行すると見慣れた画面が立ち上がります。
そしてプリンターと繋いで実行すると・・・なんかやっぱり遅いです。モデルの表示を2Dにしても操作した後10秒ぐらいしてからやっと反応する感じ。3D表示だと固まったかと思います。これはちょっと使えるレベルではありません。

pronsole

pronterfaceと一緒にpronsoleというのもインストールされています。こちらはコマンドラインでプリンターを操作できるものなので、メインPCからSSHでログインして操作可能です。 これだとGコードのロード時以外は遅さを感じないので、これもアリかと思います。

Raspberry Pi 2

Pi1だと遅いのですが、ならばRaspberry Pi2ではどうなのか試してみます。 このラスパイ、流行りに乗ってAIY VOICE KITに使ったのでこんな箱に入ったままです(AIY VOICE KITは Raspberry PI3を使うものとされていますが、わが家にPi3はないので2で試したところ、それなりに動いていました)。

3DP26_2

Raspberry Pi2(AIY VOICE KITに収納)

OSはAIY projectのイメージをSDに焼いたもの(ベースはRaspbian Jessie)が入っているのでこのまま使います。
ここでも上と同様にapt-getでインストールを試みたのですが、printurnが見つからないと言ってきます(apt-getの使い方を良くわかっていないだけかもしれません)。そこでGithubからソースを取ってきました。
実行してみると3D表示はやはり遅くてダメですが2Dなら問題なく使えるレベルです。

それぞれのレビジョン確認

ここでPi1とPi2で微妙に画面表示が異なるのが気になり、レビジョンを確認したところ・・・

Pi1   :2015.03.10
Pi2   :1.6.0

なんかレビジョン番号の付け方から異なっていて、どっちが新しいのか分かりません(当然GitHubから取ってきた1.6.0が最新だとは思いますが)。

もう一度Pi1に戻って最新版Pronterfaceをインストール

そこで再びPi1に戻って1.6.0をインストールしてみました。すると結構速度は改善されている様です。当然Pi2には負けますがなんとか使えるレベルだと思います。

(ここら辺の「使えるレベル」とか「遅い」とかは全て私の主観です。念の為。)

・・・という事で

Pi1で行こうかと考えながらも、ラズパイがつながるモニターはメインPCのしか持ってないんですよね。結局、RAMPSに液晶ディスプレイとSDカードを付ければそれでもいいかなとも思って揺れています。

RepRapのSenderって・・・

ところでPronterface等のSenderソフトって何をやっているんでしょう?想像では単にファイルからGコードを読んでArduionoに向けてシリアル送信するだけで、いくら古いラズパイだからってそんなに重い処理ではない様な気がします。実際Teratermでプリンターに接続し、’G0X10Y10F300’とか打ち込んでやるとその通りに動作します(エコーバックがないのでローカルエコーをONにし、改行コードを’LF’にしておく必要あり)。

Senderの動作としてとりあえず次のあたりが疑問です。

  • ロードとはどこにロードするのか?
    RAM上?
  • プリント中のフロー制御。
    プリンターの動作にどうやって同期しているのか?Arduinoとの接続では恐らくハードウェアフロー制御はできないと思っているので、Xon/Xoffなのか、または別の方法なのか?

という事でpronsoleのソースを眺めています(Pythonの経験値が低いので苦労しながら)。わかったら報告します。

3Dプリンタ2号機~その2~

前回の投稿後3年近く放ったらかしでしたが、正月明け頃から3Dプリンタ2号機の制作を再開しています。

まずは前回の写真・・・

3DP2

前回投稿した時の写真

 

そして現状。ぱっと見あまり変わっていませんがモーター、ベルト、エクストルーダが付きました。
3DP_2

 

ホットエンドは900円のを見つけて買っておいたのですが大丈夫でしょうか?
なおノズルは複数取付ける場所を準備しています(どうやって高さの調整をするかまでは考え付いていません)。

3DP2_3

コントローラは1号機で実績のあるArduinoMEGA256+RAMPS。とりあえずX/Yの移動ができるところまで来ました。

3DP2_4

ArduinoMEGA256+RAMPS1.4

続いてZ軸を製作中です。

熊本電鉄

我が家はJR豊肥本線と熊本電鉄との中間にあり駅まであまり近いわけではないので殆どの場合は自家用車で移動しています。 また電車に乗る場合でも大抵はJRの方です。 しかし今回、訳あって熊本電鉄に乗ってみました。たぶん何十年か振りだと思います。

熊本電鉄の菊池方向の終着駅である御代志駅から上り列車に乗ります。
ラッキーな事にくまモンが描かれた電車でした。

Kumaden1

 

車内もくまモンが沢山描かれています。

車でよく通る道沿いを列車は走ってきます。道路から見慣れた景色でも列車から見ると違って見え、不思議と遠くに来た様な気がします。

北熊本駅で乗り換えるので一旦降ります。隣のホームに移動するため踏切を渡っていると対向する線路に下り列車がやってきました。 線路上から近づいてくる列車を真正面に見るというのはあまり経験がありません(遮断機ないのかな?)。
ここでやってきた列車もくまモンです。

 

そして乗り換える列車もこれまたくまモンでした。

くまモン列車に当たったのは特にラッキーな訳ではなく、むしろそちらの方が多い様ですね。

どどーんはじめました。~その3~

今回のマルチコプターでS.BUSを初めて使ったので信号をArduinoで読み出してみました。
S.BUSとは何かという詳しい説明はコチラ→https://ja.wikipedia.org/wiki/S.BUS
要はラジコン受信機から昔ながらのサーボ信号を出すのではなくシリアル通信にする事で全チャンネルを1本の信号線で制御するという物です。

飛行機の場合はサーボの位置が分散しているので結局それぞれに配線する必要があり、あまりメリットを感じませんでした。しかしマルチコプターでは受信機の信号は全てフライトコントローラ基板に接続するのでこれが一本で済むのは大きなメリットになります。

S.BUS信号はシリアル通信ですが、UARTでよく使う仕様とは微妙に違うところがあり面倒になっています。例えば次のところ・・・

  • ボーレートが100Kbps。
    なぜか115.2Kbpsではなく100Kbpsです。妙なボーレートですがArduinoではSerialBegin()のとき100000と指定する事で対応できます。
  • 信号極性が逆転。
    Arduinoに入れる信号はインバータで反転してやる必要があります(もしかするとArduino側に反転機能があるのかもしれませんが見つけられませんでした)。

あと受信後のデータが11bit区切りなので並べ替えがややこしいです。

S.BUSプロトコルに詳細はこちらを参考にしました。→https://os.mbed.com/users/Digixx/notebook/futaba-s-bus-controlled-by-mbed/http://anarchy.hatenablog.com/entry/2014/12/07/181853

そして最低限の部分をスケッチに書きます。

int count;
long interval;
void setup() {
 Serial.begin(115200); // Terminal
 Serial1.begin(100000,SERIAL_8E2); // S-BUS
 count=0;
}

void loop() {
 int data[26];
 int val[19];
 int i;
 if (Serial1.available() > 0) {
 data[count]=Serial1.read();
 interval=millis();
 count++;
 }
 if ((interval+4 < millis()) && (0 < count) ) {
 count=0;

 val[0] =((data[1] & 0xff)<<0) + ((data[2] & 0x07)<<8);
 val[1] =((data[2] & 0xf8)>>3) + ((data[3] & 0x3f)<<5);
 val[2] =((data[3] & 0xc0)>>6) + ((data[4] & 0xff)<<2) + ((data[5] & 0x01)<<10);
 val[3] =((data[5] & 0xfe)>>1) + ((data[6] & 0x0f)<<7);
 val[4] =((data[6] & 0x0f)>>4) + ((data[7] & 0x7f)<<4);
 val[5] =((data[7] & 0x80)>>7) + ((data[8] & 0xff)<<1) + ((data[9] & 0x03) <<9);
 val[6] =((data[9] & 0x7c)>>2) + ((data[10] & 0x1f)<<6);
 val[7] =((data[10] & 0xe0)>>5) + ((data[11] & 0xff)<<3);

 val[8] =((data[12] & 0xff)<<0) + ((data[13] & 0x07)<<8);
 val[9] =((data[13] & 0xf8)>>3) + ((data[14] & 0x3f)<<5);
 val[10]=((data[14] & 0xc0)>>6) + ((data[15] & 0xff)<<2) + ((data[16] & 0x01)<<10);
 val[11]=((data[16] & 0xfe)>>1) + ((data[17] & 0x0f)<<7);
 val[12]=((data[17] & 0x0f)>>4) + ((data[18] & 0x7f)<<4);
 val[13]=((data[18] & 0x80)>>7) + ((data[19] & 0xff)<<1) + ((data[20] & 0x03) <<9);
 val[14]=((data[20] & 0x7c)>>2) + ((data[21] & 0x1f)<<6);
 val[15]=((data[21] & 0xe0)>>5) + ((data[22] & 0xff)<<3);
 val[16] = (data[23] & 0x1) ? 0x7ff : 0 ;
 val[17] = (data[23] & 0x2) ? 0x7ff : 0 ;
 val[18] = (data[23] & 0x8) ? 0x7ff : 0 ; // Failsafe

 for (i=0 ; i<19; i++ ) {
 Serial.print(val[i],DEC);
 Serial.print(F(" "));
 }
 Serial.print(F("\n"));
 }
}

S.BUSから取り込んだデータをUSB経由でシリアルモニタに表示したいので、シリアルポートが複数あるArduino MEGA2560で動かしてみます。

S.BUSモニタ

Arduino MEGA2560でS.BUSをモニター。
ブレッドボード上のICは信号極性反転のための74HC00。

 

こんな感じでデータが出てきました。
送信機が6CHなので7CH以降が正しいかどうかは確かめられていません。また19番目のデータはFailsafeが働いたときに1になるはずですが、これも確かめていません。

S.BUS monitor

モニター中。

各データが11bitt幅なので0~2047が表せるはずで、どうやらニュートラルが1024の様です。
ところでCleanflightにも受信データを表示する機能があります。しかし今回のモニターとCleanflightの値が一致しません。そこで何ポイントか対応を取ってみました。

 SBUSモニタ Cleanflight
       102         943
       697        1315
      1024        1520 ←ニュートラル
      1435        1776
      1681        1930

グラフにすると・・・

SBUS-CleanFlight

SBUSとCleanFlightの読値対応

恐らくCleanflightの表示値は昔ながらのPWMサーボ信号のパルス幅に換算した値をμS単位で表示しているのだと思います。例えばニュートラルはS.BUSの生データは1024ですがPWMだと1520μSといった感じ。
ということでS.BUSの生の値にざっと0.625掛けて879.5を足すとほぼCleanFlightの値になる様です。

どどーんはじめました。~その2~

先日作成したマルチコプターに乗せるバッテリーを購入しました。

HobbyKingで1セル600mAhが$1.99。
どうやらLi-Poは危険物扱いらしく送料がすこし高いので息子の分とまとめて5個買いしました(結局送料は私持ちなんですが)。

 

こんな感じで輪ゴムで固定します。

LiPo固定

裏返して輪ゴム止め。

そして充電ですが、AliExpressで1枚33円(送料無料)の充電基板FC-75を2枚購入しております。USB電源等でリチウムイオン電池を充電する為の基板でTP4056というICが載っています。(TP4056は名前が東芝っぽいのですが検索してみると中国メーカー製でした)

FC-75

1枚33円の充電器

 

基板は2枚つながっていますがそのまま配線していきます。
電源入力は4V~8Vの仕様なので5Vの安定化電源から2枚並列に供給します。
なお基板上の抵抗を交換する事で充電電流を決める仕組みになっており、
充電電流 = 1/抵抗値×1200 だそうです。
今回600mAhのバッテリーを1C充電するので2KΩとなりますが手持ちの関係で2.2KΩを接続しました。

FC-75_2

充電器に配線したところ

 

そして充電開始。まずは電流計を割り込ませてほぼ規定の電流値になっている事を確認後、電流計は取り外して観察します。

FC-75_3

充電開始。

 

時々バッテリー電圧を測定すると徐々に電圧が上がっていきます。

FC-75_4

充電中。

そしてバッテリー電圧が4.2Vに到達。ここで充電が終了してLEDが赤から青に変わるはずですが・・・・まだ変わりません。

4.22V。まだLEDは赤ですが電圧の上昇が遅くなりました。もう充電が止まってほしいのですが・・・不安。

4.23V。まだLEDは赤です。そしてデジボルが4.23Vと4.24Vの間をチラチラと行き来し始めたところで不安になってバッテリーを外しました。
このデジボルをどの程度信用できるのかという疑問もありますが、はやりちょっと高すぎる気がします。

TP4056のデーターシートを見ると充電停止電圧は4.137V~4.263Vとなっています。最大で4.263Vまで加わる可能性があるという事ですがこれって許容範囲なのでしょうか?(当然ながらハイボルト仕様のバッテリーではありません)
なおバッテリーを繋がない状態だと4.13Vでした。どういう制御になっているんでしょうか?

不安なので実績のある充電器で充電してみます。

enRoute L4充電器

最近すっかり産業用ドローン専門になったenRoute製の充電器。
まだホビー用ラジコンを扱っていた頃に買ったもの。なおLEDにテープを貼っているのは明るすぎて眩しいからです。

因みにこの充電器で充電完了後の電圧は4.11Vでした。こちらはかなり軽めの値になっています。

このFC-75充電基板は・・・どうしましょう?

どどーんはじめました。

変なタイトルですが「ドローン」と呼ぶにはおこがましいので「どどーん」なのです。

息子が少し前からマルチコプターを飛ばしています。
最初はこういう買ってきたやつをそのまま飛ばすだけだったので自分でやろうとは思っていなかったのですが・・・。

トイドローン

JJRCのトイドローン

最近はパーツを集めて組立て、PCで設定を変えたりと工作心をくすぐる事をやっているのを見て自分でもやりたくなりました。
作るのはブラシレスモーターのパワフルなのではなくコアレスDCモーターの軽いやつにします。 

部品購入

まず、フライトコントローラー。この基板にジャイロや加速度センサーが載っていてSTM32マイコンが飛行を制御します。ブラシレスモーターの場合だと通常はモータードライバは別に必要(4個も!)ですが、これはシンプルな制御のDCモーター用なのでドライバもこの基板に載っています。

F3EVO

フライトコントローラー F3EVO。
ブラシモーター用です。

次に受信機。私が持っているフタバの送信機に適合するものです。出力は昔ながらのPWMではなくS-BUSというシリアル通信なので、配線は電源、GND、S-BUSの3本だけです。S-BUS信号は上記フライトコントローラーのUART端子に接続します。

FT4X

ラジコン受信機です。

そしてモーター。2個で¥104円だったので予備も含めて6個買いました。
しかし後で失敗だった事に気づきます。

CorelessMotor

コアレスモーター。
(失敗でした)

プロペラです。結構折りそうなので多めに必要です。

propeller

プロペラ

他にバッテリーも必要ですがとりあえず息子のを借りることにします。

製作

まずはjw-cadでフレームを描きレーザーでMDFを切ります。

フレーム1号jw-cad

jw-cadで描いて・・・

MultiCopter1

マルチコプターのフレーム1号

パーツを取付けた写真は撮り忘れました。
フライトコントローラとPCをUSBで接続しCleanfligntというソフトで設定します。このあたりは息子に聞いたり須磨模型のサイトを参考にしました。

Cleanflight

Cleanflight設定ツール

そして設定ができたのでプロペラを取付けようとしたら・・・軸の太さが合いません。

良く調べたら、この手のモーターの軸はΦ1,0mmと0.8mmがある様です。今回買ったプロペラは1mm用ですが、モーターは0.8mmでした。仕方ないのでダメ元でプロペラの軸に接着剤(ボンド・ウルトラ多用途)を着けて固めます。この接着剤は固まっても少し柔らかいタイプなので後々の着脱がやりやすいかなと思います(実際のところ特に抜ける事もありませんでした)。

飛ばしてみる。

接着剤が固まったので早速飛ばしてみます。
が、プロペラの回転を上げても5cm程浮上するのがやっとです。しかも、ものすごく不安定ですぐにひっくり返って墜落します。 フライトコントローラの設定とかも色々いじったのですが・・・やっぱりパワー不足が一番の問題の様です。

2号機・・・ヘキサコプター

本来ならもっとパワフルなモーターに交換するのが筋だと思いますが、その前に予備モーター2個を追加してパワーアップしてみます。今回購入したフライトコントローラーはDCモーターを6個まで接続できるのです。
またフライトコントローラの設定により、スティックの操作量に対する反応を半分くらいまで減らしてみました(初心者なので安定性重視です)。

マルチコプターフレーム2号

フレーム2号。
モーターを2個追加してヘキサコプターとしました。

これだと何とか目の高さあたりまで浮かびましたが全く余裕がありません。やはりこのモーターでは厳しい様です。

モーター交換して3号機

やはりパワフルなモーターに交換する事にします。息子が使用しているのはJJRCのトイドローンSyma X5Cの交換用モーターなので同じ物を購入します。軸もΦ1mmなので購入済みのプロペラが使えます。
今回は配送を待つ気分ではないのでAmazonに発注し2日後には到着。

そして3号機。フレームは1号を元に細かいところを改良して作り直しました。
材料が2.5mmのMDFでレーザーで簡単に切れるのでどんどん改良していきます。

マルチコプターフレーム3号モーター変更

マルチコプターフレーム3号モーター変更

これだとさすがに良く飛びます。しかし操縦が初心者なので何度も墜落し、モーターの付け根が折れてしまいました。

マルチコプターフレーム3号破損

マルチコプターフレーム3号破損

4号機

モーターの付け根を強化しました(少し太くなったのと、2枚重ねの部分を根本側に若干伸ばしたのと)。
今のところ壊れておらず操縦練習中です。

マルチコプター フレーム4号

モーターの付け根を強化。

この後どうするか未定ですが、まずは操縦の練習をしてみます。

フライトシムのモーションシミュレータ化~8~

モーションシミュレータとして大体のところは動作したので使い勝手を良くしていきます。

省スペース化

まずは少しでも省スペース化するためヨーク、モニター取付け部分を折り畳み式にしました。

MotionSim9-1

折りたたんだところ。

支えの部分。折りたたむ時は真ん中のボルトを残して後は抜きます。

MotionSim9-3

使用中

 

リニアアクチュエータ接続ボルト切断。

リニアアクチュエータとキャスターの接続部分はいままで長ボルトを挿しただけでした。このままだといつか踏んづけて怪我しそうなのでボルトを短くします。

MotionSim1-5

リニアアクチュエータとキャスターのリンク。長ボルトを突っ込んでビニールテープで止めただけでした。

まずボルトを真っ二つに切ります。

MotionSim9-4

ボルトを切って・・・

そしてねじ切りをしますが、ダイスがなかなかボルトに食いつきません。こういう安価なセットだからいけないんでしょうか?

MotionSim9-5

これまた見たらわかる、安っすいやつやん。

一時間ぐらい格闘したけどねじは切れませんでした。結局ホームセンターでマトモなダイスを購入。安物セットの値段は忘れましたが、たぶん今回買ったダイスの方がセット全体よりもうんと高額です。

MotionSim9-6

ダイス購入。

さすが、このダイスだとガッチリ食いつきます。

またボルトとダイスの角度を維持するのが大変なので木材で冶具を作ってボルトを固定しました。

MotionSim9-7

冶具1号。2本目のねじ切りでボルトが回ってダメになりました。

MotionSim9-8

冶具2号。これも2本切るとボルトが回って終わりました。

ダイスの方は水準器を置いて水平を維持しました。これでボルトが垂直に固定できていればねじが斜めになることはないはずです。

MotionSim9-9

ダイスの上に水準器を置いてねじ切り。

結局木材冶具は二つとも壊れましたが何とか4本のねじ切りができました。
取付けるとこんな感じ。

MotionSim9-10

長すぎたボルトが丁度どよい長さになりました。

動力用電源のスイッチ取付け

モーターを回す為の12V電源ラインにスイッチを取付けました。このスイッチも先日ポンさんに頂いたものです。ありがたい限りです。

MotionSim9-11

動力用電源スイッチ取付け。

以上でモーション・フライトシミュレータは、ほぼ完成ですかね。いつも私の工作は完成したのかどうか決まらず終わっていくので今回は一旦完了宣言をしたいと思います(といいつつ、まだ何か続きそうですが)。

フライトシムのモーションシミュレータ化~7~

やっとフライトヨークとモニターを取付けました。

木組みでちょっと複雑な形に・・・

MotionSim8-1

合板多用です。パッチン止めは乗り降りする時に外します。

MotionSim7-1

モーション・フライトシミュレータ全景

早速テストフライトするため PCを棚から引っ張り出して座席の横に置きます。こうしないと諸々のケーブルが届かないのです。

MotionSim8-3

PCを引っ張り出してケーブル類を接続。

ではテストフライトの動画です。

ロール方向の動きが少ない様にも見えますが、ラダーを使って横滑りが無ければ横Gも加わらないので多分正しいのだと思います。

以上で一通りの動作はしたのですが・・・置き場所に困るのでこの後は簡単に分解/組み立てができる様にしていきたいと思います。

フライトシムのモーションシミュレータ化~5~

モーションシミュレータの座席にラダーペダルを固定するため、金具を切り貼りしたいのですが、先週の雨に続き今週末も台風がやってきて降ったり止んだりしているので外での作業が出来ません。
そこで近所のホームセンターハンズマンにある工作室で金具のカットと穴あけをしてきました(工作室での写真は撮り忘れました)。
切り終えたのがこれ。

Mostionsim6

座席に取付ける金具(切ったあと)。
3mm厚で幅40mm、各辺270mmのL型金具(1本170円)。
元々は建築用みたいです。

現状の座席にも同様の金具をフレームとして使っており、これに溶接する予定ですがハンズマンの工作室でも溶接はできないので晴れたら庭でやろうと思います。が、雨が止んだかなーと思って準備を始めるとまたポツポツと降ってきます。

てるてる坊主

 

晴れるのを待ちながら制御基板の続きを作る事にします。先日故障した基板切削CNCも調子よくなっており切削完了。

MotionSim6-2

切削を終えた基板の両面テープをスクレーパーで剥がします。

部品を実装しました。(一か所回路図段階でミスっておりパターンを修正しましたがこちらの面からだと見えないのでナイショ)

MostionSim6-3

実装も完了。

これくらいの配線量だとユニバーサル基板の方が手っ取り早いかもしれません。でもそこは趣味の世界です。 またArduino標準のピンヘッダ配置はユニバーサル基板がピッタリ納まる様になっていないという問題もあります。

基板を作った後で気づいたのですが、手元の古いArduinoUNOには無い端子を使う配線になっていました。I2C通信で使うSDA,SCL端子は現在のUNOでは端子が追加されて2か所にありますが古いUNOには1か所しかありません。

MotionSim6-4

ArduinoUNOのピンヘッダ新旧比較
(左の新しい方はバッタ物ですが・・・)
左下のAD4,AD5端子がSDA,SCLと兼ねており昔からある端子です。これに対し今のUNOでは右上にも同じ信号がSDA、SCLとして追加されています

仕方ないので新しい方(バッタ物)を使う事にします。

とかやっている間にAliExpressに何となく注文していた基板が届きました。
1枚108円で送料無料です。こんなのを使うのが一番簡単でした(いまさら今回のには使いませんが)。

MotionSim6-5

Arduinoシールド用ユニバーサル基板

 

何はともあれ基板が出来たのでブレッドボードを取り外して交換します。
だいぶスッキリしました。
基板上のトグルスイッチはマニュアルとオートの切替です。オート側にするとPCから仮想COMポート経由で制御でき、マニュアルにしておくと基板上の4つのタクトスイッチで動作させる事が出来ます。

MotionSim6-6

ブレッドボードから基板に変更してスッキリした図

そうこうしている内に雨が止んだ様です。日没まであまり時間がありませんが少しでも溶接作業を進めます。
といっても2本を接合しただけで日が暮れました。座席のフレームとの接合は後日行います。

MostionSim6-7

2本を接合。

少しずつしか進みませんが続けていきます。

フライトシムのモーションシミュレータ化~4~

前回FlightSimulatorXからデータを取出して座席の傾きを計算しArduinoに送るところまで来ました。引き続きArduino側でのスケッチを書いていきます。

PCからArduinoに送るデータフォーマット

PCからArduinoへはシンプルに下のフォーマットでデータを送ります。

ピッチ,バンク\n

第一フィールドが座席のピッチ、第二フィールドがバンク角で、それぞれ’度’単位の角度を10倍した整数で表します。10倍しているのは小数以下一桁までを整数で表し、少しでもArduino側の計算負荷を減らす目的です。

Arduino内での処理

Arduinoのスケッチではシリアルポートを定期的にチェックし、1行分のデータが来たらピッチとバンク角を取出します。そしてこの値を元にリニアアクチュエータの目標とする長さを左右それぞれ算出します。

また加速度センサーの値も定期的にチェックします。加速度センサーは座席裏側に取付けてあるので座席の傾きを示しており、この値から現在のリニアアクチュエータの長さを推定します。

あとはモータードライバーに対し、目標長と現在長の差が無くなる方向に動かす信号を送ればアクチュエータが動作して座席が目標角度になるという算段です。

実際にはアクチュエータが停止状態から動き出す時はPWMで徐々に加速し、目標に近づくと徐々に減速する事でなるべくスムーズな動作を目指しています。

なお当初、加速度センサーは座席の背板付近に取付けていました。しかしこれでは重力加速度による傾き検出以外に本当の加減速も検出してしまいます(軸から遠いので特に上下には大きく動く)。今回は傾きの情報だけ欲しいのでなるべく軸の近い場所に移動しました。

動かしてみる。

まだモニターもペダルもコントローラーも取り付けていませんが、とりあえず動作させてみます。
PC側でFSXを起動し、DOS窓から先日作ったデータ抽出プログラムを起動し、リダイレクトで仮想COMポートに送ります。

動画で・・・

最低限のところが動いた感じですが、なかなか楽しいです。
ペダルやコントローラを取付けていきます。