Πίνακας περιεχομένων:

Μέτρηση θέσεων δακτύλων σε βιολί με ESP32: 6 βήματα
Μέτρηση θέσεων δακτύλων σε βιολί με ESP32: 6 βήματα

Βίντεο: Μέτρηση θέσεων δακτύλων σε βιολί με ESP32: 6 βήματα

Βίντεο: Μέτρηση θέσεων δακτύλων σε βιολί με ESP32: 6 βήματα
Βίντεο: Ερωτόκριτος (εισαγωγή) - Παραδοσιακό Κρήτης (Violin cover with score) 2024, Ιούλιος
Anonim
Μέτρηση θέσεων δακτύλων σε βιολί με ESP32
Μέτρηση θέσεων δακτύλων σε βιολί με ESP32
Μέτρηση θέσεων δακτύλων σε βιολί με ESP32
Μέτρηση θέσεων δακτύλων σε βιολί με ESP32

Ως βιολί, ήθελα πάντα μια εφαρμογή ή ένα εργαλείο που θα μπορούσε να μου δείξει τη θέση των δακτύλων μου στο βιολί με μεγάλη ακρίβεια. Με αυτό το έργο προσπάθησα να το φτιάξω. Αν και αυτό είναι ένα πρωτότυπο και μπορείτε ακόμα να προσθέσετε πολλές δυνατότητες.

Προσπάθησα επίσης να διαχωρίσω το ESP32 και το rPI και έτσι έκανα το ESP32 να στέλνει δεδομένα ασύρματα στο rPi. Αυτό είναι ίσως το πιο δύσκολο πράγμα σε αυτό το έργο.

Είναι επίσης πολύ σημαντικό στο τέλος αυτού του έργου να μην αποθηκεύεται τίποτα στον υπολογιστή σας αλλά να είναι είτε στο rPI είτε στο ESP32.

Βήμα 1: Υλικά και εργαλεία

Υλικά και Εργαλεία
Υλικά και Εργαλεία

Πριν μπούμε στις ιδιαιτερότητες της κατασκευής αυτού του έργου χρειαζόμαστε μερικά πράγματα.

  1. 4x Linear Softpot: Γραμμικά ποτενσιόμετρα για τη μέτρηση της θέσης ενός δακτύλου (ένα βιολί έχει 4 χορδές)
  2. ESP32: Μια μονάδα ESP32 για την ανάγνωση των δεδομένων από τα γραμμικά softpots.
  3. ένα βιολί 4/4: ένα βιολί για να τοποθετήσετε τις γραμμικές μαλακές γλάστρες στην κορυφή.
  4. ένα Raspberry Pi με κάρτα SD: ένα raspberry pi που θα αποθηκεύσει τη βάση δεδομένων και τον ιστότοπό μας.
  5. Ποτενσιόμετρο 10k: ένα ποτενσιόμετρο για τη φωτεινότητα της οθόνης LCD
  6. Οθόνη LCD: μια οθόνη LCD που εμφανίζεται στα ip addres του rPi
  7. Σετ συγκόλλησης: Για συγκόλληση όλων των στοιχείων από κοινού
  8. Σύρματα από αρσενικό σε αρσενικό και σύρματα από αρσενικό σε θηλυκό: Καλώδια για τη σύνδεση όλων των στοιχείων
  9. Καλώδιο Micro USB: Για τροφοδοσία του ESP32

Βήμα 2: Σύνδεση των Softpots στο ESP32

Σύνδεση των Softpots στο ESP32
Σύνδεση των Softpots στο ESP32

Πρώτα απ 'όλα πρέπει να συνδέσουμε τα softpots μας με το esp32. Συνδέουμε την αριστερή και τη δεξιά ακίδα με το 5V και το GND αντίστοιχα. Συνδέουμε τον μεσαίο πείρο σε έναν αναλογικό πείρο στο ESP32. Πρέπει επίσης να συνδέσουμε το μεσαίο πείρο με αντίσταση 10k ohm και να το συνδέσουμε με το GND. Αυτό συμβαίνει έτσι ώστε η έξοδός μας από τα softpots να μην επιστρέφει τυχαία τιμή.

Στη συνέχεια, συνδέουμε το ESP32 με το καλώδιο micro usb στον υπολογιστή μας, ώστε να μπορούμε να ανεβάσουμε κώδικα σε αυτό. Θα χρησιμοποιήσουμε το Arduino IDE για τον προγραμματισμό του ESP32. Αλλά πρώτα πρέπει να εγκαταστήσουμε τον πυρήνα Arduino για το ESP32, ώστε να μπορούμε να τον ανεβάσουμε. Αυτό μπορεί να γίνει εδώ.

Στη συνέχεια, μπορούμε να αρχίσουμε να γράφουμε κώδικα.

Πρώτα πρέπει να αντιστοιχίσουμε τις καρφίτσες μας στις οποίες συνδέσαμε τη μεσαία καρφίτσα των softpots.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

ανυπόγραφο για μεγάλο χρονικό διάστημα

ανυπόγραφο μακρύ softPotTime;

Στη συνέχεια, μπορούμε να στήσουμε τις καρφίτσες μας. Και πρέπει να ξεκινήσουμε τη σειριακή μας οθόνη και τον χρόνο μας.

void setup () {

onTime = millis ();

Serial.begin (115200);

Serial.println ("Έναρξη προγράμματος");

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT); }

void getdata (byte pdata ) {

// Διαβάστε την τιμή ADC του μαλακού δοχείου

Στη συνέχεια, πρέπει να διαβάσουμε τις καρφίτσες μας, ώστε να μπορούμε να λαμβάνουμε τα δεδομένα μας.

int softPotADC1 = analogRead (SOFT_POT_PIN1);

nt softPotADC2 = analogRead (SOFT_POT_PIN2);

int softPotADC3 = analogRead (SOFT_POT_PIN3);

int softPotADC4 = analogRead (SOFT_POT_PIN4);

Στη συνέχεια, βάζουμε τις τιμές σε μια λίστα, ώστε να μπορούμε εύκολα να την εξάγουμε αργότερα.

για (int i = 0; i <4; i ++) {

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

int softpot = Ονόματα ;

αν (softpot> 10) {

pdata [0] = i;

pdata [1] = softpot;

pdata [2] = millis ();

} } }

}

Βήμα 3: Ασύρματη σύνδεση του ESP32 και του RPI

Για ασύρματη σύνδεση των ESP32 και RPI, θα χρησιμοποιήσουμε μια βιβλιοθήκη που ονομάζεται websocket. Για να εγκαταστήσετε αυτήν τη βιβλιοθήκη, μπορούμε να λάβουμε τα αρχεία εδώ. Θα χρειαστεί να αλλάξουμε κάποιο κώδικα στα ίδια τα αρχεία για να χρησιμοποιήσουμε αυτήν τη βιβλιοθήκη για το ESP32.

Θα χρειαστεί να αλλάξουμε τα MD5.c και MD5.h.

  • MD5Init σε MD5InitXXX
  • MD5Ενημέρωση σε MD5UpdateXXX
  • MD5Final έως MD5FinalXXX

Θα χρειαστεί επίσης να διαγράψουμε τις γραμμές avr/io.h στα αρχεία sha1.

Στη συνέχεια, μπορούμε να προσθέσουμε τη βιβλιοθήκη στο Arduino IDE με σκίτσο> συμπεριλάβετε βιβλιοθήκη> προσθέστε βιβλιοθήκη. ZIP και στη συνέχεια μπορούμε να επιλέξουμε τη βιβλιοθήκη σας σε ένα αρχείο zip.

Μετά από αυτό μπορούμε να αρχίσουμε να γράφουμε τον κωδικό μας.

Πρώτα για το ESP32:

Συμπεριλαμβανομένης της βιβλιοθήκης μας

#συμπεριλάβω #συμπεριλάβω

Αναθέτοντας ξανά τις καρφίτσες μας.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

Εκχώρηση του διακομιστή wifi μας

Διακομιστής WiFiServer (80).

Εκκίνηση του διακομιστή ιστού μας

WebSocketServer webSocketServer;

Εκχώρηση SSID και κωδικού πρόσβασης για το wifi σας

const char* ssid = "το SSID του wifi σας";

const char* password = "ο κωδικός πρόσβασης wifi σας";

void setup () {

Ρύθμιση της σειριακής οθόνης σας

Serial.begin (115200);

Ρύθμιση των softpots σας

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT);

Ξεκινάμε το wifi μας και συνδεόμαστε με αυτό

WiFi.begin (ssid, κωδικός πρόσβασης);

ενώ (WiFi.status ()! = WL_CONNECTED) {

καθυστέρηση (1000)?

Serial.println ("Σύνδεση σε WiFi.."); }

Serial.println ("Συνδεδεμένο στο δίκτυο WiFi");

Serial.println (WiFi.localIP ());

server.begin (); καθυστέρηση (100)? }

void getdata (char *pdata) {

Διαβάζοντας τα δεδομένα σας

// Διαβάστε την τιμή ADC του μαλακού δοχείου

int softPotADC1 = analogRead (SOFT_POT_PIN1);

int softPotADC2 = analogRead (SOFT_POT_PIN2);

int softPotADC3 = analogRead (SOFT_POT_PIN3);

int softPotADC4 = analogRead (SOFT_POT_PIN4);

Τοποθέτηση των δεδομένων σε μια λίστα και μετατροπή τους σε δεκαεξαδικό.

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

}

void loop () {

Σύνδεση του πελάτη σας (το rPI)

WiFiClient client = server.available ();

if (client.connected ()) {

καθυστέρηση (10)?

if (webSocketServer.handshake (πελάτης)) {

Serial.println ("Ο πελάτης είναι συνδεδεμένος");

Αποστολή και λήψη δεδομένων.

while (client.connected ()) {

δεδομένα καρτών [30];

getdata (δεδομένα)

Serial.println (δεδομένα);

webSocketServer.sendData (δεδομένα);

καθυστέρηση (10)? // Απαιτείται καθυστέρηση για τη σωστή λήψη των δεδομένων}

Serial.println ("Ο πελάτης αποσυνδέθηκε");

καθυστέρηση (100)? }

αλλιώς {

Serial.println ("shitsfuckedyo");

} } }

Στη συνέχεια, για το rPI σε python:

Εισαγωγή των βιβλιοθηκών μας

εισαγωγή websocketimport χρόνο

Εκχώρηση σφαιρικού variabel i

i = 0

Ρύθμιση το πολύ 200 μηνυμάτων που μπορούμε να λάβουμε

nrOfMessages = 200

κλάση Websocket ():

def _init _ (self):

Αρχικοποίηση της ιστοσελίδας μας και σύνδεση με το ESP32

self.ws = websocket. WebSocket ()

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

Λήψη των δεδομένων μας

def work (self):

self.ws.send ("μήνυμα nr: 0")

αποτέλεσμα = self.ws.recv () time.sleep (0,5) αποτέλεσμα επιστροφής

Κλείσιμο του websocket αφού λάβετε τα πάντα

def close (self):

self.ws.close ()

Βήμα 4: Σύνδεση του ιστότοπου και της βάσης δεδομένων σας

Όσον αφορά τη σύνδεση της βάσης δεδομένων και του ιστότοπού μας, θα πρέπει πρώτα απ 'όλα να δημιουργήσετε τη βάση δεδομένων σας στο pi εγκαθιστώντας το mariadb: sudo apt install mariadb.

Στη συνέχεια, μπορείτε να το προσπελάσετε κάνοντας: sudo mariadb.

Στη συνέχεια, θα χρειαστεί επίσης να δημιουργήσετε τον ιστότοπό σας. Μπορείτε να το κάνετε αυτό όπως θέλετε, αλλά πρέπει να χρησιμοποιήσετε το Flask και πρέπει να έχετε μια φόρμα στο HTML σας για να σταματήσετε και να ξεκινήσετε τα δεδομένα σας.

Στη συνέχεια, μπορείτε να εισαγάγετε αυτόν τον κώδικα για να συνδέσετε τη βάση δεδομένων και τον ιστότοπό σας (τόσο ο ιστότοπός σας όσο και η βάση δεδομένων πρέπει να είναι και οι δύο στο pi σας, αυτό μπορεί να γίνει χρησιμοποιώντας την καρτέλα ανάπτυξης στις ρυθμίσεις του pycharm)

από το flaskext.mysql εισαγωγή MySQL

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

app.config ["MYSQL_DATABASE_DB"] = "το όνομα της βάσης δεδομένων σας"

app.config ["MYSQL_DATABASE_USER"] = "ο χρήστης της βάσης δεδομένων σας"

app.config ["MYSQL_DATABASE_PASSWORD"] = "ο κωδικός πρόσβασης της βάσης δεδομένων σας"

Λειτουργία για την εξαγωγή δεδομένων από τη βάση δεδομένων μας.

def get_data (sql, params = Καμία):

conn = mysql.connect ()

δρομέας = conn.cursor ()

εκτύπωση ("λήψη δεδομένων")

προσπαθήστε:

εκτύπωση (sql)

cursor.execute (sql, params)

εκτός από την εξαίρεση ως e:

εκτύπωση (ε)

επιστροφή Λάθος

αποτέλεσμα = cursor.fetchall ()

δεδομένα =

για τη σειρά στο αποτέλεσμα:

data.append (λίστα (σειρά))

cursor.close ()

conn.close ()

επιστροφή δεδομένων

Λειτουργία για την εισαγωγή δεδομένων στη βάση δεδομένων μας

def set_data (sql, params = Καμία):

conn = mysql.connect ()

δρομέας = conn.cursor ()

προσπαθήστε:

log.debug (sql)

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

log.debug ("SQL uitgevoerd")

εκτός από την εξαίρεση ως e:

log.exception ("Fout bij uitvoeren van sql: {0})". μορφή (ε))

επιστροφή Λάθος

cursor.close ()

conn.close ()

επιστροφή True

Θα χρειαστεί επίσης να βάλουμε νήμα στην εφαρμογή μας, ώστε να μπορείτε να κάνετε άλλα πράγματα κατά την εγγραφή.

class ThreadedTask (threading. Thread):

def _init _ (self,):

Ρύθμιση νήματος

νήμα. Νήμα._ init _ (μόνος)

Δημιουργία λίστας για τη διατήρηση όλων των δεδομένων που λάβατε

self.data_all =

def run (self):

ώρα. ύπνος (5)

Εισαγάγετε τον δικό σας κώδικα python όπου λαμβάνετε τα δεδομένα

εισαγωγή Receive_websocket

Λάβετε τα δεδομένα σας

w = Rece_websocket. Websocket ()

Προσθέστε τα δεδομένα σας στη λίστα σας και εκτυπώστε τα.

για i στην περιοχή (0, 200):

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

εκτύπωση (self.data_all)

task = ThreadedTask ()

Στη συνέχεια, μπορείτε να κάνετε το task.run () για να ξεκινήσετε το νήμα σας και να αρχίσετε να λαμβάνετε δεδομένα.

Βήμα 5: Συνδέστε τα πάντα μαζί

Συνδέοντας τα πάντα μαζί
Συνδέοντας τα πάντα μαζί

Για να τρέξετε τον ιστότοπό σας από το Pi σας, πρέπει να χρησιμοποιήσετε μια υπηρεσία:

[Μονάδα] Περιγραφή = παράδειγμα uWSGI για την εξυπηρέτηση διεπαφής ιστού project1

Μετά = network.target

BindsTo = mysqld.service

Μετά = mysqld.service

[Υπηρεσία]

Αλλαγή στον χρήστη σας

Χρήστης = pi

Ομάδα = www-δεδομένα

Εδώ πρέπει να εισαγάγετε τον κατάλογο του αρχείου Flask

WorkingDirectory =/home/pi/project1/web

Κατάλογος του αρχείου ini που μπορείτε να βρείτε αργότερα.

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

[Εγκαθιστώ]

WantedBy = multi-user.target

uwsgi-flask.ini που πρέπει να τοποθετήσετε στον κατάλογο που καθορίσατε στο ExecStart παραπάνω

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

κύρια = πραγματικές διαδικασίες = 5

plugins = python3

πρίζα = project1.sock chmod-socket = 660 vacuum = true

die-on-term = αλήθεια

Τώρα μπορείτε να διαβάσετε τα δεδομένα σας και να τα εμφανίσετε στον ιστότοπό σας.

Βήμα 6: Επιπλέον: Σύνδεση οθόνης LCD

Επιπλέον: Σύνδεση οθόνης LCD
Επιπλέον: Σύνδεση οθόνης LCD
Επιπλέον: Σύνδεση οθόνης LCD
Επιπλέον: Σύνδεση οθόνης LCD
Επιπλέον: Σύνδεση οθόνης LCD
Επιπλέον: Σύνδεση οθόνης LCD

Μπορούμε να συνδέσουμε μια οθόνη LCD έτσι ώστε να μπορούμε να δείξουμε τη διεύθυνση IP του Pi μας για τον ιστότοπό μας.

εισαγωγή RPi. GPIO ως GPIOimport time

εντολές εισαγωγής

GPIO.cleanup ()

D0 = 22

D1 = 5

D2 = 6

D3 = 13

D4 = 19

D5 = 26

D6 = 20

D7 = 21

λίστα = [22, 5, 6, 13, 19, 26, 20, 21]

Ε = 24

RS = 23

οθόνη τάξης:

def _init _ (self):

GPIO.setmode (GPIO. BCM)

self.setup ()

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

def stuur_instructie (self, byte):

GPIO.output (E, GPIO. HIGH)

GPIO.output (RS, GPIO. LOW)

self.set_GPIO_bits (byte)

ώρα. ύπνος (0,005)

GPIO.output (E, GPIO. LOW)

def stuur_teken (self, char):

temp = ord (char)

GPIO.output (E, GPIO. HIGH)

GPIO.output (RS, GPIO. HIGH)

self.set_GPIO_bits (θερμοκρασία)

ώρα. ύπνος (0,005)

GPIO.output (E, GPIO. LOW)

def set_GPIO_bits (self, byte):

για i στο εύρος (0, 8):

εάν (byte & (2 ** i)) == 0:

GPIO.output (λίστα , GPIO. LOW)

αλλού:

GPIO.output (λίστα , GPIO. HIGH)

def main ():

s = Οθόνη ()

teken = "Τοπική διεύθυνση IP:"

για επιστολή σε teken:

s.stuur_teken (γράμμα)

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

εκτύπωση (teken2)

s.stuur_instructie (0xc0)

για το γράμμα2 στο teken2:

s.stuur_teken (γράμμα 2)

εάν _name_ == '_main_': #Πρόγραμμα ξεκινώντας από εδώ

προσπαθήστε:

κύριος()

εκτός από το KeyboardIntruptrupt:

πέρασμα

Στη συνέχεια, μπορούμε να δημιουργήσουμε μια υπηρεσία για την εκκίνηση της οθόνης LCD κατά την εκκίνηση.

Συνιστάται: