モータの鳴らし方byHanDen

電子工作の初心者がモータを演奏したりVVVF音を再現したりする方法を紹介するブログ ホビー向けの電子工作を基礎から書いていきます 記事のミス等のお問い合わせはTwitterにてお願いします。 当ブログを参考に製作をする際は必ず自己責任にて行ってください 当ブログを参考にしたことによる損害等の責任は一切負いません ドメイン取得につきURLを http://vvvf.blog.jp から http://blog.henden.net に変更しました

製作日記

製作日記2 ステッピングモータで音楽を鳴らしてみた3

前回までで子機側のプログラムが完成したので、次はマスター側のプログラムです。
1
2
マスター側のプログラムは基本的にはこれだけです。基板側のプログラムの逆の処理を行っているだけですね。また、あらかじめsetup関数内でシリアル通信の起動である「Serial2.begin(19200)」を実行しています。
使い方は、serialSent関数を第1引数に送り先のID、第2引数に周波数を入れて実行するだけです。また、音を止めるときは周波数に0を入れます。

これを音楽の分、ひたすら書くと音楽が完成ですが、書くのがあまりに大変なので、Midiファイルを読み込めるライブラリなどを使用すれば多少楽になると思います。

 

そして、そのあと格安で基板を製造できる業者を発見したので、チェナーダイオードとゲートドライバ電源の瞬停対策用のコンデンサを取り付けた基板を作り直しました。
3
4

そして届いた基板がこんなかんじ
P_20171207_185217_vHDR_Auto
安いのになかなかきれいにできました。

 

本当は実装したいのですが、部品が届かないのでケースファンを演奏してみることに

プログラムをこんな感じに書き換えて、1枚の基板で2つのケースファンを演奏できるようにします。

5

これが初期設定などです。ケースファンを演奏する場合は出力ピンのPWM機能を利用します。そしてその周波数を変更することで音楽にします。今回は8bitタイマーの位相基準PWMを使用しました。

6

これがPWMの周波数を設定する関数です。16bitタイマーに比べると出せる周波数の範囲が狭くなり、精度も悪化してしまいます。

7

これが、通信部分です。モータごとにIDを振っておき、IDの種類によって無視かどちらのモータのデータであるかの判別を行っています。

 

このプログラムでケースファンを演奏するとちゃんと演奏することはできました。ただ、まだ動画を撮れていないので動画は後日紹介します。

製作日記2 ステッピングモータで音楽を鳴らしてみた2

基板が完成したので、今回も最初は直流モータで実験。

プリンタ用のモータでは問題がなかったので、540モータでも実験を継続。しばらくは問題なく動いていました。ところが…調子にのって回していてうっかり出力をショートさせてしまい、動かなくなってしまったのです… 

その状態でしばらく通電しているとゲートドライバが異常発熱していることが判明。なのでとりあえず、ショートしたFETにつながる2つのゲートドライバを交換して、出力が出ていることを確認してから再度、モータを回します。

瞬間だけ動くような気がしたものの、動かない… もしかして、のこりの2つのゲトドラが悪さしている?とか考えて全部交換してもやっぱりだめ。ああやこうやしているうちにゲトドラの死骸が増えていきます…
P_20171103_165620_vHDR_Auto

しばらくして、ようやく原因っぽいものが判明。それは「モータからのサージ」なのです。実はこの時、電源の個数を減らすためにモータ駆動用とゲート駆動用の電源を一緒にしていたので、モータからのサージがゲートドライバに流れてしまうというものでした…

とりあえず、電源を分離して実験開始。あっさり問題なく動作しました。

 

ということで、今度はステッピングモータを回すプログラムを作成。

とりあえずは、通信なしてArduinoを使ってプログラミングをします。

1

汚いけど、一応ソースコードです。上の方で、モータの励磁ピンの配列を作成しておき、励磁のプログラムを書きやすくしています。そして、残りは音階の定義ですね。

2

続いて、初期設定と音階の設定のプログラムです。Arduinoじゃない何かが大量に混入しているとか気にしない… AVRのレジスタを叩けば軽量化した上に、処理が簡単なので…

3

次がステッピングを演奏するコアの部分です。周波数を入力すると、その周波数の音を奏でているのです。マイコンのタイマー割り込みの機能を使うことで、こんなにも簡単に書けます。ちなみに、このプログラムはレジスタを叩かなければ書けません!

 

