Përmbajtje:

Matja e pozicioneve të gishtërinjve në një violinë me ESP32: 6 hapa
Matja e pozicioneve të gishtërinjve në një violinë me ESP32: 6 hapa

Video: Matja e pozicioneve të gishtërinjve në një violinë me ESP32: 6 hapa

Video: Matja e pozicioneve të gishtërinjve në një violinë me ESP32: 6 hapa
Video: #gjesi: Si të bëhet vendosja e kateterit urinar? | T7 2024, Nëntor
Anonim
Matja e pozicioneve të gishtërinjve në një violinë me ESP32
Matja e pozicioneve të gishtërinjve në një violinë me ESP32
Matja e pozicioneve të gishtërinjve në një violinë me ESP32
Matja e pozicioneve të gishtërinjve në një violinë me ESP32

Si një violinist kam dashur gjithmonë një aplikacion ose mjet që mund të më tregojë pozicionin e gishtërinjve të mi në violinë shumë të saktë. Me këtë projekt u përpoqa ta ndërtoj këtë. Edhe pse ky është një prototip dhe ju ende mund të shtoni shumë veçori.

Unë gjithashtu u përpoqa të ndaj ESP32 dhe rPI dhe kështu bëra që ESP32 të dërgonte të dhëna pa tel në rPi. Kjo është ndoshta gjëja më e vështirë për këtë projekt.

Alsoshtë gjithashtu shumë e rëndësishme që në fund të këtij projekti asgjë të mos ruhet në kompjuterin tuaj, por është ose në rPI ose ESP32.

Hapi 1: Materialet dhe Mjetet

Materialet dhe Mjetet
Materialet dhe Mjetet

Para se të hyjmë në specifikat e ndërtimit të këtij projekti na duhen disa gjëra.

  1. 4x Softpot Linear: Potenciometra linearë për të matur pozicionin e një gishti (një violinë ka 4 tela)
  2. ESP32: Një modul ESP32 për të lexuar të dhënat nga vazot e buta lineare.
  3. një violinë 4/4: një violinë për të vendosur tenxhere të buta lineare në krye.
  4. një Raspberry Pi me një kartë SD: një pi mjedër e cila do të ruajë bazën e të dhënave dhe faqen tonë të internetit.
  5. Potenciometër 10k: një potenciometër për shkëlqimin e LCD
  6. Ekran LCD: një ekran LCD për t'u shfaqur adresuesve të IP të rPi
  7. Kompleti i saldimit: Për bashkimin e të gjithë elementëve së bashku
  8. Telat meshkuj me meshkuj dhe telat meshkuj me femra: Kabllo për lidhjen e të gjithë elementëve
  9. Kabllo mikro USB: Për fuqizimin e ESP32

Hapi 2: Lidhja e Softpots me ESP32

Lidhja e Softpots me ESP32
Lidhja e Softpots me ESP32

Para së gjithash ne duhet të lidhim vazot tona me esp32. Ne lidhim kunjat e majtë dhe të djathtë përkatësisht me 5V dhe GND. Ne e lidhim kunjin e mesëm me një kunj analog në ESP32. Ne gjithashtu duhet të lidhim kunjin e mesëm me një rezistencë prej 10k ohm dhe ta lidhim këtë me GND. Kjo është kështu që dalja jonë e softpots nuk kthen vlerë të rastësishme.

Pastaj e lidhim ESP32 me kabllon mikro usb në kompjuterin tonë në mënyrë që të ngarkojmë kodin në të. Ne do të përdorim Arduino IDE për programimin e ESP32. Por së pari ne duhet të instalojmë bërthamën Arduino për ESP32 në mënyrë që të mund ta ngarkojmë në të. Kjo mund të bëhet këtu.

Pastaj mund të fillojmë të shkruajmë kod.

Së pari ne duhet të caktojmë kunjat tanë me të cilët lidhëm kunjin tonë të mesëm të vazove të buta.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

pa shenjë gjatë një kohe;

softPotTime e gjatë e panënshkruar;

Pastaj ne mund të vendosim kunjat tona. Dhe ne duhet të fillojmë monitorin tonë serik dhe kohën tonë.

void setup () {

në kohë = milis ();

Serial.fillo (115200);

Serial.println ("Fillimi i programit");

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT); }

void getdata (byte pdata ) {

// Lexoni në vlerën ADC të tenxhere të butë

Atëherë ne duhet të lexojmë kunjat tona në mënyrë që të marrim të dhënat tona.

int softPotADC1 = analogRead (SOFT_POT_PIN1);

nt softPotADC2 = analogRead (SOFT_POT_PIN2);

int softPotADC3 = analogRead (SOFT_POT_PIN3);

int softPotADC4 = analogRead (SOFT_POT_PIN4);

Pastaj i vendosim vlerat në një listë në mënyrë që ta nxjerrim me lehtësi më vonë.

për (int i = 0; i <4; i ++) {

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

int softpot = Emrat ;

nëse (tenxhere e butë> 10) {

pdata [0] = i;

pdata [1] = tenxhere e butë;

pdata [2] = milis ();

} } }

}

Hapi 3: Lidhja ESP32 dhe RPI pa tel

Për lidhjen pa tel të ESP32 dhe RPI, ne do të përdorim një bibliotekë të quajtur websocket. Për të instaluar këtë bibliotekë, ne mund t'i marrim skedarët këtu. Ne do të duhet të ndryshojmë një kod në vetë skedarët në mënyrë që të përdorim këtë bibliotekë për ESP32.

Do të na duhet të ndryshojmë MD5.c dhe MD5.h.

  • MD5Init në MD5InitXXX
  • MD5Përditëso në MD5UpdateXXX
  • MD5Final në MD5FinalXXX

Ne gjithashtu do të na duhet të fshijmë linjat avr/io.h në skedarët sha1.

Pastaj mund ta shtojmë bibliotekën në Arduino IDE me skicë> përfshi bibliotekën> shtojmë bibliotekën. ZIP dhe më pas mund të zgjedhim bibliotekën tuaj në një skedar zip.

Pas kësaj ne mund të fillojmë të shkruajmë kodin tonë.

Së pari për ESP32:

Përfshirë bibliotekën tonë

#përfshi #përfshi

Caktimi i kunjave tanë përsëri.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

Caktimi i serverit tonë wifi

Serveri WiFiServer (80);

Fillimi i serverit tonë të websocket

WebSocketServer webSocketServer;

Caktimi i SSID -it tonë dhe fjalëkalimi i wifi -t tuaj

const char* ssid = "SSID -i juaj wifi";

const char* fjalëkalimi = "fjalëkalimi yt wifi";

void setup () {

Vendosja e monitorit tuaj serik

Serial.fillo (115200);

Vendosja e tenxhereve tuaja të buta

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT);

Fillimi i wifi -t tonë dhe lidhja me të

WiFi.filloni (ssid, fjalëkalim);

ndërsa (WiFi.status ()! = WL_CONNECTED) {

vonesa (1000);

Serial.println ("Lidhja me WiFi.."); }

Serial.println ("Lidhur me rrjetin WiFi");

Serial.println (WiFi.localIP ());

server.filloj (); vonesa (100); }

void getdata (char *pdata) {

Leximi i të dhënave tuaja

// Lexoni në vlerën ADC të tenxhere të butë

int softPotADC1 = analogRead (SOFT_POT_PIN1);

int softPotADC2 = analogRead (SOFT_POT_PIN2);

int softPotADC3 = analogRead (SOFT_POT_PIN3);

int softPotADC4 = analogRead (SOFT_POT_PIN4);

Vendosja e të dhënave në një listë dhe shndërrimi i tyre në heksadecimal.

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

}

lak void () {

Lidhja e klientit tuaj (rPI)

Klienti WiFiClient = server.available ();

nëse (klienti.lidhur ()) {

vonesa (10);

në qoftë se (webSocketServer.handshake (klient)) {

Serial.println ("Klienti i lidhur");

Dërgimi dhe marrja e të dhënave.

ndërsa (klienti.lidhur ()) {

të dhëna char [30];

të dhëna (të dhëna);

Serial.println (të dhëna);

webSocketServer.sendData (të dhëna);

vonesa (10); // Vonesa e nevojshme për marrjen e saktë të të dhënave}

Serial.println ("Klienti u shkëput");

vonesa (100); }

tjeter {

Serial.println ("shitsfuckedyo");

} } }

Pastaj për rPI në python:

Importimi i bibliotekave tona

importo websocketimport kohë

Caktimi i një variabeli globale i

i = 0

Vendosja e një mesazhi maksimal prej 200 që mund të marrim

nrOfMessages = 200

uebfaqe e klasës ():

def _init _ (vetja):

Fillimi i faqes sonë të internetit dhe lidhja e tij me ESP32

self.ws = websocket. WebSocket ()

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

Marrja e të dhënave tona

def punë (vetë):

self.ws.send ("mesazhi nr: 0")

rezultati = vetja.ws.recv () koha. gjumi (0.5) rezultati i kthimit

Mbyllja e websocket pasi keni marrë gjithçka

def mbyll (vetja):

vet.ws. mbyll ()

Hapi 4: Lidhni faqen tuaj të internetit dhe bazën e të dhënave

Sa i përket lidhjes së bazës së të dhënave dhe faqes sonë të internetit, para së gjithash do t'ju duhet të krijoni bazën e të dhënave tuaja në pi duke instaluar mariadb: sudo apt install mariadb.

Atëherë mund ta arrini duke bërë: sudo mariadb.

Atëherë do t'ju duhet gjithashtu të krijoni faqen tuaj të internetit. Ju mund ta bëni këtë si të doni, por duhet të përdorni Flask dhe duhet të keni një formë në HTML -në tuaj për ndalimin dhe fillimin e të dhënave tuaja.

Pastaj mund ta futni këtë kod për të lidhur bazën tuaj të të dhënave dhe faqen tuaj të internetit (si faqja juaj ashtu edhe baza e të dhënave duhet të jenë të dyja në pi tuaj, kjo mund të bëhet duke përdorur skedën e vendosjes në cilësimet e pycharm)

nga flaskext.mysql importoj MySQL

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

app.config ["MYSQL_DATABASE_DB"] = "emri juaj i bazës së të dhënave"

app.config ["MYSQL_DATABASE_USER"] = "përdoruesi juaj i bazës së të dhënave"

app.config ["MYSQL_DATABASE_PASSWORD"] = "fjalëkalimi juaj i bazës së të dhënave"

Funksioni për nxjerrjen e të dhënave nga baza jonë e të dhënave.

def get_data (sql, params = Asnjë):

conn = mysql.connect ()

kursori = kon.cursor ()

print ("marrja e të dhënave")

provo:

print (sql)

cursor.execute (sql, params)

përveç Përjashtimit si e:

shtyp (e)

kthehem False

rezultat = cursor.fetchall ()

të dhëna =

për rreshtin në rezultat:

të dhëna. shtojca (lista (rreshti))

kursori. mbyll ()

lidh. mbyll ()

kthejnë të dhënat

Funksioni për futjen e të dhënave në bazën tonë të të dhënave

def set_data (sql, params = Asnjë):

conn = mysql.connect ()

kursori = kon.cursor ()

provo:

log.debug (sql)

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

log.debug ("SQL uitgevoerd")

përveç Përjashtimit si e:

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

kthehem False

kursori. mbyll ()

lidh. mbyll ()

kthehu Vërtetë

Ne gjithashtu do të duhet të vendosim aplikacionin tonë në mënyrë që të mund të bëni gjëra të tjera gjatë regjistrimit.

klasa ThreadedTask (filetim. Thread):

def _init _ (vetja,):

Vendosja e fijes

filetim. Thread._ init _ (vetë)

Krijimi i një liste për mbajtjen e të gjitha të dhënave tuaja të marra

vetë.data_all =

def drejtuar (vetvetja):

koha. gjumi (5)

Importoni kodin tuaj python ku merrni të dhënat

importo receb_websocket

Merrni të dhënat tuaja

w = merrni_websocket. Webbocket ()

Shtoni të dhënat tuaja në listën tuaj dhe shtypni ato.

për i në rang (0, 200):

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

print (vet.data_all)

detyrë = ThreadedTask ()

Pastaj mund të bëni task.run () për të filluar Thread -in tuaj dhe për të filluar të merrni të dhëna.

Hapi 5: Lidhni gjithçka së bashku

Lidhni gjithçka së bashku
Lidhni gjithçka së bashku

Për të drejtuar uebfaqen tuaj nga Pi juaj duhet të përdorni një shërbim:

[Njësia] Përshkrimi = shembulli uWSGI për t'i shërbyer ndërfaqes në internet të projektit1

Pas = network.target

BindsTo = mysqld.service

Pas = mysqld.service

[Shërbimi]

Ndryshoni tek përdoruesi juaj

Përdoruesi = pi

Grupi = www-të dhënat

Këtu duhet të futni drejtorinë tuaj të skedarit tuaj Flask

WorkingDirectory =/home/pi/project1/web

Drejtoria e skedarit tuaj ini që mund të gjendet më vonë.

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

[Instalo]

WantedBy = multi-user.target

uwsgi-flask.ini që duhet të vendosni në drejtorinë e specifikuar në ExecStart më lart

[uwsgi] moduli = uebi: aplikacioni virtualenv =/home/pi/project1/env

master = procese të vërteta = 5

shtojca = python3

prizë = projekt1.sock chmod-fole = 660 vakum = e vërtetë

vdes në afat = i vërtetë

Tani mund t'i lexoni të dhënat tuaja dhe t'i shfaqni në faqen tuaj të internetit.

Hapi 6: Extra: Lidhja e ekranit LCD

Extra: Lidhja e ekranit LCD
Extra: Lidhja e ekranit LCD
Extra: Lidhja e ekranit LCD
Extra: Lidhja e ekranit LCD
Extra: Lidhja e ekranit LCD
Extra: Lidhja e ekranit LCD

Ne mund të lidhim një ekran LCD në mënyrë që të mund të tregojmë adresën IP të Pi tonë për faqen tonë të internetit.

importoni RPi. GPIO si kohë GPIOimport

komandat e importit

GPIO.cleanup ()

D0 = 22

D1 = 5

D2 = 6

D3 = 13

D4 = 19

D5 = 26

D6 = 20

D7 = 21

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

E = 24

RS = 23

Ekrani i klasës:

def _init _ (vetja):

GPIO.setmode (GPIO. BCM)

self.setup ()

#Funksioni i vendosur vetë.stuur_instructie (0x3f) #Display self.stuur_instructie (0x0c) #On + cursor self.stuur_instructie (0x01) @staticmethod def setup (): GPIO.setup (lista, GPIO. OUT) GPIO.setup (, RS], GPIO. OUT)

def stuur_instructie (vetë, byte):

GPIO.putput (E, GPIO. HIGHT)

GPIO.putput (RS, GPIO. LOW)

vet.caktoni_BPIO_bit (bajt)

koha. gjumi (0.005)

GPIO.putput (E, GPIO. LOW)

def stuur_teken (vet, char):

temp = ord (char)

GPIO.putput (E, GPIO. HIGHT)

GPIO.putput (RS, GPIO. HIGHT)

vet.caktoni_PPIO_bit (temp)

koha. gjumi (0.005)

GPIO.putput (E, GPIO. LOW)

def set_GPIO_bits (vet, bajt):

për i në rang (0, 8):

nëse (bajt & (2 ** i)) == 0:

GPIO.putput (lista , GPIO. LOW)

tjeter:

GPIO.putput (lista , GPIO. HIGHT)

def kryesore ():

s = Ekrani ()

teken = "Adresa IP lokale:"

për letrën në teken:

s.stuur_teken (letër)

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

print (teken2)

s.stuur_instructie (0xc0)

për shkronjën 2 në teken2:

s.stuur_teken (shkronja 2)

nëse _name_ == '_majt_': #Program duke filluar nga këtu

provo:

kryesore ()

përveç KeyboardIntruptrupt:

kaloj

Pastaj ne mund të krijojmë një shërbim për të filluar LCD-në gjatë fillimit.

Recommended: