Tweet

<< 2017.11 >>
[日記]
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

2017 年 10 月 31 日 (火)

ESP-WROOM-32をARM-USB-TINYでGDBデバッグする

ESP-WROOM-32 で hello,world サンプルプログラムが動いたので,「次はデバッガだよね」ということで GDB でデバッグできるようにしてみました.

環境

ターゲットボード
ESP-WROOM-32 ESP32 DevKitC
JTAGアダプタ
Olimex ARM-USB-TINY
PC
OS Linux (debian x64; buster(testing))
開発環境
ESP-IDF

構成

OpenOCD で JTAG プロトコル ←→ GDB プロトコルの変換をさせるという,組み込みではよくある構成です. 図にするとこんな感じかな.

                                                +--------------- Linux PC ------------+
                                                |                                     |
ESP-WROOM-32 <--(JTAG)--> ARM-USB-TINY <--(USB)-|-> OpenOCD <--(TCP loopback)--> GDB  |
                                                |                                     |
                                                +-------------------------------------+

OpenOCD のインストール

ここの説明に従って,コンパイル済みの tarball をダウンロードし,~/esp で展開します.

デバッグされるプログラムの用意

デバッグ対象となるプログラムを用意します. 今回は ESP32 のサンプルプログラムの「hello,world 」を少しいじりました.

main/hello_world_main.c ファイルの app_main() 中で

  • app_main() から抜けずにループするようにする
  • リブートしないようにする

ようにしました. デバッガに接続したままリセットがかかると,デバッガとの同期が外れてうまく動きません.

このプログラムをターゲットボードに書き込みます.

ESP-WROOM-32 と ARM-JTAG-TINY の接続

ESP-WROOM-32 と ARM-JTAG-TINY を以下の表に従って接続します.

ARM-JTAG-TINYESP-WROOM-32
ピン番号名称ピン名称
1VTREF3.3V
4GNDGND
5TDIGPIO12
7TMSGPIO14
9TCKGPIO13
13TDOGPIO15

ARM-USB-TINY のピン番号はここの図を参考にしましょう.

今回はブレッドボードワイヤで接続しました. 一時的なものでなく使いつづけるのならば,きちんとしたものを工作したほうが良いかと思います.

1509428396842.jpg

OpenOCD の起動

JTAG アダプタを接続し,OpenOCD を起動します.

$ cd ~/esp/openocd-esp32
$ bin/openocd -s share/openocd/scripts -f interface/ftdi/olimex-jtag-tiny.cfg -f \
board/esp-wroom-32.cfg
Open On-Chip Debugger 0.10.0-dev-ga859564 (2017-07-24-16:16)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
adapter speed: 20000 kHz
force hard breakpoints
Info : ftdi: if you experience problems at higher adapter clocks, try the command "ftdi_tdo_sample_edge falling"
Info : clock speed 20000 kHz
Info : JTAG tap: esp32.cpu0 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : JTAG tap: esp32.cpu1 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : esp32: Debug controller was reset (pwrstat=0x5F, after clear 0x0F).
Info : esp32: Core was reset (pwrstat=0x5F, after clear 0x0F).

GDB の起動

OpenOCD を動かしているものとは別にターミナルを開いて GDB を起動します.

$ cd ~/esp/hello_world/
$ xtensa-esp32-elf-gdb build/hello-world.elf 
GNU gdb (crosstool-NG crosstool-ng-1.22.0-73-ge28a011) 7.10
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-build_pc-linux-gnu --target=xtensa-esp32-elf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from build/hello-world.elf...done.
(gdb) target remote localhost:3333
Remote debugging using localhost:3333
0x00000001 in ?? ()
(gdb) c

あとは,普通に GDB デバッグするだけです.

注意としては,プログラムのコードは ROM 上にあるので,通常のブレークポイントは使えません. 代わりにハードウェアブレークポイントを使います. 例えば

(gdb) b 37

などでブレークポイントを設定していたところを

(gdb) hb 37

とするだけです.

2017 年 4 月 13 日 (木)

ラダーロジックで nucleo マイコンをプログラミング

ラダーロジックで nucleo マイコンを制御してみました.

ラダーロジックとは

ラダーロジックとは,リレーの組み合わせでプログラムを記述する言語です. で,リレーというのは,スイッチを電磁石で動かす素子です. 昔はリレーで論理回路を組んだコンピュータや計算機がありましたね. 詳しくは「WikiPedia.ja:ラダー・ロジック」を参照してください.

ラダーロジックの例を以下に示します.

|    Q         R         Q    |
+---| |---+---|/|-------( )---+
|         |                   |
|    S    |                   |
+---| |---+                   |
|                             |
  • 左右の | は母線(電源ライン)
  • ---( )--- はコイル(電磁石)
  • ---| |--- は A 接点
    電磁石に電流が流れるとオンになる接点.
  • ---|/|--- は B 接点
    電磁石に電流が流れるとオフになる接点.
  • コイル・A 接点・B 接点の上の記号は変数
    同じ記号のコイルと接点でリレーを構成します.

で,上記の回路では

  • Q もしくは S が ON になると,Q の電磁石に電流が流れる
  • R が OFF になると Q に流れていた電流が切れる

ということで,論理回路の RS ラッチのような動作をします.

nucleo とは

nucleo とは,STM32 マイコンを搭載したボードマイコンです.

マイコンでの開発となると JTAG を使ってプログラムの書き込みやデバッグをするのが普通です. が,このボードには主マイコンの他にプログラム書き込み・デバッグ用のマイコンが搭載されていて,パソコンと直接 USB ケーブルでつないでプログラムの書き込みやデバッグができます.

今回はこの↑ nucleo F446RE を使いました.

このボードは,38 ピン x 2 の入出力コネクタの他に Arduino 互換のコネクタもあり,(プログラムを書けば)Arduino のシールド(ドータボード)が使えます. ただし,ロジック入出力レベルが Arduino UNO の 5V と違って nucleo は 3.3V なので,これが原因で動かないシールドもあると思います.

開発の流れ

図にすると以下のようになります.

PLC Open Editor ←→ (プロジェクト保存ファイル)
      ↓                                                   
(ST 言語プログラム)
      ↓
    matiec                                       STM32CubeMX
      ↓                                             ↓
(C 言語プログラム)    (グルーロジック)     (C 言語ソースコードツリー)
      ↓                    ↓                       ↓
       -----------------------------------------------
                            ↓
                    コンパイル・リンク
                            ↓
                  (ファームウェアバイナリ)
                            ↓
                         書き込み
  1. PLC Open Editor でラダーロジックを入力し,IEC 61131-3 ST 言語ファイルを作成します.
  2. matiec で ST 言語のファイルを C 言語に変換します.
  3. STM32CubeMX(ソースコードツリージェネレータ)で GPIO ピンを設定し,C のソースコードツリーを生成します.
  4. ラダーロジック側の C プログラムと STM32CubeMX で生成したソースコードツリーをつなぎ合わせるグルーロジックを C 言語で記述します.
  5. C ソースツリーのコンパイル・リンク
  6. ファームウェアバイナリの書き込み

初回はこのような手順になります.

入出力ピンが確定し,グルーロジックが出来上がっている状態ならば

  1. ラダーロジックの編集
  2. make 一発でファームウェアバイナリの生成
  3. 書き込み

で,ラダーロジックの修正ができます.

利用シーン

C 言語でプログラムが書けるのならば,素直に C 言語オンリーで書いた方が良いでしょう.

が,ラダーロジックの使い手は,制御対象に対して独自のノウハウを持っていることが多いようです. そのような方と共同で作業する場合は,このような開発手段も有効かと思います.

開発例

LED 点滅のラダーロジックを組んで,実際に上記の手順でファームウェアを作りました.

この記事のウケが良かったら書いてみようかと思います.

リンク

あと,この本も参考になると思います.

2017 年 3 月 15 日 (水)

ルーペあれこれ

この前までプリント基板を設計・製作する仕事をやっていた. 昔,回路設計の仕事をしていたときは 1608 のチップ抵抗ぐらいは電気スタンドの照明ぐらいでらくらくハンダ付けできたのだけど,最近はキツい.

「老眼」というやつである.

ここでムリに若者ぶってもしょうがないので,素直に文明の利器のルーペに頼ることにする. というわけで,あれこれ試してみた感想.

老眼鏡

試しに使ってみようかとダイソーへ行き,100 円老眼鏡を試着してみる.

…ダメだ,こりゃ.

私の場合,裸眼で視力 0.1 を切る強い近眼なので,眼鏡無しで老眼鏡単体だと焦点の合う距離が 10cm を切るぐらい近くなってしまう. こんな状態では作業なんかムリ.

が,眼鏡をかけてる人でも老眼鏡でイケる人もいるので,近眼の人でも使えるかどうか一度は試してみるといいかも.

眼鏡の上からかけるルーペ

通販の「ハヅキルーペ」みたいに眼鏡の上からかけられる眼鏡. amazon からこんなやつを入手.

使ってみた感想は

  • 作業する場合,全体を見渡したりするのにルーペ無しで見たくなる場合があるのだけれど,いちいち外さないとならないのが面倒
  • 作業なんかよりも,読書に向いているのかな
  • 折りたためば普通の眼鏡の大きさになるので,持ち運びには便利

外出先で作業する場合は,このタイプがあるといいのかな.

ヘッドルーペ

鉢巻にルーペが付いているタイプ. 以前,マルツで数百円で安売りしていたもの.

IMG_20170315_052804.jpg

感想

  • 鉢巻とルーペはハトメで固定されているのだが,ルーペを動かすとハトメに髪が絡まって痛いので,ハトメの内側にテープを貼ったら快適.
  • ルーペ部を上下できるので,拡大したいところにレンズを合わせられて使いやすい.
  • 上に跳ね上げれば眼鏡を通さずに全体を見渡すこともできる.
  • 鉢巻の部分がプラスチックでできているので,折りたたみはできず,持ち運びには難がある.

外に持ち運ばないような場合は,このタイプが一番使いやすいかな. もっとしっかりしたやつを買おうかなぁ.

電気スタンド一体型

電気スタンドとルーペが合体したタイプ. 私はこの型の蛍光灯タイプを購入(今は LED に切り替わっているらしい).

感想

  • 基板に黙々と部品を付けるときには使える
  • 基板を改造するのにあっちこっちひっくり返して作業するときは,ルーペが邪魔になる
  • 大きめのものを扱う場合,ルーペが届かないところが出てくる.

作業によっては使い勝手がいいかもしれません.


RSS

http://jr0bak.homelinux.net/~imai/pukiwiki/pukiwiki.php?cmd=rss&ver=1.0 で RSS を取得できますが,Wiki 全体の RSS になってしまいます. 細かいことは気にしないでね.

リンク

この日記へのリンクはご自由にどうぞ.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-05-05 (火) 06:10:37 (3125d)