Blynk で ESP32 と ESP8266 同時制御 -球体POV製作への道 その9-
またもや前回から大幅に時間があいてしまった。。。
そういう訳で球体POV(Persistence of Vision) 製作の時間です。
残像で映像を生成する装置です。
回転部と固定部を無線で情報やり取りしてみたいという発想です。はい。
前回は改めて制御マイコンから見直してWiFiとBLEを搭載したESP32の検討をしてみました。
ESP32のWiFiでスマホと通信、BLEで他のBLE搭載マイコンと通信するPOV装置をと思ったのですが、ESP32のArduino IDE向けBLEライブラリが今のところイケてないので。。。
方針変更!
ESP32とESP8266をWiFi介してスマホアプリBlynkで直接制御してマイコン間の直接通信はしない方向に転換しました。
BLEを使用しないのにESP32を採用した理由はESP8266はアナログ入力ピンが1個しかなく、しかも1V以上印加できないため。。。。
Blynkで複数のマイコンを制御する際は以下の記事で紹介したBridge機能を使用します。
ここでは基本構成・動作の確認を実施しました!
目次
構成
Blynkアプリで以下を実施
-
- ESP32ボードに接続されたLEDの色を制御
- ESP8266に接続されたデジタルポテンショメータを制御しモータ回転スピードを変える
- モータに羽をつけてESP32ボードに接続されたフォトリフレクタで回転数計算してBlynk側に送信
部品
- BLE、WiFiマイコンESP32開発ボード ESP32-DevKitC
ESP32の設定など詳細は以下の記事を参照ください
https://homemadegarbage.com/pov-sphere08
- LEDテープ Dotstar
高速リフレッシュレート(PWMの周期)19.2kHzでPOV向き!詳細は以下!
https://homemadegarbage.com/pov-sphere07
- フォトリフレクタ QTR-1A
モータに羽をつけてフォトリフレクタで回転数を測定。
Arduino用ライブラリは以下。
https://github.com/pololu/qtr-sensors-arduino
- WiFiマイコンESP8266開発ボード ESPr Developer
ESPr DeveloperをArduino IDEで開発する方法は以下のとおり
http://trac.switch-science.com/wiki/esp_dev_arduino_ide
- デジタルポテンショメータ MCP4131
SPI信号で抵抗値(0~10kohm)を制御出来る。Arduinoコードは以下を参考にしました。
http://www.learningaboutelectronics.com/Articles/MCP4131-digital-potentiometer-circuit.php
- PWMコントローラ
モータへ供給する電圧を制御する付属の可変抵抗をデジタルポテンショメータに差し替え
Blynk設定
Bridge機能を使用するためBlynkアプリを2つ作成しAUTH TOKENを2個取得します。ESP32用のアプリはウェジットを配置し、ESP8266用のアプリはAUTH TOKEN取得のみで特に何もしません。
以下はESP32用のアプリの設定です。
新規プロジェクトを作成します。HARDWRE MODELはESP32 Dev Boardを選択。CONNECTION TYPEはWiFiを選択。AUTH TOKENはArduinoコード生成時に使用します(メールで送信されます)。
モータスピード設定用のSliderウェジット、モータ回転数表示用のLabeled Valueウェジット、LEDカラー制御用のzeRGBaウィジェットを配置
モータスピード設定用のSliderウェジットです。最小値0、最大値3としました。
SEND ON RELEASEはOFFにして随時データ送信できるようにします。
ここではヴァーチャルピンV1に出力するようにしました。この値をBridge機能でESP8266側に送ります。
モータ回転数表示用のLabeled Valueウェジットです。ヴァーチャルピンV3で値を受けて単位[rpm]をつけて表示します。
zeRGBaウィジットでLEDの色を設定できるようにします。
OUTPUTはMERGEを選択。それぞれ最小値0、最大値255とします。
SEND ON RELEASEはOFFにして随時データ送信できるようにします。
ここではヴァーチャルピンV2に出力するようにしました。
Arduino IDEコード
BlynkのArduino用 最新ライブラリは以下にあります。
https://github.com/blynkkk/blynk-library
ESP32用コード
[スケッチの例] -> [Blynk] -> [Boards_WiFi] -> [ESP32_WiFi]を参考にコード生成しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space #include <WiFi.h> #include <WiFiClient.h> #include <BlynkSimpleEsp32.h> #include <SPI.h> #include <QTRSensors.h> #include <Adafruit_DotStar.h> WidgetBridge bridge1(V0); //Initiating Bridge Widget on V0 of ESP32用アプリ //ESP32用Blynkアプリで取得したAuth Tokenを入力 char auth[] = "ESP32用 AuthToken"; //WiFiのSSID、パスワード指定 char ssid[] = "WiFiのSSID"; char pass[] = "パスワード"; int Value = 0; //LED設定 #define Brightness 30 //LED輝度 #define NUMPIXELS 11 // Number of LEDs in strip #define DATAPIN 12 #define CLOCKPIN 14 Adafruit_DotStar strip = Adafruit_DotStar(NUMPIXELS, DATAPIN, CLOCKPIN, DOTSTAR_BGR); int ledR = 0; int ledG = 0; int ledB = 0; //フォトリフレクタ QTR-1A設定 #define NUM_SENSORS 1 // number of sensors used #define NUM_SAMPLES_PER_SENSOR 1 // average samples per sensor reading #define EMITTER_PIN QTR_NO_EMITTER_PIN // 単体ではエミッタピン無し QTRSensorsAnalog qtra((unsigned char[]) {34}, NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN); unsigned int sensorValues[NUM_SENSORS]; unsigned long Time, mSpeed; int QTRstate = 0; int rpm = 0; void setup() { Serial.begin(115200); Blynk.begin(auth, ssid, pass); strip.begin(); // Initialize pins for output strip.setBrightness(Brightness); strip.show(); } BLYNK_CONNECTED() { //ESP8266用Blynkアプリで取得したAuth Tokenを入力 bridge1.setAuthToken("ESP8266用 AuthToken"); } //Motor Speed Slider値 Get BLYNK_WRITE(V1) { Value = param.asInt(); //Motor Speed Slider値 Serial.print("V1 Slider value is: "); Serial.println(Value); // ESP8266側にSliderの値を送信 bridge1.virtualWrite(V5, Value); } //ZERGBAウィジット ヴァーチャルピンV2 BLYNK_WRITE(V2) { ledR = param[0].asInt(); ledG = param[1].asInt(); ledB = param[2].asInt(); Serial.print("ledR: "); Serial.print(ledR); Serial.print(" ledG: "); Serial.print(ledG); Serial.print(" ledB: "); Serial.println(ledB); //LED点灯 for(int i=0;i<NUMPIXELS;i++){ strip.setPixelColor(i, strip.Color(ledR, ledG, ledB)); } strip.show(); } void loop() { Blynk.run(); //フォトリフレクタ値取得 qtra.read(sensorValues); Serial.print("qtra: "); Serial.println(sensorValues[0]); if(sensorValues[0] < 2500 && QTRstate == 0){ QTRstate = 1; mSpeed = micros()-Time; Time = micros(); rpm = 60.0/mSpeed * 1e6; //計算した回転数をLabeled Valueウェジットに表示 Blynk.virtualWrite(V3, rpm); } if(sensorValues[0] > 3900 && QTRstate == 1){ QTRstate = 0; } } |
ESP8266用コード
[スケッチの例] -> [Blynk] -> [Boards_WiFi] -> [ESP8266_Standslone]を参考にコード生成しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#define BLYNK_PRINT Serial #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> #include <SPI.h> //ESP8266用Blynkアプリで取得したAuth Tokenを入力 char auth[] = "ESP8266用 AuthToken"; //WiFiのSSID、パスワード指定 char ssid[] = "WiFiのSSID"; char pass[] = "パスワード"; int Value = 0; int CS = 15; // SCK = 14, MOSI = 13, (MISO =12) //Motor Speed Slider値 Get BLYNK_WRITE(V5) { //Motor Speed Slider値 from ESP32用Blynkアプリ Value = param.asInt(); Serial.print("V5 Bridge value is: "); Serial.println(Value); //デジタルポテンショメータSPI書き込み digitalWrite(CS, LOW); SPI.transfer(0); //MCP4131アドレス SPI.transfer(Value); digitalWrite(CS, HIGH); } void setup() { Serial.begin(9600); Blynk.begin(auth, ssid, pass); pinMode (CS, OUTPUT); SPI.begin(); } void loop() { Blynk.run(); } |
動作
これでなんとか基本構成が実現できました。あとは球体POVをどう構築するか。。。。
乞うご期待。。。。
震えて待て!
010010100000010100101111010111101010001
卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