7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

enebularAdvent Calendar 2018

Day 24

【enebular】enebularで遠隔XYステージをつくる【改良版】

Last updated at Posted at 2020-01-08

ある日のこと...

こんにちは、宇宙エンジニアのたくろーどんです。
前回,enebularを使って遠隔で操作できるXY軸ステージをつくってみました.
【enebularは神ですか?】enebular×Node-REDで研究室IoTに挑戦!

動きは悪くなかったのですが,約5000円の予算でつくったこともあり研究用途でつかうとなると,少し不満がありました.

ということである日,先生に相談してみると

oneday.png

あっさり,OKがでたので...

amazon.png

driver.png

Amazonで見つけた格安のステージ(モーター付き)ステッピングモータのドライバを購入しました.
そして,これをいつも通りNefry BTで制御し快適な研究ライフをもくろみます.

全体の概要

回路図

wire.png

今回使用したステッピングモーター(NEMA 17)は,高い電圧・電流が必要なので,直流安定化電源を使用しています.詳細は仕様を見てみることをおすすめします.

ステッピングモータのドライバ詳細

driver2.png
①にドライバの設定について(どれくらいのパルス・電流値で制御するか)書いてあります.
説明通り,②のスイッチをON・OFFすることで,ドライバ側の設定を変更でき,ステッピングモーターの動きを変更できます.こちらも詳細は仕様を見てみることをおすすめします.

実験系の概要図

overroll.png

こちらは,前回の自作XY軸ステージと同じ仕組みです.

プログラム

Nefry BT側


#include <Nefry.h>
#include <NefryFireBase.h>

#define short_range 550
#define medium_range 1050
#define long_range 10500

//インスタンス生成
NefryFireBase firebase;

const int ena = D2; //????
const int dir = D1; //モーターの回転方向を制御
const int pul = D0; //パルスの入出力を制御
const int interval = 1000;   //パルスを送る時間間隔

void setup() {
  pinMode(ena, OUTPUT);
  pinMode(dir, OUTPUT);
  pinMode(pul, OUTPUT);
  Serial.begin(115200);
  firebase.begin("自分のfirebaseのURL");
}

void loop() {
  int motor = firebase.read("motor").toInt();
  DataElement elem = DataElement();

  if(motor == 1) {
    Serial.println("Back");
    for (int i=0; i<short_range; i++){
      digitalWrite(dir,LOW);
      digitalWrite(ena,LOW);
      digitalWrite(pul,HIGH);
      delayMicroseconds(interval);
      digitalWrite(pul,LOW);
      delayMicroseconds(interval);
    }
      elem.setValue("motor", 0);
      firebase.write("motor", &elem);//FireBaseのデータを書き込むFireBaseのデータを書き込む
      
      
  }else if(motor == 2){
    Serial.println("Foward");
    for (int i=0; i<short_range; i++){
      digitalWrite(dir,HIGH);
      digitalWrite(ena,LOW);
      digitalWrite(pul,HIGH);
      delayMicroseconds(interval);
      digitalWrite(pul,LOW);
      delayMicroseconds(interval);
    }
      elem.setValue("motor", 0);
      firebase.write("motor", &elem);//FireBaseのデータを書き込むFireBaseのデータを書き込む

  }else if(motor == 3){
    Serial.println("Foward_long");
    for (int i=0; i<medium_range; i++){
      digitalWrite(dir,LOW);
      digitalWrite(ena,LOW);
      digitalWrite(pul,HIGH);
      delayMicroseconds(interval);
      digitalWrite(pul,LOW);
      delayMicroseconds(interval);
    }
      elem.setValue("motor", 0);
      firebase.write("motor", &elem);//FireBaseのデータを書き込むFireBaseのデータを書き込む

    
  }else if(motor == 4){
    Serial.println("Foward_long");
    for (int i=0; i<medium_range; i++){
      digitalWrite(dir,HIGH);
      digitalWrite(ena,LOW);
      digitalWrite(pul,HIGH);
      delayMicroseconds(interval);
      digitalWrite(pul,LOW);
      delayMicroseconds(interval);
    }
      elem.setValue("motor", 0);
      firebase.write("motor", &elem);//FireBaseのデータを書き込むFireBaseのデータを書き込む
      
  }else if(motor == 5){
    Serial.println("long_long");
    for (int i=0; i<long_range; i++){
      digitalWrite(dir,LOW);
      digitalWrite(ena,LOW);
      digitalWrite(pul,HIGH);
      delayMicroseconds(interval);
      digitalWrite(pul,LOW);
      delayMicroseconds(interval);
    }
      elem.setValue("motor", 0);
      firebase.write("motor", &elem);//FireBaseのデータを書き込むFireBaseのデータを書き込む
      
  }else if(motor == 6){
    Serial.println("Foward_long");
    for (int i=0; i<long_range; i++){
      digitalWrite(dir,HIGH);
      digitalWrite(ena,LOW);
      digitalWrite(pul,HIGH);
      delayMicroseconds(interval);
      digitalWrite(pul,LOW);
      delayMicroseconds(interval);
    }
      elem.setValue("motor", 0);
      firebase.write("motor", &elem);//FireBaseのデータを書き込むFireBaseのデータを書き込む
     
  }

  stopMotor();
  delay(200);  
 }

 void stopMotor() {
   digitalWrite(dir, HIGH); // low CW(時計回り) / high CCW(反時計回り) 
   digitalWrite(ena, LOW);
   digitalWrite(pul, LOW);
  }

マイコン側

[
    {
        "id": "be0d6811.0c5098",
        "type": "inject",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "topic": "",
        "payload": "{\"motor\":1}",
        "payloadType": "json",
        "repeat": "",
        "crontab": "",
        "once": false,
        "x": 120,
        "y": 480,
        "wires": [
            [
                "41ef2e0b.1028f"
            ]
        ]
    },
    {
        "id": "bcb4c067.326a5",
        "type": "inject",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "topic": "",
        "payload": "{\"motor\":2}",
        "payloadType": "json",
        "repeat": "",
        "crontab": "",
        "once": false,
        "x": 119.99999618530273,
        "y": 551.9999961853027,
        "wires": [
            [
                "41ef2e0b.1028f"
            ]
        ]
    },
    {
        "id": "3e380a81.fa6686",
        "type": "inject",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "topic": "",
        "payload": "{\"motor\":3}",
        "payloadType": "json",
        "repeat": "",
        "crontab": "",
        "once": false,
        "x": 119.99999618530273,
        "y": 611.9999961853027,
        "wires": [
            [
                "41ef2e0b.1028f"
            ]
        ]
    },
    {
        "id": "82bf19f7.816248",
        "type": "inject",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "topic": "",
        "payload": "{\"motor\":4}",
        "payloadType": "json",
        "repeat": "",
        "crontab": "",
        "once": false,
        "x": 119.99999618530273,
        "y": 671.9999961853027,
        "wires": [
            [
                "41ef2e0b.1028f"
            ]
        ]
    },
    {
        "id": "41ef2e0b.1028f",
        "type": "firebase modify",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "firebaseconfig": "",
        "childpath": "",
        "method": "set",
        "value": "msg.payload",
        "priority": "msg.priority",
        "x": 819.1001091003418,
        "y": 736.800051689148,
        "wires": [
            []
        ]
    },
    {
        "id": "a9fd5c2b.656f5",
        "type": "template",
        "z": "b1df9a03.d68bf8",
        "name": "HTML",
        "field": "payload",
        "fieldType": "msg",
        "format": "html",
        "syntax": "mustache",
        "template": "<!DOCTYPE html>\n<html lang=\"ja\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<title>加速度検出</title>\n</head>\n \n<body>\n<div id=\"datatxt\">データの表示</div> \n <btn class = 'btn'>\n  <a href=\"\">右</a>   \n </btn>\n<script>\n \n\n</script>\n</body>\n</html>",
        "x": 370.10003662109375,
        "y": 103.19999694824219,
        "wires": [
            [
                "6199aa01.d1ee44"
            ]
        ]
    },
    {
        "id": "6199aa01.d1ee44",
        "type": "template",
        "z": "b1df9a03.d68bf8",
        "name": "CSS",
        "field": "payload",
        "fieldType": "msg",
        "format": "css",
        "syntax": "mustache",
        "template": ".btn{\n    width:90px;\n    height:90px;\n    line-height:90px;\n}\n.btn a{\n    display:block;\n    width:100%;\n    height:100%;\n    text-decoration: none;\n    background:#FF8181;\n    text-align:center;\n    color:#FFFFFF;\n    font-size:20px;\n    font-weight:bold;\n    border-radius:50px;\n    -webkit-border-radius:50px;\n    -moz-border-radius:50px;\n    box-shadow:0px 5px 8px 0px #BBBBBB ;\n    text-shadow:0px 1px 1px #444444 ;\n}\n.btn a:hover{\n    background:#FF0303;\n    color:#FFFFFF;\n    margin-top:5px;\n    box-shadow:none;\n}",
        "x": 493.00000762939453,
        "y": 104.00000095367432,
        "wires": [
            [
                "4a88979.d9e9e68"
            ]
        ]
    },
    {
        "id": "b4b28800.b0f228",
        "type": "http in",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "url": "stage",
        "method": "get",
        "swaggerDoc": "",
        "x": 184,
        "y": 99,
        "wires": [
            [
                "a9fd5c2b.656f5"
            ]
        ]
    },
    {
        "id": "4a88979.d9e9e68",
        "type": "http response",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "x": 784,
        "y": 113,
        "wires": []
    },
    {
        "id": "d7d1d295.5d8bf",
        "type": "inject",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "topic": "",
        "payload": "{\"motor\":0}",
        "payloadType": "json",
        "repeat": "",
        "crontab": "",
        "once": false,
        "x": 124.99999618530273,
        "y": 410.99999618530273,
        "wires": [
            [
                "41ef2e0b.1028f"
            ]
        ]
    },
    {
        "id": "8b6bfa6d.367128",
        "type": "comment",
        "z": "b1df9a03.d68bf8",
        "name": "左",
        "info": "",
        "x": 83.10000419616699,
        "y": 511.8000240325928,
        "wires": []
    },
    {
        "id": "55d9a346.66ce3c",
        "type": "comment",
        "z": "b1df9a03.d68bf8",
        "name": "右",
        "info": "",
        "x": 81.99999618530273,
        "y": 444.9999990463257,
        "wires": []
    },
    {
        "id": "da155616.411bb8",
        "type": "ui_button",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "group": "f7557849.9ddfe8",
        "order": 0,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "Back(5mm)",
        "color": "",
        "bgcolor": "",
        "icon": "",
        "payload": "{\"motor\":1}",
        "payloadType": "json",
        "topic": "",
        "x": 610,
        "y": 200,
        "wires": [
            [
                "41ef2e0b.1028f"
            ]
        ]
    },
    {
        "id": "fce48abb.06cc78",
        "type": "ui_button",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "group": "f7557849.9ddfe8",
        "order": 0,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "Foward(5mm)",
        "color": "",
        "bgcolor": "",
        "icon": "",
        "payload": "{\"motor\":2}",
        "payloadType": "json",
        "topic": "",
        "x": 620,
        "y": 240,
        "wires": [
            [
                "41ef2e0b.1028f"
            ]
        ]
    },
    {
        "id": "e9c8c2c.cb14e4",
        "type": "ui_button",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "group": "f7557849.9ddfe8",
        "order": 0,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "Back(10mm)",
        "color": "",
        "bgcolor": "",
        "icon": "",
        "payload": "{\"motor\":3}",
        "payloadType": "json",
        "topic": "",
        "x": 610,
        "y": 280,
        "wires": [
            [
                "41ef2e0b.1028f"
            ]
        ]
    },
    {
        "id": "44413259.eb1bec",
        "type": "ui_button",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "group": "f7557849.9ddfe8",
        "order": 0,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "Foward(10mm)",
        "color": "",
        "bgcolor": "",
        "icon": "",
        "payload": "{\"motor\":4}",
        "payloadType": "json",
        "topic": "",
        "x": 620,
        "y": 320,
        "wires": [
            [
                "41ef2e0b.1028f"
            ]
        ]
    },
    {
        "id": "e5da3f9f.b4543",
        "type": "ui_button",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "group": "f7557849.9ddfe8",
        "order": 0,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "offset",
        "color": "",
        "bgcolor": "",
        "icon": "",
        "payload": "{\"distance_x\":0, \"distance_y\":0}",
        "payloadType": "json",
        "topic": "",
        "x": 590,
        "y": 160,
        "wires": [
            [
                "41ef2e0b.1028f"
            ]
        ]
    },
    {
        "id": "8d1b8b68.150858",
        "type": "ui_button",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "group": "f7557849.9ddfe8",
        "order": 0,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "Back(100mm)",
        "color": "",
        "bgcolor": "",
        "icon": "",
        "payload": "{\"motor\":5}",
        "payloadType": "json",
        "topic": "",
        "x": 880,
        "y": 200,
        "wires": [
            [
                "41ef2e0b.1028f"
            ]
        ]
    },
    {
        "id": "a7b7733a.5de8c",
        "type": "ui_button",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "group": "f7557849.9ddfe8",
        "order": 0,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "Foward(100mm)",
        "color": "",
        "bgcolor": "",
        "icon": "",
        "payload": "{\"motor\":6}",
        "payloadType": "json",
        "topic": "",
        "x": 880,
        "y": 240,
        "wires": [
            [
                "41ef2e0b.1028f"
            ]
        ]
    },
    {
        "id": "ecc8e229.7d44b",
        "type": "ui_button",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "group": "f7557849.9ddfe8",
        "order": 0,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "Back(10mm)",
        "color": "",
        "bgcolor": "",
        "icon": "",
        "payload": "{\"motor\":7}",
        "payloadType": "json",
        "topic": "",
        "x": 870,
        "y": 280,
        "wires": [
            [
                "41ef2e0b.1028f"
            ]
        ]
    },
    {
        "id": "13b94a18.4c5bd6",
        "type": "ui_button",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "group": "f7557849.9ddfe8",
        "order": 0,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "Foward(10mm)",
        "color": "",
        "bgcolor": "",
        "icon": "",
        "payload": "{\"motor\":8}",
        "payloadType": "json",
        "topic": "",
        "x": 880,
        "y": 320,
        "wires": [
            [
                "41ef2e0b.1028f"
            ]
        ]
    },
    {
        "id": "839fb64e.6538f8",
        "type": "ui_gauge",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "group": "373ca1aa.76bade",
        "order": 0,
        "width": 0,
        "height": 0,
        "gtype": "gage",
        "title": "gauge",
        "label": "units",
        "format": "{{value}}",
        "min": "-10",
        "max": 10,
        "colors": [
            "#00b500",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "",
        "seg2": "",
        "x": 990,
        "y": 100,
        "wires": []
    },
    {
        "id": "6535557a.547ddc",
        "type": "ui_text",
        "z": "b1df9a03.d68bf8",
        "group": "373ca1aa.76bade",
        "order": 0,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "distance_x",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "x": 920.1000137329102,
        "y": 46.4000129699707,
        "wires": []
    },
    {
        "id": "3117451a.3e75fa",
        "type": "firebase.on",
        "z": "b1df9a03.d68bf8",
        "name": "",
        "firebaseconfig": "",
        "childpath": "distance_x",
        "atStart": true,
        "eventType": "value",
        "queries": [
            {
                "name": "orderByChild",
                "value": "distance_x"
            }
        ],
        "x": 478.1000061035156,
        "y": 42.60000038146973,
        "wires": [
            [
                "839fb64e.6538f8",
                "6535557a.547ddc"
            ]
        ]
    },
    {
        "id": "f7557849.9ddfe8",
        "type": "ui_group",
        "z": "",
        "name": "Group",
        "tab": "f58979ef.30ad38",
        "order": null,
        "disp": true,
        "width": "6",
        "collapse": false
    },
    {
        "id": "373ca1aa.76bade",
        "type": "ui_group",
        "z": 0,
        "name": "Group",
        "tab": "5d8bed2f.3397a4",
        "order": null,
        "disp": true,
        "width": 6
    },
    {
        "id": "f58979ef.30ad38",
        "type": "ui_tab",
        "z": 0,
        "name": "Tab",
        "icon": "dashboard",
        "order": 0
    },
    {
        "id": "5d8bed2f.3397a4",
        "type": "ui_tab",
        "z": 0,
        "name": "Tab",
        "icon": "dashboard",
        "order": 0
    }
]

動かしてみる

操作画面はこのような感じです.
実測で,移動量をボタンで割り当てています.

opretion_page.png

そして,以下のように動きます!

終わりに

enebularは便利!

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?