「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



ESP32のADC速度、RAW系の命令使って読み出せば、
無駄な処理せず速く行えると思い込んでいたんだけど、
こないだ見つけたサイト、

http://pikacchu.blog.fc2.com/blog-entry-3.html

ここを改めて見てみると、Arduino由来のADC入力関数
「analogRead」使って、1サンプル9u秒とか書いてある
ことに気づく。
ん?なんで?Arduinoのお気楽関数の方が速いって…
どういうことなの?

と思って、こないだ作ったテストスケッチを改造して、
サンプル時間を計測しなおしてみる。


…なんと!9u秒台が出てるよ。大体9.5u秒くらい。
こないだの37u秒から比べると、1/4くらいの時間で
サンプリングが完了している。なんだ、元々こんなに
速いのか。
普通、Arduinoのお気楽機能使うと、ピン番号変換とか
のせいで、色々時間掛かるものだと思い込んでいた
けど、RAW系の機能使うよりanalogReadの方が速いとは!


でも、まてよと。
ESP32のアッテネータって、デフォルトで1/1では?

analogReadと組みあわせて使うアッテネータの設定
の関数について調べなおしてみると、

https://trac.switch-science.com/wiki/esp32_tips

スイッチサイエンスでtipsが公開されていたんだけど、
「analogSetAttenuation」関数で指定するのは一緒
みたい。そうなの?なんか効いてないみたいなんだけど
なぁ、と思いつつ、時間がないので、外付けの部品とか
抜きに調べられる範囲でささっといくつか実験。

「analogSetAttenuation」に「ADC_11db」と「ADC_0db」
を指定したときの値を見比べてみると、やっぱレンジが
ちゃんと変わっているみたいだな。

そもそも、analogReadで読み込んだときって、デフォルト
でアッテネータは-11dBに設定されるみたい。RAW系の
関数で読み出すときは0dBなんだけど、そこはやっぱ
他のArduino環境と合わせてある感じなのかな。


スケッチはこんな。


#include <driver/adc.h>

/* global variables */

#define LED 2
#define SAMPLES 32768

//int val[SAMPLES];
uint16_t val[SAMPLES];


/* sub routine */

void prt_hex(int n, char c) {
  for (int i = 1; i < 4; i++) {
    if ( (n >> (4*i)) == 0) {
      Serial.print(c);
    }
  }
  
  Serial.print(n, HEX);
}

/* main process */

void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);

  Serial.println();
  Serial.println("-----  adc width = 12 bits  -----");
  Serial.println("-----  attenuator = -11dB  -----");
  analogReadResolution(12); //12 bits
  analogSetAttenuation(ADC_11db);  //For all pins
//  analogSetPinAttenuation(A18, ADC_0db); //0db attenuation on pin A18
//  analogSetPinAttenuation(A19, ADC_2_5db); //2.5db attenuation on pin A19
//  analogSetPinAttenuation(A6, ADC_6db); //6db attenuation on pin A6
//  analogSetPinAttenuation(A7, ADC_11db); //11db attenuation on pin A7}
}

void loop() {
  /* display heap size */
  Serial.print("Heap size : ");
  Serial.println(ESP.getFreeHeap());
  Serial.println();
  
  Serial.println("start sampling.");
  Serial.println();
  digitalWrite(LED, HIGH);

  /* input 1024 samples with simple loop */
  unsigned long starttime = millis();
  for (int i=0; i<SAMPLES; i++) {
    val[i] = analogRead(38);  // 38 = analog4
  }
  unsigned long endtime = millis();

  digitalWrite(LED, LOW);
  Serial.println("complete sampling.");
  Serial.println();

  Serial.print("start time = ");
  Serial.print(starttime); 
  Serial.println("ms");
  Serial.print("end   time = ");
  Serial.print(endtime); 
  Serial.println("ms");
  Serial.print("total time = ");
  Serial.print(endtime - starttime); 
  Serial.println("ms");
  Serial.print("unit  time = ");
  Serial.print((endtime - starttime) * 1000 / SAMPLES); 
  Serial.println("us / sample");
  Serial.print("sampling speed = ");
  Serial.print(1000 * SAMPLES / (endtime - starttime)); 
  Serial.println("sps");
  
  for (int i=0; i<SAMPLES; i++) {
    if ((i % 16) == 0 ) {
      Serial.println();
      prt_hex(i, '0');
      Serial.print(" : ");
    }
    prt_hex(val[i], ' ');
    Serial.print(", ");
  }
  Serial.println();
  
  /* display heap size */
  Serial.print("Heap size : ");
  Serial.println(ESP.getFreeHeap());
  Serial.println();
  
  for (;;);
}


先頭のinclude文は要らないはずだな。多分。

なんだ。それなら、あまり悩むことなくアナログ入力
を使いつつ、あとは40k~50kspsくらいでタイマ割り込み
使ってサンプリングして、取りこぼしが発生しないかを
確認したいところだな。

そのくらいでokなら、音声の可聴域は全然使えそう
だよな。
もっと問題は、Wi-Fiとか通信機能使いながらでも、
(通信負荷が十分小さい間なら)サンプリング速度が
確保できるかが問題かな。





https://twitter.com/count_nmani/status/1022336035500388353

カンニングペーパー1枚のみ持込可。これ頭良いよな。
自分でカンニングペーパー作ることを前提におく
なら、確かに頭に入っちゃうもんな。





https://twitter.com/t_okada/status/1022892656727273473

これホントそう思う。思いつきでわざわざ混乱を
増大させるようなことしてくれるなよと。

せめて、思いついてから3秒くらい考えてから口を
開いてくれよ。





https://twitter.com/Har7201/status/952910164826484740

エストニア!! エストニア!!





https://www.youtube.com/watch?v=h1o47b9umn0

しょっぱながクレイジークライマーなところがとても良い。





こないだ頼んでた、PAM8403が届いてた。

https://ja.aliexpress.com/item/15949-Free-shipping-PAM8403-module-Super-board-2-3W-Class-D-digital-amplifier-board-efficient-2/32357176265.html

なんだかんだで、10個入りを買ったのだった。いろいろ
使いまわし効くしねぇ。



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




昨日やらなかったことを消化。

ESP32のADCで、アッテネータの設定を変えると、速度が
変わるかどうかの確認。

0dBでサンプリングしたときと、-11dBでサンプリング
したときで、速度が変わるかを、それぞれ32768サンプル
ずつADCを行ってみて、その時間から1サンプルあたりの
速度を比較してみた。
(for文でフリーランさせて、トータル時間をサンプル数
で割って計算)


結果、どちらも、1サンプルあたり37μ秒なので、1秒間
あたりのサンプル数は、26489spsと出た。アッテネータ
の設定は影響がないみたいと判る。

for文の処理時間も含まれているんだけど、実用としては
タイマ割り込みでやりたいので、そのオーバーヘッドを
考えるとfor文より重いだろうから、実用上は20000sps
くらいかなぁ?

とりあえず、やりたいことの道がひとつ開けた。

次は、タイマ割り込みでサンプリングして、sin波とかが
崩れずにサンプルできるかとか、その辺を試してみよう。





https://headlines.yahoo.co.jp/videonews/fnn?a=20180724-00397030-fnn-bus_all

やばい。日本キャベツ党党首の座を狙っているオイラ
としては、毎日バリバリ食べるキャベツがじりじりと
値上がりして行ってて、ピンチ状態。





https://headlines.yahoo.co.jp/videonews/nnn?a=20180724-00000036-nnn-bus_all

やばいじゃないか。日本車が2050年までに、全部
電動車に。

それはもはや、自動車とは違う別の何かだ。そうだ。

ちなみに、この2050年って、平成の次の元号って
ことでいいんだっけ?





ふと探してみる。Raspberry Pi Zero Wって、単体で
手に入るようになったんだっけ?と。

https://www.switch-science.com/catalog/3200/

スイッチサイエンスでは、もう在庫ありって書いてある
んだけど、普通に買えちゃうのかな?

まぁ、最近弄ってるのは初代のモデルBで、それでもう
だいぶ満足なので、あまり買い足さないといけない
要件はないんだけど、省電力だし、あるなら使いたいな、
くらいなんだけど。

どっちかって言うと、3か3+が欲しかったりする。





http://turupura.com/gessyoku/kako/20180728/g180728.html

月食、東京付近だと、皆既開始の時点で2.5度。単純計算
で、その5分後くらいに月が沈み始めて、7分後くらいには
月没って感じかな。

http://koyomi8.com/directjp.cgi?http://koyomi8.com/sub/moonrise.htm

ここ使うと、AM4:50月没と出てくる。大気差が計算に入って
いるのかわからないけど、この計算だと皆既開始から20分後
ということになるみたい。大気差とかあるのかな?





http://www.akibaoo.co.jp/c/item/4532141141350/

ノートPCの冷却ファン、399円だと。へぇ。
でも、こないだ買ったLifebook、熱くならないんだよな。





改めてaliexでSSD漁ってみると、こないだ60GBのを2500円
くらいで買ったばかりなのに、今探すと、60GBは2000円
くらいで、120GBでも2600円くらいから見つかるんだよな。
あっという間だな。



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




東京都内でも、40度越え。

https://weathernews.jp/s/topics/201807/230085

すごい暑さだな。恐ろしい暑さ。暑すぎて、日中は
M3になっていた。

どうやら、今日がピークっぽい感じで、明日以降少し
下がるみたいだけど、暑いのはしばらくかわらない
みたい。

きっと、これが走り回っていたんだろう。

https://twitter.com/Saka_CITYR/status/1019888019799592961





ちょっとだけ歩みを進めておく。ESP32のADCのアッテネータ
の設定を変えてみる。

https://esp-idf.readthedocs.io/en/v2.0/api/peripherals/adc.html

こことかに詳しく書いてあるんだけど、アッテネータの設定
は、0db~-11dbまで、4段階で変えられるみたいなんだけど、
基準電圧が1.1Vみたいなので、デフォルトの0dbだと、フル
スケールで1.1Vまで。3.3Vくらいまで入力できるように
したいので、-11dbに設定して、3.3V電源とGNDを按分して、
ADCに入力。

スケッチはこないだのやつから要らないところ削って、
こんな具合。
(どうやら、このブログサービスのバグだった、不等号
記号が削られちゃうやつ、直ったみたいなので、半角の
まま貼ってみる。まぁ、相変わらず改行が2行になっちゃう
のは直ってないみたいだけど)

#include <driver/adc.h>

/* global variables */

#define LED 2

/* sub routine */

void prt_hex(int n, char c) {
  for (int i = 1; i < 4; i++) {
    if ( (n >> (4*i)) == 0) {
      Serial.print(c);
    }
  }
  
  Serial.print(n, HEX);
}


/* main process */

void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);

  /* set up ADC1 parameters */
  Serial.println();
  Serial.println("-----  adc width = 12 bits  -----");
  adc1_config_width(ADC_WIDTH_BIT_12);
  adc1_config_channel_atten(ADC1_CHANNEL_0,ADC_ATTEN_DB_0); //gpio36(A4)
  adc1_config_channel_atten(ADC1_CHANNEL_0,ADC_ATTEN_11db); //gpio36(A4)
}

void loop() {
  uint16_t val;

  digitalWrite(LED, HIGH);
  val = adc1_get_raw(ADC1_CHANNEL_0);
  digitalWrite(LED, LOW);

  Serial.print("sampling data = ");
  prt_hex(val, '0');
  Serial.print("   (");
  Serial.print(val);
  Serial.println(")");
    
  delay(200);
}


実行するとこんな。16進と10進で表示。可変抵抗を
グリグリまわすと値がかわる。




実は最初、0dbのまま、1kΩ固定抵抗と200Ω可変抵抗
で分圧して、可変抵抗グリグリしてみたんだけど、
GND電位までちゃんと落ちてくれなくて(数値が0に
落ちない場合がある)、ブレッドボードで組んだ回路
が悪いのか、スケッチ側の問題なのか良くわからな
かったので、ひとまず-11dbに設定してみた。


なんかもやもやが残るけど、とりあえず-11dbにして
みると、なんとなくちゃんと動いている感じ。

これで、あとは、アッテネータの設定によって、
ADCの速度が変わるかどうか、とか、ファンクション
ジェネレータから高速でタイマ割り込み使って大量
に入力して、おかしなことにならないか、みたいな
事をしらべようかなと思っているところ。

またこんど。




http://akizukidenshi.com/catalog/g/gM-11967/

5.5インチのフルハイビジョンディスプレー。これ
すごいねぇ。ガワもオプションで販売してくれたら、
ちょっと欲しいかも。





https://togetter.com/li/1247996?page=14

この、「判別するのは本当に難しい」タグ、面白い。

https://twitter.com/big_magnam_1026/status/1019503574353522688/photo/1

そうかぁ。S14中期型だったか。これ、前期型はたしか
丸目4燈だったよな。


https://twitter.com/cubsol/status/1019789034422325248

あぁ、これはスターレットだったか。


https://twitter.com/N4_no_/status/1019503405763518464/photo/1

これけっこう好き。





https://twitter.com/haru9629/status/1019986464568819712

ポンパ。





https://twitter.com/ichirowo/status/1020676612189110273

イノベーションって、本流からは生まれないものなん
だろうな。もともと。





https://mainichi.jp/articles/20180724/k00/00m/020/130000c

粉飾した数値。

https://twitter.com/quitamarco/status/1020679646843580416

改ざんしてはいけないものは、改ざんすると処分の
対象になっちゃうから、ならいっそのこと、改ざん
しても怒られない私文書に変えて、捨てちまえ、という
イノベーション。



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




こないだの、ESP32で大きい配列を定義すると、なぜか
実行時エラーになっちゃう件、

https://techtutorialsx.com/2018/02/13/esp32-arduino-variable-length-arrays/

このページを参考に、以前のスケッチをちょい弄って
実験しながら、あれこれ探ってみた。


まず、元のスケッチに、ヒープの残サイズを表示する
処理を付け加えてみる。処理前と処理後の両方に。

で、だいたい想像通りの結果が出てきた。初期化前に
300kB弱のヒープ(とスタックで利用できる)エリアが
残ってて、これならいくらでもスタックにデカイ配列
をおけるはずだよな、と。

で、色々考えててふと気になることに行き着く。
これ、loop関数内で動的確保してるから、スタックに
置かれるわけだよな、と。

なんかのサイトで読んだんだけど、スタックとヒープ
は、コンパイルオプションで最大サイズを云々って
いうのが有ったと思うので、もしかして、スタックに
デカイ配列を置こうとしているのが駄目なの?と。


なので、スケッチ冒頭で配列定義しちゃって、bssに
配列を置いたら、スタックをそんなに食わないので、
動くんじゃないの?と。

ちなみに、text、data、bss、heap、stackについて
”なんじゃそりゃ?”という場合は、こちらとかを
まずご参照ください。

http://keens.github.io/blog/2017/04/30/memoritosutakkutohi_puto/

で、loop関数で定義してた配列を、冒頭のglobalで
定義しなおして、bssに配置するようにしてやると…

ヒープの食い方の表示が変わってくる。おぉ。

じゃぁ、配列のサイズを8kBにしてみる。
…大丈夫だな。エラーにならない。調子こいて
一気に64kBにしてみる。うん。大丈夫。


どうやら、スタックにデカイ配列置けないような
設定になっているらしい。4kBってことは…元もとの
素のArduino(8ビット版)の設定が引き継がれている
のかなぁ?

なんにしても、スタックにデカイ配列置こうとしない
かぎりは、大きい配列をおいても大丈夫っぽいな。

これで、もうちょっと実験が先に進められそうなん
だけど、しばらく時間が取れないんだよな。


とりあえず、実験に使ったスケッチを貼っておく。

#include <driver/adc.h>

/* global variables */

#define LED 2
#define SAMPLES 32768

//int val[SAMPLES];
uint16_t val[SAMPLES];


/* sub routine */

void prt_hex(int n, char c) {
  for (int i = 1; i < 4; i++) {
    if ( (n >> (4*i)) == 0) {
      Serial.print(c);
    }
  }
  
  Serial.print(n, HEX);
}

/* main process */

void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);

  /* set up ADC1 parameters */
  Serial.println();
  Serial.println("-----  adc width = 12 bits  -----");
  adc1_config_width(ADC_WIDTH_BIT_12);
  adc1_config_channel_atten(ADC1_CHANNEL_0,ADC_ATTEN_DB_0);
}

void loop() {
  /* display heap size */
  Serial.print("Heap size : ");
  Serial.println(ESP.getFreeHeap());
  Serial.println();
  
  Serial.println("start sampling.");
  Serial.println();
  digitalWrite(LED, HIGH);

  /* input 1024 samples with simple loop */
  unsigned long starttime = millis();
  for (int i=0; i<SAMPLES; i++) {
    val[i] = adc1_get_raw(ADC1_CHANNEL_0);
  }
  unsigned long endtime = millis();

  digitalWrite(LED, LOW);
  Serial.println("complete sampling.");
  Serial.println();

  Serial.print("start time = ");
  Serial.print(starttime); 
  Serial.println("ms");
  Serial.print("end   time = ");
  Serial.print(endtime); 
  Serial.println("ms");
  Serial.print("total time = ");
  Serial.print(endtime - starttime); 
  Serial.println("ms");
  Serial.print("unit  time = ");
  Serial.print((endtime - starttime) * 1000 / SAMPLES); 
  Serial.println("us / sample");
  Serial.print("sampling speed = ");
  Serial.print(1000 * SAMPLES / (endtime - starttime)); 
  Serial.println("sps");
  
  for (int i=0; i<SAMPLES; i++) {
    if ((i % 16) == 0 ) {
      Serial.println();
      prt_hex(i, '0');
      Serial.print(" : ");
    }
    prt_hex(val[i], ' ');
    Serial.print(", ");
  }
  Serial.println();
  
  /* display heap size */
  Serial.print("Heap size : ");
  Serial.println(ESP.getFreeHeap());
  Serial.println();
  
  for (;;);
}





https://twitter.com/mai_hayabusa/status/1020595452914233346

フラウスキー少佐ーーーーーー!!!

http://cosmo14.s56.xrea.com/gallery/fra.html





https://twitter.com/livedoornews/status/1020497349225746432

これは、殺人未遂って言っても差し支えないだろう。
散々、毎年、自動車に子供置いたままにして、熱中症
で死んでしまう話、あふれているのに。数分でも
ものすごい温度に上がるんだよな。真夏の炎天下。

しかも、パチンコ屋だもんな。これ、児童相談所の
出番だろ。





https://www.youtube.com/watch?v=a2BsZCoHjwM

総統閣下はお怒りのようです。





https://twitter.com/masayang/status/1020875251779899392

なんでもかんでも、他人に不便を強要することで満足
するタイプの人たちなのかな。

そもそも、プラスチックストローだって、そのまま海に
流すもんじゃないだろ。燃やして灰を処分するとか
なんじゃないの?普通。

海が汚染されて問題だっていうなら、プラスチック製品
を作ることに問題があるんじゃなく、ゴミの処分方法
に問題があるっていう、そっちに目を向ければいいのに。





https://twitter.com/Y_Suzuki/status/1020892803423858688

ダライアスだ。

レモンを振って、塩でいただく。



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




ふと思い出して、AT-TINY416って単体で売ってるのか
探しなおす。

https://www.marutsu.co.jp/pc/i/27021803/

普通に売ってるみたいだな。でも、例によって店頭在庫
は無いとかってパターンなのかな?

あと、書き込みのプログラマが必要になるんだけど、
これはやっぱ、EVALUATION BOARD買うのが一番早いの
かな。





こないだの、ESP32のメモリ使用量周りについて、また
ちょっと検索しなおしてみた。

https://techtutorialsx.com/2018/02/13/esp32-arduino-variable-length-arrays/

https://www.esp32.com/viewtopic.php?t=1831

https://www.mgo-tec.com/blog-entry-arduino-esp8266-ram-size.html

このあたりをちょっと眺めてみて、とりあえず実験用の
スケッチでも書いて、ESP.getFreeHeap関数使って
内部の状態を色々探りいれてみるのが吉なのかな?と
いう気がしているところ。

ESP32は、こういうメモリ利用関係の部分がまだ煮詰まっ
ていないのかな?





USB3.0端子経由で、USBメモリで普通のLinux OSイメージ
から起動してみたいっていう話を、もうちょっと色々と
考えてみたんだけど、良く考えたら別にUSBメモリである
必要って、ないんだよなというところに気づく。

USBメモリだと、S.M.A.R.T.の情報取れないし、なんと
言ってもランダム書き込みの速度が遅すぎる。なので、
良く考えてみたら、2.5インチの小容量SSDと、USB-SATA
変換ケーブルみたいなもの使って外付けSSDからLinuxを
起動するようにしたら、
  普段はWindows10
  必要なときだけLinux
っていうのを、それなりにちゃんとしたパフォーマンス
で利用できるだろうと。

USB-SATA変換は、持ってるやつでもいいし、なにか別の
モノを買っても安いし、SSDも、実験専用と割り切れば32GB
でも足りるし、60GBもあれば十分ともいえるしなぁ。

なんなら、こないだ買った60GBのSSDを取り出して、Let's
Noteは売っちゃって、このSSDだけ再利用しても足りそう。

どうすっかなぁ?電源ポンで、素直にLinuxが立ち上がるPC
も1個置いておきたい気もするんだよな。Linux起動するのに
USB端子1個ふさがっちゃうのも不便といえば不便だしな。





https://www.youtube.com/watch?v=d5uoJg_-Ilw

例のbemarunekoさんの動画を眺めて、ふと、ホールソーは
欲しいんだよな、とか思ってたりしたので、色々検索して
みたりする。

なんか、自由錐に行き着く。

https://makit.jp/02013/

これって、簡単に、きれいに穴が空けられるものなの?と
思って、youtubeで動画眺めたりしてみたんだけど、何気に
きれいに穴空けられるみたいなんだよな。あまりトルクが
無い、オイラの安物ハンドドリルでも大丈夫かなぁ?
なんとなく、普通のハンドドリルで使ってるみたいだから、
大丈夫なきがするんだけど。


さらに、木工関係の動画をちょっと眺める。

https://www.youtube.com/watch?v=ybNDZAnj9Us
https://www.youtube.com/watch?v=RVDjY53-cVE

ハンドジグソーを板に取り付けて、簡易テーブルソーに。
なかなか面白い。

で、さらにジグソー関係の動画を見てたら、

https://www.youtube.com/watch?v=uan3xx3T55c

なんか、きれいなおねいさんを発見。まな板自作するのに、
ジグソーで、斜めカット。
斜めカットって、罫書き線の位置とどうやってあわせれば
いいのかなぁ?って思っていたんだけど、そうか、ベース
の端っこから刃までの長さ計って、罫書き線からガイド
までの長さをあわせてやればいいわけだ。ほう。





https://withnews.jp/article/f0180720002qq000000000000000W00o10101qq000017714A

あのエレコムの、iPhone用充電ケーブルのフィギュア。
入社2年目の女性が考えたらしい。
なんか、D-SUBなんてどう考えてもおっさんの発想だと
思ったけど、全然そんなこと無かった。びっくり。





https://twitter.com/yucococafe/status/1019009862087241728

つままれたネコ。





https://twitter.com/n_waka/status/1019511778139521024

CASIO PV-2000。
あぁ、なんでこんな姿に…




コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする



« 前ページ 次ページ »