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

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

【お絵描き】それっぽい炎を描く

 とあるアカウントで投稿された炎の表現をできるだけ再現しようと思い、我流で再現した手法を記録しておきます。使用したソフトはClipStudioPaintのみです。

1:チョークブラシを使ってオレンジと黄色で適当に描く
 以下のように太めのブラシサイズにして適当に描きます。
f:id:rikoubou:20170909112413p:plain


2:ガウスぼかしを使ってぼかす
 今回は60ぐらいでぼかしています。
f:id:rikoubou:20170909112629p:plain


3:炎の部分を範囲選択する
 光の棒みたいなアイコンで炎の外側をクリックして選択し、選択範囲を反転させます。


4:新規レイヤーを追加して選択した範囲をより濃い赤色で塗りつぶす
 3で範囲選択した部分をオレンジよりより濃い色で塗りつぶした新規レイヤーをつくります。
f:id:rikoubou:20170909112742p:plain


5:新規レイヤーをガウスぼかしを使ってぼかす
 かなり強め(ここでは150ぐらい)でぼかします。
f:id:rikoubou:20170909113224p:plain


6:新規レイヤーを炎レイヤーの下におき、背景を黒にする
 これで完成。
f:id:rikoubou:20170909113415p:plain


 以上が我流で生み出した炎の書き方になります。対象物の大きさによってぼかしの度合いを変える必要はありますが、
暗いところで少し光ってる感じの炎なら割とそれっぽく見えそうな感じです。

 ちなみにこの手法を使って作ったgifアニメがこちら。
f:id:rikoubou:20170909113639g:plain


・参考資料

 作画も撮影も素晴らしい技術を持った謎のアニメ団さんのTwitterはフォローしているだけで幸せになれるので、どんどんフォローしようね!

【ESP32】OLEDモジュール(M096P4BL)を使ってみる

 ご無沙汰しております。最近ネタがなくてブログの更新をサボっていました。が、ESP32でOLEDモジュールを使うというネタができたので残しておきます。


1:材料
 今回使ったOLEDは以下のものです。多色表示できるものもあるみたいですが、自分は青色単色のものを選びました。

www.aitendo.com


2:ライブラリのインストール
 「Adafruit-GFX-Library」というライブラリと「Adafruit_SSD1306」というライブラリの二つをインストールします。

 Arduino IDEの「ライブラリをインクルード」→「ライブラリを管理」からライブラリマネージャを立ち上げて、以下のライブラリをインストールします。

f:id:rikoubou:20170906170536p:plain
f:id:rikoubou:20170906170549p:plain


3:配線
 以下のように配線します。

ESP32側 OLED側
3V3 VCC
GND GND
GPIO22 SCL
GPIO21 SDA


4:サンプルを動かす
 配線が終わったらAdafruit_SSD1306ライブラリのサンプルにある「ssd1306_128x64_i2c.ino」を開き、ソースの以下の部分を書き換えます。

.
.
.
void setup()   {                
  Serial.begin(115200); // 58行目:元はSerial.begin(9600);のところをSerial.begin(115200);に書き換える。

  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64) 61行目:第二引数を0x3Cに書き換える。
.
.
.

 書き換えが終わったら別名で保存し、ESP32に書き込んでください。すると、様々な図形描写のサンプルが表示されます。


 以上がESP32のi2cでOLEDを使った内容です。これで液晶に文字などを表示することができるようになったので、色々と工作の幅が広がりそうです。

・参考資料
programresource.net

【ESP32】設定管理ライブラリ(不揮発性領域の書き込みと読み込み)について

 今回はタイトルにある通り「ESP32での不揮発性領域」についてです。ESP32で電源を切っても保存される領域の利用方法について調べてみると、jsonファイルだったりをアップロードして云々とある方法が多かったのですが、簡単にできる方法を紹介している記事を見つけました。そこからのほぼ引用ですが、備忘録として残して起きます。


1:設定管理ライブラリの使い方
 基本的には以下のような記述でできます。

#include <Preferences.h>

Preferences preferences;

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

  // 不揮発性領域「my-app」へのアクセス開始
  // 第2引数は「trueの場合は読み込みのみ、falseの場合は書き込みOK」
  preferences.begin("my-app", false);

  // 指定したキーの値を取得する(第二引数はそのキーが存在しない場合の戻り値)
  int val = preferences.getInt("value", 0);
  Serial.print("val: ");
  Serial.println(val);

  val++;  // カウントアップ

  // 指定したキーに値を書き込む(第二引数は書き込む値)
  preferences.putInt("value", val);
  // 閉じる
  preferences.end();

  Serial.println("Restarting in 2 seconds...");
  delay(2000);

  // Restart ESP
  ESP.restart();
}

void loop() {

}

 上記のプログラムでは「my-app」というnamespaceの「value」というキーを取得してカウントアップし、再設定しています。setupの最後で再起動がかかりますが、valueの値はリセットされることなくカウントアップされつづけます。


2:Preferences.hについて
 Preferences.hはArduino core for the ESP32に含まれています。1での読み込み、書き込みに使った関数は型ごとに定義されています。

 以下がPreferences.hファイルの中身なので、ここから使う関数を選んでください。
github.com


 以上が設定管理ライブラリの使い方になります。参考資料に示した記事にも詳しい内容が書かれてあります。


・参考資料
ESP32の設定管理ライブラリの紹介 - KERI's Lab

【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のサンプルでつまづいていたので、同様の問題で困っている人の助けになれば幸いです。