2012年09月20日

Propeller用ArduinoベースIDE PellerduinoをLinuxで動作させる

先日以下のgithubリポジトリで開発を開始しましたArduino IDEベースのPropeller用IDE Pellerduinoですが、あんまりそれから進んでません^^;
https://github.com/yishii/Pellerduino

Arduino IDEはMacOSX、Windows、Linuxに対応していますが、先日私がPellerduinoとして手当てしたのはMacOSXの範囲まででした。
その後、@ksksue氏がこのPellerduinoを使用してUbuntuで動かすレポートを記載されました。ありがとうございます〜。

ksksue.com UbuntuへのPellerduinoインストール手順
http://www.ksksue.com/wiki/doku.php?id=wiki:propeller:pellerduino:install

というわけで、さっそくPellerduinoにLinux用Propeller gccを組み込み、antから展開されるようにしてみました。今回は、Linuxの64ビット環境のみの対応です。

git clone https://github.com/yishii/Pellerduino.git

本例(Ubuntu 10.04LTS 64bit)でビルドする場合、antを入れておきます。その他のディストリビューションではなければ入れておいて下さい。
sudo apt-get install ant

それから、buildディレクトリに入って、antでビルド・実行します。

# ant run

リリースパッケージの生成方法
ant runした時のパッケージにはバージョン番号などが入っていません。そういったものも含めてリリースパッケージを生成するには、ant distを使用します。

ant dist

すると、以下のような問い合わせが表示されます。

dist:
[input] Enter version number: [0101]

適当に0200とでも入れます。
ビルド・リリースパッケージ生成が終わると以下のように表示されると思います。



linux-dist:
[echo]
[echo] =======================================================
[echo] Arduino for Linux was built. Grab the archive from
[echo]
[echo] build/linux/arduino-0200-linux.tgz
[echo] =======================================================
[echo]

linux64-dist:

そうすれば、上記のログに吐かれているパスに開発環境のアーカイブが出来ます。ファイル名、pellerduino-${version}-ターゲット.tgzにしとこう・・・。取り出して展開するとリリースされているArduinoと同様の構成のパッケージになっているはずです。

実行結果。適当に入れたバージョン番号のIDEになりました。
linux_pellerduino_ss.jpg



PICで楽しむAndroidアクセサリの自作
後閑 哲也
技術評論社
売り上げランキング: 42008

posted by いしいっち at 07:10| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2012年09月16日

PIC24FJ64GB002でADK(microchip_solutions_v2012-08-22を使う)

マイクロチップ社のMicrochip Application LibraryはPICの各種マイコンにいろいろな機能を提供してくれるライブラリとサンプルコードの集合体で無料でダウンロードできます。

http://www.microchip.com/mal

最近更新があったようで、2012/8/22版が最新になっています。それまでの版では、Android 4.1でサポートされたAOA2.0の端末と接続した際、PICのADKライブラリがADKバージョンを確認して弾くため、ADKとして認識してくれませんでした。改造すれば認識するようにはなるのですが。

さて、上記の8/22版ではそんな改変せずとも、AOA2.0端末と接続してADKが認識してくれます。
(AOA2.0のHIDや音が通るわけではありません)

というわけで、テスト的にPIC24FJ64GB002に焼きこんでみたら動作しました!
マイクロチップのサンプルコードBasic Communication DemoはPIC24FJ64GB004用があるので、それを一部変更してPIC24FJ64GB002で動作させられるようにしています。

差分パッチファイルを以下にアップします。unified diff形式です。Microchip Application Libraryのスタックは非常に便利で魅力あるものですが、オープンソースで改変を共有するのにルールが難しいようなので、その点使いづらいですね。
PIC24FJ64GB002_ADK_patch_for_microchip_solutions_v2012-08-22.patch.zip


PICで楽しむAndroidアクセサリの自作
後閑 哲也
技術評論社
売り上げランキング: 42008

posted by いしいっち at 10:54| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2012年06月18日

Arduino Mega ADKで「Error: OSCOKIRQ failed to assert」発生の対策を打つ

Arduino Mega ADKで遊んでいて、電源投入直後に以下のようなログが出て動作しない現象に数回出くわしたので、なんでかな〜と思いつつ、その内見かけなくなってたので忘れていたのですが、今日出たので少し調べてみました。

ログ内容
Error: OSCOKIRQ failed to assert

Arduinoスケッチは、以下のようなシンプルにテスト用に書いたスケッチ。Arduino 1.0.1と、先日Googleからリリースされたばかりの新しいADKのパッケージ「adk_release_20120606」を使用しています。

#include <Max3421e.h>
#include <Usb.h>
#include <AndroidAccessory.h>

AndroidAccessory acc("Yasuhiro ISHII",
"dummyADK",
"",
"1.0",
"",
"0000000012345678");

void setup()
{
  Serial.begin(115200);
  acc.powerOn();
}

