14浏览
查看: 14|回复: 2

[项目] 【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 服务器并控制机器人。

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

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

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

驴友花雕  中级技神
 楼主|

发表于 4 小时前

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

项目代码

  1. #include <Adafruit_GFX.h>
  2. #include <Adafruit_NeoMatrix.h>
  3. #include <Adafruit_NeoPixel.h>
  4. #include <ESP8266WiFi.h>
  5. #include <WiFiClient.h>
  6. #include <ESP8266WebServer.h>
  7. #include <WebSocketsServer.h>
  8. #include <Hash.h>
  9. const char* ssid = "OMNI BOT";
  10. const char* password = "123456789";
  11. char Data;
  12. #define PIN  D2
  13. Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(4, 4, PIN,
  14.                             NEO_MATRIX_BOTTOM  + NEO_MATRIX_LEFT +
  15.                             NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  16.                             NEO_GRB            + NEO_KHZ800);
  17. const uint16_t colors[] = {
  18.   matrix.Color(255, 0, 0),
  19.   matrix.Color(0, 255, 0),
  20.   matrix.Color(0, 0, 255)
  21. };
  22. #define AIN1 D7
  23. #define AIN2 D8
  24. #define BIN1 D5
  25. #define BIN2 D6
  26. #define AIN3 D3
  27. #define AIN4 D4
  28. static const char PROGMEM INDEX_HTML[] = R"rawliteral(
  29. <!DOCTYPE html>
  30. <html>
  31.   <head>
  32.     <meta name="viewport" content="width = device-width, initial-scale = 1.0, maximum-scale = 1.0, user-scalable=0">
  33.     <title>OMNI BOT</title>
  34.     <style>
  35.       body {
  36.         background-color: #343a40;
  37.         font-family: Arial, Helvetica, Sans-Serif;
  38.         Color: #000000;
  39.       }
  40.       #ab {
  41.         color: black;
  42.         padding: 15px;
  43.         text-align: center;
  44.         text-decoration: none;
  45.         display: inline-block;
  46.         font-size: 15px;
  47.         margin: 2px 50px 2px -50px;
  48.         cursor: pointer;
  49.         border-radius: 12px;
  50.         width: 100%;
  51.       }
  52.       #JD {
  53.         text-align: center;
  54.       }
  55.       #JD {
  56.         text-align: center;
  57.         font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
  58.         font-size: 24px;
  59.       }
  60.       .foot {
  61.         text-align: center;
  62.         font-family: "Comic Sans MS", cursive;
  63.         font-size: 30px;
  64.         color: #F00;
  65.       }
  66.       .button {
  67.         border: none;
  68.         color: black;
  69.         padding: 17px;
  70.         text-align: center;
  71.         text-decoration: none;
  72.         display: inline-block;
  73.         font-size: 16px;
  74.         margin: 4px 2px;
  75.         cursor: pointer;
  76.         border-radius: 12px;
  77.         width: 100%;
  78.       }
  79.       .red {
  80.         background-color: #f8f9fa;
  81.       }
  82.       .green {
  83.         background-color: #f8f9fa;
  84.       }
  85.       .yellow {
  86.         background-color: #f8f9fa;
  87.       }
  88.       .blue {
  89.         background-color: #f8f9fa;
  90.       }
  91.     </style>
  92.     <script>
  93.       var websock;
  94.       function start() {
  95.         websock = new WebSocket('ws://' + window.location.hostname + ':81/');
  96.         websock.onopen = function(evt) {
  97.           console.log('websock open');
  98.         };
  99.         websock.onclose = function(evt) {
  100.           console.log('websock close');
  101.         };
  102.         websock.onerror = function(evt) {
  103.           console.log(evt);
  104.         };
  105.         websock.onmessage = function(evt) {
  106.           console.log(evt);
  107.           var e = document.getElementById('ledstatus');
  108.           if (evt.data === 'ledon') {
  109.             e.style.color = 'red';
  110.           } else if (evt.data === 'ledoff') {
  111.             e.style.color = 'black';
  112.           } else {
  113.             console.log('unknown event');
  114.           }
  115.         };
  116.       }
  117.       function buttonclick(e) {
  118.         websock.send(e.id);
  119.       }
  120.     </script>
  121.   </head>
  122.   <body onload="javascript:start();">
  123.     <table width="100" height="249" border="0" align="center">
  124.       <tr>
  125.       <tr>
  126.       <tr>
  127.       <tr>
  128.       <tr>
  129.       <tr>
  130.       <tr>
  131.       <tr>
  132.       <tr>
  133.       <tr>
  134.       <tr>
  135.       <tr>
  136.       <tr>
  137.       <tr>
  138.       <tr>
  139.       <tr>
  140.       <tr>
  141.       <tr>
  142.       <tr>
  143.       <tr>
  144.       <tr>
  145.       <tr>
  146.       <tr>
  147.       <tr>
  148.       <tr>
  149.       <tr>
  150.         <td> </td>
  151.         <td align="center" valign="middle">
  152.           <form name="form1" method="post" action="">
  153.             <label>
  154.               <button id="F" type="button" onclick="buttonclick(this);" class="button green">Forward</button>
  155.             </label>
  156.           </form>
  157.         </td>
  158.         <td> </td>
  159.       </tr>
  160.       <tr>
  161.       <tr>
  162.       <tr>
  163.       <tr>
  164.       <tr>
  165.       <tr>
  166.       <tr>
  167.       <tr>
  168.       <tr>
  169.       <tr>
  170.       <tr>
  171.       <tr>
  172.         <td align="center" valign="middle">
  173.           <form name="form1" method="post" action="">
  174.             <label>
  175.               <button id="L" type="button" onclick="buttonclick(this);" class="button green">Left</button>
  176.             </label>
  177.           </form>
  178.         </td>
  179.         <td align="center" valign="middle">
  180.           <form name="form1" method="post" action="">
  181.             <label>
  182.               <button id="S" type="button" onclick="buttonclick(this);" class="button red">Stop</button>
  183.             </label>
  184.           </form>
  185.         </td>
  186.         <td align="center" valign="middle">
  187.           <form name="form1" method="post" action="">
  188.             <label>
  189.               <button id="R" type="button" onclick="buttonclick(this);" class="button green">Right</button>
  190.             </label>
  191.           </form>
  192.         </td>
  193.       </tr>
  194.       <tr>
  195.       <tr>
  196.       <tr>
  197.       <tr>
  198.       <tr>
  199.       <tr>
  200.       <tr>
  201.       <tr>
  202.       <tr>
  203.       <tr>
  204.       <tr>
  205.       <tr>
  206.         <td> </td>
  207.         <td align="center" valign="middle">
  208.           <form name="form1" method="post" action="">
  209.             <label>
  210.               <button id="B" type="button" onclick="buttonclick(this);" class="button green">Backward</button>
  211.             </label>
  212.           </form>
  213.         </td>
  214.         <td> </td>
  215.       </tr>
  216.       <tr>
  217.       <tr>
  218.       <tr>
  219.       <tr>
  220.       <tr>
  221.       <tr>
  222.       <tr>
  223.       <tr>
  224.       <tr>
  225.       <tr>
  226.       <tr>
  227.       <tr>
  228.       <tr>
  229.       <tr>
  230.       <tr>
  231.       <tr>
  232.       <tr>
  233.       <tr>
  234.       <tr>
  235.       <tr>
  236.       <tr>
  237.       <tr>
  238.       <tr>
  239.         <td align="center" valign="middle">
  240.           <form name="form1" method="post" action="">
  241.             <label>
  242.               <button id="a" type="button" onclick="buttonclick(this);" class="button blue">Forward Right</button>
  243.             </label>
  244.           </form>
  245.         </td>
  246.         <td align="center" valign="middle">
  247.           <form name="form1" method="post" action="">
  248.             <label>
  249.               <button id="b" type="button" onclick="buttonclick(this);" class="button blue">Forward Left</button>
  250.             </label>
  251.           </form>
  252.         </td>
  253.         <td align="center" valign="middle">
  254.           <form name="form1" method="post" action="">
  255.             <label>
  256.               <button id="c" type="button" onclick="buttonclick(this);" class="button blue">Backward Right</button>
  257.             </label>
  258.           </form>
  259.         </td>
  260.         <td align="center" valign="middle">
  261.           <form name="form1" method="post" action="">
  262.             <label>
  263.               <button id="d" type="button" onclick="buttonclick(this);" class="button blue">Backward Left</button>
  264.             </label>
  265.           </form>
  266.         </td>
  267.       </tr>
  268.       <tr>
  269.       <tr>
  270.       <tr>
  271.       <tr>
  272.       <tr>
  273.       <tr>
  274.       <tr>
  275.       <tr>
  276.       <tr>
  277.       <tr>
  278.       <tr>
  279.       <tr>
  280.       <tr>
  281.       <tr>
  282.       <tr>
  283.       <tr>
  284.       <tr>
  285.       <tr>
  286.       <tr>
  287.       <tr>
  288.       <tr>
  289.       <tr>
  290.       <tr>
  291.       <tr></tr>
  292.       <td align="center" valign="middle">
  293.         <form name="form1" method="post" action="">
  294.           <label>
  295.             <button id="o" type="button" onclick="buttonclick(this);" class="button yellow">CCW</button>
  296.           </label>
  297.         </form>
  298.       </td>
  299.       <td align="center" valign="middle">
  300.         <form name="form1" method="post" action="">   </form>
  301.       </td>
  302.       <td align="center" valign="middle">
  303.         <form name="form1" method="post" action="">
  304.           <label>
  305.             <button id="f" type="button" onclick="buttonclick(this);" class="button yellow">CW</button>
  306.           </label>
  307.         </form>
  308.       </td>
  309.       </tr>
  310.     </table>
  311.     <p class="foot"></p>
  312.   </body>
  313. </html>
  314. )rawliteral";
  315. WebSocketsServer webSocket = WebSocketsServer(81);
  316. ESP8266WebServer server(80);
  317. void setup() {
  318.   
  319.   Serial.begin(9600);
  320.   matrix.begin();
  321.   matrix.setTextWrap(false);
  322.   matrix.setBrightness(20);
  323.   matrix.setTextColor(colors[0]);
  324.   
  325.   pinMode(AIN1,OUTPUT);
  326.   pinMode(AIN2,OUTPUT);
  327.   
  328.   pinMode(BIN1,OUTPUT);
  329.   pinMode(BIN2,OUTPUT);
  330.   pinMode(AIN3,OUTPUT);
  331.   pinMode(AIN4,OUTPUT);
  332.   WiFi.mode(WIFI_AP);         
  333.   WiFi.softAP(ssid, password);  
  334.   IPAddress myIP = WiFi.softAPIP();
  335.   Serial.println("");
  336.   Serial.print("Connected to ");
  337.   Serial.println(ssid);
  338.   Serial.print("IP address: ");   
  339.   Serial.println(myIP);
  340.   server.on("/", [](){
  341.   server.send(200, "text/html", INDEX_HTML);
  342.   });
  343.   
  344.   server.begin();
  345.   webSocket.begin();
  346.   webSocket.onEvent(webSocketEvent);
  347.   
  348. }
  349. int x    = matrix.width();
  350. int pass = 0;
  351. void loop() {
  352.   
  353.    matrix.fillScreen(0);
  354.    matrix.setCursor(x, 0);
  355.    
  356.      if(Data=='a')fl();
  357. else if(Data=='b')fr();
  358. else if(Data=='c')br();
  359. else if(Data=='d')bl();
  360. else if(Data=='o')ccw();
  361. else if(Data=='f')cw();
  362. else if(Data=='F')forword();
  363. else if(Data=='B')backword();
  364. else if(Data=='R')right();
  365. else if(Data=='L')left();
  366. else if(Data=='S')stop();
  367.    
  368.    webSocket.loop();
  369.    server.handleClient();
  370. }
  371. void webSocketEvent(uint8_t num, WStype_t type,uint8_t * Payload, size_t length){
  372.   switch(type) {
  373.     case WStype_DISCONNECTED:
  374.       //Serial.printf("[%u] Disconnected!\r\n", num);
  375.       break;
  376.     case WStype_CONNECTED:
  377.       {IPAddress ip = webSocket.remoteIP(num);}
  378.       break;
  379.     case WStype_TEXT:
  380.       //Serial.printf("%s\r\n", Payload);
  381.       Data = Payload[0];
  382.       Serial.println(Data);
  383.       // send data to all connected clients
  384.       webSocket.broadcastTXT(Payload, length);
  385.      
  386.       break;
  387.     case WStype_BIN:
  388.       hexdump(Payload, length);
  389.       // echo data back to browser
  390.       webSocket.sendBIN(num, Payload, length);
  391.       break;
  392.       default:
  393.       break;
  394.   }
  395. }
  396. void face1() {
  397.     matrix.fillScreen(0);
  398.     matrix.setCursor(x, -1);
  399.    
  400.     matrix.print(F("-----------"));
  401.   
  402.     if(--x < -36) {
  403.       x = matrix.width();
  404.       if(++pass >= 3) pass = 0;
  405.       matrix.setTextColor(matrix.Color(255, 0, 255));
  406.     }
  407.    
  408.     matrix.show();
  409.     delay(100);
  410. }
  411. void face2() {
  412.     matrix.fillScreen(0);
  413.     matrix.setCursor(x, 1);
  414.    
  415.     matrix.print(F("^^^^^^^^^"));
  416.   
  417.     if(--x < -36) {
  418.       x = matrix.width();
  419.       if(++pass >= 3) pass = 0;
  420.       matrix.setTextColor(matrix.Color(255, 0, 255));
  421.     }
  422.    
  423.     matrix.show();
  424.     delay(100);
  425. }
  426. void stop() {
  427.   face1();
  428.   digitalWrite(AIN1,LOW);
  429.   digitalWrite(AIN2,LOW);
  430.   
  431.   digitalWrite(BIN1,LOW);
  432.   digitalWrite(BIN2,LOW);
  433.   
  434.   digitalWrite(AIN3,LOW);
  435.   digitalWrite(AIN4,LOW);
  436. }
  437. void backword() {
  438.   
  439.   face2();
  440.   digitalWrite(AIN1,LOW);
  441.   digitalWrite(AIN2,HIGH);
  442.   
  443.   digitalWrite(BIN1,LOW);
  444.   digitalWrite(BIN2,HIGH);
  445.   
  446.   digitalWrite(AIN3,LOW);
  447.   digitalWrite(AIN4,LOW);
  448.    
  449. }
  450. void forword() {
  451.   face2();
  452.   digitalWrite(AIN1,HIGH);
  453.   digitalWrite(AIN2,LOW);
  454.   
  455.   digitalWrite(BIN1,HIGH);
  456.   digitalWrite(BIN2,LOW);
  457.   
  458.   digitalWrite(AIN3,LOW);
  459.   digitalWrite(AIN4,LOW);
  460.   
  461. }
  462. void left() {
  463.   face2();
  464.   digitalWrite(AIN1,HIGH);
  465.   digitalWrite(AIN2,LOW);
  466.   
  467.   digitalWrite(BIN1,LOW);
  468.   digitalWrite(BIN2,HIGH);
  469.   
  470.   digitalWrite(AIN3,HIGH);
  471.   digitalWrite(AIN4,LOW);
  472. }
  473. void right() {
  474.   face2();
  475.   digitalWrite(AIN1,LOW);
  476.   digitalWrite(AIN2,HIGH);
  477.   
  478.   digitalWrite(BIN1,HIGH);
  479.   digitalWrite(BIN2,LOW);
  480.   
  481.   digitalWrite(AIN3,LOW);
  482.   digitalWrite(AIN4,HIGH);
  483. }
  484. void cw() {
  485.   digitalWrite(AIN1,LOW);
  486.   digitalWrite(AIN2,HIGH);
  487.   
  488.   digitalWrite(BIN1,HIGH);
  489.   digitalWrite(BIN2,LOW);
  490.   
  491.   digitalWrite(AIN3,HIGH);
  492.   digitalWrite(AIN4,LOW);
  493. }
  494. void ccw() {
  495.   digitalWrite(AIN1,HIGH);
  496.   digitalWrite(AIN2,LOW);
  497.   
  498.   digitalWrite(BIN1,LOW);
  499.   digitalWrite(BIN2,HIGH);
  500.   
  501.   digitalWrite(AIN3,LOW);
  502.   digitalWrite(AIN4,HIGH);
  503. }
  504. void br() {
  505.   digitalWrite(AIN1,LOW);
  506.   digitalWrite(AIN2,HIGH);
  507.   
  508.   digitalWrite(BIN1,LOW);
  509.   digitalWrite(BIN2,LOW);
  510.   
  511.   digitalWrite(AIN3,LOW);
  512.   digitalWrite(AIN4,HIGH);
  513. }
  514. void fl() {
  515.   digitalWrite(AIN1,HIGH);
  516.   digitalWrite(AIN2,LOW);
  517.   
  518.   digitalWrite(BIN1,LOW);
  519.   digitalWrite(BIN2,LOW);
  520.   
  521.   digitalWrite(AIN3,HIGH);
  522.   digitalWrite(AIN4,LOW);
  523. }
  524. void bl() {
  525.   digitalWrite(AIN1,LOW);
  526.   digitalWrite(AIN2,LOW);
  527.   
  528.   digitalWrite(BIN1,LOW);
  529.   digitalWrite(BIN2,HIGH);
  530.   
  531.   digitalWrite(AIN3,HIGH);
  532.   digitalWrite(AIN4,LOW);
  533. }
  534. void fr() {
  535.   digitalWrite(AIN1,LOW);
  536.   digitalWrite(AIN2,LOW);
  537.   
  538.   digitalWrite(BIN1,HIGH);
  539.   digitalWrite(BIN2,LOW);
  540.   
  541.   digitalWrite(AIN3,LOW);
  542.   digitalWrite(AIN4,HIGH);
  543. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 小时前

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

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

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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail