メインページへ

FMトランスミッタモジュールNS73M実験基板
(USBジェネリッククラス対応)

FMトランスミッタモジュールNS73M実験基板開発指針

新潟精密製FMトランスミッタモジュールの実験基板を作りました。
USBの勉強をしたかったのもあって、以下の仕様に基づいて設計しました。

記 2009/5/17
  • 電源:セルフパワー、USBバスパワー両対応。
  • 状態表示:キャラクタディスプレイ液晶モジュール。
  • 設定操作:タクトスイッチ4個。
  • オーディオ入力:ステレオミニジャック。
  • パソコンとの接続:USBジェネリッククラスデバイスとして接続。
  • CPU:USBデバイスとするため、、また入手しやすいことからPIC18F2550を採用。
  • その他:NS73MとMCUとの通信はIICと3線シリアル方式両対応。
NS73M実験基板回路図
表1.入出力コネクタ
CN1RF OUT送信出力信号。アンテナに接続。
CN2USBUSBコネクタ。USBケーブルでパソコンに接続。バスパワー供給。
CN3直流電源セルフパワーの電源供給。DC8〜15V、200mA。
CN4デバッガ接続ICD2,PicKit2接続コネクタ。
CN5LCD接続キャラクタディスプレイ液晶モジュールが接続される。
J1Audio INオーディオ信号入力端子。


表2.スイッチと表示LED
SW1-4設定スイッチ動作設定を操作するスイッチ。
SW5通信切り替えスイッチCPUとNS73Mの通信方式を切り替えるスイッチ。
SW6電源スイッチバスパワー、セルフパワーともに有効な電源スイッチ。
D3電源表示LED電源状態を表示するLED。


今回は特にNS73Mの半田付けが難しそうだったので基板をエッチングして作成しました。
部品も乗っけた完成イメージは以下のような感じです。
NS73M実験基板プリント基板部品面
NS73M実験基板プリント基板半田面


NS73M実験基板ファームウェアの開発

NS73M実験基板ファームウェアの開発は以下の環境・バージョンで行いました。
PICファームウェア開発環境
MPLAB IDEV8.10.00.00
MPLAB C18 コンパイラ Student EditionV3.22
WindowsXPSP3
MCHPFSUSB Frameworkv2.4



NS73M実験基板ファームウェア(USB未対応版)

USB未対応のファームウェアです。後述するUSBジェネリッククラス対応のファームウェアは、このUSB未対応の ファームウェアのコードを使って開発しています。
NS73M実験基板ファームウェア(USB未対応版)は以下の仕様に基づいて開発しました。

  • 5チャンネル分の設定をメモリとしてPIC18F2550内蔵のEEPROMに保持する
  • 各メモリに保存される設定内容には以下のものがある:
    • 送信周波数
    • ミュートオン・オフ
    • NS73M電源オン・オフ
    • クリスタル オン・オフ
    • パイロットトーン オン・オフ
    • サブキャリア オン・オフ
    • アンロック検出 オン・オフ
    • プリエンファシス オン・オフ
    • プリエンファシス 設定
    • オーディオ入力レベル
    • 送信出力レベル
  • メモリの切り替えや設定の変更はSW1-4のスイッチ操作で行う
  • メモリが切り替えられるたびに、切り替わったメモリの内容に従ってNS73Mを再設定する
  • 現在使用しているメモリの番号と設定内容を液晶画面に表示する
詳細はプロジェクト内のソースを参照ください。 NS73M実験基板ファームウェア(USB未対応版)プロジェクト

main.cメインルーチン
lcd4.c lcd4.hLCDモジュール制御ルーチン
NS73M.c NS73M.hNS73M制御ルーチン

MPLAB IDEプロジェクトになっていますので、適当なフォルダに解凍してそのままコンパイル可能です。
NS73Mとの通信方法(IICか3線式か)はコンパイル条件式で選択するようになっています。
NS73M.h内の以下の記述で、2か3を指定してください。
//NS73Mとのインタフェース選択
#define WIRE 3 //2:IIC 3:3wire


NS73M実験基板ファームウェア(USBジェネリッククラス対応版)

記 2009/6/6

「マイクロチップUSBフレームワーク(MCHPFSUSB Framework)」

PIC18F2550のUSBファームウェアの開発には、マイクロチップ社が提供する「マイクロチップUSBフレームワーク(MCHPFSUSB Framework)」 を使用することができます。
「マイクロチップUSBフレームワーク(MCHPFSUSB Framework)」には、USB機能を内蔵したPICマイクロコントローラのUSB機能を 使用するためのライブラリとサンプルのアプリケーションが含まれています。このサンプルアプリケーションを参考、 または修正することにより目的のファームウェアを開発できるようになっています。
「マイクロチップUSBフレームワーク(MCHPFSUSB Framework)」はマイクロチップ社のウェブサイトから無料でダウンロードすることができす。 入手先:MCHPFSUSB Framework v2.4

USBジェネリッククラス・サンプルアプリケーションの選択

「マイクロチップUSBフレームワーク(MCHPFSUSB Framework)」のインストールが完了すると"Microchip Solutions"という フォルダがCドライブに作成されます。"Microchip Solutions"フォルダの中には"Microchip"フォルダを含めて数多くのフォルダ が存在します。"Microchip"フォルダ以外のフォルダはサンプルアプリケーションのフォルダであり、フォルダ名でどのような 機能のサンプルなのかが分かるようになっています。
"Microchip"フォルダにはUSBの様々なクラス機能やFATファイルシステムなどのソースコードやヘッダファイルが格納されており、 必要に応じてこれらのファイルをプロジェクトに追加して使用します。

今回の実験基板ではUSBジェネリッククラスデバイスとして開発します。よってUSBジェネリッククラスデバイスの サンプルアプリケーションを改造して目的のファームウェアを生成することになります。 数あるサンプルアプリケーションの中からUSBジェネリッククラスに対応しているものは以下の二つです。

  • USB Device - MCHPUSB - Generic Driver Demo
  • USB Device - WinUSB - Generic Driver Demo
どちらのサンプルアプリケーションもPIC18F2550に対応していませんがPIC18F4550には対応しています。PIC18F4550はピン数と 一部機能を除いてPIC18F2550とほぼ同じです。USBジェネリッククラスデバイス・ファームウェアの開発という点から見ると 大差はありません。
この二つのサンプルアプリケーションの大きな違いはPC側のデバイスドライバにあります。WinUSBを使ってみたかったので 今回は"USB Device - WinUSB - Generic Driver Demo"を使用します。

USBジェネリッククラス・サンプルアプリケーションの改造指針

  1. PIC18F2550に対応させる:

    "USB Device - WinUSB - Generic Driver Demo"のファームウェア・プログラムコードは複数のMCUに対応するように 構成されています。これは、コンパイル対象MCUによって条件つきコンパイルが分岐することにより実装されています。
    基本的にはMCHP FS USB デモボード用、つまりPIC18F4550を使用するときと同じコンパイルが行われれ ば良いのですが、・コードが長くなっている、・条件文を見極めないと処理の流れが分からない などのことから、 不要なコード記述を削除し、MCHP FS USB デモボード用のコードだけがコンパイルされるように修正します。

  2. NS73M実験基板用のコマンドに対応する:

    "USB Device - WinUSB - Generic Driver Demo"のファームウェア・プログラムコードは、PCからのコマンドに応答する 記述が既に存在します。この記述をNS73M実験基板に合ったものにするとともに、NS73Mを設定するためのメモリ内容の 送受信コマンドを追加します。

USBジェネリッククラス・サンプルアプリケーションの改造手順

  1. "USB Device - WinUSB - Generic Driver Demo"フォルダを一旦別のフォルダに移動してフォルダ名を "NS73MWinUSB"に変更後、"Microchip Solutions"フォルダに戻します。 (インストールしたフォルダをそのままとっておきたいので)
  2. "NS73MWinUSB"フォルダ内に有る"WinUSB Simple Demo - Firmware"フォルダ内の不要なファイルを削除。 削除ファイル一覧
    (必要なファイルを明確にすることと、目的のファイルを探しやすくすることが目的なので必ずしも ファイルの削除が必要なわけではありません。)
  3. PCアプリケーションは別途開発するので、"WinUSB Simple Demo - PC Application - MS VC++ 2005 Express" フォルダはフォルダごと削除してしまいます。
  4. "Driver and INF"フォルダは使用するので削除しないでそのままにしておきます。
  5. MPLABを起動して"WinUSB Simple Demo - Firmware"フォルダの "USB Device - WinUSB - Generic Driver - C18 - PICDEM FSUSB.mcp" プロジェクトを開く。
  6. メニューのConfigure→DeviceSelectでDeviceをPIC18F2550に変更する。
  7. ブートローダーを使用しないように、また、PIC18F2550に対応するようにリンカースクリプトファイル (rm18f4550 - HID Bootload.lkr)を修正します。
    修正後、ファイル名を"rm18f4550 - HID Bootload.lkr"から"rm18f2550.lkr"に変更して、プロジェクトに 登録しなおします。
  8. HardwareProfile.h main.c usb_config.h の内容を修正。
  9. USB通信機能なしバージョンのmain.c の内容をライブラリ化してuser.c user.h を作成。
  10. lcd4.c lcd4.h NS73M.c NS73M.h user.c user.h を"WinUSB Simple Demo - Firmware"フォルダにコピーした後、 MPLABのプロジェクトに追加する。
これが上記手順で修正した"WinUSB Simple Demo - Firmware"フォルダ です。詳細は各ファイルを参照してください。(変な翻訳文がコメントとして記述されていますが鵜呑みにしないでください。当方 英語は苦手なので正しくない可能性が多分にあります。こういう風に訳すんだよって言うご意見などあれば大歓迎です。)

NS73M実験基板ファームウェア(USBジェネリッククラス対応版)で処理するコマンド

USBジェネリッククラスの通信でPCアプリケーションから送られてくるコマンドは以下の4つです。
受信バッファの先頭バイトの値がコマンドを示しており、この値に従って処理を行います。
受信バッファ先頭バイトの値コマンド処理内容
0x70設定情報要求コマンドこのコマンドが送られてきたら、NS73Mの設定情報をPCアプリケーションに送信する。
0x71設定情報書き換えコマンドこのコマンドが送られてきたら、受信バッファの内容に従ってNS73Mを再設定し、その内容をEEPROMに保存する。
0x80LCDトグル表示コマンドこのコマンドが送られてくるたびに"SW ON"、"SW OFF"の表示をトグルする。
0x81スイッチ状態要求コマンドこのコマンドが送られてきたら基板上のスイッチの状態を編集してPCアプリケーションに送り返す。



WinUSBデバイスドライバのインストール

PCのUSBデバイスドライバはWinUSBを使用します。コピーしてできた"NS73MWinUSB"フォルダ内の"Driver and INF" フォルダに有るMCHPWinUSBDevice.infを使用してWinUSBのインストールを行います。
WindowsXPの場合以下のような手順となります。 (NS73M実験基板にNS73M実験基板ファームウェア(USBジェネリッククラス対応版)を書き込んでから実行してください。)

  1. NS73M実験基板をUSBケーブルを使用してPCと接続して電源スイッチをオンにする。
  2. 新しいハードウェアの検索ウィザードダイアログが表示されるので、「いいえ、今回は接続しません」を選択。
  3. 次の画面で「一覧または特定の場所からインストール」を選択して次の画面に。
  4. 「次の場所を含める」のチェックボックスをチェックして、参照ボタンを使ってC:\Microchip Solutions\NS73MWinUSB\Driver and INF フォルダを指定してから次へボタンを押すとインストールが開始されます。

NS73M実験基板PCアプリケーションの作成

PCアプリケーションの作成は、"USB Device - WinUSB - Generic Driver Demo" フォルダの中の"WinUSB Simple Demo - PC Application - MS VC++ 2005 Express"を参考にしました。
開発環境および言語は VC++ 2008 Express Edition を使用しました。
完成したプログラムの画面を以下に示します。

NS73M実験基板

画面の下のほうにある"button1,2 checkbox1〜4は、接続テスト用に作ったもので、それををそのまま残しているものです。
button1を押すたびに"LCDトグル表示コマンド"(0x80)をデバイスに対し送信します。デバイス側ではこのコマンドを受け取る たびに"SW ON"、"SW OFF"を交互に表示します。
button2を押すたびに"スイッチ状態要求コマンド"(0x81)をデバイスに対し送信し、デバイスからの応答内容(基板スイッチの オンオフ情報)をcheckbox1〜4に表示します。
今後、別のアプリケーションを作成するときに参考にするために残してあるだけなので、削除してしまっても問題はありません。

画面の上のほうに固まっているCheckBox、RadioButton、NumericUpDownによってデバイスの設定状態が表示され、これらの 状態を変更することによりデバイスを制御することになります。
これがPCアプリケーションのプロジェクト です。詳細は各ファイルを参照してください。(変な翻訳文がコメントとして記述されていますが鵜呑みにしないでください。当方 英語は苦手なので正しくない可能性が多分にあります。こういう風に訳すんだよって言うご意見などあれば大歓迎です。)

注意:上記VC++プログラムのコンパイルにはWindows Server 2003 R2 Platform SDKおよび Windows Driver Kit (WDK) build 6001.18001 (以降のバージョン) が必要になります。ソースコードに記述されているコメントでも そのことに触れていますが、参考にしたソースコードの直訳でありちゃんと訳し切れていません。
2009年6月6日現在、以下のサイトからたどってダウンロードしたものを使用しています。
Platform SDK
Windows Driver Kit (WDK)