フライトコントローラーを自作してみる。~その4~

BlackBoxについて

前回書いた通り、基板化する前にBlackBoxを動作させてみます。
BlackBoxとはフライトコントローラー(以下FC)が諸々の情報をログとして記録する機能です。
ログの保存先としてBetaflightがサポートするメディアには、OpenLog基板、SDカード、SPIフラッシュIC 等があります。

OpenLogはSparkFun(SwitchScienceでも取扱いがある様です) のロギングデバイスで、FCには外付けする事になり機体内のスペースを取るため今回はパス。またSDカードは安くて大容量なのが魅力ですがカードコネクタがFC基板の面積を喰い設計が難しくなりそうなので、もうちょっと腕が上がってからにします。
という事で今回はSPIフラッシュを使ってみようと思います。

記録メディア

BetaflightがサポートするSPIフラッシュICはこちらのページに記載されている下記のデバイスで、この中から16MBのW25Q128を購入しました。

  • Micron/ST M25P16 -2 MByte
  • Micron/ST N25Q064 -8 MByte
  • Winbond W25Q64 -8 MByte
  • Macronix MX25L64 -8 MByte
  • Micron/ST N25Q128 -16 MByte
  • Winbond W25Q128 -16 MByte
ちょっと思っていたよりサイズが大きい。

配線

接続は電源とSPI信号をつなぐだけ・・・。

ファームウェア定義ファイル

Betaflightのターゲット定義ファイルtarget.hに以下を追記しました。
SPI3に接続しています。

#define USE_SPI_DEVICE_3 
#define SPI3_SCK_PIN PC10
#define SPI3_MISO_PIN PC11
#define SPI3_MOSI_PIN PC12
#define USE_FLASHFS
#define USE_FLASH_M25P16
#define FLASH_SPI_INSTANCE SPI3
#define FLASH_CS_PIN PA15
#define ENABLE_BLACKBOX_LOGGING_ON_SPIFLASH_BY_DEFAULT

気になったのは’USE_FLASH_M25P16’の行。M25P16は2MBのメモリーですが今回接続するW25Q128は16MBです。このあたりの設定は不要なのでしょうか? 他のFCの設定を見ても特に容量を指定する箇所もなく、単にM25P16を指定しているの様なのでこのままやってみます。

動作確認

ファームをビルドしてFCに書き込み、BetaflightConfigratorから接続してみると・・・

ちゃんと16MBとして認識しています。

適当に動作させたログをPCに取り込み、Blackbox Explorerで結果を見てみました(FCは机に置いたままなのでジャイロや加速度センサーの値は全く動いていませんけど・・)。

動作は大丈夫そうです。

ということで・・・

いよいよ基板設計を開始しました。一般的な一辺35mmの正方形に収める予定ですが、手ハンダも考慮してSMDパーツのパッドを大きめにしたため、面積的に結構厳しいです。くじけたら35mm角は諦めて基板サイズを広げるかもしれません。

レーザー管劣化

レーザー管が劣化してしまいました。

いきさつ・・・

前に冷却水をこういうのにした事を書いたのですが・・・

Water2_7
不凍液を電動ポンプで回し、ラジエーターで冷却していますが
水流がちょっと弱めでした。
手押しポンプが付いているのは電動ポンプまで水を通す為です。

あまり冷却が弱いとレーザー管が劣化するという事を読んだので直ぐに元の風呂水ポンプに戻していました。

今まで使っていた風呂水ポンプ

この状態で使っていても徐々に劣化感はあったのですが、先日MDF材を切っていたら途中でレーザーが出なくなっていました。みるとポンプが壊れてセンサーが水流を検出しなくなり、レーザーを停止させていた様です。

水流センサー
水流センサーのインジケーター

ポンプはもうウンともスンともいいません。でもこれは予備として買っておいたこちらの水中ポンプに交換します。

いつだか買っておいた水中ポンプに交換。

これで水は依然よりも良く流れるようになったのですが・・・・レーザーが弱々しくなり、フルパワーでも2.5mm厚のMDFが切れなくなってしまいました。

水流センサーが働いてレーザーは止まっていた筈ですが、余熱が逃げないだけで劣化してしまうのでしょうか?

ためし撃ち
購入時の試し打ち風景。
ブログを見返すとこのレーザー管は2015年に購入しています。
約5年使ったと考えれば諦めもつくかな。

という事で・・・

とりあえずレーザー加工機のない生活は考えられないので新たなレーザー管を発注しましたが、新型コロナで世の中おかしくなっているこのご時世、いつ届くのでしょうか?

フライトコントローラーを自作してみる。

ドローンレースの練習をしていると色々なところを壊します。
ほいほい堂本舗は貧乏性なのでできる限り修理して再利用したり、また可能なところは自作してみたくなります。

という事でフライトコントローラーを作ってみたいと思います。フライトコントローラーとは一言でいうとマルチローター系の機体を制御するマイコンボードです。固定翼の飛行機は構造的に自立安定して飛行しますが、これと違ってマルチローターは特に制御しなければ安定して飛び続けられません。そこでジャイロや加速度センサーで機体の姿勢を検出しどのモーターをどの程度のパワーで回すかを決めるのがフライトコントローラー(以下FCと略す)です。

自作フライトコントローラーの構想

近年の(ホビー系の)FCは殆どがSTマイクロエレクトロニクス製のSTM32Fxx マイコンが使われています。これにジャイロ/加速度センサーを載せるのですがマイコンとの接続はSPIやI2Cですし、モーターを回すためのドライバ(ラジコン界ではESCという)へはPWM(およびその変形)で信号を送るので、ほぼマイコン工作で作れそうです。

またソフトについては優秀なオープンソースのファームウェアが多数出ているのでこれらを用いることができます。

といっても、いきなりプリント基板を作る勇気はないのでまずはマイコンボードを使って動作を確認してみます。マイコンボードにはSTM32F411 Nucleo-64を使う予定。

STM32F411 Nucleo-64

全体像はこのブロック図の様に考えています。このうち水色で囲んだ部分をここではフライトコントローラー(FC)と呼ぶ事にします。

実用的にレースで使うにはこの他にOSD(On Screen Display:FPVの映像に諸々の情報をスーパーインポーズして表示する機能)も必要になりますが、まずは飛べる事を確認出来た後でこれらも試したいと思います(実はOSD用ICも入手済)。

Betaflightをビルドする。

ファームウェアはいつも使っているBetaFlightを書き込む予定ですが、その前にファームウェアをビルドする環境を作っておこうと思います。
BetaFlightのビルドはUNIX環境上で行うのが基本となっている様で、Windows上のWSL(Windows Subsystem for Linux)でも実行できます。詳細はBetaflight Wikiのこのページに説明されており、この通りにやれば構築できました。
手順通りに構築するとWSL環境内の~/Git/Betaflightというディテクトリ以下にファイル一式ができています。更に下には~/Git/betaflight/src/main/targetというディレクトリがあり、ここには下図の様に各種FC毎の設定があります。

このディレクトリ下に今回作るFC用として’HOIHOIF411’というディレクトリを作るのですが、まずは似たFCである’MATEKF411’の内容を丸コピーし、そこから変更していくことにします。

HOIHOIF411ディレクトリの中にはtarget.mk、target.h、target.cの3本のファイルがあります。ここら辺の詳しい説明資料が見つからないのですが、この3本のファイルを変更するとそれぞれのFC固有のファームウェアが出来上がる様です。で、いろいろ試行錯誤した結果のファイルを添付しておきます。→HOIHOIF411.tar.gz

targetディレクトリの設定ファイルができたらカレントディレクトリを
~/Git/Betaflight に設定し、ここで’make HOIHOIF411’とコマンドを実行すると ~/Git/Betaflight/binの下にファームウェアが出来上がります。このファイルをBetaflightConfiguratorのファームフラッシャーを使って書き込んでやる訳です。

ジャイロ/加速度センサー

当初ジャイロ/加速度センサーにはモーション・フライトシミュレーターで使ったので手元にあった MPU6050ボードを使ってみました。市販のFCは大抵SPIで接続できるセンサーを使っていますがMPU6050はI2C接続専用です。一応これもBetaflightにサポートされているっぽいのですが、しかし何故かうまく接続できません。mbedで書いたプログラムだとセンサー値を取れるのですがBetaflightのファームからは取れないのです。

