关于该项目
在这个项目中,我决定制作一个全向轮机器人,与普通机器人相比,这种类型的机器人由于具有特殊的轮子,能够向多个方向移动。
🎯 特征
• 能够向 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 服务器并控制机器人。



项目代码
#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

评论