Sadržaj:

Mjerenje položaja prstiju na violini s ESP32: 6 koraka
Mjerenje položaja prstiju na violini s ESP32: 6 koraka

Video: Mjerenje položaja prstiju na violini s ESP32: 6 koraka

Video: Mjerenje položaja prstiju na violini s ESP32: 6 koraka
Video: «Банши Инишерина» - о чём фильм и почему его нужно посмотреть. 2024, Studeni
Anonim
Mjerenje položaja prstiju na violini s ESP32
Mjerenje položaja prstiju na violini s ESP32
Mjerenje položaja prstiju na violini s ESP32
Mjerenje položaja prstiju na violini s ESP32

Kao violinist uvijek sam želio aplikaciju ili alat koji bi mi mogao pokazati položaj prstiju na violini vrlo precizan. Ovim projektom sam to pokušao izgraditi. Iako je ovo prototip i mogli biste dodati mnoge značajke.

Također sam pokušao odvojiti ESP32 i rPI i tako sam učinio da ESP32 šalje podatke bežično na rPi. Što je vjerojatno najteže u ovom projektu.

Također je vrlo važno da se na kraju ovog projekta ništa ne pohrani na vaše računalo, već se nalazi na rPI ili ESP32.

Korak 1: Materijali i alati

Materijali i alati
Materijali i alati

Prije nego što uđemo u specifičnosti izgradnje ovog projekta potrebno nam je nekoliko stvari.

  1. 4x linearni softpot: linearni potenciometri za mjerenje položaja prsta (violina ima 4 žice)
  2. ESP32: ESP32 modul za čitanje podataka s linearnih softpotova.
  3. violina 4/4: violina za postavljanje linearnih softpotova na vrh.
  4. Raspberry Pi sa SD karticom: malina pi koja će pohraniti našu bazu podataka i web stranicu.
  5. 10k potenciometar: potenciometar za osvjetljenje LCD -a
  6. LCD zaslon: LCD zaslon za prikaz IP adresama rPi-ja
  7. Komplet za lemljenje: Za lemljenje svih elemenata zajedno
  8. Žice muško-muško i žice muško-žensko: kabeli za povezivanje svih elemenata
  9. Mikro USB kabel: Za napajanje ESP32

Korak 2: Spajanje softpotova na ESP32

Spajanje softpotova na ESP32
Spajanje softpotova na ESP32

Prije svega moramo povezati naše softpotove s esp32. Priključujemo lijevi i desni pinove na 5V i GND. Srednji pin povezujemo s analognim pinom na ESP32. Također moramo spojiti srednji pin otpora 10k ohma i spojiti ga na GND. To je tako da naš izlaz softpotova ne vraća slučajnu vrijednost.

Zatim povezujemo ESP32 mikro USB kabelom s računalom kako bismo na njega prenijeli kôd. Za programiranje ESP32 koristit ćemo Arduino IDE. No prvo moramo instalirati Arduino jezgru za ESP32 kako bismo je mogli učitati. To se može učiniti ovdje.

Tada možemo početi pisati kod.

Prvo moramo dodijeliti naše igle na koje smo spojili naš srednji pin softpotova.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

unsigned long onTime;

unsigned long softPotTime;

Tada možemo postaviti svoje igle. Moramo pokrenuti naš serijski monitor i svoje vrijeme.

void setup () {

onTime = millis ();

Serial.begin (115200);

Serial.println ("Pokretanje programa");

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, ULAZ);

pinMode (SOFT_POT_PIN4, INPUT); }

void getdata (byte pdata ) {

// Očitajte ADC vrijednost soft potiska

Zatim moramo pročitati svoje pinove kako bismo mogli primiti svoje podatke.

int softPotADC1 = analogno čitanje (SOFT_POT_PIN1);

nt softPotADC2 = analogno čitanje (SOFT_POT_PIN2);

int softPotADC3 = analogno čitanje (SOFT_POT_PIN3);

int softPotADC4 = analogno čitanje (SOFT_POT_PIN4);

Zatim stavljamo vrijednosti na popis kako bismo ih kasnije mogli lako ispisati.

za (int i = 0; i <4; i ++) {

int Nazivi = {softPotADC1, softPotADC2, softPotADC3, softPotADC4};

int softpot = Imena ;

if (softpot> 10) {

pdata [0] = i;

pdata [1] = softpot;

pdata [2] = millis ();

} } }

}

Korak 3: Bežično povežite ESP32 i RPI

Za bežično povezivanje ESP32 i RPI koristit ćemo biblioteku koja se zove websocket. Da bismo instalirali ovu biblioteku, datoteke možemo nabaviti ovdje. Morat ćemo promijeniti neki kôd u samim datotekama da bismo mogli koristiti ovu knjižnicu za ESP32.

Morat ćemo promijeniti MD5.c i MD5.h.

  • MD5Init do MD5InitXXX
  • MD5Update u MD5UpdateXXX
  • MD5Final do MD5FinalXXX

Također ćemo morati izbrisati avr/io.h retke u sha1 datotekama.

Zatim možemo dodati knjižnicu u naš Arduino IDE skicom> uključiti knjižnicu> dodati. ZIP knjižnicu i tada možemo odabrati vašu knjižnicu u zip datoteci.

Nakon toga možemo početi pisati naš kôd.

Prvo za ESP32:

Uključujući i našu knjižnicu

#include #include

Ponovno dodjeljujemo naše igle.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

Dodjeljivanje našeg WiFi servera

WiFiServer poslužitelj (80);

Pokretanje našeg websocket poslužitelja

WebSocketServer webSocketServer;

Dodjeljivanje našeg SSID -a i lozinke za vaš WiFi

const char* ssid = "vaš Wi -Fi SSID";

const char* password = "vaša lozinka za WiFi";

void setup () {

Postavljanje serijskog monitora

Serial.begin (115200);

Postavljanje softpotova

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT);

Pokretanje našeg WiFi -ja i povezivanje s njim

WiFi.započni (ssid, lozinka);

while (WiFi.status ()! = WL_CONNECTED) {{100} {101}

kašnjenje (1000);

Serial.println ("Povezivanje na WiFi.."); }

Serial.println ("Povezano s WiFi mrežom");

Serial.println (WiFi.localIP ());

server.begin (); kašnjenje (100); }

void getdata (char *pdata) {{100} {101}

Čitanje vaših podataka

// Očitajte ADC vrijednost soft potiska

int softPotADC1 = analogno čitanje (SOFT_POT_PIN1);

int softPotADC2 = analogno čitanje (SOFT_POT_PIN2);

int softPotADC3 = analogno čitanje (SOFT_POT_PIN3);

int softPotADC4 = analogno čitanje (SOFT_POT_PIN4);

Postavljanje podataka na popis i njihovo pretvaranje u heksadecimalno.

sprintf (pdata, " %x, %x, %x, %x, %x", softPotADC1, softPotADC2, softPotADC3, softPotADC4, millis ());

}

void loop () {{100} {101}

Povezivanje vašeg klijenta (rPI)

WiFiClient klijent = server.available ();

if (client.connected ()) {

kašnjenje (10);

if (webSocketServer.handshake (client)) {

Serial.println ("Klijent povezan");

Slanje i primanje podataka.

while (client.connected ()) {

char podaci [30];

getdata (podaci);

Serial.println (podaci);

webSocketServer.sendData (podaci);

kašnjenje (10); // Kašnjenje potrebno za ispravan prijem podataka}

Serial.println ("Klijent je isključen");

kašnjenje (100); }

drugo {

Serial.println ("shitsfuckedyo");

} } }

Zatim za rPI u pythonu:

Uvoz naših knjižnica

uvoz websocketimport vrijeme

Dodjeljivanje globale varijable i

i = 0

Postavljanje maksimalno 200 poruka koje možemo primiti

nrOsMessages = 200

klasa Websocket ():

def _init _ (samo):

Pokretanje našeg web priključka i njegovo povezivanje s našim ESP32

self.ws = websocket. WebSocket ()

self.ws.connect ("ws: //172.30.248.48/")

Primanje naših podataka

def work (self):

self.ws.send ("br. poruke: 0")

rezultat = self.ws.recv () vrijeme.spavanje (0.5) povratni rezultat

Zatvaranje web -utičnice nakon primitka svega

def close (self):

self.ws.close ()

Korak 4: Povezivanje vaše web stranice i baze podataka

Što se tiče povezivanja naše baze podataka i web stranice, prvo ćete morati stvoriti svoju bazu podataka na pi instaliranjem mariadb: sudo apt install mariadb.

Tada mu možete pristupiti na sljedeći način: sudo mariadb.

Tada ćete također morati izraditi svoju web stranicu. To možete učiniti kako god želite, ali morate koristiti Flask i morate imati obrazac u HTML -u za zaustavljanje i pokretanje podataka.

Zatim možete umetnuti ovaj kôd za povezivanje vaše baze podataka i vaše web stranice (i vaša web stranica i baza podataka moraju biti na vašem pi, to se može učiniti pomoću kartice za implementaciju u postavkama pycharma)

s flaskext.mysql uvezite MySQL

app.config ["MYSQL_DATABASE_HOST"] = "localhost"

app.config ["MYSQL_DATABASE_DB"] = "naziv vaše baze podataka"

app.config ["MYSQL_DATABASE_USER"] = "vaš korisnik baze podataka"

app.config ["MYSQL_DATABASE_PASSWORD"] = "lozinka vaše baze podataka"

Funkcija za izvlačenje podataka iz naše baze podataka.

def get_data (sql, params = None):

conn = mysql.connect ()

cursor = conn.cursor ()

print ("dobivanje podataka")

probati:

ispis (sql)

cursor.execute (sql, params)

osim iznimke kao e:

ispis (e)

return False

rezultat = pokazivač.fetchall ()

podaci =

za red u rezultatu:

data.append (popis (redak))

cursor.close ()

conn.close ()

vratiti podatke

Funkcija za umetanje podataka u našu bazu podataka

def set_data (sql, params = None):

conn = mysql.connect ()

cursor = conn.cursor ()

probati:

log.debug (sql)

cursor.execute (sql, params) conn.commit ()

log.debug ("SQL uitgevoerd")

osim iznimke kao e:

log.exception ("Fout bij uitvoeren van sql: {0})". format (e))

return False

cursor.close ()

conn.close ()

vrati True

Također ćemo morati provući našu aplikaciju kako biste mogli raditi druge stvari dok snimate.

klase ThreadedTask (threading. Thread):

def _init _ (sebe,):

Postavljanje niti

threading. Thread._ init _ (samo)

Izrada popisa za čuvanje svih vaših primljenih podataka

self.data_all =

def run (self):

vrijeme.spavanje (5)

Uvezite vlastiti python kôd gdje primate podatke

uvoz receive_websocket

Primite svoje podatke

w = primati_websocket. Websocket ()

Dodajte svoje podatke na popis i ispišite ih.

za i u rasponu (0, 200):

self.data_all.append (w.work (). split (","))

ispis (self.data_all)

task = ThreadedTask ()

Zatim možete učiniti task.run () da pokrenete svoju nit i počnete primati podatke.

Korak 5: Povežite sve zajedno

Povezujući sve zajedno
Povezujući sve zajedno

Za pokretanje svoje web stranice s vašeg Pi morate koristiti uslugu:

[Jedinica] Opis = uWSGI instanca za posluživanje web1 sučelja project1

Nakon = mreža.cilj

BindsTo = mysqld.service

Nakon = mysqld.service

[Servis]

Promijenite na svog korisnika

Korisnik = pi

Grupa = www-podaci

Ovdje morate unijeti svoj direktorij svoje datoteke Flask

WorkingDirectory =/home/pi/project1/web

Direktorij vaše ini datoteke koji se može pronaći kasnije.

ExecStart =/usr/bin/uwsgi --ini /home/pi/project1/conf/uwsgi-flask.ini

[Instalirati]

Traži se = višekorisnički cilj

uwsgi-flask.ini koji morate postaviti u direktorij koji ste naveli u ExecStart-u gore

[uwsgi] modul = web: aplikacija virtualenv =/home/pi/project1/env

master = pravi procesi = 5

dodaci = python3

socket = project1.sock chmod-socket = 660 vakuum = istina

die-on-term = istina

Sada možete pročitati svoje podatke i prikazati ih na svojoj web stranici.

Korak 6: Dodatno: Povezivanje LCD zaslona

Dodatno: Povezivanje LCD zaslona
Dodatno: Povezivanje LCD zaslona
Dodatno: Povezivanje LCD zaslona
Dodatno: Povezivanje LCD zaslona
Dodatno: Povezivanje LCD zaslona
Dodatno: Povezivanje LCD zaslona

Možemo spojiti LCD zaslon kako bismo mogli prikazati ip-adresu našeg Pi za našu web stranicu.

uvoziti RPi. GPIO kao GPIOuvozno vrijeme

naredbe za uvoz

GPIO.cleanup ()

D0 = 22

D1 = 5

D2 = 6

D3 = 13

D4 = 19

D5 = 26

D6 = 20

D7 = 21

popis = [22, 5, 6, 13, 19, 26, 20, 21]

E = 24

RS = 23

razredni zaslon:

def _init _ (samo):

Način rada GPIO.set (GPIO. BCM)

self.setup ()

#Skup funkcija self.stuur_instructie (0x3f) #Display self.stuur_instructie (0x0c) #On + cursor self.stuur_instructie (0x01) @staticmethod def setup (): GPIO.setup (popis, GPIO. OUT) GPIO.setup ([E, RS], GPIO. OUT)

def stuur_instructie (self, byte):

GPIO.izlaz (E, GPIO. HIGH)

GPIO.izlaz (RS, GPIO. LOW)

self.set_GPIO_bits (bajt)

vrijeme.spavanje (0,005)

GPIO.izlaz (E, GPIO. LOW)

def stuur_teken (self, char):

temp = ord (char)

GPIO.izlaz (E, GPIO. HIGH)

GPIO.izlaz (RS, GPIO. HIGH)

self.set_GPIO_bits (temp)

vrijeme.spavanje (0,005)

GPIO.izlaz (E, GPIO. LOW)

def set_GPIO_bits (self, byte):

za i u rasponu (0, 8):

if (bajt & (2 ** i)) == 0:

GPIO.izlaz (popis , GPIO. LOW)

drugo:

GPIO.izlaz (popis , GPIO. HIGH)

def main ():

s = Zaslon ()

teken = "Lokalna IP adresa:"

za pismo u tekenu:

s.stuur_teken (slovo)

teken2 = commands.getoutput ("ip addr show wlan0 | grep -Po 'inet / K [d.]+'")

ispis (teken2)

s.stuur_instructie (0xc0)

za slovo 2 u teken2:

s.stuur_teken (slovo 2)

if _name_ == '_main_': #Program počinje odavde

probati:

glavni()

osim KeyboardInterrupt:

proći

Tada možemo stvoriti uslugu za pokretanje LCD-a pri pokretanju.

Preporučeni: