🧠 Π§Π°ΡΡ‚ΡŒ 50: НСйроинтСрфСйс β€” ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Arduino силой мысли

ΠœΡ‹ создадим систСму, которая считываСт Π±ΠΈΠΎΡΠ»Π΅ΠΊΡ‚ричСскиС сигналы (ΠΌΡ‹ΡˆΡ†Ρ‹, Π°Π»ΡŒΡ„Π°-Ρ€ΠΈΡ‚ΠΌΡ‹ ΠΌΠΎΠ·Π³Π°) Ρ‡Π΅Ρ€Π΅Π· Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ Π²Ρ…ΠΎΠ΄Ρ‹ ΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ… Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹!

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ нСйроинтСрфСйс Π½Π° основС EMG (элСктромиография):

cpp

#include <avr/io.h>
#include <avr/interrupt.h>

#define EMG_PIN A0
#define FFT_SIZE 64

// Π‘ΡƒΡ„Π΅Ρ€ для сигнала
int16_t signalBuffer[FFT_SIZE];
uint8_t bufferIndex = 0;

// ДСтСкция ΠΌΡ‹ΡˆΠ΅Ρ‡Π½ΠΎΠΉ активности (Π°ΠΌΠΏΠ»ΠΈΡ‚ΡƒΠ΄Π°)
uint8_t detectMuscleActivity() {
    int32_t sum = 0;
    for (uint8_t i = 0; i < 10; i++) {
        int16_t val = analogRead(EMG_PIN) - 512;  // Π¦Π΅Π½Ρ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ
        sum += abs(val);
    }
    sum /= 10;
    
    // ΠŸΠΎΡ€ΠΎΠ³ΠΎΠ²Π°Ρ дСтСкция
    if (sum > 100) {
        return 1;  // ΠœΡ‹ΡˆΠ΅Ρ‡Π½Π°Ρ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π°
    }
    return 0;
}

// FFT для Π°Π½Π°Π»ΠΈΠ·Π° ΠΌΠΎΠ·Π³ΠΎΠ²Ρ‹Ρ… Π²ΠΎΠ»Π½ (Π°Π»ΡŒΡ„Π°-Ρ€ΠΈΡ‚ΠΌ)
void performFFT() {
    // БыстроС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π€ΡƒΡ€ΡŒΠ΅ (ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠ΅)
    // Для Π΄Π΅Ρ‚Π΅ΠΊΡ†ΠΈΠΈ Π°Π»ΡŒΡ„Π°-Ρ€ΠΈΡ‚ΠΌΠ° (8-12 Π“Ρ†)
    // ...
}

// ДСтСкция Π°Π»ΡŒΡ„Π°-Ρ€ΠΈΡ‚ΠΌΠ° (расслаблСниС)
uint8_t detectAlphaRhythm() {
    // НакапливаСм 64 сСмпла с частотой 256 Π“Ρ†
    if (bufferIndex < FFT_SIZE) {
        signalBuffer[bufferIndex++] = analogRead(EMG_PIN) - 512;
        return 0;
    }
    
    // ВыполняСм FFT ΠΈ провСряСм Π°Π»ΡŒΡ„Π°-Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½
    performFFT();
    bufferIndex = 0;
    
    // Если Π°Π»ΡŒΡ„Π°-Ρ€ΠΈΡ‚ΠΌ ΡΠΈΠ»ΡŒΠ½Ρ‹ΠΉ -> расслаблСниС
    return random(2);  // Π—Π°Π³Π»ΡƒΡˆΠΊΠ°
}

// НСйро-ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
enum NeuroCommand {
    NEUTRAL,
    MOVE_LEFT,
    MOVE_RIGHT,
    MOVE_FORWARD,
    FIRE
};

NeuroCommand decodeThoughts() {
    // ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ EMG ΠΈ Π°Π»ΡŒΡ„Π°-Ρ€ΠΈΡ‚ΠΌΠ°
    uint8_t muscle = detectMuscleActivity();
    uint8_t alpha = detectAlphaRhythm();
    
    if (muscle && alpha) {
        return FIRE;
    } else if (muscle) {
        return MOVE_FORWARD;
    } else if (alpha) {
        // ΠŸΠΎΠ²ΠΎΡ€ΠΎΡ‚ Π³ΠΎΠ»ΠΎΠ²Ρ‹ = Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π² сторону
        int16_t lr = analogRead(A1) - 512;
        if (lr > 100) return MOVE_RIGHT;
        if (lr < -100) return MOVE_LEFT;
        return NEUTRAL;
    }
    return NEUTRAL;
}

// Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
void executeNeuroCommand(NeuroCommand cmd) {
    switch (cmd) {
        case MOVE_LEFT:
            moveLeft();
            Serial.println("🧠 ΠœΡ‹ΡΠ»ΡŒ: Π’Π›Π•Π’Πž");
            break;
        case MOVE_RIGHT:
            moveRight();
            Serial.println("🧠 ΠœΡ‹ΡΠ»ΡŒ: Π’ΠŸΠ ΠΠ’Πž");
            break;
        case MOVE_FORWARD:
            moveForward();
            Serial.println("🧠 ΠœΡ‹ΡΠ»ΡŒ: Π’ΠŸΠ•Π Π•Π”");
            break;
        case FIRE:
            fireLaser();
            Serial.println("🧠 ΠœΡ‹ΡΠ»ΡŒ: ΠžΠ“ΠžΠΠ¬!");
            break;
        default:
            break;
    }
}

void setup() {
    Serial.begin(115200);
    Serial.println("НСйроинтСрфСйс ARDUINOHACKS Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½!");
    Serial.println("Π‘ΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΡŒΡ‚Π΅ΡΡŒ Π½Π° Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΈ...");
}

void loop() {
    NeuroCommand cmd = decodeThoughts();
    if (cmd != NEUTRAL) {
        executeNeuroCommand(cmd);
    }
    delay(50);  // Частота опроса 20 Π“Ρ†
}

Π’Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΡ‚ΡŒΡΡ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *