モータの鳴らし方byHanDen

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

制御編 第2回 マイコンで使うビット演算

 前回はマイコンのハードウェアの設計のお話をしましたが、今回からはマイコンのプログラミングについて書いていきたいと思います。まずは、マイコンのレジスタを叩く際に必須と言えるビット演算のお話をしたいと思います。

 

 マイコンをはじめとするコンピュータの世界はデジタル、つまり01しかない世界です。マイコンも例外ではなく大量の01の組み合わせで動いています。コンピュータの世界では1つの01のデータを1ビット、これを8つ組み合わせたものを1バイトと呼びます。つまり1バイト=8ビットというわけです。一般的にはビットはコンピュータのビット数(パソコンだと32ビットだとか64ビットとか言いますね)やシリアル系の通信速度(wifiとかLANの通信速度の〇〇bpsといいますね)で使われて、バイトは容量系の単位(RAM16GBとかROM64GBとかいいますね)に使われることが多いです。

 前置きはこの程度にしておきます。マイコンには変数などで使われる通常のメモリのほかに、レジスタという特殊なメモリ領域があります。このレジスタを使ってマイコンに搭載された機能である入出力などを操作します。今回使用するマイコンは8ビットのAVRマイコンなのでレジスタは基本的に8ビットになっています。例えばポートの出力状態を設定するレジスタにおいても最大8つのポートごとにレジスタが割り当てられているのです。このうち1つのポートだけを操作したい場合などに必要な概念がビット演算というわけです。

ビット演算の基礎の基礎としてまずは論理演算を紹介します。

AND(論理積)

and
and

ANDは論理積ともいえ、日本語で言うと「AかつB」、論理式で表すと”AB” ”AB"などとなります。つまり、掛け算なので入力にどれか1つでも0があった場合は出力が0となります。例えば01ANDすると出力は011ANDすると出力は1となります。C言語のプログラムでは“&&”と表します。

 

OR(論理和)

OR
or

ANDは論理和ともいえ、日本語で言うと「AまたはB」、論理式で表すと”A+B” ”AB”などとなります。つまり、足し算なので入力にどれか1つでも1があった場合は出力が1となります。例えば01ORすると出力は100ORすると出力は0となります。C言語のプログラムでは“||”と表します。

 

NOT(否定)

 NOT
not

NOTは否定ともいえ、日本語で言うと「Aではない」、論理式で表すと”Ā”などと表します。0が入力された場合は1が出力され、10以外)が入力されると0が出力されます。入力に対して出力が反転されるので、論理回路では反転を意味する”inverter”とも言われます。C言語のプログラムではでは”!”と表します。

 

NAND(否定論理積)
NAND
nand

NANDANDの出力にNOTをかけたものです。日本語で言うと「(AかつB)ではない」、論理式で表すと1などとなります。つまり、掛け算の否定なので入力にどれか1つでも0があった場合は出力が1となります。例えば01NANDすると出力は111NANDすると出力は0となります。C言語ではANDしたあとにNOTをかけて「例えば:!(A&&B)」実行します。論理回路ではよく使われますが、マイコンのプログラムの場合は使う機会は少ないかもしれないです。(特定のビットを0にするために入力にNOTをかけてからANDすることは多いですが…)

 

NOR(否定論理和)
NOR
nor

NORORの出力にNOTをかけたものです。日本語で言うと「(AまたはB)ではない」、論理式で表すと2などとなります。つまり、足し算の否定なので入力にどれか1つでも1があった場合は出力が0となります。例えば01NORすると出力は000NORすると出力は1となります。C言語ではORしたあとにNOTをかけて「例えば:!(A||B)」実行します。NANDと同じく論理回路ではよく使われますが、マイコンのプログラムの場合は使う機会は少ないかもしれないです。

 

XOR(排他的論理和)
XOR
xor

XORは排他的論理和と言われる、少し変わった論理演算です。論理式で表すと3となります。入力の1の数が奇数の時に1を出力し、1の個数が偶数の時に0を出力します。こちらは論理回路では使う機会が比較的少ないですが、マイコンのプログラムではそこそこ使います。

 

以上の6つが論理演算ではよく使われてます。基本的には前半の3つであるANDORNOTですべての論理演算が可能です。また、NANDNOR2つでもすべての論理演算が可能です。

 

次に今回の本題であるビット演算のお話をしたいと思います。ビット演算では先ほどまで紹介した論理演算をビット単位で行います。ビット単位でのビット演算を考えるため、まずは演算を行う数値を2進数で表します。2進数表記した値を1桁ずつ論理演算するとビット演算になります。まずは、ANDORNOTXORのプログラミングにおける記号とビット演算するとどのようになるかを紹介します。

AND

C言語での記号は”&” です。論理演算の記号である”&&”と間違えないように注意してください

A 10101010

B 11110000

A & B 10100000

 

OR

C言語での記号は”|” です。論理演算の記号である”||”と間違えないように注意してください

A 10101010

B 11110000

A | B 11111010

 

NOT

C言語での記号は”~” です。

A 10101010

~A 01010101

 

XOR

C言語での記号は”^” です。

A 10101010

B 11110000

A ^ B 01011010

 

C言語ではこの4つのビット演算を使用することができます。これらを使ってレジスタの特定のビットのみの抽出などを行っていきます。

まずはレジスタの例として、atmega328PのポートBの状態(HIGHLOWか)を設定するレジスタを使ってみたいと思います。

