Proiectul are scopul de a construi un multiplicator analogic de vectori si matrici.
Implementarea curenta realizeaza inmultirea dintre un vector 1×2 cu o matrice 2×2 in mod analogic, insa el poate fi extins.
Utilitatea proiectului se gaseste la o implementare pe scara mai larga, moment in care ar putea fi aplicat in diverse solutii de machine learning sau inteligenta artificiala, acest proiect fiind doar un demo care arata ca implementarea acestei idei este posibila.
Pentru a realiza inmultirea analogica voi folosi urmatoarele componente:
Functionalitate:
Lista de piese:
Datele se introduc de la tastatura: valorile tensiunilor (elemente vector) si valorile pentru digipots (elemente matrice).
Pentru a transforma datele din numere din intervalul 1-100 in valori pentru digipots (0-255) folosesc urmatoarea functie:
int val_to_step_digipot(int x) { float y = 0.0002 + (float) (x - 1) * 0.0098 / 99; float R = 1 / y; int val = (int) (R - 100) * 51 / 950; return val; }
Pentru a seta valorile in digipot folosesc functia care sa comunice prin I2C:
void setValue(int l, int value) // sends value 'value' to SPI device on CS digital out pin 'l' { digitalWrite(l, LOW); SPI.transfer(0); // send command byte SPI.transfer(value); // send value (0~255) digitalWrite(l, HIGH); }
La final, pentru a transforma rezultatul din curent in valoare numerica folosesc functia inversa celei de setare a valorii rezistentei:
int current_to_val(float y) { return (int) ((y - 0.0002) * 99 / 0.0098 + 1); }