рдорд╛рдЗрдХреНрд░реЛрдкреНрд░рд┐рдереЙрди рдХреЗ рд╕рд╛рде esp8266 рдПрдордХреЗ рдкрд░ рд╕реНрд╡-рдЪрд╛рд▓рд┐рдд рдордВрдЪ

рд╣реЗрд▓реЛ, рд╣реЗрдмреНрд░!

рдпрд╣ рдЖрд▓реЗрдЦ рдПрдХ рдПрдХреАрдХреГрдд рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдорд╛рдЗрдХреНрд░реЛрдкреНрд░рд┐рдереЙрди рдХреЗ рд╕рд╛рде esp8266 рдПрдордХреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╕реНрд╡-рдЪрд╛рд▓рд┐рдд рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рд╢реБрд░реБрдЖрдд рдХреА рдкреАрдбрд╝рд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред KDPV:





рдЗрдВрдЯрд░рдлреЗрд╕:
image

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ , рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реИрдХреНрд╖рд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреГрдкрдпрд╛ рд╕рдЦреНрддреА рд╕реЗ рдиреНрдпрд╛рдп рди рдХрд░реЗрдВред

рддреЛ, рдкрд╣рд▓реЗ рдЪрд░рдг рдХрд╛ рдХрд╛рд░реНрдп рдПрдХ рдХреИрдЯрд░рдкрд┐рд▓рд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдмрдирд╛рдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╛рдИ-рдлрд╛рдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреБрд░рд╛рдирд╛ рдЦрд┐рд▓реМрдирд╛ рдЯреИрдВрдХ рдбрд┐рдмреНрдмреЗ рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╕рд╛рде рд╣реА рдПрдордХреЗ рдПрд╕реНрдк 8266 (рдИрдПрд╕рдкреА -12 рдИ) рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдореЛрдЯрд░ рдЪрд╛рд▓рдХ рдЦрд░реАрджрд╛ рдЧрдпрд╛ рдерд╛ред

рдПрд╕реНрдк 8266 рдФрд░ рдореЛрдЯрд░рд╢рд┐рд▓реНрдб рдЕрд╕реЗрдВрдмрд▓реА


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:



рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЕрдзреНрдпрдпрди рдХреЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреЗ рдмрд╛рдж , рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдореЛрдЯрд░реЛрдВ рдХреЛ рдХреИрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП:

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)

рдЗрд╕ рдкреНрд░рдХрд╛рд░, pin5 рдФрд░ pin4 - рдЖрдк PWM рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЛрдЯрд░реНрд╕ рдХреЗ рд░реЛрдЯреЗрд╢рди рдХреА рдЧрддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ pin0 рдФрд░ pin2 - рдХреНрд░рдорд╢рдГ рдЖрдЙрдЯрдкреБрдЯ "рдП" рдФрд░ "рдмреА" рдХреЗ рд▓рд┐рдП рд░рд┐рд╡рд░реНрд╕ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреВрдВрдХрд┐ LED рдореЗрд░реЗ рдмреЛрд░реНрдб рдкрд░ pin2 рд╕реЗ рднреА рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЖрдВрджреЛрд▓рди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рднреА рд╣рд▓реНрдХреЗ рдкреНрд░рднрд╛рд╡реЛрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ :)

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рддреБрд░рдВрдд рдмрдВрдж рдирд╣реАрдВ рд╣реБрдЖ ...

рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╡рд┐рд╖рдп рдкрд░ Google рдиреЗ рдПрдХ рдордВрдЪ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╣рд╛рдВ рджреЛ "рдЕрддрд┐рд░рд┐рдХреНрдд" рдкреНрд░рддрд┐рд░реЛрдзреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЧрдИ рдереА, рдЬреЛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд╣рд╛рдВ рд╕реЗ рдмреЛрд▓реА:
рдореИрдВрдиреЗ рдЗрди рдкреНрд░рддрд┐рд░реЛрдзреЛрдВ рдХреЛ рдорд╛рдкрд╛, L293DD рдХреЗ рдЗрдирдкреБрдЯ рдкрд░, рдкреНрд░рддрд┐рд░реЛрдз 1K рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдкрд╛рд╕ рдЬрдореАрди рдкрд░ рдХреЗрд╡рд▓ 100 рдУрдо рдХрд╛ рдкреНрд░рддрд┐рд░реЛрдз рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ NodeMCU рдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЗ рдЗрдирдкреБрдЯ рд╕рд┐рдЧреНрдирд▓ L293DD рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рд╡реЗ рд╡рд╣рд╛рдВ рдХреНрдпреЛрдВ рд╣реИрдВ - L293DD рдЕрдкрдиреЗ рдЗрдирдкреБрдЯ рдкрд░ 7 V рддрдХ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ NodeMCU 3.3 V рдЖрдЙрдЯрдкреБрдЯ рджреЗрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдЗрди рджреЛ 100 рдУрдо рдкреНрд░рддрд┐рд░реЛрдзреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ (рдПрдВрдЯреАрдирд╛ рдХреЗ рджрд╛рдИрдВ рдУрд░ рдкрд╣рд▓рд╛ рдФрд░ рддреАрд╕рд░рд╛ рдмрд╛рдИрдВ рдУрд░), рдФрд░ рдЕрдмред рдврд╛рд▓ рдХрд╛рдо рдХрд░рддреА рд╣реИред


рдЙрд╕рдХреЗ рдмрд╛рдж, рдЪреАрдЬреЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдЪрд▓реА рдЧрдИрдВ, рдФрд░

рдХреЛрдб рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг
# 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()


рдпрд╣ рдХрд╛рдлреА рдХреБрд╢рд▓ рдирд┐рдХрд▓рд╛, рдФрд░ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдкрд╣рд▓рд╛ рдкреЛрдХрд╛рддреБрдХреА:


рдкрд╣рд▓реЗ рднрд╛рдЧ (ESP8266 рдкрд░ micropython рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде)

(micropython рд╕рд╛рде рдПрдордХреЗ esp8266 рдкрд░ рд╕рд░рд▓ рд░реЛрдмреЛрдЯ) рдЕрдЧрд▓реЗ рднрд╛рдЧ

рдкреНрд░реЗрд░рдгрд╛ рдХрд╛ рд╕реНрд░реЛрдд:

funprojects.blog/2019/02/12/micropython-air-boat
www.instructables.com/id / рд╕рд░рд▓рддрдо-рд╡рд╛рдИрдлрд╝рд╛рдИ-рдХрд╛рд░-рдкреНрд░рдпреЛрдЧ-ESP8266-Motorshield
forum.micropython.org/viewtopic.php?t=3977
randomnerdtutorials.com/esp32-esp8266 -micropython -web-server
docs.micropython.org/en/latest/esp26 рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ / index.html

All Articles