モータの鳴らし方byHanDen

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

製作日記3 演奏基板やモタドラの通信システムの紹介


 今回はステッピングモータを演奏する基板以降で共通システムとして使ってる通信システムについて紹介します。

 

 私の作ってる基板は原則分散型の処理にしているため基板ごとにマイコンを搭載しています。そしてそのマイコンが乗った基板(スレーブ)をマスター装置から指令を与えて特定の動作をさせています。今回はそのシステムについてのお話です。

 

マイコンの通信機能

 一般的にマイコンに搭載されている通信機能はI2CSPIそしてUARTなどがあります。この中でもI2CSPIは標準でバス通信に対応していますが、I2Cは高機能ではあるものの基板内通信を前提に設計された通信のため基板外への通信となると安定性が悪化してしまいます。また、SPIはスレーブ1つにつき制御ピンが1つ必要となりスレーブの数が増えるとその分ピン数が増え不都合です。それに対し、UARTは標準ではマルチスレーブ機能に対応できませんが、RS485に比べると劣るものの基板外に出てもよほど長距離でなければ十分運用できる程度の通信の安定性があるのが特徴です。

 

アイデアの元

 システムを考えていた時にふと目に入ったのがシリアル制御のサーボモータでした。シリアル制御のサーボモータはRS485UARTでありながらIDを指定することでマルチスレーブに対応できるのが特徴です。システム的にはI2Cにも似ているのものの、ベースはUARTRS485というだけで信頼性は十分にあります。そこで、UARTID指令式で運用するという方針でシステムの設計を行いました。

 

ハードウェア構成

 各基板同士を同一のシステムとして扱えるようにするためにハードウェアも共通化します。しかし、構造は非常にシンプルで回路図的には以下のような形です。
1

 使用感覚としてはUSBのような感覚で使えるようにするためマイコン駆動の電源と通信線を同一のコネクタにまとめています。これによりコネクタ1つでロジック側の電源確保と通信回路が構成できます。また、ピンサインもUSBに近い形として1番ピンに電源、2,3番ピンで通信、4番ピンをGNDとしています。

 また、配線量節約のため各基板に並列接続された2つのコネクタを設け数珠つなぎに対応させています。もちろんマスター側で分岐してからスレーブに接続することも可能です。

 データはすべてRXピンから受信します。TXピンは将来的な拡張用でデータ異常時に再送要求を送る場合や、マスターから指示があった場合にスレーブから情報送信を出来るようにしています。

 

通信プロトコル

 モタドラとして運用する場合の高い信頼性と演奏システムとして使う場合の大量送信を行うことを考え、連続的にデータを送信できてかつ受信データ抜けがあってもその後の通信には影響を与えないシステムを前提とします。そのため、特定のバイト数ごとにIDを送信するといったシステムは読み飛ばしなどで正しく動作しなくなるためNGです。つまり、何かしらの方法でIDデータを区別できるようにする必要があります。しかし、IDの前に間隔を置くと連続送信ができなくなるのでNGとします。

 この条件をまとめると各データがIDなのかそうじゃないのかを区別する方法を考える必要があるというわけです。

ここで使うのが、MIDIのシステムの考え方です。MIDIは先頭のbitでチャンネル情報かそれ以外の情報かの区別を行っています。これと同様に先頭のbit01かでIDデータの判別を行い。それに続くデータを送信内容(スレーブに送るデータ)にします。これにより、データの読み飛ばしがあった場合でも次のデータからは正しく読み込めるほか、連続したデータ送信にも対応できます。

bit番号

7

6

5

4

3

2

1

0

内容

ID判定

データbit {bit7 = 0 : 送信データ   bit7=1:ID}

 このような構成にすることで複数バイトのデータ送信も簡単にできます。また、モタドラと演奏などIDごとに機能が違ってデータバイト数の違う基板を混在させることもできます

 

さらなる信頼性向上

 演奏の場合は通信速度の方が重要なので以上で紹介したシステムでデータ送信をしていますが、モタドラモードの場合はデータの化けやマスター側のトラブルなどで暴走などが起きると大問題になります。そのため、信頼性向上のためにさらに通信を拡張させています。拡張内容としては以下の2つです。

・パリティーチェック

・ウォッチドッグタイマー

 

まず1つ目のパリティーチェックについて紹介します。

 このシステムでのパリティーは送信データ(ID以外)の各データをXORbit演算を行ったものとしています。

まずは、マスター側で送信する各データをXORbit演算し送信データの最後に付加します。

続いてスレーブ側では受け取ったデータをXORbit演算し最後に送られてきたパリティーを比較して同一かの判定を行います。もしも異なった場合はそのデータは破損データとして無視する設定にしています。データ破損の場合は再送要求をするなどでさらなる信頼性向上も可能です。

 

続いてウォッチドッグタイマーです。

 こちらは一定時間ごとにデータを送信し、一定時間以上データが途切れた場合にモータを停止させます。しかし、各モータの制御信号をウォッチドッグタイマリセット用に毎回送るとデータ量が非常に増えてしまいます。そのため、ウォッチドッグタイマリセット用のIDを別に作り、そのIDをマスターから送ることでデータ量を削減しています。スレーブ側は解除IDを受信すればウォッチドッグタイマーをリセットします。

 

以上で自分の演奏システムとかの通信関連のシステムとなります。

KiCad編 KiCad5.0対応について

本ブログの記事はKiCad4.0.7をベースに記載を行っています。KiCad5.0になっても基本的な機能は同様に使うことができますが、一部異なる機能があります。以下現在確認済みの異なる箇所を記載します。

KiCad編 第1回 ライブラリ参照箇所 
 4.0.7は既定ではGitHubn参照→5.0では既定ではローカルライブラリ参照(筆者環境)
 ライブラリ名にも変更があり。


KiCad編 第5~8回
 KiCad5.0では初回起動時にGPUのアクセラレーションに関する質問がありOKを押すとデフォルトでモダンツールセット(4.0.7のデフォルトはレガシー)になり、配線関連で機能追加や変更があります。特に第6回の自動配置関連、第7回の配線のドラッグや削除関連および押しのけ配線などに変化があります。
ブログと同様に近い方法をで作業を行いたい場合は「設定」メニューから「レガシーツールセット(s)」に変更してください。ただし、第6回の自動配置の機能は使えなくなっています。

また、その他項目名やアイコンに変更がありますが、それらは似たものを選択すれば基本的には使えると思います。


メイカーズバザール大阪2018に出展しました

作り方系の記事がひと段落してから全然更新していませんでした。
この間にいろいろあってnameの方を略称のHanDenを正式にしたりとかありましたが、生存しております。

今回はNT京都以来の展示ということでメイカーズバザール大阪2018に出展してきました!

まずは作品の改良点から
 前回の展示でほとんど音が聞こえないという問題があったので、音量改善対策として木箱を作りました。
阪和電鉄全景
静かな部屋だとうるさいぐらいに音量が改善したので、大丈夫かなと踏んでいたのですが…詳細は後程

そして、直前に紹介用に重層基板の最適化して1枚にしたものを作りました
IMG_20180630_122005
この基板1枚で
IMG_20180630_121954
この現行の基板3枚と電源基板の分の機能を持たせたのにも関わらず、表面の空きを大きくなったので最適化は偉大です!(表面実装採用で裏面にも実装したというのも大きいですが)

 作品の改良点としてはこの2つです。

 前日、大雨で電車が動かず、作品を置いてる場所から回収ができない疑惑が発生。結局地下鉄で出向いて何とか回収できましたが心臓に悪かったです。

 当日も電車が止まっていて振替で展示会に出向いたりとばたばたしましたが、何とか展示の準備が完了できました。
IMG_20180707_100526
当日の写真これしかないです…

 準備中に演奏した時はうるさいかなってぐらいの音が聞こえていましたが、実際に来場者が入ってきて展示が始めると、立った状態だと音がほとんど聞こえないという問題が発覚。机の高さだと少し離れても聞こえているので音の指向性が出てしまったのだと思います。

まあ、こんな感じで展示をしていろいろと交流をして濃い2日間でした。Nico-Techと違ってまじめな作品が多くて戸惑ったところもありましたが、いい経験になりました。

次回の展示は用事が被らなければNT名古屋を予定しています。



当ブログのword版データ

本ブログの記事のWORD版のデータです。こちらの方が見やすい記事も結構あると思います。

回路編第110

https://www.dropbox.com/s/cj1y904u3lue8uh/%E5%9B%9E%E8%B7%AF1.docx?dl=0

 

回路編第11~13

https://www.dropbox.com/s/m9rkc8nasnip4j3/%E5%9B%9E%E8%B7%AF2.docx?dl=0

 

KiCad

https://www.dropbox.com/s/46siyvylqkjqvsd/kicad%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB.docx?dl=0

 

マイコン編

https://www.dropbox.com/s/nvd7f7o4a08r5rr/%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3.docx?dl=0

 

本データは趣味で電子工作を行う人向けの記事です。そのため、業務や研究、競技会などでの使用はご遠慮ください。また、記事の内容は自己責任の下で使用をお願いいたします。本記事を参考にして損害が発生した場合でも管理人は責任を負いません。

電子工作のキソ 目次

いままでに書いた、モータ演奏を行うための基礎事項の記事の目次です。

 

1.回路編

1回 電子部品の概要

http://vvvf.blog.jp/archives/2366464.html

 

2回 抵抗器

http://vvvf.blog.jp/archives/2369140.html

 

3回 コンデンサ・コイル

http://vvvf.blog.jp/archives/2385100.html

 

4回 ダイオード

http://vvvf.blog.jp/archives/2498755.html

 

第5回 半導体スイッチ

http://vvvf.blog.jp/archives/2571354.html

 

第6回 半導体スイッチの回路

http://vvvf.blog.jp/archives/2677434.html

 

7回 MOSFETIGBTの駆動回路

http://vvvf.blog.jp/archives/2677434.html

 

8回 ゲートドライバ

http://vvvf.blog.jp/archives/3313214.html

 

9回 トランジスタ

http://vvvf.blog.jp/archives/3466503.html

 

10回 整流回路

http://vvvf.blog.jp/archives/3881339.html

 

11回 ゲートドライバIC(L6384E)の使い方ver2 その1

http://vvvf.blog.jp/archives/6572197.html

 

12回 ゲートドライバICの使い方ver2 その2

