回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【Arduino 动手做】可以向任何方向移动的三轴麦轮机器人 简单

头像 驴友花雕 2025.06.17 8 0

关于该项目
在这个项目中,我决定制作一个全向轮机器人,与普通机器人相比,这种类型的机器人由于具有特殊的轮子,能够向多个方向移动。

🎯 特征
• 能够向 8 个不同方向移动
• 使用 Web 服务器进行控制

🧰 开始
我们将 ESP8266 用作处理器。我们将添加一个 ws2812 矩阵显示以使其看起来更好。此外,在 DRV8833 双电机驱动器模块的帮助下,我们能够通过 WiFi 使用 WebServer 控制我们的直流电机。
• ESP8266
• DRV8833 双电机驱动器
• ws2812 矩阵显示器
• 直流电动机

🔌 图解的
根据下表和示意图进行连接。
• 完整原理图

⚙️ 安装
在上传代码之前,您需要在 Arduino IDE 中安装所需的库。请执行以下步骤:
• 按照以下路径 Sketch> Include Library> Manage Libraries
• 搜索 Adafruit_NeoPixel
• 安装库

👀 用法
完成所有步骤后,将为您创建一个接入点,通过连接到它并搜索 IP 地址“192.168.4.1”,您可以访问 Web 服务器并控制机器人。

 

00.jpg
00-.jpg
02.jpg

项目代码

代码
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <WebSocketsServer.h>
#include <Hash.h>


const char* ssid = "OMNI BOT";
const char* password = "123456789";

char Data;

#define PIN  D2

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(4, 4, PIN,
                            NEO_MATRIX_BOTTOM  + NEO_MATRIX_LEFT +
                            NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
                            NEO_GRB            + NEO_KHZ800);


const uint16_t colors[] = {
  matrix.Color(255, 0, 0),
  matrix.Color(0, 255, 0),
  matrix.Color(0, 0, 255)
};

#define AIN1 D7
#define AIN2 D8

#define BIN1 D5
#define BIN2 D6

#define AIN3 D3
#define AIN4 D4


static const char PROGMEM INDEX_HTML[] = R"rawliteral(
<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width = device-width, initial-scale = 1.0, maximum-scale = 1.0, user-scalable=0">
    <title>OMNI BOT</title>
    <style>
      body {
        background-color: #343a40;
        font-family: Arial, Helvetica, Sans-Serif;
        Color: #000000;
      }

      #ab {
        color: black;
        padding: 15px;
        text-align: center;
        text-decoration: none;
        display: inline-block;
        font-size: 15px;
        margin: 2px 50px 2px -50px;
        cursor: pointer;
        border-radius: 12px;
        width: 100%;
      }

      #JD {
        text-align: center;
      }

      #JD {
        text-align: center;
        font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
        font-size: 24px;
      }

      .foot {
        text-align: center;
        font-family: "Comic Sans MS", cursive;
        font-size: 30px;
        color: #F00;
      }

      .button {
        border: none;
        color: black;
        padding: 17px;
        text-align: center;
        text-decoration: none;
        display: inline-block;
        font-size: 16px;
        margin: 4px 2px;
        cursor: pointer;
        border-radius: 12px;
        width: 100%;
      }

      .red {
        background-color: #f8f9fa;
      }

      .green {
        background-color: #f8f9fa;
      }

      .yellow {
        background-color: #f8f9fa;
      }

      .blue {
        background-color: #f8f9fa;
      }
    </style>
    <script>
      var websock;

      function start() {
        websock = new WebSocket('ws://' + window.location.hostname + ':81/');
        websock.onopen = function(evt) {
          console.log('websock open');
        };
        websock.onclose = function(evt) {
          console.log('websock close');
        };
        websock.onerror = function(evt) {
          console.log(evt);
        };
        websock.onmessage = function(evt) {
          console.log(evt);
          var e = document.getElementById('ledstatus');
          if (evt.data === 'ledon') {
            e.style.color = 'red';
          } else if (evt.data === 'ledoff') {
            e.style.color = 'black';
          } else {
            console.log('unknown event');
          }
        };
      }

      function buttonclick(e) {
        websock.send(e.id);
      }
    </script>
  </head>
  <body onload="javascript:start();">
    <table width="100" height="249" border="0" align="center">
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
        <td> </td>
        <td align="center" valign="middle">
          <form name="form1" method="post" action="">
            <label>
              <button id="F" type="button" onclick="buttonclick(this);" class="button green">Forward</button>
            </label>
          </form>
        </td>
        <td> </td>
      </tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
        <td align="center" valign="middle">
          <form name="form1" method="post" action="">
            <label>
              <button id="L" type="button" onclick="buttonclick(this);" class="button green">Left</button>
            </label>
          </form>
        </td>
        <td align="center" valign="middle">
          <form name="form1" method="post" action="">
            <label>
              <button id="S" type="button" onclick="buttonclick(this);" class="button red">Stop</button>
            </label>
          </form>
        </td>
        <td align="center" valign="middle">
          <form name="form1" method="post" action="">
            <label>
              <button id="R" type="button" onclick="buttonclick(this);" class="button green">Right</button>
            </label>
          </form>
        </td>
      </tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
        <td> </td>
        <td align="center" valign="middle">
          <form name="form1" method="post" action="">
            <label>
              <button id="B" type="button" onclick="buttonclick(this);" class="button green">Backward</button>
            </label>
          </form>
        </td>
        <td> </td>
      </tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
        <td align="center" valign="middle">
          <form name="form1" method="post" action="">
            <label>
              <button id="a" type="button" onclick="buttonclick(this);" class="button blue">Forward Right</button>
            </label>
          </form>
        </td>
        <td align="center" valign="middle">
          <form name="form1" method="post" action="">
            <label>
              <button id="b" type="button" onclick="buttonclick(this);" class="button blue">Forward Left</button>
            </label>
          </form>
        </td>
        <td align="center" valign="middle">
          <form name="form1" method="post" action="">
            <label>
              <button id="c" type="button" onclick="buttonclick(this);" class="button blue">Backward Right</button>
            </label>
          </form>
        </td>
        <td align="center" valign="middle">
          <form name="form1" method="post" action="">
            <label>
              <button id="d" type="button" onclick="buttonclick(this);" class="button blue">Backward Left</button>
            </label>
          </form>
        </td>
      </tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr>
      <tr></tr>
      <td align="center" valign="middle">
        <form name="form1" method="post" action="">
          <label>
            <button id="o" type="button" onclick="buttonclick(this);" class="button yellow">CCW</button>
          </label>
        </form>
      </td>
      <td align="center" valign="middle">
        <form name="form1" method="post" action="">   </form>
      </td>
      <td align="center" valign="middle">
        <form name="form1" method="post" action="">
          <label>
            <button id="f" type="button" onclick="buttonclick(this);" class="button yellow">CW</button>
          </label>
        </form>
      </td>
      </tr>
    </table>
    <p class="foot"></p>
  </body>
</html>
)rawliteral";

WebSocketsServer webSocket = WebSocketsServer(81);
ESP8266WebServer server(80);


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

  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(20);
  matrix.setTextColor(colors[0]);
  
  pinMode(AIN1,OUTPUT);
  pinMode(AIN2,OUTPUT);
  
  pinMode(BIN1,OUTPUT);
  pinMode(BIN2,OUTPUT);

  pinMode(AIN3,OUTPUT);
  pinMode(AIN4,OUTPUT);

  WiFi.mode(WIFI_AP);          
  WiFi.softAP(ssid, password);  

  IPAddress myIP = WiFi.softAPIP(); 
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");   
  Serial.println(myIP);

  server.on("/", [](){
  server.send(200, "text/html", INDEX_HTML);
  });
  
  server.begin();
  webSocket.begin();
  webSocket.onEvent(webSocketEvent);
  
}

int x    = matrix.width();
int pass = 0;

void loop() {
  
   matrix.fillScreen(0);
   matrix.setCursor(x, 0);
   
     if(Data=='a')fl();
else if(Data=='b')fr();
else if(Data=='c')br();
else if(Data=='d')bl();
else if(Data=='o')ccw();
else if(Data=='f')cw(); 
else if(Data=='F')forword();
else if(Data=='B')backword();
else if(Data=='R')right();
else if(Data=='L')left();
else if(Data=='S')stop();

   
   webSocket.loop();
   server.handleClient();

}


void webSocketEvent(uint8_t num, WStype_t type,uint8_t * Payload, size_t length){
  switch(type) {
    case WStype_DISCONNECTED:
      //Serial.printf("[%u] Disconnected!\r\n", num);
      break;
    case WStype_CONNECTED:
      {IPAddress ip = webSocket.remoteIP(num);}
      break;
    case WStype_TEXT:
      //Serial.printf("%s\r\n", Payload);
      Data = Payload[0];
      Serial.println(Data);
      // send data to all connected clients
      webSocket.broadcastTXT(Payload, length);
     
      break;
    case WStype_BIN:
      hexdump(Payload, length);
      // echo data back to browser
      webSocket.sendBIN(num, Payload, length);
      break;
      default:
      break;
  }
}

void face1() {

    matrix.fillScreen(0);
    matrix.setCursor(x, -1);
    
    matrix.print(F("-----------"));
  
    if(--x < -36) {
      x = matrix.width();
      if(++pass >= 3) pass = 0;
      matrix.setTextColor(matrix.Color(255, 0, 255));
    }
   
    matrix.show();
    delay(100);
}

void face2() {

    matrix.fillScreen(0);
    matrix.setCursor(x, 1);
    
    matrix.print(F("^^^^^^^^^"));
  
    if(--x < -36) {
      x = matrix.width();
      if(++pass >= 3) pass = 0;
      matrix.setTextColor(matrix.Color(255, 0, 255));
    }
   
    matrix.show();
    delay(100);
}

void stop() {

  face1();

  digitalWrite(AIN1,LOW); 
  digitalWrite(AIN2,LOW);
  
  digitalWrite(BIN1,LOW); 
  digitalWrite(BIN2,LOW);
  
  digitalWrite(AIN3,LOW); 
  digitalWrite(AIN4,LOW);

}

void backword() {
  
  face2();

  digitalWrite(AIN1,LOW); 
  digitalWrite(AIN2,HIGH);
  
  digitalWrite(BIN1,LOW); 
  digitalWrite(BIN2,HIGH);
  
  digitalWrite(AIN3,LOW); 
  digitalWrite(AIN4,LOW);
   
}

void forword() {

  face2();

  digitalWrite(AIN1,HIGH); 
  digitalWrite(AIN2,LOW);
  
  digitalWrite(BIN1,HIGH); 
  digitalWrite(BIN2,LOW);
  
  digitalWrite(AIN3,LOW); 
  digitalWrite(AIN4,LOW);
  
}

void left() {

  face2();

  digitalWrite(AIN1,HIGH); 
  digitalWrite(AIN2,LOW);
  
  digitalWrite(BIN1,LOW); 
  digitalWrite(BIN2,HIGH);
  
  digitalWrite(AIN3,HIGH); 
  digitalWrite(AIN4,LOW);

}

void right() {

  face2();

  digitalWrite(AIN1,LOW); 
  digitalWrite(AIN2,HIGH);
  
  digitalWrite(BIN1,HIGH); 
  digitalWrite(BIN2,LOW);
  
  digitalWrite(AIN3,LOW); 
  digitalWrite(AIN4,HIGH);

}

void cw() {

  digitalWrite(AIN1,LOW); 
  digitalWrite(AIN2,HIGH);
  
  digitalWrite(BIN1,HIGH); 
  digitalWrite(BIN2,LOW);
  
  digitalWrite(AIN3,HIGH); 
  digitalWrite(AIN4,LOW);

}

void ccw() {

  digitalWrite(AIN1,HIGH); 
  digitalWrite(AIN2,LOW);
  
  digitalWrite(BIN1,LOW); 
  digitalWrite(BIN2,HIGH);
  
  digitalWrite(AIN3,LOW); 
  digitalWrite(AIN4,HIGH);

}

void br() {

  digitalWrite(AIN1,LOW); 
  digitalWrite(AIN2,HIGH);
  
  digitalWrite(BIN1,LOW); 
  digitalWrite(BIN2,LOW);
  
  digitalWrite(AIN3,LOW); 
  digitalWrite(AIN4,HIGH);

}

void fl() {

  digitalWrite(AIN1,HIGH); 
  digitalWrite(AIN2,LOW);
  
  digitalWrite(BIN1,LOW); 
  digitalWrite(BIN2,LOW);
  
  digitalWrite(AIN3,HIGH); 
  digitalWrite(AIN4,LOW);

}

void bl() {

  digitalWrite(AIN1,LOW); 
  digitalWrite(AIN2,LOW);
  
  digitalWrite(BIN1,LOW); 
  digitalWrite(BIN2,HIGH);
  
  digitalWrite(AIN3,HIGH); 
  digitalWrite(AIN4,LOW);

}

void fr() {

  digitalWrite(AIN1,LOW); 
  digitalWrite(AIN2,LOW);
  
  digitalWrite(BIN1,HIGH); 
  digitalWrite(BIN2,LOW);
  
  digitalWrite(AIN3,LOW); 
  digitalWrite(AIN4,HIGH);

}

【Arduino 动手做】可以向任何方向移动的三轴麦轮机器人
项目链接:https://www.hackster.io/CiferTech/omni-wheel-robot-a-robot-that-can-move-in-any-direction-dced52
项目作者:CiferTech
项目代码:https://github.com/cifertech/OMNI-ROBOT

 

01.jpg

评论

user-avatar
icon 他的勋章
    展开更多