Sisällysluettelo:

Sormien asentojen mittaaminen viululla ESP32: 6 askelta
Sormien asentojen mittaaminen viululla ESP32: 6 askelta

Video: Sormien asentojen mittaaminen viululla ESP32: 6 askelta

Video: Sormien asentojen mittaaminen viululla ESP32: 6 askelta
Video: Studia Generalia Totuus: Näkymätön totuus 2024, Marraskuu
Anonim
Sormien asentojen mittaaminen viululla ESP32: n avulla
Sormien asentojen mittaaminen viululla ESP32: n avulla
Sormien asentojen mittaaminen viululla ESP32: n avulla
Sormien asentojen mittaaminen viululla ESP32: n avulla

Viulunsoittajana olen aina halunnut sovelluksen tai työkalun, joka voisi näyttää minulle sormien sijainnin viululla erittäin tarkasti. Tällä projektilla yritin rakentaa tätä. Vaikka tämä on prototyyppi ja voit silti lisätä monia ominaisuuksia.

Yritin myös erottaa ESP32: n ja rPI: n, ja näin sain ESP32: n lähettämään tietoja langattomasti rPi: hen. Mikä on luultavasti vaikein asia tässä projektissa.

On myös erittäin tärkeää, että tämän projektin lopussa mitään ei tallenneta tietokoneellesi, vaan se on joko rPI: ssä tai ESP32: ssa.

Vaihe 1: Materiaalit ja työkalut

Materiaalit ja työkalut
Materiaalit ja työkalut

Ennen kuin ryhdymme tämän hankkeen rakentamisen erityispiirteisiin, tarvitsemme muutamia asioita.

  1. 4x lineaarinen pehmeä potti: Lineaariset potentiometrit sormen asennon mittaamiseen (viulussa on 4 kieltä)
  2. ESP32: ESP32 -moduuli, joka lukee tiedot lineaarisista softpoteista.
  3. 4/4 viulu: viulu lineaaristen pehmeiden kattiloiden asettamiseksi päälle.
  4. Raspberry Pi SD -kortilla: vadelma pi, joka tallentaa tietokantamme ja verkkosivustomme.
  5. 10k potentiometri: potentiometri LCD -näytön kirkkaudelle
  6. LCD-näyttö: LCD-näyttö, joka näkyy rPi: n IP-osoitteille
  7. Juotosarja: kaikkien elementtien juottamiseen yhdeksi
  8. Uros-urosjohdot ja uros-naarasjohdot: Kaapelit kaikkien elementtien liittämiseen
  9. Mikro -USB -kaapeli: ESP32: n virransyöttöön

Vaihe 2: Softpottien liittäminen ESP32 -laitteeseen

Softpottien liittäminen ESP32 -laitteeseen
Softpottien liittäminen ESP32 -laitteeseen

Ensinnäkin meidän on liitettävä softpottimme esp32: een. Liitämme vasen ja oikea nasta 5V ja GND. Yhdistämme keskitapin ESP32: n analogiseen nastaan. Meidän on myös kytkettävä keskitappi, jonka vastus on 10 k ohmia, ja liitä tämä GND: hen. Tämä johtuu siitä, että softpots -tuotoksemme ei palauta satunnaisarvoa.

Liitämme sitten ESP32 mikro -usb -kaapelilla tietokoneeseemme, jotta voimme ladata koodin siihen. Käytämme Arduino IDE: tä ESP32: n ohjelmointiin. Mutta ensin meidän on asennettava Arduino -ydin ESP32: lle, jotta voimme ladata siihen. Tämä voidaan tehdä täällä.

Sitten voimme alkaa kirjoittaa koodia.

Ensin meidän on osoitettava nastamme, joihin olemme liittäneet softpottien keskitapin.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

allekirjoittamaton pitkä aika;

allekirjoittamaton pitkä softPotTime;

Sitten voimme asettaa nastamme. Ja meidän on aloitettava sarjamonitorimme ja aikamme.

void setup () {

onTime = millis ();

Sarja.alku (115200);

Serial.println ("Ohjelman käynnistys");

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT); }

void getdata (tavu pdata ) {

// Lue pehmeän potin ADC -arvo

Sitten meidän on luettava nastamme, jotta voimme vastaanottaa tietomme.

int softPotADC1 = analoginen luku (SOFT_POT_PIN1);

nt softPotADC2 = analoginen luku (SOFT_POT_PIN2);

int softPotADC3 = analoginen luku (SOFT_POT_PIN3);

int softPotADC4 = analoginen luku (SOFT_POT_PIN4);

Sitten laitamme arvot luetteloon, jotta voimme helposti tulostaa sen myöhemmin.

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

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

int softpot = Nimet ;

jos (softpot> 10) {

pdata [0] = i;

pdata [1] = softpot;

pdata [2] = millis ();

} } }

}

Vaihe 3: ESP32: n ja RPI: n liittäminen langattomasti

ESP32: n ja RPI: n langattomaan yhdistämiseen käytämme websocket -nimistä kirjastoa. Tämän kirjaston asentamiseksi voimme hakea tiedostot täältä. Meidän on muutettava jotain koodia itse tiedostoissa voidaksemme käyttää tätä kirjastoa ESP32: lle.

Meidän on vaihdettava MD5.c ja MD5.h.

  • MD5Init - MD5InitXXX
  • MD5Päivitä MD5 -päivitykseksiXXX
  • MD5Final - MD5FinalXXX

Meidän on myös poistettava shar -tiedostojen avr/io.h -rivit.

Sitten voimme lisätä kirjaston Arduino IDE: hen luonnoksella> sisällyttää kirjastoon> lisätä. ZIP -kirjaston ja sitten voimme valita kirjastosi zip -tiedostona.

Sen jälkeen voimme aloittaa koodimme kirjoittamisen.

Ensimmäinen ESP32: lle:

Kirjastomme mukaan lukien

#Sisällytä #Sisällytä

Määritämme nastamme uudelleen.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

Määritämme wifi -palvelimemme

WiFi -palvelinpalvelin (80);

Websocket -palvelimen käynnistäminen

WebSocketServer webSocketServer;

Määritä wifi -verkkosi SSID ja salasana

const char* ssid = "wifi -SSID -tunnuksesi";

const char* password = "wifi -salasanasi";

void setup () {

Sarjamonitorin asentaminen

Sarja.alku (115200);

Softpottien asettaminen

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT);

Käynnistetään wifi ja muodostetaan yhteys siihen

WiFi.begin (ssid, salasana);

while (WiFi.status ()! = WL_CONNECTED) {

viive (1000);

Serial.println ("Yhdistäminen WiFi -verkkoon.."); }

Serial.println ("Yhdistetty WiFi -verkkoon");

Serial.println (WiFi.localIP ());

server.begin (); viive (100); }

void getdata (char *pdata) {

Tietojesi lukeminen

// Lue pehmeän potin ADC -arvo

int softPotADC1 = analoginen luku (SOFT_POT_PIN1);

int softPotADC2 = analoginen lukema (SOFT_POT_PIN2);

int softPotADC3 = analoginen luku (SOFT_POT_PIN3);

int softPotADC4 = analoginen luku (SOFT_POT_PIN4);

Tietojen sijoittaminen luetteloon ja niiden muuntaminen heksadesimaaliluvuksi.

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

}

void loop () {

Asiakkaan yhdistäminen (rPI)

WiFiClient -asiakas = server.available ();

jos (client.connected ()) {

viive (10);

if (webSocketServer.handshake (client)) {

Serial.println ("Asiakas kytketty");

Tietojen lähettäminen ja vastaanottaminen.

while (client.connected ()) {

char -tiedot [30];

getdata (data);

Serial.println (data);

webSocketServer.sendData (data);

viive (10); // Tietojen oikeaan vastaanottamiseen tarvitaan viive}

Serial.println ("Asiakas katkaistu");

viive (100); }

muu {

Serial.println ("shitsfuckedyo");

} } }

Sitten rPI pythonissa:

Kirjastojen tuonti

tuoda websocket tuonti aika

Globalen määrittäminen variabel i

i = 0

Asetamme enintään 200 viestiä, jotka voimme vastaanottaa

nrOfMessages = 200

luokan Websocket ():

def _init _ (itse):

Alustetaan verkkoliitäntä ja yhdistetään se ESP32 -laitteeseemme

self.ws = websocket. WebSocket ()

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

Tietojemme vastaanottaminen

def työ (itse):

self.ws.send ("viestin numero: 0")

result = self.ws.recv () time.sleep (0.5) palautustulos

Verkkopistokkeen sulkeminen saatuaan kaiken

def close (itse):

self.ws.close ()

Vaihe 4: Yhdistä verkkosivusto ja tietokanta

Mitä tulee tietokannan ja verkkosivuston yhdistämiseen, sinun on ensin luotava tietokanta pi: hen asentamalla mariadb: sudo apt install mariadb.

Sitten pääset siihen tekemällä: sudo mariadb.

Sitten sinun on myös luotava verkkosivustosi. Voit tehdä tämän haluamallasi tavalla, mutta sinun on käytettävä pulloa ja sinulla on oltava HTML -lomake tietojen pysäyttämiseksi ja käynnistämiseksi.

Sitten voit lisätä tämän koodin yhdistämään tietokantasi ja verkkosivustosi (sekä verkkosivustosi että tietokannan on oltava pi: ssäsi, tämä voidaan tehdä käyttämällä pycharmin asetusten käyttöönotto -välilehteä)

osoitteesta flaskext.mysql Tuo MySQL

app.config ["MYSQL_DATABASE_HOST"] = "paikallinen isäntä"

app.config ["MYSQL_DATABASE_DB"] = "tietokannasi nimi"

app.config ["MYSQL_DATABASE_USER"] = "tietokannasi käyttäjä"

app.config ["MYSQL_DATABASE_PASSWORD"] = "tietokantasi salasana"

Toiminto tietojen poistamiseksi tietokannastamme.

def get_data (sql, params = Ei mitään):

conn = mysql.connect ()

kohdistin = jatko -osoitin ()

tulosta ("tietojen saaminen")

yrittää:

tulosta (sql)

cursor.execute (sql, params)

paitsi poikkeus, kuten e:

tulosta (e)

palauta Väärä

result = cursor.fetchall ()

data =

riville tuloksessa:

data.append (lista (rivi))

cursor.close ()

conn.close ()

palauttaa tiedot

Toiminto tietojen lisäämiseksi tietokantaamme

def set_data (sql, params = Ei mitään):

conn = mysql.connect ()

kohdistin = jatko -osoitin ()

yrittää:

log.debug (sql)

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

log.debug ("SQL uitgevoerd")

paitsi poikkeus, kuten e:

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

palauta Väärä

cursor.close ()

conn.close ()

palaa tosi

Meidän on myös langatettava sovelluksemme, jotta voit tehdä muita asioita tallennuksen aikana.

luokka ThreadedTask (threading. Thread):

def _init _ (itse,):

Langan määrittäminen

säie._ init _ (itse)

Luodaan luettelo kaikkien vastaanotettujen tietojen säilyttämiseksi

self.data_all =

def run (itse):

aika.unen (5)

Tuo oma python -koodisi sinne, missä vastaanotat tiedot

tuo vastaanotto_websocket

Vastaanota tietosi

w = Receive_websocket. Websocket ()

Liitä tiedot luetteloon ja tulosta ne.

i alueella (0, 200):

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

tulosta (self.data_all)

task = ThreadedTask ()

Sitten voit tehdä task.run () käynnistääksesi viestiketjun ja aloittaaksesi tietojen vastaanottamisen.

Vaihe 5: Yhdistä kaikki toisiinsa

Kaikkien yhdistäminen
Kaikkien yhdistäminen

Jos haluat käyttää verkkosivustoasi Pi -laitteestasi, sinun on käytettävä palvelua:

[Yksikkö] Kuvaus = uWSGI -ilmentymä palvelemaan projektin1 verkkokäyttöliittymää

Jälkeen = network.target

BindsTo = mysqld.service

Jälkeen = mysqld.service

[Palvelu]

Vaihda käyttäjäksi

Käyttäjä = pi

Ryhmä = www-data

Täällä sinun on syötettävä Flask -tiedostosi hakemisto

WorkingDirectory =/home/pi/project1/web

Ini -tiedoston hakemisto, joka löytyy myöhemmin.

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

[Asentaa]

WantedBy = usean käyttäjän.target

uwsgi-flask.ini, joka sinun on sijoitettava hakemistoon, jonka määritit yllä ExecStartissa

[uwsgi] module = web: app virtualenv =/home/pi/project1/env

master = todelliset prosessit = 5

laajennukset = python3

pistorasia = projekti1.sock chmod-socket = 660 tyhjiö = totta

die-on-term = totta

Nyt voit lukea tietosi ja näyttää ne verkkosivustollasi.

Vaihe 6: Lisätoiminto: LCD -näytön liittäminen

Lisä: LCD -näytön liittäminen
Lisä: LCD -näytön liittäminen
Lisä: LCD -näytön liittäminen
Lisä: LCD -näytön liittäminen
Lisä: LCD -näytön liittäminen
Lisä: LCD -näytön liittäminen

Voimme liittää nestekidenäytön, jotta voimme näyttää Pi: n IP-osoitteen verkkosivustollemme.

tuoda RPi. GPIO GPIO -tuontiaikaksi

tuonti komentoja

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

luokan näyttö:

def _init _ (itse):

GPIO.setmode (GPIO. BCM)

self.setup ()

#Function set self.stuur_instructie (0x3f) #Display self.stuur_instructie (0x0c) #On + kohdistin self.stuur_instructie (0x01) @staticmethod def setup (): GPIO.setup (list, GPIO. OUT) GPIO.setup ([E, RS], GPIO. OUT)

def stuur_instructie (itse, tavu):

GPIO -lähtö (E, GPIO. HIGH)

GPIO -lähtö (RS, GPIO. LOW)

self.set_GPIO_bits (tavu)

aika. unta (0,005)

GPIO -lähtö (E, GPIO. LOW)

def stuur_teken (self, char):

lämpötila = ord (char)

GPIO -lähtö (E, GPIO. HIGH)

GPIO -lähtö (RS, GPIO. HIGH)

self.set_GPIO_bits (lämpötila)

aika. unta (0,005)

GPIO -lähtö (E, GPIO. LOW)

def set_GPIO_bits (itse, tavu):

i alueella (0, 8):

jos (tavu & (2 ** i)) == 0:

GPIO. output (luettelo , GPIO. LOW)

muu:

GPIO. lähtö (luettelo , GPIO. HIGH)

def main ():

s = Näyttö ()

teken = "Paikallinen IP -osoite:"

kirjain tekenissä:

s.stuur_teken (kirje)

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

tulosta (teken2)

s.stuur_instructie (0xc0)

kirjain2 teken2:

s.stuur_teken (letter2)

jos _nimi_ == '_main_': #ohjelma alkaa tästä

yrittää:

pää ()

paitsi näppäimistö Keskeytys:

kulkea

Sitten voimme luoda palvelun LCD-näytön käynnistämiseksi käynnistyksen yhteydessä.

Suositeltava: