フォト
2017年5月
  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      
無料ブログはココログ

« 2016年1月 | トップページ | 2016年3月 »

2016年2月の12件の記事

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月27日 (土)

eVY1モジュール用プログラムをポケット・ミクに移植してみた

スイッチサイエンスさんの「eVY1モジュール」のサンプルプログラム evocaloid_smf.ino
ポケット・ミクに移植しました。

eVY1モジュールはポケット・ミクと同じヤマハの歌唱合成シンセサイザーICのNSX-1を
搭載している製品で、Arduinoなんかで制御出来ます。

eVY1モジュールとポケットミクの違いは、マイコンからの制御がeVY1モジュールは
シリアル通信(MIDI)でのMIDIメッセージを使っているのに対して、ポケット・ミクは
USBホストからのMIDIイベントパケット送信となります。

移植はMIDIメッセージからMIDIイベントパケットに変換すれば良いのですが、
USB-MIDIライブラリがその処理機能を有しているので簡単でした。

ポケット・ミク対応
   開発環境
      ・Arduino UNO Rev3
      ・Arduino IDE 1.6.7
      ・USB HOST シールド 2.0
      ・ポケットミク
                        
   追加利用ライブラリ
      ・USB Host Library Rev.2.0 https://github.com/felis/USB_Host_Shield_2.0
      ・USBH_MIDI https://github.com/YuuichiAkagawa/USBH_MIDI

      2016/04/18 訂正 USBH_MIDIライブラリは USB Host Library Rev.2.0 に含まれていました。入手不要です。

開発環境はArduino IDE 1.0x系は使えません。USB Host Library Rev.2.0が対応していないようです。
Arduino IDE 1.6.7 で  evocaloid_smf.ino をコンパイルすると1.0x系からFlashメモリ(プログラム領域)
へデータを格納する際の宣言方法が変更になっためエラーとらります。
修正が必要となります。
    prog_uchar SMF_ROM[] PROGMEM  の prog_ucharを const uint8_t に変更します。

修正したソースを置いて置きます。
  ダウンロード evocaloid_smf.ino (62.4K)


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関連の理解をしていきます。


2016年2月21日 (日)

「ポケット・ミク」を購入しました

FaceBookのIcigojam-FANグループにて話題になっていて、衝動的にポッチってしまいました。

Dscn4909

到着した製品をみると「しょぼい、これで5000円かぁ」と残念感があったのすが、
パソコンに繋げてMIDI音楽編集ソフト「Domino」にて音を出してみると、MIDI音源と
して利用できていい感じです。気に入りました。

演奏の様子です(曲は2001年宇宙の旅)
「Propeller始めました(22) ポータブルゲーム機の実装 7」で利用したMIDIファイルを
利用しました。



デジカメでの動画撮影なので音は綺麗に拾えていませんが、しっかりとした音が出ました。

次にArduinoに繋げての制御を行ってみました。
「ポケット・ミク」はUSB接続の必要があります。手持ちのUSBホストシールドを使って
接続しました。

下記のサイトを参考(というかそのまま利用)にしました。
・ふくろうティムのblog -arduino & ポケットミク 
http://ural-owl.blog.jp/archives/198080.html
・ポケット・ミクカスタマイズガイド v.1.03 r2.5
http://otonanokagaku.net/nsx39/data/nsx39midiguide.pdf

Dscn4913

ミクさんの声でドレミファソラと音が出ます。

電子工作で音を操るのって意外と面白そうですね。
MIDIに関してはもう少し色々と調べて理解していきたいです。

MIDI(特に仕様)に関する良さそうな記事
  ・MIDIについて 長嶋 洋一
   http://nagasm.org/ASL/midi03/index.html

  ・Laboratory "U" - MIDIの学習
   http://www1.plala.or.jp/yuuto/midi/index.html

  ・FISH&BREAD - 技術的読み物 SMF(Standard MIDI File)フォーマット解説
   http://maruyama.breadfish.jp/tech/smf/

それともう一つ、プロペラIchigoJamからもう少し簡単にポケット・ミクを操作したいです。
USBまわりも色々と勉強したいところです。

