RN52搭載Bluetoothオーディオボード簡単使い方ガイド [CLICK-BTAUDIO]

RN52搭載Bluetoothオーディオボード(CLICK-BTAUDIO)は、マイクロチップ社製のワンチップBluetoothオーディオ信号伝送モジュール、RN52と、音声出力に優れた150mWオーディオアンプTPA6112Aを搭載したボードです。

工事設計認証(いわゆる技適)取得済みモジュールなので、もちろん日本国内で安心して使用できます。(201-135403)

※RN52の製品ガイドはこちら

スマートフォン・タブレット端末・ウォークマン・PCなどBluetooth機能搭載のオーディオプレイヤーとペアリングしてすぐに音声の受信ができます。

ボード本体には3.5mm径のオーディオ出力、マイク入力のジャックを搭載。イヤホン等を装着してすぐにBluetooth経由で音声を聞くことができます。

RN52は面実装タイプでそのままですと半田付けなどが面倒ですが本ボードでは必要な端子は2.54mmピッチのピンにアサインされています。ピンは、mikroBUS規格に準拠しておりmikroBUSを搭載した各種マイコンボードにそのまま装着して使用できます。※デジタルオーディオインターフェイスのピンはアサインされていません。詳しくはピン配置の項目をご覧ください。

各種設定は、非同期式シリアル通信のUART経由で行える他、RN52はSPP通信機能も搭載。オーディオ信号の送受信だけでなく、UART信号の無線するモジュールとして使用することもできます。(※オーディオ通信機能とSPPによるUART無線通信機能とは同時に利用できません。排他的です。)

電源は3.3Vです。


■RN52の概要

RN52は、高品質のステレオオーディオをBluetoothで送受信できます。各種設定はシンプルなASCIIコマンドで行うことが可能なのでマイコン等と接続して通信設定などが可能です。

Bluetooth Class2に準拠しており通信距離は見通し内通信で約10mです。

BluetoothのプロファイルとしてHSP / HFP、A2DP、AVRCP、SPP、およびiAPをサポート。iAP(iPhone Accessory Protocol)搭載によりApple製のデバイスの検出をサポートしています。

また、Bluetooth接続を介して高品質のステレオオーディオストリーミング用のaptXオーディオコーデックをサポート。aptXはCD品質(16ビット/44.1kHz)のオーディオストリームをエンコードするので、サウンドの品質はとても良好です。その他AAC、MP3の追加コーデックをサポートしています。


■ピンアサイン

●BAUDピン(1)

UARTの通信速度を設定します。デフォルト設定は9600bpsです。内部でプルダウンしてあります。このピンを解放又はLレベルで通信速度が9600bps、ピンをVccに接続、Hレベルすると115.2kbpsとなります。

 

●RSTピン(2)

内部でプルダウンされており、GPIO3と接続されています。動作中にこのピンをHレベルにするとデバイスRN52はリセットされて再起動します。Hパルスは100m秒以上必要です。約0.5秒で再起動を開始します。

内部でプルダウンされているので通常時はオープンにしておきます。

その他、RN52のファームウエアアップデートモードDevice Firmware Update(DFU)モードにするためにも使います。RN52起動時にこのピンを3秒以上Hレベルにし続けるとDFUモードに入ります。DFUモードは、本体のファームウエアUART通信経由でアップデートするモードで、このモード実行中は通常の動作はしません。通常は使用しないモードです。

このピンを動作中にHにし続けると、本体が再起動しますが、そのままHに3秒以上しつづけるとDFUモードに入りますので注意してください。
デバイスはDFUモードに移行する前にハイにアサートされている必要

 

●PWRピン(3)

RN52のPWRENピンと接続され、モジュール内でプルダウンされています。Hレベル(Vccと接続)で本体が起動します。ご使用になる場合には、必ずこのピンはVccと接続して電源を入れてください。開放状態又はLレベルで本体がシャットダウンします。

 

●TXピン・RXピン(13,14)

UART通信の信号線です。デフォルト設定で9600bpsです。本体の設定をATコマンドで行う他、SPPで通信をする場合にはデータモードとなり遠隔地のデバイスとUART通信をBluetoothで無線化できます。

 

●FRSピン(15)

内部でRN52の5ピンと接続されています。工場出荷時の状態にするリセットピンです。工場出荷時のデフォルトにリセットするには、電源投入時にこのピンをHにしてから、1秒の待機時間でH→L→Hに切り替えます。

通常時はオープンにしておきます。

 

●CMDピン(16)

コマンドモードにするか、データ通信モード(SPPによるシリアル通信の無線化)を切り替えるピンです。内部でプルダウンされており、開放状態又はLレベルでコマンドモードになっています。各種設定コマンドを送受信するモードです。本ピンをHレベルにすることでSPPによるデータ通信モードに移行します。


■最も基本的な使い方(オーディオ再生を使用する場合(A2DP))

A2DPはBluetoothのプロファイルの1つでAdvanced Audio Distribution Profileの略です。A2DPに対応したオーディオプレイヤーと本機をBluetoothで接続して音楽の再生ができます。本機の最も基本的な使い方、オーディオプレイヤーと本機をBluetoothで接続して再生された音楽をステレオジャックから出力してみましょう。

 

1、本体のmikroBUSのPWRピン(3)をHレベルにして(Vccと接続)、電源ピンに+3.3Vの電源を印加します。

2、本体のLD1とLD2のLEDが点滅します。LEDは点滅状態は次の状況を示します。初期状態だと2のLEDは点滅しています。この状態の時は、本機が他のBluetooth機器から検出可能で、ペアリング待ちの時を示します。この状態をディスカバリーモードといいます。

3、オーディオ機器(iPhoneやAndroid端末、Bluetooth機能付きPC)のBluetooth機能を使って、周囲のBluetooth機器を検索してください。デフォルト設定では、本機は 「RN52-XXXX」というデバイス名で見つかります。XXXXはモジュールのMACアドレスの最後の4桁です。

•スマートフォンでの検出 – スマートフォンのBluetooth設定を開き、ペアリングが可能なデバイスをスキャンします。本デバイスが検出されます。

•パソコンでの検出 – PCのBluetooth設定画面を開き、新しいデバイスを追加することを選択します。Windows10の場合には設定画面から「Bluetoothとその他のデバイス」画面を表示させて「Bluetoothまたはその他のデバイスを追加する」ボタンを押して、「Bluetooth」ボタンを押すと、しばらくして本機が検出されます。下図は検出時の画面例です。

4、本機のデバイス名を選択してペアリングしてください。

5、ペアリングが正しく完了して接続されると、赤LED(LD1)が点滅します。本機の”OUT”と書かれたステレオジャックにスピーカーやイヤホンを接続して、オーディオデバイスで音声を再生し、正しく音声が出力されることを確認します。

 

一度ペアリングを実行すると、RN52は次回起動時、リセット後に再度そのデバイスと接続しようとします。もし前回接続したデバイスが近傍にあれば、次回以降自動的にペアリングされます。


■コマンドモードによる本体の設定

本機に搭載のRN52はUART通信経由で、コマンドを送信することにより各種設定ができます。設定は、本体のデバイス名を変更したり、使用するBluetoothのプロファイルを変更したりするときに使います。

本機はデフォルト設定では、Bluetoothによるオーディオ信号の伝送をするプロファイルA2DPに設定されています。プロファイルをSPPに設定すると遠隔地のBluetoothデバイスとシリアル通信ができるようになります。SPPではUART通信を無線化できます。本機同士の接続も可能ですし、パソコンと接続すればパソコン側に自動的に仮想COMポートが作られ、シリアル通信プログラムで本機のUART側とシームレスに通信が可能となります。(iOSデバイスはSPPをサポートしていますが、ユーザーサイドでの使用が隠蔽されておりSPPによるシリアル通信はできません。)

 

RN52には、コマンドモードとデータモードの2つのモードがあります。デフォルトの状態ではデータモードとなっています。切り替えは、本機のデータモードになっている時、Bluetooth(SPPまたはiAP)経由で接続されている間、このモジュールは基本的にデータパイプです。 モジュールがワイヤレスBluetooth接続を介してデータを受信すると、モジュールはBluetoothヘッダーと予告編を取り除き、ユーザーデータをUARTに渡します。

データがUARTに書き込まれると、モジュールはBluetoothパケットプロトコルを構築し、Bluetooth接続を介して送信します。 したがって、データをホストに送信/受信する全プロセスは、エンド・マイクロプロセッサに対してトランスペアレントである。 図1-4を参照してください。

注:一度に1つのBluetoothマスターのみがRN52 Bluetoothスレーブデバイスに接続できます。

注:コマンドモードでは、UART経由でシリアルターミナルエミュレータを使用して、特定の機能用にモジュールを設定できます。 ターミナルエミュレータ
コマンドモードでコマンドコンソールとして動作します。

 

 

 

wpmaster

電子ペーパーモジュールクリックボード[CLICK-EINK]簡易ガイド

電子ペーパーモジュールクリックボード(CLICK-EINK)は、SSD1606コントローラー互換の電子ペーパーEPA-20を採用したボードです。

電子ペーパーの最大の特徴は電源を切断しても表示内容を保持できることにあります。よって使用しないときは電源を切断し、表示更新時のみ電源を与えればよいので超低消費電力のアプリケーションが作れます。また表示更新時も約40mW程度です。

採用している電子ペーパーEPA-20は、172×72ドット、2インチで高コントラスト、広視野角、白黒4スケールで使いやすさに定評があります。

制御はSSD1606に準拠した4線式SPI通信で、マイコン等のホスト機器から制御します。

mikroBUSはマイコンボード共通のクリックボード装着用コネクタの規格でPICマイコンを初めARMマイコン用ボードなど様々な開発ボードで採用されている共通規格です。mikroBUS規格に対応したクリックボードを装着すれば様々な機能をマイコンボードに付加することができます。


■ピンアサイン

ピンアサインはmikroBUSに準拠しています。

信号線はSPI通信のMOSIとクロック線、チップセレクト、その他にD/C線、Busy線を使います。ホスト機器はArduinoやPICマイコン、ARMの各種マイコン等SPIホストになる機器でれば何でも使用できます。

電源は3.3Vです。


■SPI通信例

SPI通信のサンプル例、初期化例はEPA-20のデータシート2ページ~3ページにかけて記載されています。

当方で販売しているCコンパイラ、mikroCシリーズをお使いの場合にはSPI通信のコマンド内容を意識せずにも使えるライブラリーが配布されています。Libstockからダウンロードできます。このライブラリを使えば電子ペーパーの初期化ができる他、文字や画像の表示が簡単に行えます。プログラム例は下記の通りです。

 

01 void main()
02 {
03     sysinit();
04     eink_init();
05     Delay_ms( 1000 );
06 
07     while( 1 )
08     {
09         // Display black letters on white background
10         eink_fill_screen( EINK_COLOR_WHITE );
11         eink_set_font( guiFont_Exo_2_Condensed21x32_Regular, EINK_COLOR_BLACK, FO_HORIZONTAL );
12         eink_text( "EINK", 14, 50 );
13         delay_ms( 3000 );
14         
15         // Display white letters on black background
16         eink_fill_screen( EINK_COLOR_BLACK );
17         eink_set_font( guiFont_Exo_2_Condensed21x32_Regular, EINK_COLOR_WHITE, FO_HORIZONTAL );
18         eink_text( "EINK", 14, 50 );
19         Delay_ms( 3000 );
20         
21         // Display external image
22         eink_image_bmp( _mikroe_bmp );
23         Delay_ms( 3000 );
24     }
25 }

 

mikroC以外の環境でSPIホストを作る場合には、それぞれ環境に応じてプログラミングをします。例はデータシートにありますので参考にしてください。なお、SSD1606自体は有名なコントローラーなので、ネットで “SSD1606 Library”や”SSD1606 Arduino”等で検索すると、ライブラリ例が多数表示されますので、検索してお使いになると簡単です。

 

当方で実際のSPI通信を観察したデータを下記に示します。図の波形は最初の初期化部分の最初の4バイトを表示しています。各信号線の状態を参考にしてください。

※本デバイスにMISO線はありません。(スレーブデバイス側からの出力はないため)そのため表示ではすべて00になっていますので無視してください。

なお、下図の様に画面に”1234″という数字画像の表示を行った場合のMOSI全通信データをCSV形式でこちらからダウンロードできます。初期化から画像データの転送まですべてのデータを確認して頂けます。

 


■画像データ・フォントデータの作成.

電子ペーパー本体にはフォントデータは内蔵されていません。よって、数字やローマ字、日本語等の文字はすべて文字ではなく画像データとして本体にSPIで送信する必要があります。

その他の画像データも同様です。画像データは172×72ドットの座標データとして本体に送ります。本体にはディスプレイRAMがありそこにイメージデータを格納します。RAMのサイズは各RAMあたり128×180×2ビットです。RAMのマップアドレスはSSD1606のデータシート19ページを参照してください。

表示させたい画像は、座標データとしてコンパイラで使います。ビットマップ画像から座標データを出力するツールは色々とリリースされていますが、当方では実績のあるフリーソフト、Resources Creatorをおすすめしています。

このソフトでは172×72ドットの24ビットビットマップ形式で作成されたビットマップデータを座標データとして配列データとして出力します。コンパイラでヘッダファイル等にコピー&ペーストして使うことでマイコンから画像データを表示させるのに便利です。また、Windowsのフォントデータを座標データに変換する機能もあります。

Windows標準のペイントを使って画像データを作る場合には次の手順で操作してください。

 

1.Windowsのペイントでビットマップ画像データを作成する場合にはサイズを水平方向72ピクセル、垂直方向172ピクセルとして縦長の画像ファイルを作ります。

2.ペイントで画像ファイルを作ったら、24ビットビットマップ形式で保存します。「ファイル」→「名前を付けて保存」をクリックし、「ファイルの種類」を「24ビット ビットマップ」として保存してください。

3.Resources Creatorを起動します。ウインドウ下にある「Bitmap」タブを選択します。

4.メニューバーの「File」→「Import Bitmap Image」をクリックして手順2で保存したビットマップファイルを開いてください。

5.画面下に”Width 72″ “Height 172” “Bitmap Format 24bit”と表示されていることを確認します。

6.メニューバーの「File」→「Create File .c Bitmap」をクリックして拡張子.cのファイルを生成します。

7.ファイルを開くと座標データがありますので、お使いのSPIホストを作成しているコンパイラのソースプログラムに貼り付けてお使いください。

なお、mikroCをお使いの場合には配列の型を 「const uint8_t」としてください。また、配列の要素数は24768としてください。さらにResources Creatorで作った配列データの先頭にある下記の6バイトは削除してください。

0x00,0x10,
0xAC,0x00,
0x48,0x00,
例:

const uint8_t image_bmp[24768] = { ….. }

 

 

wpmaster

Clicker 2 for PIC32MXの基本的な使い方

Clicker 2 for PIC32MXは、PIC32MX460F512Lの32ビットPICを搭載した汎用開発ボードです。

本体には2つのmikroBUSポートがあり様々なクリックボードを装着して機能を拡張できます。

mikroBUSはマイコンボード共通のクリックボード装着用コネクタの規格でPICマイコンを初めARMマイコン用ボードなど様々な開発ボードで採用されている共通規格です。mikroBUS規格に対応したクリックボードを装着すれば様々な機能をマイコンボードに付加することができます。

Clicker 2 for PIC32MXに搭載のPIC32MX460F512Lにはあらかじめ、ブートローダープログラムが書き込まれています。よって本体のUSBポート(mini-B)とパソコンを接続すれば専用の書き込みソフトによってパソコンからHEXファイルを書き込むことができます。別途マイコンライターは必要ありません。また本Clicker 2 for PIC32MXのブートローダーはHIDデバイスとして認識されるため、デバイスドライバーが必要ないのも便利です。

Clicker 2 for PIC32MXにはリチウムポリマーバッテリー(3.7V)を接続できるコネクタと、充電や電源コントロールを行う電源制御IC、LTC3586が搭載されています。USBポートからパスパワーでリチウムポリマーバッテリーの充電ができます。携帯に便利なアプリケーションを簡単に開発できます。

※3.7Vであれば市販のものが利用可能です。端子のピンピッチは2.54mmです。オスコネクタは別途販売しております。

 

また、プログラムの開発にはPIC32マイコン用のコンパイラーmikroC PRO for PIC32やXC32などのコンパイラーを使って、PIC32マイコンとして開発が可能な他、chipKIT coreをArduino IDEにダウンロードすればArduino IDEで開発することも可能となります。Arduinoのライブラリを使って開発することもできるPIC32ボードです。Clicker 2 for PIC32MXをArduino IDEで使用する方法についてはちらで紹介しています。


■各部の名称

  1. 本体ON/OFF電源スイッチ
  2. 電源スイッチ拡張用パッド
  3. 32.768KHz発振子(RTC用)
  4. 8MHzクリスタルオシレーター
  5. PIC32MX460F512L
  6. 26コネクションパッド(左右)
  7. mikroBUSソケット 1及び2
  8. 押しボタンタクトスイッチ (RE4とRG9)
  9. 実験用LED  (RE3とRA10)
  10. LTC3586-1 USBパワーマネージメントIC
  11. 電源LEDと充電インジケーターLED
  12. マイコンリセットボタン (ブートローダーモードボタン)
  13. USBコネクタ (mini-B)
  14. リチウムポリマーバッテリーコネクター (2.54mm)
  15. ICSP用パッド

 

■ピンアサイン

※クリックして拡大表示します。

 

■電源について

電源は3系統あります。1つはUSBパスパワー給電です。本体のUSBコネクターに+5VのVBASが給電されると、その電源を利用します。なおUSBバス給電の際に(14)のコネクタにリチウムポリマーバッテリーが接続されていると自動的に充電されます。充電中は充電インジケーターLED(11)が点灯します。なお電源スイッチ(11)をOFFにしてもリチウムポリマーバッテリーが接続されている場合には充電は継続されます

2つ目はリチウムポリマーバッテリーからの給電です。(14)のコネクタに3.7V出力のリチウムポリマーバッテリーを接続すると、バッテリーが給電されます。

3つ目は外部電源からの給電です。本体の26コネクションパッド右のVSYSパッドに外部から3.3Vの電源電圧を印加します。この場合リチウムポリマーバッテリーは絶対に接続しないでください。外部給電時はリチウムポリマーバッテリーは使用できません。(同時接続厳禁

なお本体の電源電圧は3.3Vですが、LTC3586-1によってmikroBUSの5Vピンからは5Vが取り出せます。

 

■リチウムポリマーバッテリーについて

リチウムポリマーバッテリーは使い方によって時に危険な場合があります。誤った使い方、配線のショート、過負荷によってバッテリーが膨張したり発火等の危険があります。使用に際して十分な理解と安全性の確認を行った上でご使用ください。使用にあたってはこちらのようなサイトで必ずその危険性を認識の上、ご使用ください。(火災発生事例はこちら

リチウムポリマーバッテリーには3.7V出力のものをご利用ください。端子は2.54mmピッチです。充電はUSBバスパワー給電の時のみ行えます。VSYSピンからの外部給電の時は絶対にリチウムポリマーバッテリーを本体に接続しないてください

充電時の電圧は4.2V、充電電流は300mA程度となっています。

ご使用においては特に下記の点にご留意の上、その特性や危険性をよくご判断の上ご使用ください。

  • 充電は近くに燃えるものが無い安全な場所で行ってください。
  • 充電中は必ず監視してください。(異音、異臭、膨張を確認してください)
  • 1セルあたり3V以下のバッテリーを再充電すると発火する危険性があります。
  • バッテリーが膨れたら即使用を中止し、安全な場所に移動させてください。継続して充電すると爆発します。
  • バッテリーの発熱は遅れて発生する場合がありますので充電後は観察してください。
  • バッテリーに衝撃が加わった場合や損傷がある場合には使用しないでください。
  • 本製品はお客様が開発するボードです。配線ミスやショートは大変危険です。使用前に検証確認をしてください。
  • モーターを接続しているなど、外部に負荷が大きな部品を接続している場合には仕様をご確認ください。

 

■PWMジャンパー設定

mikroBUS2のPWMピンは、マイコンのRD0と接続するか、RG12と接続するかを選択できます。工場出荷時の設定ではRD0と接続されています。通常はこの設定で何ら問題ありませんが、もしRD0ピンをmikroBUS2のソケット以外で使いたい時にはここのジャンバーの設定を変更してください。

変更する場合には0オームのチップ抵抗を外して、隣の位置に半田付けして使います。

 

■USBIDピンのジャンパー設定

PIC32MX460F512LにおいてRF3ピンは、USB OTGのID detectピンです。GPIOとしても使えますでデフォルト設定ではRF3ピンはIOピンとして使えるようになっています。

もしUSB OTGを使用する場合でID detectピンとして使用したい場合には、ジャンパーピンの設定を変更する必要があります。0オームのチップ抵抗をUSBID側に半田し直して下さい。


■全回路図と基板寸法

※クリックするとPDFファイルが開きます。

 


■使用準備をする

■パソコンとの接続

USBケーブルを使用してパソコンのUSBポートと接続してください。最初に接続すると本ボードのブートローダードライバーが自動的にインストールされます。ブートローダーはUSB HIDとして認識されるため特にデバイスドライバーは必要ありません。

※接続したら電源スイッチをONにしてください。

※電源が入ると緑LEDが点灯します。

※リチウムポリマーバッテリーが接続されている場合には充電されます。インジケーターLEDを確認してください。

 

■ブートローダーソフトウエア(mikroBootloader)のインストール

ボード上のPIC32MX460F512LにHEXファイルを書き込む際に使うブートローダーのソフトウエアをパソコンにインストールします。

下記URLからmikroBootloaderをダウンロードしてください。

http://www.microtechnica.tv/support/software/mikrobootloader.zip

zipファイルとなっていますので展開します。setup.exeが展開されますので実行して画面の指示に従いインストールしてください。

 

これで、準備は完了しました。


■基本的な使い方

HEXファイルの書き込みはmikroBootloaderで行います。

 

使い方はとても簡単です。PIC32MX460F512Lに書き込まれているブートローダーはマイコンがリセットされた直後から約3秒間、ブートローダーに入る(書き込みモードに入る)時間があります。この3秒を経過するとマイコン内に書き込まれているHEXファイルが動きますのでブートローダーは動作しません。

書き込み方法は次の5ステップです。

1:本体をパソコンと接続して電源を投入します。本体のリセットボタンを1回押します。

2:ソフトウエアの”Wait for USB link”のアイコンが赤くなっている間に”Connect”ボタンを押します。

3:”Browse for HEX”ボタンを押して書き込みたいHEXファイルを選択してください。

4:”Begin uploading”ボタンを押すと数秒でプログラムの書き込みが完了します。

5:書き込み完了後、3秒程度経過してから書き込んだプログラムが動作します。

 

操作のポイントは、ボード上のリセットスイッチを押した後、3秒以内にmikroBootloaderソフトウエアの”Connect”ボタンを押すことです。このタイミングを逃すとブートローダーモードに入れません。その場合には再度やり直して下さい。

 


■チュートリアル ~mikroC PRO for PIC32でプログラム作成~

 

体験版のCコンパイラーを使って、簡単なプログラムを作って実際にボード上で動作するまでを体験します。

Clicker 2 for PIC32は別のページでご紹介しているようにArduino IDEで、Arduino互換デバイスのようにプログラムを作ることも可能です。そのような使い方をされたい場合にはこちらのページをご参照下さい。

ここでは、PIC32デバイスとしてmikroC PRO for PIC32という使いやすいCコンパイラーの体験版を使ってプログラムを作ってみます。体験版は6KBまでのコードサイズ制限がありますがその他の機能制限はありません。

mikroC PRO for PIC32が気に入ったら製品版のご購入もご検討頂ければと思います。

 

では早速mikroC PRO for PIC32でプログラムを作ってみましょう。ここではボタンを押している時だけ2つのLEDが交互に100ミリ秒間隔で点滅するプログラムを作ってみます。

 

(1)mikroC PRO for PIC32をお持ちでなければ下記URLからダウンロードしてください。

http://download.mikroe.com/setups/compilers/mikroc/pic32/mikroc-pic32-setup-v400.zip

ZIPファイルを展開してセットアップを実行してください。画面の指示に従いインストールしてください。

 

(2)インストール後mikroC PRO for PIC32を起動してください。

 

(3)新規にプロジェクトを作成します。プロジェクトでは使用するマイコンの種類やデバイスの動作周波数等を設定して新規にプログラムを作れるようにします。メニューバーの”Project”→”New Project”をクリックします。”Next”を押して進みます。

 

(4)Project Settingウインドウでは次のように入力してください。

  • Project Name:  CLICKER2_TEST
  • Project folder:   プロジェクトを新規に作成したいフォルダを指定します(日本語を含まないフォルダを指定)
  • Device name:   PIC32MX460F512L
  • Device clock:  80.000000 (MHz)

内容を確認して”Next”を押して続行します。

※動作周波数は80MHzとします。ボードには8MHzの発振子が搭載されています。この発振子を分周器で1/2にした後、PLLにて20逓倍し80MHz動作とします。

 

(5)次の画面ではそのまま”Next”をクリックします。次の画面では”Include None(Advanced)”にチェックを入れて”Finish”を押して完了します。

(6)これでソースファイルの”CLICKER2_TEST.c”というC言語のファイルが作られました。最初はmain関数しかありません。ここにプログラムを記述していきます。今回は左タクトスイッチ(RE4)を押している時のみ、2つのLEDが100ミリ秒間隔で交互に点滅するプログラムを作ります。下記のプログラムを参考にプログラムを記述してください。

 


sbit LD1 at LATE3_bit;
sbit LD2 at LATA10_bit;
sbit LD1_Direction at TRISE3_bit;
sbit LD2_Direction at TRISA10_bit;

sbit SW1 at RE4_bit;
sbit SW1_Direction at TRISE4_bit;

void main() {
    AD1PCFG = 0xFFFF;
    JTAGEN_bit = 0;
    LD1_Direction = 0;
    LD2_Direction = 0;
    SW1_Direction = 1;
    
    while(1){
    
        if(SW1==0){
            LD1 = 0;
            LD2 = 1;
            delay_ms(100);
            LD1 = 1;
            LD2 = 0;
            delay_ms(100);
        }
        LD1 = 0;
        LD2 = 0;
    }
}

 

とても分かりやすいプログラムです。

最初の sbit は文字列にビットを割り当てるタイプです。LED1はLD1という名前でPORTEのビット3に割り当てています。PIC32シリーズではポートの出力はLATxレジスタに値を代入します。該当ビットが1でHに、0でL出力となります。一方で、入力ピンとしてピンの状態を読み取りたい場合にはPORTxレジスタを使います。

LATE3_bit という書き方はLATEレジスタのビット3を示しています。

LD1_Direction という文字列にピンの入出力方向を設定するTRISxレジスタのビットを割り当てています。TRISxレジスタは該当ビットが1で入力ピンに、0で出力ピンとなります。TRISE3_bit はTRISEレジスタのビット3ということになります。

main関数では最初に全ピンをデジタルIOピンとして使用できるようにAD1PCFGレジスタに0xFFFFを代入しています。ADコンバーターを使う場合にはこのレジスタをいじる必要がありますのが、すべてのピンをデジタルIOピンとして使いたい場合には、とにかくプログラムの先頭で0xFFFFを代入すればよい、と考えておきます。

JTAGENレジスタはJTAGを使用するかどうかの設定レジスタです。有効になっていると割り当てられているピンが使えませんのでここでは無効にしています。

入出力方向の設定値を代入しています。LD1_Direction = 0 はLD1のピン、すなわちPORTEのビット3を出力としています。同様にしてタクトスイッチについては入力ピンとしています。

本Clicker 2 for PIC32MXボードの2つのタクトスイッチはアクティブローです。ボタンを押していない時は常にHレベル、ボタンを押した時はLレベルです。よって、if文の条件分岐で条件式にSW1がLレベルの時を判定しています。

LD1 = 0 でLEDは消灯します。逆に1を代入すると点灯します。

delay_ms(100) は遅延関数です。引数はミリ秒単位です。ここでは0.1秒としています。

 

(7)続いて、コンフィギュレーションビットの設定をします。コンフィギュレーションビットとはPICマイコンのハードウエアに関する基本的な動作等について設定する項目で、この設定が正しくないとプログラムが正しくてもプログラムが動きません。

本例では、マイコンを80MHzで動作させます。ボードには8MHzのクリスタルが実装されています。このクロックを分周器で1/2にして4MHzとし、PLLという逓倍回路に入力します。PLLで20逓倍すると80MHzとなります。そういった設定をするわけです。

設定は細かく、色々と設定できますのがここでは予め設定値が登録されたファイルを読み込んでコンフィギュレーションビットの設定を完了させましょう。

メニューバーの”Project”→”Edit Project”をクリックします。

 

(8)ウインドウが表示されたら右側にある”Load Scheme”ボタンを押します。

通常は既に登録されているファイル一覧が表示されます。この中から、”P32MX460F512L_PLL_8_to_80MHz.cfgsch”ファイルを選択して開いて下さい。(似たようなファイルがあるので間違えないようにしてください。)

 

(9)これでコンフィギュレーションビットの設定が完了しました。”OK”ボタンを押して完了します。

 

(10)作ったプログラムをコンパイルしてHEXファイルを作りましょう。ツールバーの”Build”ボタンを押すか、メニューバーの”Build”→”Build”でビルドしてください。画面下のMessageウインドウに状態が表示されます。

(11)下図のように”Finished successfully”と表示されれば成功です。エラーが表示された場合には間違いがないかよくプログラムを確認してください。

(12)mikroBootloaderでHEXファイルをボードに書き込んでみましょう。

mikroC PRO for PIC32はmikroBootloaderが直接呼び出せます。”Tools”→”USB HID Bootloader”をクリックして起動させてください。

 

(13)起動したら、Clicker 2 for PIC32MXボードのリセットスイッチを1回押します。

するとmikroBootloaderソフトウエアの “1 Wait for USB link “の所にあるUSBマークが赤くなります。その間に(リセット直後から3秒間)にmikroBootloaderソフトウエアの “Connect”ボタンを押して下さい。

ボードがブートローダーモードに入れると先ほどのボタンが”Disconnected”という表示になり、USBマークが赤いままになります。また、History Windowに”Connected”と表示されます。

※タイミングがずれると失敗します。その場合にはリセットからやり直して下さい。

 

(14)”Browse for HEX”ボタンを押して、コンパイルしたHEXファイルを指定します。HEXファイルはプロジェクトを作成したフォルダ内に生成されています。

 

(15)”Begin uploading”ボタンを押して下さい。アップロードが始まります。完了すると、”Restarting MCU…”というメッセージが表示されますのでOKボタンを押して完了します。

 

(16)プログラムは3秒後から動作します。3秒程度経過したら、RE4のタクトスイッチを押してみて下さい。スイッチを押している間LEDが交互に点滅することが確認できます。

 

 

 

wpmaster

chipKIT coreにより Arduino IDEで開発する方法

chipKIT coreを使用することにより、Arduino IDEでArduinoと同じ方法でプログラムを作ることが可能となります。

基本的にはPIC32MXなのでmikroC PRO for PIC32等のPIC32用コンパイラを使って開発しますが、chipKITの導入で現在人気のあるArduino IDEでスケッチをつくるのと同じ方法でプログラムを作成してボードに書き込むことができます。


■Arduino IDEでchipKIT coreを使えるようにする

1.Arduino IDEを公式サイトからダウンロードしてインストールします。

https://www.arduino.cc/en/Main/Software

※web editionではなくダウンロードして利用するIDEを選択してダウンロードしてください。

 

2.Arduion IDEを起動し、”ファイル”→”環境設定”をクリックします。

 

3.”追加のボードマネージャのURL”と書かれた所に次のURLをコピーして貼り付け、OKボタンを押します。

https://github.com/chipKIT32/chipKIT-core/raw/master/package_chipkit_index.json

 

4.”ツール”→”ボード”→”ボードマネージャ”の順でクリックします。

 

5.ボードマネージャが表示されたら”検索をフィルタ・・”と書かれた所に chipkit と入力して検索します。

 

6.クリックして選択すると”インストール”というボタンが表示されますので、クリックしてインストールします。

7.”ツール”→”ボード”で使えるボード一覧が選択できます。この中に、上記で正しくchipKIT coreがインストールされると下図の通り”MikroElektronika Clicker 2″が選択できますので、これを選択します。

選択できたら、これで使えるようになりました。

 


■最初の一歩 ~LEDを点滅させる~

まずは、簡単に使い方を試してみます。最初にLチカ(LED点滅)を試してみます。

書式はArduinoと全く同じです。Clicker2 for PIC32MXには2つのLEDと2つのタクトスイッチが実装されています。このLEDとスイッチを利用してみます。最初はLEDの点滅だけを試してみましょう。

LEDは”LD1″がRE3に、”LD2″がRA10に接続されています。PICの場合ピン名はRE3やPORTE.B3などと「ポート名+ビット」で表現しますが、Arduino IDE内では番号で記述します。どのピンが何番なのかは対応表がありますので、こちらをご参照ください。PDF版はこちらです。

上の図を見ていただくと分かるとおり、LED1は85、LED2は86となっています。よってこの番号を指定することになります。

次のようにスケッチを記述してみましょう。


const int LED1 = 85; 
const int LED2 = 86;

void setup() {

  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
     
}

void loop() {

  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, LOW);
  delay(100); 
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(100); 

}

 

LED1とLED2を交互に100ミリ秒間隔で点滅させる内容です。

では、コンパイルしてボードにプログラムを書き込みましょう。パソコンにClicker2 for PIC32MXを接続してください。初回接続時は、デバイスドライバーがインストールされますので、インストールを確認してから次にすすんでください。

Clicker2 for PIC32MXのブートローダー(マイコンにプログラムをダウンロードするファームウエア)は、あらかじめClicker2 for PIC32MXのPIC32MX460F512Lに書き込まれています。またこのブートローダーは、USB HIDデバイスとして認識されるため、別途デバイスドライバーを用意する必要はありません。自動的にインストールされます。

 

プログラムが正しいことを確認したら、”マイコンボードに書き込む”ボタンを1回押してください。

スケッチがコンパイルされます。

その後、下部のメッセージ欄に「*** Enter programming mode now. ***」と表示されます。この表示が出たら3秒以内にClicker2 for PIC32MXボードのリセットスイッチ(赤いタクトスイッチ)を1回押してください。

これで自動的にブートローダーモードに入り、今コンパイルしたスケッチがマイコンにダウンロードされます。

書き込みが正しく実行されると下図のようにフラッシュメモリーの書き込みがdone、ベリファイがdoneになります。プログラムが正しければ、ボード上でプログラムが動作します。(書き込み終了からプログラム動作開始まで3秒程度かかります。)

ボード上のLED1とLED2が交互に点灯していることを確認してください。

これで最初のプログラム作成は完了です。


■もう1つスケッチを試してみる ~ボタン入力と点滅させる~

ここでは、タクトスイッチを使ったスケッチを記述してみます。

変数に値を代入して点滅時間を変更する内容も確認してみてください。

 


const int LED1 = 85; 
const int LED2 = 86;
const int SW1 = 87;
const int SW2 = 88;

int SW1_State = 0;
int SW2_State = 0;

unsigned long milsec = 100;

void setup() {

  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(SW1, INPUT);
  pinMode(SW2, INPUT);
     
}

void loop() {
  SW1_State = digitalRead(SW1);
  SW2_State = digitalRead(SW2);
  
  if(SW1_State == LOW){
    milsec = 100;
  }
  if(SW2_State == LOW){
    milsec = 1000;
  }

  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, LOW);
  delay(milsec); 
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(milsec); 

}

 

スイッチは、2つあり片方は87番、もう一方は88番です。よって最初にその内容を定数として記述してあります。

このスイッチはアクティブローです。スイッチを押していない時はHレベル、押したときがLレベルになります。

プログラムの内容は最初プログラムは2つのLEDが100ミリ秒間隔で交互に点滅しています。左型のスイッチ(87)を押すとそのまま100ミリ秒間隔で点滅します。右側のスイッチ(88)を押すと点滅する間隔が1秒間隔となります。再度左のスイッチを押すと100ミリ秒間隔となります。

 

そのほか、Arduinoの様々な命令が使えますので、Arduino IDEで作るPIC32MXの世界をお楽しみください。

 


■補足情報(適宜修正いたします)

バッテリーの電圧を読み取る場合の注意点です。Clicker2回路図を見ると、BATTERY VOLTAGEピンを読み取る前にBATT SENSE ENABLEピンをローに設定する必要があることがわかります。 読み取り後にBATT SENSE ENABLEをハイに戻すことをお勧めします。これは、センシング抵抗を介したバッテリの放電を防ぎます。

 

 

wpmaster

Si4703採用 FMラジオチューナークリック [CLICK-FM]

Si4703採用 FMラジオチューナークリック (CLICK-FM)は、シリコンラボラトリーズ社製のワンチップFMラジオチューナーIC、Si4703を搭載したFMラジオ受信ができるクリックボード(※1)です。電源電圧は3.3Vです。

※1:クリックボードは、mikroBUS規格のインターフェースを搭載した様々な機能性ボードの総称です。

制御は同期式シリアル通信のI2Cで行います。SCL及びSDA線はいずれも4.7kオームの抵抗でプルアップされています。

76MHz~108MHzのFM波を受信して復調することができます。出力段には2つの300mWオペアンプLM4864を搭載しており十分な音声レベルの出力を得ることができます。

Si4703はボリュームコントロール機能があるので、I2C通信で音声出力のレベルを設定できます。通常は-28dBから0dBまで指定できます。なおVOLEXTレジスタを1にセットすると-58dBから-30dBの範囲で指定できるようになります。

本体には3.5mm径のステレオジャックが搭載されています。ここに1m程度のイヤホンケーブル等を接続すると、その線がアンテナ線として機能します。必ずイヤホンやスピーカーケーブルを接続してご使用ください。

 

  • ワールドワイドなFMバンド設定、76~108MHz
  • シークチューニング機能
  • 自動ゲインコントロール(ACG)内蔵
  • 優れた過負荷耐性
  • アダプティブノイズサスペンション機能
  • 自動周波数コントロール機能
  • 電子ボリューム機能
  • LM4864オペアンプ搭載 (L,R両方)
  • アンテナ兼用の3.5mmイヤホンジャック
  • I2C通信による制御(2線式か3線式かの選択可能)
  • 電源電圧は3.3V

 

使い方の詳細はSi4703のデータシートをお読み下さい。


■本体回路図

クリックして拡大できます。


■インターフェイス端子(mikroBUS規格)

 

機能詳細 ピン名 Mikrobus logo.png ピン名 機能詳細
Si4703のGPIO2へ  GPIO2 1 AN PWM 16 NC
#リセットピン  #RST 2 RST INT 15 GPIO1 Si4703のGPIO1へ 
#セレクトイネーブル #SEN 3 CS TX 14 NC
NC 4 SCK RX 13 NC
NC 5 MISO SCL 12 SCL シリアルI2C クロック
NC 6 MOSI SDA 11 SDA シリアルI2C データ
+3.3V 電源入力 3.3V 7 +3.3V +5V 10 NC
Ground GND 8 GND GND 9 GND Ground

 

※NCは未使用ピンです。#記号は負論理です。

Si4703のGPIO1/2/3をデジタルLowに設定して消費電流を低減します。このレジスタ内の他のすべてのビットは、最後に読み取られた値に維持される必要があります。

 

3  #SEN 3線式の制御にした場合に使用します。2線式の場合にはSCLの立ち上がりエッジでSENピンがLレベルに設定されると転送が開始されます。データの最後では、SENピンをハイにした後、次のSCLの立ち下がりエッジで、データがラッチされます。(下図参照)

データシートの8ページ参照

11 I2C SDA I2Cスレーブデータ線 内部で4.7kオームでプルアップ済み
・7ビットI2Cスレーブアドレス:0x20 (固定)
・100KHz又は400KHz
12 I2C SCL I2Cスレーブクロック線  内部で4.7kオームでプルアップ済み
1,15 GPIO2

GPIO1

デフォルトではハイインピーダンスになっています。レジスタの設定で入出力方向及び論理を変えられます。詳しくはデータシートの14ページを参照下さい。

 


■I2C通信とレジスタ

本モジュールに搭載のを2線式で使用する場合のI2Cの7ビットスレーブアドレスは0x10に固定されています。Readで1を加算、Writeで0を加算します。

3線式の場合のタイミングダイアグラム

 

2線式の場合のタイミングダイアグラム

下記2線式での内容を解説します。(3線式についてはデータシートを参照ください。)

2線式、3線式どちらを使うかは本体電源投入時のピンの状態により決まります。2線式I2C通信を実行するには、本体の電源投入時にSDIOピン(I2CのSDAピン、11ピン)をLレベルにします。#SENピン(3ピン)をHレベルにすると、2線式になります。フローチャートは下記の通りです。(GPIO3は本ボードではGNDの方(=Noの方)に進みます)

レジスタ番地は、「Writeの場合」にはレジスタ0x02の上位バイトから始まり続いてレジスタ0x02の下位バイトとなります。そして、自動的にインクリメントされ0x03の上位バイト→下位バイト→0x04の上位バイト→下位バイト・・・と続きます。レジスタの最後の番地まで到達すると0x00に戻ります。I2Cのストップコンディションで終了と見なされます。

「Readの場合」にはレジスタ0x0Aの上位バイトから始まり続いてレジスタ0x0Aの下位バイトとなり、同様にインクリメントされます。レジスタの最後の番地まで到達すると0x00に戻ります。I2Cのストップコンディションで終了と見なされます。

 

例えばレジスタ0x07に値を書き込みたい場合には、レジスタ0x07を直接指定する方法はないので、レジスタ0x02からスタートして、10進めて(マイコンの場合には10回I2C_Writeを実行して)(0x02hの上位→下位→0x03の上位→下位・・・)0x07の上位バイトに到達して、そこから上位、下位の順番で書き込むことになります。この辺りはプログラムに工夫が必要となります。実際のプログラム例は本ページの例を参考にしてください。

レジスタ一覧は、データシートの22ページに記載があります。

 


■設定とプログラミング例

日本で使用する場合には特に0x05レジスタでバンド設定と、スペーシング設定を日本にする必要があります。

0x05レジスタの7:6ビット BAND[1:0]がバンドの国設定です。

BAND[1:0] Band select
00 87.5–108 MHz (US / Europe, Default)
01 76-108MHz(Japan wide band)
10 76-90MHz(Japan)

 

0x05レジスタの5:4ビット SPACE[1:0]がスペーシング(チャンネル間隔)の国設定です。

SPACE[1:0] Channel spacing
00 200 kHz (US / Australia, Default)
01 100kHz(Europe,Japan)
10 50kHz

 

よっていずれもレジスタの値を 01 にする必要があります。この設定を誤るとデフォルトの設定となってしまいFMラジオの受信ができません。実際の設定値はプログラム例で確認ください。

選局するFMラジオ局の周波数は、次の式で計算します。

Freq(MHz) = 0.1 x Channel + 76

最初の0.1MHzはスペーシング値、最後の76MHzはバンドの最小値となります。例えば東京の場合80.0MHzは東京FMですが、その場合には次のようになります。

80.0(MHz) = 0.1 × CH + 76

CH = 40  となるので設定値は40となります。この辺りの実装方法もプログラム例でご確認下さい。

 


プログラムのポイント

・レジスタに書き込むデータを配列として予め用意しておく。

・レジスタに書き込まれている既存の内容は新しいデータを書き込む前に一度コピーしておく。

・レジスタに値を書き込む場合には、必ず0x02レジスタから始まるので、目的のレジスタまでインクリメントする。

・レジスタの値を読む場合には、必ず0x0Aレジスタから始まるので、目的のレジスタまでインクリメントする。

・レジスタは16ビット幅なので、上位ビット→下位ビットの順で書き込む(読み込む)。

 

char powerOn, volume, i;
int freq, ChipID;
char shadowReg[32];

char stereo,str_size,flag_RDS,flag_Clock;

const char FM_all_Reg = 0x0F;
const char FM_0a0b_Reg = 0x02;

const char Si4703_address = 0x20;

void init(){

    FM_RST = 0;    
    delay_ms(1);

    FM_SEN = 1;
    delay_ms(1);
    
    FM_SDIO = 0;
    delay_ms(1);
    FM_SCLK = 0;
    delay_ms(1);

}

void modShadowReg(char reg, unsigned int value, char set_reset){

    char reg_pos;       //Index of register byte in shadow register
                        //Reading of Si4703 registers start from 0x0A-0x0F and then starts from 0x00-0x09
                            
    reg_pos = 12 + (reg << 1);  //Calculate position of register which needs to be modified

    if(set_reset == 1){         //Sets the desired bits in register
    
        shadowReg[reg_pos] = shadowReg[reg_pos] | (Hi(value));    //Split value to higher
        reg_pos++;
        shadowReg[reg_pos] = shadowReg[reg_pos] | (Lo(value));    //and lower nibble

    }else{ //Resets the desired bits in register

        shadowReg[reg_pos] = shadowReg[reg_pos] & ( ~Hi( value ) );  //Split value to higher
        reg_pos++;
        shadowReg[reg_pos] = shadowReg[reg_pos] & ( ~ Lo( value ) ); //and lower nibble
    }
}

void FM_Write(char reg, unsigned int value, char set_reset){
    
    char wr_cnt;
    char ii;

    wr_cnt = ( reg - 1 ) << 1;               //Calculate how much bytes need to be written
    modShadowReg(reg, value, set_reset);     //Modify register bytes

    I2C1_Start();
    I2C1_wr(Si4703_address);

    for(ii=16; ii<16+wr_cnt; ii++){
        I2C1_Wr(shadowReg[ii]);
    }
    I2C1_stop;
}

void FM_Read(char cmd){       //Reading of registers starts from 0x0A register
  
  char ii;

  if (cmd == FM_all_Reg){
     I2C1_Start();
     I2C1_wr(Si4703_address + 1 );
     
     for(ii=0;ii<30;ii++){
        shadowReg[ii] = I2C1_rd(1);
     }
     shadowReg[31] = I2C1_rd(0);
     I2C1_Stop;
  }
  
  if(cmd == FM_0a0b_Reg){           //Read only STATUS and READCHAN registers
     I2C1_Start();
     I2C1_wr(Si4703_address +1 );

     for(ii=0;ii<2;ii++){ shadowReg[ii] = I2C1_rd(1); } shadowReg[3] = I2C1_rd(0); I2C1_Stop; }
    }
  
    modShadowReg(0x02, 0x0300, 0);
    FM_Write(0x02, 0x0100, 0);      //Deactivate SEEK,keep

    while( STC_bit == 1 ){
        FM_Read(FM_0a0b_Reg);
        STC_bit = (shadowReg[0] & 0b01000000) >> 6;
        delay_ms(60);
    }
    
    FM_Read(FM_0a0b_Reg);
    SF_BL_bit = (shadowReg[0] & 0b00100000) >> 5;    
}

void FMClick_Init(){
    FM_RST = 1;               //Init chip done - 2wires interface car SDIO=0 et SDEN=1
    delay_ms(1);
    I2C1_Init(100000);        //Initialize I2C module for communication with FM Click board

    FM_Read(FM_all_Reg);
    ChipID = shadowReg[14] << 8;         //Save Chip ID before powerup.
    ChipID = ChipID | shadowReg[15];

    delay_ms(1);

    modShadowReg(0x07, 0x0081, 0);
    FM_Write(0x07, 0x8100, 1);           //Activate Crystal Oscillator

    delay_ms(500);

}

char FM_Activate(){
    
    unsigned int active;
    active = ChipID;
    
    FM_Read(FM_all_Reg);
    modShadowReg(0x02, 0x4801, 0);
    FM_Write(0x02, 0x4801, 1);      //Write ENABLE bit, disable Mute , RDS mode = Verbose
    delay_ms(200);
    
    while (active == ChipID){       //Wait for module powerup
        FM_Read(FM_all_Reg);
        active = shadowReg[14] << 8; 
        active = active | shadowReg[15]; 
    } 

    modShadowReg(0x04, 0xFFFF, 0);  //Write default Volume and RSSI Seek Threshold values 
    FM_Write(0x04, 0x1800, 1);      
    modShadowReg(0x05, 0xFFFF, 0);  //Write default values
    FM_Write(0x05, 0x105F, 1);      //RSSI seek Threshold = 0x10, band = Japan, Channel spacing = 100kHZ, Volume = max 
    delay_ms(110); 
    powerOn = 1;                    //Update powerOn flag 

    return shadowReg[0]; 

} 

void FM_Tune(unsigned int freq){

    unsigned int calc; 
    char STC_bit; 

    STC_bit = 0; 
    calc = freq; 
    
    calc = ((freq *10) - 7600) / 10;
    calc = calc | 0x8000;              //Set TUNE Flag
   
    if (powerON == 1){                 //Check for power state of FM click
        FM_Read(FM_0a0b_Reg); 
        modShadowReg(0x03, 0x83FF, 0); 
        FM_Write(0x03, calc, 1);       //Write modifiled frequency value + activate tune 
        delay_ms(60); 

        while (STC_bit == 0){
            FM_Read(FM_0a0b_Reg); 
            STC_bit = (shadowReg[0] & 0b01000000) >> 6;
            delay_ms(60);
        }
        
        FM_Write(0x03, 0x8000, 0);     //Set TUNE = 0
    }else{
        ModShadowReg(0x03, calc, 1);   //If power is off, only modify the shadow register
    }
 
}

void FM_Seek(char direction){
  char STC_bit, SF_BL_bit; 

    if(direction == 1){ 
        modShadowReg(0x02, 0x0300, 0); 
        FM_Write(0x02, 0x0300, 1);            //Activate SEEK direction up and Seek ON 
    }else{ 
        modShadowReg(0x02, 0x0300, 0); 
        FM_Write(0x02, 0x0100, 1);            //Activate SEEK direction down and Seek ON 
    } 
    
    STC_bit = 0; 

    while( STC_bit == 0 ){
        FM_Read(FM_0a0b_Reg); 
        STC_bit = (shadowReg[0] & 0b01000000) >> 6;
        delay_ms(60);
    }
}

void SetVolume(char vol){

    if ( ( vol >= 0 ) && ( vol <= 16) ){
        vol = vol & 0x0F;
        modShadowReg(0x05, 0x000F, 0);
        FM_Write(0x05, vol, 1);         //Write Volume value to SYSCONFIG2 register
        delay_ms(5);
    }
}
void main() {

    init();
    FMClick_Init();
    FM_activate();

    FM_Tune(800);        //80.0MHz
    
    while(1){
        if(Button(&PORTD,0,5,0)){
            FM_Seek(1);
        }

        if(Button(&PORTD,1,5,0)){
            FM_Seek(0);
        }
        
        if(Button(&PORTD,2,5,0)){
            if(volume<15){
                volume = volume + 1; 
            } 
            SetVolume(volume); 
        } 

        if(Button(&PORTD,3,5,0)){ 
            if(volume>0){
                volume = volume - 1;
            }
            SetVolume(volume);
        }
        
    }

}

 

※参考

FM変調とは?
FM変調とは、変調する信号の振幅に応じて搬送波の周波数を変化させる方法です。よって変調波の周波数は連続的に変化します。FM変調では搬送波周波数を中心として、変調信号とは違うスペクトラムが発生するので非線形変調となります。

wpmaster

TinyCLRのチュートリアル -1

ここでは、TinyCLR OSの基本的な使い方について、チュートリアル形式で掲載しています。

異なるハードウエアでも基本的に操作方法は変わりませんが、ここではFEZをベースに記載しています。

 

●システムのセットアップ

最初にソフトウエア等をインストールしておく必要があります。セットアップについてはこちらをご覧下さい。

 

●新規プロジェクトを開始

Visual Studioを起動し、File > New Projectを選択。

新しいプロジェクトを開始

ツリーにあるVisual C#の下からTinyCLRを選択します。

TinyCLR Applicationを選択して、プロジェクト名、保存場所などを設定して「OK」ボタンをクリックしてください。

TinyCLRプロジェクトを選択します

 

プロジェクトには一つC#というファイルがありそれがProgram.csです。このファイルにプログラムを書きます。

ソリューションエクスプローラ

もしソリューションエクスプローラーが表示されていない場合には、View > Solution Explorerメニューをチェックすると表示されます。

ショーソリューションエクスプローラを見ます

●NuGetパッケージの追加

TinyCLR OSはNuGetパッケージを使用します。すべてのライブラリは、NuGet経由でダウンロードされます。このためマシンにSDKをインストールしません。はありません。プロジェクトごとに、必要なライブラリの必要なバージョンをNuGetを使用してダウンロードします。

NuGetパッケージを管理するには、右側のソリューションエクスプローラでプロジェクトを右クリックし、 Manage NuGet Packagesをクリックしてください。

ショーソリューションエクスプローラを見ます

●ローカルホスティングパッケージNuGet

TinyCLR OSはまだ新しくリリースされたものです。メーカーのGHI社はまだNuGetにすべてのパッケージをアップロードしているわけではありません。よって使用可能なライブラリをダウンロードし、アーカイブを展開してローカルNuGetフィードにそれらを配置します。(※ローカルNuGetフィールドとは、自機PCのNuGetを配置する場所のことです。)

これを行うには、Visual StudioでローカルのNuGetフィードを指定する必要があります。

右側のソリューションエクスプローラでプロジェクトを右クリックし、 Manage NuGet Packagesをクリックしてください。その後、「パッケージソース」の設定アイコンを選択します。

ソースパッケージナゲッツの設定

 

次に新しいパッケージのソースを追加するために「+」をクリックします。

パッケージソースの追加

 

…アイコンを押して、NuGetパッケージが保存されているるローカルの場所を選択します。

パッケージは下記のURL先で「Libraries」のところでダウンロードして展開したフォルダを指定します。

http://docs.ghielectronics.com/tinyclr/downloads.html#visual-studio-project-system

ローカルフォルダNuGetパッケージを選択します。

 

インストール済みのNuGetパッケージを表示するには、「インストール済み」タブを選択します。

ショーインストール済みパッケージNuGet

 

「参照」タブを選択すると、ローカルのNuGetフィードにあるすべてのNuGetパッケージが表示されます。インストールされているものは、名前の前に緑のチェックマークが記載されています。

ローカルNuGetフィードを閲覧

 

パッケージのいずれかをインストールする場合は、インストールしたいパッケージの右端にマウスカーソルを持って行くと、下向きの矢印が表示されるのでクリックします。

ナゲッツは、パッケージを追加します

 

変更の確認というウインドウが出たら、OKを押します。

「ライセンスへの同意」という使用許諾契約に同意するとインストールできます。

NuGetのための契約に同意

下記のライブラリはインストールしておいてください。

 

・GHIElectronics.TinyCLR.Core

・GHIElectronics.TinyCLR.Devices

・GHIElectronics.TinyCLR.Drawing

・GHIElectronics.TinyCLR.Pins

・GHIElectronics.TinyCLR.Storage

 

以上で、TinyCLR OSを使用してプログラミングを開始する準備が整いました。

Tags:
wpmaster

MMA8491Q 3軸デジタル加速度センサークリック [CLICK-3AX]

MMA8491Q 3軸デジタル加速度センサークリック (CLICK-3AX)は、45°チルト検出器としても機能する高機能な3軸デジタル加速度センサーMMA8491Qを使用したクリックボード(※1)です。電源電圧は3.3Vです。

※1:クリックボードは、mikroBUS規格のインターフェースを搭載した様々な機能性ボードの総称です。

X軸、Y軸、Z軸それぞれの加速度を14ビットの分解能で+8g~-8gまでの範囲で計測します。計測は超高速の700マイクロ秒です。計測データはI2CインターフェースでMCUと通信できます。SCL線、SDA線はいずれも本ボード内でプルアップされています。

45°のチルト検出器は、傾いた向きの出力を元にして3つのLEDを点灯させます。本ボードには3つのLEDが実装済みです。Z軸は常に1gの重力が加わっているため置いておくと常に点灯しています(点滅)。また45°チルト検出の出力はボード内でトランジスタによって統合されており、外部のMCUに対して割込信号として出力が可能です。

様々なアプリケーションにお使い頂けます。

 

● MMA8491Q多機能3軸±8 gデジタル加速度計
● チルト検出器よって傾いた向きの出力を基に点灯するLEDを3軸それぞれ実装済み
● +8g~-8gまでの範囲を14ビットの分解能で計測、1mg/LSBの高精度
● ~700マイクロ秒の超高速データ出力時間
● シリアルI²Cバス
● 電源 3.3V
● mikroBUS準拠で様々なマイコン開発ボードに装着しやすい
● ボードサイズ 42.9×25.4 (mm) ※但し上部円形

 

使い方についてはMMA8491Qのデータシートをお読み下さい。

 

■本体回路図

 


■インターフェイス端子(mikroBUS規格)

 

機能詳細 ピン名 Mikrobus logo.png ピン名 機能詳細
NC 1 AN PWM 16 NC
NC 2 RST INT 15 INT チルト検出割込出力
イネーブルピン EN 3 CS TX 14 NC
NC 4 SCK RX 13 NC
NC 5 MISO SCL 12 SCL シリアルI2C クロック
NC 6 MOSI SDA 11 SDA シリアルI2C データ
+3.3V 電源入力 3.3V 7 +3.3V +5V 10 NC
Ground GND 8 GND GND 9 GND Ground

※NCは未使用ピンです。

シリアルI2CのSCLピン、SDAピンはそれぞれボード内で4.7Kオームの抵抗でプルアップされています。

3  EN MMA8491AのENピンに直結しています。このピンがHレベルで加速度センサのすべてが動作します。このピンがLレベルですべての機能が停止します。よって計測する場合にはこのピンはHレベルにする必要があります。
11 I2C SDA I2Cスレーブデータ線 内部で4.7kオームでプルアップ済み
・7ビットI2Cスレーブアドレス:0x55 (固定)
・100KHz又は400KHz
12 I2C SCL I2Cスレーブクロック線  内部で4.7kオームでプルアップ済み
15 INT 3軸傾き検出時割込信号出力
各軸のいずれかが0.688g より大きい(|φ| > 45°)時、Lレベル出力
各軸のいずれかが0.688g 以下(|φ|
≤ 45°)の時、Hレベル出力
※LED出力信号と逆論理

 


■LEDの点灯とINTピンの設定

3軸にそれぞれLEDが接続されています。各LEDは0.688gより大きい(|φ| > 45°)時点灯し、0.688g 以下(|φ|≤ 45°)の時消灯します。Z軸は常に地上では重力で1gがかかっています。(垂直時)

INTピンは3つのLEDのいずれかが点灯する時Lレベルになります。

マイコン等と接続する時、傾きの状態が45°から変化したことを検出する時等に使います。使わない場合にはオープンで構いません。どの軸の割込を有効にするかはボード上の”INT SEL”とシルク印刷のある0オームのジャンパー抵抗の有無で設定できます。デフォルトではすべての軸でジャンパーされています。割込として使いたくない軸がある場合には、チップ抵抗を外すことで無効にできます。


■I2C通信とレジスタ

本モジュールに搭載のMMA8491QのI2Cの7ビットスレーブアドレスは0x55に固定されています。Readで1を加算、Writeで0を加算します。最終的な8ビットアドレスはRead時0xAB、Write時0xAAです。

本モジュールからのデータの読み込みには「シングルリードモード」と「マルチプルバイトリードモード」の2つがあります。マルチプルバイトリードモードでは、自動的にレジスターアドレスがインクリメントされるのでX、Y、Z軸それぞれのデータを連続して読み込めます。データシークエンスは次の通りです。(データシート11ページ参照)

レジスタアドレスにはステータス情報及びX、Y、Z軸それぞれのデータが入ります。レジスタマップは次の通りです。

最初に0x00番地を読み状態を確認します。0x00番地には3軸それぞれに新しい値が入っているかどうかを示すビットがあります。(データシート15~16ページ参照)傾きに変化が生じて値が更新されたかどうかを確認できます。

マルチプルバイトリードモードの場合、自動的にアドレスはインクリメントされます。よって、例えばX軸のMSBをマスター側で読み込めば自動的にアドレスがインクリメントされてX軸のLSBが読めます。3軸合計で6バイトのデータとなります。


■軸データの読み込み手順

データの読み込み等、動作には次のシークエンスが必要です。

使い方としてはENピンは初期化時はLレベルにしておき、データを読みたい時にHレベルにします。

その後I2Cマスター側から読みたい軸のレジスタアドレスにアクセスしてデータを読みます。読み取った後は再度ENピンをLレベルにします。

3軸のデータは14ビット長です。レジスタには上位(MSB)8ビット[13:6]と、下位(LSB)6ビット[5:0]が2つのレジスタに分かれて入っています。例えばX軸のデータは次のようにMSB、LSBのデータが入ります。

LSBデータの入るレジスタの下位2ビット[1:0]は使いませんので通常はI2Cマスター側マイコンのプログラムでシフトさせるようにします。

 

14ビットデータとレンジの関係は次の通りです。  


■データの解析とプログラミング例

ここでは最も基本的な使い方として、I2Cマスター側がデータを読み取った後のデータ処理方法と、プログラミング例を示します。

例としてX軸のデータとして8gのデータがAddress1と2に入っていた場合を考えます。

(1) 8gなので14ビットデータは 01 1111 1111 1111 となります。よってレジスタには下記のようにデータが入ります。

Address1: 0111 1111

Address2: 1111 11xx

(2) 最初にMSBを8ビット分(LSB分)左にシフトして、LSBデータを入れるスペースを作ります。それにはMSBの値に0x100を積算します。

0111 1111 * 0x100  =  0111 1111 0000 0000

(3) LSBを加算します。

0111 1111 0000 0000 + 1111 11xx  =  0111 1111 1111 11xx

これで16ビット長のデータとなります。

(4) 下位2ビットは切り捨てるので右に2ビットシフトする

0111 1111 1111 11xx >> 2  =  0001 1111 1111 1111

これでデータの成形ができました。

(5) この有効値14ビットのデータを実際のgに変換します。正負の判定は14ビット目が0か1かで判断します。0ならば正又は0、1ならば負の範囲であることがわかります。IF文を使う時は0x2000とのビット演算ANDで0又はそれ以外として判定可能です。実際にgに変換するプログラム例は次の通りです。

if (out_x & 0x2000) {
  
  x_axis = (0x4000 - out_x) / -1024.;  

}else{

  x_axis = out_x / 1024.;

}

 

これをもとに実際のプログラミング例を下記に示します。

※あくまでも一例ですので実際はお使いの言語、環境等に合わせてお使い下さい。

 

char STATUS;
unsigned int OUT_X, OUT_Y, OUT_Z, oldOUT_X, oldOUT_Y, oldOUT_Z;
float temp;

void MMA8491Q_Multiple_Read(char *p_STATUS, int *p_OUT_X, int *p_OUT_Y, int *p_OUT_Z){
  char reg_data[7];

  reg_data[0]=0x00;
  I2C1_Start();
  I2C1_Write(MMA8491Q_ADDR,reg_data,1,END_MODE_RESTART);
  I2C1_Read(MMA8491Q_ADDR,reg_data,7,END_MODE_STOP);

  *p_STATUS=reg_data[0];
  *p_OUT_X=((0x100*reg_data[1]+reg_data[2])>>2)&0x3FFF;
  *p_OUT_y=((0x100*reg_data[3]+reg_data[4])>>2)&0x3FFF;
  *p_OUT_Z=((0x100*reg_data[5]+reg_data[6])>>2)&0x3FFF;
}

void Display_X_Value() {                                                         
  
 if(OUT_X&0x2000){
      temp=(0x4000-OUT_X)/-1024.;
    }
    else {
      temp=OUT_X/1024.;
    }
  
    sprintf(out, "%2.3f", temp);          
  }
}

