Talaan ng mga Nilalaman:

Pagsukat sa Mga Posisyon ng Daliri sa isang Biyolin Sa ESP32: 6 na Hakbang
Pagsukat sa Mga Posisyon ng Daliri sa isang Biyolin Sa ESP32: 6 na Hakbang

Video: Pagsukat sa Mga Posisyon ng Daliri sa isang Biyolin Sa ESP32: 6 na Hakbang

Video: Pagsukat sa Mga Posisyon ng Daliri sa isang Biyolin Sa ESP32: 6 na Hakbang
Video: ESP32 Tutorial 9 - Using Push button to Toggle LED, Push ON, Push OFF -SunFounder ESP32 IoT kit 2024, Nobyembre
Anonim
Pagsukat sa Mga Posisyon ng Daliri sa isang violin Sa ESP32
Pagsukat sa Mga Posisyon ng Daliri sa isang violin Sa ESP32
Pagsukat sa Mga Posisyon ng Daliri sa isang violin Sa ESP32
Pagsukat sa Mga Posisyon ng Daliri sa isang violin Sa ESP32

Bilang isang manlalaro ng byolin palagi akong nagnanais ng isang app o tool na maaaring ipakita sa akin ang posisyon ng aking mga daliri sa biyolin na napaka tumpak. Sa proyektong ito sinubukan kong buuin ito. Bagaman ito ay isang prototype at maaari ka pa ring magdagdag ng maraming mga tampok.

Sinubukan ko ring paghiwalayin ang ESP32 at ang rPI at sa gayon ay ginawa ko ang ESP32 na magpadala ng data nang walang wireless sa rPi. Alin ang marahil ang pinakamahirap na bagay tungkol sa proyektong ito.

Napakahalaga din na sa pagtatapos ng proyektong ito ay walang nakaimbak sa iyong computer ngunit ito ay nasa rPI o ESP32.

Hakbang 1: Mga Materyales at Tool

Mga Kagamitan at Kasangkapan
Mga Kagamitan at Kasangkapan

Bago makuha ang mga detalye ng pagbuo ng proyektong ito kailangan namin ng ilang mga bagay.

  1. 4x Linear Softpot: Linear Potentiometers upang sukatin ang posisyon ng isang daliri (ang isang byolin ay may 4 na mga string)
  2. ESP32: Isang module na ESP32 upang mabasa ang data mula sa mga linear softpot.
  3. isang 4/4 byolin: isang violin upang ilagay ang mga linear softpot sa itaas.
  4. isang Raspberry Pi na may isang SD card: isang raspberry pi na mag-iimbak ng aming database at website.
  5. 10k potentiometer: isang potentiometer para sa ningning ng LCD
  6. LCD-screen: isang LCD screen upang ipakita sa ip addres ng rPi
  7. Kit ng Panghinang: Para sa paghihinang ng lahat ng mga elemento ng togheter
  8. Mga wires na male-to-male at male-to-female wires: Mga cable para sa pagkonekta ng lahat ng mga elemento
  9. Micro USB cable: Para sa pagpapatakbo ng ESP32

Hakbang 2: Pagkonekta sa mga Softpot sa ESP32

Pagkonekta ng mga Softpot sa ESP32
Pagkonekta ng mga Softpot sa ESP32

Una sa lahat kailangan namin upang ikonekta ang aming mga softpot sa esp32. Ikonekta namin ang kaliwa at kanang mga pin sa 5V at GND ayon sa pagkakabanggit. Ikonekta namin ang gitnang pin sa isang analog pin sa ESP32. Kailangan din naming ikonekta ang gitnang pin na may paglaban ng 10k ohm at ikonekta ito sa GND. Ito ay upang ang aming output ng mga softpot ay hindi magbalik ng random na halaga.

Pagkatapos ay ikonekta namin ang ESP32 gamit ang micro usb cable sa aming pc upang ma-upload namin ang code dito. Gagamitin namin ang Arduino IDE para sa pag-program ng ESP32. Ngunit kailangan muna naming i-install ang Arduino core para sa ESP32 upang ma-upload namin ito. Maaari itong magawa dito.

Pagkatapos ay maaari nating simulan ang pagsulat ng code.

Una kailangan naming italaga ang aming mga pin kung saan ikinonekta namin ang aming gitnang pin ng mga softpot.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

matagal na hindi naka-sign onTime;

unsigned mahabang softPotTime;

Pagkatapos ay maaari naming i-set up ang aming mga pin. At kailangan naming simulan ang aming serial monitor at ang aming oras.

walang bisa ang pag-setup () {

onTime = millis ();

Serial.begin (115200);

Serial.println ("Pagsisimula ng programa");

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT); }

void getdata (byte pdata ) {

// Basahin ang halaga ng ADC ng soft pot

Pagkatapos kailangan naming basahin ang aming mga pin upang matanggap namin ang aming data.

int softPotADC1 = analogRead (SOFT_POT_PIN1);

nt softPotADC2 = analogRead (SOFT_POT_PIN2);

int softPotADC3 = analogRead (SOFT_POT_PIN3);

int softPotADC4 = analogRead (SOFT_POT_PIN4);

Pagkatapos ay inilalagay namin ang mga halaga sa isang listahan upang madali namin itong ma-output sa paglaon.

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

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

int softpot = Mga Pangalan ;

kung (softpot> 10) {

pdata [0] = i;

pdata [1] = softpot;

pdata [2] = millis ();

} } }

}

Hakbang 3: Pagkonekta sa ESP32 at sa Wireless na RPI

Para sa pagkonekta sa ESP32 at RPI nang walang wireless, gagamit kami ng isang silid-aklatan na tinatawag na websocket. Upang mai-install ang library na ito, makukuha natin ang mga file dito. Kakailanganin naming baguhin ang ilang code sa mismong mga file upang magamit ang library na ito para sa ESP32.

Kakailanganin nating baguhin ang MD5.c at MD5.h.

  • MD5Init sa MD5InitXXX
  • MD5Update sa MD5UpdateXXX
  • MD5Final hanggang MD5FinalXXX

Kakailanganin din naming tanggalin ang mga linya ng avr / io.h sa mga sha1 file.

Pagkatapos ay maaari naming idagdag ang library sa aming Arduino IDE sa pamamagitan ng sketch> isama ang library> magdagdag ng. ZIP library at pagkatapos ay maaari naming piliin ang iyong library sa isang zip file.

Pagkatapos nito maaari naming simulang isulat ang aming code.

Una para sa ESP32:

Kasama ang aming library

# isama ang # isama

Pagtatalaga muli ng aming mga pin.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

Pagtatalaga ng aming wifi server

WiFiServer server (80);

Simula sa aming websocket server

WebSocketServer webSocketServer;

Ang pagtatalaga ng aming SSID at password ng iyong wifi

const char * ssid = "iyong wifi SSID";

const char * password = "iyong wifi password";

walang bisa ang pag-setup () {

Pagse-set up ng iyong serial monitor

Serial.begin (115200);

Pagse-set up ng iyong mga softpot

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT);

Simula ng aming wifi at kumokonekta dito

WiFi.begin (ssid, password);

habang (WiFi.status ()! = WL_CONNected) {

pagkaantala (1000);

Serial.println ("Kumokonekta sa WiFi.."); }

Serial.println ("Nakakonekta sa WiFi network");

Serial.println (WiFi.localIP ());

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

void getdata (char * pdata) {

Pagbasa ng iyong data

// Basahin ang halaga ng ADC ng soft pot

int softPotADC1 = analogRead (SOFT_POT_PIN1);

int softPotADC2 = analogRead (SOFT_POT_PIN2);

int softPotADC3 = analogRead (SOFT_POT_PIN3);

int softPotADC4 = analogRead (SOFT_POT_PIN4);

Ang paglalagay ng data sa isang listahan at i-convert ito sa hexadecimal.

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

}

void loop () {

Pagkonekta sa iyong kliyente (ang rPI)

WiFiClient client = server.available ();

kung (client.connected ()) {

antala (10);

kung (webSocketServer.handshake (client)) {

Serial.println ("Konektado sa kliyente");

Pagpapadala at pagtanggap ng data.

habang (client.connected ()) {

data ng char [30];

getdata (data);

Serial.println (data);

webSocketServer.sendData (data);

antala (10); // Kailangan ng pagkaantala para matanggap nang tama ang data}

Serial.println ("Nakakonekta ang kliyente");

pagkaantala (100); }

iba pa {

Serial.println ("shitsfuckedyo");

} } }

Pagkatapos para sa rPI sa sawa:

Pag-import ng aming mga aklatan

i-import ang oras ng websocketimport

Assasigning isang globale variabel i

ako = 0

Nagtatakda ng maximum na 200 mga mensahe na maaari naming matanggap

nrOfMessages = 200

klase Websocket ():

def _init _ (sarili):

Pinasimulan ang aming websocket at kinokonekta ito sa aming ESP32

self.ws = websocket. WebSocket ()

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

Tumatanggap ng aming data

trabaho sa def (sarili):

Magpadala ng sarili ("message nr: 0")

resulta = sarili.ws.recv () oras.sulog (0.5) resulta ng pagbabalik

Pagsara ng websocket pagkatapos matanggap ang lahat

def close (sarili):

sarili.ws.close ()

Hakbang 4: Pagkonekta sa Iyong Website at Database

Tulad ng para sa pagkonekta sa aming Database at website, una sa lahat kailangan mong likhain ang iyong database sa pi sa pamamagitan ng pag-install ng mariadb: sudo apt install mariadb.

Pagkatapos ay maaari mo itong ma-acces sa pamamagitan ng paggawa: sudo mariadb.

Pagkatapos kakailanganin mo ring likhain ang iyong website. Maaari mong gawin ito subalit nais mo, ngunit kailangan mong gumamit ng Flask at kailangan mong magkaroon ng isang form sa iyong HTML para sa pagtigil at pagsisimula ng iyong data.

Pagkatapos ay maaari mong ipasok ang code na ito upang ikonekta ang iyong database at ang iyong website (kapwa ang iyong website at database ay dapat na parehong nasa iyong pi, magagawa ito sa pamamagitan ng paggamit ng tab na paglawak sa mga setting ng pycharm)

mula sa flaskext.mysql import ang MySQL

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

app.config ["MYSQL_DATABASE_DB"] = "ang iyong pangalan sa database"

app.config ["MYSQL_DATABASE_USER"] = "iyong gumagamit ng database"

app.config ["MYSQL_DATABASE_PASSWORD"] = "iyong database ng password"

Pag-andar para sa pagkuha ng data mula sa aming database.

def get_data (sql, params = Wala):

Conn = MySQL.connect ()

cursor = conn.cursor ()

i-print ("pagkuha ng data")

subukan:

print (sql)

cursor. magpatupad (sql, params)

maliban sa Exception bilang e:

i-print (e)

ibalik ang Mali

resulta = cursor.fetchall ()

data =

para sa hilera sa resulta:

data.append (listahan (row))

cursor.close ()

conn.close ()

ibalik ang data

Pag-andar para sa pagpasok ng data sa aming database

def set_data (sql, params = Wala):

Conn = MySQL.connect ()

cursor = conn.cursor ()

subukan:

log.debug (sql)

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

log.debug ("SQL uitgevoerd")

maliban sa Exception bilang e:

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

ibalik ang Mali

cursor.close ()

conn.close ()

ibalik ang Totoo

Kakailanganin din naming i-thread ang aming application upang magawa mo ang ibang mga bagay habang nagre-record ka.

klase ThreadedTask (threading. Tread):

def _init _ (sarili,):

Pagse-set up ng thread

pag-thread. Thread._ init _ (sarili)

Lumilikha ng isang listahan para sa paghawak ng lahat ng iyong natanggap na data

self.data_all =

def run (sarili):

oras. tulog (5)

I-import ang iyong sariling code ng sawa kung saan mo natatanggap ang data

i-import ang accept_websocket

Tanggapin ang iyong data

w = accept_websocket. Websocket ()

Idagdag ang iyong data sa iyong listahan at i-print ito.

para sa saklaw ko (0, 200):

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

print (self.data_all)

gawain = ThreadedTask ()

Pagkatapos ay maaari mong gawin ang task.run () upang simulan ang iyong Thread at magsimulang makatanggap ng data.

Hakbang 5: Pagkonekta ng Lahat ng Magkasama

Pagkonekta ng Lahat ng Magkasama
Pagkonekta ng Lahat ng Magkasama

Para sa pagpapatakbo ng iyong website mula sa iyong Pi kailangan mong gumamit ng isang serbisyo:

[Unit] Paglalarawan = uWSGI halimbawa upang maghatid ng project1 web interface

Pagkatapos = network.target

BindsTo = mysqld.service

Pagkatapos ng = mysqld.service

[Serbisyo]

Baguhin sa iyong gumagamit

Gumagamit = pi

Pangkat = www-data

Narito kailangan mong ipasok ang iyong direktoryo ng iyong Flask file

WorkingDirectory = / home / pi / project1 / web

Direktoryo ng iyong file na ito na maaaring matagpuan sa paglaon.

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

[I-install]

WantedBy = multi-user.target

uwsgi-flask.ini na kailangan mong ilagay sa direktoryo na tinukoy mo sa ExecStart sa itaas

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

master = totoong proseso = 5

mga plugin = python3

socket = project1.sock chmod-socket = 660 vacuum = totoo

die-on-term = totoo

Maaari mo na ngayong basahin ang iyong data at ipakita ito sa iyong website.

Hakbang 6: Dagdag: Pagkonekta sa LCD Screen

Dagdag: Kumokonekta sa LCD Screen
Dagdag: Kumokonekta sa LCD Screen
Dagdag: Kumokonekta sa LCD Screen
Dagdag: Kumokonekta sa LCD Screen
Dagdag: Kumokonekta sa LCD Screen
Dagdag: Kumokonekta sa LCD Screen

Maaari naming ikonekta ang isang LCD screen upang maipakita namin ang ip-adress ng aming Pi para sa aming website.

i-import ang RPi. GPIO bilang oras ng GPIOimport

mag-import ng mga utos

GPIO.cleanup ()

D0 = 22

D1 = 5

D2 = 6

D3 = 13

D4 = 19

D5 = 26

D6 = 20

D7 = 21

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

E = 24

RS = 23

screen ng klase:

def _init _ (sarili):

GPIO.setmode (GPIO. BCM)

self.setup ()

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

def stuur_instructie (sarili, byte):

GPIO.output (E, GPIO. HIGH)

GPIO.output (RS, GPIO. LOW)

self.set_GPIO_bits (byte)

oras. tulog (0.005)

GPIO.output (E, GPIO. LOW)

def stuur_teken (sarili, char):

temp = ord (char)

GPIO.output (E, GPIO. HIGH)

GPIO.output (RS, GPIO. HIGH)

self.set_GPIO_bits (temp)

oras. tulog (0.005)

GPIO.output (E, GPIO. LOW)

def set_GPIO_bits (sarili, byte):

para sa saklaw ko (0, 8):

kung (byte & (2 ** i)) == 0:

GPIO.output (listahan , GPIO. LOW)

iba pa:

GPIO.output (listahan , GPIO. HIGH)

def main ():

s = Screen ()

teken = "Local IP address:"

para sa sulat sa teken:

s.stuur_teken (liham)

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

print (teken2)

s.stuur_instructie (0xc0)

para sa letra2 sa teken2:

s.stuur_teken (sulat2)

kung _name_ == '_main_': #Program na nagsisimula mula dito

subukan:

pangunahing ()

maliban sa KeyboardInterrupt:

pumasa

Pagkatapos ay makakagawa kami ng isang serbisyo upang simulan ang LCD sa pagsisimula.

Inirerekumendang: