ESP32-S3-N16R8 mikrodenetleyicisi kullanarak 6 kanallı EMG sensörlerinden alınan verileri işleyen, 11 farklı el hareketini tanımlayan ve 6 servo motor ile robotik el kontrolü sağlayan kapsamlı bir sistem.
Bu proje, ESP32-S3-N16R8 mikrodenetleyicisi kullanarak 6 kanallı EMG sensörlerinden alınan verileri işleyen, 11 farklı el hareketini tanımlayan ve 6 servo motor ile robotik el kontrolü sağlayan kapsamlı bir sistemdir.
- ESP32-S3-N16R8 (16MB Flash, 8MB PSRAM)
- 6x EMG Sensörü (ADC pinlerine bağlı)
- 6x Servo Motor (5 parmak + baş parmak ekstra motor)
- 1x RGB LED (WS2812B veya uyumlu)
- Kanal 0: GPIO1
- Kanal 1: GPIO2
- Kanal 2: GPIO3
- Kanal 3: GPIO4
- Kanal 4: GPIO5
- Kanal 5: GPIO6
- Servo 0 (Baş parmak açma/kapama): GPIO12
- Servo 1 (Baş parmak rotasyon): GPIO13
- Servo 2 (İşaret parmağı): GPIO14
- Servo 3 (Orta parmak): GPIO15
- Servo 4 (Yüzük parmağı): GPIO16
- Servo 5 (Serçe parmak): GPIO17
- Data Pin: GPIO38
EMG sinyallerini filtrelemek için üç aşamalı filtre sistemi:
- Bandpass Filter (20-450 Hz): EMG frekans bandını izole eder
- Notch Filter (50 Hz): Elektrik şebekesi gürültüsünü filtreler
- Moving Average Filter: Sinyal yumuşatma
Kullanım:
MultiChannelEMGFilter emg_filter;
int raw_values[6]; // Ham ADC değerleri
float filtered[6]; // Filtrelenmiş değerler
emg_filter.processAllChannels(raw_values, filtered);Filtrelenmiş EMG sinyallerinden makine öğrenmesi özellikleri çıkarır:
- MAV (Mean Absolute Value): Ortalama mutlak değer
- RMS (Root Mean Square): Kök ortalama kare
- WL (Waveform Length): Dalga formu uzunluğu
- ZC (Zero Crossing): Sıfır geçişleri
Her kanal için 4 özellik = Toplam 24 özellik
Kullanım:
FeatureExtractor extractor;
extractor.addSample(filtered_emg); // Her örnekleme periyodunda
if(extractor.isWindowFull()) {
float features[24];
extractor.extractFeatures(features);
}Eğitim verilerini toplama ve SPIFFS'e kaydetme:
Kullanım:
DataCollector collector;
collector.begin();
collector.startCollection(gesture_id); // 0-10 arası
// ... özellikler çıkarılır ...
collector.addSample(features);
collector.stopCollection();6 servo motorun kontrolü ve hareket setleri:
Kullanım:
ServoController servos;
servos.begin();
servos.setGesture(gesture_id); // Hareket ID'sine göre otomatik kontrolTensorFlow Lite CNN model tanımı ve örnek model byte array'i.
Not: Varsayılan model örnek bir yapıdır. Gerçek kullanım için kendi eğittiğiniz modeli buraya eklemelisiniz.
Basitleştirilmiş TensorFlow Lite arayüzü.
Not: Gerçek TensorFlow Lite Micro implementasyonu için bu wrapper geliştirilmelidir.
Gerçek zamanlı hareket tanıma ve servo kontrolü.
Başlatma:
MODE INFERENCE
veya
M1
LED Durumu: Yeşil
İşleyiş:
- EMG sensörlerinden 1000 Hz ile veri okur
- Filtreleme uygular
- 200ms'lik pencereden özellik çıkarır
- CNN modeli ile hareket tahmini yapar
- %70 üzeri güvenle servo motorları kontrol eder
Eğitim verisi toplama.
Başlatma:
MODE TRAINING
veya
M2
LED Durumu: Turuncu (toplama yapılıyorsa kırmızı yanıp söner)
Komutlar:
LIST - Hareket listesini göster
COLLECT <0-10> - Belirtilen hareket için veri topla
STOP - Veri toplamayı durdur
CLEAR - Tüm verileri sil
INFO - SPIFFS bilgilerini göster
Örnek Kullanım:
MODE TRAINING
LIST
COLLECT 1 # Yumruk hareketi için veri topla
# Hareketi yapın, 500 örnek toplanacak
STOP
COLLECT 2 # Açık el için veri topla
STOP
INFO # Kaydedilen verileri kontrol et
Ham ve filtrelenmiş EMG sinyallerini seri port üzerinden izleme.
Başlatma:
MODE MONITORING
veya
M3
LED Durumu: Mavi
Çıktı Formatı:
RAW: 2048 2100 1950 2080 2000 2120 | FILTERED: 0.123 0.234 0.098 0.187 0.156 0.211
| ID | İngilizce | Türkçe | Açıklama |
|---|---|---|---|
| 0 | Rest | Dinlenme | Rahat, hafif açık el |
| 1 | Fist | Yumruk | Tüm parmaklar kapalı |
| 2 | Open Hand | Açık El | Tüm parmaklar tam açık |
| 3 | Pinch | Tutma | Baş parmak + işaret parmağı |
| 4 | Point | İşaret Parmağı | Sadece işaret parmağı açık |
| 5 | Victory | Zafer İşareti | İşaret + orta parmak açık |
| 6 | OK Sign | Tamam İşareti | Baş parmak + işaret parmağı halka |
| 7 | Thumbs Up | Başparmak Yukarı | Sadece baş parmak yukarı |
| 8 | Thumbs Down | Başparmak Aşağı | Sadece baş parmak aşağı |
| 9 | Wrist Flexion | Bilek Fleksiyon | Tüm parmaklar hafif kapalı |
| 10 | Wrist Extension | Bilek Ekstansiyon | Tüm parmaklar gergin açık |
TEST SERVO - Tüm servoları sırayla test et
DEMO - Tüm hareketleri sırayla göster
GESTURE <0-10> - Belirli bir hareketi ayarla
- ESP32-S3'e kodu yükleyin
- Seri monitörü açın (115200 baud)
- Training moduna geçin:
MODE TRAINING - Her hareket için veri toplayın:
COLLECT 0
# Dinlenme durumunda bekleyin (500 örnek)
STOP
COLLECT 1
# Yumruk yapın (500 örnek)
STOP
# ... Tüm hareketler için tekrarlayın (0-10)
- Verileri kontrol edin:
INFO - SPIFFS'ten CSV dosyalarını bilgisayarınıza indirin
model.h dosyasında örnek Python kodu bulunmaktadır. Kısaca:
# 1. Gerekli kütüphaneler
pip install tensorflow numpy pandas scikit-learn
# 2. Verileri yükle
# emg_data_rest.csv, emg_data_fist.csv, vb.
# 3. Model oluştur ve eğit
# CNN mimarisi: Conv1D -> MaxPool -> Conv1D -> GlobalAvgPool -> Dense -> Output
# 4. TFLite'a dönüştür
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
# 5. C array'e dönüştür
xxd -i model.tflite > model_array.h
# 6. model.h dosyasını güncelleyin- Eğitilmiş modelin byte array'ini
model.hdosyasındakiemg_gesture_modeldeğişkenine kopyalayın emg_gesture_model_lendeğerini güncelleyin- Kodu tekrar derleyin ve yükleyin
# 1. Projeyi klonlayın
git clone <repo-url>
cd esp32_s3_cnn
# 2. Bağımlılıkları yükleyin (otomatik)
pio lib install
# 3. Derleyin
pio run
# 4. Yükleyin
pio run --target upload
# 5. Seri monitörü açın
pio device monitor- ESP32 board desteğini yükleyin
- Gerekli kütüphaneleri yükleyin:
- ESP32Servo
- FastLED
- Tüm header dosyalarını projenize ekleyin
main.cpp'yi.inoolarak kaydedin- Derleyin ve yükleyin
- Monitoring moduna geçin:
MODE MONITORING - Kaslarınızı dinlenme durumunda tutun
- RAW değerlerinin ~2048 civarında olduğunu kontrol edin
- Gerekirse ADC referans voltajını ayarlayın
TEST SERVOkomutu ile servolarıtest edinservo_controller.hdosyasındaki açı değerlerini ayarlayın:MIN_ANGLEveMAX_ANGLE(0-180)OPEN_POSITIONveCLOSED_POSITION- Her hareket için özel açı değerleri
- Topraklama bağlantısını kontrol edin
- Elektrot yerleşimini optimize edin
- Filtre parametrelerini ayarlayın (
emg_filter.h)
- Daha fazla eğitim verisi toplayın (hareket başına en az 500 örnek)
- Model eğitimini tekrarlayın
- Özellik çıkarma parametrelerini ayarlayın
- Güven eşiğini düşürün (varsayılan: %70)
- Servo motor bağlantılarını kontrol edin
servo_controller.h'deki pin tanımlarını doğrulayın- Kalibrasyon yapın
- ESP32-S3'ün SPIFFS bölümünü kontrol edin
platformio.ini'de partition scheme ayarını kontrol edin- SPIFFS'i format edin:
CLEARkomutu
- Örnekleme Hızı: 1000 Hz (1ms)
- Özellik Penceresi: 200ms (200 örnek)
- İnference Hızı: 5 Hz (200ms periyot)
- Filtreleme: Gerçek zamanlı, IIR filtreler
- Bellek Kullanımı: ~50KB (model dahil değil)
- SPIFFS Kapasitesi: Hareket başına ~500 örnek
- Normal Çalışma: ~250mA @ 5V
- Servo Peak: +2A (6 motor aktif)
- Önerilen Güç Kaynağı: 5V 3A
Bu proje eğitim amaçlıdır. Katkıda bulunmak için pull request gönderin.
Sorularınız için:
- GitHub Issues
- E-posta: [proje e-postası]
- İlk sürüm
- 6 kanallı EMG okuma
- 11 hareket tanıma
- 3 çalışma modu
- Servo motor kontrolü
- RGB LED durum göstergesi
- SPIFFS veri saklama
Not: Bu sistem prototip aşamasındadır. Tıbbi kullanım için uygun değildir. Gerçek TensorFlow Lite implementasyonu ve doğru model eğitimi gerektirir.