記事のミス等のお問い合わせはTwitterにてお願いします。マイコンのハードウェアカテゴリ:工作の基礎マイコン前回まではハードウェアの設計のお話でしたが、今回からはVVVFや音楽を奏でるうえで必要なマイコンのお話をしたいと思います。一言にマイコンと言っても実はいろいろな種類のマイコンがあります。両方ともデジタル入出力やシリアル通信などの低レベルなIO端子が搭載されていますが、この2つには大きな違いがあります。前者のArduinoはいわいる狭い意味でのマイコンで、後者はOSが入った小型のパソコンです。そのためそれぞれに得意不得意な処理があります。その2つの系統の違いを紹介します。・基本的にOSを持たない。持っていたとしても非常に簡素なものである・時間関係の処理の精度が比較的高い。・コンパイルは外部で行ったうえで書きこむ。・計算速度は比較的遅い。・パソコンのように内部に高機能なOSを持つ。・ほかの処理などにより時間関連の精度が低い。(OSによっては正確に処理できるものもある)・本体でプログラムを書きコンパイルすることも可能。・計算速度は比較的早い。主な違いはこのようなところです。系統のマイコンは画像処理などの比較的重たい処理に向いているといえるでしょう。筆者はモータを演奏するのがメインであるためマイコンはArduinoの系統のものを使います。ここからのお話はArduino系統の狭い意味でのマイコンの方の話をしていきたいと思います。狭い意味でのマイコンとしてArduino系統と書きましたが、実はこの中にもいろいろな種類のマイコンがあります。その中でもまずはマイコンボードとマイコンの区別をしたいと思います。マイコンAVRやPICやH8そしてARMなどマイコンのチップ単独のものである実際に使用するには周辺回路を設計する必要があるほか、書き込み回路や開発環境などを別に用意しなければならないまたレジスタを叩く必要があるなどプログラムの難易度も比較的高い石だけなので安いため大量生産する場合に向いているマイコンボードArduinoやmbedなどマイコンとその周辺回路が1枚の基板上に乗せられて販売されているのもの書き込み回路が内蔵されていることが多くUSB接続などで直接書き込める。開発環境もマイコンボードを作っているメーカーが用意してくれていることが多いレジスタを叩かずに済む場合が多くプログラムの難易度も低いことが多い初心者や試作に向いているマイコンとマイコンボードの違いはこのような感じです。マイコンボードで最も一般的に使われているのはArduinoで情報量やライブラリも充実していて非常に使いやすいマイコンボードと言えます。性能があまり高くないといった問題やPWM周波数が固定などモータ演奏に使うにはちょっと難があったりもします。逆に近年はやり始めたmbedやESP32などのARM系のCPUを搭載したマイコンは性能が高いという利点がありますが、情報量が少ないという問題があります。ちなみにmbedの場合はPWMの周波数を任意に変えれるようです。最近はArduinoでもARM系CPUを搭載したものも出てきていますが、現状あまり普及してるとはいいがたいですね...個人で基板を1枚のみ作って楽しむ場合はマイコンボードを使うと安価で楽ですが、自作の基板とのドッキングが難しくなるという問題もあります。そのため自作の基板に直接マイコンを乗せて周辺回路まで構成するということもよくありますAVRマイコンを使う場合はマイコン内部にArduinoのプログラム(ブートローダ)を入れると自作のArduinoとして使うこともできてしまいます。Uno互換の設計をしています。ここまではマイコンの一般的なお話をしてきましたが、ここからは筆者がモータ演奏や初版のVVVFに使用しているAVRマイコンとその拡張である自作のArduinoのお話をしたいと思います。マイコンのハードウェアの設計のお話をしたいと思います。今回は筆者が実際にstepVVVFに使用したatmega328Pを例にして話をしたいと思います。atmega328Pのデータシートをhttps://avr.jp/user/DS/PDF/mega328P.pdfそして、ハードウェア設計に必要なピン接続図はこちらです。マイコンのハードウェア設計のうち基本回路についてはデータシートで決められたとおりに接続しなければなりません。最初にマイコンの端子とそれに対応する機能の紹介をしたいと思います。全体に共通する標準IOと外部割込み(PCINT)のお話から各端子のピン番号のすぐ横にPB〇、PC〇、PD〇という番号があります。これがマイコンの基本的な入出力(HIGHやLOWの入出力)である標準IOのポート番号と言われるものです。PBはマイコンのPORTB、PCはマイコンのPORTCといったように内部的にいくつかの組に分けられており、プログラムではこのPORTごとに制御を行います。そのため、同時に操作する必要のある出力は同じポートにまとめておくとプログラムが書きやすくなります。次に外部割込み(PCINT)のお話です。Atmega328PではすべてのIOポートにPCINT〇〇という表記があります。これは外部割込みというピンの状態が変化したときに、動作を始めるマイコンの機能が使える端子を示しています。PCINTは端子ごとに個別に割り込みを設定することができません。個別の割り込みはのちに紹介するINT〇を使わなければなりません。続いてPWM出力のポートのお話です。マイコンにはPWMと呼ばれるONとOFFを高速で繰り返して疑似的なアナログ信号を作り出すPWM出力と呼ばれる機能が搭載されています。例:OCR0A)と書かかれている端子です。Atmega328Pの場合はピン番号が5,11,12,15,16,17の端子にこの機能が搭載されています。OCR〇□のうち〇の部分に書かれた数字がタイマー番号を示していて、このタイマー番号ごとに周波数などを設定することができます。いろいろな都合上同じモータの正逆は同じ番号のポートからとると良いです。ちなみに、このONとOFFを繰り返す速度を変えることで音楽を奏でることができるのです。ここからは端子ごとの個別の機能を紹介していきます。この端子はマイコンのリセット機能をもつ端子です。通常の設定ではこの端子にLOWを入力するとマイコンがリセットされます。基本的に10kΩでプルアップしておきます。この端子はシリアル通信の機能を持っています。シリアル通信を使用するときは2番ピンが受信側、3番ピンが送信側になります。回路を設計するときにはRX,TX(受信,送信)の向きに注意してください。この端子は個別の外部割込みの機能を持つ端子です。PCINTと違いピンごとに別々の割り込みとして処理できるほか、PCINTに比べて選べるモードが多かったりします。この端子は外部クロックである水晶やセラロックを接続するポートです。マイコン内部にもクロック発生器は入ってますが遅いので、Arduionでは外部クロックとして16MHzの水晶を取り付けています。水晶を取り付ける場合は22pF程度のセラミックコンデンサも取り付けないと発振しないので気を付けなければなりません。この端子はアナログ比較器機能を持っています。12,13番ピン入力電圧を比較して、条件が整った場合に割り込みが実行されます。この端子はSPI通信の機能を持っています。SPI通信を使用するときはSS,MOSI,MISO,SCKの各端子に接続します。AVRマイコンに書き込みを行うときもこのSPI端子を使用します。この後に示すアナログ入力の基準となる電圧を設定するピンです。理由がない限りVCCに接続します。A/D変換機を通してアナログ電圧を識別できる端子です。プルグラムはAREF端子と同じ電圧が印可されたときに最大値(通常1023)、0Vが入力されたときに最小値(0)を読み取ります。この端子はI2C通信機能を持っています。I2C通信を使用するときはSDA,SCL端子にそれぞれ接続します。I2Cは規格上プルアップ抵抗が必須なので注意が必要です。以上がマイコンの各端子の持っている機能の簡単な説明です。細かな説明はプログラムの時に紹介します。以上のことを考慮して回路の設計を行ってください。例として筆者の製作したステッピングモータやケースファンを演奏するstepVVVFの基板を紹介します。この基板はタイマー0と2の端子にそれぞれモータを接続して、PB1,2とPD7,8にデバッグ用のLED、そしてモータの出力停止をPC0~3,センサの入力をADC4,5に接続しています。この基板は数珠つなぎをするためシリアル通信はRXのみ接続して、TXはソフトウェアシリアルを使用するためにPD2にしています。大体こんな感じに接続すれば使えます。ハードウェア設計の最後にマイコンへの書き込み回路の紹介をします。通常のAVRマイコンの書き込み方法です。通常AVRマイコンの書き込みにはSPI通信を使ったICSPと呼ばれる方法でマイコンに書き込みを行います。ピンヘッダーに以下のように接続を行うと書き込み回路の完成です。次にArduinoとして書き込みを行うときの配線です。基本的にはこのように配線を行います。注意しなければならないのはDTRピンが0.1uFのコンデンサを介してマイコンのResetピンに接続されていることです。最後に通常のAVRとArduinoの両方のモードの書き込みに対応した、書き込み専用基板の回路図を紹介します。電源は書き込み用の変換基板から供給されるので省略しています。構造としてはマイコンが動作するために必要な電源端子への接続と、水晶を接続したうえで、マイコンから書き込みに必要な端子を引き出して使用しているだけの簡単な回路となっています。