
System Rozpoznawania Symboli przy użyciu ESP32
1. Płytka ESP 32-CAM x2
2. 2 diody LED (zielona, czerwona)
3. Płytka stykowa
4. Przewody
5. Karton
6. Taśma izolacyjna (lub dowolna inna)
Cel projektu
Celem projektu było stworzenie systemu rozpoznawania symboli, który wykorzystuje mikrokontrolery ESP32 do przechwytywania obrazu, przetwarzania go oraz analizy danych w celu identyfikacji kształtów. Projekt demonstruje możliwości integracji przetwarzania obrazu, komunikacji bezprzewodowej i analizy danych w prostym, ale funkcjonalnym prototypie.
Składniki projektu
Hardware:
- ESP32 z kamerką: Moduł odpowiedzialny za rejestrację obrazu i jego wstępne przetwarzanie.
- ESP32 (druga płytka): Moduł odpowiedzialny za analizę danych oraz sygnalizację wyników przy użyciu diod LED i kodu Morse’a.
- Pojemnik z kartonu: Zapewnia jednolite oświetlenie i odpowiednie warunki do wykonywania zdjęć.
- Diody LED: Wykorzystywane do wizualizacji wyników.
Software:
- MicroPython: Wykorzystany do programowania mikrokontrolerów ESP32.
- Flask: Lekki serwer obsługujący przesyłanie danych i dodatkowe przetwarzanie obrazu.
- Biblioteka Pillow: Używana na serwerze do binaryzacji obrazu.
Działanie projektu
1. Rejestracja obrazu:
- ESP32 z kamerką wykonuje zdjęcie symbolu umieszczonego w pojemniku z kartonu.
- Obraz jest przetwarzany na mikrokontrolerze do formatu w skali szarości o rozdzielczości 96x96 pikseli.
2. Przesyłanie i przetwarzanie danych:
- Zdjęcie jest przesyłane na serwer Flask, gdzie następuje dalsze przetwarzanie:
- Binaryzacja obrazu do macierzy 0 i 1.
- Zmniejszenie rozdzielczości dla uproszczenia analizy.
- Wynikowa macierz jest przesyłana do drugiego ESP32.
3. Analiza symbolu:
- Druga płytka ESP32 analizuje macierz przy użyciu prostych algorytmów, aby rozpoznać kształt symbolu.
4. Sygnalizacja wyników:
- Rozpoznany symbol jest wizualizowany za pomocą diod LED.
- Wynik jest dodatkowo przesyłany w kodzie Morse’a, umożliwiając wszechstronne odczytanie informacji.
Funkcjonalności
- Dwustopniowe przetwarzanie obrazu: Integracja przetwarzania na mikrokontrolerze i serwerze pozwala na efektywne wykorzystanie zasobów sprzętowych.
- Sygnalizacja wyników: Wykorzystanie diod LED i kodu Morse’a zapewnia wielokanałowe przedstawienie informacji.
- Elastyczność systemu: Projekt pozwala na łatwe wprowadzenie modyfikacji, takich jak zmiana algorytmów lub dodanie nowych funkcjonalności.
Możliwe rozszerzenia projektu
- Rozbudowa algorytmów analizy: Zastosowanie bardziej zaawansowanych metod rozpoznawania wzorców, np. uczenia maszynowego.
- Dodanie funkcji autonomicznych: Integracja czujników do automatycznego wykrywania i analizy obiektów.
- Zastosowanie w edukacji: Projekt jako narzędzie dydaktyczne do nauki podstaw IoT, przetwarzania obrazu i komunikacji.
Wnioski
System rozpoznawania symboli z ESP32 to przykład efektywnego wykorzystania prostych technologii do realizacji zaawansowanych funkcji. Dzięki minimalistycznemu podejściu projekt jest dostępny nawet dla początkujących, jednocześnie oferując potencjał do dalszego rozwoju i eksploracji.
import camera
import network
import time
import urequests
from machine import Pin
# Dane Wi-Fi i serwera
SSID = 'ae'
PASSWORD = 'Xavlegbmao'
SERVER_URL = "http://192.168.43.220:5000"
latara = Pin(4,Pin.OUT)
latara.value(0)
# Funkcja łącząca się z Wi-Fi
def connect_wifi():
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect(SSID, PASSWORD)
for _ in range(10):
if wifi.isconnected():
print("Connected to Wi-Fi.")
return wifi
time.sleep(1)
print("Failed to connect to Wi-Fi.")
return None
# Funkcja inicjalizująca kamerę
def initialize_camera():
try:
print('Initializing camera...')
camera.init(0, format=camera.JPEG)
camera.framesize(camera.FRAME_96X96)
camera.speffect(camera.EFFECT_BW)
print("Camera initialized.")
except Exception as e:
print("Camera initialization error:", e)
# Funkcja robienia zdjęcia
def capture_image():
try:
print('Capturing image...')
buffer = camera.capture()
if buffer:
print(f"Image captured, size: {len(buffer)} bytes")
else:
print("Failed to capture image.")
return buffer
except Exception as e:
print("Error capturing image:", e)
return None
# Funkcja zapisu zdjęcia
def save_image(buffer, filename="image.jpg"):
try:
with open(filename, "wb") as file:
file.write(buffer)
print(f"Image saved as {filename}")
except Exception as e:
print("Error saving image:", e)
# Funkcja wysyłająca zdjęcie na serwer
def send_image_to_server(buffer):
try:
print("Sending image to server...")
response = urequests.post(f"{SERVER_URL}/upload", data=buffer, headers={'Content-Type': 'image/jpeg'})
print(f"Server response: {response.status_code}, {response.text}")
except Exception as e:
print("Error sending image:", e)
# Funkcja główna
def main():
wifi = connect_wifi()
if not wifi:
return
initialize_camera()
while True:
# Robienie zdjęcia i przesyłanie na serwer
image_buffer = capture_image()
if image_buffer:
save_image(image_buffer)
send_image_to_server(image_buffer)
time.sleep(1)
if __name__ == "__main__":
main()