進捗 (2)

setBlock(id, meta)を実装するためにブロックの書き換え方法をずーっと探していて、ようやく方法がわかったので、現在、id, metaの組み合わせから新しいブロックのデータへの変換(対応)を実装中。ブロックの種類が多いのでなかなか大変。

カテゴリー: Mod開発, 未確定情報 | コメントする

進捗 (1)

チャットエリアからのコマンド入力がCommandEventなのがわかったので、CommandEventから/python, /pymcpipyディレクトリ内のファイルを指定出来るようにはなった。
ただし、コマンドを登録していないせいか「不明なコマンドです←[問題箇所]」って表示されてしまう。

コマンドを入力すると不明なコマンドです←[問題箇所]と表示されてしまう。処理は実行されている。
コマンドを入力すると不明なコマンドです←[問題箇所]と表示されてしまう

その後、元のRaspberryJamModの org.java_websocket パッケージをインポートして、Pythonからの接続部分&処理部分を移植中。

APIServer, APIHandler, APIHandlerClientOnly, Location, MCEventHandler, MCEventHandlerServer, WSServerを移植中。
何でこんなにイベントハンドラーがあるのかよくわからないけど、とりあえず重要そうなところから実装している。

現在のところ、helloworld.pyの処理のmc.player.getPos()だけ値を返すようにして他は何もしない状態で処理が完了するようになった。getPos()で値を返さないとプロセス(スレッド?)が残ってマイクラでの保存が終了しない(開始しない?)で終われない。

カテゴリー: Mod開発, 未確定情報 | コメントする

調査メモ (1)

Minecraft Forge Eventシステム概要

Minecraft Forge API#イベント

カテゴリー: Mod開発, 未確定情報 | コメントする

方針変更

RaspberryJamModがどうやってMinecraftのJavaとPythonの橋渡しをしているのかを調べて、Minecraftのチャットエリアからの入力を受け取り、該当するPythonを起動してPython内からMinecraftとのデータのやり取り、結果の表示等いくつかに分けて調べてみる。

カテゴリー: Mod開発, 未確定情報 | コメントする

RaspberryJamModのリビルド

RaspberryJamModのファイルセットをGitHubからダウンロードした状態だと古いバージョン用のファイルとかもビルドされるようなので、どうしたもんだろう?

そのままでビルド

そのままの状態でどうなるか、./gradlew genEclipseRunsを実行してみた。
なんかForgeのソースのSNAPSHOT(?)をダウンロードしにHTTPで取得しに行ってHTTPSでリクエストしろとのエラーでBUILD FAILED。
対応するForgeが古いので1.12とかのForgeをダウンロードしに行ってるもよう。

新規のMdkにソースファイルを入れる

このページを見て、新規のMdkのソースファイルを入れ替えてみる。
https://mcforge.readthedocs.io/en/1.15.x/gettingstarted/

いろいろexamplemodをraspberryjammodと書き換えてみたけど、書き換え部分に不備があったみたいでエラー。

ちょっとraspberryjammodという名前を使わずにexamplemodの方に合わせた方が早いかも…

examplemodにファイルを1つ1つ持って行く事にして、Vec3w.javaを持って行ったら、いきなりnet.minecraft.util.Vec3が無くて困った…探したら、net.minecraft.util.math.Vec3dが型がdoubleで合っているので、それに変更…先は長い…

次にLocation.javaを持って行き、これもutil.mathに移動していたBlockPosを親としてVec3dのxCoord, yCoord, zCoordをx, y, zに変更するだけで終了。

次はAPIHandler.javaを持って行ったが、これが数多くのimportを行っているけど、かなりの数のクラスが移動していて、さらに見つからないクラスがいくつもあった。これはかなり手こずりそうで、コンストラクタに渡ってくるMCEventHandler.javaを先に持ってくる事に。

MCEventHandler.javaもかなり大変なので、バージョン毎のクラスの対応表は無いかとググったところ、1.12→1.13でイベントの処理がだいぶ変更されているらしい事がわかった。

イベント処理の変更

イベントの処理が変更されたら移植するのは大変なので、新しいイベントの処理方法を調べると共に、RaspberryJamModで扱うイベントの処理内容も理解しないといけない。

という事で、単純な移植作業はここで停止。

カテゴリー: Mod開発, 未確定情報 | コメントする

Mod開発環境の構築

MineCraft Moddiingチュートリアルその1というページを見つけたので、それを参考に開発環境を整える事にした。

Java

Eclipseに付属しているらしいので、まずはEclipseをインストールしてみる。

Eclipse

https://mergedoc.osdn.jp/ から「Pleiades All in One ダウンロード」のEclipse 2020をクリックして、Mac 64bitのFull EditionのJavaをダウンロード。

Forge

http://files.minecraftforge.net/ から最新の1.15.2のDownload RecommendedのMdkをダウンロード。
MdkってMod Development Kitの略か?
ExampleModというModのテンプレートみたいなもののファイルのセット。

作業

実際にやった事を時系列に書いておきます。

1)Forgeのサイトからダウンロードしたファイル (forge-1.15.2-31.2.0-mdk.zip) を作業用ディレクトリで解凍。
2)ターミナルで解凍したディレクトリに cd
3)gradlew setupDecompWorkspace を入力するもgradlewコマンド Not Found。
4)brew install gradlew したけどエラーだった。
5)brew install gradle をしたらSuccess。
6)先ほどのgradlew setupDecompWorkspace を入力するも再度gradlewコマンドNot Found。
7)ディレクトリ内にgradlewなるファイルを発見したので、chmod +x gradlew を行って、./gradlew setupDecompWorkspace を実行。しかし、途中でエラー(FAILURE: Build failed with an exception.)。
8)README.txtを読んだら、./gradlew genEclipseRuns を実行しろと書いてあったので、実行。何やらダウンロードが始まって15分くらいかかって成功終了。
9)README.txtに書いてあった ./gradlew eclipse を実行したが何も起こらないので、eclipseを起動して、インポートから「既存のGradleプロジェクト」を選んで「次へ」をクリックし、forge-1.15.2-31.2.0-mdkディレクトリを指定してインポート。
10)Eclipse内のランナー内のrunClientをダブルクリックするとMinecraft(多分Forge版)が起動して、無事に3つのModが読み込まれた。
注意!:README.txtにはrunClient, runServerのMOD_CLASSESを「[modid]%%[Path]」と編集みたいな事を書いてあるけど、書き換えるとExampleのModが読み込まれない。

3つのModをロードした画面
3つのModをロード
Example Modが読み込まれた。
Example Modが読み込まれた

Modのビルド

最後にModのビルドで.jarファイルを作る。
./gradlew build でビルドされ、build/libs にModの.jarファイルが出来る。
この場合はmodid-1.0.jar というファイルだった。

出来たファイルをForgeのmodsディレクトリにコピーしてロードされる事を確認した。

https://mcforge.readthedocs.io/en/1.15.x/gettingstarted/

カテゴリー: Mod開発, 未確定情報 | コメントする

MinecraftのMod開発について

MinecraftでPythonを使いたくて調べたら必要なModのRaspberryJamModが1.12.2で止まっていて、現在のMinecraftの最新バージョン1.15.2では動かせない事がわかった。

Pythonを動かすだけなら1.12.2でも良いけど、でも見た目がやっぱり古い感じがして「何とかならないもんかなぁ…」といろいろ調べたけど、見つからない…

RaspberryJamMod自体はそんなに変更しなくても、最新版のForge用にリビルドできれば良いんじゃないかと思うので、まずはMinecraftのMod開発について調べてみる事にしました。

カテゴリー: Mod開発, 未確定情報 | コメントする

PIC16F1827でI2C

PIC16F1827でI2Cをテストした。
先日試したEUSARTを経由してMacで確認できた。

MCCでの設定

MCCで内蔵オシレーターで32MHzで動くように設定。

MCCで内蔵オシレーターで32MHzで動くように設定

続いてEUSARTを9600bpsに設定。

MCCでEUSARTを設定

MCCでMSSP1をI2Cに設定。

MCCでMSSP1をI2Cに設定

I2CとEUSARTでピンが重なるので、Pin Manager Grid ViewでEUSARTのピンを変更。

Pin Manager: Grid ViewでEUSARTのピンを変更
EUSARTのピンを変更した結果

I2Cで使うデバイス

今回はAmazonで買った電子コンパスのQMC5883Lを載せたモジュールを使います。
Arduioにはライブラリがあるので、それも参考にしました。

回路図

回路図は次のようになります。EUSARTのRx/Txのピンを変更してあるので注意してください。

回路図

コーディング

I2Cの便利な関数がexamplesに生成されているので、その関数を使いました。
Arduinoのライブラリでは方位も出力できますが、メモリーが足りなくてそこまで実装できていません。

/**
  Generated Main Source File

  Company:
    Microchip Technology Inc.

  File Name:
    main.c

  Summary:
    This is the main file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs

  Description:
    This header file provides implementations for driver APIs for all modules selected in the GUI.
    Generation Information :
        Product Revision  :  PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.0
        Device            :  PIC16F1827
        Driver Version    :  2.00
*/

/*
    (c) 2018 Microchip Technology Inc. and its subsidiaries. 
    
    Subject to your compliance with these terms, you may use Microchip software and any 
    derivatives exclusively with Microchip products. It is your responsibility to comply with third party 
    license terms applicable to your use of third party software (including open source software) that 
    may accompany Microchip software.
    
    THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER 
    EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY 
    IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS 
    FOR A PARTICULAR PURPOSE.
    
    IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, 
    INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND 
    WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP 
    HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO 
    THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL 
    CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT 
    OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS 
    SOFTWARE.
*/

#include "mcc_generated_files/mcc.h"
#include "mcc_generated_files/examples/i2c1_master_example.h"
#include <string.h>

// QMC5883L
#define QMC5883L_ADDR   (0x0D)
volatile uint8_t flag;
volatile uint8_t data0[1];
volatile uint8_t data8[8];
int16_t vRaw[3];
char cbuff[32];

void qmc5883l_init(void)
{
    I2C1_Write1ByteRegister(QMC5883L_ADDR, 0x0B, 0x01);
    I2C1_Write1ByteRegister(QMC5883L_ADDR, 0x09, 0x01|0x0C|0x10|0X00);
}

void qmc5883l_read(void)
{
    data0[0] = 0;
    I2C1_WriteNBytes(QMC5883L_ADDR, data0, 1);
    I2C1_ReadNBytes(QMC5883L_ADDR, data8, 8);
    vRaw[0] = (int16_t)(data8[0] | data8[1] << 8);
    vRaw[1] = (int16_t)(data8[2] | data8[3] << 8);
    vRaw[2] = (int16_t)(data8[4] | data8[5] << 8);
    flag = 1;
}

void usart_write(uint8_t *data, size_t len)
{
    size_t i = 0;
    while (i < len) {
        if (!EUSART_is_tx_ready()) {
            ;
        }
        EUSART_Write(data[i]);
        i++;
    }
    if (!EUSART_is_tx_ready()) {
        ;
    }
    EUSART_Write(0x0D);
    if (!EUSART_is_tx_ready()) {
        ;
    }
    EUSART_Write(0x0A);
}

/*
                         Main application
 */
void main(void)
{
    // initialize the device
    SYSTEM_Initialize();

    // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
    // Use the following macros to:

    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    INTERRUPT_PeripheralInterruptEnable();

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();
    
    IO_RA1_SetHigh();
    
    __delay_ms(100);
    
    flag = 0;
    qmc5883l_init();

    while (1)
    {
        // Add your application code
        if (flag == 0) {
            IO_RA1_SetLow();
            qmc5883l_read();
        }
        if (flag) {
            if (EUSART_is_tx_ready()) {
                sprintf(cbuff, "x=%d, y=%d, z=%d", vRaw[0], vRaw[1], vRaw[2]);
                usart_write(cbuff, strlen(cbuff));
            }
            flag = 0;
            IO_RA1_SetHigh();
        }
        __delay_ms(500);
        __delay_ms(500);
    }
}
/**
 End of File
*/

プロジェクトのファイル一式です。
p1827_i2c.X.zip

出力

動かすと、Mac側のターミナルに次のようなデータが約1秒毎に出力されます。

Mac側のターミナルへの出力

写真

組んで動かしている状態
カテゴリー: PIC, ソフトウェア, 回路 | タグ: , , , , , | コメントする

PIC16F1827でシリアル通信

PIC16F1827でシリアル通信(EUSART)をテストした。
とはいえ、MCCを使えば簡単。

まずはMCCで内蔵オシレーター32MHzで動くように設定。

MCCでのオシレーターの設定。
内蔵オシレーターで32MHzで動く設定。
MCCでのオシレーターの設定

次にMCCのEUSARTの設定。
確か、Enable EUSART InterruptsをONした以外はデフォルトのままだったと思う。

MCCでのEUSARTの設定。
デフォルトからEnable EUSART InterruptsをONにしただけ。
MCCでのEUSARTの設定

最後にMCCでRA1ピンをLED用に出力に割り当て。
ソースコード(書き換えた部分のみ抜粋)は次の通り。
Macで入力した文字をそのまま返すだけ。通信の間、LEDが光る。
GlobalとPeripheralの割り込みをEnableにするのを忘れない事!(動かなくてしばらく悩んだ…)

void main(void)
{
    volatile uint8_t rxData;
    // initialize the device
    SYSTEM_Initialize();
    // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
    // Use the following macros to:

    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    INTERRUPT_PeripheralInterruptEnable();

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();
    LATAbits.LATA1 = HIGH;

    while (1)
    {
        // Add your application code
 
        if (EUSART_is_rx_ready()) {
            LATAbits.LATA1 = LOW;
            rxData = EUSART_Read();
            if (EUSART_is_tx_ready()) {
                EUSART_Write(rxData);
            }
            LATAbits.LATA1 = HIGH;
        }
    }
}

回路図はコレ。

回路図。
PICKit3, USBシリアルも。
回路図

USBシリアルはFTDIのチップの載った古いモジュールで、Macにつないでターミナルからcuコマンドで接続。
sudo cu -s 9600 -l /dev/cu.usbserial-A10042Fd

カテゴリー: PIC, ソフトウェア, 回路 | タグ: , , , , , | コメントする

医療従事者の方たちに感謝

PIC12F1822でFC-102(Rainbow LED)を制御できるようになったので、青い光で医療従事者の方たちに感謝の意を表そうと思いました。

これのMPLAB X IDE用のプロジェクトファイル一式のzipファイルです。

回路図は一つ前の投稿と同じです。

電池駆動時の回路図です。
電池駆動時の回路図です。
ICSP回路付きの回路図です。
ICSP回路付きの回路図です。

カテゴリー: PIC, ソフトウェア, 作ったモノ | タグ: , , | コメントする