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

ギャラリー
  • HDDを演奏する楽器を作ってみた
  • HDDを演奏する楽器を作ってみた
  • HDDを演奏する楽器を作ってみた
  • HDDを演奏する楽器を作ってみた
  • 制作日記5 細かな基板を注文してみた
  • 制作日記5 細かな基板を注文してみた
  • 制作日記5 細かな基板を注文してみた
  • 制作日記5 細かな基板を注文してみた
  • 制作日記5 細かな基板を注文してみた
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計: