エアガン測定

http://www.eonet.ne.jp/~daisaku-tech/index.html

Arduino UNOとBlue PillのLCD描画速度

コントローラとしてILI9341が使用されているLCDの描画速度を比較しました。一つはArduino UNOで、もう一つはBlue Pill(STM32F103)です。

youtu.be

Adafruitライブラリに含まれるスケッチ例、graphictestを実行しています。Blue Pillの場合も同様です。

Blue Pillの方が高性能であるため、それがそのまま描画速度に反映されています。

BluePillはUSB不具合対策しなくてもスケッチ書き込みできるものがある

BluePill(STM32F103ボード)にはUSB関連で不具合があります。R10抵抗値が間違っており、1.5KΩであるべきところが、10KΩまたは4.7KΩが実装されています。そのため、USB接続でArduino IDEからスケッチを書き込もうとすると、エラーになって書き込めません。対策は次のいずれかになります。

  • R10を1.5KΩに取り換える
  • 3.3VとPA12間に1.8KΩの抵抗を接続してプルアップ

が、同じBluePillでも、シルクやリセットスイッチなどが異なるものが存在し、R10が10KΩのまま、不具合対策なしでもスケッチ書き込みできるものがありました。ただし、私の環境でたまたま書き込めただけ、という可能性があり、必ず同じ状態とは限りません。

f:id:daisaku_tech:20180912184400p:plain

Amazon.co.jpでSTM32F103を検索すると、複数のメーカーのものがヒットします。HiLetgoの2個セットのものと、Homylのものを2個、USB不具合がないBlackPillも2個購入しました。

HiLetgoのものは2個とも、不具合対策なしではスケッチ書き込みできませんでした。それに対してHomylのものは2個とも、不具合対策なしでスケッチ書き込みできました。

 

Blue Pill(STM32duino)のanalogRead実行時間は約7μs

STM32duino環境のBlue Pillボード(STM32F103)によるanalogRead実行速度は約7μsです。次のsketchで実行時間を見てみました。

int val[10];
unsigned long startTime;
unsigned long endTime;

void setup() {
  pinMode(PA0, INPUT_ANALOG);
  Serial.begin(115200);
}

void loop() {
  delay(1000);

  startTime = micros();

  val[0] = analogRead(PA0);
  val[1] = analogRead(PA0);
  val[2] = analogRead(PA0);
  val[3] = analogRead(PA0);
  val[4] = analogRead(PA0);
  val[5] = analogRead(PA0);
  val[6] = analogRead(PA0);
  val[7] = analogRead(PA0);
  val[8] = analogRead(PA0);
  val[9] = analogRead(PA0);

  endTime = micros();

  Serial.println(endTime - startTime);
}

analogReadを10回実行し、その時間(μs)を出力しています。forループにしていないのは、ループ処理の時間を含まないようにするためです。 

実行結果は、次のような感じです。1秒ごとに結果出力。

70
70
71
70
70
70
70
71
70
70
70  

 arduino UNOでは、標準状態ではanalogRead実行時間は約100μsで、高速化(ADCの分周値16に変更)して約16μsぐらい。arduino M0 proも、標準の実行時間は約100μsと合わせられており、高速化(ADCの分周値64に変更)して、こちらも約16μsぐらいなので、Blue PillはUNOやM0に比べるとanalogReadがだいぶ高速です。ただし、精度については未確認。

おそらく、UNOやM0でも分周値をさらに小さくしてADCのクロックを速くすれば高速化できると思いますが、精度が悪くなると思われます。そのため、ググって見つかるanalogRead高速化では分周値16(UNO)になっていると思われます。

STM32duinoはWindows Store版Arduino IDE 1.8.5ではダメ

Windows Store版Arduino IDE 1.8.5(2018/08/27時点)を使用して、STM32duinoによりBlue Pill(STM32F103 minimum development board)にsketchを書き込もうとすると、IDE下部のログ表示部分に「アクセスが拒否されました」とエラーが出て書き込めません。

この現象については、Arduino for STM32のサイトに「windows 10 upload "Access is denied" error on bluepill」として出ています。

windows 10 upload "Access is denied" error on bluepill - Arduino for STM32

日本語環境の場合、Access is deniedの部分が、アクセスが拒否されました、となります。

私も上記投稿者と同じ、Windows Store版Arduino IDE 1.8.5を使用しており、問題の現象が発生していました。Windows Store版を削除し、arduino.ccからダウンロードした1.8.6をインストールすると、問題が解決しsketchを書き込むことができました。

Arduino IDEバージョン1.8.5の問題なのか、Windows Store版の問題なのかは不明です。

STM32F103(STM32duino)の環境は、次のWebサイトを参考にしています。

https://ht-deko.com/arduino/stm32f103c8t6.html

私の環境は次の通り。

  • Blue Pillは2018年7月にAmazonで「HiLetgo® 2個セット STM32F103C8T6 ARM STM32 Minimum システム 開発ボードモジュール Arduinoと互換」を購入。
  • 片方のボードは、USBシリアルによるbootloader書き込み(stm32flash.exeでgeneric_boot20_pc13.bin書き込み)時にエラー(Failed to init device.)が発生して使用できず。もう片方のボードでは成功。
  • bootloader書き込みには、USBシリアル変換を使用した、シリアル通信による方法を使用。
  • USBシリアル変換には、FTDIチップが搭載されているものを使用。どこで購入したかは失念。基板裏面に「Deek-Robot」と記載あり。
  • このUSBシリアル変換基板は3.3V出力がなく、5V出力なので、Blue Pillの5Vピン(B9の右隣)に接続して電源供給。
  • Blue PillのUSBの不具合対策は、R10チップ抵抗交換ではなく、1.8KΩの抵抗をA12と3.3Vピンに接続することで実施。
  • STM32 bootloaderは、githubのrogerclarkmelbourne/STM32duino-bootloader の、2018/08/26時点のmasterを使用。

上記STM32F103のWebサイト中、「永続ブートローダモード」などで記載がある「オンボードLED」とは、ボード上に「PC13」と記載されている緑色LEDです。「PWR」の赤色LEDのことではありません。

私の環境では、次の状態でした。

  • STM32duino bootloaderのbinaries/generic_boot20_pc13.binを書き込むと、ボードの起動時に緑色LEDが1~2秒間点滅した後消灯。
  • bootloader_only_binaries/generic_boot20_pc13.binを書き込むと、ボード起動後、緑色LEDが点滅したまま。

Arduino IDEでのsketch書き込みは、緑色LEDが1~2秒間点滅した後消灯する、binaries/generic_boot20_pc13.binを書き込んだ状態で実施。

sketchの書き込みは成功し、PC13(緑色)LEDの制御が行えることは確認したのですが、sketch書き込み時、IDE下部のログの最後に「error resetting after download: usb_reset: could not reset device, win error: 指定されたファイルが見つかりません。」と表示されます。ですが、手動でリセットボタンを押すことなく、書き込んだsketchが動作します。

弾速計試作1

銃口に取り付けるタイプの弾速計を試作しています。

 

youtu.be

 

  • BB弾の検出には、2つのフォトリフレクタを使用しています。
  • A/Dコンバータ内蔵のマイコンとしてArduino M0 proを使用しています。
  • 2箇所のフォトリフレクタの電圧変化を検出し、その時刻から速度を検出しています。
  • 弾数カウンタは、単純にBB弾の通過をカウントしています。

Arduino(M0 pro含む)は、標準では1回のA/D変換が約100μsとなっているため、内蔵ADCの設定を変更して約16μs程度になるよう高速化しています。それでも80~90m/sの速度で通過するBB弾を検出するにはちょっと遅いので、もっと高速にA/D変換する方法を検討中。Arduinoでは、M0 proでもこれ以上の高速化はできないっぽいので。

フォトリフレクタを取り付けているのは塩ビパイプです。それを銃口にテープでぐるぐる巻きにして取り付けています。次の試作では、プラスチック製のサプレッサーに穴をあけてフォトリフレクタを取り付ける予定。

 

弾速計XCORTECH X3200 mk3はフォトトランジスタの電圧をA/D変換か?

弾速系XCORTECH X3200 mk3を分解しました。

mkIIのような差動コンパレータや、シュミットトリガインバータのような部品は見当たりません。

f:id:daisaku_tech:20180513154720p:plain

f:id:daisaku_tech:20180513154739p:plain

f:id:daisaku_tech:20180513154752p:plain

プロセッサはM058ZDN(Cortex-M0ベース)となっています。

f:id:daisaku_tech:20180513155648p:plain

ADCが800kSPSということなので、フォトトランジスタの出力をプロセッサでA/D変換して、ソフトウェアで電圧が閾値を下回ったこと(上回ったこと)を判断し、2つのフォトトランジスタからの入力の時間差で速度を計算、だと思います。

弾速計XCORTECH X3200 mkIIは差動コンパレータの値をプロセッサで読み取って速度計算

弾速計XCORTECH X3200 mkIIを分解しました。

数年前に購入。たぶん本物、と思います。メイン基板はこれ。

f:id:daisaku_tech:20180513144646p:plain

基板下の部分にLM393(差動コンパレータ)が2つ。たぶん、BB弾が通る筒の中2箇所にあるフォトトランジスタの電圧が閾値を上回ったら(下回ったら)0(または1)を出力、という回路かと。

 

プロセッサには出荷検査時に張り付けた?と思われるシールがあるので、それをはがしました。

f:id:daisaku_tech:20180513144858p:plain

差動コンパレータからの出力をMPC89L58AP(8bitプロセッサ)で読み取り、2つの時間差で速度を計算、だと思います。