ますはUSBの仕様の理解から始めないといけないということで、手持ちのインターフェス誌
の関連記事を見つけました。2014年12月号のPICマイコンを使った学習環境がよさそうです。

Dscn4918

2016年2月19日 (金)

Propeller始めました(22) ポータブルゲーム機の実装 7

先日実装したSDカードモジュールを早速活用して、MIDIファイルの再生実験をやってみました。


Parallax のForumの次の情報と公開ライラリを利用して実装しました。
  ・Music Synthesizer object with General MIDI sound set
    http://forums.parallax.com/discussion/111867/music-synthesizer-object-with-general-midi-sound-set

CPUだけで、そこそこの音が出ています。専用の音源ICを搭載しようかとも思ったのですが
不要ですね(デジカメで撮影したのでドラム音とかが拾えていないです)。

仕様的には、ソース内に次のような記載があります。

01

20音同時再生できるようです。音色もGM1サウンドセット+GM1ドラムセットをサポート
しているみたいです。

プログラム開発者が公開している実演奏(mp3形式)のを聞くと、かなり綺麗な音です。
スピーカーが悪いのか、もっと良い音が出るようです。

フォーラムを見ているとSDカードや音源処理でChaNさんの記事の引用が多いです。
ChaNさんの「ELM - 楽しい電子工作  オーディオ関係」等、色々と勉強になる記事が多いです。

Parallax Propeller関連の情報は少ないですが、量より質的のよい的な感じで色々と
勉強になります。

2016年2月18日 (木)

Aliexpressの買い物で久々に紛争を起こしました

Aliexpressにてステッピングモータを3個購入したところ、袋の中で端子が折れていて
転がっている状態のものが、2つありました。

梱包がダメダメでクッション材無し、外装から接続ピンが突き出でて穴も開いています。

01
           (上の写真の金属片が折れて袋内をさまよっている接続ピンです)

販売者に写真を送り、文句をいうと「代替え品を送ります」との回答でした。
昨年の11月のお話です。

しかし待っても、代替品は来ません。
何回かメールを送り、受け取り待ち期間の延長を申請しましたが(これをしないと、
時効で相手に商品代金が支払われてしまう)、何だかんだ理由を付けて拒否されました。

結局、注文から90日待ったので、今更商品が届くことはないと思い、紛争を起こしまた。
やり取りは次のような感じです。

相手からの回答は、「紛争をキャンセルしてくれれば、代替品を送る」とのこと。
さすがにこれ以上待てないので、キャンセルせず、返金を求めていくことにします。

02

2016/02/23 追記
  売り手が返金に応じてくれました。
  英語が苦手でも諦めずつGoogle翻訳等を使ってでも交渉すれば交渉は出来ます。

2016年2月17日 (水)

Propeller始めました(21) ポータブルゲーム機の実装 6

注文していたmicroSDカードもージュールが到着したので早速使ってみました。
基板上に抵抗やコンデンサが乗っているので、3.3V系のマイコンではSPI接続で
簡単に利用することが出来ます。5個で$2.98は非常に安いです。

01

到着した製品はこんな感じです。SDカード入れてみるとプッシュして飛び出す形式ではなく
取り出し時は引っ張って取り出します。

Dscn4892

5品をSPI接続にて動作確認して特に問題無し。
早速、LameStationの拡張端子に直接差し込んで利用するための基板を作成しました。

Dscn4897

SDカードだけでSPIを利用するのはもったいないのでSPI接続 16Mバイトフラッシュメモリ
も一緒に乗せました。

Dscn4900

片面基板をピン端子に接続するために、秋月電子で購入した基板用リードフレームを
利用しました。

02

若干、ピンが細くてピンソケットに挿すと緩いので、ハンダでコーティングして厚さを
増強しました。

基板用リードフレームは材質はICのピンと同じ感じなので強度的に心配がありますが、
ピンヘッダが取り付け出来ない片面基板には重宝します。

次に動作確認です。
問題無し。良かった、一発で動作しました。
これでブレッドボードによる外部回路が無くなりすっきりしました。

Dscn4902

せっかく、ここまでやったので以前作成したランチャープログラムの異常系の実装に
着手しました。

異常系として、
  SDカードリーダが無し
  SDカードが刺さっていない状態、
  SDカードがFAT形式でないケース
  SDカード内にあるべきファイルが無い
  液晶モジュールが接続されていない
