フォト
2017年3月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

PIC

2016年3月 8日 (火)

PIC24FJ64GB002を使ったUSBホストの実験 5

*** 2017/02/22 更新 公開プログラムに不具合がありました。差し換えました。
*** 2017/02/22 更新 記事を追記しました。

ソフト的な問題(システムエクスクルシブの処理の不具合)が解決できたので、基板実装しました。

MIDI-INとシリアル入力でUSB接続のMIDI音源機器の制御が出来ます。
取りあえず、今回の実験の成果物とします。

Dscn4988

ポケット・ミクを接続してMIDI-IN経由で演奏している様子

Dscn4987


回路図的なもの(画像をダウンロードして表示すると大きい図になります)

02_2

基板実装図

01

プログラムソース
未熟なソースですが置いておきます。

ダウンロード UsbMidi.X.zip (141.6K) (不具合があり差し換えました)

2017/02/22 追記

かずぽんさんのご指摘で、動作確認したところ、システムエクスルシブメッセージの処理に
ミスがありました。かずぽんさんをはじめ、ご利用頂い方々に対しまして、ご迷惑おかけしました。修正して差し換えました。

IchigoJamで動作確認しました。

01

IchigoJam用の演奏プログラムは、IchigoJam開発者の福野さんのブログ
「福野泰介の一日一創」「YAMAHA NSX-1 x IchigoJam eVY1とBASICを使ったお手軽DTM」
にて公開しているプログラムを改造して利用しました。

福野さんの記事ではeVY1を使ってIchigoJamで演奏させています。


プログラムソース
CC BY 福野泰介 - Taisuke Fukuno / @taisukef

1 'KAERU's song (MIDI)
5 BPS31250
10 M="CDEFEDC EFGAGFE C C C C CDEFEDC "
20 D="0-0-0-0C0-0-0-0C0P0P0P0P0-0-0- 1"
21 LET [0],#F0,#43,#79,#09,#11,#0a,#00,#05,#03,#71
22 LET [10],#43,#02,#29,#0a,#06,#09,#03,#2c,#07,#71
23 LET [20],#6e,#0a,#0a,#0a,#0a,#01,#36,#0e,#24,#66
24 LET [30],#02,#29,#f7
27 UART1:LC0,-1:FOR I=0TO 32:?CHR$([I]);:NEXT
30 GOSUB @PLAY
40 BPS0:END
200 @MIDI:UART1:LC0,-1:IF N ?CHR$(#90+H,N,V);:WAITW:?CHR$(#80+H,N,0); ELSE WAIT W
210 UART0:LC0,0:RTN
300 @PLAY:CLS:W=5:P=0:LET[0],69,71,60,62,64,65,67
310 C=ASC(M+P):?CHR$(C)
315 B=ASC(D+P):?CHR$(B)
320 IF C=ASC("2") WAIT W
330 IF C>=ASC("A") AND C<=ASC("G") N=[C-ASC("A")]:H=0:V=127:GOSUB@MIDI
334 IF B!=ASC(" ") N=B:H=9:V=50:GOSUB@MIDI
338 WAIT 30
340 P=P+1:IF P<LEN(M) GOTO 310
350 RTN


21行から24行が歌詞用でデータです。27行でそのデータをポケットミクに送っています。
データの作成は下記のサイトを利用しました。
・ポケットミクで好きな歌詞を歌ってくれるMIDIファイルを作成
  http://aisot.org/39/mikuex
上記のサイトの「歌詞入力」にて、
  かえるのうたがきこえてくるよががががいちごじゃむうた
と入力して、対応する歌詞データを作成します。
  05:03:71:43:02:29:0a:06:09:03:2c:07:71:6e:0a:0a:0a:0a:01:36:0e:24:66:02:29:
これをテキストエディタで置換等の加工します。

歌詞の登録は次のコマンド(システムエクスルシブメッセージ)を送ります。
  F0 43 79 09 11 0A 歌詞スロット 歌詞データ F7

歌詞スロットは0,歌詞データ分は作成したデータを指定します。
本当は歌詞データの参照位置を指定したりする必要がありますが省略しています。
何回か再生すると、歌詞がずれたりします。

2016年3月 3日 (木)

PIC24FJ64GB002を使ったUSBホストの実験 4

MIDI-IN端子を取り付けて、シーケンサーソフトを使った動作テストを出来るようにしました。

08

Dscn4932

回路的には、MIDIの作法に従って間にフォトカプラを入れています。
MIDIのプロトコル自体はシリアル通信ですが、物理層的にUARTとは違いますね(たぶん)。
カレントループという方式(電流の大小を1、0とする)なのでその対処が必要です。

取りあえず、回路図を作成してから結線しました。

07
TXDをPICマイコンのRxDに接続してデータを拾います。

この端子にamazonで購入した安いUSB-MIDI変換アダプタを取り付けてパソコンに
接続しました。

早速、Dominoにて適当なmidiファイルを使って演奏させると、ポケット・ミクから
音が出ました。

ただし、ミク声を出すためのシステムエクスクルシブ命令を使うと、ミクの声が
出るものの、奇声でなんか違う。全体的な演奏も怪しくなります。
演奏を止めても、音が鳴りっぱなしになったりもします。

システムエクスクルシブの処理がダメそうです。可変長データの処理がまずそうです。
MIDIメッセージからMIDIイベントパケット4バイトずつに分割する箇所が怪しいかも..

デバッグはやるとして、異常時の音の鳴りっぱなしはマズイですね。
自動・手動でポケット・ミクをリセットする機能も欲しい。

PIC24FJ64GB002を使ったUSBホストの実験 3

方向的にMIDIコンバーターの実装に進んでいます。

シリアル通信で外部MIDIメッセージを受信し、USB-MIDIインターフェスのMID音源I機器に
演奏データを送信します。下図のように真ん中でインタフェース変換を行います。

04

取りあえず実装し、動作確認としてIchigoJamからMIDIメッセージを送信してみました。
IchigoJam間はGNDとTX-RX接続の2本だけです。

03

MIDI端子(IN/OUT)ってピンが5本あるのでてっきり双方向かと思っていたのですが、
一方向だったんですね。この接続で初めて知りました。
相手からの応答の通信仕様が無いので疑問に思っていました。

実際にやってみて初めて理解出来ることってありますね。

動作の様子



IchigoJam用の演奏プログラムは、IchigoJam開発者の福野さんのブログ「福野泰介の一日一創」
の記事「YAMAHA NSX-1 x IchigoJam eVY1とBASICを使ったお手軽DTM」にて公開している
プログラムをそのまま利用しました。福野さんの記事ではeVY1を使ってIchigoJamで演奏
させています。

IchigoJamは単体で動作し、プログラム修正が容易なので実験や動作確認には良いですね。

今回の実験において、
  「4MHzの外部クロック供給、内部オシレータ(FRC)でもいけるんじゃね?」
と思い、試してたところ動いちゃいました。

システムクロックの精度に敏感なUSB、シリアル通信とも取りあえず動作しているので
以後これでいっちゃいます。

01

4MHzのセラミック発振子を取り外せてちょっとすっきりしました。

回路図(電源供給の三端子レギュレータとmicroUSBコネクタを除く)的にも、
パスコンと抵抗とコネクタだけです。

(2016/03/08 修正 回路図のD+とD-の接続が間違っており、修正しました)

02


ソフト的に追加した機能は、
・シリアル通信周りの機能の実装
・MIDIメッセージ→MIDIイベントパケットに変換処理の実装
・USB周りの異常系(USBデバイスの抜き差し、USBデバイス電源落ち等)
・電源管理(USB機器が未接続の場合はアイドル状態にする)
です。

まだまだ、動作不安定なところがあります。
・USBデバイスを切断した場合に割り込みで呼ばれる関数から復帰後、フリーズした
  ような状態になります。全く原因が分からず、仮対処として割り込み発生時に
  ソフトウェアリセットをして復旧しするようにしました。
  これは後々何とかしたい。

・でたらめなMIDIメッセージ(内容が正しくない)を流し続けるとポケット・ミクで
  演奏できなくなる。
  IchigoJamのシリアル出力は、画面に表示される内容も垂れ流しとなるので、
  接続している間、MIDIメッセージとしてでたらめなメッセージも送ってきます。
  MIDIメッセージ→MIDIイベントパケットの変換で不正メッセージは取り除いて
  いるのですが、何故か演奏出来なくなります。こうなると手動でリセットしないと
  復旧で出来ない。これは原因を見つけて対処が必要。

ソフト的な問題なのでハードとしてはMIDI端子を付けて、基板実装いたしましょう。

2016年2月28日 (日)

コンパイラ XC16 V1.25用の Peripheral Libraries のインストール

PIC24FJ64GB002の開発環境として、
  開発環境 MPLAB X IDE 3.25 +コンパイラ MPLAB XC16 Compiler v1.25
  Microchip Libraries for Applications をインストールして利用していたのですが、
  これだけでは、肝心のマイコンの周辺機器(I/O、I2C、UART、PWM等)のライブラリが
  使えないことに疑問を持っていました。

  以前8ビットPICマイコンを使ったバージョンでは使えていた感があったのですが..

色々と調べると XC16 v1.25からは周辺機器を使うライブラリ(Peripheral Libraries)が
別配布になったと判明。 MPLAB® XC Compilersのサイトに別途公開されていました。
  ・PIC24/dsPIC Peripheral Libraries v2.00 - Windows
早速ダウンロードしてインストールしてみました。

01

早速、ドキュメントのサンプルをコピペしてコンパイルするとなぜかエラー発生。
現在調査中です。

2016/03/01 追記

エラーが発生したのは、プロジェクト内のヘッダーファイルの中の宣言等が
競合を起こしているためでした。解決しました。

PIC24FJ64GB002を使ったUSBホストの実験 2

ここ数日、マイコンによるUSB機能の利用、MIDI関連の利用に関する試行錯誤をやっていましたが
PIC24FJ64GB002で何とかUSB-MIDIの利用が出来るようになりました。


それにしてもPIC24FJ64GB002に関する情報が少ないです。
MIDIメッセージからMIDIイベントパケットの変換等の処理はArduino用のライブラリ USBH_MIDIを
流用しました。
USBH_MIDI
https://github.com/YuuichiAkagawa/USBH_MIDI 

後はMIDI端子を付けたり、SDカード上のMIDIファイルを再生したりやってみたいと思います。

2016年2月22日 (月)

PIC24FJ64GB002を使ったUSBホストの実験 1

ポケット・ミクArduino+USBシールドで制御出来ることが分かったのですが、
ちょっと大がかりな構成です。

そこで、USBホスト機能をもつPICマイコンでもっと簡単に制御出来ないものかと思い、

インターフェス誌2014年12月号の記事を思い出して、実験を開始しました。
USB周りの知識は無いので今回を機会に勉強したいと思います。

なんとか、USB-MIDIホストを1チップマイコンで実装してI2Cまたはシリアル通信で
他マイコンから簡単に制御できるようにしたいです。
レガシーMIDI端子への変換やってみたいです。

Dscn4918

まずは、USB探偵団の記事の回路をブレッドボードに実装しました。

Dscn4919

PIC24FJ64GB002という、Microchip社のUSBホスト機能付きのマイコンを利用します。
16ビットマイコンでプログラムメモリ64kバイト、SRAM 8kバイトと比較的容量が大きいです。

回路は単純で電源とUSB接続周りだけの結線です。
これだけでUSBホストが実装出来るのなら、何とか使いこなしていきたいですね。
プログラム領域が大きいのでUSB機器の制御+αが出来ますね。

開発環境は念のため最新版にしました。
  開発環境 MPLAB X IDE 3.25 +コンパイラ MPLAB XC16 Compiler v1.25

インターフェス誌記事のプログラムソース類をダウンロードしてソースをコンパイルします。
PICマイコンはあまり使い込んでいないというか、書き込み方法等忘れていました。

コンパイルは問題ないものの、書き込みでエラーが出ます。
手持ちのPICkit3(ぱちもん)で書き込みを行うも、接続エラーが発生して書けません。
やはり、ぱちもんを使うのは入門としては良くないですね。

原因切り分けをしようと、書込み時の状況が分かる別のプログラマソフト MPLAB IPE
使うことしました。問題なく書き込み出来ました。

MPLAB X IDE 3.25の書き込み関連の設定に問題があるようですが、今回は諦めることに
しました。取りあえず書き込み出来たのでこれで良しとします。

  => 2016/02/29 追記
      MPLAB X IDE 3.25でも書き込み出来ました。プロジェクトプロパティのPICkit3の
        Power:Power tartget ciruit from PICkit3に✔を入れる、
        Clock:Use FRC .. の✔を外す
      にて対応出来ました。
      
下図はMPLAB IPEの画面です。プログラマとの接続、PICマイコンへの接続が順に追って
確認出来るので接続確認に良いです。HEXファイルを指定して書き込みます。

01

次にインターフェス誌記事のツールを実行し動作確認を行うと問題なく利用出来ました。
PICマイコン経由でポケット・ミクからデスクプリタ情報を取得出来ました。
このツールを使うとUSBデバイス利用の作法を手順を追って確認出来ます。

02

あとは、インターフェス誌記事を読んでUSB関連の理解をしていきます。


2014年12月21日 (日)

初めてのPICマイコンの利用(Lチカ)

この前買った秋月電子の「お楽しみ袋」PICマイコン(PIC16F84A)が入っていました。
このマイコンは古いけど割と人気のあるもの見たいです。

Dscn3366

捨てるのも勿体無い。これを機会にPICマイコンを使ってみようと、
プログラマー pickit3 PIC programmerを購入し、試してみました。

PICマイコンについては知識0です。本日朝からネットで資料を参照し試行錯誤です。
試したのはLチカなのに意外と手こずってしまいました。
以下は、作業メモです。

1)プログラマーの購入
  pickit3 PIC programmer をAliexpress で購入しました。
  評価が高くて安いのもを選択しました($15.93)
  01
 
  まあ、ぱちもんですよね。これ

