166 lines
5.4 KiB
Python
166 lines
5.4 KiB
Python
import time
|
|
import random
|
|
import board
|
|
from digitalio import DigitalInOut, Direction
|
|
import pulseio
|
|
from adafruit_esp32spi import adafruit_esp32spi
|
|
|
|
|
|
# ESP32SPI Digital and Analog Pin Reads & Writes
|
|
|
|
# This example targets a Feather M4 or ItsyBitsy M4 as the CircuitPython processor,
|
|
# along with either an ESP32 Feather or ESP32 Breakout as Wi-Fi co-processor.
|
|
# You may need to choose different pins for other targets.
|
|
|
|
|
|
def esp_reset_all():
|
|
# esp.reset() will reset the ESP32 using its RST pin
|
|
# side effect is re-initializing ESP32 pin modes and debug output
|
|
esp.reset()
|
|
time.sleep(1)
|
|
# (re-)set NINA serial debug on ESP32 TX
|
|
esp.set_esp_debug(True) # False, True
|
|
# (re-)set digital pin modes
|
|
esp_init_pin_modes(ESP_D_R_PIN, ESP_D_W_PIN)
|
|
|
|
def esp_init_pin_modes(din, dout):
|
|
# ESP32 Digital Input
|
|
esp.set_pin_mode(din, 0x0)
|
|
|
|
# ESP32 Digital Output (no output on pins 34-39)
|
|
esp.set_pin_mode(dout, 0x1)
|
|
|
|
def esp_status_text(n):
|
|
text = 'WL_UNDEFINED'
|
|
t = {0: 'WL_IDLE_STATUS',
|
|
1: 'WL_NO_SSID_AVAIL',
|
|
2: 'WL_SCAN_COMPLETED',
|
|
3: 'WL_CONNECTED',
|
|
4: 'WL_CONNECT_FAILED',
|
|
5: 'WL_CONNECTION_LOST',
|
|
6: 'WL_DISCONNECTED',
|
|
7: 'WL_AP_LISTENING',
|
|
8: 'WL_AP_CONNECTED',
|
|
9: 'WL_AP_FAILED',
|
|
10: 'WL_NO_SHIELD', }
|
|
if n in t:
|
|
text = t[n]
|
|
return text
|
|
|
|
|
|
# M4 R/W Pin Assignments
|
|
M4_D_W_PIN = DigitalInOut(board.A1) # digital write to ESP_D_R_PIN
|
|
M4_D_W_PIN.direction = Direction.OUTPUT
|
|
M4_A_R_PIN = pulseio.PulseIn(board.A0, maxlen=64) # PWM read from ESP_A_W_PIN
|
|
M4_A_R_PIN.pause()
|
|
|
|
# ESP32 R/W Pin assignments & connections
|
|
ESP_D_R_PIN = 12 # digital read from M4_D_W_PIN
|
|
ESP_D_W_PIN = 13 # digital write to Red LED on Feather ESP32 and ESP32 Breakout
|
|
# ESP32 Analog Input using ADC1
|
|
# esp.set_pin_mode(36, 0x0) # Hall Effect Sensor
|
|
# esp.set_pin_mode(37, 0x0) # Not Exposed
|
|
# esp.set_pin_mode(38, 0x0) # Not Exposed
|
|
# esp.set_pin_mode(39, 0x0) # Hall Effect Sensor
|
|
# esp.set_pin_mode(32, 0x0) # INPUT OK
|
|
# esp.set_pin_mode(33, 0x0) # DO NOT USE: ESP32SPI Busy/!Rdy
|
|
# esp.set_pin_mode(34, 0x0) # INPUT OK
|
|
# esp.set_pin_mode(35, 0x0) # INPUT OK (1/2 of Battery on ESP32 Feather)
|
|
ESP_A_R_PIN = 32 # analog read from 10k potentiometer
|
|
# ESP32 Analog (PWM/LEDC) Output (no output on pins 34-39)
|
|
ESP_A_W_PIN = 27 # analog (PWM) write to M4_A_R_PIN
|
|
|
|
spi = board.SPI()
|
|
# Airlift FeatherWing & Bitsy Add-On compatible
|
|
esp32_cs = DigitalInOut(board.D13) # M4 Red LED
|
|
esp32_ready = DigitalInOut(board.D11)
|
|
esp32_reset = DigitalInOut(board.D12)
|
|
esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset)
|
|
|
|
esp_reset_all()
|
|
|
|
espfirmware = ''
|
|
for _ in esp.firmware_version:
|
|
if _ == 0:
|
|
break
|
|
else:
|
|
espfirmware += "{:c}".format(_)
|
|
print('ESP32 Firmware:', espfirmware)
|
|
|
|
esp_MAC_address = esp.MAC_address
|
|
print("ESP32 MAC: {5:02X}:{4:02X}:{3:02X}:{2:02X}:{1:02X}:{0:02X}".format(*esp_MAC_address))
|
|
|
|
print('ESP32 Status: ', esp.status, esp_status_text(esp.status), 'Connected?', esp.is_connected)
|
|
|
|
# initial digital write values
|
|
m4_d_w_val = False
|
|
esp_d_w_val = False
|
|
|
|
while True:
|
|
print('\nESP32 DIGITAL:')
|
|
|
|
# ESP32 digital read
|
|
try:
|
|
M4_D_W_PIN.value = m4_d_w_val
|
|
print('M4 wrote:', m4_d_w_val, end=' ')
|
|
# b/c ESP32 might have reset out from under us
|
|
esp_init_pin_modes(ESP_D_R_PIN, ESP_D_W_PIN)
|
|
esp_d_r_val = esp.set_digital_read(ESP_D_R_PIN)
|
|
print('--> ESP read:', esp_d_r_val)
|
|
except (RuntimeError, AssertionError) as e:
|
|
print('ESP32 Error', e)
|
|
esp_reset_all()
|
|
|
|
# ESP32 digital write
|
|
try:
|
|
# b/c ESP32 might have reset out from under us
|
|
esp_init_pin_modes(ESP_D_R_PIN, ESP_D_W_PIN)
|
|
esp.set_digital_write(ESP_D_W_PIN, esp_d_w_val)
|
|
print('ESP wrote:', esp_d_w_val, '--> Red LED')
|
|
except (RuntimeError) as e:
|
|
print('ESP32 Error', e)
|
|
esp_reset_all()
|
|
|
|
print('ESP32 ANALOG:')
|
|
|
|
# ESP32 analog read
|
|
try:
|
|
esp_a_r_val = esp.set_analog_read(ESP_A_R_PIN)
|
|
print('Potentiometer --> ESP read: ', esp_a_r_val,
|
|
' (', '{:1.1f}'.format(esp_a_r_val*3.3/65536), 'v)', sep='')
|
|
except (RuntimeError, AssertionError) as e:
|
|
print('ESP32 Error', e)
|
|
esp_reset_all()
|
|
|
|
# ESP32 analog write
|
|
try:
|
|
# don't set the low end to 0 or the M4's pulseio read will stall
|
|
esp_a_w_val = random.uniform(0.1, .9)
|
|
esp.set_analog_write(ESP_A_W_PIN, esp_a_w_val)
|
|
print('ESP wrote: ', '{:1.2f}'.format(esp_a_w_val),
|
|
' (', '{:d}'.format(int(esp_a_w_val*65536)), ')',
|
|
' (', '{:1.1f}'.format(esp_a_w_val*3.3), 'v)',
|
|
sep='', end=' ')
|
|
|
|
# ESP32 "analog" write is a 1000Hz PWM
|
|
# use pulseio to extract the duty cycle
|
|
M4_A_R_PIN.clear()
|
|
M4_A_R_PIN.resume()
|
|
while len(M4_A_R_PIN) < 2:
|
|
pass
|
|
M4_A_R_PIN.pause()
|
|
duty = M4_A_R_PIN[0] / (M4_A_R_PIN[0] + M4_A_R_PIN[1])
|
|
print('--> M4 read: ', '{:1.2f}'.format(duty),
|
|
' (', '{:d}'.format(int(duty*65536)), ')',
|
|
' (', '{:1.1f}'.format(duty*3.3), 'v)',
|
|
' [len=', len(M4_A_R_PIN), ']', sep='')
|
|
|
|
except (RuntimeError) as e:
|
|
print('ESP32 Error', e)
|
|
esp_reset_all()
|
|
|
|
# toggle digital write values
|
|
m4_d_w_val = not m4_d_w_val
|
|
esp_d_w_val = not esp_d_w_val
|
|
|
|
time.sleep(5)
|