等です。

これらの異常環境をわざと起こして、実験していたのですが、
本日初めてspin言語に異常等の例外を捕まえる機構があることを発見しました。

今まで、異常発生時にフリーズしてしまうことがあったのですが、
これは異常発生におけるabort状態だったのでした。

このabort状態をキャッチして異常発生の対応が可能です。しかも実に簡単です。

LameLCD液晶表示ドライバの例
  if false == \lcd.Start(gfx.Start)
        cm.Str (String("LCD devie error.",13))

メソッドの前に’\’(半角バックスラッシュ)を付けることでそのメソッドまたは、
その下位のメソッド内のメソッド終了命令abortをキャッチできます。
逆に’\’を付けないとabort命令によりabort状態となり次の処理も実行できません。
見た目上はフリーズした感じになります。

通常はメソッドの実行を終了する場合はreturnを使います。この場合は呼び出し元に
戻りますがabortを使って終了する場合はabort状態となり’\’を使った呼び出し
レベルまで戻ります。’\’を使っていない場合はメインの処理も終了となります。

この機構をもう少し早く知っていれば、異常系の実装の他にデバッグやテストで
もう少し楽が出来ていました。
abortをキャッチしないのでフリーズしたと勘違いしていたケースもあります。

以前作成したライブラリは全くこの機構を使っていないので、見直しと修正が必要です。

標準ライブラリもこの機構を意識して作られています。
SDカード用のライブラリはメソッド内で異常が発生した場合、エラーコードとエラーメッセージを
セットしてabortしてくれています。最上位の一か所でabortをキャッチしてセットされた
エラーメッセージの表示するだけで異常の状況が分かります。

試し異常系として
異常系として、
  SDカードリーダが無し
  SDカードが刺さっていない状態、
  SDカードがFAT形式でないケース
  SDカード内にあるべきファイルが無い
をやってみると、その状況と分かるエラーメッセージが表示出来ました。

SDカードリーダ部(今回作成したモジュール)を取り外してプログラムを実行すると
次のようなメッセージ(2行目の内容)が表示れれました。

Dscn4908

この機構、異常系の状況検出において非常に強力な機能です。
メソッドやライブラリを自作する場合、returnとabortを使い分けることで異常系の
実装もきちんと行えます。

そういえば、arduinoで例外処理(Try Catch Exception)を利用したことがないなぁ
今度使う時は意識してプログラミングをしてみよう。

2016年2月14日 (日)

SPI接続のカラー液晶モジュールの動作確認

Aliexpressで安価なカラー液晶モジュールを入手しました。
LCDコントローラとしてILI9341を採用しているモジュールです。
製品としてはSDカードスロット付き、タッチパネル機能が無いものです。

2.4" 240x320 SPI TFT LCD Serial Port Module 3.3V PBC Adapter SD ILI9341

2.4

安いので、あまり期待していなかったのですが、視野角・発色も良く良い製品でした。
ただし、2.4インチだと若干小さいです。一回り大きい2.8インチ、3.2インチでもよかったかも..

arduino Unoでの動作確認
動作確認には下記のスケッチを利用しました。
  Adafruit 2.8" TFT Touch Shield v2 - Graphics Test
  https://learn.adafruit.com/adafruit-2-8-tft-touch-shield-v2/graphics-test

Arduino IDE 1.06では、コンパイルするとエラーが発生します。
関数 yield() が利用出来ないようです。Arduino IDE 1.6.7では問題ありませんでした。

Arduino UNO

製品としては問題なく動作しました。表示も速いです。

次に、プロペラ(Parallax Propeller)にて試して見ました。
動作確認には次の公開ソースを利用しました。
  Propeller Object Exchange - ILI9341 SPI driver
  http://obex.parallax.com/object/723

配線においてちょっと悩みました。サンプルプログラムではピン接続が次のように
なっているのですが、nRESET と RS が何処に接続するのは今一分かりません。

nRESET= 22

RS = 23

nCS = 24

MOSI = 25

SCLK = 27

MISO = 26

色々試してRS は 製品ボード上のD/Cピン、 nRESETは RESET と判明しました。

Propeller

現在製作中のLameStationも次期バージョンはカラー液晶にしても良いかも..

2016年2月10日 (水)

Propeller始めました(20) ポータブルゲーム機の実装 5

前回ランチャーメニューを作ったのですが、英語だとちょっと表示が寂しいので、
日本語表示が出来たらいいなぁと思いやってみました。

取りあえず、日本語表示部分の仮実装が出来ました。

Dscn4850

方式としてはSDカード上に漢字フォントデータファイルを置いておいて、該当文字コードの
フォントを取得して液晶ディスプレイに表示するという感じでやってみました。

今後の拡張を考えて、文字コードはUTF8を使っています。
SDカード内のテキストファイルを読んで表示なんかもやってみたいです。

フォントの表示はLameStationのスプライト表示機能にて行っているので、
やろうと思えば1文字単位で”うねうね”と動かすことも出来ますね(たぶん)。

日本語表示部分は次のような感じです。

PUB demo4
    setPos(0,0)
    setFontSize(24)
    setColor(0,1)    
    addHSpace(4)
    Str(String("日本語表示"))
    newLine   
    setFontSize(12)
    setColor(1,0)
    addSpace(2,2)
    Str(String("取りあえず出来ました。"))
    newLine   
    setFontSize(10)
    addSpace(2,2)
    Str(String("UTF8・マルチフォント対応!"))
    newLine   
    addSpace(4,2)
    Str(String("ただし半角カタカナ非対応")) 
    lcd.DrawScreen  

面倒な座標指定を減らす感じにしています。

次のステップとしては、これをライブラリ化して、動作確認として
SDカード上の日本語テキストファイルを読んで表示するなんてのをやろうと思います。
テスト後はランチャーメニューの日本語化をやります。


2016年2月 5日 (金)

Propeller始めました(19) ポータブルゲーム機の実装 4

実質的にSDカードからブードが出来ることが分かったので、今度はブートするプログラムを
選択できるランチャーメニューを実装しました。

ランチャープログラムはEEPROM上に書きこみます。
ハードウエア的にリセットがかかるとEEPROM上のランチャーメニューが起動します。

ランチャープログラムは、選択されたプログラムをSDカードからロードしてメインRAM
に書きこみます。その後ソフトウェアリセットにより、ロードしたプログラムが実行されます。

Dscn4830

操作としては、
ジョイスティック操作でメニューをスクロールさせて起動したいプログラムを選択します。
選択中のプログラムの説明を下段に表示します。

リセットボタンを押すことランチャープログラムがロードされて、メニュー画面に戻ります。

実際の操作の様子
(デジカメでの動画撮影なのでちょっと映像が劣化しています)


メニューに表示されるプログラム一覧は、SDカード内のテキストファイルに定義して
います。ランチャープログラムがその内容を読んで表示します。

ランチャーさえあれば、簡単にプログラムの入れ替えが出来ます。
SDカードだとプログラマやシリアル接続不要ですね。
こほ方式は色々と使えそうです。

ランチャープログラムのソースはこんな感じです。

{{
    LameStation SDカードローダー
}}

CON
    _clkmode        = xtal1 + pll16x
    _xinfreq        = 5_000_000
  
    'SDカード PIN接続
    sdDO  = 16        'EX0(P16)
    sdCLK = 17        'EX1(P17)
    sdDI  = 18        'EX2(P18)
    sdCS  = 19        'EX3(P19)

VAR
    'メニュー情報
    byte    text[2048]  'メニューファイルバッファ
    long    index[32]   'インデックス
    long    count       '登録数
    long    pos         'メニューファイルバッファ用ポインタ

    'メニュー表示用
    long    mnTop       'タイトル表示開始先頭番号
    long    mnSelect    'メニュー上の選択位置(0~3)

OBJ
    cm          : "LameSerial"
    sd          : "SD-MMC_FATEngine"
    lcd         : "LameLCD"
    gfx         : "LameGFX"
    txt         : "LameText"
    fn          : "LameFunctions"
    ctrl        : "LameControl"
    font_6x8    : "gfx_font6x8_normal_w"
    font_6x8b   : "gfx_font6x8"
    font_4x6    : "gfx_font4x6"

PUB Main | ctrlChange,prevCtrl,ctrlCode,fname,p
    mnTop := 0          'ランチャーメニューリスト先頭
    mnSelect := 0       '選択カーソル先頭
    prevCtrl := 0
    ctrlCode := 0
    cm.Start

    lcd.Start(gfx.Start)        
    gfx.ClearScreen(0)
  
    count:= LoadMEnu    'メニューデータをSDカードからロード
    DrawMenu            'ランチャーメニュー表示

    'ランチャーメニュー 操作
    repeat
        '操作状態取得
        ctrl.Update     
        prevCtrl := ctrlCode
        if ctrl.B 'タイトルを選択決定した
            p:= index[mnTop+mnSelect]
            repeat while text[p++] <> 0 
            fname := @text[p]
            quit           
        if ctrl.Down
            ctrlCode := ctrl.Down
        elseif ctrl.Up
            ctrlCode := ctrl.Up
        else
            ctrlCode := 0       
        if prevCtrl <> ctrlCode
            '操作に変化があった場合は表示の更新を行う             
            if  ctrl.Down 
                if mnSelect < 3
                    mnSelect++
                else
                    if mnTop < count-4
                        mnTop++
                    else
                        mnTop := 0
                        mnSelect := 0 
            if ctrl.Up
                if mnSelect > 0
                    mnSelect--
                else
                    if mnTop > 0
                        mnTop--
                    else
                        mnTop := count-4
                        mnSelect := 3
            if ctrlCode <> 0
                DrawMenu 
   
    Run(fname)