void Display_Y_Value() {                                                   
 
    if(OUT_Y&0x2000){
      temp=(0x4000-OUT_Y)/-1024.;
    }
    else {
      temp=OUT_Y/1024.;
    }

    sprintf(out, "%2.3f", temp);
  }
}

void Display_Z_Value() {     
    if(OUT_Z&0x2000){
      temp=(0x4000-OUT_Z)/-1024.;
    }
    else {
      temp=OUT_Z/1024.;
    }

    sprintf(out, "%2.3f", temp);            
  }
}

void Display_values(void) {
  Display_X_Value();
  Display_Y_Value();
  Display_Z_Value();
  Delay_ms(100);
}

void main(){
  
  while(1) {
    MMA8491Q_EN = 1;
    Delay_ms(500);

    MMA8491Q_Multiple_Read(&STATUS, &OUT_X, &OUT_Y, &OUT_Z);
    MMA8491Q_EN = 0;

    if(STATUS==0x0F) {
      Display_values();
    }
  }
}

■本製品のサポートについて

本製品はメーカーがリリースしているMMA8491Qのデータシート及び本製品の回路図を見て、その使い方をご理解頂き実際にプログラミングやマイコンから本製品を制御できる技術者向けの製品です。

本製品はMMA8491Qの機能をそのまま使った製品ですので、使い方はMMA8491Qのデータシートにてご理解頂く必要があります。本ページでは参考として使い方のプログラム例を示していますのでこれらをご参考にお使い下さい。

本製品の技術的なサポート、I2C通信による使い方、ハードウエアの設計方法等について当方マイクロテクニカではサポートを行っておりません。ご質問頂きましてもご回答致しかねます。本製品のMMA8491Qについての使い方等で技術的なご質問がある場合には、直接メーカーのサポートをご利用下さい。(但しデータシートに既に記載されている内容については回答が得られませんので、必ずデータシートをよくお読みの上、ご質問下さい。)

 

wpmaster

ピンマッピングと命名

Zerynthは、マルチボードプログラミングを可能にします。

ピン名を命名できます。Zerynthでは、広く普及しているArduinoに似た方法でピンを使えます。例えばデジタルピンDxと記載でき、xはボード上の使用可能な物理ピンの番号です。(MCUのピン番号ではありません)

同様に、アナログピンAxとなります。

Zerynthではピンの属性について上記のピン指定に追加されます。例えば、PWMをピンD3で使用する場合D3.PWMとします。

DIOは、デジタルピンのデフォルト属性であるDxADCは、アナログ端子のデフォルトですAx

さらに、digitalWriteおよびdigitalReadはGPIOに状態を書き込み、又は読み込みをするコマンドですが、これらは属性の指定を必要とせず、常にピン名のみを指定すれば使えます。

いくつかの例を見てみましょう:

Zerynth Arduino/Wiring Note
x=digitalRead(D1) x=digitalRead(D1)
x=digitalRead(A1) x=digitalRead(A1) Use Ax pin as Dx pin
x=analogRead(A1) x=analogRead(A1)
x=analogRead(D1.ADC) x=analogRead(Ax) Use of ADC on Dx pin
digitalWrite(D1,HIGH) digitalWrite(D1,HIGH)
digitalWrite(A1,HIGH) digitalWrite(A1,HIGH) Use of Ax pin as Dx pin
pwm.write(D1.PWM,period,duty) analogWrite(D1, value)
pwm.write(A1.PWM,period,duty) analogWrite(D1, value) Use of Ax as PWM pin
x=icu.capture(D1.ICU,samples,time)
x=icu.capture(A1.ICU,samples,time)
can.init(D30.CANRX, D31.CANTX) Not yet released
spi.init(D11.MOSI, D12.MISO, D13.SCK) Not yet released
i2c.init(D14.SDA,D15.SCL) Not yet released

 

Zerynthでは名前は常に大文字です。以下のPIN名はZerynth組み込みコマンドに含まれています:

  • Pin Names:
    • D0 to D127 representing the names of digital pins.
    • A0 to A31 representing the names of analog pins.
    • LED0 to LED7 representing the names of the on-board installed LEDs.
    • BTN0 to BTN3 representing the names of the on-board installed buttons.
  • Pin Attributes (Dx.YYY):
    • MISO, MOSI, SCK representing the attributes of SPI pins.
    • SCL, SDA representing the attributes of I2C pins.
    • RX, TX representing the attributes of Serial pins.
    • DAC representing the attributes of DAC pins.
    • CANTXCANRX representing the attributes of CAN pins.
    • PWM representing the attributes of PWM pins.
    • ICU representing the attributes of ICU (input capture unit) pins.

 

この使い方(名前の付け方、属性の付け方)は、Zerynthコンパイラがコンパイルする時にピンの間違った使い方をチェックするために必要です。

ただし、このピンの命名方法はZerynthの提供する高度な機能であり、最もよく使われるアナログおよびデジタルの基本的な使い方では、自動的にZerynthがピンの正しい方法を設定します。

また、全てZerynthの各初期化関数(can.init()spi.init()i2c.init())などでは引数として(CAN0I2C0SPI0SERIAL0)のようにショートネームを使うことができます。例えば、デフォルトのパラメータでシリアルポート0を開く場合にはstreams.serial()と記述でき、シリアルポート1を開く場合にはstreams.serial(SERIAL1)と記述します。

wpmaster

Zerynthプログラミングガイド

ZerynthスクリプトはPythonの3.4で開発されています。

Pythonの標準ライブラリ関数、型及び演算子などほとんどはZerynthでも利用できます。組込マイコンへの適用のためいくつかの高レベルな処理機能は除かれています。これによりコードサイズを小さくしています。ZerynthとPython 3.4の標準ライブラリとの違いVMガイドにてご紹介しています。

以下のガイドは、Python3.0公式の標準ライブラリガイドに従い、Pythonの構文、タイプ、演算子、および定数の詳細と共に掲載されています。

 

ライブラリの大部分は、(スクリプトで使用されるように、インポートが必要な)モジュールの集合から構成されています。いくつかのモジュールは、Pythonでボードが制御できるようにZerynthにて提供しされています。また有名ないくつかの特定のセンサーやシールド用に専用のインターフェイスを提供します。

 

 

 

wpmaster

TinyCLR OS イントロダクション

TinyCLR OSは、米GHI社が開発したMicrosoftのVisual Studioを使用して組込機器のファームウエアを開発するNET Micro Frameworkを利用するOSです。

始めるために必要なものは、Visual Studio、マイクロテクニカで販売しているTinyCLRデバイス、およびUSBケーブルです。プログラムの開発環境は無償で使えます。

 

G80モジュール
G80 FEZ Panda II

TinyCLR OSは、.NET開発者のために作られています。TinyCLR OSでは.NET上でスレッド、メモリ管理、タイマー、イベントハンドラ、およびその他多数の機能を使用できます。ハードウェアと協調するため、TinyCLR OSは、Windows10のIoTコア拡張APIに似たAPIを持っています。これによりGPIO、UART、SPI、I2C、ADC、DAC、PWM、およびその他多くの機能が利用可能です。

すべてのライブラリは、NuGetから入手できます。このため、SDKをインストールする必要はありません。単にプロジェクトごとに、必要なライブラリ、必要なバージョンをNuGetからダウンロードするだけです。NuGetって何?っていう方はこちらをお読みください。

  1. まだVisual Studioの2017をお持ちでなければ、マイクロソフト社のサイトから自由にダウンロードしてインストールできます。→Visual Studio Community 2017
  2. インストールする際には、.NET desktop developmentを選択してください。
  3. 続いてTinyCLR OS 用Visual Studioの拡張パック(Visual Studio Project System)をインストールしてください。
  4. USBケーブルを使ってPCにデバイスを接続します。まだTinyCLR OSデバイスを持っていないのであれば、マイクロテクニカから購入しましょう。TinyCLR OSのために作られたボードです。
  5. Visual Studioを起動しプロジェクトを新規作成します。TinyCLR Applicationの下にあるC# > TinyCLRを選びます。
  6. いくつかのコードを追加してF5キーを押すと、アプリケーションのデバッグを開始します。
  7. TinyCLR OSは新しくリリースされたOSなので、GHI社はまだNuGetにすべてのパッケージをアップロードしていません。現在は、こちらの使用可能なライブラリをダウンロードしてファイルを展開し、それらをローカルNuGetフィードに置いてください。
  8. もしあなたのデバイスのファームウェアをアップデートする必要がある場合は、ファームウェアをダウンロードしてこちらの説明に従いお使いのデバイスを更新してください。

あなたが.NETMFの既存のユーザーであっても問題ありません。TinyCLR OSは.NETMFと完全に独立しており、サイド・バイ・サイドで動作します。

TinyCLR OSはまだ非常に新しくリリースされたOSです。よってまだいくつかのライブラリおよび機能は欠落している可能性があります。補完のため計画が進行中です。リリースノートを見てください。のロードマップでGHI社が計画していることを確認できます。

自分のハードウエアで、TinyCLRが動作するか確認したいですか?移植ガイドをチェックして、どのように開始したらいいか確認してください。

※原文:http://docs.ghielectronics.com/tinyclr/intro.html

 

→[次のステップ]Tiny CLRチュートリアルへ

Tags:
wpmaster