驴友花雕 发表于 2025-6-17 09:21:19

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

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

特征
• 能够向 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 服务器并控制机器人。







驴友花雕 发表于 2025-6-17 09:23:55

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

项目代码

#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 PIND2

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);

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;
      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);

}

驴友花雕 发表于 2025-6-17 09:27:07

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

【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



页: [1]
查看完整版本: 【Arduino 动手做】可以向任何方向移动的三轴麦轮机器人