2)開発ツールの入手とプロジェクトの作成
  まずはC言語で開発したいと思い、次のツールダウンロードしてインストールしました。
  ・総合IDE環境 MPLAB X IDE (MPLABX-v2.26-windows-installer.exe)
  ・MPLAB XCコンパイラ XC8(xc8-v1.33-full-install-windows-installer.exe)
 
  入手方法およびインストール等の情報は下記の情報を参考にさせて頂きました。
    -1) マルツオンライン はじめてのPICマイコン
    -2) 技術系のど根性 PICマイコンで遊ぶ 超入門編(C言語)
    -3)  ツール・ラボ MacでPICマイコン電子工作入門
   
   C言語のプロジェクトの作成手順は上記2)の情報が大いに役立ちました。

   03 

3)回路図

02
   手持ちのセラミック発振子 12Mhzを使ってクロックを供給しています。
   pickit3の接続は、
    nanoblog PICkit3を使ってMPLABからプログラムを焼く方法
    PICkit™3インサーキット デバッガの使い方
   
    を参考にしました。

   Dscn3364      
   
  4)プログラムの作成
    C言語のプロジェクトの作成手順は
    技術系のど根性 PICマイコンで遊ぶ 超入門編(C言語)
    を参照して作成しました。

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>

#pragma config CP = OFF, PWRTE = ON, WDTE = OFF, FOSC = HS
#define _XTAL_FREQ 12000000

int main(int argc, char** argv) {
    TRISA0 = 0x00;

    while(1){
        RA0 ^= 1;
        __delay_ms(500);
    }
 return (EXIT_SUCCESS);

}
まず、最初にハマったのは、#pragma configでPICマイコンに設定する方法です。
セラミック発振子 12Mhzでシステムクロックを供給したのですが、
その設定方法が全く分かりませんでした。
FCSC = HS の指定が必須でした。さらに #define _XTAL_FREQで12Mhzを指定します。

次に_delay() 関数をAVRと同じように使ったらLEDが点灯したままの状態でした。
__delay_ms()を使ったらうまく行きました。

4)pickit3 PIC programmer  での書き込み
  これもかなりハマってしましました。全然書きこめません。

  開発環境からpickit3は認識するのですが、pict3とPICマイコン間の接続でエラーと
  なりました。
  何回やってもダメです。回路やプログラムを見直してもダメです。

  初めてのチャレンジで
  ジャンク品PICマイコンぱちもんプログラマー を使うもんじゃないですねぇ
  何もかも信用できずです。自分のやり方も含めて..

  基本に戻って、テスターで信号を調べると、「pickit3が怪しい」と判明。
  2番ピン VDD から 5Vが出ていないです。0Vです。
  これではPICマイコンに電源供給が出来ません。

  ダメ元で、別電源にて5VをPICマイコンに供給して書き込みを行うと、
  今度は正常に書き込み出来ました。
  う〜ん、明らかにおかしいがまあ、良しとします。こういう仕様なのかもしれません。

  Dscn3362

  一日がかりで、1ビットのLEDピコピコが出来ました。
  内部クロック(CR発振)での動作も試してみましたがちゃんと動きました。

  たかが Lチカですが、多くことを学べました。