Translate

ページ

2016年2月28日日曜日

Raspberry Pi2 B : 7inch toucscreen や IGZOパネルやら...

メモメモ
新旧情報が入り乱れているので、2016-02-28現在の最新情報だけまとめる。
細かい話は抜き

使用Raspberry Pi

DOWNLOAD&標準的なインストール手順

    • ZIPファイルをダウンロードし展開
    • SDカードをSD Formatter 4で初期化
    • ダウンロードしたZIPファイルの全中身をSDカードにコピー
    • SDカートを差し込んでRasPiを起動
    • 画面に従ってインストール

    • ZIPファイルをダウンロードし展開
    • Win32DiskImagerを使ってイメージを書き込み

公式7inchタッチスクリーンの場合

  • 仕様
    • これ
    • フレキシブルケーブル接続
    • 解像度は800x480


  • 使用ケース
    • スイッチサイエンス(adafruit製) (このケースは上下がひっくり返る構造となっているので、後述の通りconfig.txtを編集して反転させる必要がある)

  • NOOBS
    • インストーラ起動する
    • ただし、上のスタンドは表示が上限反転となる
    • インストール中の画面は下が切れる
    • インストール後、/boot/config.txtにlcd_rotate=2 を追加して上下を合わせる

  • RASBIAN
    • 普通に起動する
    • 上下はやっぱりひっくり返るので、NOOBS同様に/boot/config.txtを直す

IGZO液晶パネル

  • 仕様
    • HDMI接続
    • 解像度は1920x1200(フルHD)



  • NOOBS
    • NOOBS経由のインストールは現在お勧めしません...
    • インストーラの画面が全く表示されない
    • 他のモニタ(上述のタッチスクリーンや通常のPC用モニタなど)を使ってインストールする
    • RASPBIANを選択した場合は、次の通り/boot/config.txtを編集する
    • 注: 2016/02/28現在、rpi-updateするとGraphical インストール画面が表示されなくなってしまいます。

  • RASPBIAN JESSIE
    • /boot/config.txtをこちらの内容と置き換えるか、”# 以下はオリジナル”という行までを追加する
      • 液晶の向きにより4つの設定が書かれており、1つ(フレキシブルケーブルが下となった縦長)だけ有効となっている
      • フレキシブルケーブルを左とする設定を生かしたかったので、そのように変更した
      • 当該部分(framebuffer_width=1920, framebuffer_height=1200は変更可能。1280x800位が使いやすそう)

両方切り替えて使いたい場合

  • SDメモリかモニタケーブルを差し替えて両方使いたい場合は。/boot/cofig.txtを各モニタ向けに数パターン用意しておき切り替えて使うと良い
    • /boot/config.txtは、SDメモリが読み書きできる環境があれば、PCからも編集や置き換えが可能です
  • 両方同時に使う方法があるのかどうかは知りません。

うまく行かない場合


  • 既存のRaspberry Piに使う等で環境が古い場合、igzoパネルはうまく表示できない場合があるようです。
    • apt-get update, apt-get upgrade, rpi-updateを実行するとうまく行くという情報がありますが、うちでは逆に起動後のXの起動に失敗するようになってしまいました。(emerge+さんブログ参照

GL Driver


  • raspi-configAdvanced OptionGL Driverをonにすると以下が起こります。
    • 公式7inchタッチスクリーンは電源投入直後のレインボーの正方形のまま画面が変化しなくなります。
    • IGZOパネルの場合は、framebuffer_width, famebuffer_heightの指定が効かなくなります。
  • SDカードのconfig.txtdtoverlay=vc4-kms-v3dという行が追加されていますので、これをコメントアウトするか、消去すると設定を無効化することができます。
    • 操作可能なら、sudo vi /boot/config.txt
    • 操作できない場合は、SDカードをPCにつないで編集できます

2016年2月23日火曜日

mbed TY51822r3 を mbed HRM1017と差し替えて使う


(大した話ではありません。自分向けの備忘録みたいなものです。すいません。)

TY51822r3発売!!

スイッチサイエンス社からBLE用の新しいmbed TY51822r3が発売です。
本製品は、mbed HRM1017の後継製品と位置づけられており、比べると、以下の特徴があります。
  • 搭載しているnRF51822チップのリビジョンがr2から最新版のr3に変更
  • RAMが16kBから32kBに増量(今までメモリ不足で動かなかったnRF5 SDK for IoTが動くようになるそうです)
  • 搭載クリスタルなどは違いはありますが、動作は同じ16Mhz
  • パッケージ外観はほぼ同じ。長さ、高さが少し小さくなっている。
  • さらにSoCからのピンの引き出しがmbed HRM1017と互換なので、ハードウェア的な置き換えが容易
  • 価格はmbed HRM1017より少し安い(5400→4730)
たまたま、スイッチサイエンスのオープンハウスで先行購入することが出来ましたので、少し試してみました。

mbed HRM1017と差し替えて使う

mbed TY51822r3はmbed HRM1017とハード的なピンの割り当てが同じであり、ハードウェア上のスペックダウンも無いため、ファームウェアさえ適切に作り直せば、mbed HRM1017と差し替えて使うことができます。

ここで、注意すべきことがあります。それは、ピンのハード的な割り当ては同じですが、mbedオンラインコンパイラ上の機能の割り当てが両社で異なっているからです。

mbed.org上の両社のPinOut図を見比べて見ましょう。

まず、mbed TY51822r3はこちらとなります。

mbed HRM1017はこちらとなります。

Serial,SPI1,Analogin等は機能の割り当てが同じですが、SPI0, I2C,LED#, BTN#等が異なっていることが分かります。

今までmbed HRM1017を使ってきたユーザにとっては、まずmbed HRM1017向けのプログラムをmbed TY51822r3で動かしてみたいところだと思います。

ピン割り当てが同じであるため、機能名称ベースのenum定義をピン番号に変更すると、同じプログラムが両方で動くようになります。(バイナリはターゲット毎にコンパイルして作る必要があります。)

例えば、
TMP102      healthThemometer(I2C_SDA0, I2C_SCL0, 0x90); 
という行があったとすると、
TMP102      healthThemometer(p22, p20, 0x90); としたり、

DigitalOut  oneSecondLed(LED1); 
DigitalOut  advertisingStateLed(LED2);
DigitalOut  oneSecondLed(p18); 
DigitalOut  advertisingStateLed(p19);
となります。

mbed HRM1017のピン配置図を見ながらこれを行っても良いのですが、実は一度mbed HRM1017をターゲットに選択してコンパイルすると、該当変数部分をクリックすると、pXXというピン名称enumがソースの枠内右上に表示されるようになります。これを使って、ピン名称に変換すると効率よく変更作業が出来ます。

この辺を覚えておくと、mbed TY51822r3をmbed HRM1017と置き換えて簡単に使えるようになります。

ちなみに、mbed TY51822r3のピン番号と機能の割り当ては、NordicのnRF51-DKと合わせたそうです。世界的には、nRF51-DKのユーザが多いわけで、mbedやSDK上のnRF51822向けのプログラムはかなりのものがnRF51-DK向けに作られています。それらが、そのまま使えるわけです。


2016年2月20日土曜日

nRF52832 + WS2812B その5: I2S で制御

(動画、BGMあるので注意。うるさくてすいません。)

I2SでWS2812Bをドライブ

これまでやってきたSPIを使う方法を振り返ってみます。
nRF52のSPIベースのeasyDMAでは1度のDMA伝送で送れるバッファのサイズが256バイトだったので、約20個ずつ連続して信号を送り出す必要がありました。しかも本来の仕様では1.25μ秒で送るべき1ビット分のデータを1μ秒で送っているためか、電源電圧が下がった時などにうまく制御しきれずに後半のLEDの幾つかが明るい色で光りだすという現象が発生していました。
まぁ、なんとか制御してみたものの、少し行き詰りを感じていました。

そこへ、I2SでWS2812Bをドライブしているよ!って話を聞きました。



nRF52832にも、easyDMAを使ったI2Sが備わっています。
調べてみると、次のことが分かりました。
  • 伝送レートの設定が幅広く備わっており、3.2MHzのビットレートが作れる。これは、4ビットが1.25μ秒となり、WS2812Bの仕様に合致したシグナルが生成可能(Ref. CONFIG.MCKFREQ)
  • easyDMAのサイズ指定バッファが最大16384あり、LED 1365個分のデータを一気に送ることができる(SPIの時のように分割する細かく分割する必要がない。Ref. RXTXD.MAXCNT)
実際にやってみたら、SPIをだましだまし使った時よりも処理も安定し、制御が乱れることがなくなりました。プログラムもシンプルです。

WS2812Bドライブ方法

WS2812Bのドライブ信号は、次の通りです。

3.2MHzの信号の1ビットは312.5n秒ですので、 
0codeは312.5*1のHと312*3のLを組み合わせて、
1codeは312.5*3のHと312*1のLを組み合わせて、
作成することができます。

レベル変換IC(TXB0104)

nRF52832のGPIOは3.3V, WS2812Bのシグナルレベルは5Vですので、レベル変換が必要です。

SPIでドライブしていた時に調子の良かったレベル変換IC TXB0104を引き続き使いました。製品はこちら。双方向である必要性は無いので、もっと良いソリューションがあると思います。


ハードウェア概要

LEDテープを味付け海苔の空き容器に巻きつけています(前回からまき直し、一周17個です。4mのLEDテープは先に行くほど電圧が落ちて輝度が落ちるので、縦方向に電源のバイパス配線を追加しています)。
  • ボードはnRF52 DK
  • P0..25 をレベル変換IC(ブレッドボード上のTXB0104) ICを使ってLEDテープDinへ
  • 電源はLED用に別途準備必要です。
    • 試験段階は20Aのスイッチング電源、調整完了後モバイルバッテリー(5V2A)利用



その後、バッファはシールド形式のブレッドボードに搭載しnRF52-DKに被せました。
撮影時の状態は以下の通り。



ソフト概要


今回作ったプログラムはgithubに載せました。
https://github.com/takafuminaka/nRF52832/tree/master/i2s_ws2812b_demostration_planB
(https://github.com/takafuminaka/nRF52832.git)

nRF5 SDK 11.0.0-2.alpha_bc3f6a で動作させています。

W2812Bの制御に必要なルーチンはws2812b_drive, i2s_ws2812b_driveディレクトリに集約しています。

main.cで、led_array_work配列にRGBの各輝度を設定して、更新処理を繰り返し呼び出しています。

処理の流れ

  • 処理全体はデモパターン3種の繰り返し
  • 各デモは次を設定時間ループで実行
    • led_array[*].green, led_array[*].red, led_array[*].blueに各要素の輝度(0~255)を設定
    • ws2812b_drive_current_cap(led_array_work, NUM_LEDS, CURRENT_LIMIT); // 電流制限のための輝度調整
    • ws2812b_drive_dim(led_array, NUM_LEDS, dim); // フェードイン、アウトの輝度調整
    • i2s_ws2812b_drive_xfer(led_array, NUM_LEDS, I2S_STDO_PIN); // LED更新
    • nrf_delay_ms(DELAY_MS); // 次の更新までの待ち
  • LED更新処理は、ハードウェアの初期化、転送バッファメモリの確保、実際の伝送、伝送完了後のハードウェアの終了処理をすべて1つの関数にまとめました。通常の利用では、この方が使いやすいと思います。
  • ただし、毎回メモリの確保・開放を行うなど無駄が多いので、効率や処理速度を重視する場合は、当該関数の処理を展開してください。
  • 電流制限はWS2812B の消費電流調査のデータを参考に作成しました。上記動画中、USB電流計が電圧と電流を交互に表示しています。1.5A制限のプログラムで1.3A位に収まっていますので、うまく機能しているようです。

調整パラメータ

ファイルproject.h

#define NUM_LEDS (240) // Number of LEDs (LED総数)
#define MAX_INTENSE (64) // Max intense of random LEDs for "flashing_random" (flashing_random用のランダム色LEDの最大輝度)
#define MAX_INTENSE2 (255) // Max intense of "shooting start" running bright LEDs for all demos.
#define MAX_INTENSE3 (64) // Max intense of "rainbow LEDs" for "running_rainbow" and "running_rainbowv" demos.
#define MIN_INTENSE (1) // Minimum intense of randaom LEDs for "flashing_random" (flashing_random用のランダム色LEDの最小輝度)
#define ROW_SIZE (17) // Count of LEDs for each line (1巻き分のLEDの数)
#define CURRENT_LIMIT (1500) // Current limit of LEDs (mA) (総電流制限値)
#define FADE_IN_MS (6000) // Fade in/out period (フェードイン・アウトの秒数)


ファイルmain.c

新しいデモを追加する場合は、demo_list_t demo_listに定義を追加してください。
各デモは初期化処理、更新処理、終了処理を準備し、1回更新後の待ち時間(ms)、デモの継続時間(ms)、デモの更新処理の所要時間(継続時間調整用、ms)をパラメータ設定しています。