2019年6月11日火曜日

Raspberry Pi 2とZero WでFCNを走らせてみた




れぽーよなんて大嫌いな中の人です.
今回は秋月で安売りしてたことを知ってわざわざ学校を抜け出して入手した
たまたま入手できたRaspberry Pi 2とZero Wを比較する話です.



今回この二つのボードを使っていくわけですが,その前にスペック比較を
Pi Zero
  • 1GHz, single-core CPU
  • 512MB RAM
Raspberry Pi 2
  • A 900MHz quad-core ARM Cortex-A7 CPU
  • 1GB RAM

シングルコアの性能はZeroのほうがいいかも.ただ4コアのPi 2のほうがトータルで速そうだけどどうなんだろう?

というわけで実際にプログラムを実行して比べてみましょう.実行するのは最近いじってきたFCNの最新版です.(レイヤーを4層に減らしたらなぜか精度が上がったのはなんででしょうか...)

Pi 2 : 0.020[s/frame]
Pi Zero W : 0.060[s/frame]
(それぞれ100回平均)

Pi 2の速さが圧倒的すぎる.(目標の30fps超えちゃってるヨ...)
個人的にはPi 2がもう少し遅いと思ったんですが,予想を超えてきましたね.Pi Zero Wはレイヤー数を落とした関係で15%ぐらい速くなったのはうれしいです.

まあ今更Pi 2かよって話ですが,予想以上に高速化できたのでよかったです.(Pi 3Bとかだともっと速くなりそう)


参考
https://www.raspberrypi.org/products/raspberry-pi-zero-w/
https://www.raspberrypi.org/products/raspberry-pi-2-model-b/

STM32のSPI+DMAで詰まった話(HAL使用・STM32F413)


 最近いろいろあってマウスお預け状態の中の人です。MPU6500+AS5047をSPI一系統で読もうとするとSPIのモードやらクロック周波数やらを変える必要がありますが、最も問題になるのが送受信のデータフォーマットです(MPU6500は8bit、AS5047は16bit)。今回はその違いにより結構影響を受けた話&その解決策です。


1. DMA転送を使ってSPI通信をする

 STM32ではDMA転送を使ってSPI通信をすることができます。で、こいつを使う際にはSPIの設定のほかにDMAの設定を行わなくてはなりません。
 ...といってもDMAの設定はNormal/Circularの設定と、転送データ幅のみです。今回はSPIの要求をいちいち出す方式にしたので、Normalにしました。 問題となったのは転送データ幅の部分です。

2. 転送データ幅とSPIのデータサイズ

今回使用したAS5047とMPU6500ではSPIのモードや一度にやり取りするデータサイズが異なっていました。

AS5047 DataWidth:16bit CPOL:0 CHPA:0 -> Mode:1
MPU6500 DataWidth:8bit CPOL:0 CHPA:1 -> Mode:0

マイコンのピン数の問題で、SPIは1系統に絞ったので通信するたびにモードを変更する必要があります。こちらはHAL_SPI_Initでどうにかなったのですが、問題はDMA転送をどうするかです。
で、以下の二つを試しました。

1): DMAのデータ幅を16bitに設定して、AS5047と通信する
2): DMAのデータ幅を8bitに設定して、AS5047と通信するときは2Byte分送りつける

3. 試した結果

1) データ幅16bit




  こんな感じで設定して...


こんな結果が出てきました。上側のエンコーダの値はあっていそうですが、当然ジャイロからは値がかえって来ません(HAL_DMA_Initか何かで設定をかえれば読み取れるとは思いますが)。

2) データ幅8bit



こちらもこんな感じで設定して...


結果はこんな感じ。設定を変えずとも送るデータ数を倍にすれば読み取れそうです。ジャイロも読み取れています。

4. で、どうするよ

設定を変えるのが面倒だったので、今回はデータ幅8bitでやっていこうと思います。


©2019 shts All Right Reserved.