工作と競馬

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

タグ:PICで動かすUSB

要旨

 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デバイスの自作に関する記事である。本記事は第4回として実験用基板に仮想シリアル通信デバイスのサンプルプログラムを書き込み動作テストを行った。


背景と目的

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


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

  サンプルプログラムは、毎度おなじみのApplication Librariesに用意されており、USB Device - CDC - Serial Emulatorというフォルダの中にUSB Device - CDC - Serial Emulator - C18 - Low Pin Count USB Development Kit.mcpを用いる。このサンプルであれば手持ちのPIC18F14K50が載ったテキスト付属の評価ボードがそのまま使用できる。このサンプルの動作は、PICとシリアルで接続されたデバイスからシリアルデータを受信し、USBによる仮想シリアルポートを経由してPCへデータを送信する、あるいはその逆を行えるようになっている。PCへ接続すると、仮想シリアルポートとして認識されることになる。サンプルプログラムをそのまま動作させた場合のイメージ図は図1のとおりである。


PICの役割
図1

2.プログラムの準備と変更

  サンプルプログラムでは、評価ボードとシリアルで接続されたデバイスからデータを受信してPCに送信するためそのようなデバイスが必要であり、参考書の中では温湿度計を用意して実験していた。しかし、筆者の周りには手ごろなものが無かったので、プログラム中でシリアルを受信したことにして、それを仮想シリアルポートを通してPCに送るように改造した。
変更前のプログラムでは、図2.1に示すとおりデバイスからシリアルでデータを受信するとmDataRdyUSART()(実体はシリアル受信完了割り込みフラグPIRbits.RCIF)が1になり、PCへの送信データバッファがいっぱいでなければ送信データバッファにデバイスからの受信データを書き込み送信できるようになっている。
そこで、今回はボタンを押すと特定文字列が贈られるように変更する。まずシリアル受信完了割り込みフラグを無視し、評価ボードのボタンが押されたことを判断基準に変更した。また、文字は1文字ではなくわかりやすくHello!の6文字を送信するよう6つのバッファに一気に書き込むことにする。それと、ボタンのチャタリング対策などを盛り込んだ。この結果が図2.2である。


変更前
図2.1 プログラム変更前

変更後
図2.2 プログラム変更後

3.動作確認

  動作確認には、Tera Termを使用した。通信速度はプログラム上はどうにでもなるらしいがとりあえず19200bpsとしてある。結果は図3のとおりであり、ボタンおしたところ、ボタンを押すたびにHello!が表示された。これより、USBによる仮想シリアルポートとして正常に動作していることが確認できた。


動作確認
図3 動作確認

まとめと今後の課題

  USBによる仮想シリアルポートを構築し、正常に動作させることができた。今後は、このテクニックを実際の機器に応用してみたい。

要旨

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


要旨

 PICマイコンを用いたUSBデバイスの自作に関する記事である。本記事は第1回としてUSBデバイス開発環境の整備を行い、実験用基板を製作した。


背景と目的

 PCや電子機器に搭載された身近なインターフェースであるUSBを用いたデバイスの自作は、従来では電子工作ファンにとって敷居が高く、やむなくRS-232Cなどの従来インターフェースを使用してきた。しかし、USB対応ワンチップマイコンの登場によりUSBデバイスの自作が簡単になってきた。そこで、USBデバイス自作に挑戦し、今後のよりクリエイティブな機器開発の要素技術となるよう習得する。


製作の詳細

1.構想

 USBデバイス自作を手軽に実現する方法として、『PICで動かすUSB』という書籍が紹介しているマイクロチップテクノロジーのUSB対応PICマイコンとその無償の開発環境、専用マイコンライターという組み合わせが比較的安価に揃えられることがわかった。そこで、USB対応のPICマイコンによるデバイス開発を目指し、『PICで動かすUSB』を参考書として必要なハードウェア、ソフトウェアを準備していく。


2.必要なもの

 参考書『PICで動かすUSB』より必要なものは、表1のとおりである。最低限必要なものは上5つのものであるが、今回は手軽に実験環境をそろえるという意味で単体のマイコンを使用するのではなく参考書付属の実験基板を使用することとした。また、ライターはマイクロチップテクノロジー純正のPICKit3を購入することとした。(参考書で紹介しているPIC18F2550などは、たとえば秋月電子製ライターでも書き込めるが、今後さまざまなデバイスにより確実に対応できるマイクロチップ純正ライターを使用することとした。)


表1 USB対応PICマイコンによるデバイス開発に必要なもの一覧
名称 種別 金額[円] 目的
USB対応PICマイコン ハードウェア 数百~ これが無いと始まらない。
PICKit 2/3 ハードウェア 4500 マイコンにプログラムを書き込む際に必要となる。
MPLAB ソフトウェア 無料 PICマイコン用ソフト統合開発環境である。マイクロチップテクノロジーのHPよりDL可能。
PIC C18コンパイラ ソフトウェア 無料 PICマイコン用ソフトをC言語で作成するには必要である。というかアセンブリ言語ではやってられない。マイクロチップテクノロジーのHPより評価版がDL可能。
Microchip Application Libraries ソフトウェア 無料 USB対応PICマイコン用ライブラリを含むライブラリである。マイクロチップテクノロジーのHPよりDL可能。
PIC18F14K50によるUSB実験基板 ハードウェア 無料 参考書付属の基板である。これに必要な部品をつければ実験用として使用できる。
USB実験基板用部品セット ハードウェア 1050 付属基板の部品セットは秋葉原の部品屋で入手可能である。

3.実験基板の製作

 実験基板の製作を行った。専用基板に部品セットの部品を取り付けるだけなので取り立てて記事にするような内容は無い。そこで、ここでは完成した基板の写真を掲載するにとどめる。なお、電源スイッチは基板の完成度が低いためか隣のコイルと干渉して取り付けられないため、外部に線を引き出して使用することとした。


b7dcf6f9-s
図3.1 製作した実験基板

まとめと今後の課題

 USBデバイス自作のための開発環境整備を行い、必要なハードウェア、ソフトウェアが用意できた。今後はこの環境を用いてテストプログラムを動作させたい。


このページのトップヘ