MPU6050ボード

そうこうしている内にポチッていたMPU6500ボードが届いたのでこれをSPIで接すると問題なく接続できました。 名前が似ていてややこしいですがMPU6500はSPIで接続するタイプで市販のFCでも結構使われています。
どのみち最終的にはMPU6500を使うつもりなのでこれで行きます。

MPU6500ボード


回路図

こんな感じで行こうと思います。
NucleoボードはArduino互換ソケットが付いているので、なるべくこれを利用する事で、Arduino用シールド基板を使って配線し易い様にします。
なおOSDは後で追加予定です。

機体

動作確認用に、息子が作って今は使っていないこの機体に乗せてみます。

製作

まずはブレッドボードで動作を確認して・・・

大体動作したのでArduino用シールド基板上に回路を載せて・・・

機体に乗せてみます。

飛ばしてみる

で、飛ばしてみると・・・一応浮き上がるのですが斜めに振動して止まりません。
原因調査中ですが、市販のFCに載せ変えても同じ様に振動するのでFCの問題ではないのかもしれません。
この続きは後日・・・

レーザー加工機の冷却水~不凍液投入~

先日水冷システムを変更したレーザー加工機ですが、冷却液には水道水をそのまま使っていました。今は5月なので凍結の心配はありませんが、その前にカビやコケが生えると嫌なので、ちゃんとした冷却液に入れ替えます。

冷却液には何を入れようかとネットで調べると、自動車用でよく使われているエチレングリコールというのは毒性があるそうなので漏れた時が嫌で使いたくありません。グリセリン系というのもあり無害でそのまま下水に流せるそうですが粘性が高いとの事。

このあたり素人で良くわかりませんが、プロピレングリコール系というのが毒性が低いとの事なのでこれを買ってみました。カビやコケの防止効果があるかどうかはわかりませんが・・・。

water2_1

プロピレングリコール系冷却液”コガブラインPG40”。Amazonで¥923-

早速リザーバータンク(として使うペットボトル)に入れてみました。かき氷のイチゴシロップみたいでおいしそう。

water2_2

約2リットル投入。

で、接続してみます。

water2_3

全体がピンク色。

電動ポンプをONにしといて灯油ポンプでプライミングしてやると循環し始めます。
しかし水道水の時と比べて流量が明らかに減っています。やはりこれも粘度が高いのでしょうか?水流センサーも反応しません。

水流センサーの出力を見ると6.89Hzです。センサーは10Hz以上を流量有りと判定する様にプログラムしているのでこれでは反応せず、このままではコントローラーがレーザー発射を止めてしまいます。

Water2_3

水流センサーの出力

レーザー管にどれくらいの水を流す必要があるのか分かりませんが、今までフルパワーで動かしても特に水が温まる感じも無かったので、とりあえずこの流量でもいいんじゃないかと(ええかげんやなー)、センサー閾値の方を4Hzに落としました。

と、一旦これで良しとしたのですが、やはりちょっと不安なので冷却液に精製水を混ぜて濃度を下げる事にします。冷却液を500ml抜いて代りに精製水500mlを入れました。冷却液そのままだと凍結温度が-25℃ですが、さすがにそこまで冷える事は無いので多少薄くなっても大丈夫でしょう。

Water2_5

精製水500ml。
ドラグコスモスで¥98-で購入。割安な気がしましたが元は水ですもんね。

これで若干ですが流量が増えています。センサー出力も9Hzにアップ。

Water2_6

不凍液を薄めた後の水流センサー出力。約9Hzにアップ。

なおこの水流センサー(YF-S201)は以下の式で周波数が決まる仕様になっています。
 Frequency (Hz) = 7.5 * Flow rate (L/min)
という事は9Hzだと、9÷7.5=1.2L/minとなります。適正値が判りませんが少ない気もするので
温度に注意しながら使ってみます。

Water2_7

何だか、派手な色が入り混じっています。

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

やっぱり二代目3Dプリンターにラズパイを取付けました。
初代RaspberryPiのModelBです。

3dp28_1

Raspberry Piをねじ止め。

ラズパイにモニターやキーボードは取付けていませんが、Xwindowの画面をメインPCに飛ばしPronterfaceを実行できます。
又はTeratermでログインしてPronsoleを使う事も。。。

フロントパネルにはラズパイ専用の電源スイッチとシャットダウンボタンを設置したのでLCDコントローラだけで動作させる場合にはラズパイ電源はOFFにできます。

3dp28_2

手持ちのスイッチを取付け。

なお特に対策をしなければラズパイ専用電源をOFFにしてもArduinoからの電圧でラズパイのLEDが点いてしまいます。正常動作する程の力はない様ですがArduino側のレギュレータに負荷が掛かりそうです。気持ち悪いのでUSBコネクタの+5V端子にカプトンテープを貼って絶縁するという、いい加減な対策をしました。

3dp28_3

USBコネクタの+5V端子を絶縁。

 

これで3Dプリンタ2号機は一旦完成とします(多分まだ何かやりますが)。

3dp28_4

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

前回の続きでpronsoleの中を調べています。まだよくわからない部分も多々あるのですが、まず1番の疑問としてGコードのロードになぜ時間がかかるのか、またどこにロードしているのかについては、どうやらPythonの配列に全てのコードを読み込んでいる様です。という事はメインメモリーに取り込んでいる事になります。但し時間がかかっているのは読み込みそのものではなく、その後にレイヤー数や実行時間を計算する部分の様です。という事は実行時間表示を諦めたらロードが早くなってサクサク動くんではないかと期待し、そのうち試してみたいと思います。

LCDコントローラ検討

そもそもは制御PCをどうするかという話でしたが、LCDコントロールパネル+SDカードでも良いんではないかという気がしてきました。これまた世の中では当たり前なのでしょうけどウチでは今までPC接続でしか動かした事が無かったんです(このあたりが世の中から周回遅れなのです)。

手持ちのLCDで丁度良いのがなく、Aliexpressをみたら¥1031-でこんなのがあったのでポチりました。ロータリーエンコーダやSDカードソケットまでついて送料無料です(今見たら若干値段が変っていましたが)。

そして随分と早く、9日間で到着。

3DP27_1

立派な箱に入って到着しました。

開封・・・

3DP27_2

中身一式。
ケーブルに加えRAMPSに挿す為の変換基板も付いています。

接続

早速接続します。配線は本体と変換基板をケーブルでつなぎ、変換基板をRAMPSに挿すだけです。
そしてMarlin側は次の4箇所のコメントを外しました。

#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
       ←接続するコントローラのタイプが「Discount Full graphic controller」である事を示す。
#define REVERSE_ENCODER_DIRECTION     ←ロータリエンコーダの回転方向を逆にする。
#define SDSUPPORT             ←SDカードを使用可能にする。
#define LCD_LANGUAGE kana        ←表示をカナ表示にする。
#define INDIVIDUAL_AXIS_HOMING_MENU  ←各軸単独でHOMINGする為のメニューを追加する。

電源投入

そして電源を入れると・・・

3DP27_3

おお、灯いた。

事前の情報でSDカードに保存するGコードは8+3形式のファイル名でないとダメと聞いていたのでこの通りに作成し、余っていた128MBのSDカード(128GBではなく128MB)に入れてみましたが・・・ファイルを見つける事が出来ません。そこで8GBのSDHCに入れたところ問題なく読み出せました。今どき128MBは想定外なのでしょうか? ま、しかしこれで問題なくプリントできます。

取付け

本体に取付ける為、Thingiverseから適当なケースを落としてきてプリントしました。そしてケースに入れてねじ止めすると、画面の真ん中あたりの横一列に表示の欠損が発生しました。

3DP27_4

真ん中付近に横一列の表示欠けが出ました。

改めてケースから外してみると正常に表示できます。どうやらサイズギリギリにプリントしたケースに基板を押し込んだ為、応力が加わりディスプレイの配線が接触不良をおこしているのだと思います。 そこでケースを少し削って余裕を持たせたら正常に戻りました。

そして本体に取付け。
おー!いい感じです。

3DP27_5

本体に取付けたところ。

そして・・・

元々1号機があった場所に置いてみました。
手前からレーザー加工機、3Dプリンタ2号機、基板切削用CNCです。

3DP27_6

わが家の自作工作機器

結局のところ、まだRaspberry piは繋いでいません。
なんだかこのままSDカードだけでで行ってしまいそうです。

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

3Dプリンタ2号機製作の続きです。

Z軸を上に引っ張ると抜けてしまう構造だった件はこの写真の様にMDFボードを上下からベアリングで挟みストッパーで固定する方式にしました。多分これで大丈夫。

3DP2_41

Z軸抜け対策

 

調整で苦労したのはエクストルーダからの吐出量が安定しない(なんだか少ない)点です。最初こんなエクストルーダを使っていました。

3DP24_1

PLAでプリントしたWade’s Extruder

そこで1号機で使っていたMakerGear製エクストルーダに交換しようとしたらパーツが割れていました。つい先日まで1号機で働いていたのですが。

3DP24_2

MakerGear製エクストルーダのパーツ破損

仕方ないので2号機で補修パーツをプリントして取付けます。

3DP24_3

補修して取付け。
黄色いパーツが新たにプリントした部分。

このエクストルーダは実績があり音も静かです。しかし吐出量が少ないのは変化ありません。プリントしたエクストルーダが原因では無かった様ですが静かなのでこのままこっちを使います。

改めて、エクストルーダの送り量を再測定してみると・・・
無負荷では指定通りの長さが出ていくのですが、温めたノズルから吐き出しながらだと1割くらい少ない量しか出ません。そこで送りギヤの締め付けネジを強くしたらだいぶマシになった(でもまだちょっと少ない)のですが、この状態でプリントしていると途中でエクストルーダのモーターがゴトゴトという音をたてて脱調し始めました。フィラメントを引き抜いてみると送りギヤで傷付けた部分がテフロンチューブ内で抵抗になり、手で出し入れしても明らかに滑りが悪くなっています。仕方ないので締め付けネジを少し緩め、脱調はせずに送り量もまあまあなギリギリのところに調整しています。結局これでも吐出量が少な目なのでスライサー(curaです)側で少し多めに出す設定にしました。

今回の2号機のエクストルーダは’Bowdenタイプ’にしています。ホットエンドとコールドエンドを分離してテフロンチューブでつないでいるので、X-Y動作時にエクストルーダのモーターを一緒に振り回さなくて済む(なので動作が軽い)のと、将来的に複数のエクストルーダを付けるためヘッド周りのスペースを空けておけるというメリットがありあります。しかしチューブで間を繋いで精度的に大丈夫かという不安がありましたが、やっぱりこのあたりが難しいのかもしれません。

次に前回プリントベッドのガラスにヒビを入れてしまったのでガラスを交換します。いつだったか複合プリンタをバラしたときに取っておいたスキャンベッドのガラスを使います。ガラスを切るのは初めてですが過去に家のタイル補修時に買ったタイル切りがあるのでこれでガラスを切ってみます。

3DP24_5

ガラス板を切ります。

適当なゴム板があったので滑らない様に定規との間に挟み、タイルカッターで傷を入れます。Youtubeで見た動画だと「キー」という高い音と共に傷が入っていましたが「ゴリゴリ」という音しかしません。腕の違いなのかカッターの違いなのか。でも何とか傷は入った様です。

3DP24_6

細長いゴム板があったので定規との間に挟んでガラスに傷をつけました。

そして恐る恐る力を入れると・・・

3DP24_7

おおっ、上手く割れました。

もう一辺も切る必要があります。同様にやっていくと・・・

3DP24_8

今度は失敗です。ギタギタになりました。

仕方ないのでダイヤモンドヤスリと回転ツールで削って真っ直ぐにしていきます。

3DP24_9

削ってなるべく真っすぐに修正した後。
(でもデコボコしています)

まだデコボコしていますが、手を切らない様にエッジは丸めておいたので実用上の問題は無いと思います。

カプトンテープを貼って取付けました。今度は割らない様に注意します。

3DP24_10

筋が入って見えるのはヒビではなく反射です。

 

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

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

まずは前回の写真・・・

3DP2

前回投稿した時の写真

 

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

 

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

3DP2_3

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

3DP2_4

ArduinoMEGA256+RAMPS1.4

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

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

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

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

PropellerGuard

プロペラガード

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

PropellerGuard

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

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