void loop()
{
  byte buffer[64];
  if (acc.isConnected()) {
    acc.read(buffer, 1, 1);
  }
}

この「Error: OSCOKIRQ failed to assert」ってログは、USB Host shieldのライブラリのMAX3421E::powerOn()の以下の部分で出力されています。

/* MAX3421E initialization after power-on   */
void MAX3421E::powerOn()
{
    /* Configure full-duplex SPI, interrupt pulse   */
    regWr( rPINCTL,( bmFDUPSPI + bmINTLEVEL + bmGPXB ));    //Full-duplex SPI, level interrupt, GPX
    if( reset() == false ) {                                //stop/start the oscillator
        Serial.println("Error: OSCOKIRQ failed to assert");
    }

でもって、MAX3421E::reset()は、こんな感じ。rUSBIRQ.bmOSCOKIRQが立つまたは256回タイムアウトするまで待ちます。

/* reset MAX3421E using chip reset bit. SPI configuration is not affected   */
boolean MAX3421E::reset()
{
  byte tmp = 0;
    regWr( rUSBCTL, bmCHIPRES );                        //Chip reset. This stops the oscillator
    regWr( rUSBCTL, 0x00 );                             //Remove the reset
    while(!(regRd( rUSBIRQ ) & bmOSCOKIRQ )) {          //wait until the PLL is stable
        tmp++;                                          //timeout after 256 attempts
        if( tmp == 0 ) {
            return( false );
        }
    }
    return( true );
}

で、ここの処理のお手本を確認するため、Maxim社が公開してる、Max3421e EVボード用のサンプルコードで見ると、無限に安定待ちビットが立つまで待つようです。データシートを読んでみたのですが、安定待ちに必要な時間を見つけることができませんでした。書いてないということはないと思うので、見落としてるかも、です。

というわけで、では上記ループ何回待ってたら安定待ち出来てたのか、適当ですが、以下のような改変をしてみてみました。
/* reset MAX3421E using chip reset bit. SPI configuration is not affected   */
boolean MAX3421E::reset()
{
//  byte tmp = 0;
short tmp=0; // 変更yishii
    regWr( rUSBCTL, bmCHIPRES );                        //Chip reset. This stops the oscillator
    regWr( rUSBCTL, 0x00 );                             //Remove the reset
    while(!(regRd( rUSBIRQ ) & bmOSCOKIRQ )) {          //wait until the PLL is stable
        tmp++;                                          //timeout after 256 attempts
        if( tmp == 0 ) {
            return( false );
        }
    }
Seria.print("pll stabilized");//変更yishii
Serial.println(tmp);//変更yishii
    return( true );
}
すると、だいたい350回くらいのところでOSCOKビットが立ってました。
というわけで、もちろん上記のようなMAX3421E::resetに改造を加えても回避可能ですが、ライブラリの派生版のせいでいろいろスケッチに互換性を失うのも嫌なので、ここはシンプルに、スケッチ側でpowerOnを呼び出すタイミングを遅らせたいと思います。
MAX3421Eクラスのコンストラクタが実行されてから、MAX3421E::resetで安定待ちするまでに時間待ちをはさめば良いので、以下のようにしました。コンストラクタが実行されてから、実際にsetupが実行されるまでの時間は、処理系やArduinoのマイコンのスタートアップ処理に依存するので、こんなことしなくても問題無くUSB Hostの初期化できる環境もあると思いますが・・・。

#include <Max3421e.h>
#include <Usb.h>
#include <AndroidAccessory.h>

AndroidAccessory acc("Yasuhiro ISHII",
"dummyADK",
"",
"1.0",
"",
"0000000012345678");

void setup()
{
  Serial.begin(115200);
  delay(5); // ★5ms遅らす
  acc.powerOn();
}

void loop()
{
  byte buffer[64];
  if (acc.isConnected()) {
    acc.read(buffer, 1, 1);
  }
}

これで認識してくれるようになりました。
簡単なことなのですが、知らないうちは、はまりました。。。

ところで新しいADKのライブラリ見るとArduino IDE1.0対応をメインの改変としていると思います。
でも一部気になる所が、、、
$ diff ADK_release_0512/firmware/arduino_libs/AndroidAccessory/AndroidAccessory.cpp
ADK_release_20120606/arduino_libs/AndroidAccessory/AndroidAccessory.cpp
86,87c86,87
<     if (protocol == 1) {
<         Serial.print("device supports protcol 1\n");
---
>     if (protocol >= 1) {
>         Serial.print("device supports protocol 1 or higher\n");
あれ、もしかして新しいADKのバージョンリリースされるのかな〜??と勘ぐってしまいました。^^;


Arduino Mega ADK
Arduino Mega ADK
posted with amazlet at 12.06.18
スイッチサイエンス
売り上げランキング: 20537
Arduino Leonardo(+Headers)
Arduino Leonardo(+Headers)
posted with amazlet at 13.01.17
GHEO SA
売り上げランキング: 43,094
posted by いしいっち at 15:06| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。