http://vvvf.blog.jp/archives/6620551.html

 

13回 ゲート抵抗の選び方

http://vvvf.blog.jp/archives/6770493.html

 

 

2.KiCadの使い方

1回 KiCadの初期設定

http://vvvf.blog.jp/archives/4052091.html

 

2回 回路図エディタEeschemaの使い方 その1 回路図を描くチュートリアル

http://vvvf.blog.jp/archives/4283557.html

 

3回 回路図エディタEeschemaの使い方 その2 PCB Parts Library の使い方

http://vvvf.blog.jp/archives/4305504.html

 

4回 回路図エディタEeschemaの使い方 その3 ピン設定の変更

http://vvvf.blog.jp/archives/4380666.html

 

5回 プリント基板エディタPcbnewの使い方 その1 

http://vvvf.blog.jp/archives/4644669.html

 

6回 プリント基板エディタPcbnewの使い方 その2

http://vvvf.blog.jp/archives/4724854.html

 

7回 プリント基板エディタPcbnewの使い方 その3

http://vvvf.blog.jp/archives/4803088.html

 

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

http://vvvf.blog.jp/archives/5087007.html

 

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

http://vvvf.blog.jp/archives/5188288.html

 

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

http://vvvf.blog.jp/archives/5190101.html

 

 

3.制御編

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

http://vvvf.blog.jp/archives/6080429.html

 

2回 マイコンで使うビット演算

http://vvvf.blog.jp/archives/6216594.html

 

3回 ビットシフト

http://vvvf.blog.jp/archives/6240219.html

 

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

http://vvvf.blog.jp/archives/6261293.html

 

5回 AVRマイコンの環境づくり2 AtmelStudioの日本語化とAtmel Studioの初期設定

http://vvvf.blog.jp/archives/6262931.html

 

6回 Atmel Studioでのファイル作成とFuse設定

http://vvvf.blog.jp/archives/6402405.html

 

7回 AVRマイコンのデジタル入出力

http://vvvf.blog.jp/archives/7126511.html

 

8回 マイコンのPWM出力 その1 可変周波数PWMの理論とパラメータ決定

http://vvvf.blog.jp/archives/7483091.html

 

9回 マイコンのPWM出力 その2

http://vvvf.blog.jp/archives/7662206.html

 

10回 マイコンのタイマー割り込み その1

http://vvvf.blog.jp/archives/7860243.html

 

11回 マイコンのタイマー割り込み その2

http://vvvf.blog.jp/archives/7860414.html

 

12回 AVRマイコンの割り込みのまとめ

http://vvvf.blog.jp/archives/8031672.html

 

13回 AVRマイコンのシリアル通信

http://vvvf.blog.jp/archives/8456549.html


制御編 第13回 AVRマイコンのシリアル通信

 

 前回までは何回かに分けて割り込み処理のお話をしてきましたが、今回は内容がガラッと変わってシリアル通信のお話を行います。ちなみに、Atmega328Pには一般的にシリアル通信と言われる「USART」のほかにも、「I2C」や「SPI」もありますが、今回紹介するには「USART」です。初めに、この3つの通信方式を筆者の偏見で軽くまとめてみます。

項目

USART

I2C

SPI

使用箇所

主に機器,基板間

主に基板内

主に基板内

伝送可能距離

長い

短い

短い

接続数

11が基本

1対複数が可能

1対複数が可能

通信線数

2(TX,RX)

2(SDA,SCL)

3(SCK,MISO ,MOSI)

+接続数(SS)

安定性

高い

UARTより低い

UARTより低い

通信速度

設定次第

設定次第

設定次第

 筆者の感覚的にまとめるとざっとこんな感じです。USART」と「I2C」「SPI」通信の最大の差は、1対複数のバス通信が規格としてサポートされているかいないかと言えるでしょう。しかし、引き換えに「I2C」と「SPI」は通信可能な距離が短く、距離が延びると安定性が非常に低くなります。筆者の経験上、I2Cは数十センチの距離でもモータなどのノイズでエラーが発生し正しく通信できません。(SPIArduinoのシールド程度の距離でしか使用していないので不明です)Arduino系の分野ではI2C」はセンサなどとの通信、「SPI」はシールドとの通信に使われることが多いです。また、SPI通信はAVRマイコンのシリアル書き込みにも使われていますね。

 そして、今回紹介する「USART」は基本的には11の通信ですが、工夫をすることにより、1対複数の通信も実装することは可能です。これにより比較的長い距離でも高い安定性で複数の子に対して通信を行うことも可能というわけです。なので、筆者はこの方法でモータ演奏基板の通信を行っています。(I2CSPIは好みの問題で自分が実装する箇所には使っていません)

 前置きはこの程度にしておいて、実際にAVRマイコンでのシリアル通信の使い方の紹介をしていきたいと思います。とはいえ、基本的にシリアル通信は理論的な個所はほぼなく、条件次第で通信速度設定時に計算を行う程度となっているので、今回はレジスタの設定をメインに紹介を行いたいと思います。

 シリアル通信のレジスタの設定はatmega328Pのデータシート(https://avr.jp/user/DS/PDF/mega328P.pdf )P138~P141に書かれています。このうちシリアル通信の動作の設定を行うレジスタは「UCSR0A」「UCSR0B」「UCSR0C」の3つ、通信速度の設定を行うレジスタは「UBRR0(12bit必要なのでデータシートではUBRR0LUBRR0Hと分かれているが、プログラム上は一括で書ける)となっており、通信データが入るレジスタが「UDR0」となっています。

 初めに設定のレジスタを見ていきましょう。

UCSR0A

ビット

項目名

設定内容

設定値(書き込み)

7

RXC

USART受信完了フラグ:USARTのデータの受信が完了すると1が設定されます。受信完了割り込みを使わない場合は、このビットを読み込むことで、データが届いているかの判定を行います。受信完了割り込みを使う場合はこのビットは1にする必要があります。

受信完了割り込みを使う場合:1

使わない場合:0

6

TXC

USART送信完了フラグ:USARTのデータの送信が完了すると1が設定されます。送信完了割り込みを使う場合はこのビットは1にする必要があります。

送信完了割り込みを使う場合:1

使わない場合:0

5

UDRE

USART送信データレジスタ空きフラグ:送信のデータレジスタ(UDR0)データを受け取り可能な時に1が設定されます。データを送信するときはこのビットを読み込み、1であることを確認してから、データをUDR0に送りますデータレジスタ空割り込みを使う場合はこのビットは1にする必要があります。

データレジスタ空割り込みを使う場合:1

使わない場合:0

4

FE

フレーミング異常フラグ:フレーミング異常が発生した時に1が設定されますが、特に使いません

0

3

DOR

データオーバーラン発生フラグ:オーバーラン状態が発生した時に1が設定されますが特に使いません

0

2

UPE

バリティー誤りフラグ:受信したデータがバリティーチェックを通らかった(データが破損している)場合に1が設定されます。Arduinoとの通信(関数を使う場合)では使えません。

0

1

U2X

倍速許可:非同期動作でシリアル通信の速度を倍にする設定ですが、特に必要性がないので使いません

倍速無効:0

倍速許可:1

0

MPCM

複数プロセッサ通信動作:複数のマイコンを接続し到着データの選別を行う機能です。9bit通信が必須となり、Arduinoなどへの互換性確保が難しいので、今回は使いません

無効:0

無効:1

 

UCSR0B

ビット

項目名

設定内容

設定値(書き込み)

7

RXCIE

受信完了割り込み許可:受信完了の割り込みを許可するレジスタです。受信完了割り込みを使うときは、受信完了フラグRXC1を設定する必要があります。

受信完了割り込みを使う場合:1

使わない場合:0

6

TXCIE

送信完了割り込み許可:送信完了の割り込みを許可するレジスタです。送信完了割り込みを使うときは、送信完了フラグTXC1を設定する必要があります。

送信完了割り込みを使う場合:1

使わない場合:0

5

UDRIE

送信データレジスタ空き割り込み許可:データレジスタ空割り込みを許可するレジスタです。データレジスタ空割り込みを使うときは、送信データレジスタ空きフラグUDRE1を設定する必要があります。

データレジスタ空割り込みを使う場合:1

使わない場合:0

4

RXEN

受信許可:シリアル通信の受信部の動作を許可します。シリアルでデータを受信する場合は1を設定しなければなりません。

データを受信する場合:1

受信を行わない場合:0

3

TXEN

送信許可:シリアル通信の送信部の動作を許可します。シリアルでデータを送信する場合は1を設定しなければなりません。1対複数のシリアル通信を行う場合は、通常時は無効(0)にしないとIOが短絡するので注意が必要です。

データを送信する場合:1

送信を行わない場合:0

2

UCSZ2

データビット長選択2:詳細はUCSR0Cのビット1,2部で紹介

別途記載

1

RXB8

受信データビット8:9bitのシリアル通信を行う場合は受信データの9bit目をここから読み出します。なお、UDR0より先に読み出す必要があります

0

0

TXB8

送信データビット8: 9bitのシリアル通信を行う場合は送信データの9bit目をここから書き込みます。なお、UDR0より先に書きこむ必要があります

0

 

UCSR0C

ビット

項目名

設定内容

設定値(書き込み)

7

 

UMSEL1

USART動作選択:シリアル通信の動作を「非同期動作」「同期動作」「主装置SPI」から選択します。通常は「非同期動作」を選択します。

非同期動作:0,0
(UMSEL1,0)

同期動作:0,1

主装置SPI:1,1

6

UMSEL0

5

UPM1

 

バリティー選択:バリティーチェックを「無効」「偶数バリティー」「奇数バリティー」から選択します。Arduinoなどと通信する場合は「無効」を選択します

無効:0,0 (UPM1,0)

偶数:1,0

奇数:1,1

4

UPM0

3

USBS

停止ビット選択:送信時に送られる停止ビットの長さを「1ビット」か「2ビット」から選択します。通常は、「1ビット」を選びます。

1ビット:0

2ビット:1

2

UCSZ1

 

 

 

データビット長選択:シリアル通信のデータのビット長の選択を行います。「5ビット」から「9ビット」で選択できますが、通常は「8ビット」を選択します

5ビット:0,0,0
UCSZ2,1,0

6ビット:0,0,1

7ビット:0,1,0

8ビット:0,1,1

9ビット:1,1,1(複数プロセッサ動作許可を有効時選択)

1

UCSZ0




0

UCPOL

クロック極性選択:同期動作の時にデータの送受信時のクロックの状態を選択します。非同期動作では0を書き込みます。

非同期動作:0

同期動作

送信時上昇端,受信時下降端:0

送信時下降端,受信時上昇端:1

※ビット2,1は主装置SPI動作の時は設定項目自体が変わります。設定項目名がビット2:UDORD(データ順選択)、ビット1:UCPHA:クロック位相選択に変わります。詳細はここでは省略します。

 

以上がシリアル通信(USART)の設定レジスタです。続いて、通信速度の設定レジスタの紹介をします。通信速度の設定レジスタは「UBRR0です。このレジスタに値を設定することで通信速度が決定されます。このレジスタに入力する値はデータシートP136~P137のボートレート設定例の表から検索するか、データシートP126の数式を変換した以下の式で求めます。

13

 

この検索、計算した値を「UBRR0」レジスタに入力することで通信速度が設定できます。

 

最後にデータの送受信の方法ですが、やり方として2種類あり割り込みを使う方法と使わない方法に分けられます。

前者の割り込みを使う方法の場合は、設定レジスタで割り込みを使う設定(割り込み許可と完了フラグを1)にし、割り込みの関数内で受信時は「UDR0レジスタから読み取り」送信時は「UDR0レジスタに書き込み」を行います。

割り込みを使わない場合は、main関数の無限ループ内で各完了フラグが1に設定されているときに受信時は「UDR0レジスタから読み取り」送信時は「UDR0レジスタに書き込み」を行います。

 

サンプルプログラム

今回は割り込みを使った場合で、Arduinoからデータを受信するようにした場合のプログラムとなります。なお、ここでの設定した内容は、上の設定レジスタの表の設定値の太線の値となっています。

#include <avr/io.h>

#define F_CPU 16000000 //CPUクロック16Mhz

 

#define SPEED 38400//シリアル通信の速度

 

 

int main(void)

{

       

         //シリアル通信設定

        UBRR0 =  ((long)F_CPU/((long)SPEED * 16)) - 1;

 

        UCSR0A = 0x80;

        UCSR0B = 0x98;

        UCSR0C = 0x06;

       

        sei();

       

    /* Replace with your application code */

    while (1)

    {

               

    }

}

 

 

ISR(USART_RX_vect){//シリアル受信完了時

        uint8_t data = 0; //受信データ

        data = UDR0;

}

 

以上がサンプルプログラムとなります。今回はArduinoからのデータ受信を目的にプログラミングを行いました。今回まででモータを鳴らすための回路、プログラム設計に必要な基礎のお話はほぼ紹介したので、次回からは全体的な設計のお話を少ししたいと思います。そのあとまた気分次第でモータを鳴らすことにはつかない基礎的なお話もするかもしれないです。

NT京都に出展した

まえおき
 去年の9月にVVVFの設計ノウハウ蓄積のために、一旦高圧を抜けて低圧の基板を作ろうとしてステッピングモータを演奏する基板を作り始めてから、はや半年。高専祭でステッピング演奏を展示した後はオリジナルなものを演奏しようということで、ケースファンを演奏することに切り替えました。
 それから、ちょっとずつ基板を増やして、1月ごろにはNT京都に出展することに決めて、ニコ技にも動画を投稿。この時は、いろいろ演奏できることをアピールするためにケースファンのほかに、ステッピングモータやDCブラシモータも演奏していました。
 そのころからは卒業関連のイベントやらテストやらでばたばたして、NT京都に出す予定だった5枚目の基板が完成したのは、3月の中旬。
P_20180322_163554_vHDR_On
完成した基板はこんな感じに。高々ケースファンを演奏するだけなのにディスクリートのMOSFETを使うというバカ仕様だけど、重ねたらかっこいいなという当初のコンセプトを満たせたので満足!
それから、調整を進めて、NT京都の2日前にやっと音量アップの作戦を開始。結局音量アップ作戦は間に合わないままNT京都に行くことに…

本題
前日の24日に準備で春日神社に入り、設営準備。
P_20180325_084652_vHDR_On
こんな感じに設営完了。だが、音量が小さい…

結局当日は耳を澄まさないと聞こえないと聞こえない音量に…
まあ、なんとかなんとか乗り切れましたと…

展示会に出展するのは今回が初めてで、いろいろとわからないことも多かったですが、他の方にいろいろと教えていただいて、無事展示できました。いろいろ交流できて楽しかったです。ありがとうございました。

制御編 第12回 AVRマイコンの割り込みのまとめ

前回まででタイマー割り込みの使い方について紹介してきました。今回は割り込みの種類とそれぞれに使うISR関数の引数(マクロ)を紹介したいと思います。

 Atmega系のマイコンのISR関数の引数はC:\Program Files (x86)\Atmel\Studio\7.0\packs\atmel\ATmega_DFP\1.2.150\include\avrのフォルダ内のiom****.h」(****にはマイコンの型番の数字が入る)のヘッダーファイルの下部に書かれています。それぞれ、「*****_vect(*****は割り込みごとに異なる)の形で表します。(それ以外の形で書かれているのは別物です)Atmega328Pの場合は「C:\Program Files (x86)\Atmel\Studio\7.0\packs\atmel\ATmega_DFP\1.2.150\include\avr\iom328p.h」になります。(Atmega以外のマイコンの場合、上記のパスの「atmel」フォルダに戻り、それぞれのマイコンの種類を選択して同じように進んでください。(attiny2313の場合「C:\Program Files (x86)\Atmel\Studio\7.0\packs\atmel\ATtiny_DFP\1.3.147\include\avr\ iotn2313.h」です。))今回は例として「atmega328P」の割り込みの種類とマクロ名を紹介します。

 

タイマー割り込み

割り込みの種類

マクロ名

タイマー0溢れ割り込み

TIMER0_OVF_vect

タイマー0比較A割り込み

TIMER0_COMPA_vect

タイマー0比較B割り込み

TIMER0_COMPB_vect

タイマー1溢れ割り込み

TIMER1_OVF_vect

タイマー1比較A割り込み

TIMER1_COMPA_vect

タイマー1比較B割り込み

TIMER1_COMPB_vect

タイマー1捕獲割り込み

TIMER1_CAPT_vect

タイマー2溢れ割り込み

TIMER2_OVF_vect

タイマー2比較A割り込み

TIMER2_COMPA_vect

タイマー2比較B割り込み

TIMER2_COMPB_vect

 

外部割込み

割り込みの種類

マクロ名

外部割込み1

INT0_vect

外部割込み2

INT1_vect

ピン変化割り込み0

PCINT0_vect

ピン変化割り込み1

PCINT1_vect

ピン変化割り込み2

PCINT2_vect

以上の2種類(タイマー、外部)の割り込みがマイコンの割り込みの代名詞ともいえるよく使われる割り込みとなっています。外部割込みの設定はatmega328Pの場合データシート(https://avr.jp/user/DS/PDF/mega328P.pdf )P50~53にかけて書かれています。軽くまとめておくと以下のようになります。

外部割込み

EICRAレジスタ:割り込みの条件(ピンの状態がどのように変化した時に割り込みを行うか)の設定

EIMSKレジスタ:外部割込みを許可するレジスタ

外部割込みは以上の2つのレジスタを設定して使います。EIFRレジスタは通常使いません。

ピン変化割り込み

PCICRレジスタ:ピン変化割り込みを許可するレジスタ

PCMSK0レジスタ:ピン変化割り込み0群のうち、変化を読み取るピンを選択するレジスタ

PCMSK1レジスタ:ピン変化割り込み1群のうち、変化を読み取るピンを選択するレジスタ

PCMSK2レジスタ:ピン変化割り込み2群のうち、変化を読み取るピンを選択するレジスタ

ピン変化割り込みは以上の4つのレジスタを設定して使います。PCIFRレジスタは通常使いません。

続いて、通信系の割り込みを紹介します。

通信系割り込み

割り込みの種類

マクロ名

シリアル通信受信完了割り込み

USART_RX_vect

シリアル通信送信完了割り込み

USART_TX_vect

シリアル通信データレジスタ空割り込み

USART_UDRE_vect

SPI通信転送完了割り込み

SPI_STC_vect

TWI(I2C)動作完了割り込み

TWI_vect

以上が通信系の割り込みとなります。「データレジスタ空割り込み」を除いて、通信の動作が完了し次のデータを送受信できる状態になった時がトリガーとなります。この割り込みを使うことでデータを受信したら、そのデータを読み込むといった動作が可能になります。なお、次回の記事でシリアル通信の使い方について紹介します。

 

その他割り込み

割り込みの種類

マクロ名

A/D変換完了割り込み

ADC_vect

アナログ比較器出力遷移

ANALOG_COMP_vect

ウォッチドッグ計時完了割り込み

WDT_vect

EEPROM操作可

EE_READY_vect

SPM命令操作可

SPM_READY_vect

最後のその他の割り込みは使う機会はあまりないと思います。使うとしてもA/D変換完了割り込みぐらいだと思います。

 

以上がatmega328Pにおける割り込みの種類とそれに対応するマクロです。マイコンの種類が変わっても、同様に考えれば割り込み処理は使えると思います。次回はatmega328Pにおけるシリアル通信の使い方を紹介します。



制御編 第11回 マイコンのタイマー割り込み その2

文字数の関係の記事を2つに分けています。今回は前回の続きです。

サンプルプログラム

 今回のサンプルプログラムは、「frequency」変数に入力した周波数(パルス)数でステッピングモータを回転させるプログラムです。回転数に応じてduty比を変化させており、2相励磁となっています。

 

#include <avr/io.h>

#include <avr/interrupt.h>//割り込みのライブラリ

 

void setSquareWave(int freq); //矩形波の周波数設定

 

volatile uint8_t vect = 0;//角度

volatile uint8_t duty_h = 0;//duty125以上

volatile int frequency = 500;

 

volatile double duty = 0;

uint8_t PD[5] = {0x08, 0x20, 0x00, 0x40, 0x08};//ステッピングモータ励磁状態の配列

uint8_t PB[5] = {0x00, 0x00, 0x08, 0x00, 0x00};//この値をPORTに入れる

 

int main(void)

{

         DDRD = 0x68;//PWMピンを出力設定

         DDRB = 0x0F;

               

         //矩形波生成タイマー設定

         TCCR1A = 0x03; //PWM出力なし位相/周波数基準 OCR1A max

         TCCR1B = 0x1B; // 64分周

         TIMSK1 = 0x00; //割り込み停止

         setSquareWave(frequency);//周波数セット

         sei();//割り込み開始

       

    while (1)

    {

    }

}

 

void setSquareWave(int freq) {

  if (freq < 500) duty = 80; //duty比設定//90

  else if (freq < 1000) duty = 120;//120

  else if (freq < 1500) duty = 190;//150

  else duty = 230;//200

 

  if (freq != 0) { //動作

    TIMSK1 = 0x00;  //割り込み禁止

    //TCCR1B = 0x1B;//64分周 /2 250,000回カウント

    OCR1A = (unsigned int)(250000 / freq) ; //割り込み周波数

        if(duty <= 125){ //duty比が低い時(実質1相励磁)

                OCR1B = OCR1A * (duty / 125.0);

                duty_h = 0;//duty

        }else {//duty比が高い時(2相励磁)

                OCR1B = OCR1A * ((duty -125.0) / 125.0);

                duty_h = 1;//duty

        }

   

    TIMSK1 = 0x05;//OVFと比較Bの割り込み許可

   

    DDRC = 0x00;//出力オフ(Hi-Z)

 

  } else  { //停止

    TIMSK1 = 0x00;  //割り込みなし

    PORTD &= ~0x68;

    PORTB &= ~0x08;//出力L

    DDRC = 0x0F;//出力ダウン

  }

}

 

ISR(TIMER1_OVF_vect) { //オーバーフロー割り込み

        vect++; //進める

        if (vect > 4) vect = 1; //OVF

        PORTD |= PD[vect];

        PORTB |= PB[vect]; //出力

 

}

 

ISR(TIMER1_COMPB_vect) { //矩形波割り込み

        if(duty_h){

                PORTD &= ~PD[vect - 1];//1つ前の出力OFF

                PORTB &= ~PB[vect - 1];//1相励磁

        }else{

                PORTD &= ~PD[vect];//出力OFF

                PORTB &= ~PB[vect];//1相励磁

        }

       

}

 基本的なレジスタ設定はPWM出力に準じています。また、ステッピングモータのduty比の設定は溢れ割り込みと比較一致割り込みを組み合わせることで実現しています。ステッピングモータの励磁状態は配列に入れた値を使うことで処理の簡略化を実現しています。

そして、割り込みを使用するにあたって注意しなければならないのが、割り込み用のライブラリである<avr/interrupt.h>を読み込まなければならないことと、割り込み処理はISR(*****)」の関数を使う必要があるということです。また、ISR関数の引数(*****)(マクロともいう)は割り込みの種類ごとに異なるので注意しなければなりません。Atmega328Pにおけるタイマー割り込みの場合はISR関数の引数は以下の表のようになります。

8

割り込み処理の内容はISR関数に上の表の引数を入れること(サンプルプログラム参照)で実行ができます。ここで引数を間違うと割り込み処理ができないので注意が必要です。(コンパイルが通る場合もあるので注意)

以上でタイマー割り込みの設定は終わりです。次回は割り込み処理の引数(マクロ名)の探し方を紹介したいと思います。

制御編 第10回 マイコンのタイマー割り込み その1

前回はマイコンからPWMを出力するお話をしましたが、今回はタイマー割り込みのお話です。前回のPWMはマイコンのタイマー機能を利用していましたが、今回のタイマー割り込みもタイマーを使っています。とはいえ「割り込みってなんやねん」って思う方もいると思うので最初に軽く割り込みについて紹介します。

 

割り込みとは

 割り込みは、設定したトリガが発生した時に強制的に特定の処理をさせることを意味しています。トリガが発生した時にたとえ他の処理を行っていたとしても、割り込みに指定された処理を強制的に実行するため、トリガ発生時に確実な処理が可能になるというわけです。これを図示すると下の図のようになります。
1

 図からも、通常の処理を行っているときにトリガが入ると強制的に割り込み処理を開始し、割り込み処理が終了するまでは他の処理が中断されることがわかりますね。(Atmega328Pなどの1スレッドのマイコンの場合)

 

タイマー割り込みとは

タイマー割り込みでは、このトリガが「タイマー」によって発生します。つまり、一定の時間ごとに割り込み処理を行えるということです。ステッピングモータを回すパルスを発生させるときなど正確な時間間隔で似た処理を行いたいときなどに非常に使い勝手の良い処理と言えますね。それでは、続いてAtmega328Pにおけるタイマー割り込みの原理を紹介していきます。

タイマー割り込みは前回紹介したPWMと同様にマイコンのタイマー機能を使っており、マイコンのタイマーのカウンタがある状態になった時に、トリガを発生させるという仕組みです。ここでの、ある状態とは、タイマーがカウントの数がオーバーフロー(溢れ)した時比較値PWM生成の時の閾値 OCR0Bなど)と一致した時などを指します。つまり、タイマーのカウントが特定の値に達した時に、割り込み処理が実行されるというわけです。このタイミングを図示してみます。
2

 上の図がタイマーのカウンタがオーバーフローしたときの割り込み(マイコンではこれを溢れ割り込みと言います)を示しており、タイマーのカウンタがオーバーフローする↓で示したタイミングで割り込み処理が行われます。ただし、この溢れ割り込みのタイミングはタイマーの動作種別によりタイミングが変わります。(詳細は次の節)また、同様に下の図はタイマーのカウンタが比較Aに達した時の割り込み(比較A割り込み)を示しており、↓で示したタイミングで割り込み処理が実行されます。

 

タイマー割り込みの注意点

 先ほどの節でタイマー割り込みの原理を紹介しましたが実際にタイマー割り込みを使用するにあたって注意しなければならない点が複数あります。1つ目は溢れ割り込みのタイミングで2つ目は比較・捕獲割り込みのタイミング、3つ目はTOP値と比較・捕獲値の関係です。

溢れ割り込みのタイミング

 溢れ割り込みは定義上はカウンタの値がオーバーフローした時の割り込みです。しかし、溢れ割り込みでオーバーフローした時に割り込みが入るのはデータシート上「標準動作」と「比較一致タイマ/カウンタ解除(CTC)動作」のみであるということに注意しなければなりません。すなわちよく使われる、「高速PWM動作」「位相基準PWM動作」、「位相/周波数基準PWM動作」においてはタイマーのカウンタがオーバーフローした時に割り込みが実行されないというわけです。Atmega328pのデータシート(https://avr.jp/user/DS/PDF/mega328P.pdf )P.99(タイマー1)を確認すると、このことの記載がされており、タイマーの動作種別によりタイミングが異なると書かれています。そのタイミングはタイマー動作種別の表(以下に引用)に書かれています。
3
4

上が8ビットタイマーで下が16ビットタイマーの場合です。それぞれの表の右端の赤で囲んだ「TOV1設定時」の項目に溢れ割り込みが入るタイミングが書かれています。これより「高速PWM動作」ではタイマーのカウンタが「TOP値」に達した時、「位相基準PWM動作」「位相/周波数基準PWM動作」ではタイマーのカウンタが「BOTTOM(0)に達した時に割り込みが動作することがわかります。これを図示してみます。
4-1
 図を見れば「高速PWM動作」はTOP値で割り込みが入っていますが、TOP値は同時にBOTTOM値でもあるのでどちらかというと溢れ割り込みは、タイマーのカウンタが0になったタイミングで入ると考えても問題はないでしょう。以上が溢れ割り込みの動作のタイミングの注意点です。

 

比較・捕獲割り込みのタイミング

 比較A,B割り込みや捕獲割り込みはタイマーのカウンタの値が比較A,B(OCR*A,B)や捕獲値(ICR1)と一致した時をトリガとして割り込みが入ります。原理上はこれだけなのですが、タイマーの動作種別により割り込みが入るタイミングや回数が変わることに注意しなければなりません。割り込みが入るタイミングを図示してみます。
4-2
 この図を見れば、高速PWM動作ではカウンタ1周期の間に割り込みが1回で等間隔に割り込みが入るのに対して、位相(/周波数)基準PWM動作ではカウンタ1周期の間に2回割り込みが入り割り込みが入るタイミングが等間隔でないことがわかります。割り込み動作の時はカウンタが上昇時と下降時の区別がされずに単に値が一致した時がトリガとなるためこのような動作となります。

 

TOP値と比較値との関係

 この関係はタイマーのカウンタのTOP値と比較値が一定の関係にならないと割り込みが入らないことを示しています。割り込みが正しく入る条件はこのような関係です。

比較値≦TOP

この関係も原理から考えると非常にやさしいものですが2つの値の関係よってどのようになるかを図示してみます。
5

比較値とTOP値の関係を「比較値>TOP値」「比較値=TOP値」「比較値<TOP値」の3つの場合を図示してみました。この図を見れば、「比較値>TOP値」の時に割り込みが一切入らなくなることは明らかですね。また、「比較値=TOP値」はカウンタがTOP値に達した時に割り込みが入るため、カウンタ1周期につき1しか割り込みが入らないこともわかると思います。

 

以上の3つが割り込みを使うときの大きな注意点となります。続いて、各種レジスタの設定方法ですが、波の形と最大高さ関連の設定は前回のPWMの記事http://vvvf.blog.jp/archives/7662206.html)を参考に行ってください。ここではタイマー割り込みにおいてPWM出力時と異なるレジスタ設定の項目を紹介します。

 

割り込みのレジスタ設定

 6

初めに、各出力ポートの設定です。今回はPWM出力を利用しないので、すべて「標準ポート動作」(COM*x: 0 0)を選択します。TCCR0A,BTCCR1A,BTCCR2A,Bのその他の設定はPWMの時と同じようにしてください。

続いて、割り込み動作の許可の設定です。
7

この割り込み許可レジスタで、各種割り込みを許可する設定を行っています。利用する割り込みのビットを立てることで、割り込みが使用できるようになります。なお、捕獲割り込みは「ICR1」と一致時、比較一致割り込みは「OCR*A」「OCR*B」と一致した時に割り込みが入ります。

以上でレジスタの設定は終了ですが、割り込みを使用するにはプログラムですこし変わった書き方が必要となります。各レジスタの実際の設定値と合わせて、次のサンプルプログラムのところで紹介します。

 

文字数の関係でサンプルプログラムはその2に続きます

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