Atmega328Pのデータシート(https://avr.jp/user/DS/PDF/mega328P.pdf)のページ65の図の部分より、ポートBの出力状態を切り替えるレジスタは”PORTB”であることがわかります。
2

続いて下部のビットの一覧部を拡大します。
3

図のようにビット0PB0の状態 を制御、ビット1PB1の状態を制御…といったようになっており、各ビットに0を入れると対応するポートがLOW1を入れると対応するポートがHIGHになります。このように、1つのレジスタでPB0からPB7までの8つのピン(厳密にはPB6PC7はたいてい水晶を接続するので6ピンになることが多い)の状態を制御する仕様になっていることがわかると思います。そのため、1つのピンのみを制御しようとして、レジスタに直接値を入力するとPB0からPB7までのすべての状態が変わってしまい不都合が生じてしまいます。ここで必要なのがビット演算というわけです。特定のビットのみを操作したいときは、現在のレジスタの状態と操作するビットが立てられた(1にされた)値をビット演算で比較をします。現在のレジスタの状態はデータシートのビット一覧(上の図)のアクセス種別の表記より読み込みが可能であることがわかります。そのためこのような処理が可能というわけです。

特定のポート(ビット)のみを操作する方法を、例を使って紹介していきたいと思います。それぞれ操作する前の状態はわからない(テキトーな値)になっているとします。

1        PB4HIGHにしたいとき(ビット4のみを1にする)

現在の状態に操作するビットを立てた(1にした)値をORします。 

操作前のPORTB 10101010 (Aとする)

操作するビット  00010000 (Bとする)

A | B 10111010 PORTB

このようにすると元の状態が何であったとしても操作したいビットが確実に1に設定され、ほかのビットは何も影響を受けないことがわかると思います。これをC言語で省略せずに記述するとこのようになります。

PORTB = PORTB | 0b00010000;

ですが、操作するビットを2進数(プログラムでは”0b****”で示す)書いていては入力が大変で、読みにくいです。そのためこれを16進数(プログラムでは”0x**”で示す)に変換します。また、C言語での省略表記も合わせて使うとこのようになります。

PORTB |= 0x10;

先ほどの書き方に比べてとてもスマートになりますね。ですので、基本的にはこの書き方を使っていきたいと思います。

 

2        PB4のみをLOWにしたいとき(ビット4のみを0にする)

操作するビットを立てた(1にした)値にNOTをかけて反転させた値と現在の状態をANDします。

操作するビット 00010000 (Bとする)

~B 11101111 (操作するビットの反転)

操作前のPORTB    10111010 (Aとする)

操作するビットの反転  11101111 (~Bとする)

A & ~B   10101010 PORTB

こうすることで、操作したいビットが確実に0になり、ほかのビットは影響を受けません。C言語で書くと

PORTB = PORTB & (~0b00010000);

となり、省略系にして

PORTB &= ~0x10;

と表せます。

3        PB4のみ状態を入れ替える(ビット4が1だった場合0、0だった場合1にする)

現在の状態と操作するビットを立てた(1にした)値のXORをかけます。

操作前のPORTB 10101010 (Aとする)

操作するビット  00010000 (Bとする)

A ^ B 10111010 PORTB

元のビットの状態が逆のパターン

操作前のPORTB 10111010 (Aとする)

操作するビット  00010000 (Bとする)

A ^ B 10101010 PORTB

このようにすると操作したいビットの状態が入れ替わり、ほかのビットは影響を受けません。C言語で書くと

PORTB = PORTB ^ 0b00010000;

省略して

PORTB ^= 0x10;

と表せます。

レジスタの特定のビットのみを操作するときは基本的にはこの3つを使うことが多いと思います。ビット演算ではほかにも特定のビットのみを取り出したいときにANDを使うときもあります。方法としては元の値に取り出したいビットを立てた(1にした)値をANDします。

例えば、元の値から下4ビットのみを取り出す場合はこのようにします。

元の値    10101010 (Aとする)

取り出すビット00001111 (Bとする)

A & B   00001010

このようにすると上4ビットはすべて0で下4ビットは元の値がそのまま取り出せることがわかります。C言語で書くと以下のようになります。

C = A & 0b00001111; (元の値をA 下4ビットを取り出した値をCとしている)

省略して

C = A & 0x0F;

と表せます。(元の値がレジスタであったり、元の値を保持することが多いので、”A&=0x0F;”と書くことは少ないです。)

この方法はマイコンのレジスタから値を取り出す際や通信の際によく使う手法です。

ビット演算は以上として次回はビットシフトのお話をしたいと思います。

制御編 第1回  マイコンのハードウェア

前回まではハードウェアの設計のお話でしたが、今回からはVVVFや音楽を奏でるうえで必要なマイコンのお話をしたいと思います。

一言にマイコンと言っても実はいろいろな種類のマイコンがあります。一般的に知られているマイコン(ボード)といえばArduinoRaspberry Piなどがあります。両方ともデジタル入出力やシリアル通信などの低レベルなIO端子が搭載されていますが、この2つには大きな違いがあります。前者のArduinoはいわいる狭い意味でのマイコンで、後者はOSが入った小型のパソコンです。そのためそれぞれに得意不得意な処理があります。まずはその2つの系統の違いを紹介します。

 

Arduino系統

P_20171230_180217_vHDR_On
・基本的にOSを持たない。持っていたとしても非常に簡素なものである

・時間関係の処理の精度が比較的高い。

・コンパイルは外部で行ったうえで書きこむ。

・計算速度は比較的遅い。

 

Raspberry Pi 系統

P_20171226_135957_vHDR_Auto
・パソコンのように内部に高機能なOSを持つ。

・ほかの処理などにより時間関連の精度が低い。(OSによっては正確に処理できるものもある)

・本体でプログラムを書きコンパイルすることも可能。

・計算速度は比較的早い。

 

主な違いはこのようなところです。Arduinoの系統のマイコンは、モータ駆動回路など機械に近い部位に、Raspberry Pi 系統のマイコンは画像処理などの比較的重たい処理に向いているといえるでしょう。筆者はモータを演奏するのがメインであるためマイコンはArduinoの系統のものを使います。なのでここからのお話はArduino系統の狭い意味でのマイコンの方の話をしていきたいと思います。

 

狭い意味でのマイコンとしてArduino系統と書きましたが、実はこの中にもいろいろな種類のマイコンがあります。その中でもまずはマイコンボードとマイコンの区別をしたいと思います。

マイコン

P_20171230_173519_vHDR_On
AVRPICH8そしてARMなどマイコンのチップ単独のものである

実際に使用するには周辺回路を設計する必要があるほか、書き込み回路や開発環境などを別に用意しなければならない

またレジスタを叩く必要があるなどプログラムの難易度も比較的高い

石だけなので安いため大量生産する場合に向いている

 

マイコンボード

P_20171230_173316_vHDR_Auto
Arduinombedなどマイコンとその周辺回路が1枚の基板上に乗せられて販売されているのもの

書き込み回路が内蔵されていることが多くUSB接続などで直接書き込める。また開発環境もマイコンボードを作っているメーカーが用意してくれていることが多い

レジスタを叩かずに済む場合が多くプログラムの難易度も低いことが多い

初心者や試作に向いている

 

マイコンとマイコンボードの違いはこのような感じです。

マイコンボードで最も一般的に使われているのはArduinoで情報量やライブラリも充実していて非常に使いやすいマイコンボードと言えます。しかし、性能があまり高くないといった問題やPWM周波数が固定などモータ演奏に使うにはちょっと難があったりもします。

逆に近年はやり始めたmbedESP32などのARM系のCPUを搭載したマイコンは性能が高いという利点がありますが、情報量が少ないという問題があります。ちなみにmbedの場合はPWMの周波数を任意に変えれるようです。最近はArduinoでもARMCPUを搭載したものも出てきていますが、現状あまり普及してるとはいいがたいですね…

 

個人で基板を1枚のみ作って楽しむ場合はマイコンボードを使うと安価で楽ですが、自作の基板とのドッキングが難しくなるという問題もあります。そのため自作の基板に直接マイコンを乗せて周辺回路まで構成するということもよくありますAVRマイコンを使う場合はマイコン内部にArduinoのプログラム(ブートローダ)を入れると自作のArduinoとして使うこともできてしまいます。筆者のstepVVVFArduino Uno互換の設計をしています。

 ここまではマイコンの一般的なお話をしてきましたが、ここからは筆者がモータ演奏や初版のVVVFに使用しているAVRマイコンとその拡張である自作のArduinoのお話をしたいと思います。

まずはマイコンのハードウェアの設計のお話をしたいと思います。

今回は筆者が実際にstepVVVFに使用したatmega328Pを例にして話をしたいと思います。

まずはatmega328Pのデータシートを

https://avr.jp/user/DS/PDF/mega328P.pdf

そして、ハードウェア設計に必要なピン接続図はこちらです。

1
マイコンのハードウェア設計のうち基本回路についてはデータシートで決められたとおりに接続しなければなりません。最初にマイコンの端子とそれに対応する機能の紹介をしたいと思います。

まずは全体に共通する標準IOと外部割込み(PCINT)のお話から

各端子のピン番号のすぐ横にPB〇、PC〇、PD〇という番号があります。これがマイコンの基本的な入出力(HIGHLOWの入出力)である標準IOのポート番号と言われるものです。PBはマイコンのPORTBPCはマイコンのPORTCといったように内部的にいくつかの組に分けられており、プログラムではこのPORTごとに制御を行います。そのため、同時に操作する必要のある出力は同じポートにまとめておくとプログラムが書きやすくなります。

 

次に外部割込みPCINT)のお話です。Atmega328PではすべてのIOポートにPCINT〇〇という表記があります。これは外部割込みというピンの状態が変化したときに、動作を始めるマイコンの機能が使える端子を示しています。ただしPCINTは端子ごとに個別に割り込みを設定することができません。個別の割り込みはのちに紹介するINT〇を使わなければなりません。

 

続いてPWM出力のポートのお話です。マイコンにはPWMと呼ばれるONOFFを高速で繰り返して疑似的なアナログ信号を作り出すPWM出力と呼ばれる機能が搭載されています。この機能が搭載されているのはOCR〇□(〇には1~3の数字、四角にはAB 例:OCR0A)と書かかれている端子です。Atmega328Pの場合はピン番号が5,11,12,15,16,17の端子にこの機能が搭載されています。そしてOCR〇□のうち〇の部分に書かれた数字がタイマー番号を示していて、このタイマー番号ごとに周波数などを設定することができます。いろいろな都合上同じモータの正逆は同じ番号のポートからとると良いです。ちなみに、このONOFFを繰り返す速度を変えることで音楽を奏でることができるのです。

 

ここからは端子ごとの個別の機能を紹介していきます。

ピン番号1 この端子はマイコンのリセット機能をもつ端子です。通常の設定ではこの端子にLOWを入力するとマイコンがリセットされます。基本的に10kΩでプルアップしておきます。

ピン番号2,3 この端子はシリアル通信の機能を持っています。シリアル通信を使用するときは2番ピンが受信側、3番ピンが送信側になります。回路を設計するときにはRX,TX(受信,送信)の向きに注意してください。くれぐれもマイコンやシリアル変換アダプタのRX同士やTX同士を接続しないように…

ピン番号 4,5 この端子は個別の外部割込みの機能を持つ端子です。PCINTと違いピンごとに別々の割り込みとして処理できるほか、PCINTに比べて選べるモードが多かったりします。

ピン番号 9,10 この端子は外部クロックである水晶やセラロックを接続するポートです。マイコン内部にもクロック発生器は入ってますが遅いので、Arduionでは外部クロックとして16MHzの水晶を取り付けています。水晶を取り付ける場合は22pF程度のセラミックコンデンサも取り付けないと発振しないので気を付けなければなりません。

ピン番号 12,13 この端子はアナログ比較器機能を持っています。12,13番ピン入力電圧を比較して、条件が整った場合に割り込みが実行されます。

ピン番号 16,17,18,19 この端子はSPI通信の機能を持っています。SPI通信を使用するときはSS,MOSI,MISO,SCKの各端子に接続します。またAVRマイコンに書き込みを行うときもこのSPI端子を使用します。

ピン番号21 AREF この後に示すアナログ入力の基準となる電圧を設定するピンです。特に理由がない限りVCCに接続します。

ピン番号2328 アナログ入力 A/D変換機を通してアナログ電圧を識別できる端子です。プルグラムはAREF端子と同じ電圧が印可されたときに最大値(通常1023)、0Vが入力されたときに最小値(0)を読み取ります。

ピン番号 27,28 この端子はI2C通信機能を持っています。I2C通信を使用するときはSDA,SCL端子にそれぞれ接続します。ただしI2Cは規格上プルアップ抵抗が必須なので注意が必要です。

 

以上がマイコンの各端子の持っている機能の簡単な説明です。細かな説明はプログラムの時に紹介します。以上のことを考慮して回路の設計を行ってください。例として筆者の製作したステッピングモータやケースファンを演奏するstepVVVFの基板を紹介します。

