Plataforma automotriz no esp8266 MK com micropython

Olá Habr!

Este artigo descreve o sofrimento de um iniciante no processo de fabricação de uma plataforma de plataforma automotora baseada no esp8266 MK com micropython , gerenciada por um servidor da Web integrado.

KDPV:



Interface:
imagem

Como mencionei no primeiro artigo , o projeto é educacional, portanto, não julgue rigorosamente.

Portanto, a tarefa do primeiro estágio é criar uma plataforma lagarta que possa ser controlada via wi-fi.
Para que finalidade, nas caixas, foi encontrado um velho tanque de brinquedos, e também foram adquiridos o MK esp8266 (ESP-12E) e um driver de motor.

esp8266 e montagem do motor


Além disso, todos os itens acima foram coletados de acordo com o esquema:



e depois de alguns dias de um breve estudo da documentação , ficou claro como controlar os motores:

from machine import Pin, PWM
""" nodemcu pins from the motor shield """
servo_1 = Pin(5, Pin.OUT)  # PWMA-GPIO5
servo_2 = Pin(4, Pin.OUT)  # PWMB-GPIO4
revrs_L = Pin(0, Pin.OUT, value=0)  # DA-GPIO0
revrs_R = Pin(2, Pin.OUT, value=0)  # DB-GPIO2
""" named after the L9110 h-bridge pins """
motor_L = PWM(servo_1, freq=1000, duty=0)
motor_R = PWM(servo_2, freq=1000, duty=0)
""" TODO: variable speed """
speed = 1023 

def stop_all():
    revrs_L.value(0)
    motor_L.duty(0)
    revrs_R.value(0)
    motor_R.duty(0)

def forward():
    revrs_L.value(0)
    motor_L.duty(speed)
    revrs_R.value(0)
    motor_R.duty(speed)

Assim, o pino 5 e o pino 4 - permitem definir a velocidade de rotação dos motores através do PWM, e o pino 0 e o pino 2 - controlam o inverso para as saídas "A" e "B", respectivamente. Além disso, como o LED também está conectado ao pin2 na minha placa, também observamos efeitos de luz em paralelo com o movimento :)

No entanto, ele não decolou imediatamente ... O

Google em um determinado tópico levou a um fórum em que havia uma recomendação para remover dois resistores "extras", o que foi feito. Citação de lá:
Eu medi esses resistores, na entrada do L293DD, a resistência é de 1K, mas eles têm uma resistência de apenas 100 ohms ao terra. Isso significa que o sinal de entrada do controlador NodeMCU não pode alcançar o L293DD. Realmente não sei por que eles estão lá - o L293DD pode processar até 7 V na entrada e o NodeMCU fornece uma saída de 3,3 V. Removai
esses dois resistores de 100 Ohm (o primeiro e o terceiro à esquerda quando a antena está à direita) e agora Shield funciona.


Depois disso, as coisas correram bem, e

versão final do código
# RoboTank based on ESP8266 with motor shield
import network
import socket
from machine import Pin, PWM

""" nodemcu pins from the motor shield """
servo_1 = Pin(5, Pin.OUT)  # PWMA-GPIO5
servo_2 = Pin(4, Pin.OUT)  # PWMB-GPIO4
revrs_L = Pin(0, Pin.OUT, value=0)  # DA-GPIO0
revrs_R = Pin(2, Pin.OUT, value=0)  # DB-GPIO2

""" named after the L9110 h-bridge pins """
motor_L = PWM(servo_1, freq=1000, duty=0)
motor_R = PWM(servo_2, freq=1000, duty=0)

""" TODO: variable speed """
speed = 1023 

""" function for connecting to your local WiFi network """
def do_connect():
    essid = 'home_wifi'
    password = '12345678'
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print('connecting to network...')
        sta_if.active(True)
        sta_if.connect(essid, password)
        while not sta_if.isconnected():
            pass
    print('network config:', sta_if.ifconfig())

def stop_all():
    revrs_L.value(0)
    motor_L.duty(0)
    revrs_R.value(0)
    motor_R.duty(0)

def backward():
    revrs_L.value(1)
    motor_L.duty(speed)
    revrs_R.value(1)
    motor_R.duty(speed)

def forward():
    revrs_L.value(0)
    motor_L.duty(speed)
    revrs_R.value(0)
    motor_R.duty(speed)

def right():
    revrs_L.value(0)
    motor_L.duty(speed)
    revrs_R.value(1)
    motor_R.duty(speed)

def left():
    revrs_L.value(1)
    motor_L.duty(speed)
    revrs_R.value(0)
    motor_R.duty(speed)
    
def right_turn():
    revrs_L.value(0)
    motor_L.duty(speed)
    revrs_R.value(0)
    motor_R.duty(0)

def left_turn():
    revrs_L.value(0)
    motor_L.duty(0)
    revrs_R.value(0)
    motor_R.duty(speed)

def web_page(request):
  motor_state="Stopped"
  if request.find('GET /?forward') > 0:
    motor_state="Going Forward"
    forward()
  if request.find('GET /?left') > 0:
    motor_state="Rotate Left"
    left()
  if request.find('GET /?right') > 0:
    motor_state="Rotate Right" 
    right()
  if request.find('GET /?left_turn') > 0:
    motor_state="Turn Left"
    left_turn()
  if request.find('GET /?right_turn') > 0:
    motor_state="Turn Right" 
    right_turn()
  if request.find('GET /?backward') > 0:
    motor_state="Going Backward"
    backward()
  if request.find('GET /?stop') > 0:
    motor_state="Stopped"
    stop_all()
  
  html = """<html><head><title>RoboTank WEB</title> 
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" href="data:,"> <style>
  html{font-family: Helvetica; display:inline-block; margin: 0px auto; text-align: center;}
  h1{color: #0F3376; padding: 2vh;}p{font-size: 1.5rem;}
  .button{display: inline-block; background-color: #33c080; border: none; 
  border-radius: 4px; color: white; text-decoration: none; font-size: 30px; width:100%}
  .button2{background-color: #4286f4; width:30%}
  .button3{background-color: #eb2b10; width:35%}
  .button4{background-color: #8386f4; width:44%}
  </style></head>
  <body> <h1>RoboTank WEB</h1> 
  <p>Status : <strong>""" + motor_state + """</strong></p>
  <p><a href='/?forward'><button class="button">Forward</button></a></p>
  <p><a href='/?left_turn'><button class="button button2">LEFT</button></a>
  <a href='/?stop'><button class="button button3">STOP</button></a>
  <a href='/?right_turn'><button class="button button2">RIGHT</button></a>
  <p><a href='/?backward'><button class="button">Backward</button></a></p>
  <p><a href='/?left'><button class="button button4">L-rotate</button></a>
  <a href='/?right'><button class="button button4">R-rotate</button></a></p>
  </body></html>""" 

  return html

#Stop all motors first
stop_all()

# connect to wi-fi network
do_connect() 

# create socket for web srvr
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
try:
    s.bind(addr)
    s.listen(1)
except:
    s.close()
    s.bind(addr)
    s.listen(1)

# main loop
while True:
  conn, addr = s.accept()
  print('Got a connection from %s' % str(addr))
  request = conn.recv(1024)
  request = str(request)
  print('The Content = %s' % request)
  response = web_page(request)
  conn.send('HTTP/1.1 200 OK\n')
  conn.send('Content-Type: text/html\n')
  conn.send('Connection: close\n\n')
  conn.sendall(response)
  conn.close()


Acabou sendo bastante eficiente e resolveu com êxito a tarefa definida no primeiro estágio.

O primeiro pokatushki:


A primeira parte (Instalando o micropython no ESP8266 e trabalhando com ele no Linux)

A próxima parte (Robô simples no MK esp8266 com micropython)

Fontes de inspiração:

funprojects.blog/2019/02/12/micropython-air-boat
www.instructables.com/id / Simplest-Wifi-Car-Using-ESP8266-Motorshield
forum.micropython.org/viewtopic.php?t=3977
randomnerdtutorials.com/esp32-esp8266-micropython-web-server
docs.micropython.org/en/latest/esp8266/ tutorial / index.html

All Articles