モータの鳴らし方byHanDen

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

制御編 第4回 AVRマイコンの環境づくり1 ライターのドライバとAtmel Studioのインストール

前回まではマイコンのプログラミングで使うビット演算のお話をしてきましたが、今回からはAVRマイコンのプログラミングを行う環境づくりのお話をしたいと思います。

まずはAVRマイコンの書き込みに用いるライター(書き込み機)を選びます。少し前なら純正のライターである「AVRmkⅡ」を選ぶのですが、現在は販売中止になっており入手が困難になっています。現在購入可能な純正品としては、デバッグ機能が付いた「Atmel Ice Basic」などがありますが1万円を超えてしまいます。互換品をAmazonとか日本橋などを見ているといろいろありますが、純正の開発環境である「Atmel Studio」からは書き込みができないなど不都合があるものが多いです。そこで、筆者が使っているのはスイッチサイエンスで売られている「Pololu USB AVR Programmer v2」です。このライターは他の安いライターと違ってAVRマイコンの統合開発環境である「Atmel Studio」でプログラミングから書き込みができ、非常に便利です。

1

販売ページ:https://www.switch-science.com/catalog/2662/

そして、この販売ページから製造元の「Pololu」のサイト(下図)(https://www.pololu.com/product/3170/resources )へのリンクもあり、そのサイトに詳しい使い方が書かれています。(英語ですが)
2

まずこのサイトからドライバー(図の下側の←)をダウンロードします。また、上の←のリンクより、使用方法が見れます。

ダウンロードしたドライバーのインストーラーを実行します。

3

ウィザードに従ってインストールを行います。まずは「Next」で進みます。

4

次にインストール先を聞かれます。変更の必要があれば適時変更、なければそのまま「Next」で進みます。


5

次もそのまま「Next」で進みます。

6

Install」をクリックしてインストールを始めます。途中でドライバのインストールの確認画面が出てくるので「インストール」をクリックして、すべてのドライバのインストールを行います。

7

この画面が出たら完了です。

続いて、スタートメニュから「Polulu」フォルダの「Pololu USB AVR Programer v2…」を開きライターの初期設定を行います。
8

9

デバイスの設定画面で、初めに←1で示した個所に記載されている、「Programing Port」のCOM番号をメモしておきます。
次にライターからの電源供給の設定をします。マイコンに書き込みをするときには、マイコンに電源が供給されている必要があります。その電源をライターから供給する場合は図の←2の「Vcc Output」をEnableに変更します。書き込み時に外部から電源が供給されている場合は「Vcc Output」をDisableにします。この設定を間違えると書き込みができないことやライターが破損する恐れがあるため書き込みを行う回路の仕様をきちんと確認したうえで間違いのないようにしてください。

 

続いてAtmel Studioのインストールへ進みます。

Google検索で「Atmel Studio 7」で検索をして、「Atmel Studio 7 | Microchip Technology Inc …」のリンクを開きます。(執筆時点でのURL: https://www.microchip.com/avr-support/atmel-studio-7 )

9-1

10

このような感じの画面が開くので下の方に進みダウンロードリンクへと進みます。

11

Windows(x86/x64)」の中からAtmel Studio7.0をダウンロードします。筆者は下の「Atmel Studio 7.0 (build 1645) offline installer」をダウンロードしましが「web installer」をダウンロードしても同じです。(インストールの時に大きなファイルをダウンロードするか、先にダウンロードするかの違いです。)(ビルド番号は時期によって変わるので、その時々にあわしたものをダウンロードしてください)

ダウンロードしたファイルを実行してインストーラーを起動させます。

12

最初に、ライセンス条項の確認が出てくるので確認をしたら、「I agree to the license terms and conditions(図の↓)をクリックして、同意状態にした後、下部の「Next」で次に進みます。

13

インストールする項目の選択ですが、すべてインストールして問題ないので、そのまま「Next」をクリックします。

14

サンプルなどのインストールを行うかどうかについて聞かれますが、インストールしておいて問題ないのでそのまま「Next」をクリックします。

17

最後にパソコンの環境チェックがされ問題がなければすべての項目に「✓」が付きます。すべてに「✓」がついていることを確認して「Next」をクリックするとインストールが始まります。AtmelStudioも途中でドライバのインストール確認画面が出るので、すべて「インストール」をクリックしてすべてのドライバをインストールします。

環境チェックで以下のように跳ねられた場合は、その項目を修正してからインストールを行ってください。
16
筆者の場合はwindows updateの「KB2999226」がインストールされていないというエラーが出ました。筆者の環境ではWindowsUpdateからインストールできなかったため、画面に出ているURLから更新を手動でダウンロードしてインストールを行うと、エラーがなくなりました。

18

最後に、このような画面がでたらインストールは完了です。(環境次第でかなり時間がかかります)

Close」を押してセットアップを完了させると、Atmel Studioが起動します。ですが、現時点では英語のメニューとなっています。日本語化することが可能なので次回日本語化の紹介をします。

制御編 第3回 ビットシフト

 前回はビット演算のお話をしましたが、今回はビット演算の一部ともいえるビットシフトのお話をします。ビットシフトというのはその名の通り、ビットの位置を移動させる機能です。この機能は主に、値を読み込んだ時に高いビットの値のみを使いたいときや、通信データの作成の時に使います。ですが、使う機会はそんなに多くないのでさらっと行きたいと思います。

ではビットシフトをすると、どのようになるのかをお見せしましょう

操作前の値      10101010

右に4bitシフト  00001010

1回目の例は右向きに4bitシフトさせた例です。このように右向きにシフトさせると高い位置のビットにあったデータを低いビットに移動させることができます。ここで気を付けないといけないのは、ビットシフトさせて消えるビットと新たに出てくるビットがあることです。この例の場合は操作前の右側(下位)4ビットはシフトさせると消えていることがわかると思います。逆にシフトさせたあとの左側(上位)4ビットが新たに出てきてすべて0が入っていることがわかります。つまり、ビットシフトをさせるとシフトさせた方向寄りのシフトさせた数のビットが消えるというわけです。

次に左向きにシフトする例です。

操作前の値     10101010

左に4bitシフト  10100000

左向きにシフトすると左側(上位)4ビットが消えていることがわかりますね。

ちなみに、左向きのシフトはシフトしたビット分2倍されている(例のように右に4ビットシフトする場合は値を16倍している)とも考えることもできます。このように考えた場合、範囲外に出て消えるビットは「値がオーバーフローした」と考えることができます。同様に右向きの場合はシフトしたビット分1/2倍されていると言えます。

C言語でビットシフトを行う場合はこのように書きます。

右に4ビットシフトさせる場合

B = A >> 4; //(Aは操作前の値 Bはビットシフトさせた後の値)

左に4ビットシフトさせる場合

B = A <<4; //(Aは操作前の値 Bはビットシフトさせた後の値)

C言語の表記は見た目のままなので簡単かなと思います。

なお、int型などで負の数を表したときはいろいろとややこしいことになるようですが、マイコン関連の処理で使うことはまずないと思うので特に詳しいことは書きません。

 

では実際にビットシフトを使う例を示してみましょう。

例えば、PD5からPD7にスイッチが接続されていて、3つのスイッチで値を設定していると考えましょう。今回はPD5PD6のスイッチがHIGHになっていると考えます。そして、最終的に値は下位3ビット(0からまで)で表したいとします。
1

Atmega328PのデータシートのP67を見ると、ポートDのピンの状態を読み込こむレジスタはPINDであることがわかります。

まずは上位3ビットのみを取り出します。

PIND     10101010 (Aとする)

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

A & B   10100000 (Cとする)

続いてビットシフトを行って上位3ビットにいる値を下位3ビットに移動させます。

C              10100000

右に5bitシフト  00000101

こうすると上位3ビットにスイッチを接続して値を設定しても、下位3ビットの値として取り出すことができます。これをC言語で表すとこのように書けます。

uint8_t B = PIND & 0xE0;//0xE0 = 0x11100000 (上位3ビット取り出し)

B= B >> 5;//左に5ビットシフト

(uint8_tは符号なしの8ビットの整数型(Arudinoでいうbyte型)を示しています。)

C言語でもそのままに表せますね。ちなみに、先に行っているビットを取り出す作業は今回の場合は必要ありませんが、必要となる場合も多いので安全のために処理に含めています。(本当に必要になるのは中間のビットを取り出してシフトさせる場合などです)

 

次に通信データ作成の場合を考えてみましょう。

通信の場合できる限り送信のデータ数を少なくしたい場合が多いです。特に1バイトで完結させることができるとプログラムがとても楽に書くことができます。そこで、1バイト(8ビット)にビット数の少ない複数のデータを挿入する方法を紹介します。

ABはそれぞれ4ビットのみで表せる値として、送信データはABの両方を含めて1バイトにしたい場合を考えます。

最初に、ABから下位4ビットのみを取り出します。(もしも上位4ビットにゴミが混ざっていた場合送信データがおかしくなるため)

A          00001110

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

A & Ab  00001110 (Aとする)

B          10001010

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

B & Bb  00001010 (Dlとする)

この例の場合Bの最上位ビットにゴミの値が入っていますが、下位4ビットのみを取り出すことでこのゴミの値を除去できます。(普通はゴミの値なんて入らないと思いますが…)続いて、Aを上位ビットとするためにAを4ビット左側にシフトします。

A            00001110

左に4itシフト   11100000 (Dhとする)

こうすることでDl(元のB)Dh(元のA)でビットの位置が被らないことになります。そのため、DhDlOR(+でもいい)することで1つのデータに入れれます。

Dl      11100000 (Aとする)

Dh        00001010 (Bとする)

Dh | Dl  11101010 DATA

こうすることでDATAの上位4ビットはゴミを取り除いたAのデータが入っており、下位4ビットにはごみを取り除いたBのデータが入っていることがわかりますね。こうすることで桁が少ない複数の値を1つの値に収めることができるというわけです。これをC言語で書くとこのようになります。

A &= 0x0F;//下位4ビット取り出し(上位4ビットにあるゴミを除去)

B &= 0x0F;

A = A << 4;

uint8_t DATA = A | B;//DATA = A+B;も可

 

次にこのデータをもとのA,Bに戻す方法を紹介します。

まずはAを取り出すために、データAがある上位4ビットのみを抽出します。

DATA        11101010

取り出すビット 11110000 (Abとする)

DATA & Ab     11100000 A

これで、上位4ビットを抽出できたのでこれを下位4ビットにビットシフトさせます。

A              11100000

右に4itシフト    00001110 A

こうすることで元のデータAが取り出すことができました。続いてデータBを取り出します。データBは下位4ビットにいるので下位4ビットのみを抽出します。

DATA       11101010

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

DATA & Bb   00001010 B

データBはビットシフトを行っていないので抽出した値が元のデータBとなります。これらもC言語で表すとこのようになります。

uint8_t A = DATA & 0xF0;//データ抽出

A = A >> 4;//右に4ビットシフト

uint8_t B = DATA & 0x0F;//データ抽出

 

前回と今回でマイコンのプログラムで重要なビットの処理のお話をしてきました。このビットの処理は慣れるまではちょっと大変ですが、慣れると簡単に扱えるようになると思います。次回はAVRマイコンのプログラミングを行う環境設定のお話をしたいと思います。

制御編 第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の設定

前回までは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
 

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