My students are having problems with controlling the metro m4 express wifi airlift over esp32. I've tried to reproduce the problem and found out that disableing the firewall and the antivirus-virus in windows helps. However some students are still experiencing problems. Students are working with cirquitpython 6 or 7.
Here is the client code which we run in anaconda spyder:
Code: Select all
## RCBoat_Client_v2.py
import socket
import time
import keyboard
#Host name and port number of server
HOST = '192.168.4.1'
PORT = 80
#Dictionary for coding tuples
PACK_DICT = {}
PACK_DICT[(-1,-1)] = 'a'
PACK_DICT[(-1,0)] = 'b'
PACK_DICT[(-1,1)] = 'c'
PACK_DICT[(0,-1)] = 'd'
PACK_DICT[(0,0)] = 'e'
PACK_DICT[(0,1)] = 'f'
PACK_DICT[(1,-1)] = 'g'
PACK_DICT[(1,0)] = 'h'
PACK_DICT[(1,1)] = 'i'
def key_handler(key_event):
#redirect to appropiate press or release function
if key_event.event_type == 'down':key_press_handler(key_event)
elif key_event.event_type == 'up':key_release_handler(key_event)
def key_press_handler(key_event):
if key_event.name == 'left': button_state['left'] = 1
elif key_event.name == 'right': button_state['right'] = 1
elif key_event.name == 'up': button_state['forward'] = 1
elif key_event.name == 'down': button_state['backward'] = 1
def key_release_handler(key_event):
if key_event.name == 'left': button_state['left'] = 0
elif key_event.name == 'right': button_state['right'] = 0
elif key_event.name == 'up': button_state['forward'] = 0
elif key_event.name == 'down': button_state['backward'] = 0
def sendData(data):
#convert to string, encode and send
dataString = PACK_DICT[data]
dataEncoded = dataString.encode()
s.sendall(dataEncoded)
def checkStateChange(keyDirection):
if current_direction == keyDirection:
return 0
return 1
#Initialize dictionary to keep track of pressed buttons
button_state = {
'left':0,
'right':0,
'forward':0,
'backward':0
}
#To keep track of the current direction
current_direction = (0,0)
#convert to host and port to address
addr = socket.getaddrinfo(HOST, PORT)[0][4]
print(socket.getaddrinfo(HOST, PORT))
#connect to address
s = socket.socket()
s.connect(addr)
print(s)
#hook keyboard listerer to key_handler function
keyboard.hook(key_handler)
while True:
#check dictionary
leftRightDirection = button_state['right']-button_state['left']
upDownDirection = button_state['forward']-button_state['backward']
keyDirection = (leftRightDirection,upDownDirection)
#check if keyDirection is changed
stateChange = checkStateChange(keyDirection)
#if it is changed:
if stateChange:
current_direction = keyDirection #change direction
sendData(current_direction) #send it
time.sleep(50/1000)
Code: Select all
## RCBoat_Server_v2.py
##imports
import busio
import digitalio
import time
import board
#import pulseio
import pwmio
from micropython import const
from adafruit_esp32spi import adafruit_esp32spi
import adafruit_esp32spi.adafruit_esp32spi_socket as socket
from adafruit_motor import servo
#constant definitions
NO_SOCK_AVAIL = const(255)
PORT = 80
SSID = b'ESP32'
PASSWORD = b'JohanJohan'
##Pin definitions
#DC motor pins
ENA_PIN = board.D13
IN1_PIN = board.D12
IN2_PIN = board.D11
ENB_PIN = board.D8
IN3_PIN = board.D10
IN4_PIN = board.D9
#Servo pin
SERVO_PIN = board.D5
#Dictionary for Decoding data
UNPACK_DICT = {}
UNPACK_DICT['a'] = (0,-1)
UNPACK_DICT['b'] = (0,0)
UNPACK_DICT['c'] = (0,1)
UNPACK_DICT['d'] = (90,-1)
UNPACK_DICT['e'] = (90,0)
UNPACK_DICT['f'] = (90,1)
UNPACK_DICT['g'] = (180,-1)
UNPACK_DICT['h'] = (180,0)
UNPACK_DICT['i'] = (180,1)
#Define DC motor class
class DC_motor:
def __init__(self, EN_pin, IN1_pin, IN2_pin):
self.EN = pwmio.PWMOut(EN_pin)
self.IN1 = digitalio.DigitalInOut(IN1_pin)
self.IN1.direction = digitalio.Direction.OUTPUT
self.IN2 = digitalio.DigitalInOut(IN2_pin)
self.IN2.direction = digitalio.Direction.OUTPUT
def forward(self, DutyC):
self.EN.duty_cycle = 0
self.IN1.value = True
self.IN2.value = False
self.EN.duty_cycle = int(DutyC*(2**16-1))
def backward(self, DutyC):
self.EN.duty_cycle = 0
self.IN1.value = False
self.IN2.value = True
self.EN.duty_cycle = int(DutyC*(2**16-1))
def setMotor(self, DutyC):
if DutyC>0:
self.forward(DutyC)
else:
self.backward(abs(DutyC))
##setup
#initialize servo
#pwm = pulseio.PWMOut(SERVO_PIN, duty_cycle=2 ** 15, frequency=50)
pwm = pwmio.PWMOut(SERVO_PIN, frequency=50)
pwm.duty_cycle = 2 ** 15
my_servo = servo.Servo(pwm)
my_servo.angle=90
#initialize motors
motor1 = DC_motor(ENA_PIN,IN1_PIN,IN2_PIN)
motor2 = DC_motor(ENB_PIN,IN3_PIN,IN4_PIN)
#Obtain control over esp32
esp32_cs = digitalio.DigitalInOut(board.ESP_CS)
esp32_ready = digitalio.DigitalInOut(board.ESP_BUSY)
esp32_reset = digitalio.DigitalInOut(board.ESP_RESET)
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset)
#create access point
esp.create_AP(SSID, PASSWORD)
#Host server
socket.set_interface(esp)
server_socket = socket.socket()
esp.start_server(PORT, server_socket.socknum)
ip = esp.pretty_ip(esp.ip_address)
print("Server available at {0}:{1}".format(ip, PORT))
#initiate client socket
client_sock = socket.socket(socknum=NO_SOCK_AVAIL)
while True:
#wait for client connection
while client_sock.socknum == NO_SOCK_AVAIL:
client_sock_num = esp.socket_available(server_socket.socknum)
client_sock = socket.socket(socknum = client_sock_num)
if client_sock.socknum != NO_SOCK_AVAIL: print('connected')
#once connected, recieve data
if client_sock.connected() and client_sock.available()!= 0:
byteData = client_sock.recv() #recieve data
dataString = byteData.decode() #decode
dataTuple = UNPACK_DICT[dataString[-1]] #last char to tuple
print(dataTuple)
(rudderAngle, motorvalue) = dataTuple #unpack tuple
#set motors
my_servo.angle = rudderAngle
motor1.setMotor(motorvalue)
motor2.setMotor(motorvalue)
# once disconnected replace client socket for
# empty socket and wait for new client.
elif not client_sock.connected():
print('connection lost, looking for new connection...')
client_sock = socket.socket(socknum = NO_SOCK_AVAIL)
Code: Select all
while client_sock.socknum == NO_SOCK_AVAIL:
client_sock_num = esp.socket_available(server_socket.socknum)
client_sock = socket.socket(socknum = client_sock_num)
if client_sock.socknum != NO_SOCK_AVAIL: print('connected')
Thanx in advance!