Uncategorized」カテゴリーアーカイブ

PICマイコンのUARTでシリアル通信する

秋月でPICマイコン(AE-USBPIC44, PIC18F4553)を買ったので、UARTでPCとシリアル通信させてみました。

はまった点として、PICkit3でVDDが5.0V出なくて4.75Vになり、エラー表示で書き込みできないというのがありました。

PICkit 3 is trying to supply 5.000000 volts from the USB port, but the target VDD is measured to be 4.750000 volts. This could be due to the USB port power capabilities or the target circuitry affecting the measured VDD.

The target circuit may require more power than the debug tool can provide. An external power supply might be necessary.
Connection Failed.

そこで、プロジェクトのプロパティ→PICkit3→Powerを選び、Voltage Levelを4.5Vに設定すると、うまく書き込めました。(参考サイト)

UARTの送信は putch() で行います。この関数名にしておくことで、printf() が利用できます。

UARTの受信は getch() で行います。この関数名にしておくことで、gets() が利用できますが、gets() にはバッファオーバーランのバグがあるので決して使ってはいけません。そこで、今回は、UARTに接続されたターミナルで1行入力する(バックスペースで編集できる)関数 read_line() を用意しました。コンパクトで便利なのでよかったら使ってください。きちんとバッファオーバーランのないように作ってます。

さて、このプログラムの使い方は、まず、5VのUSBシリアル変換器を用意して、AE-USBPIC44ボード上のGND, TX, RXをクロス結線します。次にターミナルで9600bps 8bit ストップビット1で繋ぐと、PIC> というプロンプトが表示されますので、helpなどと入力してリターンキーを押してください。プロンプトが表示されないときはリターンキーを押してみてください。

/*
 * UART example
 * PIC18F4553 (AE-USBPIC44) + MPLAB X IDE + XC8
 */

#include <xc.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>

#define _XTAL_FREQ  48000000L

#pragma config PLLDIV   = 5
#pragma config CPUDIV   = OSC1_PLL2
#pragma config USBDIV   = 2
#pragma config FOSC     = HSPLL_HS
#pragma config FCMEN    = OFF
#pragma config IESO     = OFF
#pragma config PWRT     = OFF
#pragma config BOR      = ON
#pragma config BORV     = 3
#pragma config VREGEN   = ON
#pragma config WDT      = OFF
#pragma config WDTPS    = 32768
#pragma config MCLRE    = ON
#pragma config LPT1OSC  = OFF
#pragma config PBADEN   = OFF
#pragma config CCP2MX   = OFF
#pragma config STVREN   = ON
#pragma config LVP      = OFF
#pragma config ICPRT    = OFF
#pragma config XINST    = OFF
#pragma config CP0      = OFF
#pragma config CP1      = OFF
#pragma config CP2      = OFF
#pragma config CP3      = OFF
#pragma config CPB      = OFF
#pragma config CPD      = OFF
#pragma config WRT0     = OFF
#pragma config WRT1     = OFF
#pragma config WRT2     = OFF
#pragma config WRT3     = OFF
#pragma config WRTB     = OFF
#pragma config WRTC     = OFF
#pragma config WRTD     = OFF
#pragma config EBTR0    = OFF
#pragma config EBTR1    = OFF
#pragma config EBTR2    = OFF
#pragma config EBTR3    = OFF
#pragma config EBTRB    = OFF

#define BAUD_RATE   9600L

#define SW1         PORTEbits.RE0
#define SW2         PORTEbits.RE1
#define LED         PORTEbits.RE2

void pic_init(void);
void uart_init(unsigned long baud);
void putch(unsigned char c);
unsigned char getch(void);
void read_line(char *buf, int buf_size);

void main(void)
{
    pic_init();
    uart_init(BAUD_RATE);

    while (1) {
        char s[16];

        /* Show prompt. */
        printf("PIC> ");

        /* Read command. */
        read_line(s, sizeof(s));

        /* Run command. */
        if (strcmp(s, "") == 0)
            continue;
        else if (strcmp(s, "help") == 0)
            printf("hello led switch\r\n");
        else if (strcmp(s, "hello") == 0)
            printf("Hello, world!\r\n");
        else if (strcmp(s, "led") == 0)
            LED = (unsigned char)~LED;
        else if (strcmp(s, "switch") == 0)
            printf("Switch is %s.\r\n", SW1 == 0 ? "ON" : "OFF");
        else
            printf("Command not found.\r\n");

        __delay_ms(10);
    }
}

void pic_init(void)
{
    ADCON1 = 0b00001111;
    TRISA = 0b00000000;
    TRISB = 0b00000000;
    TRISC = 0b00110000;         /* D-, D+ */
    TRISD = 0b00000000;
    TRISE = 0b00000011;         /* SW1, SW2, LED */
    LATA = 0b00000000;
    LATB = 0b00000000;
    LATC = 0b00000000;
    LATD = 0b00000000;
    LATE = 0b00000000;
}

void uart_init(unsigned long baud)
{
    /* Set baud rate generator */
    if (_XTAL_FREQ / (baud * 16L) <= 255) {
        BRGH = 1;
        SPBRG = (unsigned char)(_XTAL_FREQ / (baud * 16L));
    } else {
        BRGH = 0;
        SPBRG = (unsigned char)(_XTAL_FREQ / (baud * 64L));
    }

    SYNC = 0;       /* Asynchronous mode (UART) */
    SPEN = 1;       /* Enable serial port */
    TRISC6 = 1;     /* Use TX */
    TRISC7 = 1;     /* Use RX */
    CREN = 1;       /* Enable continuous reception */
    TXEN = 1;       /* Enable transmission */
}

void putch(unsigned char c)
{
    while(!TRMT)
        ;
    TXREG = c;
}

unsigned char getch(void)
{
    while(!RCIF)
        ;
    return (char)RCREG;
}

void read_line(char *buf, int buf_size)
{
    int pos = 0;
    while (1) {
        char c = getch();
        if (isprint(c) && pos <= buf_size - 2) {
            buf[pos++] = c;
            putch(c);
        } else if (c == 0x08 && pos > 0) {
            pos--;
            printf("\x08 \x08");
        } else if (c == '\r') {
            buf[pos] = '\0';
            printf("\r\n");
            break;
        }
    }
}

Introducing a Game Engine “Suika2”

Do you know “adventure games”? It is a method of expression mainly used for romance games. Users choose options and come to an end. It displays background pictures, character pictures, texts and options. It plays background music and character voices. It is also called “visual novels” or “novel games”. There are several tools to create English adventure games. Suika2 is one of the tools. In this article, I’ll introduce beneficial features of Suika2.

Suika2 screen

Easy to create games

Script file to make up game is very simple and easy to understand. For example, to show a background picture, just write

@bg sample.png 1.0

Then you can change background picture to sample.png with a 1.0 second fade-in time. “bg” is abbreviation of “background”.

Runs on Windows, Mac, Linux and Android

Suika2 basically runs on Windows. In addition, it runs on Mac, Linux and Android. You can approach wide variety of users.

Fast and stable

Suika2 is optimized for CPU execution. It achieves fast and stable drawing without depending on GPU. If your CPU supports an extension like SSE or AVX, Suika2 uses it for faster drawing.

Completely free

Suika2 is released under MIT license. It has no limitation for redistribution. Of course you can sell copies of your game with Suika2 execution file.

Supports English

Suika2 supports English word wrapping and has English error messages. Many tools developed in Japan don’t support English.

User support by the author

While Suika2 has good features, it is not so popular at the moment. I therefore offer you direct support by the author as a promotion.

Links

Suika2 Official

Suika2 Tutorial Document

Suika2 Tutorial Video (Japanese) – If you can record English tutorial video which follows the tutorial document like this Japanese video, please let me know at midori@luxion.jp.

ゲームエンジンSuika2の紹介

「アドベンチャーゲーム」をご存じですか?主に恋愛ゲームで用いられている表現手法で、選択肢を選んでいくとエンディングに辿り着くものです。画面に表示されるのは背景、キャラクタ、文章、そして選択肢です。サウンドにはBGMやボイスが流れます。アドベンチャーゲームは、ビジュアルノベルやノベルゲームとも呼ばれます。このようなゲームを作るためのツールが、世の中にはいくつもあり、その中の1つがSuika2です。この記事ではSuika2の特長を紹介します。

screen
Suika2 実行画面

ゲームを作るのが簡単

ゲームを作るためのスクリプトが簡素で簡単です。例えば背景を表示するには、

@bg sample.png 1.0

たったこれだけをテキストファイルに記述すれば、背景画像をsample.pngに変更し、1.0秒かけてフェードしてくれます。(bgはbackgoundの略です。)

WindowsでもMacでもLinuxでもAndroidでも動く

Suika2は32bit Windowsでの動作を基本とし、64bit Windowsのほか、Macでの動作もサポートしています。これにより、幅広いWindowsユーザに加えて、普段ゲームをしないMacユーザにアプローチすることができます。さらに、AndroidやLinuxでの動作もサポートしています。

安定して高速に動作する

Suika2はCPUでの実行に最適化されており、GPUの機種やドライバのバージョンに左右されることなく、安定して、高速な描画を実現しています。もしあなたの使っているCPUがSSEやAVXなどの拡張命令を利用可能であれば、Suika2はそれらを利用しより高速な描画を行います。

完全に無料で使える

Suika2はMITライセンスで開発されており、再配布する際にも一切の制約がなく、有償で販売することも可能です。他のゲーム作成ツールの中には、有償での再配布ができないものもありますが、Suika2は安心してゲームを作ることができます。

英語対応している

多くのアドベンチャーゲーム作成ツールは日本語しか対応していないのに対し、Suika2は英語表示時のワードラップや英語のエラーメッセージに対応しており、英語圏のクリエイターを意識しています。

サポート

このような特長を持つSuika2ですが、これを使って作られたゲームはまだ多くありません。そこで、普及活動の一環として、もしSuika2を使っていただけるなら、作者が直接サポートすることにしています。

Suika2公式ページ

Suika2チュートリアル動画

Ubuntu 20.04でATOK X3を使う

Ubuntu 20.04でATOK X3を利用する方法を紹介します。(2020/4/24 検証済み)。

インストールと調整に1時間ほどかかるかもしれませんが、快適な日本語入力環境が手に入ります。コメント欄で出来る限りサポートしてみたいと思いますので、お気軽に書き込んでいただければ幸いです。

最初に、次のものをインストールします。

sudo apt-get install libpangoxft-1.0-0:i386 libpangox-1.0-0 libcanberra-gtk3-module:i386 libcanberra-gtk-module:i386

本当はlibpangox-1.0-0:i386も必要なのですが、Ubuntu 20.04ではパッケージがなくなってしまいましたので、このファイルをダウンロードして展開します。(Ubuntu 18.04のパッケージから取り出したものです。)

sudo tar xJf libpangox-1.0-0_i386.tar.xz -C /

さて、続いてのやり方ですが、基本的には、下記の素晴らしいリンク先サイトの記事に沿って、ATOK X3のインストールを最後まで進めます。なお、途中で再起動やログアウトをしないでください。このあとに記述されている「変更点」を適用してから再起動してください。

そのあと、いくつか変更点がありますので修正していきます。

変更点1.

ディレクトリツリーが破壊されるので修復します。Ubuntu 18.04まででは、NetworkManagerがDHCPを取得できないという奇妙な問題が生じていましたが、Ubuntu 20.04ではsettingsが開けないという問題を確認しています。とにかく、ディレクトリツリーに問題があるので、上記手順でのインストール後に、下記の操作を行います。(この通りに打ってください。sudo -sは重要で、アレンジするとたぶん失敗します。)

sudo -s
mkdir /run/iiim
rm -rf /var/run
ln -s /run /var/run

この問題は、Ubuntuでは/var/runが/runへのシンボリックリンクであるのに対し、ATOK X3のインストーラがtarでこれを上書きして/var/runディレクトリを作成してしまうことで、不整合が生じるというものです。

変更点2.

Ubuntuを英語でインストールした場合、GNOME3のロケールを日本語にしてください。日本語でインストールした場合、この項目は設定不要です。

変更点3.

リンク先サイトの最初に書かれているim-switchのインストールですが、今回は必要ありません。代わりに、次の通りに~/.xinputrcを作成します。

export XMODIFIERS=@im=iiimx
export GTK_IM_MODULE=iiim
export QT_IM_MODULE=xim

export HTT_DISABLE_STATUS_WINDOW=t
export JS_FEEDBACK_CONVERT=t
iiimx -iiimd > /dev/null 2>&1

変更点4.

リンク先サイトで作成している~/.config/autostart/atok.desktopは、変更点3.を行ったため、不要になります。作成すると挙動がおかしくなりますので、削除して下さい。

ここまでの変更点を一気に修正したら、再起動してください。ログアウトではなく、再起動をお願いします。うまくいかなければ1つずつ見直し・やり直ししてみて下さい。(私もだいたい2回目くらいでうまくいきます。)

既知の問題として、gnome-terminalでカーソルが表示されなくなるという問題があります。mltermを使いましょう。

以上、ご参考になりましたら幸いです。また、ご質問、ご指摘、うまくいかない等がございましたらコメントをよろしくお願いいたします。

Android Studio 3.1でNDKを使うまで

Android Studio 2.1で開発したNDKを利用したアプリを、Android Studio 3.1に移植するまでの流れをまとめました。環境はUbuntu 18.04を想定。

準備編

  • udevルールを追加する
$ cat /etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="0fce", MODE="0666", GROUP="plugdev"
$ sudo service udev reload
  • 32bit依存関係をインストールする
$ sudo apt-get install libz1:i386 libncurses5:i386 libbz2-1.0:i386 libstdc++6:i386

インストール編

  • Android Studio 3.1.4をダウンロードする
  • ZIPを展開する
  • binにパスを通す
  • studio.shを起動する
  • Android Studioのインストールを行う
  • インストール後、起動画面でConfigure->SDK Managerを選択する
  • CMake, LLDB, NDKを選択してインストールする

プロジェクト作成編

  • 新しいプロジェクトを作る
    • Include C++ supportにチェックを付ける
  • ソースファイルを配置する
    • app/src/main/java に Javaソースコードを置く
    • app/src/main/cpp に C/C++ ソースコードを置く
  • File->New->Folder->Assets Folder
    • app/src/main/assets にアセットを置く
  • app/src/main/resにリソースを配置する
  • AndroidManifest.xmlを既存のものに置き換える(activityを記述する)
  • CMakeLists.txtにライブラリのソースコードの名前を全部書く
add_library( # Sets the name of the library.
             suika

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/cmd_bg.c
             src/main/cpp/cmd_bgm.c
             src/main/cpp/cmd_ch.c )
  • 利用しているライブラリがあれば、CMakeLists.txtのtarget_link_librariesに追加する
target_link_libraries( # Specifies the target library.
                       suika
                       jnigraphics

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )
  • 下記のエラーメッセージが出る
Failed to find Build Tools revision 27.0.3
  • “Install Build Tools 27.0.3 and sync project”のリンクをクリックすると解決できる

以上

Ubuntu 16.04のGNOME3+CompizでNautilusの周りに黒いフレームができる問題

ニッチな話題ではありますが、Ubuntu16.04において、GNOME3 FlashbackをCompizで利用すると、NautilusのようなHead Barと呼ばれるらしいウィンドウの周りに、黒いフレームがついてしまいます。

さっとググったところ、~/.config/gtk-3.0/gtk.cssに下記のような感じで加えれば大丈夫そうです。

.window-frame.solid-csd {
  box-shadow: none;
  border-radius: 0;
  margin: 1px;
  background-color: #eee;
}

ちなみに私はリサイズのしやすさを考慮して、marginを5pxにして使ってます。また、background-colorはテーマに合わせて調整することになると思います。

Ubuntu 16.04でATOK X3を使う

Ubuntu 16.04でATOK X3を利用する方法を紹介します。デスクトップ環境は、gnome-session-flashbackで確認しています。(2016/5/16 検証済み)。

Ubuntu 18.04版はこちらです。

インストールと調整に1時間ほどかかるかもしれませんが、快適な日本語入力環境が手に入ります。コメント欄で出来る限りサポートしてみたいと思いますので、お気軽に書き込んでいただければ幸いです。

さて、やり方ですが、基本的には、下記の素晴らしいリンク先サイトの記事に沿って、最後までインストールを進めます。なお、途中で再起動やログアウトをしないでください。変更点を適用してから再起動してください。

そのあと、いくつか変更点がありますので修正していきます。

変更点1.

このままだとNetworkManagerがDHCPを取得できないという奇妙な問題が生じます。この問題を解消するためには、上記手順でのインストール後に、下記の操作を行います。(この通りに打ってください。sudo -sは重要で、アレンジするとたぶん失敗します。)

sudo -s
mkdir /run/iiim
rm -rf /var/run
ln -s /run /var/run

この問題の原因は、Ubuntuでは/var/runが/runへのシンボリックリンクであるのに対し、ATOK X3のインストーラがtarでこれを上書きして/var/runディレクトリを作成してしまうことで、不整合が生じることです。

確認した範囲では、Ubuntu 14.04.4, 15.04, 15.10のすべてで同じ問題が生じました。/var/runがシンボリックリンクになったのは11.10からだそうですが、DHCPの問題が生じるようになった時期は、ちょっと不明です。

変更点2.

GNOME3のロケールを日本語にしてください。私はこれでハマりました。

「System Settings→Language Support→Language for menus and windows」で「日本語」をドラッグアンドドロップし、一番上にします。ここを日本語にしておかないと、ウィンドウの左下に表示されるATOKという文字が、[No IM connected]と表示されてしまい、ATOKを利用できません。設定変更にはログアウトが必要になります。

「日本語」をドラッグアンドドロップするとLanguage Selectorがエラーを吐く現象に遭遇しました。対処方法は残念ながら見つかりませんでしたが、Ubuntuの再インストールで解決しました。

変更点3.

リンク先サイトの最初に書かれているim-switchのインストールですが、「im-configが代わりに提供されているよ」というメッセージが出るだけで、インストールできません。これは問題ありませんが、代わりに、次の通りに~/.xinputrcを作成します。

export XMODIFIERS=@im=iiimx
export GTK_IM_MODULE=iiim
export QT_IM_MODULE=xim

iiimx -iiimd

変更点4.

リンク先サイトで作成している~/.config/autostart/atok.desktopは、変更点3.を行ったため、不要になります。作成すると挙動がおかしくなりますので、削除して下さい。

ここまでの変更点を一気に修正したら、再起動してください。うまくいかなければ1つずつ見直し・やり直ししてみて下さい。(私もだいたい2回目くらいでうまくいきます。)

以上、ご参考になりましたら幸いです。また、ご質問・ご指摘等がございましたらコメントをよろしくお願いいたします。

How to apply Clearlooks-Phenix to window title bars on Ubuntu 15.10 and 16.04

(For Clearlooks-Phenix users)

On Ubuntu 15.10 and 16.04, gnome-tweak-tool doesn’t provide the item for window theme selection.  Alternatively, you can apply Clearlooks-Phenix theme to window title bars in GNOME3 flashback sessions (for both metacity and compiz) by typing:

$ gsettings set org.gnome.metacity theme Clearlooks-Phenix