そして、音楽を入れて演奏…


だいたい、音楽にはなっているものの、時々変な挙動をしています…

しばらくは、ステッピングモータが起動するのに若干脱調しているのだと思い込んでいました…(実は後から別の原因だと気が付きます…

 

続いて、和音を鳴らすことができるように、ID指令式のシリアル通信を実装。

最初はArduinoで書いていたのですが、ちょっとめんどくさくなったので、Arduinoのシステムを捨てて、Atmel Studioでプログラムを書くことに変更しました。

AVRのマイコンを触る時はデータシートがないとわけがわからなくなるとおもうので、こちらを参考に(https://avr.jp/user/DS/PDF/mega328P.pdf

いろいろとマイコンの内部的なお話がいろいろと書かれています。細かいところを読んでいると結構面白いですが、難しいし量が多すぎるので、必要なところだけを読んでいます。

 

とりあえず、このデーターシートを読みながらプログラムを作成

 4

最初は定義とか読み込みです。Arduinoと違っていくつかincludeしなければならないものがあります。<util/interrupt.h>は割り込みを使用するヘッダーファイル、<util/delay.h>delayを使うヘッダーファイルです。Delayを使うにはCPUのクロック数を与えないといけないので、ここで宣言をしています。(delay.hを読み込む前にF_CPUで定義)

5

ここでは、ピンの入出力の設定やタイマー割り込みの初期設定、シリアル通信の初期設定をしています。割り込みは種類がいくつかあるうちから、音楽を鳴らすのに最も適していそうな位相/周波数基準でOCR1ATOP値とした割り込みにしています。シリアル通信についてはArduinoと通信する関係で、通信速度以外この設定以外にはできません…

 
6

次は、入力された周波数から、その周波数分のパルスを生成する割り込みの設定を行う関数です。OCR1AでタイマーのTOP値を変更することで、割り込みの周波数を自由に変更できるという、マイコンの機能を使用しています。また、OCR1Bの割り込みを併用してduty比を落とせるようにしています。
実は先ほどのArduinoの時はタイマーのTOP値をICR1にしていたのですが、データシートを読んでいると、周波数変更をする場合はOCR1AをTOP値にするべき、と書かれていたのです…さっきの音がおかしくなっていた原因はこれだったというわけです。

7
そして、これがステッピングモータのパルスを生成するプログラムの実行部分です。割り込み処理を使うことで、ここまで簡単にパルス生成とduty比を下げるプログラムが書けてしまいます。

 
8

そして、これが今回のメインである通信の処理部分です。シリアル通信のデータを受信すると、この割り込み処理が開始され、最初に受信データを読み込みます。その後、データの最上位bitを解析し、最上位bit1であればID信号を意味するので、ID受信のモードに入ります。受信したIDが自分のIDと同じであれば、続行のデータを受信できるようにします。そして、受信データのバッファーのクリアを行います。(配列を最初に戻す)

自分のID宛ての情報だった場合で最上位bit0であった場合は、バッファーにデータを蓄えていき、既定のデータ数に達すると、バッファーのデータから周波数を抜き取ります。最終的に、パルス生成の割り込みの設定の関数へ周波数を引き渡すことで、モータを演奏します。

 

汚いソースコードですが、このような感じで複数のモータを1つのシリアルで管理できるようにやってみました。マイコンの機能を有効に使えば、案外簡単にかけてしまうのです。

 

続きは次回

製作日記2 ステッピングモータで音楽を鳴らしてみた1

 前回は高電圧でいろいろと問題を起こしてしまったので、今回は低圧で音を奏でることが可能なステッピングモータを演奏することにしました。前回のVVVFでモータにかける電圧を上げると音量が大きくなることが分かったので、今回は30Vまで印可できる仕様に、そして電流も過電流に耐えるように、駆動部はICを使わずにディスクリートの部品を使うことにしました。そして、シリアル通信を使って、和音の再生も可能にして、音楽をよりきれいに再生できるように考えてみました。

 

 まずはシステムの構成から

1
システムとしてはマスターのArduinoに音楽信号を保存するかPCから音楽のデータを受信し、その信号をマスターArduinoに接続されたstepVVVFID信号を合わせて送信します。自分と同じIDのデータを受信したstepVVVFは受信したデータから周波数を読み出し、その周波数で演奏を行います。IDを変えることで演奏先を変更できます。また、ゲート駆動用の電源は、駆動用の電源電圧が12V~14Vの時は接続を不要にしているため、12Vでステッピングモータを駆動させる時は配線が2本のみで済みとてもスッキリとしています。

 

まずは回路の設計を始めます。

前回はゲートドライバにIR2110を使いましたが、デッドタイム自動挿入機能がないという欠陥がありました。今回はRSで安くてかつ出力電流が大きめ、そしてデッドタイムの調整が可能という面白いゲートドライバ「L6384E」を使用することにしました。

ということで6384Eの英語のデータシートを端から端まで読んでみることに…

http://www.st.com/content/ccc/resource/technical/document/datasheet/group0/d3/35/0e/fc/db/e1/45/52/CD00169715/files/CD00169715.pdf/jcr:content/translations/en.CD00169715.pdf

2
内部構造はこんな感じと… どうやらブートストラップダイオードは内蔵されていると… そして入力はプルダウンでSDはプルアップっぽくなっていると

3
ピン配置はこんな感じで入力ロジックレベル的には、5Vあれば十分で、SD/DT端子に0.5V以下をかけると出力がシャットダウンされると。他は特に注意する点はなさそう

4
SD/DT端子に接続する抵抗器の大きさでデッドタイムが設定できる模様。今回は250ns200nsの中間をとって100kΩにすることにしました。

そして最初は気が付かなかった個所が、その下で、Vccth1,2です。上の方の定格のところに電源電圧が0.3~14.6Vって書いていたので、この範囲なら動作するんやなあーと思っていて、電源の電圧を9Vにしたら動作が止まって??ってなって調べてみると、電源電圧が一定を下回ると自動的に出力がダウンされる機能がついていたことが判明したのです… (あとから考えれば内部の半導体が、電圧が低いと動かないとかゲート電圧が落ちるとMOSFETの発熱が増えることへの安全対策かなあと…)

そして、アプリケーションノート(http://www.st.com/content/ccc/resource/technical/document/application_note/5c/00/05/fd/e5/65/46/97/CD00004008.pdf/files/CD00004008.pdf/jcr:content/translations/en.CD00004008.pdf)を読んでいると、18ページくらいに周波数が低い時で大容量のコンデンサをつける場合は外付けのダイオードを取り付けることを推奨するみたいなことが書かれていたので、一応、ブートストラップダイオードは取り付けることにしました。(100Hzでの駆動を想定して、ゆとりを持たせるとコンデンサが10uFになったので…)

ゲート抵抗とかその辺は適当に選びます。フォトカプラは前回と同様にTLP785を使用しましたが、スイッチング速度改善のために、プルダウン抵抗を680Ωに変更しました。(本当は高速なフォトカプラを使うべきなのですが…)

マイコンにはArduinoUNOにも用いられているAtmega328Pを使い、周辺回路もArduino準拠にして、プログラムをArduinoでも書けるようにしました。また、デバッグ用のLED4つ、電流センサ等に使えるアナログ入力を2つ搭載しました。今回は複数基板を数珠つなぎにするので、シリアル通信は、RXは通常通り配線しますが、TXは並列接続できないので、適当なピンでソフトウェアシリアルにすることに…

MOSFETは秋月で1つ50円で売られていたEKI04027を採用。耐電流は放熱板なしで計算して、約24Aでした。普通のICのモジュールと値段が大して変わらないのにこの耐電流はすごい… おかげで540モータも演奏できることに ポリスイッチは12A遮断を2つ並列で24A遮断にしました。

そして出来上がった回路図がこちら

main-1

続いて、プリント基板を設計

前回設計したstepVVVFは基板がスカスカであったのに、部品同士の干渉があるなどの不具合があったので今回は反省して部品同士が正しく取り付けられることを確認しながら設計することにしました。そして、前回に比べて大幅な密度アップをしました。

6

ついでにマイコンの書き込みボードも搭載しています。

 

Dビューがこちら

7
前回までの基板と比べると、大幅に高集積になってることがわかると思います。

 

このデータをElecrowに発注。

P_20171021_184418_vHDR_Auto
今回も黒色基板にしました。(左の基板は次の工作の分)

 

これを実装するとこんな感じ

P_20171102_184243_vHDR_Auto
ポリスイッチがしばらく届かなかったので、とりあえずはジャンパー線で代用しました。

実は今回はコスト削減のために部品を一部をebayで購入したので、届くのが遅かったのです…(実は当初はMOSFETebayで購入していたのですが、偽物が届いて急遽MOSFETを変更して、ポリスイッチも変わったという…)

続きは次回

製作日記 VVVFをつくってみた その2

前回からの続きです

 

とりあえずは直流モータ回してみよーってことで、直流モータを回してみる。

だが、ある程度の周期で回転が止まるという事故が発生…

ブートストラップコンデンサの容量が足りていなかった、という問題と、ブートストラップの使い方を間違えていたということが判明して、コンデンサを交換して対処。

P_20170913_185321_vHDR_On
 

問題がないことを確認できたので今度は誘導モータを用意

P_20170826_173903_vHDR_Auto


風切り音がすごいので音量に注意してください

とりあえずは、低圧で実験してみました。結果モータは回転したので、ちょっとずつ電圧を上げてみます。40Vぐらいまで実験して、問題がなさそうだったので、今度はDC280V(リップルがあるので厳密には平均DC260~270ぐらい)をかけてみることに。

「パチッ」という音とともにヒューズが飛んだ…

なんでだーと思ってもう一度低圧に戻してみると、どうやらどうやら瞬間的に過大電流が流れてる?なことが判明。実はプログラムでデッドタイムを入れていたはずが、ミスでうまく挿入されていないことが判明。ここでIR2110のゲトドラにデッドタイム自動挿入機能がないことも判明… 

とりあえずプログラム側で修正して、実験継続

 


モータからの異音に注意してください

今度は変な音がするなあと思いながらも、「回ったー」と思ってしばらく眺めていたら、またも「パチッ」と音がして停止…

あれれ…なんでだーと思ってヒューズを変えてもまた切れる… そして挙句の果てにはIGBTがお亡くなりに… 

いろいろと試しているうちに、どうやら非同期から同期に切り替わるタイミングかその逆でヒューズが切れていることが判明。プログラムを確認したら条件によって、デッドタイムが入らないことがわかって、修正

今度は問題なさそうだったので、今度はシリアル通信を追加 なんだがどうやら割り込みで失敗するのか、たまにモータから異音… 仕方がないのでシリアル通信は諦め…


P_20170909_133204_vHDR_Auto
とりあえずは京急もどきの音が流せたので、100円ショップでかった網の箱にVVVFのユニットを挿入して完全防止を図ることに

 


しばらく京急もどきの音を流して問題がないことを確認して、とりあえずは終了。(再現ではないので音はめちゃくちゃです…)

この後は本物を音を再現しようと思ってたのですが、シリアル通信だけで間に合わないくらいの処理速度ではちょっと無理があるなあということで、デッドタイム自動挿入のゲートユニットを設計することに、続きはかなり先に実施することに変更しました。

壊した部品はヒューズが10本くらい、そしてIGBT2つ… 自分の実力のなさが浮き彫りになった一作目の工作でした。

製作日記 VVVFを作ってみた その1

前回まではVVVFの設計のお話と回路設計ツールのお話をしていましたが、今回は実際に作ったお話をしたいと思います。

 

まずは基板の構成を考えました。パワー側は、AC100Vを、トランスを使って200Vに変換し、それを整流回路を使ってDC280Vに変換して、VVVFのパワー電源を確保しました。そして、論理側は、Arduinoで3相交流の波形を生成して、ゲートユニットでゲート信号を作成、そしてメインのパワーユニットに供給という形で組んでみました。

1

 

まずは、パワーユニットの設計です。

今回は電車のVVVFを再現するということもあって、効率が悪いのを知ってながら、ロマンでIGBTを使うことにしました。設計した時はモータが決まってなかったので、定格電流3A4.5A設計として設計してみました。IGBTを「RJH606DPK」を使って、計算をしてみたら、秋月で60円で売られている「40*25*17mmの放熱板」ではちょっと放熱性が不足するなあとなって、一番大きい「54*50*15mmの放熱板」を使うことに。

ところが、後になってからスイッチング損失の計算で1桁間違えていることに気が付いて、実は小さい方で足りたという事故… まあ放熱性が高いことには問題ないのですが…

一応計算はこんな感じ。後のゲートドライバの設計の都合上とかでゲート抵抗を大きくしたので、その辺も考慮してみました。

データシートではゲート抵抗→実際には50Ω tf 2倍  tf 1.2倍 程度で見積もり

遅延時間+上昇下降 4.378*10-7  S

 発熱量 電流4.5Aで損失7.875W  設計定格3Aの1.5倍 

スイッチング損失 5kHz (50*2+200*1.2)*10-9*5*103 = 0.017W 

7.892W

許容温度-外気温  150-40 =110℃

 許容熱抵抗 110/7.892 = 13.94   13.94 – 0.42 =  13.52℃/W

 

あとはコネクタとかをちゃちゃっと決めて回路図を描きます。

回路図
初めてのKiCadだったので汚いです…

NETリストを出してプリント基板を作成

2
放熱板があるのでスッカスカ

 

3
3Dビューもあるけど、部品が特殊すぎて、3Dデータが全然ない…

こうやってパワーユニットは完成

 

次はゲートユニットの設計

メインとなるゲートドライバは秋月で見た目使いやすそーなやつってことで「IR2110」を選択。実はこれが後のプログラムでやらかす原因になってしまう…

まずは、ブートストラップコンデンサを計算して決定。最初は1uFで設計していました。実はこれも計算が間違っていることに作ってから気が付く… 原因はゲートチャージ[C]を入れないといけないところにゲート容量[F]を入れていたという初歩的なミス。(IGBTだったからゲートチャージが書かれていなくて、うっかりゲート容量で計算していたというオチ)まあ、最終的には47uFになりました。

ダイオードとかは数が安くて特性がよかった「KCF16A60」を使用。ただし、TO-3Pパッケージだからやたらに大きい…

そして、IR2110は一応ロジック側とパワー側でGNDが分かれているから、フォトカプラはいらないかなーと思いましたが、完全な絶縁ではなさそうだったので一応フォトカプラを利用。安いTLP785を使いました。出力にはプルダウンを何も考えずに挿入。実はこれはかなり危険な行為だった… (ゲトドラの種類によってプルアップが定位のものがあったという)

他はテキトーに選んで回路図を書きました。

4

そしてプリント基板を設計

5

場所がまだあったので、整流回路も同じ基板に面付することに

 

なので、整流回路の設計

倍電圧整流じゃないのでブリッジダイオードを使用。電流だけ見て適当に「KBJ410

を選択。コンデンサも電圧変動とかを考慮して計算。出力2A200uF程度あればよさそうだったけど、ゆとりをもって100uF3つ付けられるように。耐圧はギリギリだけど400V。これ以上のがなかったからやむなし…

プリント基板を作るのに必要なので、一応回路図を書いて

6

基板を設計

7

面付した3Dビューがこんな感じ

8
コンデンサがちょっとおかしいのは気にしない…

 

そしてデータを出力してelecrowに発注

P_20170630_202930

到着 結構出来が良てびっくり

9

10

Elecrowに頼まなかったマイコン上の基板も適当に設計しておいて

 

P_20170714_224251
ほかにもトランスとかマイコンとかを買って

P_20170804_184459_vHDR_Auto
秋月も頼んで、組み立て開始

 

P_20170805_155833_vHDR_Auto
ICの配置をミスっていて端を削るというミスをしてたり…

 

P_20170805_172836_vHDR_Auto
パワーユニットは問題なかった

P_20170811_142702_vHDR_Auto
見た目がしょぼい、Arduino上の基板

 

あとは配線をつないで、プログラムを描いて実際に実験を開始

続きは次回

ギャラリー
  • KiCad5の使い方 4章 シンボルエディターの使い方
  • KiCad5の使い方 4章 シンボルエディターの使い方
  • KiCad5の使い方 4章 シンボルエディターの使い方
  • KiCad5の使い方 4章 シンボルエディターの使い方
  • KiCad5の使い方 4章 シンボルエディターの使い方
  • KiCad5の使い方 4章 シンボルエディターの使い方
  • KiCad5の使い方 4章 シンボルエディターの使い方
  • KiCad5の使い方 4章 シンボルエディターの使い方
  • KiCad5の使い方 4章 シンボルエディターの使い方
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計: