工作と競馬

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

タグ:PIC18F14K50

概要

 CQ出版社の『パソコン計測USBマイコン基板』を動かしてみる記事。第2回は、参考書第10章の内容に従いノイズ性能確認を行った。


背景と目的

 前回、『パソコン計測USBマイコン基板』(以下、参考書とよぶ)に従い付属基板をPCに接続して動かすためのドライバと付属ソフトウェアのインストールをし、動作を確認できた。今回は、高分解能を謳うA/Dコンバータがどの程度微小信号を測定できるか、すなわち十分低ノイズなのかについて調べてみる。


詳細
1.流れの確認

 今回やる内容の流れは、参考書の第10章に相当する内容で、
①ノイズ指標の確認
②ノイズの測定方法
③測定と結果確認
である。それぞれの手順は、参考書に書いてあるのでそれに従う。

2.結果
2.1 ノイズ指標の確認

 参考書には、ノイズ性能の指標として、
・RMSノイズビット数(有効ビット数、Effective Number of Bits)
・ピークツーピークノイズビット数
が挙げられており、これらはA/Dコンバータのノイズ性能指標の代表的なものとのことである。というわけで、この指標に従い、実測値がどうなるのか調べることにする。
 RMSノイズビットは、

 RMSノイズ電圧=ノイズをランダムノイズと仮定した場合の振幅ヒストグラムの標準偏差σ

として電圧を求め、それをフルスケール電圧に対する比でビット数に変換すれば求まる。
 また、ピークツーピークはRMSノイズの6倍である。これは、ピークツーピークは本来振幅ヒストグラムの幅のはずであるが、ヒストグラムがガウス分布だとすると理論上幅は無限であり、埒があかないので便宜上±3σ、すなわち全振幅値の99.7%が出現する範囲として計算するということであろう。

2.2 ノイズ測定方法

 参考書には、ノイズを測定する際には、外部からのノイズによって回路本来の実力が阻害される可能性があるのでシールドを施すこととの注意書きがある。方法としては、アルミケースなどに入れるとのことだが、手元にないので変わりにアルミホイルを使って簡易的にシールドをした。もちろん、アルミホイルは回路のAGNDに落とす。
図2.1はアルミホイルと基板との絶縁用ビニル袋を準備した様子である。図2.2がアルミホイルで包んだ様子である。電子回路実験というよりホイル焼きのように見える。

IMG_0787
図2.1 シールドするための準備

IMG_0786
図2.2 ホイルでシールドした様子

2.3 ノイズ測定結果

 ノイズは、付属のソフトウェアで測定した。条件は、基本的に参考書のとおりだが、
・更新レート16.7Hz
・測定回数500回
・ゲイン1,16,128
とした。
 結果は、表2にまとめた。これよりほぼ仕様どおりの値が得られたことになる。24ビットA/Dコンバータだが、当然24ビットまるまる使えるわけではなく、最高20ビット程度までが実力ということである。それでも非常に高分解能で測定できるのは間違いないので、早くなにかをつないで測定してみたい。

表2 ノイズ測定結果
ゲイン unit
1 16 128
RMSノイズ 実測値 2.145 0.265 0.088 uV
仕様値 1.96 0.25 0.088 uV
RMSノイズビット数 実測値 20.06 19.08 17.67 bit
仕様値 20 19 17.5 bit



まとめと今後の課題

 CQ出版社の『パソコン計測USBマイコン基板』のノイズ性能を実測確認し、ほぼ仕様どおりの値を得ることができた。今後は、何かをつないで測定してみたい。

概要

 CQ出版社の『パソコン計測USBマイコン基板』を動かしてみる記事。初回として、USBドライバと付属ソフトウェアのインストールおよび動作確認を行った。


背景と目的

 私の手元にはCQ出版社の『パソコン計測USBマイコン基板』という本(以下、参考書とよぶ)がある。この本には、USBマイコンPIC18F14K50と24ビットA/Dコンバータの載った基板と、専用ソフトウェアが付属しておりPCで手軽に計測ができることを謳った本である。しかし、なぜかずいぶん前に買ってから全く読んでいなかった。そこで、いい加減この本に手をつけパソコンによる計測をしてみたいと思う。今回は、手始めにドライバと付属ソフトウェアのインストールをしてみる。


詳細
1.流れの確認

 今回やる内容の流れは、参考書(図1参照)の第2章に相当する内容で、
①ドライバのインストール
②付属ソフトウェアのインストール
③動作確認
である。それぞれの手順は、参考書に書いてあるのでそれに従う。
 なお、第1章には付属基板に未実装の部品の実装について書かれているが、今回は動作確認だけなので飛ばしている。あとで必要に応じて実施する。

IMG_0785
図1 参考書

2.実作業
2.1 ドライバのインストール

 手順は、参考書に書いてあるとおり、付属CDからusbadc.infというファイルをローカルにコピーし、付属基板をUSBでPCに接続すると、ドライバのインストールが始まった。図2.1のとおり、正しくドライバをインストールすることが出来た。
 また、付属基板はUSBといいつつ仮想シリアルで接続されるのでデバイスマネージャでシリアルポートの番号を確認した。私の環境ではCOM14となった。

20130218232606
図2.1 ドライバのインストール完了

2.2 付属ソフトウェアのインストール

 次に、付属ソフトウェアUSB - ADC General Consoleのインストールを行った。インストールといっても、CDにあるフォルダごとローカルにコピーして完了である。また、参考書には、.NET Framework 3.5のインストール方法が書いてあるが私の環境では不要なので飛ばした。

2.3 動作確認

 動作確認として、付属ソフトを立ち上げ、左上の接続ボタンを押してみたところ、図2.31のとおりソフト上の各GUIに数値等が表示され、正しく動作していることが確認できた。
この付属ソフトには3つの設定タブがあり、それぞれ
標準設定・・・チャンネル、変換レート、プログラマブルゲインアンプのゲインの設定
詳細設定・・・A/Dコンバータが持つ各機能の設定
多チャンネルロガー・・・最大3チャンネルまで可能なデータロガー
を示している。これらのタブでいろいろ条件を変えて計測を行うことが出来るようだ。

20130218234640
図2.31 付属ソフトを立ち上げた直後


まとめと今後の課題

 CQ出版社の『パソコン計測USBマイコン基板』を動かしてみた結果、無事ドライバインストールと付属ソフトの動作確認が出来た。次回は、参考書の内容にしたがって何かためしに測定してみたい。

要旨

 iTunesをPC外部から操作する方法に関する記事。USB対応PICマイコンPIC18F14K50と赤外線リモコン、自作Windowsアプリケーションを組み合わせた方法を実験し操作することができた。


背景と目的

 iTunesはPC上で操作することが多いが、PCと音楽を聴く場所が離れている場合などにはPCの外部から操作したいことがある。それにはiPhoneアプリのremoteが便利だ。同一のLANでつながれたPCであれば操作できる。しかし、それは当然ながらiPhone/iPodユーザーしか使用できない。そこで、iPhone/iPodユーザー以外でもPC外部からiTunesを操作できないかと考えてみたところ、PICマイコンを用いて操作するシステムが構築できそうなことに気づいた。そこで、実際にシステムを検討し操作してみたい。


詳細
1.システム構成

 図1は今回考案したシステム構成である。これは赤外線リモコンと毎度おなじみUSB対応マイコンPIC18F14K50、およびiTunes操作用自作PCアプリケーションを用いている。原理としては、まずユーザーが赤外線リモコンを操作すると赤外線信号を受信した受光モジュールの出力信号がPICのRC4ポートに入力され、PICがUSBにてPCへ受信信号の内容を伝える。そしてそれを受けたPC上のアプリケーションは受信内容に応じてiTunesに操作コマンドを送信するという仕組みである。

VBE3
図1.1 iTunesをPC外部から操作するためのシステム構成案

2.システムの作製
2.1 赤外線リモコンと受光モジュール

 赤外線リモコンは、オーディオプレーヤーの操作ということを考え手持ちのAVアンプであるSC-LX73(Pioneer)のリモコンを使用することにした。また、赤外線受光モジュールは、PL-IRM0101-3を用いる。これは秋月電子などで100円程度で手に入る。なお、SC-LX73のリモコンコードはどうやらNECフォーマット相当のようなので、PICの解析プログラムはNECフォーマットにあわせて書けばよいことがわかった。

2.2 赤外線受光モジュールの出力をPICで0/1パターンに変換

 PICで赤外線リモコンの受信信号を解析する場合には、通常受信コードを8ビットごとに変数に格納することが多いが今回は最終的な制御対象がPCであることからPICでいちいち処理せずPC側に任せてしまえばよい。そこで、受信した信号の1/0だけを判断してそのつどシリアルに文字列として1/0を送信するようなプログラムにした。プログラムは詳しくは載せないが、簡単に構成を述べると、タイマ割り込みによってNECフォーマットの最小時間単位0.56msのおよそ1/5の周期でタイマ割り込みを行い、1⇒0または0⇒1に変化するタイミングをよみとり1/0パターンを解析した。

2.3 PICからPCへの受信内容の送信/PCでの受信方法

 PICとPC間の通信は、毎度おなじみUSBによる仮想シリアル通信を用い、2.2で解析した1/0のパターンを送信する。なおPICからのシリアル送信については本ブログでは何度も取り上げているので、ここでは割愛する。一方、PC側のシリアルの受信であるが今回は自作アプリにて処理を記述する必要がある。今回はVB2008にてシリアルを受信するプログラムを記述し、正しくシリアルが受信できることを確認した。このPC側シリアル受信処理についても、Webの各所で取り上げられているので本ブログでは割愛する。

2.4 iTunes操作用自作アプリ

 今回のキモであるiTunesを別アプリから操作する部分は、iTunes Type Libraryというオブジェクトライブラリを使用することにした。具体的には、今回のアプリ開発環境であるVisual Basic 2008で図2.11のようにプロジェクト>参照の追加からiTunes Type Libraryにチェックを入れる。これにより、図2.12のように変数の型としてiTunesAppが参照できるようになりiTunesの画面上の操作は一通りプログラム上で扱えることになった。そこで、再生、一時停止、停止、トラック送り、トラック戻しのコマンドをそれぞれ以下のように書いてみた。そして、実際にiTunesがコマンドに反応して動作していることも確認できた。以上で、外部アプリケーションからiTunesを操作できるようになった。

    'iTunesをVB2008で操作するコマンドの例
    Private Sub iTunesCommandSample()

        Dim MyiTunes1 As New iTunesLib.iTunesApp

        MyiTunes1.Play() '再生
        MyiTunes1.Pause() '一時停止
        MyiTunes1.Stop() '停止
        MyiTunes1.NextTrack() 'トラック送り
        MyiTunes1.BackTrack() 'トラック戻し

    End Sub

VBE
図2.11 iTunes Type Libraryの参照

VBE2
図2.12 iTunesApp型オブジェクト変数を宣言

2.5 プログラム全体

 詳細説明は省くが、今回PC側アプリとして作成したコードを以下に示す。

Public Class Form1

    'iTunesAppオブジェクト
    Dim MyiTunes As New iTunesLib.iTunesApp

    'フォームのロード
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'シリアルポートのオープン
        SerialPort1.PortName = "COM9"
        'シリアルポートの通信速度指定
        SerialPort1.BaudRate = 19200
        'シリアルポートのパリティ指定
        SerialPort1.Parity = System.IO.Ports.Parity.None
        'シリアルポートのビット数指定
        SerialPort1.DataBits = 8
        'シリアルポートのストップビット指定
        SerialPort1.StopBits = System.IO.Ports.StopBits.One
        'シリアルポートのオープン
        SerialPort1.Open()

    End Sub

    'シリアルポートがデータを受信したら
    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

        Dim ir_code1 As String
        Dim ir_code2 As String
        Dim maker1 As Integer
        Dim maker2 As Integer
        Dim data1 As Integer
        Dim data2 As Integer

        '2回分の受信結果を得る(NECフォーマットでは同じコードを2回送るので)
        ir_code1 = SerialPort1.ReadLine()
        ir_code2 = SerialPort1.ReadLine()

        If ir_code1 = ir_code2 Then '2回の受信結果が同一か(NECフォーマットでは同じコードを2回送るので)
            If Mid(ir_code1, 1, 3) = "SLD" Then '先頭に"SLD"という文字列があるか(PIC送信側で先頭に"SLD"という文字列をつけているため)

                '0/1のパターンを分解
                maker1 = BinStr2Dec(Mid(ir_code1, 4, 8))
                maker2 = BinStr2Dec(Mid(ir_code1, 12, 8))
                data1 = BinStr2Dec(Mid(ir_code1, 20, 8))
                data2 = BinStr2Dec(Mid(ir_code1, 28, 8))

                'data1の内容で操作を決める
                Select Case data1
                    Case 232
                        MyiTunes.Play() '再生
                    Case 104
                        MyiTunes.Stop() '停止
                    Case 8
                        MyiTunes.NextTrack() 'トラック送り
                    Case 136
                        MyiTunes.BackTrack() 'トラック戻し
                End Select

            End If
        End If

    End Sub

    'フォームを閉じとき
    Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed

        ' シリアルポートのクローズ
        SerialPort1.Close()

    End Sub

    'バイナリの文字列を10進数に直す
    Private Function BinStr2Dec(ByVal a_str As String) As Integer

        Dim len_str As Integer
        Dim buf As Integer = 0

        len_str = Len(a_str)

        For i As Integer = 1 To len_str
            If Mid(a_str, i, 1) = "1" Then
                buf = buf + 2 ^ (len_str - i)
            End If
        Next i

        BinStr2Dec = buf

    End Function

End Class

3.結果

 2.5のプログラムを起動し、赤外線受光モジュールに向けてリモコンの再生ボタンを押したところ、iTunesの再生が開始した。他のボタンについても同様に押してみたところ、正しくiTunesを操作することができた。これにより、赤外線リモコンを用いてPC外部よりiTunesが操作できることがわかった。


まとめと今後の課題

 USB対応PICマイコンPIC18F14K50と赤外線リモコン、自作Windowsアプリケーションを組み合わせ、iTunesをPC外部から操作するシステムを構築し、正しく操作することができた。

要旨

 PIC18F14K50にてタイマ割り込みのプログラムを組み定期的にLEDを点滅させる実験を行った。


背景と目的

 PICマイコンには割り込み機能としてさまざまなものがあるが、その中で非常にポピュラーなものにタイマ割り込みがある。これはタイマで時間をカウントし一定時間経過すると現在実行中の処理をいったん止め、特定の処理をさせることができる。したがって、一定周期で何らかの処理を呼び出し実行することができるので、たとえば、一定時間ごとに測定をしたいとか何かを表示したいといった場合に有効である。そこで、今回はタイマ割り込みが使えるようにプログラムを組み動作を確認してみる。


活動の詳細
1.構想

 今回使用する実験対象は、またもやおなじみの『PICで動かすUSB』評価基板である。そして、割り込み処理で実行させる内容は特に凝ったことはせず簡単なLEDの点滅とした。ただし、評価基板に実装されているLEDはUSBの状態表示で使用しているので、それとは別に新たにRC2ポートに青LEDを接続した。(写真1を参照)プログラム中ではRC2ポートをHIGH/LOWさせればよい。

写真
写真1 青LEDを追加した評価基板(ちなみに青白のツイスト線は以前のA/D変換実験で使用したアナログ入力、灰色の線は以前のPWMモジュールの実験で使用したPWM出力)

2.プログラムの製作

 今回、割り込み要因とするタイマはTimer1モジュールとした。理由は特にない。動作条件は以下の2つを指定する。

  • 16ビットモード
  • Timer1をシステムクロックとして使用しない
  • クロックソースは命令サイクルクロック(Fosc/4=12MHz)

 上記の条件にて、LEDを1秒周期で点滅させることにする。つまり、0.5秒ごとにRC2ポート出力反転させる。そこで、必要なレジスタ設定であるがT1CONレジスタの各種設定を行うため以下の記述を追加する。なお、プリスケーラは4:1を選択してあるが理由については後述する。

T1CON = 0xA1;

 それとRC2ポートをディジタルピンに設定する必要があるので以下の記述が必要である。

ANSELbits.ANS6 = 0; //ディジタルピンにする
TRISCbits.TRISC2 = 0; //出力

 そして、最も重要なTimer1を割り込みとして使用するための記述は以下のとおり。それぞれ割り込みの許可と割り込み優先度の設定である。Timer1割り込みを使用するには、グローバル、ペリフェラル、Timer1割り込みの3つの許可が必要である。優先度は今回の実験ではどちらでもいいのだがとりあえず高とした。

INTCON = 0xC0; //グローバル割り込み、ペリフェラル割り込みを許可
PIE1bits.TMR1IE = 1; //Timer1割り込みを許可
IPR1bits.TMR1IP = 1; //Timer1割り込みの優先度を高に設定

 次は、割り込み処理の関数である。この実験ではMCHPFSUSBのサンプルプロジェクトを改造しているので割り込み処理はYourHighPriorityISRCodeという関数の中に書けばよい。その内容は、以下のとおり。流れとしては、最初に割り込み要因を調べそれがTimer1割り込みであれば処理を行う。処理内容はフラグクリアを最初に忘れないようにする。これを忘れると次の割り込みが起こらない。そして、t1intr_coutというカウンタをデクリメントしているが、これは点滅周期を0.5秒にするための時間稼ぎである。先ほどプリスケーラを4:1としたので、割り込み周期は12MHz÷4÷65536≒45.8Hzなので、約23回に一回RC2ポート出力の反転を行えば1秒周期で点滅することになる。このt1intr_coutは割り込み関数が呼ばれないときは値を保っていなければいけないので、これはグローバルで宣言しておく。mLED_3_Toggle()はサンプルプログラム内のマクロ定義にあるのでそのまま使用した。

  if(PIR1bits.TMR1IF) //割り込み要因がTimer1割り込みなら
  {
   PIR1bits.TMR1IF = 0; //flag clear
   t1intr_count--; //カウンタをデクリメント
   if(t1intr_count == 0) //カウンタが0なら
   {
    t1intr_count = 23; //カウンタを23に
    mLED_3_Toggle(); //RC2ポート出力を反転
   }
  }

3.動作確認

 上記のプログラムを焼きこみ、動作を確認したところ正しく動作した。LED点滅を写真で表すのは困難なので、ここではRC2ポートの出力波形を観測した結果を図3に示す。確かに約1秒周期でポート出力がHIGH/LOWしている。

出力波形
図3 RC2ポートの出力波形

まとめと今後の課題

 PIC18F14K50にてタイマ割り込みのプログラムを組み正しくタイマ割り込みを行わせることができた。割り込み処理や割り込み速度などを変えればいろいろな応用が利くと思うので、今後これを活用してみたい。

要旨

 PIC18F14K50で内蔵PWMモジュールを使用する実験の記録である。まず、デバイス単体にてPWMモジュールを動作させ所望の出力波形を得ることができた。また、PCよりUSBによる仮想シリアル通信でデバイスへDuty変更の指示を送信し、それに応じてDutyの変更をすることができた。


背景と目的

 USB対応マイコンPIC18F14K50にはPWMモジュールがあるためPCよりUSBでPWMの設定を送信することができれば、応用の幅が広がる。そこで、今回はPIC18F14K50を用いて、PCからPWMモジュールの制御を行ってみる。


活動の詳細
1.構想

 使用する実験装置は、おなじみの『PICで動かすUSB』評価基板とする。そして今回の目標はPCよりUSBによる仮想シリアルでPWMモジュールの制御内容を送信し、それを受けてデバイスが応答すればよい。したがって、ハードウェアの構成としてはPCと実験基板をUSBケーブルで接続し、PWM出力として用いるRC5ポートの波形が観測できればよい。そしてプログラムの大まかな流れとしては以下のとおり。それぞれについてプログラム作成を行う。

  • PWMモジュールを動かすための各種設定をする
  • PCからのシリアルを受信する
  • 受信したシリアルの内容を解読し、それに応じてPWMモジュールの制御を行う

2.プログラム作成
2.1 PWMモジュールを動かすための設定

 PWMモジュールを動かすためには、関連するレジスタを適当に設定する必要がある。そのレジスタはどのようなモードで使用するかで変わってくるが、今回は以下に示すモードで動作させることにする。ちなみに、他のモードとしてhalf bridge modeやfull bridge modeがあるがそれらはモータの制御などで使用するようだ。

  • モード:single output mode
  • 出力:PA1すなわちRC5ポートのみ
  • 位相:active high

 まず、PWM波形を出力するポートの設定をする。今回はRC5を使用するので、

TRISCbits.TRISC5 = 0;

 次に、PWMモジュールのクロックソースとして内蔵タイマのTimer2モジュールの設定をする。Timer2モジュールで設定すべきレジスタはT2CONとPR2である。T2CONではモジュールをON、プリスケーラは16分周とした。PR2はTimer2の周期を設定できるが、初期値が0xFFで最長の周期となるのでそのままとした。したがって、PWMクロックは命令サイクルクロックの1/16つまり、12MHz/16=750kHzである。

T2CON = 0x07;

 次に、本題のPWMモジュールの設定である。PWMモジュールには関連するレジスタがたくさんあるが今回の使用条件ではCCP1CONとPSTRCONとECCP1ASを設定する。CCP1CONは動作モードの設定、PSTRCONはsingle output modeで動作させるときの条件を指定する。ECCP1ASは周辺回路を保護するAuto-shutdown modeという機能の設定をするレジスタであるが今回は使用しない。

CCP1CON = 0x0C; //single output modeを使用
PSTRCON = 0x11; //P1Aを使用
ECCP1AS = 0x00; //auto shut-down modeを使用しない

 さらに、PWMのDutyを決めるため、CCPR1Lレジスタに値を入力する。今回は後述するPCからの指示によるDutyの変更があるのでとりあえずDutyは75%とする。したがって以下の記述となる。

CCPR1L = 0xBF;

2.2 PCからのシリアルを受信する

 これは、すでに以前仮想シリアルのサンプルを実験したときにはじめから記述されている。該当部分は関数ProcessIOの以下の部分である。これは変更の必要はまったくない。

 if (RS232_Out_Data_Rdy == 0)  // only check for new USB buffer if the old RS232 buffer is
 {        // empty.  This will cause additional USB packets to be NAK'd
  LastRS232Out = getsUSBUSART(RS232_Out_Data,64); //until the buffer is free.
  if(LastRS232Out > 0)
  { 
   RS232_Out_Data_Rdy = 1;  // signal buffer full
   RS232cp = 0;  // Reset the current position
  }
 }

2.3 受信したシリアルの内容を解読し、それに応じてPWMモジュールの制御を行う

 受信したシリアルの内容を解読するのであるが、これにはUSBシリアル変換のサンプルを改造しUSBで受け取ったシリアルを接続デバイスへ送信することを止め、その代わりに解読とPWM制御のコードを記述する。今回はPCから'1'または'0'が送られてくることとしそれぞれDutyを25%、50%に変更することにした。

 if(RS232_Out_Data_Rdy && mTxRdyUSART())
 {
  //putcUSART(RS232_Out_Data[RS232cp]);
  if(RS232_Out_Data[RS232cp] == '1')
  {
   CCPR1L = 0x3F; //Duty=25%
  }
  else if(RS232_Out_Data[RS232cp] == '0')
  {
   CCPR1L = 0x7F; //Duty=50%
  }
  ++RS232cp;
  if (RS232cp == LastRS232Out)
   RS232_Out_Data_Rdy = 0;
 }

3.結果

 以上のプログラムを組み込み動作させてみた結果は以下の図3.1、3.2、3.3である。まず、図3.1ではデバイス起動直後のPWM出力波形で初期値として設定したDuty75%で動作している。また、PWMの周期は2.93kHzでこれはTimer2で生成したPWMクロック750kHzの256周期分となっていて確かにTimer2で設定したとおりの速度で動作していることがわかる。
次に、図3.2はPCより'1'を送った場合である。ONの時間は約でありDutyは約25%で設定どおりである。さらに、図3.3についてもPCより'0'を送った結果、ONの時間は約でありDutyは約50%で設定どおりとなったことがわかる。
今回の確認で、PCからUSBを経由してデバイスを制御できるようになった。今回PC側でコマンド送信を行ったソフトはTeraTermだったがもし独自のソフトでシリアルを送信できるようにすればまた応用の幅が広がる。今後の少し楽しみが増えた感じである。

デバイス起動後
図3.1 デバイス起動後のPWM出力波形

1を送信
図3.2 PCより'1'を送信した場合のPWM出力波形

0を送信
図3.3 PCより'0'を送信した場合のPWM出力波形


まとめと今後の課題

 PIC18F14K50で内蔵PWMモジュールを動作させ、PCよりUSBによる仮想シリアル通信でPWMモジュールを制御することができた。今後は、PWMモジュールだけでなくさまざまな制御を行いたい。また、PC側についてもより簡単に制御可能なようGUI等を作成してみたい。

要旨

 PIC18F14K50でA/D変換モジュールを使用する実験の記録である。A/D変換結果をUSBによる仮想シリアル通信でPCへ送信することができた。


背景と目的

 USB対応マイコンPIC18F14K50にはA/D変換モジュールがあるためA/D変換結果をPCにUSBで送信することができれば、応用の幅が広がる。そこで、今回はPIC18F14K50を用いて、A/D変換を行いその結果をUSBでPCに送信できるようにしてみる。


詳細
1.構想

 使用する実験装置は、おなじみの『PICで動かすUSB』評価基板とする。そして今回の目標は何らかのA/D変換結果がUSBでPCに送信できればよいので、図1のようにスイッチが押されたらアナログ電圧をA/D変換し結果をPCに送る。プログラムの大まかな流れとしては以下のとおり。このうち、Ⅰ、Ⅲ、Ⅳは以前の記事ですでに方法を確立している。そこで、今回主にプログラムを考えるのはⅡである。

  • 基板上のスイッチが押されたことを検出する
  • A/D変換を行う
  • 変換結果をUSBによる仮想シリアル通信でPCに送る
  • PCにてシリアルを受信し画面に表示する
2.製作
2.1 ハードウェア構成

 図2.1に今回実験に使用するハードウェアの構成を示す。変換対象のアナログ電圧は、直流電源が出力するDC電圧としRC6/AN8で読み込むように配線を施した。その他の回路構成は『PICで動かすUSB』の評価基板から変更していない。スイッチが押されたことはRA3の値を読み検出する。

ハード構成
図2.1 ハードウェア構成

2.2 A/D変換プログラム

 PIC18F14K50でA/D変換をするためには、以下の手順が必要である。

  • 使用するポートの設定
  • A/D変換モジュールの設定
  • A/D変換の開始
  • A/D変換の終了検出
  • 変換結果の取得

以下、順を追ってプログラムを記述する。

Ⅰ 使用するポートの設定はポートを入力にする、アナログ入力にするという2つが必要である。今回はポートCのRC6すなわちAN8を使用することにしたので、以下の記述が必要。

TRISCbits.RC6 = 1; //RC6を入力にする
ANSELHbits.AN8 = 1; //RC6をアナログ入力にする

Ⅱ A/D変換モジュールの設定では、モジュールの有効化、入力ch選択、変換クロックの選択、電圧リファレンス、フォーマット(右寄せか左寄せか)の5つが必要である。今回は電圧リファレンスはVssとVddを用いる。またフォーマットは右寄せとする。したがって、

ADCON0 = 0x21; //AN6を選択、モジュールを有効にする
ADCON1 = 0x00; //電圧リファレンスはVssとVddを用いる
ADCON2 = 0x22; //アクイジションタイムは8TAD、クロックはFosc/32
ADCON2bits.ADFM = 1; //右寄せ

Ⅲ A/D変換の開始は、以下の1行でよい。

ADCON0bits.GO = 1;

Ⅳ A/D変換の終了は、ADCON0bits.NOT_DONE = 0をポーリングで検出するかA/D変換終了割り込みフラグを検出するかのどちらかだが、今回はポーリングとした。すなわち、以下の1行である。

while(ADCON0bits.NOT_DONE);

Ⅴ A/D変換結果の取得は、ADRESLとADRESHから取得すればよい。今回は『PICで動かすUSB』第4章-5を参考にしGenericTypeDef.hというヘッダファイルに定義されているWORD_VALという共用体を使って格納することにした。すなわち以下のような記述となる。

 WORD_VAL w; //WORD_VAL型のwを使う
 w.v[0] = ADRESL; //下位8ビットを格納
 w.v[1] = ADRESH; //上位2ビットを格納

3.動作確認

 動作確認は、変換対象のアナログ電圧を変化させてその変換結果を調べることにした。その結果が、図3である。与えた電圧に対してほぼ直線的に変換結果も対応しているので概ね正しく変換されていると思われる。

変換結果
図3 入力電圧とA/D変換結果

まとめと今後の課題

 PIC18F14K50のA/D変換モジュールを用いてA/D変換を行い、正しく動作させることができた。これで、A/D変換を行った結果をUSB経由でPCに送信するためのテクニックが揃ったので今後このテクニックを生かしてまた何かを作ってみたい。

要旨

  PICマイコンを用いたUSBデバイスの自作に関する記事である。本記事は前回うまく動作させることができなかったUSBマイクロフォンのサンプルプログラム(USB Device - Audio - Microphone)について動作させる方法がわかったのでその結果を記した。


背景と目的

  前回の記事で『PICで動かすUSB』で取り上げられているUSBマイクのサンプルプログラム(USB Device - Audio - Microphone)を動かしてみたが、うまく動作させることができなかった。しかし、その後いくつかの検証を得て動かすことができた。そこで、その検証により得た知見をまとめる。


活動の詳細
1.動作しなかった原因

 動作しなかった原因はリンカスクリプトをプロジェクトに追加していなかったことである。リンカスクリプトは、プログラムのメモリ配置を決めるための記述であり目的の処理内容を特定位置に配置するために重要である。図1.1は今回のサンプルで追加しない場合と追加した場合の比較結果でありメモリ配置が異なっていることがわかる。ちなみに、これはビルド時に生成される.mapファイルの中身を比較したものである。
ただし、今回の場合プログラムの配置に違いは無く、データの配置の違いのみであった。ではなぜデータの配置の違いで正しく動作しなくなるのかというと、PIC18F14K50では、データRAMの一部領域はUSB機能が使用するデータRAM領域と共用のため、その領域に目的データを配置し、目的データ以外は避けるようにリンカスクリプトで指示する必要があるからである。当デバイスのデータシート4ページを見ると、図1.2に共用している旨の記載があり、図1.3ではDPRAMという記述で共用領域が示されている。さらに、リンカスクリプトrm18f14k50.lkrには、

DATABANK NAME=usb2 START=0x200 END=0x2FF PROTECTED

という記述があり、共用領域である0x200~0x2FFまでをusb2という名前で定義してある。これにより、USB機能で使用するデータ以外は配置されないようになっているのである。この状態でビルドすれば、USB機能は正しく動作することになる。図1.1を見返してみると、リンカスクリプトを追加した場合ではオーディオデータのPCとの入出力用バッファReceivedDataBufferおよびToSendDataBufferが0x200~0x2FFに配置されていることがわかる。おそらく追加しないときにはUSB関連のモジュールがこれらのバッファにアクセスできずデータを送受信できなかったのではないかと思われる。


map比較
図1.1 .mapファイルの比較(左がリンカスクリプトを追加しない場合、右が追加した場合。データの配置が異なっている。)

USBと共用
図1.2 USB機能で使用するRAM領域に関する記述(PIC18F14K50のデータシート4ページより抜粋)

DPRAM
図1.3 USB機能で使用するRAM領域に関する記述(PIC18F14K50のデータシート35ページより抜粋)

2.新たに遭遇した問題

 実は、今回1の問題解決を探っている間にビルドがうまくいかない問題に直面したのだが、その原因はコンパイラの使用期限切れで最適化機能が働かずプログラムサイズが大きくなり配置しきれなくなったことであった。そこで、ブートローダを使用する前提で書かれているリンカスクリプトの記述を一部変更しプログラムを配置しきれるようにした。具体的には、『PICで動かすUSB』の103ページ相当の記述である。これによりうまくビルドできた。ちなみに、当書籍はブートローダを使わないならば無駄なのでプログラムを詰めて配置するという理由で変更していて、最適化が働かなくなった場合については触れていない。つまり、書籍どおりの変更をはじめから適用すればビルドはできるが最適化が働かなくなっていることに気づけなかっただろう。


3.コンパイラ使用期限が切れるとブートローダに対応しづらくなる

 ところで、最適化が働かなくなるとどの程度プログラムサイズが大きくなるのかという点が知りたかったので調べようとしたが、残念ながら最適化が働いている状態での実験がすでにできなくなってしまったため調べられなかった。しかし、働かなくなった後のプログラムサイズは.mapファイルのprogram memory usageという部分のパーセンテージで知ることができる。今回のUSBマイクのサンプルでは4kbyte中の77%なので3kbyte強である。
これは実は、ブートローダを使用できないということでもある。なぜなら、ブートローダを使用するには少なくとも1kbyteの空きが必要だからである。つまり、最適化が働かないせいでプログラムサイズが大きくメモリの空き領域が1kbyte以下になってしまう場合には、ブートローダを使用するプログラムは作れないということである。残念かつ当然であるが、無料で使っている以上仕方ないことである。


まとめと今後の課題

  USBによる仮想マイクのサンプルプログラムを正しく動作させることができた。そして、その原因についても検証し明らかにすることができた。しかし、まだまだ動かしていないサンプルプログラムがあるので今後はそちらにもチャレンジしたい。

要旨

 PICマイコンを用いたUSBデバイスの自作に関する記事である。本記事は第5回として実験用基板にUSBマイクロフォンのサンプルプログラムを書き込み動作テストを行ったが、うまく動かすことができなかった。


背景と目的

 本ブログのPICマイコン関連実験でよく参考書として使用している『PICで動かすUSB』の中には、USBマイクのサンプルがある。これは、仮想マイクを構築し、USBでPCと接続してマイクデバイスとして動作させることができるものであり、今後のUSBデバイス製作において有用と考えられるため、ぜひテクニックとして習得しておきたい。そこで、今回はサンプルを用いてUSBによる仮想マイクを構築し通信させてみる。


活動の詳細
1.サンプルプログラムの概要

 サンプルプログラムは、Application Librariesに用意されており、USB Device - Audio - Microphoneというフォルダの中のUSB Device - Audio - Microphone Demo - C18 - Low Pin Count USB Development Kitを用いる。このサンプルであれば手持ちのPIC18F14K50が載ったテキスト付属の評価ボードがそのまま使用できる。このサンプルの動作は、PCへ接続するとPICとシリアルで接続されたデバイスをPCが仮想マイクと認識し、評価ボードのボタンを押すと仮想音声データ(マイコンのROMに記憶させておいたデータ)をマイクの音声としてPCに送り、PCで音声が再生される。


仮想マイク
図1 仮想マイクの動作イメージ

2.動作確認

 通常通り、プログラムを書き込み動作させたところ、PCはデバイスを認識しデバイスドライバをインストールし始めた。ここまでは順調である。そして使用準備が整った旨のメッセージが出たので、早速ボタンを押してみたが、まったく反応がない。改めて、参考書を確認してみると、コントロールパネルのサウンドから規定の録音デバイスに指定し、このデバイスを聴くにチェックを入れる必要があることがわかった。また、Windows付属のサウンドレコーダーの録音を開始してから再度ボタンを押してみたがやはり反応がない。その後も、プログラム書き込みをやりなおしたり、デバイスの接続をやり直してみたりいろいろ試してみたが、だめだった。


3.情報収集

 2.のとおり、現状ではサンプルプログラムを動かすことができていないので、Webでこのサンプルに関する情報が無いか調べてみた。すると、一部で正しく動作しないという情報を得た。その情報が掲載されていたWebサイトによれば、PIC18F2550を用いたサンプルを動かし無事に動作した旨が記載されていたが、どうやらPIC18F14K50では動作させることができなかった模様である。また、ほかにもYouTubeでPIC18F2550による動作例が見つかったが、PIC18F14K50はなかった。したがって、現状ではPIC18F14K50で正しく動作させている例が見つかっていない。さらに、参考書発行元であるラトルズのWebサイト等に情報が無いか調べてみたが、こちらでも何も見つけることができなかった。


4.結果まとめ

 結局、PIC18F14K50を用いたサンプルがどうすれば動くかについてはわからなかったが、参考書の著者は動かすことができているのだから、おそらく参考書に書かれていないような注意点や条件を見落としているせいだろう。しかし、それを見つけるにはそれなりに時間もかかるだろうし、ここまでもそれなりに時間を費やしたので(数時間)、あまり深追いせず本件はここまでとする。
もし、この記事を読んだ方で正常動作させられた等の情報があれば、下記コメント欄にでも情報をいただけるとありがたいのだが・・・。


まとめと今後の課題

 USBによる仮想マイクのサンプルプログラムを書き込み動作確認をしたが、正しく動作させることができなかった。今後は、正常にどうさせるための情報がないかWeb等で適宜情報収集したい。

要旨

 PICマイコンを用いたUSBデバイスの自作に関する記事である。本記事は第3回として実験用基板にUSB MIDI入力装置のサンプルプログラムを書き込み動作テストを行った。


背景と目的

 マイクロチップテクノロジーが無償で提供しているApplication Librariesには、USB MIDIデバイスのサンプルがある。一方、筆者は趣味として音楽制作を行っており作業の際にMIDIキーボードを使用している関係上、このサンプルプログラムには非常に興味をそそられる。そこで、今回はサンプルを用いてMIDIデバイスとして認識させることができるか試す。


活動の詳細
1.サンプルプログラムの概要

 サンプルプログラムは、マイクロチップテクノロジーがUSBデバイス開発者向けに無償提供しているApplication Librariesに用意されており、USB Device - Audio - MIDIというフォルダの中にある。動作としては、PCと接続するとMIDI機器として認識され、マイクロチップ純正の評価ボード上にあるボタンを押すごとに半音ずつ音程があがっていくというもののようである。


2.プログラムの準備と書き込み

 プログラムはマイクロチップ純正の評価ボードで動かすことを想定しているが筆者の環境は第1回からテキストとしている『PICで動かすUSB』付属のPIC18F14K50用実験用基板である。したがって、プログラムをそのまま動かすことはできないのではと思ったが、実はその実験用基板は純正評価ボードと構成がほとんど一緒のため、USB Device - Audio - MIDI Demo - C18 - Low Pin Count USB Development Kit.mcpというプロジェクトを使用することでプログラムの修正がいらないことがわかった。具体的には、

  • 入力ボタンとしているスイッチのポート接続関係が同じ
  • インジケータとしている2つのLEDの接続関係が同じ

 なので、サンプルのプロジェクトをビルドして、書き込み可能なhexファイルを作成するだけでOKである。
次に、書き込みであるが第2回までにデバイスへブートローダプログラムの書き込みが完了しているため、ブートローダを用いて書き込みを行うことができた。


3.動作確認

 動作確認は、DAWソフト SONARを用いた。
まず、実験用基板をPCに接続した。このとき、デバイスを使用する準備ができましたというメッセージが出た。どうやらUSBデバイスとして正しく認識されたようである。次に、SONARを立ち上げたところ、MIDIデバイスとして新たに認識した旨のメッセージが出た。つまりMIDIデバイスとして認識されているようである。そしてデバイスを使用可能なよう、デバイス設定画面を表示したところ、確かにMIDI sampleとして認識されているようである。(図3参照)そして、実験用基板のボタンを押したところ、確かにMIDIメッセージをSONARが受け取り音源を介して音が発せられた。
 以上より、デバイスが正しく認識され、入力操作が受け付けられたことが確認できた。
 今回のサンプルプログラムではボタンを押すごとに半音上がる動作であったが当然プログラムを改良すれば任意の動作に変更することができるだろう。また、実験用基板ではなくボタンやセンサなどを使って独自のハードウェアを組めばMIDIデバイスの自作もできるだろう。


MIDI認識
図3 デバイスが認識された様子

まとめと今後の課題

 MIDIデバイスのサンプルプログラムを使用してMIDIデバイスとして認識させることができた。今後は、サンプルプログラムの改造等を行いながら自作MIDIデバイスの実現可能性を探ってみたい。


要旨

 PICマイコンを用いたUSBデバイスの自作に関する記事である。本記事は第2回として実験用基板にテストプログラムを書き込み動作テストを行った。


背景と目的

 前回、USBデバイス開発用の実験基盤の組み立てを行い無事完成した。そこで、今回はその基板へテストプログラムを書き込み実際に動作するか確認する。


詳細

1.テストプログラムの内容

 今回動作確認をさせる実験基板はLEDが汎用ポートに2つ接続されポート制御によりそれらを点灯、消灯することができる。テストプログラムではそれらLEDを以下のルールに従って制御する。
(1)LED1は一定間隔(今回は1秒)で点滅させる
(2)LED2は基板についているスイッチを一回押すごとに点灯、消灯が切り替わる
非常に簡素な内容だがとりあえず動作確認用として使用する。


2.書き込み装置PICKit3

 本制作で使用するデバイスのPIC18F14K50へのプログラム書き込みはマイクロチップテクノロジー純正のライターPICKit3を用いる。そこで、当ライターをPCへ接続し統合開発環境MPLABで認識されるか確認した。手順は、
(1)PICKit3をPCに接続しデバイスドライバが自動的にインストールされるのを待つ
(2)MPLABを立ち上げ、プログラマとしてPICKit3を選択する
上記手順により正常にPICKit3が開発環境に認識され使用可能な状態になった。


3.書き込み

 書き込み手順は、
(1)PICKit3を書き込み対象(ターゲット基板)へ接続する
(2)ターゲット基板の電源を入れる
(3)書き込み対象プロジェクトをビルドすると自動的に書き込みが始まるので終わるまで待つ
上記手順で正常に書き込めた旨の表示が出たのでこのステップは完了である。


4.動作確認

 上記までの手順を踏むと、ターゲット基板へ電源が供給されていれば自動的にプログラムが開始する。実際に実験基板では1で記した動作を正しく行っていることが確かめられた。図1は動作中の基板と書き込みに使用したPICKit3の外観である。写真上方からUSBケーブルが接続されており、基板中央にLEDが点灯していることがわかる。なお、本基板は基板右側にある単三電池ボックスに電池を入れればUSBからの電源供給無しで動作することができる。以上で、ライターが正常に使用でき、実験基板も動作することが確認できた。


9e97daea[1]
図1 実験基板の動作の様子と書き込み装置

まとめと今後の課題

 マイコンライターPICKit3を使用し実験基板へのプログラム書き込みおよびプログラムの正常動作が確認できた。これで開発環境が整ったので次回以降本格的にオリジナルデバイスの製作へ舵を切っていく。


このページのトップヘ