2
この基板はタイマー02の端子にそれぞれモータを接続して、PB1,2PD7,8にデバッグ用のLED、そしてモータの出力停止をPC0~3,センサの入力をADC4,5に接続しています。また、この基板は数珠つなぎをするためシリアル通信はRXのみ接続して、TXはソフトウェアシリアルを使用するためにPD2にしています。

大体こんな感じに接続すれば使えます。

 

ハードウェア設計の最後にマイコンへの書き込み回路の紹介をします。

まずは通常のAVRマイコンの書き込み方法です。

通常AVRマイコンの書き込みにはSPI通信を使ったICSPと呼ばれる方法でマイコンに書き込みを行います。ピンヘッダーに以下のように接続を行うと書き込み回路の完成です。

3
次にArduinoとして書き込みを行うときの配線です。

4
基本的にはこのように配線を行います。注意しなければならないのはDTRピンが0.1uFのコンデンサを介してマイコンのResetピンに接続されていることです。

最後に通常のAVRArduinoの両方のモードの書き込みに対応した、書き込み専用基板の回路図を紹介します。

5
電源は書き込み用の変換基板から供給されるので省略しています。構造としてはマイコンが動作するために必要な電源端子への接続と、水晶を接続したうえで、マイコンから書き込みに必要な端子を引き出して使用しているだけの簡単な回路となっています。

製作日記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上の基板

 

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

続きは次回

KiCad編 第10回 ユニバーサル基板や切削基板でのKiCadの設定

2019/12/25
KiCad5対応の記事を公開しました。
http://blog.handen.net/archives/21338893.html
なお、本記事については応用編でKiCad4と内容の差が無いためKiCad5での新たな記事はありません。デザインルールの設定箇所のみ「5章プリント基板エディタPcbnewの使い方 その1」の5-3節を参照してください。

前回まではKiCadの基本の使い方を紹介してきましたが、今回からは少し応用した使い方を紹介したいと思います。今回はプリント基板を作成するPcbnewでユニバーサル基板や切削基板加工機で使う方法を紹介します。

まずは、ユニバーサル基板(片面で配線はすずめっき線の場合)での使い方です。
基本編で紹介した方法で、回路図を描き、NETリストを出力し、Pcbnewでそれを読み込んでおきます。
次にグリッドの設定を行います。
 1
画面上部のグリッドの選択部(図の黄色□)から2.54mmを選択します。これにて、グリッドの1ピッチがユニバーサル基板のピッチと一致するので、各グリッドをユニバーサル基板のパッドとして考えて部品を配置していきます。
片面のユニバーサル基板の場合、配線を行う上で、非常に高い確率で配線をまたぐ「ジャンパー」が必要になります。通常KiCadでジャンパーを入れる場合、回路図エディタ上でジャンパーを、回路を構成する部品として登録しなければなりません。しかし、これは面倒なので、表面の配線をジャンパーの代わりに使用します。(片面基板なので通常の配線は裏面の配線を使います)やり方は簡単で、ジャンパーを開始する点と終了する点で「ビア」を配置し、配線を表面に移動させます。ただし、あくまでジャンパーなので途中で曲げたりすることはできないので注意してください。

2
ユニバーサル基板で作成する基板をKiCadで描くとこのように出来上がります。はんだづけの時はこれを見ながらはんだ付けを行います。3Dビューも併用するとよりはんだ付けが行いやすいかもしれません。

次に切削基板加工機(片面)で使用する方法です。
切削基板加工機で作成するプリント基板の場合は、原理上以下のように配線やパッドが設計上より切削幅分細くなってしまいます。(加工機の種類によっては切削幅分の補正をしてくれる機種もあるかもしれませんが、当方で使える加工機はそのような機能はありません)
 3

この切削幅は機種や設定により変更できますが、細くてもコンマ数ミリ程度はあります。そのため配線幅を0.2mmとか0.3mmとかに設定すると、削られてしまって配線がなくなってしまいます。同様にパッド部も穴とパッド径の差が少ないと、穴だけのはんだづけが不能なパッドができてしまいます。
そして、KiCadの標準のライブラリのパッド径は1.6mm程度のものが多いため、そのままでは穴だけのパッドになってしまう危険性があります。そのため、標準のライブラリを編集して、パッド径を2.0mmから2.2mm程度に拡張する必要があります。安全性を考えると2.2mm程度に拡張するのがよいでしょう。拡張の方法は前回紹介した方法で可能です。ただし、数が多いので最後に紹介する裏技を使った方が速いと思います。

切削加工機での手順としては、最初に切削加工機用のフットプリントライブラリを作成しておきます。続いて、回路図エディタで回路図を描き、その際にフットプリントは、切削基板用のものを設定しておきます。その後は、NETリスト出力、Pcbnewで読み込みまではいつもの手順で行います。
次にデザインルールの設定を変更します。上部ツールバーの「デザインルール」「デザインルール」をクリックして、デザインルールエディタを開きます。
 4
原理上クリアランスはほぼいらないので0.1mmに設定しています。ただし、加工機側で指示がある場合はその指示に従ってください。配線幅はゆとりを持たせて、1.0mmと設定しておきます。ビアはここではジャンパー線の根本として使用するため、パッドと同じでビア径を2.2mm、ビアドリルを0.8mmに設定しています。最終的に画像のような設定になっていれば問題ないでしょう。
このあとは、通常と同じようにフットプリントの配置と配線を行います。ただし、ジャンパーはユニバーサル基板と同じ要領で行います。

また、配線途中で下図のように、1番ピンの四角パッドで、斜めの配線が不能になる場合があります。その場合は、1番ピンの見分けがつきにくくなりますがフットプリントを編集して、丸パッドにすればよいでしょう。
 5

6
 最終的にこのような基板になります。

最後にフットプリントを編集する裏技を紹介します。
まず初めに、前回の最後で紹介したように、自作のライブラリフォルダを作成しその中に、切削基板で使用するフットプリントを入れておきます。続いて、編集するフットプリントをテキストエディターで開き、パッドの項目である「(pad 1 thru_hole rect (at 0 0) (size 1.6 1.6) (drill 1.0) (layers *.Cu *.Mask))」のような項目を探します。
その行内の「(size 1.6 1.6)」となっているところがパッドのサイズを設定している項目なので、これを「(size 2.2 2.2)」と書き換えることでパッド径を2.2mmに変更することが可能です。置換などを使うことでより速く置き換えができると思います。なお、デフォルトのパッド径はフットプリントにより多少差があるので気を付けてください。
7
 

KiCad編 第9回 フットプリントエディタの使い方

2019/12/25
KiCad5対応の記事を公開しました。
http://blog.handen.net/archives/21338893.html
一旦目次にリンクしますので読みたいページを選択してください。

前回までに紹介した手順で基板は基本的には完成させることは可能ですが、場合によってはフットプリントを編集しなければならない場合があります。今回はその編集方法を紹介します。

 

フットプリントの修正は基本的にはプリント基板エディタのフットプリント版のようなもので、配線がなくなり、フットプリントがパッドに置き換わった程度と考えればよいと思います。ただしファイルの入出力方法が少しややこしいので注意が必要です。

 

まずは、基板上に配置したフットプリントを編集する方法です。

プリント基板エディタ上で編集したいフットプリントを右クリックして「フットプリント〇〇」「フットプリントエディタで編集」(下図←)をクリックしてフットプリントエディタを起動します。
1

2
起動した画面はこのようになっていて、上部のツールバー以外はプリント基板エディタに似た雰囲気になっています。

とりあえず、基板上のフットプリントを編集する際に使う機能を紹介しておきます。

1      現在のボードのフットプリントを更新:現在編集しているフットプリントの変更点を基板上に反映させる機能です。

2      パッドを追加:コンポーネントの端子や固定穴などをあけるパッドを追加する機能です

3      図形ライン(円,円弧,テキスト)を追加:シルク上に図形や文字などを追加する機能です

 

まずは、パッドやシルクの文字や図形を移動する方法です。手順はプリント基板でのフットプリントの移動と同様で、移動したいものにカーソルを当てて「M」キーを押し、移動先でクリックします。移動の位置は基本的にグリッドの位置を参考にすればよいと思います。場合により画面右下の座標表示や、次に紹介するパッド設定で座標を入力して設定します。

グリッド幅は上部の「グリッド:〇〇mm」部(下図)で調整します。基本的には1.27mm2.54mm程度がよいでしょう。
3

 

次にパッドの設定の変更です。ここでは穴の大きさや種類、穴の周囲のパターンの大きさ(以後パッドサイズ)やパッドの位置などを変更できます。

編集したいパッド上にカーソルを置いたうえで「E」キーまたは右クリック「パッドを編集」(下図←)をクリックして「パッドプロパティ」を開きます。
4

5
この画面でパッドの各種設定が可能です。設定項目を以下に箇条書きで説明したいと思います。

パッド形状(←1) パッドの種類を変更できます。スルーホール部品や固定穴は「スルーホール」、表面実装部品は「SMD」を選択します。本来固定穴はNPTHを使用しますが、NPTHの穴は業者により対応できない場合があるのでここではスルーホールにします。

形状(←2)パッドの形状を変更できます。基本的には円形ですが、部品形状や必要強度によって楕円などの形状に変更します。1番ピンの場合は四角にすると区別がついてわかりやすいです。

X(Y)位置(←3)パッドを配置する座標を入力します。原点(基本的に1番ピン)からの位置の距離を入力します。

サイズX(Y)(←4)パッドサイズを設定します。円の場合は直径、楕円の場合はX,Y各方向での直径、四角や台形の場合は幅と高さになります。円の場合は、サイズYは入力できません。(台形の場合上辺と下辺の差は「台形のデルタ」に入力します)

右上ドリル部

 形状(←5)ドリルの穴の形状を入力します。基本的には「円形穴」ですがコネクタなど足の形状に応じて「楕円穴」と使い分けます。

 サイズX(←6)ドリルの穴の直径を入力します。部品の足の直径に応じて変更してください。部品の足より少し大きめにしておかないと足が刺さらなくなるのでご注意ください。

 

また、固定穴にする場合はドリルの直径とパッドの直径を同じにすると良いでしょう。

基本的に設定する項目は以上です。基本的に変更することはないと思いますが、片面のみに銅箔を設けるなどをしたい場合は右側下部のレイヤーを変更します。

 

次にパッドの追加です。右側ツールバーの「パッドを追加」(起動画面の図の→2)をクリックしてパッドの配置モードに入ります。パッドを配置したい個所でクリックするとパッドが配置されます。特に何もしていない場合は、既存のほかのパッドと同じ設定で新しいパッドが追加されますが、パッド番号が1となっています。そのため、パッドの編集画面を開き、最上部のパッド番号を、追加したいパッド番号に変更してください。また、パッドの設定も変更する必要がある場合、先ほどと同じように編集します。

 

シルクへの図形の配置はプリント基板と同様の手順で作業が可能なので詳細は省略します。詳しくはプリント基板エディタの記事をご覧ください。また、シルク以外にも画面上のみで確認できる「F.Fab」や「B.Fab」レイヤーにも図形配置が可能なので必要に応じて使い分けてください。

 

編集が完了したら、上部ツールバーの「現在のボードのフットプリントを更新」(起動画面の図の↑1)をクリックして変更結果を保存します。

 

 

次にフットプリントライブラリの編集方法を紹介したいと思います。

6

まずは「フットプリントエディタ」(図の↑4)を起動させます。

起動すると、先ほどの基板上のフットプリントの編集画面と同じ画面が表示されます。ただし、画面内には何も表示されないときと前回編集したものが表示されるときがあります。

ここでは、先ほどの基板上のフットプリントの編集時と操作が大幅に異なる上部ツールバーの紹介をします。

7

7

1  アクティブなライブラリを選択してください:編集対象のライブラリを選択する機能です

2  アクティブなライブラリへフットプリントを保存:現在編集中のライブラリに変更した結果を保存する機能です。ただし、デフォルトのライブラリはProgramFilesに存在するため権限の関係上保存できないので注意が必要です。

3 新規ライブラリを作成して現在のフットプリントを保存:ライブラリを新たに作成してそのライブラリに編集したフットプリントを保存する機能です。

4      アクティブなライブラリからパーツを削除:編集中のライブラリに存在するフットプリントを削除する機能です。

5      新規フットプリント:ライブラリ内に新たなフットプリントを作成するときに使います

6      新しいフットプリントにフットプリントウィザードを使用:ウィザードを使って新しいフットプリントを作る機能ですが、作れるフットプリントが限られています。

7      ライブラリからフットプリントを開く:既存のフットプリントを編集する場合など、既存のフットプリントを開きたいときに使用します。

8      フットプリントをインポート:ライブラリに登録されていないフットプリントなど、フットプリントのファイルを直接開いて編集したい場合に使います。

9      フットプリントをエクスポート:フットプリントをファイルにエクスポートする機能です。

 

それでは、ライブラリの編集を始めていきましょう。フットプリント自体の編集方法は先ほど紹介したので、ここでは編集を始めるまでの処理と、編集後の処理を紹介したいと思います。

まずは、編集するライブラリの選択をします。ただし、初期状態で導入されているライブラリはProgram Filesに位置していて、上書き保存ができないので、初期のライブラリを編集する場合は、この設定の意義はあまりありません。

まずは上部ツールバーの「アクティブなライブラリを選択してください」(図7 ↑1)をクリックしてライブラリの選択画面を開きます。

8

編集したいライブラリを選択して下部の「OK」をクリックするとアクティブなライブラリとして選択され、ライブラリ内に保存などが可能になります。

 

次に既存のライブラリ内のフットプリントを開く方法を紹介します。

上部ツールバーの「ライブラリからフットプリントを開く」(図7 ↑7)をクリックして「フットプリントをロード」画面を開きます。

9

ここの手順はプリント基板エディタのロゴなどの読み込みと同じですが、再度説明しておきます。右下部の「ブラウザで選択」をクリックして「ライブラリブラウザ」を開きます。

10

ブラウザ内から編集したいフットプリントを選択して、フットプリント名をダブルクリックします。

すると、フットプリントエディタに選択したフットプリントが表示され編集が可能になります。
11

 

次に新規でフットプリントを作成する方法を紹介します。

上部ツールバーの「新規フットプリント」(図7の↑5)をクリックして「新規フットプリント」ウインドウを開きます。

12

「フットプリント名」のボックスに作成するフットプリントの名前を入れて、下部の「OK」をクリックします。

13

すると、フットプリント名とリファレンス名(アノテーションはされていません)のみが表示された画面が出てきます。ここに、外形線やパッドなどを追加してフットプリントを作成します。

 

次にウィザードによるフットプリントの作成方法に軽く触れておきます。上部ツールバーの「新しいフットプリントにフットプリントウィザードを使用」(図76)をクリックして「フットプリントウィザード」を開きます。

14

上部の「読み込んで実行するウィザードのスクリプトを選択」(図の↑1)をクリックして、「フットプリント作成ツール」ウィンドウを開きます。

15

作成したいフットプリントの種類を選び「OK」をクリックします。なお、作りたいフットプリントの種類が、この中に無い場合はウィザードで作成することはできません。

16

各種パラメータが表示されるので、それぞれ入力します。画面右側で完成イメージが、「フットプリントビルダーのメッセージ」ウインドウで完成時のパラメータが表示されます。

最後に上部の「エディタへフットプリントをエクスポート」(先ほどの図の↑2)をクリックして、フットプリントエディタに反映させます。

 

これでフットプリントを作成する準備ができたので、それぞれ編集を行います。

そして、次に保存を行う方法を紹介します。

 

先ほどから言っているように、初期のライブラリには権限の関係上保存ができません。(読み込み専用です。とのエラー表示が出ます。)そのため、最初は新規のライブラリを作成して、保存する必要があります。

新規のライブラリを作成して保存する方法は、上部ツールバーの「新規ライブラリを作成して現在のフットプリントを保存」(図73をクリックして、「フットプリントライブラリのフォルダを指定」ウインドウを開きます。

17
上側の「バスのベース」左側の「参照」(図の→)をクリックして、ライブラリの保存先のフォルダを選択します。続いて、下側の「ライブラリフォルダ」の最後に「\」を入力した後にライブラリ名を入力します。(画像では「test」という名前のライブラリを作っています。また、ここでライブラリ名を入力しなかった場合は、最下位(最後の)フォルダ名がライブラリ名となります)なお、ライブラリ名はアルファベットでの入力をお勧めします。(日本語だと、どこかでエラーが出るかもしれないです)そして最後に「OK」をクリックすると、新しいライブラリが作成されます。

 

作成したライブラリはそのままではKiCadに読み込まれません。フットプリントの追加ウィザード(メニューバーの「フットプリントライブラリウイザード」(下図←))を使用して、作成したライブラリを読み込む必要があります。

17-1

ウィザードに従って作業を進めます。最初は「このコンピュータにあるファイル」を選択して、「Next」をクリックします。

17-2

次の画面で、先ほど作成したライブラリフォルダ(画像では先ほど作成した「test」ライブラリを選択)を選択して「Next」をクリックします。その後は、ウィザードに従って進めていきます。(下部の「Next」をクリックするだけですが…)

 

一度ライブラリを作成し、そのライブラリに新たなフットプリントを追加する場合は、作成したライブラリをアクティブなライブラリに設定し、以下の手順で作成したライブラリに新たなフットプリントを追加します。

上部ツールバーの「アクティブなライブラリへフットプリントを保存」(図72)をクリックして、「フットプリントの保存」ウインドウを開きます。

18

ライブラリ名を入力して「OK」をクリックすると保存できます。

 

また、フットプリントのエクスポート(上部ツールバーの「フットプリントをエクスポート」(図79)で作成したライブラリフォルダに作成したフットプリントを保存しても構いません。KiCadのシステム上「***.pretty」の名前の付いたフォルダ内の拡張子「.kicad_mod」ファイルがライブラリとして認識されるため、このようなことが可能となっています。これを応用すれば、一度自作のライブラリフォルダを作った後に、デフォルトのライブラリなどのフットプリントを、自作ライブラリフォルダにコピーして、それらを自作ライブラリ内に入れることも可能です。こうすることでよく使う部品などを探しやすくすることが可能です。

 

以上でフットプリントエディタの使い方の紹介は終了です。

次回からは応用編として切削基板加工機やユニバーサル基板での使用方法などを紹介していきたいとおもいます。また、並行して実際の基板の設計のお話やマイコンなどのソフトウェアのお話を始めたいと思います。

KiCad編 第8回 プリント基板エディタPcbnewの使い方 その4

2019/12/25
KiCad5対応の記事を公開しました。
http://blog.handen.net/archives/21338893.html
一旦目次にリンクしますので読みたいページを選択してください。

前回までの作業で基板として動作可能な状態にまで仕上げることができました。今回は作った基板を綺麗にして、基板サイズも最適化する作業を行います。そして最後に作ったデータを業者に注文するデータの出力作業を行います。

 

まずは、各部品に振られた番号(リファレンス)の配置の最適化です。

最適化といってもやることはリファレンスの移動だけで、手順はフットプリントの移動とほぼ同様で、リファレンスにカーソルを置いた状態で「M」キーを押して移動させ、移動先でクリックして確定させるだけです。(詳しくは前回のフットプリントの移動の項目を見てください)これだけで終わるのは面白くないので、リファレンスの配置の最適化で筆者が行っていることを紹介します。

・ほかの部品に重ならないように配置する

・できるだけ部品の近くに配置する

・自分のパッドやほかの部品のパッドに重ならないように配置する

・部品の向きとリファレンスの向きはなるべくそろえる

・部品とリファレンスの配置のパターンをなるべくそろえる

 →部品をパターン配置している場合は、パターン配置している部品同士ではリファレンスの位置を揃える

・ほかの部品のリファレンスとややこしくならない配置にする

筆者としては大体このような感じでリファレンスの最適化を行っています。

 

次は基板上のシルクの文字の配置をします。

まずはレイヤーを変更します。
4

基板の表面に配置する場合は「F.SilkS」レイヤーを、裏面に配置する場合は「B.SilkS」を選択します。
3

2

文字を配置する場合は右のツールバーの「銅体層または図形層にテキストを追加」(←7)をクリックしてテキスト配置モードに入ります。テキストを配置したい位置でクリックすると「テキストのプロパティー」が表示されます。

5

上部の「テキスト」に基板に印刷したい文字を入力します。そして、下部の「幅」には1文字の幅、「高さ」には文字の高さを入力します。例えば「幅:2.0(mm) 高さ:2.0(mm)」と入力した場合は一文字2mm四方の文字が入力されます。そして「太さ」には文字の線の太さを入力します。この値は「幅、高さ」に応じて値を設定します。太さが太すぎた場合は文字がつぶれ、細すぎた場合は文字がかすれて読めなくなる恐れがあるので適切な値を入力しましょう。高さが1.5mmの場合は0.3mm 高さが1.0mmの場合は0.2mm程度がよいでしょう。文字の入力と設定が完了したら「OK」をクリックして文字の入力を完了させます。

ちなみに、文字はシルクだけでなく銅箔層にも配置が可能です。見た目など用途に応じて銅箔層とシルク層を使い分けると良いでしょう。ただし、基板色によっては銅箔層の文字が見えなくなるので注意が必要です。(黒色では見えません)

 

次にシルクの図形を入れる方法です。図形といっても描けるのは直線と曲線や円なので描けるものは限られます。複雑な図形を配置したい場合は別の方法があるので、後日紹介したいと思います。

まずは文字の配置の時と同様にシルク層のレイヤーを選択します。

次に配置する線の太さの設定を行います。上部のメニューバーの「寸法」「テキストと図形」(下図←)をクリックして「テキストと図形」ウインドウを開きます。
6
7

「テキストと図形」ウインドウの左上の「グラフィックセグメント幅」(図赤囲み)に描きたい線の太さを入力して、「OK」をクリックします。線を描いている途中で、太さを変更したい場合この方法で太さの変更を行います。

次は実際に線を描きます。「図形ライン(円、円弧)を追加」(図26)の中から描きたい線の種類を選択します。「図形ライン」は直線を、円は円周を、円弧は円弧を描きます。

直線を描くときは描き始めたい位置でクリックすると線を引き始め、クリックで角を設定、ダブルクリックで線を確定させます。
8

円周を描くときは、まず円の中心点をクリックして中心点を決めます。すると中心点から円が描けるので、カーソルの位置で半径を調整してクリックして円を確定させます。
9

円弧の場合も最初に中心点をクリックして中心点を決めた後、カーソルで半径と円弧の開始点を調整してクリックして円弧を確定させます。なお、円弧は90degしか描けないようです。
10

 

次にパワー回路でのみ必要な作業を紹介します。

パワー回路で大電流が流れるパターンの場合、プリント基板の銅箔のみではパターンの抵抗により、パターン温度が上昇し最終的にパターンが焼き切れてしまう場合があります。その対策として、パターンにはんだやめっき線を盛ることで抵抗値を下げる場合があります。はんだなどを盛るためには、パターンの表面のレジストを剥離する必要があります。ここではそのレジストの剥離方法を紹介します。

まずはレイヤーを選択します。
11

表のパターンのレジストを除去する場合は「F.Mask」を裏面のレジストを除去する場合は「B.Mask」を選択します。

次に、レジスト除去の線の幅を配線と同じ幅に設定します。やり方は先ほどのシルクの線の幅の変更と同じです。そして「図形ラインを追加」(図26上)を使って、配線の上に線を引いていきます。この際線の位置を決めるのが難しい場合もありますが、穴の位置など位置を特定しやすいところから引き始めると、比較的引きやすいと思います。

12

配線の上に線が引けると図のように配線部の色が変わります。左が裏面、右が表面のレジストを除去した状態です。このようになっていれば成功です。

 

そして、データ作成作業では最後の外形線の引きなおしに入ります。

手順は基本的にPcbnewの初回の時の仮の外形線の引くときと同じで、外形線のレイヤー「Edge.Cuts」を選択した状態で、図形線を引きます。
13

最終的な外形線である今回は、製作したパターンや部品の外形から数mm程度外側を四角で囲むようにします。ただし、角などは円弧ツールを使って丸めたり、パターン作成段階で考慮が必要ですが、全体を変わった形にしたりなどもできます。自分が作りたい形に合わせて外形線を描いてください。

ここまでできれば基板のデータは完成です。ですが、業者に注文するデータを作成する前に、基板のデザインを3Dで確認とDRCを通す作業を行います。

 

3Dでの確認作業は、メニューバーの「表示」「3Dビュアー」(下図←)をクリックして、3Dビュアーを起動させます。
14
15
3Dビュアーではこのように製作した基板を3Dで確認することが可能です。ここで基板上の部品同士の干渉やシルク表記などに問題がないかどうかの確認を行います。また「ズームイン」(↑1)で拡大、「ズームアウト」(↑2)で縮小、「ビューの再描画」(↑3)で3Dビューの再描画、「ページに合わせる」(↑4)で3Dビューの拡大・回転等のリセット、「X(Y,Z)回転←()」(↑5)で各方向の回転、「左(右,,下)へ移動←(,,)」でビューの移動ができます。また、マウスのホイール回転で拡大縮小、左クリック+ドラッグでビューの回転、ホイールクリック+ドラッグでビューの移動ができます。

3Dビューの一部部品で向きが異なったり、大きさが異なることがあります。また、使用部品により3Dビューが表示されない場合があります。基本的にここで表示されない部品の多くは3Dデータがない部品ですので表示させることが困難なことが多いですが、稀に他の3Dデータで代用できることがあります。それらの対処方法を紹介します。

一旦Pcbnewに戻り、3Dビューで問題のある部品を右クリックして、「フットプリント〇〇」「パラメータを編集」をクリックして「フットプリントのプロパティー」を開きます。
16
17
3D設定」タブを開きます。大きさに問題があった場合は「3D拡大率と位置」の「シェイプの倍率」(□1)に適当な倍率を入力して大きさを調整します。大抵の場合は0.397で正しい大きさになると思います。

位置がずれる問題があった場合は「シェイプのオフセット」にそれぞれ値を入力して位置を調整します。X,Y,Zはそれぞれ3Dビューの回転軸(3Dビュアーの図の↑5)の方向と同じです。また、単位がインチであることに注意してください。

角度に問題がある場合は「シェイプの回転」に値を入力して調整します。こちらもX,Y,Z3Dビューの回転軸(3Dビュアーの図の↑5)の方向と同じです。

3Dが表示されない場合でほかの3Dデータで代用できるときは、「3Dシェイプを追加」(←4)をクリックして代用できる3Dデータを開きます。3Dデータはあらかじめ3Dデータのビュアーなどでデータを確認しておいてください。また、最初から3Dシェイプが設定されていた場合(上部「3Dシェイプ名」になにかしら設定されている場合)は「3Dシェイプを削除」(←5)で古い設定を削除します。

 

3Dビューで問題がないことを確認したら次の作業へ進みます。問題があった場合は問題個所を修正します。また、3Dビュアーは基板の作成途中でも使用できるので適時使用すると良いでしょう。

 

続いてデザインルールチェック(DRC)を行います。
1

上部ツールバーの「デザインルールチェック」の実行をクリックして、「DRC」ウインドウを開きます。
17-1

右側の「DRCの実行」(図の←)をクリックしてDRCを実行します。DRCが完了して下図のように何も表示されていなければ、DRC違反はありません。
17-2

ここで、「問題/マーカ」にエラーが表示されている場合は、その問題点を修正します。また「未接続」がある場合も未接続の配線を接続します。

 

最後に基板のデータを出力します。

メニューバーの「ファイル」「プロット」(下図← または上部ツールバーの「プロット」(ツールバーの図の↓2)をクリックして「製造ファイル出力」ウインドウを開きます。
18
19
基本的には画像のように設定します。注意しておく点としては、レイヤー(図赤□)で「F.Cu」「B.Cu」「B.SilkS」「F.SilkS」「B.Mask」「F.Mask」「Edge.Cuts」が選択されていること、「ガーバオプション」の「Protelの拡張子を利用」にチェックが入っていることを確認すればよいでしょう。「出力ディレクトリ」は空欄の場合は製作中のデータがあるフォルダーに出力ファイルが入ります。変更したい場合は適時変更してください。その他のオプションも必要に応じて変更すればよいと思いますが、画像のように設定されていれば基本的に問題ないと思います。そして下部の「製造ファイル出力」をクリックして基板のデータを出力します。

続いて穴のデータを出力します。「製造ファイル出力」ウインドウの下部の「ドリルファイルの生成」をクリックして「ドリルファイルの生成」ウインドウを開きます。
20

こちらも基本的に画像のように設定されていれば問題ないので、確認をしたうえで右側の「ドリルファイル」をクリックしてドリルファイルを出力します。

最後に、各ウインドウの「閉じる」をクリックして終了させます。

 

これにて基板の作成は完了です。最後にElecrowに注文する場合のファイルの後処理を紹介します。
21

出力したファイルはこのようになっており、基板の外形線とドリルファイル以外はElecrowの指定する拡張子で出力されています。そのため、Elecrowの指定する拡張子になっていない外形線とドリルファイルの拡張子を変更します。ドリルファイルは拡張子を「drl」から「txt」に、外形線は「gm1」から「gml」に変更します。
22

最終的にこのようになっていれば大丈夫です。そして最後にこれらのファイルを一つのzipファイルに圧縮して、Elecrowのサイトで注文を行います。

以上でプリント基板エディターの使い方の紹介は終了ですが、プリント基板を作成するにあたってフットプリントを編集する場合や新規で作る必要がある場合があります。次回はそれらのやり方の紹介をしたいと思います。

ギャラリー
  • 製作日記4 BLDCモータを演奏してみた後編
  • 製作日記4 BLDCモータを演奏してみた後編
  • 製作日記4 BLDCモータを演奏してみた後編
  • 製作日記4 BLDCモータを演奏してみた後編
  • 製作日記4 BLDCモータを演奏してみた後編
  • 製作日記4 BLDCモータを演奏してみた後編
  • 製作日記4 BLDCモータを演奏してみた後編
  • 製作日記4 BLDCモータを演奏してみた後編
  • 製作日記4 BLDCモータを演奏してみた後編
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計: