ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【ESP32】analogReadにおいての注意点2

 前回の記事に続いてのanalogReadについての注意点です。
 analogReadをしていて色々と問題が発生したので記録しておきます。


・analogReadをする近くのピンで細かな信号を読み取らない
 analogReadを行う際に、チップでの処理の影響なのかすぐ横のピンで細かな信号を読み取る場合(赤外線信号受信など)、analogReadと同じタイミングで実行してしまうとノイズが乗ってしまう場合があります。
 なのでanalogReadをするピンは他の処理をするピンとはできる限り離しておくと良いです。


 Wifiの時にanalogReadに使えないピンがあったり今回のようにanalogReadの処理によって他のピンに影響が出たりと、複雑な処理を同時にやろうとする場合にanalogReadはかなり厄介なようです。

 

【ESP32】マルチタスク中でμs単位でdelayをかける

rikoubou.hatenablog.com
↑以前ESP32で赤外線の送受信を行うプログラムを紹介しました。

 このプログラムの中で「ESP32にdelayMicrosecondsがない」としてシステム時間の計算をして擬似的にμsのdelayを行なっていました。しかし最近色々調べてみると、実はESP32にもμs単位でのdelayを行う関数が存在していることを発見したので記録しておこうと思った次第です。


マルチタスク中でμs単位でdelayをかける関数
 結論から言うと、以下の関数でできます。

ets_delay_us(9);  // 9μsだけdelay

 Arduino IDEでESP32を使えるようにした時に入れたツールの「ets_sys.h」というファイルの中で宣言されている関数です。実際に使う場合は「ets_sys.h」をincludeしなくてもただ記述するだけで使用できます。


 以上が今回発見したことになります。もっと早くこの関数に気づいていれば、赤外線のところで悩まなかったですね……。


・参考資料
GitHub - espressif/arduino-esp32: Arduino core for the ESP32

【ESP32】Wifi接続時のanalogReadについて

 最近特にネタがなかったのでブログを更新していませんでしたが、タイトルにあるような状況で色々と問題に出くわしたので残しておきます。


1:Wifi接続時にanalogReadをできないピンが存在する
 今回出くわした問題は「Wifi接続時にanalogReadできないピンが存在する」というものです。より具体的に書くと「#include "Wifi.h"のWiFi.beginを実行した際、2, 4, 12, 14, 15, 26, 27のピンでanalogReadが使えなくなる」という問題です。

 WifiとanalogReadを併用しようとした際にanalogReadの値が常に一定であることに気づき、色々調べた結果このような問題があることを知りました。

 参考資料にあるように、12, 14, 26, 27のGPIOピンが使えなくなるようです。
 (自分の場合は実際にGPIO27ピンでanalogReadをやっていました。また自分が観測した範囲では2, 4, 15のピンもanalogReadできませんでした)


2:Wifi接続時にanalogReadできるピンについて
 基本的には上記の12, 14, 26, 27以外のピンでanalogReadを行えば問題ないです。全て確認したわけではないですが、GPIO33ピンであれば問題なくanalogReadができるようになります。


 以上が今回わかったことです。
 この事象を知らないと詰まることがあると思うので、その際の助けになれば幸いです。


・参考資料
Conflict between WiFi.h and analogRead - ESP32 Forum

【ESP32】ESP32のサンプルSimpleBleDeviceについて

 ESP32でBluetoothが使えることは知っていたのですが、なぜかESP32のサンプルソースであるSimpleBleDevice.inoが動かなかったので色々諦めていました。ですが、ようやくSimpleBleDeviceのソースを動かすことに成功したので記録しておきます。


・SimpleBleDeviceで発生していた問題
 自分が上手くいかなかった時は以下のような問題が発生していました。

 1:「Enable Low Energy」以降がシリアルモニタに表示されない。
 2:「entry 0x40080034」で止まってしまう時がある。

 このような症状が出た時には以下の対処方法で動くようになりました。


・1への対応策:ライブラリを最新のものに更新する
 環境構築の時にダウンロードしたESP32用のライブラリを最新のものに更新します。gitがインストールされている人はgit pullをし、gitをインストールしていない人はzipをダウンロードして上書きしてください。
github.com


・2への対応策:USBケーブルをちゃんとしたものに交換する
 Bluetoothの機能を実行する際にかなり多くの電力を消費します。100円均一で売っているようなUSBケーブルだと起動途中で電力が足りなくなって止まってしまうようです。電気屋さんなどで売っているちゃんとしたUSBケーブルに変更すると、途中で止まることなく実行されるようになります。


 以上が対応策です。

 シリアルモニタで動いていることを確認した後、スマホなどでBluetoothを検索すると「BLE32 name:(Bootボタンを押した回数)」で表示されます。

 なぜかこのBleのサンプルでつまづいていたので、同様の問題で困っている人の助けになれば幸いです。

【ESP32】内蔵されている磁気センサー(ホールセンサー)の使い方について

ESP32について調べていたらチップ自体に磁気センサー(ホールセンサー)が内蔵されていることがわかってので、そのメモです。


・磁気センサー(ホールセンサー)の使い方

 以下のコードだけで使えるようになります。
・ESP32_HallSensor.ino

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.println(hallRead());
  delay(100);
}

 ESP32にコードを書き込んだ後にシリアルモニタを立ち上げるとセンサーの値が0.1秒毎に表示されます。
(何もしていない状態で-10前後の値が表示されていると思います)

 その状態でチップの中心部あたりに磁石を近づけると値が変動します。
 ※N極、S極で値がふれるプラスとマイナスが違います。


 以上がESP32での磁気センサーの使い方になります。
 磁石の接近によるオン、オフを判別したりするのに使えるかもしれません。


・参考資料
【ゆっくり解説】 WiFiの使い方2 【電子工作】 by mはげ ニコニコ技術部/動画 - ニコニコ動画

【備忘録】モーターについて

 かなりざっくりとしたタイトルですが、モータードライバでモーターを制御している時に色々と悩まされたりしたので備忘録として残しておこうと思った次第です。


1:モーター、ギア

 電子工作で一般的に使われるモーターはミニ四駆などに使われる3Vで動くモーターだと思います。秋月などで売っています。
DCモーター FA−130RA−2270: パーツ一般 秋月電子通商 電子部品 ネット通販

 またミニ四駆を作っているタミヤからも「楽しい工作シリーズ」という名目で、以下のようなモーター+ギアのセットも売っています。
タミヤ 70167 シングルギヤボックス(4速タイプ)
タミヤ 70093 3速クランクギヤーボックスセット
タミヤ 70168 ダブルギヤボックス(左右独立4速タイプ)

 多くはモーターでタイヤを動かしたりするので、ギアボックスのものを使用することになると思います。これをモータードライバで制御させるようにすると、自作ラジコンも作れたりします。
 しかし、単にモーターを繋いだだけではうまく動かない場合も出てきます。それはモーターから発せられるノイズです。


2:モーターノイズ
 ラジコンを自作するために情報を集めているとモーターのノイズ対策が必要という内容が多く出てきます。その対策として出てくるのは大体以下のような感じだと思います。

 ・モーターの端子部分にノイズキラーとしてコンデンサをつける(ノイズの周波数にあったもの)
 ・モーターからのリード線を短くする
 ・ICとモーターの位置をできるだけ離す
 ・モーターとICの電源を分離させる

 モータードライバを使ってモーターを制御する場合、大体ノイズキャンセラーが付いてるので実際にはそこまで気にする必要はありません。
 しかしanalogReadをしたりする場合、モーターの発したノイズで微妙な値の変動を拾ってしまう場合があるので、変な動作をする場合は対策をしなくてはいけません。
 すでに挙げたもの以外にも対策する方法があります。


3:モーターノイズ対策
・ノイズ出にくいモーターを使用する
 以下のようなミニ四駆よりもさらに小さいモーターを使ったギアボックスもあります。モーターが小さいとノイズも少なくなるので、こちらに交換するだけでノイズ問題が解決する場合もあります。
タミヤ 70189 ミニモーター低速ギヤボックス (4速)

・ノイズ対策シートを貼る
 以下のようなノイズ対策のシートもあるようです。
ワイドワーク WW-GM03-S 電磁波・ノイズ吸収シート ノイズフセーグ 03S


 以上、モーターについて調べた内容になります。

 ちょっと自作ラジコンでも作ってみるかと思った時に、値の読み取りが不安定になっていて「なんでだろう?」と調べたらモーターのノイズ対策が必要ということになったので色々調べました。
 自分がやって効果があったのは「ミニモーターを使用したギアボックスに変更」だったので、一番簡単だし楽なのでこの方法を試してみるのが良いかと思います。


・参考記事
DCMotorDriver – スイッチサイエンス

【ESP32】analogReadする方法

 ESP32でanalogReadをしたことがないことに気づいたので、調べてやってみました。ついでに照度センサーの値の読み取りも行いました。


1:ESP32でanalogReadする方法
 結論から言うと、以下のようにArduinoUnoなどの時と同じような記述でできます。

int PIN_NUM = 25;
int reading = analogRead(PIN_NUM);

 ただし読み取り値は0〜1023ではなく0〜4096で、入力電圧の範囲は0〜3.3Vのようです。

 またどのピンでもanalogReadできるわけではないらしく、ざっと試してみたところ以下の図の「ADCと記述のあるピンのみanalogReadできる」ようです。
(※ちゃんと検証したわけではないので、間違っている可能性もあります)
f:id:rikoubou:20170629133746p:plain

 以上のいくつか注意点はありますが、ESP32でもanalogReadができることがわかりました。


2:ESP32で照度センサーを使ってみる
フォトICダイオードS9648(5個入): センサ一般 秋月電子通商 電子部品 ネット通販

 この照度センサーの値をanalogReadで読み込みます。プログラムは以下の通りです。

・ESP32_photoIC

/**
 * 繋ぎ方:http://arms22.blog91.fc2.com/blog-entry-416.html
 * データシート:http://akizukidenshi.com/download/s9648.pdf
 * 
 * カソード側(足が短い方)に電源を、アノード側(足が長い方)に読み取りピンを刺す
 * ※普通のLEDとは違うので注意!!
 */

const int voutPin = 25;
const int VOLT = 3.3; // 3.3Vを電源とした場合
const int ANALOG_MAX = 4096; // ESP32の場合

void setup() {
  Serial.begin(115200);
}

void loop() {
  // R1の電圧を取得
  int reading = analogRead(voutPin);

  // AD値をmVに変換
  float voltage = ((long)reading * VOLT * 1000) / ANALOG_MAX;

  Serial.print(voltage);
  Serial.print(" mV, ");

  // 電圧から電流を求める I=E/R (R=1000)
  float microamp = (voltage * 1000) / 1000;

  Serial.print(microamp);
  Serial.print(" uA, ");

  // 電流をlxに変換
  float lx = microamp / (290 / 100);

  Serial.print(lx);
  Serial.println(" lx");

  delay(1000);
}

 回路図は参考記事の「Arduinoで遊ぼう - フォトICダイオード S9648-100 を使って明るさを求める」の回路を参考にして繋いでください。

 シリアルモニタを立ち上げると1秒ごとに読み取った値が表示されます。センサーの上を手で覆うなりすると数値が低く変動するはずです。


 以上、ESP32でanalogReadする方法でした。


・参考記事
Arduino 言語における ESP-WROOM-32 の入出力関数 | なんかしてるえかいくん
Arduinoで遊ぼう - フォトICダイオード S9648-100 を使って明るさを求める - なんでも作っちゃう、かも。