今日こそ頑張ります

危機感を抱きつつ、怠けるエンジニア。日記や備忘録。(以前のブログ:http://harupanda.blog.jp/)

新緑の季節

2023年も桜が終わり、新緑の季節になりました。
時間が過ぎるのはあっという間ですね。

副鼻腔炎は4月になってからようやく良くなってきました。
抗生物質を飲んでいても全然症状は改善しなかったので、
チクナイン(錠剤)を飲み始めたのですがそれでもダメで、
粉タイプのチクナインでようやく目に見えて症状の改善がみれました。

あと、サイナスリンスで鼻うがいをする際に、コンクール(うがい薬)を
3~4滴混ぜるという民間療法も同時に試してみました。
これも効果があったのかも?

ここまで6か月以上かかりました。
まだ完治ではないですが、7割くらいは治ったという感触です。

急性副鼻腔炎

去年の11月くらいから咳が止まらなくて、
12月くらいになって鼻の奥に水が溜まる感覚(お風呂とかプールで水が鼻に入った感覚)が出てきた。
ネットで調べた感じだと、蓄膿症に該当しそうな症状だったので
チクナインを買って1週間様子を見たんだけど、治らず。

12月の半ばくらいに耳鼻科行って診察を受けたら、やっぱり急性副鼻腔炎だった。

そこから抗生物質を飲み続け、3週間経過したところで、ようやく症状が改善しつつある感じ。
抗生物質が効いているのか、年末から始めた鼻うがいが効いているのか、どっちかがわからないが。

自分の場合、鼻水が喉に落ちてしまう後鼻漏という症状が強くて
咳が止まらない状態が続いてしまう。このご時世的に咳症状は周りの目が気になる…。
ずっと在宅ワークにするわけにもいかず咳を我慢しながら働いている状態。

この調子だと、完治まではあと1か月かな…。

それにしても、ブログの文章を書くのが年々下手になってきている。
今年はこのあたりも改善していきたいな。

2023年になりました(2022年の振り返り)

早いもので2023年です。人生40回目のお正月です。
今年も去年のように振り返りをしてみたいと思います。
本来は年末にやるものですが。
papapaaaanda.hatenablog.com

新しい会社で働き始める(2022年2月)

去年の2月から新しい環境で働き始めました。
もうすぐ1年が経ちます。

しばらくはツライだろうけど、歯を食いしばってまず1年がんばるつもり。

こんな気持ちを書いていましたが、
経験の無い分野ばかりの仕事になっているのは想定通りですが、
ツライということはあまり感じなかったです。(前の職場の方が色々と辛かったかも?)
未熟なことに対して寛容な職場であるということが大きいかもしれません。
とはいえ、成果をどんどん出していかねばならぬ状況ではあるので、
一段と気を引き締めて頑張っていきたいと思います。

次女が骨折(2022年4月~9月)

保育園の遠足先の公園で次女が手首を骨折しました。
ボルトを入れて固定するレベルの骨折で、1か月半くらいはボルト+ギブス包帯で固定。
日本スポーツ振興センターの給付金の請求というやつも初めて経験しました。

長女が思春期早発症の診断(2022年5月~9月)

もともと身長が圧倒的に高かった(成長曲線の上限のさらに上)長女ですが、
小2で生理もきてしまったということで、病院に相談。
巨人症(先端巨大症)の検査のため、検査入院を何回か繰り返す。
結局、思春期早発症ということに落ち着き、定期的にホルモン抑制の注射を受けています。

家族でコロナ感染疑惑?(2022年7月)

次女が陽性判定に。。。

ISP1807でBLEペリフェラルを実装するための準備

前回まででISP1807に対して、nRF52833-DKの
オンボードJ-Linkを使って任意のソフトを書き込む準備ができました。

今回は、ISP1807でSDKのBLEペリフェラルソフトを走らせるところまでやります。
これも先人たちの参考資料ほぼそのままなんですが。

ソフトデバイス

まず、ソフトデバイスってやつをダウンロードします。
こちらの記事の通りです。
qiita.com

ソフトデバイスというのは、Nordic 社が提供するBLEのプロトコルスタックライブラリの名称です。
nRFでBLEを利用するためには必須ってことですね。
Nordicのダウンロードサイトをみると、nRF52840だと、S113もしくはS140が対応するようです。

違いとしては、S113だとペリフェラル機能のみだが、省メモリ。
S140だとセントラル+ペリフェラル機能の両対応で、リッチ。
とりあえず両方ダウンロードして、書き込みはS113にしておくことにします。

nRF Connect for Desktop

ソフトデバイスをnRFに書き込むために、nRF Connect for Desktopをインストールします。
nRF Connect for Desktop - Downloads - nordicsemi.com

nRF Connect for Desktopはいろいろな開発ツールが詰まったランチャーソフトみたいなものです。
その中のProgrammerというソフトを使ってソフトデバイスを書き込みます。

さて、Programmerをインストールして起動し、さらにnRF52833-DKを接続(ISP1807をJ-Link経由で接続したもの)すると
下記のように、左上のデバイス名称欄には、「ISP1807」や「nRF52840」という名称ではなく、
nRF52833-DKという名称が表示されます。

「あれ、J-Link先のデバイスが認識されないのか??」と、初めは戸惑いましたがこれで正しいようです。
接続されているJ-Linkデバイスそのもの、という意味で、nRF52833-DKと表示されているようです。
J-Link先のデバイスとしては、Programmerのウィンドウのところに、ちゃんとNRF52840の名称が出ています。
(ちなみに、J-Linkの配線を外すと、NRF52840の表示はERRORになってしまいます。)

この状態で、File Memory layoutのところにソフトデバイスの.hexファイルをドラッグアンドドロップします。
さらに、Readアイコンをクリック。
すると下記のような表示になります。

右が現在のデバイスの状態。
左が.hexファイルのレイアウト。
この状態で、Erase&writeをクリックするとソフトデバイスが書き込まれます。
書き込み後にReadをクリックして、書き込み後の状態が.hexファイルと同様になっているかを確認します。

とりあえず、BLEビーコンを発射させる

とりあえず、サンプルソフトを書き込んで走らせます。
BLEビーコンを出してみることにします。
下記プロジェクトをDebug&Runします。

nRF5_SDK_17.1.0_ddde560\examples\ble_peripheral\ble_app_beacon\pca10056\s140\ses

と、ここで、コンパイルエラーが発生します。

SEGGER_RTT_Syscalls_SES.c:76:10: fatal error: __vfprintf.h: No such file or directory

今回もDevZoneを調べてみると、下記のような書き込みがありました。
devzone.nordicsemi.com

There has been a change in recent Segger Embedded Studio versions that require you to remove the SEGGER_RTT_Syscalls_SES.c file from the project.

というわけで、深く考えずにBuild対象から除外します。
ProjectツリーのところでSEGGER_RTT_Syscalls_SES.cを右クリックして、
Exclude from Buildをクリックです。

これでDebug & Runすると、ビーコン(アドバタイズパケット)が発射されます。
確認方法としては、スマホでLightBlueというアプリを実行すると、
NordicのManufacturer Specific Dataが載ったパケットが確認できるので、
それでうまく実行できていることがわかります。

次回はGatt通信や、セントラル側も走らせてみたいなぁと思います。

ISP1807でLチカ

前回まででnRF52833-DKのLチカができたので、
今回はISP1807でLチカをさせたいと思います。
先日買っておいた、スイッチサイエンスのISP1807(USB Type-C版)の出番です。

nRF52833-DKをオンボードJ-Linkとして接続

今回の主目的はLチカというよりかは、
nRF52833-DKをオンボードJ-Linkとして使えるようにすることが本題です。
といっても、大したことはありませんでした。

まずは、ISP1807とnRF52833-DKをジャンパーで接続します。
下記の記事を参考にさせていただきました。

lipoyang.hatenablog.com

今回は、ISP1807がブレイクアウトボードに実装されているので
本当にジャンパーで接続するだけです。
(ヘッダーピンのはんだ付け+ブレッドボードへの挿入は必要でしたが)

接続関係は上記の記事通りですが、以下の通り。

nRF52833-DKの接続 ISP1807の接続
GND GND
VDD_nRF VDD_nRF
GND DETECT GND
VTG VDD_nRF
SWD_CLK SWD_CLK
SWD_IO SWD_IO

Projectの設定

必要かどうかはわからないが、
SESのプロジェクトファイルの設定をいじりました。

画面左のプロジェクトツリーのプロジェクト名で右クリックし、Optionを選択。
DebugグループのDebuggerのところで、Target DeviceをnRF52840_xxAAにしました。
(そもそもnRF52833になっていなかったが)

また、Register Definition Fileをnrf52840.svdにしました。

あとの設定はよくわからんので、いさぎよく放置です。

いざLチカ

とりあえず、前回作ったLチカソースコードで、
オンボードの4つのコードに関わるところはすべてコメントアウトし、
P0.23のGPIOのところだけ、生かしておきます。

幸いなことに、P0.23はISP1807でも引き出されているので
そこからブレッドボード上に、前回と同じく3.3kの抵抗とLEDを接続します。

あとはSESで、Build&Runです。
「外部ターゲットに書き込む」みたいな選択がどこかにあるのかと思ったのですが、
見当たらなかったので、とりあえずBuild&RunしてみたらちゃんとISP1807に書き込まれました。

オンボードLEDに関する記載をすべて殺したのに、nRF52833-DKのオンボードLEDは
相変わらずチカチカしていたので、nRF52833-DK側には書き込みに行っておらず、
ISP1807だけに書き込んだのは間違いなさそうです。
外部ターゲットが接続されているのを検知したら、そっちに書き込むのでしょうか。

とりあえず、目的は達成できたのでよしとしましょう。
次回はいよいよ、BLEに取り組み始めます!

nRF52833-DKの任意のGPIOでLチカをする

nRF52833-DK上にはLEDが実装されていて、SDKのサンプルではその中の4つのLEDを点滅させるようになっています。

今回は、それら既存のLEDとは異なるLEDを1つブレッドボード上に用意し、
さらに別のGPIOを操作してブレッドボード上のLEDを点滅させることにします。
(そっちの方が練習になるかと思い。)

GPIOの選択と接続

P0.23のGPIOに、LEDおよび3.3kオームの電流制限抵抗を介して、VDD_nRF(3.3V)に接続しています。
ちなみにnRF52833のGPIOのドライバビリティ(電流駆動能力)はデータシートに載っておらず。
DevZoneで検索してみると15mAという話みたい。結構流せるのね。
今回は3.3kを介して1mAなんで余裕です。

※なお、P1.01~08のGPIOも空いていて、はじめはそちら(P1.03)に接続していましたが、
うまく制御できず。(サンプルプログラムがP1.**を制御することが想定されていないのか??)
きちんと制御アドレスとかを解析すればできそうだけど、今回はそれはパスしてP0番台のGPIOを選択。

ソースコードの編集

nRF5_SDK_17.1.0_ddde560\examples\peripheral\blinky\pca10100e\blank\ses\blinky_pca10100e.emProject
をベースに編集していきます。

main.cのmain関数。

int main(void)
{
    /* Configure board. */
    bsp_board_init(BSP_INIT_LEDS);

    /* Toggle LEDs. */
    while (true)
    {
        for (int i = 0; i < LEDS_NUMBER; i++)
        {
            bsp_board_led_invert(i);
            nrf_delay_ms(500);
        }
    }
}

ここはそのままです。
bsp_board_initでは、GPIOを初期化をしているようです。
while文のループ内のbsp_board_led_invertでLEDを明滅させます。
簡単ですね。

bsp_board_initと、bsp_board_led_invertに
P0.23のGPIOの初期化、およびトグルの記述を追加しましょう。

それぞれ、board.cに記述があります。
まず、bsp_board_initから。

void bsp_board_init(uint32_t init_flags)
{
    #if defined(BOARDS_WITH_USB_DFU_TRIGGER) && defined(BOARD_PCA10059)
    (void) nrf_dfu_trigger_usb_init();
    #endif

    #if LEDS_NUMBER > 0
    if (init_flags & BSP_INIT_LEDS)
    {
        bsp_board_leds_init();
    }
    #endif //LEDS_NUMBER > 0

    #if BUTTONS_NUMBER > 0
    if (init_flags & BSP_INIT_BUTTONS)
    {
        bsp_board_buttons_init();
    }
    #endif //BUTTONS_NUMBER > 0
}

ここもそのままです。
今回、ポイントとなるのはbsp_board_leds_init()で、ここにさらに潜ると、

static void bsp_board_leds_init(void)
{
    #if defined(BOARD_PCA10059)
    // If nRF52 USB Dongle is powered from USB (high voltage mode),
    // GPIO output voltage is set to 1.8 V by default, which is not
    // enough to turn on green and blue LEDs. Therefore, GPIO voltage
    // needs to be increased to 3.0 V by configuring the UICR register.
    if (NRF_POWER->MAINREGSTATUS &
       (POWER_MAINREGSTATUS_MAINREGSTATUS_High << POWER_MAINREGSTATUS_MAINREGSTATUS_Pos))
    {
        gpio_output_voltage_setup();
    }
    #endif

    uint32_t i;
    for (i = 0; i < LEDS_NUMBER; ++i)
    {
        nrf_gpio_cfg_output(m_board_led_list[i]);
    }
    bsp_board_leds_off();

    //test
    uint8_t led_test_pin = LED_TEST;
    nrf_gpio_cfg_output(led_test_pin);
    nrf_gpio_pin_write(led_test_pin,0);
}

ここで、GPIOを出力に初期化し、さらに初期設定として消灯しています。
それぞれ、nrf_gpio_cfg_outputと、bsp_board_leds_offですね。

これを真似して追加します。testコメントから下3行です。
LED_TESTというdefineは、pca10100.hに以下のように追加しています。

#define LED_1          NRF_GPIO_PIN_MAP(0,13)
#define LED_2          NRF_GPIO_PIN_MAP(0,14)
#define LED_3          NRF_GPIO_PIN_MAP(0,15)
#define LED_4          NRF_GPIO_PIN_MAP(0,16)
#define LED_TEST       NRF_GPIO_PIN_MAP(0,23)

同じようなノリで、bsp_board_led_invertにも下記のように追記します。

void bsp_board_led_invert(uint32_t led_idx)
{
    ASSERT(led_idx < LEDS_NUMBER);
    nrf_gpio_pin_toggle(m_board_led_list[led_idx]);

    //test
    uint8_t led_test_pin = LED_TEST;
    nrf_gpio_pin_toggle(led_test_pin);
}

基本的にはこれでいけるはずなんですが、最後に1つ力業が必要です。
nrf_gpio_cfg_outputの先で呼び出されるnrf_gpio_pin_port_decodeの中の
NRF_ASSERTをコメントアウトします。
nrf_gpio_pin_present_checkの先では、エラッタ処理を通したりしているようですが
ここをそのまま通すとエラー処理側に落ちてしまいます。
趣味工作の範疇ではスキップしても問題ないだろ!所詮チェックだし!ということで
潔くコメントアウトしましょう。

__STATIC_INLINE NRF_GPIO_Type * nrf_gpio_pin_port_decode(uint32_t * p_pin)
{
    //test
    //NRFX_ASSERT(nrf_gpio_pin_present_check(*p_pin));

これでLチカの完成です。
次はBLEをいじりたいのですが、nRF52833-DKは技適を通していないので
BLEの電波を飛ばせません。

といわけで、ここらで本番環境であるISP1807をいじり始めたいと思います。
(nRF52833-DKはもともとオンボードJ-linkの目的で買っております)

次回は、ISP1807を利用してLチカさせたいと思います。

SEGGER Embedded Studio for ARM (V6.40)をインストール

続き。

SESのインストール

SEGGER Embedded Studio for ARM などのツールをインストールしました。
参考にさせていただいたページは下記。
shizuk.sakura.ne.jp

SESは以下からダウンロード。
SEGGER - The Embedded Experts - Downloads - Embedded Studio

nRF52のSDKを以下からダウンロード。
nRF5 SDK downloads - nordicsemi.com

J-linkのソフトは以下からダウンロード。
SEGGER - The Embedded Experts - Downloads - J-Link / J-Trace

インストール自体はポチポチ押していくだけですね。
早速SDKのサンプルをビルドし、nRF52833-DK上でRunさせたいと思います。

まずはボードナンバーの確認から。
下記のページを参照します。
Nordic Semiconductor Infocenter

nRF52833-DKのボードは、PCA10110のようです。
Lチカサンプルの下記のプロジェクトを開きます。
nRF5_SDK_17.1.0_ddde560\examples\peripheral\blinky\pca10100e\blank\ses\blinky_pca10100e.emProject

なお、起動時に下記の画面が出て、ライセンスが見つからん、と言われます。

書いてある通り、非商用目的・教育目的であれば、このままAcceptをクリックで使い続けられますが
nRF52に対して使うのであれば、正式ライセンスが発行してもらえるので、せっかくなのでゲットします。
(毎回ライセンス確認画面が出てくるのも鬱陶しいですしね)
下の方にある"Obtain a License"をクリック。

ブラウザが立ち上がるので、下記の画面の"Request your license at..."のURLをクリック。

名前やメールアドレスを登録すると、登録したメアド宛にライセンスキーが届きます。
SES上のライセンスマネージャーにて、そのライセンスキーを登録すれば完了。

Buildエラーが出る。

早速、nRF52833_DK基板とPCをUSB(ちなみにJ2コネクタ側)で接続し、
blinky_pca10100e.emProjectをBuild&Debugしてみましたが、
下記のエラーに遭遇。

".text is larger than specified size" and ".rodata is larger than specified size".

なんでサンプルでエラーが出てくるねん・・・。

しかし何も心配はいりません。nRFを選択したもう一つの理由がここで活きます。
大概のトラブルは先人たちが解決し、Nordic Devzoneに答えを書いてくれているのです。

今回の問題も下記で解決しました。
(ただ、対処方法は書いてあるけど、根本原因の理解はできず・・・ですが)
Build error - Nordic Q&A - Nordic DevZone - Nordic DevZone

上記のページに書いてある通り、
nRF5_SDK_17.1.0_ddde560\examples\peripheral\blinky\pca10100e\blank\ses\flash_placement.xml
の記載をmodifyします。

下記の通り。

You should see:
ProgramSection alignment="4" load="Yes" name=".text" size="0x4" /
and
ProgramSection alignment="4" load="Yes" name=".rodata" size="0x4" /

Remove: size="0x4" from both lines resulting in:
ProgramSection alignment="4" load="Yes" name=".text" /
and
ProgramSection alignment="4" load="Yes" name=".rodata" /

https://devzone.nordicsemi.com/f/nordic-q-a/89236/build-error/374975より転載

これでコンパイルが通るようになりました。

続きは次回。