0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

無重力を検知しモータを動かすシステム

Last updated at Posted at 2024-07-23

紹介

高校で理学系の研究チームに関わった際、製作を依頼されたものです。
何かと汎用性が高そうなので概要を載せておくよ!

ハード

スクリーンショット 2024-07-23 223403.png

スクリーンショット 2024-07-23 223427.png
言うまでもなく()

スクリーンショット 2024-07-23 223446.png
こんなところ。

外観。
-電源:単一乾電池
-処理:ESP32(NodeMCUとかいう機種名だった気が。)
-無重力の検出:MPU6050

ブレッドボードはamazonで売ってるやつより列が増えて6列になってるものを使用しています。(ESP32は横に大きいので...)
わざわざ秋葉原へ駆り出しに行くだけの価値はある。と筆者は思います。

その他の周辺部品としてブザー、LED、抵抗が挙げられますね。

プログラム

遅まきながらプログラム構造をはっつけます。以下参照。


入力
安全装置 有線or無線(赤外線orWIFI)
落とす装置 モータ
Gスイッチ 閾値

処理
Gスイッチ 承認 (落下後0.2秒後?)  
安全装置 承認 

出力
板を下げるor色水をあげる
表示LED or another


揺らすとすぐに無重力と検知されて使い物になりません。
なので、使用するときまでロックをかけ、無線で解除するという方式をとりました。

プログラム本文

注意!
プログラムの書き換えには、arduinoIDE(ver1.8付近)にて、
・ボード:Node-MCU
・周波数:115200
・シリアルポート:COM3
・環境設定→追加ボードのURLから
https://dl.espressif.com/dl/package_esp32_index.json”を追加する。
・#includeとあるライブラリ全てをインストール。exe:[WIFI][Wire]....

-arduinoIDE-

//ネット連携プログラム
#include <WiFi.h>
//プログラムの参照リンク https://randomnerdtutorials.com/esp32-web-server-arduino-ide/

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com  
*********/

// Load Wi-Fi library

// Replace with your network credentials
const char* ssid = "aterm-9fcc$$$$$$";
const char* password = "00796$$$$$$$$$$";

// Set web server port number to 80
WiFiServer server(80);

// Variable to store the HTTP request
String header;

// Auxiliar variables to store the current output state
String output18State = "off";
String output26State = "off";
String Rstate = "yet";

// Assign output variables to GPIO pins
const int output18 = 18;
const int output26 = 26;

// Current time
unsigned long currentTime = millis();
// Previous time
unsigned long previousTime = 0; 
// Define timeout time in milliseconds (example: 2000ms = 2s)
const long timeoutTime = 2000;



int Gap=0;int SL=0;int TL=0;int G=0;int Re=0;


//加速度センサ
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
const int SVPIN = 5;
Adafruit_MPU6050 mpu;

//servo moter
int SVmp=26;



void setup() {
//ネット連携プログラム
  Serial.begin(115200);
  // Initialize the output variables as outputs
  pinMode(output18, OUTPUT);
  pinMode(output26, OUTPUT);
  // Set outputs to LOW
  digitalWrite(output18, LOW);
  digitalWrite(output26, LOW);

  // Connect to Wi-Fi network with SSID and password
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Print local IP address and start web server
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  server.begin();


  
  //加速度センサ起動プログラム部分
 Serial.begin(115200);
 while (!Serial);
  delay(10);
 Serial.println("Acceleration sensor test");
 if(!mpu.begin()){
  Serial.println("Failed it");
  while (1){
    delay(10);
  }
 }
 Serial.println("Succeed it");
 mpu.setAccelerometerRange(MPU6050_RANGE_8_G);

//servo moter setup
pinMode(SVmp,OUTPUT);



 
}

void penDash(int x){//xの値は0~180。 
int p=0;
Rstate = "done";
Re=1;
while(p=1000){
int kyori = (x*10.25)+450;//角度からパルス幅への変換式
digitalWrite(SVmp,HIGH);
delayMicroseconds(kyori);
digitalWrite(SVmp,LOW);
delayMicroseconds(1);
int p=p+1;

}
//速度 5~30くらいが良好。

  
}

void loop() {

 
//加速度プログラム
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);
  Serial.print("X:");
  Serial.print(a.acceleration.x);
  Serial.print(", Y:");
  Serial.print(a.acceleration.y);
  Serial.print(", Z:");
  Serial.print(a.acceleration.z);
  Serial.println("");

if (a.acceleration.y <= -5){
  Gap=1;
}
if (a.acceleration.y > -5){
  Gap=0;
}


if(Gap==1 and SL==1 and Re==0){
  
//servoプログラム
int i=180;
penDash(i);
int p=0;
}


  
//ネット連携
  WiFiClient client = server.available();   // Listen for incoming clients

  if (client) {                             // If a new client connects,
    currentTime = millis();
    previousTime = currentTime;
    Serial.println("New Client.");          // print a message out in the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected() && currentTime - previousTime <= timeoutTime) {  // loop while the client's connected
      currentTime = millis();
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        header += c;
        if (c == '\n') {                    // if the byte is a newline character
          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();
            
            // turns the GPIOs on and off
            if (header.indexOf("GET /18/on") >= 0) {
              Serial.println("GPIO 18 on");
              output18State = "on";
              digitalWrite(18, HIGH);
            } else if (header.indexOf("GET /18/off") >= 0) {
              Serial.println("GPIO 18 off");
              output18State = "off";
                    digitalWrite(18, LOW);
            } else if (header.indexOf("GET /26/on") >= 0) {
              Serial.println("GPIO 26 on");
              output26State = "on";
              
              SL=1;
            } else if (header.indexOf("GET /26/off") >= 0) {
              Serial.println("GPIO 26 off");
              output26State = "off";
        
              SL=0;
            }
            
            // Display the HTML web page
            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
  
            client.println("<link rel=\"icon\" href=\"data:,\">");
            // CSS to style the on/off buttons 
            // Feel free to change the background-color and font-size attributes to fit your preferences
            client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
            client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;");
            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
            client.println(".button2 {background-color: #555555;}</style></head>");
            
            // Web Page Heading
            client.println("<body><h1>REMOTE CONTROL<h1> <h3>For The Zero Gravity Research Team<h3><h3>Now it's under control</h3>");
            
            // Display current state, and ON/OFF buttons for GPIO 18  
            client.println("<p>Test Lamp: " + output18State + "</p>");
            // If the output18State is off, it displays the ON button       
            if (output18State=="off") {
              client.println("<p><a href=\"/18/on\"><button class=\"button\">OFF</button></a></p>");
            } else {
              client.println("<p><a href=\"/18/off\"><button class=\"button button2\">ON</button></a></p>");
            } 
               
            // Display current state, and ON/OFF buttons for GPIO 26  
            client.println("<p>Safety lock</p>");
            // If the output26State is off, it displays the ON button       
            if (output26State=="off") {
              client.println("<p><a href=\"/26/on\"><button class=\"button\">Lock</button></a></p>");
            } else {
              client.println("<p><a href=\"/26/off\"><button class=\"button button2\">Unlock</button></a></p>");
            }
            client.println("<h2>insert: " + Rstate + "</h2>");

            client.println("</body></html>");
            
            // The HTTP response ends with another blank line
            client.println();
            // Break out of the while loop
            break;
          } else { // if you got a newline, then clear currentLine
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }
      }
    }
    // Clear the header variable
    header = "";
    // Close the connection
    client.stop();
    Serial.println("Client disconnected.");
    Serial.println("");
  }









}

【電子回路】ESP32で携帯でLチカ操作 htmlでブラウザ作成する方法 Webserver (youtube.com)参考


操作方法

①近隣WIFIに接続できるようプログラムにSSIDとpassを設定する。
②起動してしばらくするとWIFIと接続するので10秒ほど待ち、機械をブザー側を下にしてセットする。
③//192.168.10.111(シリアルモニタに出力されるipアドレス) を開くと操作パネルが出現する。(基本どの端末にも対応)
[注意]ボタンは連打しない。1タップにつき繁栄まで最大4秒程度必要。
   また、ボタンには現在の状態が表示されている。
④”test lump”タップで基盤のブザー・緑LEDが操作できるかテストする。
⑤”safety lock”タップで状態を”Unlock”に変更。
⑥4秒ほど機械を動かさず待機。
⑦自由落下を開始し、重力が1/2程度になると赤ランプ点灯と同時にモータが作動。

スクリーンショット 2024-07-23 224842.png
操作画面。
現在の状態が表示されます。
なお遅延は数秒ある模様。
...wifiを経由してるからね。「しょうがないね」って笑って許してあげてね!

_____________________________________

最後に

猪突猛進感が否めないですが、ここらへんで終わらせていただきます。

えーまず、ここまで読み進めてくださり、ありがとうございました。
初めての投稿ということもあるので、大目に見てくだされ。というのが本音です。
私は常にネット上に存在し、時と場所を自由に駆け巡る正に(?)波動のような存在!!!
...ですので、また巡り合うこともあるでしょう。

それではっ!

***©筆者:男子高校生C

0
0
1

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?