'メニュー画面表示
PUB DrawMenu |title,fname,info,i,p
    'メニュー部    
    gfx.ClearScreen(0)
    txt.Load(font_6x8b.Addr, " ", 6, 8)
    txt.Str(string("[Menu]"),0,0)
    
    'タイトルリスト部
    txt.Load(font_6x8.Addr, " ", 6, 8)
    repeat i from mnTop to (mnTop+4 <# count)-1               
        title := @text[index[i]]
        if (i<10)
            txt.Dec(i,12, 8 + (i-mnTop)<<3)     
        else
            txt.Dec(i, 6, 8 + (i-mnTop)<<3)     
        txt.Str(String(":"), 17, 8 + (i-mnTop)<<3)
        txt.Str(title, 23, 8 + (i-mnTop)<<3)
    txt.Str(String("*"), 0, 8 + (mnSelect)<<3)
       
    '選択したタイトルの説明表示
    p:= index[mnSelect+mnTop]
    repeat while text[p++] <> 0 
    repeat while text[p++] <> 0 
    txt.Load(font_4x6.Addr, " ", 4, 6)  
    txt.box(@text[p],0,40,128,18)    
    lcd.DrawScreen    

'指定イメージファイルによるブート
PUB Run(filePathName) : statusVal | statusStr 
  ifnot sd.partitionMounted
    Mount(0)

  statusStr := \ sd.bootPartition(filePathName)
  statusVal :=   sd.partitionError

PRI Mount(partition) : statusVal | statusStr
  ifnot sd.CogStatus
    Start    
  statusStr := \ sd.mountPartition(partition)
  statusVal :=   sd.partitionError

PRI Start : okay | statusStr     
  ifnot sd.CogStatus
    okay := sd.FATEngineStart(sdDO, sdCLK, sdDI, sdCS, -1, -1, -1, -1, -1)

'SDカードからメニュー情報を取得する
PUB LoadMenu | d,i
    pos  := 0
    i := 0

    'SDカードのマウント
    sd.fatEngineStart(sdDO, sdCLK, sdDI, sdCS, -1,-1,-1,-1,-1) 
        sd.mountPartition(0) 
    if strcomp( sd.listEntry(@myfname), @myfname )
        abort

    'メニューファイルのオープン    
    sd.openFile( @myfname, "R" ) 
    if sd.partitionError
       cm.Str( string("File I/O Error.",13) )
       abort
    
    'データの読み込み
    index[i]:=0
    repeat while d := sd.readByte    
       if d == "|" 'カラム区切り
            text[pos++] := 0                  
       elseif d == $0a 'LFは行終端
            text[pos++] := 0
            index[++i]:= pos
       elseif d => 32  'CRはスキップ '通常の文字    
            text[pos++] := d
   
    'ファイルのクローズ
    sd.closeFile
    
    'パーティションのアンマウント
    sd.unmountPartition 
    'エンジン解放
    sd.FATEngineStop
    result := i+1

DAT
'ファイル名
myfname         byte "menu.txt",0    

2016年2月 1日 (月)

Propeller始めました(18) ポータブルゲーム機の実装 3

プロペラを使ったポータブルゲーム機 LameStationにmicroSDカードを搭載しようと挑戦中です。

Dscn4822

オリジナルのLameStationはプレイするゲームを変更するたびにパソコンに接続して
開発環境でコンパイルして書き込む必要があり、少々使い勝手が悪いです。

何とかmicroSDカード上の任意のイメージファイルを選択してブートする方法は無いかと
試行錯誤中です。

取りあえず、SDカードは認識してファイルのアクセスは出来るようになりました。
秋月電子のマイクロSDカードスロットDIP化キットを使って下記のような感じの回路を
ブレッドボード上に実装して接続しました。

回路図はparallax社のホームページで公開している「SD Card Data Storage」
参考にしました。

SDカードからのブートについては、microSDカードリーダ搭載の純正ボードの
"Propeller Board of Education "にて実現可能な記事を見つけました。
記事:  Make One Program Launch Another

流用で出来そうです。何とかなりそうです。
プロペラってこんなこと出来るんですね。

話変わって、"LameStation"の"Lame"ってどういう意味かを調べたら、"不自由な"
っていう意味合いなのですが、確かに不自由と言えば不自由か..

2016/02/02 追記
SDカードからのブートが出来ました。プログラムはライブラリの関数を利用することで
簡単に実現出来ました。プログラムは次のような感じです。

{{
    LameStation SDカードローダー
}}

CON
    _clkmode        = xtal1 + pll16x
    _xinfreq        = 5_000_000
  
    'SDカード PIN接続
    DO  = 16        'EX0(P16)
    CLK = 17        'EX1(P17)
    DI  = 18        'EX2(P18)
    CS  = 19        'EX3(P19)

OBJ
  sd   :   "SD-MMC_FATEngine"

PUB go
  Run(String("TANKBA~1.EEP"))

PUB Run(filePathName) : statusVal | statusStr 
  ifnot sd.partitionMounted
    Mount(0)

  statusStr := \ sd.bootPartition(filePathName)
  statusVal :=   sd.partitionError

PRI Mount(partition) : statusVal | statusStr
  ifnot sd.CogStatus
    Start    
  statusStr := \ sd.mountPartition(partition)
  statusVal :=   sd.partitionError

PRI Start : okay | statusStr     
  ifnot sd.CogStatus
    okay := sd.FATEngineStart(DO, CLK, DI, CS, -1, -1, -1, -1, -1)
 

ライブラリではロングファイル名に対応していないため、8.3形式のファイル名で
ファイルを指定する必要があります。
8.3形式のファイル名はWindowsのコマンドプロンプトで"dir /X"で確認できます。

下記の写真はSDカードから起動した様子です。

Dscn4824

SDカードは容量4Gバイト FAT16です。
起動するプログラムはSDカード上にEEPROMイメージの形式のファイルとして
"TankBattle.eeprom"というファイル名で書きこんでいます。
8.3形式のファイル名だと"TANKBA~1.EEP"となります。

EEPROMイメージの形式の作成は、開発環境にて出来ます。
ただし、私が使っている PropellerIDE で作成したイメージではブート出来ませんでした。
Parallax社純正の開発環境 PropellerToolで作成すると正常起動しました。

一々別の開発環境で作成するのも面倒なので、openspinというコマンドラインで
利用するコンパイラを利用することで作成することにしました。バッチコマンドを作成して、
そのコマンドにソースのアイコンをドロップすることで簡単に作成できるようにしました。

バッチファイル makerom.bat

中身

openspin %1 -e -L "C:\Program Files (x86)\PropellerIDE\library\library" -L E:\Propeller\lamestation\lamestation-sdk-rc2-0.4.0

« 2016年1月 | トップページ | 2016年3月 »