
ãã€ã³ã³ã®ã«ã¡ã©å ¥éãããð ESP32 Python ã«ã¡ã©å¶åŸ¡ãšãããªé ä¿¡æ¹æ³
ESP32ã®åå¿è ãå ¥éè åãã«ãFreenove補ESP32-S3ã®ã«ã¡ã©ä»ãã®éçºããŒãã«ãããŠãPython ã§ã«ã¡ã©ãå¶åŸ¡ããŠãããªé ä¿¡ããæ¹æ³ããŸãšããŠã¿ãã
以äžãå®éã«ESP32ã®ã«ã¡ã©ã§æ®åœ±ããæ åããPCã®ãã©ãŠã¶ã§é²èЧããåç»ãESP32ã®ã«ã¡ã©ãMicroPythonã§åããŠãããïŒãã®è£åŽã®ç§å¯ãèšäºã®åŸåã§è§£èª¬ããã

ä»åãå®éã«è©ŠããéçºããŒãã¯ä»¥äžãçè
ã¯Amazonã§è³Œå
¥ããã
100è¡çšåºŠã®Pythonãæžãã°ããã€ã³ã³ã§ãããªé
ä¿¡ã§ããã®ã§ãããããæ¥œãããïŒã©ãºãã€ããå®äŸ¡ã§ãèµ·åãæ©ãã®ãé
åïŒ1ç§æªæºã ãšæãïŒ
Amazonã§æè»œã«è²·ããã®ããããFreenoveã®ããŒããå質ãé«ããð€©ESP32ã®å
¥éã«ãæé©ãå匷代ãšèããã°æªããªãäŸ¡æ Œåž¯ã
MicroPythonã®ã³ãŒã
以äžãMicroPythonã³ãŒãã§å®çŸã§ããã100è¡ã«çµã£ãã®ã§ãAIã«çžè«ããã°ãå°ããã€ä»çµã¿ãçè§£ã§ããããã«ãªããšæãã
Motion JPEGããã«ãããŒããšããæ¹æ³ã§ãããªã¹ããªãŒãã³ã°ãå®çŸããæ¹æ³ãFreenoveå
¬åŒGitHubã®ãµã³ãã«ãåèã«ããŠãä»åãçè
ãäœæããã³ãŒãã
import network
import socket
import time
import _thread
from camera import Camera, FrameSize, PixelFormat
SSID = 'YOUR_SSID'
PASSWORD = 'YOUR_PASSWORD'
CAM_PIXEL_FORMAT = PixelFormat.JPEG
CURRENT_FRAME_SIZE = FrameSize.VGA
XCLK_FREQ = 10000000
def connect_wifi(ssid, password):
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
while not station.isconnected():
time.sleep(1)
return station.ifconfig()[0]
def init_camera(frame_size, pixel_format, xclk_freq):
cam = Camera(frame_size=frame_size, pixel_format=pixel_format, xclk_freq=xclk_freq, init=False)
cam.init()
return cam
def generate_html():
return """<!DOCTYPE html><html><head><meta charset="UTF-8"><title>ESP32 Camera</title></head>
<body><div class="video-container"><h1>ESP32 Camera Live Stream</h1><img src="/stream" alt="Camera Stream">
</div></body></html>
"""
def handle_stream_request(client, cam):
try:
headers = (
b'HTTP/1.1 200 OK\r\n'
b'Content-Type: multipart/x-mixed-replace; boundary=frame\r\n'
b'Cache-Control: no-cache\r\n\r\n')
client.send(headers)
while True:
frame = cam.capture()
if not frame:
time.sleep(0.01)
continue
client.send(b'--frame\r\nContent-Type: image/jpeg\r\nContent-Length: ' + str(len(frame)).encode() + b'\r\n\r\n')
client.send(frame)
client.send(b'\r\n')
except OSError:
pass
def handle_html_request(client, html_content):
response = 'HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n' + html_content
client.send(response.encode())
def handle_client(client, cam, html_content):
try:
client.settimeout(5.0)
request = b""
while True:
data = client.recv(1024)
if not data:
break
request += data
if request[-4:] == b"\r\n\r\n":
break
if len(request) > 2048:
print("Request too large, closing connection.")
return
req_text = request.decode('utf-8', 'ignore')
if 'GET /stream' in req_text:
client.settimeout(None)
handle_stream_request(client, cam)
elif 'GET /' in req_text:
handle_html_request(client, html_content)
except OSError:
pass
finally:
try:
client.close()
except:
pass
def main():
ip_address = connect_wifi(SSID, PASSWORD)
print(f'Connected! IP: {ip_address}')
cam = init_camera(CURRENT_FRAME_SIZE, CAM_PIXEL_FORMAT, XCLK_FREQ)
html_content = generate_html()
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(addr)
s.listen(2)
while True:
try:
client, addr = s.accept()
_thread.start_new_thread(handle_client, (client, cam, html_content))
except Exception:
time.sleep(1)
main()å ¥éããã®ã«æé©ãªLEDãæµæãã»ããããããã«ã¡ã©ã§æ®åœ±äžã¯èµ€ãLEDãç¹ç¯ããããšæ ããããã
ãã¿ã³ãLEDãæµæããã¶ãŒãªã©ã®éšåã¯å¥éè³Œå ¥ããŠãESP32ã§å©çšã§ããã
MicroPython ã®ã€ã³ã¹ããŒã«æ¹æ³
ã«ã¡ã©ã®ããŒããŠã§ã¢æ±ãã®éœåãã«ã¡ã©ã®åŠçè² è·ãé«ããªã©ã®çç±ã§ãæšæºã®MicroPythonãã¡ãŒã ãŠã§ã¢ã§ã¯ã«ã¡ã©ã«å¯Ÿå¿ããŠããªããã«ã¡ã©å¶åŸ¡çšã«æé©åãããå°çšã®MicroPythonãã€ã³ã¹ããŒã«ããå¿ èŠãããã
1. ãã¡ãŒã ãŠã§ã¢ïŒ.binïŒã®ããŠã³ããŒã
以äžã®ãªã³ã¯ïŒFreenoveå ¬åŒGitHubïŒããã察象ã®ãã¡ãŒã ãŠã§ã¢ïŒ.bin ãã¡ã€ã«ïŒãããŠã³ããŒãããŸããé©åœãªå Žæã«ä¿åãããäŸïŒ"C:\Espressif"ã«é 眮ããã
é åžå : Freenove GitHub (Camera_WebServer firmware)
ããŒãžå ã® esp32s3_camera_1.27.bin ãªã©ã®ãã¡ã€ã«ãããŠã³ããŒãããŠãã ããã
2. esptoolã®æºå
ã³ãã³ãããã³ãããéãã以äžã®ã³ãã³ãã§esptoolãã€ã³ã¹ããŒã«ãããPythonãã€ã³ã¹ããŒã«ãããŠããå¿ èŠããããæé 1)ã®ãã¡ã€ã«ã®ããå Žæã«ç§»åããã
pip install esptool
cd "C:\Espressif\"3. ãã©ãã·ã¥ã¡ã¢ãªã®æ¶å»ïŒã¯ãªãŒã³ã¢ããïŒ
å€ãèšå®ãå¥ç°å¢ã®ããŒã¿ãå®å šã«ã¯ãªã¢ããäžå ·åã鲿¢ããŸãã
esptool --chip esp32s3 --port COM1 erase_flash
(â» COM1 ã¯ãPCã®ããã€ã¹ãããŒãžã£ãŒçã§ç¢ºèªãããå®éã®ããŒãã®COMããŒãçªå·ã«æžãæããŠãã ãã)
4. MicroPython ãã¡ãŒã ãŠã§ã¢ã®æžã蟌ã¿
ã¯ãªã¢ãããã©ãã·ã¥ã«ãMicroPythonãæžã蟌ã¿ãŸãã
esptool --chip esp32s3 --port COM1 --baud 921600 write_flash -z 0x0 esp32s3_camera_1.27.bin
â» ããŒãžã§ã³å€æŽçã§ãã¡ã€ã«åãå€ãã£ãŠããå Žåã¯ãæ«å°Ÿã® .bin ãã¡ã€ã«åãå®éã«çšæãããã®ã«æžãæããŠãã ããã
â» COM1 ã¯ãPCã®ããã€ã¹ãããŒãžã£ãŒçã§ç¢ºèªãããå®éã®ããŒãã®COMããŒãçªå·ã«æžãæããŠãã ããã
5. åäœç¢ºèª
ã·ãªã¢ã«éä¿¡ãœããïŒThonnyãTera Termãªã©ïŒãèµ·åããããŒã¬ãŒã 115200 ã§æ¥ç¶ããŸããæ¥ç¶åŸã以äžã®ã³ãŒããå®è¡ããŠæž©åºŠã衚瀺ãããã°æåã§ãïŒ
import esp32
print(esp32.mcu_temperature(), "C")6. Pythonã®ããã°ã©ãã³ã°
éçºç°å¢ã®ThonnyãããŠã³ããŒãããŠããã°ã©ãã³ã°ãããThonnyã®äœ¿ãæ¹ã¯ãã¡ãã
MicroPythonããã°ã©ãã³ã°ã»ã¬ã€ãããã¯
ããŒãªã³ã°æ¹åŒ
Freenoveå
¬åŒGitHubã«ãã£ããµã³ãã«ã¯ä»¥äžãã³ãŒãã¯242è¡ãããé«é »åºŠã«ç»åãäœåºŠããªã¯ãšã¹ããã圢åŒãªã®ã§è² è·ãé«ããè§£å床ããã¬ãŒã ã¬ãŒãã®å¶éãåºããããããããã£ãŠã以äžã®äŸã§ã¯160x120ã«ããŠããã
https://github.com/Freenove/Freenove_ESP32_S3_WROOM_Board/blob/main/Python/Python_Codes/05.1_Camera_WebServer/picoweb_video.py
ãµãŒãã¢ãŒã¿ãä»ããã»ãããããïŒã«ã¡ã©ã®åãããµãŒãã¢ãŒã¿ãŒã§å¶åŸ¡ãªã©ãã§ããã
ãµãŒãã¢ãŒã¿ãŒã¯å¥éè³Œå ¥ããŠãããã
ãäœãæ°ããè¶£å³ãå§ãããããäžçã¢ãã®ã¹ãã«ã«ãªããã®ãããã ãããªæ¹ã«ããããããããã®ããé»åå·¥äœããšã3Dããªã³ã¿ãŒãã®çµã¿åãããæ¥åžžã®ã©ã€ãããã¯ã«ããªãããæå
ãåšçšã«ããªãããéããçãŸããããããŠæ¥œããã®ã§ç掻ã®è³ªãçäžããïŒ
以äžã«çè
ã®æé·ã®èšé²ããããŸããããã£ããã©ãããçäžãã£ãŠãŸãð€
以äžã«è©³çްãªè§£èª¬ãæžããããAIã«çžè«ããªãããèŠããæ¹ãèšæ¶ã«æ®ããšæãðAIã«çžè«ãããšãã®ãã£ããã«ã¯ãªããšæããäœããªããšããããèšèªåããã®ã¯é£ãããšæããå Žåã