モータの鳴らし方byHanDen

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

KiCad5の使い方 2章 回路図エディタの使い方 

まずは起動画面の回路図のようなアイコン(下図↑1)をクリックしてEeschemaを起動します。

5
1
2-1 起動画面

起動画面のよく使う機能は以下の通りです。

1:ページ設定を編集 回路図のシートの大きさや製作者名などを設定できます。

2:回路図シンボルをアノテーション 回路図を作成した後に各部品に番号を振る機能です。

3:エレクトリカルルールのチェックを実行 描いた回路図に電気的な異常がないかどうかをチェックする機能です。

4:ネットリストの生成 描いた回路図を基板設計のツールに受け渡すデータを生成する機能です。

5:シンボルを配置 回路図の要となる回路の部品等の配置をするツールです。

6:電源ポートの配置 電源やGNDの部品の配置を行うツールです。

7:ワイヤーを配置 部品同士をつなぐ配線を描くツールです。

8:バスを配置 複数の配線をひとまとめにしてつなぐツールです。大規模な回路にならないと使うことはないと思われます。

9: 未接続フラグを配置 マイコンやコネクタ等で使用せず空きになっている端子に取り付けるフラグです。エレクトリカルルールチェックでエラーが出ないようにするために使います。

10:ジャンクション(接続点)を配置 ワイヤーの交点を接続する際に使用します。

11:グローバルラベルを配置 回路図でラベルを配置したい場合に使用します。同じ名前のラベルは回路図上で接続されたとみなされるので注意してください。

12:アイテムを削除 部品や配線等を削除したいときに使います。

 

なお、大規模な回路の場合は→11と→12の間アイコンの階層分けの機能を視野性が高まりますが、KiCadの場合あんまり使い勝手は良くないのでここでは紹介しません。

 

最初に回路の規模に応じてページサイズを設定します。

2
2-2 ページ設定

左側の「サイズ」部から適当なページサイズを設定します。小規模な回路ではA4中規模でA3大規模だとA2ぐらいが良いでしょう。

 

2-1 部品の配置

「シンボルを配置」(図2-1 5)で部品の選択モードに切り替えます。カーソルが鉛筆に変わっていることを確認して、部品を配置したい場所で、左クリックをすると、「シンボルを選択」ウインドウが表示されるので、配置したい部品を選びます。なお、ver5では起動後初回に限り表示まで時間がかかるようになりました。

3
2-3 シンボル選択

シンボルは種類別に分類されているのでその中から選べます。また、「フィルター」(図2-3←)のところに部品名を入力して検索をかけることもできます。

KiCadのライブラリでは、下図のように同じNchMOSFETでも端子の配置順に複数登録されているものがあります。この場合は必ずデータシートを確認して使用する部品に適合した部品を選択します。(使用する部品の型番ごとにピン配置が異なる場合があるためです)

3-1
IC類などライブラリに登録されていない部品は、部品を自分で作成するか、RSコンポーネンツが提供している「PCB Part Library」を利用します。

 

2-2 部品の型番または定数とフットプリントの設定

Esc」キーで通常モードに戻り、配置した部品上にカーソルを置いた状態でキーボードの「E」キーを押すか、右クリック、「プロパティー」、「プロパティーを編集」で、シンボルプロパティーを開きます。

3-2

ここで、回路図上で部品の定数やほかの部品と重なって表示されている場合は下図のように「明示的な選択」というメニューが出ます。ここでは設定したい方の「シンボル〇〇」を選びます。

以後同様のメニューが表示された場合は、編集したい部品を選択します。

3-3
4
2-4 シンボルプロパティー

「定数」(図2-4 ←1)の部分に型番または部品の定数を設定します。次に「フットプリント」をクリックし右側のライブラリアイコン(→2)を選び、フットプリントの選択画面に進みます。

5
2-5 フットプリントブラウザ

ブラウザ内から、使用する部品に適合したフットプリントを選択します。

探すライブラリはICでは「Package_**」、MOSFETやトランジスタでは「Package_TO_SOT_***」、抵抗器やコンデンサ、ダイオード、コネクタなどは部品名のライブラリです。また、ライブラリ名でTHTとあるのはスルーホール部品で、SMDとあるのは表面実装の部品です。これらのライブラリの中から、使用する部品と同じ、大きさやピッチ、パッケージのフットプリントを選びます。(間違えると基板が使えなくなります)ライブラリ内にフットプリントが存在しない場合は自分でフットプリントを作る必要があります。

正しいフットプリントが選べたら、フットプリント名をダブルクリックすると、フットプリントが確定され、シンボルプロパティーに戻ります。そして、「OK」をクリックしてフットプリントの設定を確定させます。

 

部品の挿入とフットプリント・型番or定数の挿入の操作を繰り返して、設計する回路に必要なパーツをすべて回路図上に配置します。部品はコピーすることができるので、同じパーツが複数ある場合は、フットプリントを設定したあとでコピーをすると手順を大幅に減らすことができます。

コピーは、コピーしたい部品上にカーソルを置いて「C」キーを押すまたは部品上で右クリック,「複製」をすると、マウスカーソルの先端にコピーされたパーツがくっつき、コピー先でクリックするとコピーが確定されます。

5-1
また、部品を右クリックしたメニューの「角度」の中には回転やミラーなどがあるので、必要に応じて使います。(回転はキーボードの「R」キーを押しても実行可)また、「〇〇を移動」を選択すると(またはキーボードの「M」キーを押しても実行可)部品の位置を移動することもできます。ドラッグに関しては現時点では使用する必要はありません。(今は移動と同じ)
5-2

 

2-3部品同士のワイヤー接続

「ワイヤーを配置」(2-17)でワイヤーの接続モードに入り、図2-6の↑で示したような各部品のピンの先端の未接続の印(〇又は□の印)の部分をクリックしてワイヤーの接続を始めます。

1
2-1 起動画面

回路図11

2-6 ワイヤー配置

「ワイヤーを配置」(2-17)でワイヤーの接続モードに入り、図2-6の↑で示したような各部品のピンの先端の未接続の印(〇又は□の印)の部分をクリックしてワイヤーの接続を始めます。

続いて、ワイヤーの反対側を接続したい部品の未接続の印の上(図2-6↑の左側の抵抗器の〇印)でクリックするとワイヤー(配線)が接続され、接続された箇所の未接続の印が消えます。ここで、印が消えていない場合は配線が接続されていないので、戻って再度接続を行います。なお、配線途中でクリックするとその場所で配線を折り曲げることができます。

図のOUTタグの所などワイヤーを分岐する個所では、ワイヤーの途中から、ワイヤー引き始めるあるいは、引き終えることで配線の分岐・結合となります。この際に接続のジャンクション印(図2-71の●印)が表示されていることを確認します。もし、接続したい交点でジャンクション印が表示されてないときは、ジャンクションの配置モード(図2-110)に入り、接続したい交点をクリックしてワイヤーを接続します。逆に接続しない箇所で誤ってジャンクション印を配置した場合は、削除モード(図2-112)でジャンクションを削除します。(削除対象を右クリックして削除を選ぶことや、削除対象にカーソルを置いて「Delete」キーでも削除可)

回路図13
2-7 ジャンクション

すべての部品同士をワイヤーで正しく接続できるまでこの作業を繰り返します。配線を間違えた場合は先述のジャンクションの削除と同様に配線を削除してください。また、コネクタやICなどで端子を未接続のままにする場合は、「未接続フラグ」(図2-19)を未接続の端子に配置します。また、「ドラッグ」を用いると配線が接続されたまま、部品を移動できます。

 

2-4 アノテーション

「回路図シンボルをアノテーション」(図2-12)より「回路図をアノテーション」を開きます。

6
2-8 アノテーション

基本的に初期設定のままで問題ないので下部の「アノテーション」をクリックしてアノテーションを実行します。アノテーション作業は取り消しができないというメッセージが出るので、確認して「OK」をクリックするとアノテーションが実行されます。

アノテーション後に回路図を変更してパーツが増えた場合は、再度アノテーションを実行します。また、一度アノテーションクリア、再度アノテーションをすれば、部品の番号がきれいに並ぶので必要に応じて使い分けます。

 

2-5 ERC

「エレクトリカルルールのチェックを実行」(図2-13)より「エレクトリカルルールチェック(ERC)」を開きます。

1
2-1 起動画面

下部の「実行」をクリックするとエラーチェックが始まり、問題個所があれば自動的に警告またはエラーが出てきます。

回路図17
2-9 ERC

サンプルのような回路でチェックを実行するとこのようにエラーメッセージが出ます。上2つのエラーは電源端子に「PWR_FLAG」が配置されていないため起きるエラーです。「電源ポートを配置」(図2-16)から「PWM_FLAG」を電源とGNDに接続することで解決します。上から3つ目のエラーはピンがどこにも接続されていないときに出るエラーで、一番下のエラーはラベルを配置したときに、そのラベルがどことも繋がっていないときに出るエラーです。

他に、各パーツのピンの設定が「不特定」になっている場合には下のように「ピン間の衝突問題」といったエラーが表示されることもあります。これの対策は次回紹介します。

 回路図19

ERCで出たエラーを解決または問題ないと判断できた場合は回路図作成の最後の作業である「ネットリスト」の生成に移ります。

 

2-6 ネットリスト出力

ネットリストはプリント基板を描くソフトウェアに部品のリストや接続情報などを送り出すためのファイルを生成する機能です。

「ネットリストを生成」(図2-14)より「ネットリスト」を開きます。

7
2-10 ネットリスト

KiCadのプリント基板エディタはPcbnewなのでそのまま右の「ネットリストを生成」をクリックしてネットリストを生成します。保存先はデフォルトのままで大丈夫です。

これで、回路図の作成は完了です。

回路図のサンプルはこんな感じです。

8

KiCad5の使い方 1章KiCadの初期設定

以前はKiCad4.0.7での使い方を紹介していましたが、バージョンが上がり今は5.1.4になりました。内容の更新を含めて今回からKiCad5.1.4での使い方を紹介していきます。


 回路図やプリント基板のデータを作成するツールは少し前までは
EagleBsch3v+PCBEなどしかありませんでしたが、無料版ではサイズ制限があったり、回路図とプリント基板エディタで連携ができないなど不便な点がありました。しかし近年ではKiCadというフリーでサイズ無制限で回路図作成からプリント基板のデータ出力まで統括してできるツールが登場しました。今回はこのKiCadを使って回路図作成からプリント基板のデータ出力の手順を紹介していきます。

 

まずは、KiCadをインストールする方法を紹介します。

1.KiCadのダウンロード

http://www.kicad-pcb.org/」にアクセスし、ページ中央の「DOWNLOAD」をクリックしダウンロードページに進みます.

1

 続いて使用環境を選びます。自分の使ってるOSを選んでください。

2

使用しているパソコンが64bitOSの場合は上側の選択肢(白←)から32bitOSの場合は下側の選択肢(黄←)からダウンロードします。速度はおそらくCERNが速いと思います。

3
 

 日本語コミュニティーのサイトもありますが更新が止まっているため、海外の公式ページからダウンロードしてください。

 

 

2.KiCadのインストールと初期設定

ダウンロードしたファイルを実行ウィザードに従いインストールを行います。デフォルトのままインストールを行えば問題ないです。

 

KiCadを開くとこのような画面が表示されます

4
1-1 初期画面

インストール直後の状態では何もできないので、↑1の新規プロジェクト作成をクリックして、設計する基板に応じた適当なファイル名を入力したうえで「保存」をクリックします。空のディレクトリ内にファイルを作成することを勧めるメッセージが出てくるので「はい」をクリックします。こうすることで後々の設計段階などでファイルの管理がしやすくなります。

 

その後このような画面が表示されます。

5
1-2 起動画面

1は回路図を描く回路図エディタ (Eeschema)、↑2は回路図の部品を作成するコンポーネントライブラリエディタ、↑3はプリント基板のデータを作成するプリント基板エディタ(Pcbnew)、↑4はプリント基板のフォットプリントを作成するフットプリントエディタです。

 なお、KiCad4.0.7ではオフラインでの動作には別途設定が必要でしたが5.1では不要になりました。

準応用編 第3回 STM32マイコンのUARTをDMAを使って受信してみた

 今まではAVRマイコンのお話をしてきましたが今回はSTM32マイコンを使った応用的なお話をします。(STM32マイコンの基本的な所は今回は書かないので他の文献を…)

 今回紹介する内容はSTM32に搭載されているDMA(CPUを介さずにペリフェラルからメモリに書き込むorその逆)を使ってUART(シリアル通信)の受信データをArduinoSerialライブラリのように使えるように実装してみました。

 

DMAとは

 DMAは略さずに言うと「Direct Memory Access」です。すなわちペリフェラル(UARTSPIなどの周辺回路,周辺機器)CPUを介さずに直接メモリにアクセスすることができます。これによりCPUの負荷に関係なく確実にデータの受け渡しが可能になります。図解するとこんな感じです。
0-1

0-2

0-3

STM32における各種設定

 STM32マイコンでは各種設定はCubeMXを使って行います。その設定内容・方法を記載します。
 画面の全体画像はこんな感じです。
キャプチャ

まずは右側のペリフェラル選択画面からUSART*またはUART*(*は数字)からDMAで受信したいUARTの番号を選択します。今回はUSART2(USARTUARTの機能拡張なのでUARTを使う場合はUSART*を選んでもOK)
1

続いてペリフェラル選択画面の右上の下図に示すようなMode選択画面から←で示したAsynchronous(非同期通信, UART)を選択します。MIDIArduinoなどの通信は基本的には非同期通信となります。もし、同期通信(USARTの機能)を使う場合は用途に応じて選んでください。
2

Asynchronous」を選ぶとその下の画面には通信速度の設定などのconfigurationのメニューが表示されます。Baud Rate(通信速度)は通信相手に合わせて設定します。MIDIの場合は31250Bits/sです。他の設定も相手側に合わせます。MIDIの場合は通信速度以外はデフォルトでOKです。設定が完了したら下図↓で示したDMA Settings」を開きます。
3

 続いてDMAの設定に入ります。まずは下図の↑1の「Add」をクリックしDMAの設定を追加します。続いて出てきたDMAの設定の「DMA Request」の「Select」から←2で示した「USART*_RX(今回の場合*2)を選びUARTの受信データをDMAで受け取る設定にします。
4

 続いて「DMA Request Settings」のModeから下図←3の「Circular」を選択します。これによりDMAで受け取ったデータのバッファーがループ形状になります。(厳密にはバッファーの最後までデータが受信されると最初に戻る 例:Bufferサイズが1024の場合1023まで受信したたら次は0) DMA優先度を設定する「Priority」は他にDMAを使う場合は優先度が高いものからVery High, High, Medium, Lowにします。
 5

これにてCubeMxでのUART周りの設定は終わりです。Generate Codeでコードを出力しておきます。

 

 続いて生成されたコードを開きソースコードを書き始めます。ここで今回のシステムの構造とアルゴリズムを示します。

 今回のシステムはArduinoSerialライブラリのような使い方、つまり未読データ数の確認と未読データの取得の関数を実装します。そのため、実装する関数は2つで何かしらに未読データ数を確認する方法を編み出さなければなりません。

 未読データ数を取り出す方法として、DMAで受信したデータ位置と既に読み取り済みのデータ位置を比較します。読み取り済みのデータ数はプログラムで読み取るごとにインクリメントすれば導けます。受信済みのデータ位置には筆者がいろいろと試した結果以下の方法で読みとりが出来ました。

UARTのハンドラ(huart*(今回は*2))内のUART RxDMAのハンドラ(hdmarx)内のInstance, NDTRにてバッファーの残容量の確認ができます。具体的には以下のようなコードでremain_buf変数に残りのバッファー量を読み取れます。


 remain_buf = huart2.hdmarx->Instance->NDTR

残りのデータ量がわかればバッファーサイズからこの値を引けば現在受信済みデータの先頭位置がわかります。受信済みデータの先頭から読み取り済みデータ位置を引くと未読データ数が判明します。(バッファー端部の例外処理は必要)

 具体的なコードは以下の通りです。

未読データ数確認
6

データ読み取り
7

以上で関数の実装が出来ました。これらのコードはcubeMxの吐き出した「main.c」の/* USER CODE BEGIN 0 *//* USER CODE END 0 */の間あるいは、別のファイルに入れなければなりません場所を間違えるとCubeMxの設定変更時にコードが消えます

また、別途バッファーの宣言とバッファーのサイズ(データ数)DATANUM」の宣言が必要です。

 

実際にDMAでデータを受信するためにはDMAの動作を開始する指示をマイコンに与えなければなりません

その処理は以下のような関数(HALドライバの関数)を実行します。

HAL_UART_Receive_DMA(&huart2,serialData,DATANUM);

この関数はループ処理が始める前すなわちwhile(1){}の前に入れる必要があります。具体的な位置としてはCubeMxが吐き出した「main.cUSER CODE BEGIN 2USER CODE END 2の間で良いでしょう。場所を間違えるとCubeMxの設定を変更すると消えてしまいます

 

以上がSTM32UARTDMAで受信してArduinoSerialライブラリのように読み取る方法の紹介です。なお、今回のコードはhttps://github.com/HanDenMotor/readSerial_STM32DMAにアップしてるのそこからコピペするなりなんなりで使ってください。

次回は今回のUART受信をさらに応用してMIDIの受信プログラムの紹介をします。

準応用編 第2回 ATmega328PBを使ってみた および注意点

今回は従来からArduino UNOなどで非常によく使われているATmega328Pの強化版であるATmega328PBについて紹介してみたいと思います。まずはAtmega328Pとの違いから

 

ATmega328Pとの違い

1.       UART, SPI, I2C2つずつ使える

2.       タイマー(PWM)が使える数が多い

3.       DIPパッケージが存在しない

 

大きな違いはこの3つかなと思います。ATmega328Pと互換性をそこそこ維持しつつも最近のマイコンらしくペリフェラルも強化された完全なATmega328PBの上位互換です。DIPパッケージが無いのも近年の流れとも言えます。(IC類でも最近はDIPがディスコンになったり元から無かったりってことが増えてきています。)

 筆者はPORT出力、PWM出力(タイマー)、ADCUARTSPIを使いましたが、ATmega328Pに搭載されている機能を使う際はほとんど変更なしに同じプログラムが動作しました。ただし、UART,SPI,I2Cについては2つに増えたためレジスタ名に番号が増えて(例:UCSRAUCSR0A)いることには注意してください。

 PORT、ペリフェラルの基本的な使い方は以前の記事(ATmega328Pでの使い方)を参考にしてください。本記事ではATmega328PBを使う際の注意点を紹介します。

 

ATmega328PBの注意点

1.       ATmega328Pでは電源だったピンが一部IOに変更されている

ATnega328PではGND(ピン番号3)Vcc(ピン番号6)だったピンがそれぞれPE0PE1に変更されています。そのため、ATmega328P用に設計した基板でATmega328PBを使う場合はPE0,1の出力設定に注意しなければなりません。間違ってIOを出力にしてPE0HIGH, PE1LOWにした場合マイコンが破損する可能性があります。

2.       Timer3コンペアBOC3B)とTimer4コンペアB(OC4B)が同じピン(PD2)に設定されているため使うときの設定に注意点がある。

ATmega328PBではTimer3つから5つに増えました。しかし、新たに追加されたTimer3Timer4のコンペア(比較)B出力はどちらもPD4ピンを共用する仕様になり少し使用方法が複雑になりました。こちらについてもデータシートに記載があるのでデータシートを見てみます。

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

データシートの122ページを見てみます。
1

すると、Timer3 コンペアBTimer4コンペアB変調器を通してPD2に繋がっていることがわかります。そして、PORTB7(PB7)の状態が1の時にOR 0の時にANDとなることがわかります。

 言い換えると、普通のPWMピンとして使おうとする場合はTimer34かのどちらかを使ったうえでPB7(PORTB bit7)1にしておく必要があるということです。(筆者はこれで数日潰しました)

 ちなみに、PB70(変調器をAND)にした場合はTimer34かのどちらかしか使わない場合は常にLが出力されます。

また、両方使った場合はPB70(AND)の場合duty比がAND(50%50%の場合は25%が出力)PB71(OR)の場合duty比がOR(25%25%の場合50%)されます。そのため、Timer34を両方有効化して使うことは基本的に無いと思います。

 

以上が筆者がATmega328PBを使っていて引っかかった点および気を付けた点になります。

 

ATmega328PBATmega328Pの正当な進化系でかつ互換性をそこそこ維持した使いやすいマイコンだと思います。ATmega328Pでは足りないけどもっと上のAVRとか32bitマイコンは大規模すぎるって時に有用じゃないかと筆者は思います。

準応用編 第1回 マイコン内蔵LED “WS2812B” の制御方法

今回はマイコンを使ってマイコン内蔵のLEDであるWS2812Bを制御します。今回紹介するLED WS2812Bの特徴はマイコンなどから信号を与えることで各LEDを個別で制御できかつ安価である(AliExpress1つ当たり10円を切る価格)で売られているという所です。数珠接続で個別制御できるため安価なLEDテープを大進化させたLEDともいえると思います。

 一見最強そうに見えるこのLED実はマイコンから制御するのが一筋縄にはできないという問題があります。(本来は専用のコントローラを使います)今回はこのWS2812B搭載のLEDテープをAVRマイコンとSTM32マイコンで制御する方法を考えていきます。

 

 

制御信号の形

 まずはWS2812Bのデータシートを見てみます。

http://www.world-semi.com/DownLoadFile/108

こちらが製造元の新しいバージョンとみられるデータシート

https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf

そしてこちらがadafruitとか秋月に掲載されているデータシートです。

ややこしいことに、信号生成に関わる箇所のパラメータがこの2者で違うことを覚えておいてください。
 データシートを見ていくとUARTでもSPIでもI2Cでも無い、専用のデータ形式であることがわかります。具体的な信号の形(1bit)は下図のような感じです。

 1

そしてこのbitが以下のように連続して送られることで1つのLEDの制御信号になります。
2 

bitを緑、赤、青の順に連続的に並べたのみでスタートビットやストップビットといったものは無いのが特徴と言えます。

 そして複数のLEDの制御はこの24bitのデータを連続的に並べることで行います。LEDの接続と信号の順番を図で表すと以下のようになります。
3

 Amazonとかの販売ページにはアドレス指定可能とか書かれていますが、実際にはアドレスを指定して制御するわけではなく、手前のLEDから順番にデータを送る形式となっています。

 このLEDの制御における注意点としてはLEDの点灯状態を変える際にはLOWが一定時間以上(50us ot 280us)続くリセット信号を送らないといけないことです。逆に言い換えるとリセットされない時間であればLOWが続いても大丈夫ということです。実はこの仕様のおかげでAVRマイコンでも制御することができます。

 

制御信号の作り方

 続いてどうやってこの信号を作り出すかを考えていきます。制御信号の形上UARTとかI2CとかSPIをそのまま使うことはもちろんできません。また、信号速度的にArduinodigitalWriteとかは使えないのはもちろん、レジスタを叩いてもdelayとか割り込みでの処理も困難です。アセンブラを使えばクロック単位で処理できるので信号生成できますが、難しいし処理も重い、でもクロック単位レベルの高速な信号生成が必要。調べてみるとSPIの複数bitを使って信号生成してる例があったので、今回はSPIを使ってAVRSTM32で信号生成をしてみることにします。

 

 まずはSPI通信の仕様を軽く説明します。

SPI通信はUARTと違って4つのピンを使って制御します。そのピンの内訳はクロック(SCK) マスターアウトプットスレーブインプット(MOSI) マスターインプットスレーブアウトプット(MISO) スレーブセレクト(SS(ーー))です。通信を行うときはSSーーピンをLOWにして、SCKピンにクロックを掛けてクロックと同期した信号を送信します。タイミングチャートを下に示してみます。

4

 ここで、ややこしいことが起きてしまいます。それはMOSI(マスター送信ピン)がアイドル時に状態が不定になるということです。その他SCKピンのアイドル時のLOW,HIGHの差や先行端、後行端を採るかの差はマイコン間などでSPI通信を行うときは合わさないといけませんが、今回のLED制御には本質的には関わりません。 

 今回WS2812Bを制御するにあたって使うピンはMOSIピンのみです。他のピンは使いません。送信するデータの工夫でWS2812Bの制御信号を作り出します。

 

今回はSPIのデータの4bitWS2812B1bitとして使います。送り出すパケット形状より下図のようにHIGHになるbitの数を調整することで0のパケットと1のパケットを作り出します。

5

この形状の出力を作り出すデータは0パケットの場合0b1000(0x80) 1パケットの場合0b1110(0xE)になります。ですが、そう単純ではありません。SPIのアイドル時の状態が不定であるためです。ここで、今回使用するマイコンのデータシートを見てみます。

 

AVRマイコン(ATmega328P) https://avr.jp/user/DS/PDF/mega328P.pdf

STM32マイコン(STM32F446)https://www.st.com/content/ccc/resource/technical/document/reference_manual/4d/ed/bc/89/b5/70/40/dc/DM00135183.pdf/files/DM00135183.pdf/jcr:content/translations/en.DM00135183.pdf

 

 まずはAVRマイコンで制御信号を作り出す方法を考えるため、データシートのSPIのタイミングチャートが書かれている121ページを見てみます。一応こちらにも引用しておきます。

AVRデータシート

 このデータシートを見るとAVRマイコンではMOSIのアイドル時の状態はHIGHになってるように見えます。確認のために実際にオシロスコープで出力波形を確認してみたいと思います。(ロジックアナライザー持ってないのでオシロを使います。)
AVR波形

 送ってるデータは0xEE(0x11101110)です。そして、信号が始まる前と後はHIGHになってることがわかります。これより、データシート通りアイドル時がHIGHになっていることがわかりました。

しかし、WS2812Bはアイドル時がLOWです。そのため、そのままではWS2812Bは動かせません。そこで、AVRマイコンでWS2812Bを制御する場合信号を反転(つまりNOTをかける)してアイドル時がLOWの信号を作りだします。

また、信号を反転させるので送るbitも反転します。つまり最終的に送る形が0b1000(WS2812B0)の場合0b0111 0b1110(WS2812B1)の場合0b0001となり16進数で表すとそれぞれ「0パケットは0b0111 0x7」「1パケットは 0x0001 0x1となります。最終的に出力した波形はこんな感じです。

AVR波形2

これによりAVRマイコンでWS2812Bを制御する信号が生成できました。また、これら図では少々わかりにくいですが、AVRの性能上8bit単位で信号に間隔が空いてしまい(LOWが長く続いてる)ます。ただし、WS2812Bの仕様上50usまでは許容されているので問題ありません。

 

 続いてSTM32マイコン(STM32F446)で制御信号を作り出すために、データシートのSPIのタイミングチャートが書かれている856ページを見てみます。こちらにも引用します。

STMデータシート

 このタイミングチャートを見るとMOSIのアイドル時の状態がHIGHLOWも両方書かれていてどちらかがわかりません。つまり、データシート上は不定というわけです。ですが、タイミングチャートのMISO(スレーブ側は出力になる)を見ると後行端採取(CPHA=1)の時はLSBが少し伸びるとみられる表記が見られるので、この条件で実験してみました。結果は下図のようにLSBの状態が次のデータの先頭まで続いていました。(他の条件での実験結果は別記事で紹介します)
STM32後端LSB0-1
STM32後端LSB0
STM32後端LSB1-1
STM32後端LSB1

WS2812Bの場合は必要な信号が「0パケットで0b1000 」「1パケットで0b1110」となっておりLSBが必ず0となります。そしてLSBのステートがアイドル時のステートとなるためアイドル時も必ず0となります。そのため、STM32マイコンで制御する場合はAVRと異なり信号の反転は不要です。また反転していないので、送り出すデータも出力波形と同様に「0パケットで0b1000 0x8」「1パケットで0x1110 0xEとなります。また、STM32マイコンではDMAが使えることもあり、8bitの間での信号の伸びが無く連続した信号が生成できています。(DMAを使わない場合でも伸びはほぼ見られませんでした)

 

最後にSPIの通信速度の設定です。

 AVRマイコンにおいてもSTM32マイコンにおいてもSPIの 通信速度(クロック)はマイコンのクロックに依存します。SPIのクロックはマイコンのクロックの1/2n(2 <= n <= 7(AVR),8(STM32)) となります。WS2812Bの場合1パケット(4bit)の長さが大体900nsから1400ns程度となっており、これから逆算するとSPIの通信速度は4.44Mbpsから2.86Mbps程度となります。筆者の環境では16MHzで駆動しているATmega328Pの場合SPIのクロックはマイコンのクロックの1/4(分周1/4)4MHz(4Mbps) で正常に作動しています。また、ペリフェラルクロック42MHzSTM32マイコンの場合はペリフェラルクロックの1/16(分周1/16)2.625MHz(2.625bps)と新版のデータシート範囲から少々ずれがありますが正常に動作しています。(ただし、個体により動かない可能性はあるので注意必要だと思います)

 

最後にWS2812BAVRマイコンとSTM32マイコンで使う場合のまとめです。

 

AVR(ATmega328P)

 アイドル時がHIGHのため信号にロジックICなどでNOTを掛ける必要がある。

 送信データ

0パケットで0x7 0b0111

1パケットで0x1 0b0001

 パケット間(SPI8bit8bitの間)に間隔が空く(LOWが長く続く) 

 

STM32(F446)

 後行端採取CPHA=1(CubeMXClockPhase : 2Edge)に設定

 アイドル時はLSBstate維持のため反転不要

 送信データ

0パケットで0x8 0b1000

1パケットで0xE 0b1110

 パケット間に間隔が空かずきれいな波形が出力される

 

共通

 SPIクロック(通信速度) 2.86Mbps~4.44Mbps程度

  多少の誤差は許容されるが、分周で合わせない場合マイコンのクロック調整も要検討

 SPIMSB First  SPIMaterモード

 SCKのアイドル時の状態はどちらでもOK

MOSIWS2812BDIN(通信ピン)に接続

データ順は緑8bit 8bit8bitの順の24bit 

複数LEDの場合は手前側のLEDのデータ(24bit)から送る

50us~280us以上のLOWが連続するとデータ転送終了

 

例:STM32マイコンで6個のLEDを赤緑青 赤緑青の順にフル点灯させる場合以下のような配列のデータをDMAで流します。

uint8_t data[72] = {0xEE, 0xEE, 0xEE, 0xEE, 0x88, 0x88, 0x88, 0x88, 0xEE, 0xEE, 0xEE, 0xEE,

                    0x88, 0x88, 0x88, 0x88, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,

                    0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x88, 0x88, 0x88, 0x88,

                    0xEE, 0xEE, 0xEE, 0xEE, 0x88, 0x88, 0x88, 0x88, 0xEE, 0xEE, 0xEE, 0xEE,

                    0x88, 0x88, 0x88, 0x88, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,

                    0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x88, 0x88, 0x88, 0x88, 

};

 

 2つのマイコンで比較すると多くのLEDを正確に制御する場合はDMAが使えるSTM32マイコンを使う方が良く、少ないLEDを簡単に制御する程度であればAVRマイコンでもできるといったところだと思います。必要な用途に応じて使い分けると良いでしょう。

ブログURL変更について

HanDenです。本日私の独自ドメインhanden.netを取得しました。
それに伴い、本ブログのURLはhttp://vvvf.blog.jp から http://blog.henden.netに変更しました。
旧URLからのアクセスの場合は自動転送されますがブログの内容に変更はございませんのでご安心ください。

MakerFairKyoto2019に出展してきました

前回のNT京都に引き続きMakerFairKyoto2019にも出展してきました。
場所が場所なだけにMakerFairとは言え人が来ないのかなあと思ってたら、ものすごい数の人が来られてびっくりというのが第一感想です。

人が多くて周りの展示はざっくりとしか見れなかったので今回は写真がほとんど無いという事実…
なので出店レポもざっくりです。


D25H7iBU4AAsqy8
まずは事前に届く出展者タグ。当日はこれを首にかけて展示をします。入場料が必要なイベントならではというかMakerFairならではなシステムですね。出展者としては記念になるのでうれしい。

DSC_0146
会場に到着したら大きいバスにMakerFairKyotoの横断幕。バス自体はどうやらOMMFで使われてる車両っぽいですが、バスにイベント名の横断幕とは思わなかったです。


DSC_0148
MakerFairなのもあるのか出展者紹介も主催者側から用意されていました。

DSC_0149
そしていつも通り展示準備完了。

しばらくは客の入りも少なくて、やっぱダメかあと思ってたら入口で大渋滞してるとの情報が…
しばらくするとものすごい数の人が来ました。大阪のメイカーズバザールを優に超えるような勢いだったので説明もかなり疲れた…

1日目が終わった後は懇親会に参加しました。いろいろと強い方のお話を聞けて面白かった。
そして2日目も会場に来て展示。2日目は1日目よりは少し人が少ないかなあって印象でした。
なので周辺の展示を少しですが見れました。
周辺の方々の完成度やっぱり高いし、NTとは雰囲気も全然違いましたね。Twiteerネタに乗る傾向があるNTに対してIoTとかのブームに乗った作品が多い印象です。

そして、撤収ですが、周囲のNT勢の片付けの速さは安定。自分はいろいろ分解するので一般メイカー並みに遅いという…
DSC_0152
帰る途中にこんなものを見かけたり…

展示した感想としては多くの人に見てもらえてすごくうれしいけど忙しくて他の展示を見れないってところです。次は楽器系で合同展示したいなあ…
展示レポはざっとこんな感じにしておきます。BLDCの解説記事早く進めないと…


NT京都2019に出展してきました

前回のNT名古屋に出展してから約半年、その間に大垣miniMakerFairとかNT加賀とかつくろか!とかありましたが学会の準備の関係で出展できず…時間を確保できるようになって半年ぶりの出展です。
NT京都は自分が初めて出展した展示会で特徴が強いNTイベントの中でも特に特徴的な展示会です。
今回はその一部始終の記録です。

NT京都は西院の春日幼稚園での開催なので阪急電車で行くのですが、少し後に快速特急なるものを見つけたので乗ってみることに。それが偶然新しい車両のデビューだったようです。
IMG_20190323_100804
京とれいん雅洛の初列車らしく人が凄かった…

で会場に到着してセットアップ
IMG_20190323_143413
他の展示会ならここから展示スタートって行くわけですがNT京都の場合は前日は準備日
準備日と言っても基本的には出展者同士の交流というかオフ会です。
他の展示物を見たり出展者同士で駄弁ったり、何かネタで遊んだり。

夕飯は安定のdominoピザパ
IMG_20190323_182559
IMG_20190323_181054
カップが何かおかしいとか突っ込まないw

IMG_20190323_214126
目玉展示のましろちゃんと戯れたり

IMG_20190323_214217
自分と同じMIDI楽器を集めてアンサンブルしてみたり

IMG_20190323_224310
なんかあったり

いろいろとオフ会をして2日がメインの展示
IMG_20190324_091522

展示終了後は片づけをしてもう一泊して帰宅しました。

製作日記4 BLDCモータを演奏してみた前編


ファンに続いて次はBLDCモータを演奏してみました。

BLDCモータは名前の通り整流子(ブラシ)のないモータでモータ自体は3相の同期電動機の一種です。ですので、制御を工夫すれば割といろいろなことができるのです。今回は作品を作るにあたって試した制御方法(主にパルスモード)のお話をしたいと思います。

 

まず初めにBLDCモータの駆動原理を紹介します。BLDCは普通のブラシモータやファンみたいにモータの端子に電圧をかけるだけでは全く駆動しないばかりか、過大な電流が流れて場合により電源回路やモータなどが破損します。BLDCではブラシの代わりに制御回路でモータを回転させるパルスを作り出す必要があるのです。

 

まずはモータの駆動方法を紹介します。

BLDCモータは下図のような構造です。

1

モータの回転軸には永久磁石、固定部に電磁石(コイル)が配置されています。回転部に電流が流れないのでブラシが不要になるというわけです。そして、固定部(この図では外周部)の電磁石にUVWの順に回転するように電流を流すと、回転軸(この図では内部)の磁石が電磁石に引き寄せられる(反発する)ようにして回転を始めます

具体的にはモータの各端子に以下のように電圧を印可させるとBLDCモータは回転を始めます。
2

印可されてる電圧は矩形波の三相交流です。BLDCモータは三相の同期電動機と同じ構造のためこのような波形で駆動するというわけです。ここでは、図の時間方向の1マス分を1単位として扱います。

BLDCモータは回転子の角度に応じて固定子の電磁石を制御しなければなりません。その制御の方法には大きく2つあり、1つは固定子の角度を読み取れるホールセンサが内蔵されたもの、もう1つはセンサが無くHIGH-Z状態端子に現れる電圧を監視し現在角度を読み取るものがあります。前者のモータの場合はセンサを制御マイコンに接続するだけ(プルアップ処理は要りますが)ですが、後者の場合周辺回路をいくつか組み込む必要があります。

なんですが今回はBLDCでアクチュエータを動かすわけではなく音を奏でるのが目的です。演奏するには音階の周波数に合わせて電圧波形を生成するので回転角度を読み取ってもほとんど意味がありません。回転角度を読み取る制御にはコストがかかるのに加えて回転速度が音階に合わなくなる可能性もありメリットはほとんどありません。(脱調しないのはメリットですが…)そのため、今回は回転角度の読み取りは行いません

 

次に演奏時のパルスモードです。BLDCを演奏する方法はファンや自作VVVFのようなモータの励磁音を利用する方式と、ステッピングモータのようなモータの回転音を利用する方式の2種類が考えられます。

まずは励磁音を利用するやり方です。励磁音を利用する場合でも回転速度を音階に関係ない速度にすると回転音がノイズとなってしまいます。そのため、回転速度と演奏PWMの速度を同期させたパルスを送る必要があります。パルス数は異なりますが自作VVVFの同期PWMと似たやり方です。実際の波形はこんな感じです。

3

この図の場合は1単位当たり2パルスでの駆動です。なお、出力される音は1秒間当たりのパルス数の音1単位当たり2パルスの場合は回転数の12倍の周波数の音となります。

しかし、この方式の場合多くの音楽で使われる周波数帯域ではPWMの周波数が低いためモータが電流連続モードにならず過電流が流れてしまい、実運用ではとても使えるものではありませんでした…そのため、回転音を利用する方式へと方向転換しました

 

というわけで次は回転音を利用して演奏する方式です。

このモードではPWM周波数は高く設定し回転パルスとPWMを同期させません。自作VVVFでいうところの非同期モードに似たパルスモードです。この方式の場合はPWM周波数をモータが電流連続モードとなる10kHz以上にできるので過電流が流れにくくなります。

このモードではパルスの印可方法が2種類あります。本質的に大きく変わるものではありませんが…

1つめが非相補PWMモードです。

4

ローサイド側にはPWMを印可しません。また、ハイサイド側はPWMOFFの時の出力はHIGH-Zになっています。

2つ目が相補PWMモードです。

5

こちらもローサイド側はPWMを印可しませんが、ハイサイド側のPWMOFFの時はLレベルに落とします。

この2つの使い分けはMOSFETのゲート駆動電源の都合になると思います。ブートスタラップ方式で非相補PWMにすると1/3回転分(2単位分)の時間のゲート駆動に必要な電力ブートストラップコンデンサに貯めておく必要があるため、非常に大容量なブートストラップコンデンサが必要となり現実的ではありません。それに対して相補PWMモードにした場合はPWM1パルスごとに充電できるため1パルス分に必要な電力をブートストラップコンデンサに貯めこめばよいため一般的なモータドライバと同じ小容量のコンデンサで済みます。そのため、今回は相補PWMを使い回転速度で音楽を演奏するシステムにしました。

 なお、このパルスモードでは再生される周波数の音は実験を行ったところ回転速度の6(回転パルス数, 1秒間当たりの単位数)の倍の音が再生されました。

 パルスモードのお話は以上です。続きは後編です。

NT名古屋に出展してきました

7月のメイカーズバザールから3か月、10月はNT名古屋に出展してきました!

出展は3回目でNTイベントとしては2回目の今回はネタ作品を1つと前回からのCPUクーラの楽器を展示してきました。
近鉄の名古屋から降りて目の前には巨大なエンドミルが!
IMG_20181007_164831

といっても、ここは会場ではないので、会場の中京テレビ本社へGo!
IMG_20181006_102112
IMG_20181006_102309s
会場に入り

IMG_20181006_113755
設営しました。

メイカーズバザールからも改良して箱を2つにしたので音量も大丈夫かなと思っていたのですが、マシになったとはいえ音量はまだ不足でした…これからも改良をと考えています。

今回のネタ作品はCPUクーラを演奏する楽器に合わせて、モタドラにCPUクーラを載せてファンをMIDIで演奏するという作品です。
IMG_20181026_230451
上に載ってるCPUクーラでモタドラっぽくないですがモタドラです。ただ、CPUクーラ乗ってるインパクトがあったものの、前回まで使ってた基板も横に置いていたのでそっちの方がインパクトが強かったという結果に…

半年ぶりのNTイベントってことでいろいろと交流できてすごく良い経験になりました。そして、技術力がまだまだ必要だなと…

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