リニアガイドで2代目ラダーペダル制作~その3~

二代目ラダーペダルの続きを製作します。

まず合板に部品取り付け位置を書込みます。
鉛筆で描いてもいいのですが手っ取り早くレーザーで描画しました。
真ん中の部分はボリュームが埋まる所なのでドリルと糸鋸でくり抜いています。

RudderPedal2nd_1

合板にレーザーマーキング

 

そして部品を取付けました。

RudderPedal2nd_2

部品取付け完了。

ペダルはリニアガイドに載っていて前後に動かすとワイヤーを通じて真ん中のプーリーに接続した可変抵抗器を回します。またワイヤーにより左右のペダルは交互に動作します。
ワイヤーの部分、当初は水糸を使ってみたけど伸びるので被覆付きのワイヤーに変更しました。

RudderPedal2nd_3

反対側から見たところ。

戸車プーリーと適当なバネ。

RudderPedal2nd_3.5

戸車プーリーでワイヤーを支えます。
プーリーは適当にプリントしたパーツで固定。

 

機構的な部分は大体できたので後はUSBインターフェースを取付けます。
今回はアナログ3軸だけなのでPIC18F14K50を使ったOpenStick Liteを使用しました。
部品数が少ないので今回は基板切削はせずユニバーサル基板で配線します。

jw-cadで配線計画を立てて・・・

RudderPedal2nd_4

ユニバーサル基板での配線予定図

配線しました。

RudderPedal2nd_5

基板完成

そういえばOpenStick Liteはβ版としてブログには載せましたが正式ページを作っていません(ま、いいか)。

配線も済んだので動画を撮ってみました。

 

ではMotionSimulatorに載せてみます。我が家の工作室だと狭いので機材一式を和室に運びました。

RudderPedal2nd_4

和室に移動しました。結構重いです。
しかし変な絵面だな。

ではFlightSimulatorXを立ち上げてフライトしてみます。今までのラダーペダルはペダル位置が高くて足が宙に浮いた感じでしたが、今回は踵を床に付けたまま操作できるので微調整がしやすくなりました。しかしワイヤーを通じたリンクの抵抗が若干大きい気がします。

 

因みに一代目ラダーペダルはこれ。シーソー式でした。

一代目ラダーペダル

何度もMakerFaireに持って行った一代目ラダーペダル。
今回でお役御免です。

こちらはお役御免です。お疲れさまでした。

リニアガイドで2代目ラダーペダル制作~その2~

2代目ラダーペダルはこんな構造にしようと思います。

ラダーペダル構想

Fusion360で描いてレンダリング

リニアガイドにペダルを載せてワイヤー(糸?)で接続し、中央のプーリーで可変抵抗を回転させます。 左右のペダル内にもそれぞれ可変抵抗が仕込んであり、踏み込むとブレーキがかかります。

 

早速ペダル部分を作成してみました。本体はダイソーの6mmMDFをレーザーカットしています。歯車はABSで3Dプリントしました。バネは1.5mmのピアノ線です。
ペダルを踏みこむとギヤが可変抵抗を回す仕組みです。

ペダル1

ペダルの内側

 

そしてこんな感じでリニアガイドに乗せます(ガイドのコマが小さい感じがしてちょっと不安)。

ペダル2

リニアガイドに取付け。

 

これを二つ製作しました。こういう風に合板の上に並べる予定です。

ペダル3

こんな感じで並べます。

という感じでぼちぼちと進めます。

リニアガイドで2代目ラダーペダル制作

11.11のセールでAliExpressに色々と発注した内、一番楽しみにしていたものが届きました。 レール長150mmのリニアガイド。一本798円(送料別)です。

リニアガイド

リニアガイド×2本

リニアガイドってマジな装置で使う高価なものだと思っていましたがAliExpressだとお手頃価格のものが沢山出ています。これが問題なく使えるなら今後はCNC系の工作での悩みが減ります。

開けてみると・・・レール表面には細かい傷が入っていますが動かした感じでは問題なさそうです。日本製の新品を触った事がないので微妙なところは言えませんが、自作機器のレベルでは問題ないのではないでしょうか。

リニアガイド2

そのまま袋に入って届きましたがコマが落ちない様、出して直ぐに端を結束バンドで止めました。

これで2代目ラダーペダルを作ろうと思っています。バチが当たりそうですがリニアガイドを踏んづけるのです。
先日フライトシミュレータをモーション化した時にも書きましたが今のラダーペダルはペダル位置が高すぎて窮屈なので低くします。また本物はペダルにブレーキの機能があるそうなので、これも実装する予定です。

さて、どんな事になるのでしょう。

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

先日作成したマルチコプターは重量が50グラム程度なので室内でも飛ばせます。
しかし何しろ初心者につき、あちこちにぶつけてしまうのでプロペラガードを取付ける事にしました。

まずデータを作って・・・

PropellerGuard

プロペラガード

4つプリントして取付けました。

PropellerGuard

プロペラガード取付け完了。

壁に軽く当たってもバウンドするのでダメージがありません。
安心して操縦の練習ができます。

どどーんはじめました。~その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の値になる様です。