モータの鳴らし方byHanDen

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

KiCad5の使い方 4章 シンボルエディターの使い方

今回はピン設定が「不特定」になっていて、ERCを通した際にエラーとなる現象を改善する方法と新しいシンボルの作り方を紹介します。

 5
まずは、上図の↑2のシンボルエディタを起動します。

 1

4-1 起動画面

表示されているアイコンで今回使いそうなものを軽く紹介します。

1:新しいシンボルの作成 ライブラリに存在しない部品を新たに作る時に選択します。←4の一覧から操作した方が使いやすいと思うのでこの項目はあまり使わないと思います。

2:すべての変更を保存 変更を保存するときに使います。

3:重複ピンとグリッドから外れたピンのテスト 名前の通り同じ番号のピンが重複していないか、またグリッドから外れたピンがないかをチェックする機能です。

4:ライブラリ・シンボルの選択 複数あるライブラリから自分が編集したいライブラリを選ぶ機能です。

5:シンボルにピンを追加 作成中のシンボルに新たなピンを追加する機能です。

6:シンボルのボディーにテキストピンを追加 作成中のシンボルにテキストを追加する機能です。

7:コンポーネントのボディーに○○を追加 コンポーネントの枠(形)などの図形を描く機能です。

 

4.1シンボルのピンの設定変更

まずはピン情報を編集するライブラリを選ぶために、図4-1の←4で示した範囲内から編集するライブラリ(PCB Parts Library」の場合は「SamacSys_Parts)クリックして、シンボルの選択画面に入ります。

2


 編集したいシンボルをダブルクリックするとメイン画面にシンボルが表示されます。

3-1

この中からピン情報を編集したいピンにマウスカーソルを合わせて「E」キーを押すか、右クリック、「編集」と進み、ピンのプロパティーを開きます。

3
4
4-2 ピンのプロパティー

4-2の←で示した「エレクトリックタイプ」をそれぞれの端子に応じた、設定に変更します。マイコンの場合IO端子は基本的に「双方向」、電源端子は「電源入力」にします。特にピンの機能を特定できない場合は「パッシブ」にしたら良いしょう。そして「OK」をクリックして設定を完了させます。この設定をすべての端子で行います。(一部初期で設定されている端子もあります)

 

設定ができたら図4-1の↑2の「すべての変更を保存」をクリックしてライブラリに変更した情報を保存します。

もし、ピン設定を変更したコンポーネントを別の名前で保存したい場合は、図4-1の←4内の編集中のシンボルを右クリックして「名前を付けてコピーを保存」(下図←)をクリックして別名保存の画面に進みます。

5
6
「名前」(上図←)に保存したいシンボルの名前を入力して「OK」をクリックします。別のライブラリに変更する場合は保存画面の下半分のライブラリの一覧から選択します。

そして、「Ctrl+s」または図4-1の↑2の「すべての変更を保存」でライブラリを上書き保存します。

これで、ピン情報の変更作業は終わりです。

 

4.2 新規シンボルの作り方

まずは、図4-1の←4で示した範囲内新たなシンボルを追加したいライブラリを選び右クリックします。

1
4-1 起動画面

 7

 新規シンボル(上図の色付き項目)をクリックし、新規シンボルの作成画面(シンボルプロパティー)を開きます。新規ライブラリにする場合は保存先を聞かれるので保存したい場所に設定してから同様の作業を行います。

 8

コンポーネント名(上図←1)と回路図やプリント基板に印刷されるリファレンス名(2)を設定して「OK」をクリックします。

すると、グリッドのみの画面が表示されるので図4-1の→7の「シンボルのボディーに〇〇を追加」のメニューを使いコンポーネントの外形を描きます。また、描いた外形線上にカーソルを置き「E」キーを押すか、右クリック「〇〇のオプションを編集」(下図色付き項目)をクリックして〇〇図形のプロパティーに入ると塗りつぶしの設定ができます。初期設定では「全面色で塗りつぶし」を選択すると外形線の色、「背景色で塗りつぶし」を選択すると黄色で塗りつぶすことができます。必要に応じて使ってください。(設定メニューの「色の設定」で色を変えることもできます)

910

外形が描けたら、図4-1の→5「コンポーネントにピンを追加」をクリックして、ピンを追加するメニューを開きます。
11

ピン名にはピンの名前、ピン番号にはピン音番号(数字)、角度はコンポーネントの左に出るピンは「右」、右に出るピンは「左」、上に出るピンは「下に」下に出るピンは「上に」を選びます。エレクトリックタイプは先ほどの設定変更時と同じ要領で設定します。そして「OK」をクリックすると、カーソルの先端にピンがくっついた状態になるので、ピンを設置したい場所でクリックして、ピンを固定します。〇がついている方がピンの先になるということには注意してください。この作業をすべてのピンが設置できるまで繰り返します。

すべてのピンが設置できたら、図4-1の↑3「重複ピンとグリッドから外れたピンのテスト」を実行し、エラーが出ないことを確認します。

最後に図4-1の↑2の「すべての変更を保存」をクリックしてライブラリにコンポーネントを保存します。

KiCad5の使い方 3章 PCB Parts Libraryのセットアップ 

今回はKiCadをさらに強化できるツールである「PCB Parts Library」の設定方法を紹介したいと思います。このツールはフットプリントもありますが、回路図エディタに対して特に有効なのでこのタイミングで紹介したいと思います。

 

まずはGoogleなどで「PCB Parts Library」を検索または以下のURLに飛びます

https://www.rs-online.com/designspark/pcb-part-library-jp

1
2-11  PCB Parts Library サイト

図の→の「LIBRARY LOADERをセットアップ」をクリックしてライブラリを入手するソフトをダウンロードします。

 

ダウンロードしたファイルを解凍し、「Library Loader」ディレクトリ中のインストーラーを実行します。

 2

4
今回も英語のインストーラーですが気にせず、「Next」で進みます。

5
インストール先を聞かれますが、特に変更する必要もないのでそのまま「Next」をクリックしてインストールを始めます。
6

インストールが終わったら「Close」で画面を閉じデスクトップの「Library loader」を起動します。

 7

起動したら、アカウントの登録画面が表示されるので、それぞれ入力します。

8
2-12 登録画面

入力項目は以下の通りです。

Title:自分の敬称を選びます。MrMsDrの中から選べます。

First Name:自分の名前を入れます

Last Name:自分の名字を入れます。

Company:会社名を入れますが、個人の場合は適当に入れればいいです

Job Role:自分の職業を選びます。学生の場合はStudentsです。

County:自分の国を選びます。日本の場合はJapan |JPを選びます。

Email(User Name):自分のメールアドレスを入力します。これが次回以降PCB Parts Libraryにログインする時のユーザー名になります。

Password: PCB Parts Libraryにログインするパスワードを設定します。

Confirm Password:上のパスワードの確認入力なので上と同じものを入れます。

Public Alias: PCB Parts Libraryでの表示名です。公開されるかもしれないので個人情報は入れないほうがいいかもしれないです。

Your ECAD Tool: PCB Parts Libraryで使用するCADを選びます。今回はKiCadを利用するので KiCad EDAを選択します。

I agree to the Terms: 利用規約に同意するかの確認です。リンク先を確認して同意できるならチェックを入れます。

すべての項目が入力出来たら「Register」をクリックして登録を完了させます。しばらくしたら登録したメールアドレスにアカウントをアクティベートするメールが届くので、メールに書かれているリンクをクリックしてアクティベートしてください。

 

登録が完了したら下のような画面になります。

2-2
2-13  PCB Parts Library通常画面

この段階ではまだ設定が終わっていないので次の設定へと進みます。図の→の「Settings」をクリックしてライブラリの保存先の設定ウインドウを表示させます。

11

表示された「KiCad Settings」ウインドウの「Browse」(図の→)をクリックしてライブラリの保存先を設定します。基本的には自分のドキュメントフォルダーに保存用のフォルダーを作って指定するのがよいでしょう。

ここまで設定出来たら、Library loader上での設定は終わりです。

次はKiCadを起動します。

5

上図↑2のシンボルエディタを起動します。

3

「設定」メニューの「シンボルライブラリーを管理」(図の色付き項目)からライブラリの設定画面を表示させます。

4
2-14 シンボルライブラリー

初めに上図の↓1の「グローバルライブラリ」をクリックどのプロジェクトでも適応される設定項目に変更します。続いて↑2「テーブルに既存ライブラリを追加」を選びます。Library loaderで設定したライブラリの保存先を開き、「SamacSys_Parts.lib」を開きます。そして、下部の「OK」をクリックして設定を完了させます。

14

これで、回路図のライブラリの設定はできたので、コンポーネントライブラリを閉じます。

 

次にフットプリントのライブラリの設定を行います。

5

上図↑4のフォットプリントエディターを起動します。

5
「設定」メニューの「フットプリントライブラリを管理」(上図の色付き項目)からフットプリントライブラリの管理画面を開きます。

6
2-15 フットプリントライブラリ

どのプロジェクトでも適応される設定項目「グローバルライブラリ」(上図↓1)が選ばれていることを確認して↑2「テーブルに既存ライブラリを追加」を選びます。先ほど設定したライブラリフォルダを開き「SamacSys_Parts.mod」を開きます。

7
 

最後にフォットプリントライブラリの管理画面の「OK」をクリックして、KiCad側の設定は終わりです。

 

次にパーツのダウンロードの仕方を紹介します。

Library loaderを起動させ、下図の↑で示した「Search for Parts」をクリックします。

20

Webブラウザが開き、ログイン画面が表示されるので、Library loaderの初期設定で設定したメールアドレス(ユーザ名)とパスワードでログインします。

21

ログインが完了するとこのような画面が表示されるので、探したい部品の型番を→のフォームに入力して、🔍マークを押すと、部品の検索が始まります。

22

検索が完了すると図のように一覧が表示されるので、自分が使用する部品をこの中から選び(主にパッケージの種類の選択になるとは思いますが)、←で示したオペアンプのアイコンをクリックして次に進みます。もし、使いたい部品が「Build or Request」となっている場合は、部品の作成のリクエストを送る画面になります。

23

まずは作成されている部品のダウンロード方法を紹介します。←の「FREE DOWNLOAN」をクリックしてダウンロードを実行します。ダウンロードが終わると自動的にLibrary loaderKiCadのライブラリに追加してくれます。追加が完了したら完了したとのメッセージが表示され、ダウンロードは完了です。

KiCadのコンポーネント一覧にダウンロードされた部品が追加されていることを確認してください。ただし、KiCadを起動した状態でダウンロードした場合はKiCadを再起動しないと反映されません。

 また、ここからダウンロードした部品の場合はフットプリントの設定があらかじめされているので、取り付け方を変更するなどがない場合は、フットプリントの設定は不要です。

 

次に部品の作成のリクエストの送り方です。
25

リクエストを送る部品を開き、赤色の←で示された「Package Category Pick One」をクリックして部品のパーケージの種類を選びます。

26
一覧から最も近いと思われるものを選び、そのパッケージをクリックします。近いパッケージが見つからない場合は
Otherを選びます。
27

最後に←の「SUBMIT REQEST」をクリックして部品作成のリクエストを送信します。

 

PCB Parts Libraryは非常に便利なツールですが、まれにフットプリントなどのデータに間違いがあることがあります。そのため設計時には必ず使用する部品と穴間などが正しいかどうかを確認してください。

 

またPCB Parts Libraryからダウンロードした回路図の部品データでピンの設定が正しくされておらず、「不特定」となっている場合があります。その変更法は次回で紹介したいと思います。(前回の時に次回と言ったけど気にしない…)


 

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/」「https://www.kicad.org/」(2021/10/23追記 KiCadのドメインが変更になっています。)アクセスし、ページ中央の「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

展示終了後は片づけをしてもう一泊して帰宅しました。
ギャラリー
  • 制作日記5 細かな基板を注文してみた
  • 制作日記5 細かな基板を注文してみた
  • 制作日記5 細かな基板を注文してみた
  • 制作日記5 細かな基板を注文してみた
  • 制作日記5 細かな基板を注文してみた
  • 制作日記5 細かな基板を注文してみた
  • 制作日記5 細かな基板を注文してみた
  • 制作日記5 細かな基板を注文してみた
  • 制作日記5 細かな基板を注文してみた
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計: