1.6K Views
September 01, 23
スライド概要
SWEST25 EmbLTの資料
組込みソフトウェアエンジニア。 技術バックボーンはC言語・ベアメタル。 CQ EVカートのオーナーで、ハード・ソフトウェアの改造を通じて自身のスキルアップを日々考え中・・・。 LAPRASポートフォリオ: https://lapras.com/public/k-abe GitHub: http://github.com/grace2riku Qiita: https://qiita.com/juraruming Zenn: https://zenn.dev/k_abe よろしくね。
SWEST25 EmbLT 2023/8/31 Nerves Spresense HostIF と を で通信してみた パーソルクロステクノロジー株式会社 第1技術開発本部 第4設計部 設計2課 阿部耕二
目次 自己紹介 概要 背景 Spresense, HostIF 開発環境 動作確認結果 ソースコード解説 感想 とは? 2
とSpresenseをHostIFで通信してみた 自己紹介 Nerves 名前: 阿部 耕二(あべ こうじ) 所属: パーソルクロステクノロジー株式会社 第1技術開発本部 第4設計部 設計2課 医療機器の組込みソフトウェア開発。C言語。 趣味: 宇宙開発(リーマンサットプロジェクト広報メンバー) LAPRAS ポートフォリオ : https://lapras.com/public/k-abe Twitter: @juraruming 3
とSpresenseをHostIFで通信してみた 概要 Nerves (ターゲットはラズパイ4)とSpresenseがHostIFでデータ受 信できた。 Nerves 4
とSpresenseをHostIFで通信してみた 背景 Nerves Spresense は以前から興味をもっており、技術書を書いたりしてい た。 リーマンサットプロジェクトの衛星RSP-02の記事でSpresenseの HostIF 機能(※)を知る。 ※Spresense 外部のホスト IC に通信インタフェース機能を提供する Spresense をシステムのメインマイコンではなく、サブマイコンで 使うという選択肢・可能性にワクワクした。 HostIF 機能のホストはモダンな開発環境に憧れがあり、 Elixir も学 びたいという理由でNervesにしたいと考えた。 5
Nerves とSpresenseをHostIFで通信してみた Spresense, HostIF とは? とは? ソニーが開発したボードコンピュータ Arduino UNO ではパワー不足、ラズパイではハイスペックすぎる、 という場合にマッチするかもしれない。 以前、こちらにSpresenseの魅力を書きました Spresense の魅力を語る !!! Spresense 6
Nerves とSpresenseをHostIFで通信してみた 7
Nerves とSpresenseをHostIFで通信してみた とは? Spresense 外部のホスト IC との通信インタフェース機能を提供 通信IFはI2CかSPIを選択可能 1KByte の通信バッファをサイズ・転送方向を設定可能 バッファに排他ロック機構がある ホストとSpresenseは安全にデータ送受信が可能!!! HostIF 8
Nerves とSpresenseをHostIFで通信してみた ホスト受信 図は下記より引用 Spresense SDK の開発 -> 開発ガイド -> 5.15.3.5.1. HOST 受信シー ケンス HostIF https://developer.sony.com/sp resense/developmentguides/sdk_developer_guide_j a.html#_host_ 受信シーケンス 9
Nerves とSpresenseをHostIFで通信してみた ホスト送信 図は下記より引用 Spresense SDK の開発 -> 開発ガイド -> 5.15.3.5.2. HOST 送信シー ケンス HostIF https://developer.sony.com/sp resense/developmentguides/sdk_developer_guide_j a.html#_host_ 送信シーケンス 10
とSpresenseをHostIFで通信してみた 開発環境 Nerves ハードウェア ラズパイ4B HostIF のホストとする。 Nerves を書き込む。 Spresense メインボード HostIF をホストに提供す る。 ホストとSpresenseとの通信IF はSPIを選択し動作確認した。 11
Nerves とSpresenseをHostIFで通信してみた レベル変換IC ラズパイ3.3V, Spresense 1.8Vなのでレベル変換する。 https://akizukidenshi.com/catalog/g/gK-17062 用 ピン コネクタ ピッチ変換基板 メインボードに の ピンがないので変換基板で の信号を引き出す SPRESENSE 100 B2B Spresense HostIF IO HostIF https://www.switch-science.com/products/3999/#erid10805888 12
Nerves とSpresenseをHostIFで通信してみた ソフトウェア Nerves $ mix nerves.info Nerves: 1.10.3 Nerves Bootstrap: 1.11.5 Elixir: 1.15.4 $ elixir -v Erlang/OTP 26 [erts-14.0.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns] [dtrace] Elixir 1.15.4 (compiled with Erlang/OTP 26) Spresense SDK NuttShell (NSH) NuttX-11.0.0 nsh> uname -a NuttX 11.0.0 SDK3.0.0-81b78d8 Aug 14 2023 22:44:07 arm spresense 13
Nerves とSpresenseをHostIFで通信してみた ソースコードはこちらです。 Nerves (ホスト) : 今回移植したもの https://github.com/grace2riku/nerves_laboratory/blob/main/spres ense_hostif/lib/spresense_hostif.ex HostIF ム 提供側(Spresense):チュートリアルのサンプルプログラ https://github.com/sonydevworld/spresense/blob/master/example s/hostif/hostif_main.c ホスト:移植対象 HostIF https://github.com/sonydevworld/spresense/blob/master/example s/hostif/host_spi_main.c 14
とSpresenseをHostIFで通信してみた 動作確認結果 Nerves チュートリアルのサンプルプログラムで動作確認した。 チュートリアルのサンプルプログラムのホストは 、コードはCで実装されている。 ホストをNerves(ラズパイ4B)で、コードはElixirに移植した。 HostIF HostIF Spresense 15
Nerves とSpresenseをHostIFで通信してみた チュートリアルのサン プルプログラムの概要 今回はBuild Versionを読むと ころまでできた。 HostIF 16
Nerves とSpresenseをHostIFで通信してみた チュートリアルのサン プルプログラムの通信バッファ の構成 Spresense SDK の開発 -> 開発ガイド -> 13.1.4.1. 通信バッファ構成 HostIF https://developer.sony.com/sp resense/developmentguides/sdk_tutorials_ja.html#_ 通信バッファ構成 17
Nerves
とSpresenseをHostIFで通信してみた
実行結果
Nerves に SSH ログイン後、ログ出力を有効化し
SpresenseHostif.get_version 関数を実行する。
iex(1)> RingLogger.attach
:ok
iex(2)> SpresenseHostif.get_version
12:37:36.523 [info] cmd_result = 0, Buffer id = 2, Buffer size = 51
12:37:36.523 [info] bufsize = 54, data_len = 51, icmd_varlen_trans_cmd = 162, data_len_low_byte = 51, data_len_high_byte = 64
{:ok,
<<83, 68, 75, 51, 46, 48, 46, 48, 45, 56, 49, 98, 55, 56, 100, 56, 32, 65, 117,
103, 32, 49, 52, 32, 50, 48, 50, 51, 32, 50, 50, 58, 52, 52, 58, 48, 55, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...>>}
12:37:36.524 [info] cmd_result = ok, Version = SDK3.0.0-81b78d8 Aug 14 2023 22:44:07
バージョン情報SDK3.0.0-81b78d8 Aug 14 2023 22:44:07が読み出せ
た。
18
とSpresenseをHostIFで通信してみた ソースコード解説 Nerves (ホスト) Nerves : https://github.com/grace2riku/nerves_laboratory/blob/main/spresen se_hostif/lib/spresense_hostif.ex 関数: バージョン文字列を返す get_bufsize 関数 : HostIF 通信バッファのサイズを返す。 バージョンを格納している通信バッファのサイズを取得している。 host_receive 関数 : ホストのデータ受信関数。データが格納されてい る通信バッファを指定し、データを受信する。 get_version 19
とSpresenseをHostIFで通信してみた 感想 Nerves のモダンさを体感できた。 ライブラリ を利用することによりSPI通信をサクッと実 現できた( 通信条件をデフォルトから変更したが問題なく動作 した)。 一番感動したのはSPI受信バイナリデータのパターンマッチングの 実装部分。 受信データのステータス、バージョン情報など必要な情報の取り出 しをわかりやすく、綺麗に実装できた。 C 言語ばかりやっているためか Nerves, Elixir 環境のモダンさに余計 に感動した。 Nerves, Elixir Circuits.SPI SPI 20
Nerves
とSpresenseをHostIFで通信してみた
spresense_hostif.ex host_receive
関数
でSPI送受信。
受信データの2byte目がコマンドのステータス(0が正常)
3byte 目以降が受信データ(今回はバージョン情報の文字列)
SPI.transfer
import Bitwise
def host_receive(buffer_id, bufsize, lock) do
data_len = bufsize - 3
icmd_varlen_trans_cmd = @icmd_varlen_trans_id + buffer_id
lock_bit =
if lock do
0x40
else
0x00
end
data_len_low_byte = data_len &&& 0xff
data_len_high_byte = ((data_len >>> 8) &&& 0x3f) ||| lock_bit
Logger.info("bufsize = #{bufsize}, data_len = #{data_len}, icmd_varlen_trans_cmd = #{icmd_varlen_trans_cmd}, data_len_low_byte = #{data_len_low_byte}, data_len_high_byte = #{data_len_high_byte}")
{:ok, ref} = SPI.open("spidev0.0", mode: 1, speed_hz: 800000)
{:ok, <<_::1-unit(16), cmd_result::1-unit(8), receive_binary_data::bytes>>}
= SPI.transfer(ref, <<icmd_varlen_trans_cmd::1-unit(8), data_len_low_byte::1-unit(8), data_len_high_byte::1-unit(8), 0xff::size(data_len)-unit(8)>>)
SPI.close(ref)
case cmd_result do
0 -> {:ok, receive_binary_data}
_ -> {:error, "Error receive data."}
end
end
21
とSpresenseをHostIFで通信してみた 参考資料 Nerves チュートリアル チュートリアル チュートリアル 1. Spresense SDK 13. HostIF https://developer.sony.com/spresense/developmentguides/sdk_tutorials_ja.html#_hostif_ 開発ガイド 2. Spresense SDK 5.15. Host Interface (HostIF) https://developer.sony.com/spresense/developmentguides/sdk_developer_guide_ja.html#_hostif 22
Nerves とSpresenseをHostIFで通信してみた ご清聴ありがとうございました 23