Location Clockのコード検討
※2020/2/18 原点センサを修正
フォトマイクロセンサを使用する予定でしたが、取り付け場所の制限からフォトリフレクタに変更を行いました。
では前回の構想編に引き続き今回はLocation Clockのコードを書いていきたいと思います。
ちなみにM5Stackを使用してArduino_IDEでコードを書いていますが、無印のESP32でも問題ありません(なんならESP8266でも行けると思います)。
コード検討
機能フローチャート
機能は単純でまずセットアップとしてWifi設定, Blynkサーバーとの連携設定,を行います。その後はループに入り状態フラグsによる分岐を行います。状態は3状態を予定していまして【受信待機】【原点復帰】【移動】になります。ステッピングモーターのエンコーダーとしてはソフト内でのカウンタを設けて角度モニターを行います。停止範囲は±1°とします。
この停止条件から必然的にステッピングモーターの1サイクルが1以下とする必要があります。今回使用予定のステッピングモーターは28BYJ-48(フルステップ:2048step)を使用するので、1ステップが0.176degです。フルステップの使用を想定して1サイクルは0.176×4=0.7degとしたいと思います。
まあ、そんな精度を求める機器ではないので±5degでも問題ないと思いますね。
コード
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 109 |
#define BLYNK_PRINT Serial #include <WiFi.h> #include <WiFiClient.h> #include <BlynkSimpleEsp32.h> char auth[] = "2YvI9EbGJUbPYsvoKcMfmQY-LSxz7dG8"; //ご自分のBlynk用 auth コードに書き換えてください char ssid[] = "65661981-2.4G"; //ご自分のルーターの SSID に書き換えてください char pass[] = "28544552"; //ご自分のルーターのパスワードに書き換えてください const uint8_t A=18; const uint8_t B=19; const uint8_t C=23; const uint8_t D=2; const uint8_t Pin=36; static long val; static uint16_t ADC; static float cnt=0;//インクリメントエンコーダー volatile int s=1;//状態フラグ volatile uint16_t target;//目標指令角度 void setup() { Serial.begin(9600); Blynk.begin(auth, ssid, pass); pinMode(Pin, ANALOG); pinMode(A, OUTPUT); pinMode(B, OUTPUT); pinMode(C, OUTPUT); pinMode(D, OUTPUT); } //360° 2048ステップ。 void loop() { Blynk.run(); switch(s){ //待機 case 0: s=val; break; //原点復帰 case 1: ORG(); break; //指令角度受信&移動 case 2: pos(target); Serial.println(cnt); break; } } BLYNK_WRITE(V2){ //Blynk Virtual Pin Serial.println("---------------"); target = param[0].asInt(); s=2; Serial.printf("location = %d\r\n", target); } void ORG(){ while(s){ FullStep(10); ADC=analogRead(Pin);//フォトマイクロセンサ検知 if(ADC>3000){//フォトマイクロセンサ検知でループ抜け s=0; } Serial.println(ADC); Serial.println(s); } //フォトマイクロセンサ検知点を原点とする cnt=0; } void pos(uint16_t p){ //現在値の指令値からの差 int diff; diff = target - cnt; if(diff>1){ FullStep(5); }else if(diff<-1){ FullStep2(5); }else{ s=0; } } void FullStep(uint8_t i){ digitalWrite(A, HIGH);digitalWrite(B, LOW);digitalWrite(C, LOW);digitalWrite(D, LOW); delay(i); digitalWrite(A, LOW);digitalWrite(B, HIGH);digitalWrite(C, LOW);digitalWrite(D, LOW); delay(i); digitalWrite(A, LOW);digitalWrite(B, LOW);digitalWrite(C, HIGH);digitalWrite(D, LOW); delay(i); digitalWrite(A, LOW);digitalWrite(B, LOW);digitalWrite(C, LOW);digitalWrite(D, HIGH); delay(i); cnt+=0.7031;//インクリメントエンコーダー } void FullStep2(uint8_t i){ digitalWrite(A, LOW);digitalWrite(B, LOW);digitalWrite(C, LOW);digitalWrite(D, HIGH); delay(i); digitalWrite(A, LOW);digitalWrite(B, LOW);digitalWrite(C, HIGH);digitalWrite(D, LOW); delay(i); digitalWrite(A, LOW);digitalWrite(B, HIGH);digitalWrite(C, LOW);digitalWrite(D, LOW); delay(i); digitalWrite(A, HIGH);digitalWrite(B, LOW);digitalWrite(C, LOW);digitalWrite(D, LOW); delay(i); cnt-=0.7031;//インクリメントエンコーダー } |
結構シンプルなコードだと思います。唯一計算らしい計算を行っているのは現在値と角度指令値(Blynkからの読み取り値)の差分を制御するくらいですかね。
あとは、Blynkライブラリがサーバーとの接続をやってくれますし、ステッピングモーターの制御も単純なフルステップで動かしているだけです。
机上でのデバックの動画を以下に載せました。
※デバックなのでLocationアプリとは連携しておりません。IFTTTのトリガーをボタンウィジェットを使用しています。
おわりに
今回はコードの検討と机上でのデバックを行いました。ここまでくればほぼほぼ機能は満足していると思います。最終的には月末に家族へのプレゼントとすることが目的なのですが、先日リビングの机上時計が欲しいと言っていたのでNTPサーバーアクセスの7セグLED時計もつけれたらつけたいと思っていたりしています。
コメント