Isi kandungan:

Mengukur Posisi Jari pada Biola Dengan Langkah ESP32: 6
Mengukur Posisi Jari pada Biola Dengan Langkah ESP32: 6

Video: Mengukur Posisi Jari pada Biola Dengan Langkah ESP32: 6

Video: Mengukur Posisi Jari pada Biola Dengan Langkah ESP32: 6
Video: deep web video!!!#deepweb #serem #ngeringerisedap #lucu #experiment #aneh #keajaibandunia 2024, Julai
Anonim
Mengukur Kedudukan Jari pada Biola Dengan ESP32
Mengukur Kedudukan Jari pada Biola Dengan ESP32
Mengukur Kedudukan Jari pada Biola Dengan ESP32
Mengukur Kedudukan Jari pada Biola Dengan ESP32

Sebagai pemain biola, saya selalu mahukan aplikasi atau alat yang dapat menunjukkan kedudukan jari saya pada biola dengan sangat tepat. Dengan projek ini saya berusaha membina ini. Walaupun ini adalah prototaip dan anda masih boleh menambahkan banyak ciri.

Saya juga cuba memisahkan ESP32 dan rPI dan dengan itu saya membuat ESP32 menghantar data tanpa wayar ke rPi. Yang mungkin paling sukar untuk projek ini.

Ia juga sangat penting bahawa pada akhir projek ini tidak ada yang tersimpan di komputer anda melainkan pada rPI atau ESP32.

Langkah 1: Bahan dan Alat

Bahan dan Alat
Bahan dan Alat

Sebelum kita mengetahui secara terperinci pembinaan projek ini, kita memerlukan beberapa perkara.

  1. 4x Linear Softpot: Linear Potentiometers untuk mengukur kedudukan jari (biola mempunyai 4 tali)
  2. ESP32: Modul ESP32 untuk membaca data dari softpots linier.
  3. biola 4/4: biola untuk meletakkan softpots linier di atas.
  4. Raspberry Pi dengan kad SD: pi raspberry yang akan menyimpan pangkalan data dan laman web kami.
  5. Potensiometer 10k: potensiometer untuk kecerahan LCD
  6. Layar LCD: skrin LCD untuk ditunjukkan kepada alamat IP rPi
  7. Kit Pematerian: Untuk pematerian semua elemen lebih tinggi
  8. Kabel lelaki-ke-lelaki dan wayar lelaki-ke-wanita: Kabel untuk menghubungkan semua elemen
  9. Kabel USB mikro: Untuk menghidupkan ESP32

Langkah 2: Menyambungkan Softpots ke ESP32

Menyambungkan Softpots ke ESP32
Menyambungkan Softpots ke ESP32

Pertama sekali, kita perlu menyambungkan softpots kita ke esp32. Kami menghubungkan pin kiri dan kanan masing-masing ke 5V dan GND. Kami menyambungkan pin tengah ke pin analog pada ESP32. Kita juga perlu menyambungkan pin tengah dengan rintangan 10k ohm dan menghubungkannya ke GND. Ini supaya output dari softpots kami tidak mengembalikan nilai rawak.

Kemudian kami menyambungkan ESP32 dengan kabel mikro usb ke komputer kami sehingga kami dapat memuat naik kod kepadanya. Kami akan menggunakan Arduino IDE untuk memprogram ESP32. Tetapi pertama-tama kita perlu memasang teras Arduino untuk ESP32 supaya kita dapat memuat naiknya. Ini boleh dilakukan di sini.

Kemudian kita boleh mula menulis kod.

Mula-mula kita perlu menetapkan pin kita yang mana kita menghubungkan pin tengah softpots kita.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

onTime panjang yang tidak ditandatangani;

softPotTime panjang yang tidak ditandatangani;

Kemudian kita boleh memasang pin kita. Dan kita perlu memulakan monitor bersiri dan masa kita.

batal persediaan () {

onTime = milis ();

Serial.begin (115200);

Serial.println ("Permulaan program");

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT); }

batal getdata (bait pdata ) {

// Baca dalam nilai ADC periuk lembut

Kemudian kita perlu membaca pin kita supaya kita dapat menerima data kita.

int softPotADC1 = analogRead (SOFT_POT_PIN1);

nt softPotADC2 = analogRead (SOFT_POT_PIN2);

int softPotADC3 = analogRead (SOFT_POT_PIN3);

int softPotADC4 = analogRead (SOFT_POT_PIN4);

Kemudian kami meletakkan nilai dalam senarai supaya kami dapat mengeluarkannya dengan mudah kemudian.

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

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

int softpot = Nama ;

jika (softpot> 10) {

pdata [0] = i;

pdata [1] = softpot;

pdata [2] = milis ();

} } }

}

Langkah 3: Menyambungkan ESP32 dan RPI Tanpa wayar

Untuk menyambungkan ESP32 dan RPI secara wayarles, kami akan menggunakan perpustakaan yang disebut websocket. Untuk memasang perpustakaan ini, kita boleh mendapatkan failnya di sini. Kita perlu mengubah beberapa kod dalam fail itu sendiri untuk menggunakan perpustakaan ini untuk ESP32.

Kita perlu menukar MD5.c dan MD5.h.

  • MD5Init ke MD5InitXXX
  • MD5Update ke MD5UpdateXXX
  • MD5Final hingga MD5FinalXXX

Kita juga perlu menghapus baris avr / io.h dalam fail sha1.

Kemudian kita boleh menambahkan perpustakaan ke Arduino IDE kami dengan membuat lakaran> memasukkan perpustakaan> menambah. ZIP perpustakaan dan kemudian kami dapat memilih perpustakaan anda dalam fail zip.

Selepas itu kita boleh mula menulis kod kita.

Pertama untuk ESP32:

Termasuk perpustakaan kami

#sertakan #sertakan

Menetapkan pin kami lagi.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

Menetapkan pelayan wifi kami

Pelayan WiFiServer (80);

Memulakan pelayan websocket kami

WebSocketServer webSocketServer;

Menetapkan SSID dan kata laluan wifi anda

const char * ssid = "SSID wifi anda";

const char * password = "kata laluan wifi anda";

batal persediaan () {

Menyiapkan monitor bersiri anda

Serial.begin (115200);

Menyiapkan softpot anda

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT);

Memulakan wifi kami dan menyambungkannya

WiFi.begin (ssid, kata laluan);

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

kelewatan (1000);

Serial.println ("Menyambung ke WiFi.."); }

Serial.println ("Bersambung ke rangkaian WiFi");

Serial.println (WiFi.localIP ());

pelayan.begin (); kelewatan (100); }

batal getdata (char * pdata) {

Membaca data anda

// Baca dalam nilai ADC periuk lembut

int softPotADC1 = analogRead (SOFT_POT_PIN1);

int softPotADC2 = analogRead (SOFT_POT_PIN2);

int softPotADC3 = analogRead (SOFT_POT_PIN3);

int softPotADC4 = analogRead (SOFT_POT_PIN4);

Menempatkan data dalam senarai dan menukarnya menjadi heksadesimal.

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

}

gelung kosong () {

Menghubungkan pelanggan anda (rPI)

Pelanggan WiFiClient = server.available ();

jika (klien.sambungan ()) {

kelewatan (10);

jika (webSocketServer.handshake (pelanggan)) {

Serial.println ("Pelanggan disambungkan");

Menghantar dan menerima data.

semasa (client.connected ()) {

data char [30];

getdata (data);

Serial.println (data);

webSocketServer.sendData (data);

kelewatan (10); // Kelewatan diperlukan untuk menerima data dengan betul}

Serial.println ("Pelanggan terputus");

kelewatan (100); }

lain {

Serial.println ("shitsfuckedyo");

} } }

Kemudian untuk rPI di python:

Mengimport perpustakaan kami

mengimport websocketimport masa

Menetapkan pemboleh ubah global i

i = 0

Menetapkan maksimum 200 mesej yang dapat kita terima

nrOfMessages = 200

Websocket kelas ():

def _init _ (diri):

Memulakan soket web kami dan menghubungkannya ke ESP32 kami

self.ws = websocket. WebSocket ()

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

Menerima data kami

kerja def (diri):

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

hasil = self.ws.recv () time.sleep (0.5) hasil pulangan

Menutup soket web setelah menerima semuanya

def dekat (diri):

self.ws.close ()

Langkah 4: Menghubungkan Laman Web dan Pangkalan Data Anda

Untuk menghubungkan Pangkalan Data dan laman web kami, pertama sekali anda perlu membuat pangkalan data anda di pi dengan memasang mariadb: sudo apt mari mari.

Kemudian anda boleh mengaksesnya dengan melakukan: sudo mariadb.

Kemudian anda juga perlu membuat laman web anda. Anda boleh melakukan ini sesuka hati, tetapi anda harus menggunakan Flask dan anda perlu mempunyai borang dalam HTML anda untuk menghentikan dan memulakan data anda.

Kemudian anda boleh memasukkan kod ini untuk menyambungkan pangkalan data dan laman web anda (kedua-dua laman web dan pangkalan data anda harus berada di pi anda, ini dapat dilakukan dengan menggunakan tab penyebaran dalam tetapan pycharm)

dari flaskext.mysql import MySQL

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

app.config ["MYSQL_DATABASE_DB"] = "nama pangkalan data anda"

app.config ["MYSQL_DATABASE_USER"] = "pengguna pangkalan data anda"

app.config ["MYSQL_DATABASE_PASSWORD"] = "kata laluan pangkalan data anda"

Fungsi untuk mengeluarkan data dari pangkalan data kami.

def get_data (sql, params = Tiada):

conn = mysql.connect ()

kursor = penyambung kursor ()

cetak ("mendapatkan data")

cuba:

cetak (sql)

kursor.laksanakan (sql, params)

kecuali Pengecualian sebagai e:

mencetak (e)

kembali Palsu

hasil = kursor.fetchall ()

data =

untuk hasil baris:

data.lampirkan (senarai (baris))

kursor.tutup ()

sambung ()

mengembalikan data

Fungsi untuk memasukkan data ke dalam pangkalan data kami

def set_data (sql, params = Tiada):

conn = mysql.connect ()

kursor = conn.cursor ()

cuba:

log.debug (sql)

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

log.debug ("SQL uitgevoerd")

kecuali Pengecualian sebagai e:

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

kembali Palsu

kursor.tutup ()

sambung ()

kembali Benar

Kami juga perlu memasukkan aplikasi kami supaya anda dapat melakukan perkara lain semasa anda membuat rakaman.

kelas ThreadedTask (threading. Thread):

def _init _ (diri,):

Menyusun utas

threading. Thread._ init _ (diri)

Membuat senarai untuk menyimpan semua data yang anda terima

diri.data_all =

def run (diri):

masa. tidur (5)

Import kod python anda sendiri di mana anda menerima data

import terima_websocket

Terima data anda

w = terima_websocket. Websocket ()

Tambahkan data anda dalam senarai anda dan cetak.

untuk i dalam jarak (0, 200):

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

cetak (self.data_all)

tugas = ThreadedTask ()

Kemudian anda boleh melakukan task.run () untuk memulakan Thread anda dan mula menerima data.

Langkah 5: Menghubungkan Segalanya Bersama

Menghubungkan Segalanya Bersama
Menghubungkan Segalanya Bersama

Untuk menjalankan laman web dari Pi anda, anda harus menggunakan perkhidmatan:

[Unit] Penerangan = Contoh uWSGI untuk melayani antara muka web projek1

Selepas = network.target

BindsTo = mysqld.service

Selepas = mysqld.service

[Perkhidmatan]

Tukar kepada pengguna anda

Pengguna = pi

Kumpulan = data www

Di sini anda perlu memasukkan direktori fail Flask anda

WorkingDirectory = / rumah / pi / projek1 / web

Direktori fail ini anda boleh didapati kemudian.

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

[Pasang]

WantedBy = multi-user.target

uwsgi-flask.ini yang perlu anda letakkan di direktori yang anda nyatakan di ExecStart di atas

[uwsgi] modul = web: aplikasi virtualenv = / rumah / pi / projek1 / env

master = proses benar = 5

pemalam = python3

soket = projek1. soket chmod-soket = 660 vakum = benar

die-on-term = benar

Kini anda dapat membaca data anda dan memaparkannya di laman web anda.

Langkah 6: Tambahan: Menghubungkan Skrin LCD

Tambahan: Menghubungkan Skrin LCD
Tambahan: Menghubungkan Skrin LCD
Tambahan: Menghubungkan Skrin LCD
Tambahan: Menghubungkan Skrin LCD
Tambahan: Menghubungkan Skrin LCD
Tambahan: Menghubungkan Skrin LCD

Kami boleh menyambungkan skrin LCD sehingga kami dapat menunjukkan alamat ip Pi untuk laman web kami.

import RPi. GPIO sebagai masa GPIOimport

arahan import

GPIO.cleanup ()

D0 = 22

D1 = 5

D2 = 6

D3 = 13

D4 = 19

D5 = 26

D6 = 20

D7 = 21

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

E = 24

RS = 23

Skrin kelas:

def _init _ (diri):

GPIO.setmode (GPIO. BCM)

persediaan diri ()

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

def stuur_instructie (diri, bait):

GPIO.output (E, GPIO. HIGH)

GPIO.output (RS, GPIO. LOW)

self.set_GPIO_bits (bait)

masa. tidur (0.005)

GPIO.output (E, GPIO. LOW)

def stuur_teken (diri, char):

temp = ord (char)

GPIO.output (E, GPIO. HIGH)

GPIO.output (RS, GPIO. HIGH)

self.set_GPIO_bits (temp)

masa. tidur (0.005)

GPIO.output (E, GPIO. LOW)

def set_GPIO_bits (diri, bait):

untuk i dalam jarak (0, 8):

jika (bait & (2 ** i)) == 0:

GPIO.output (senarai , GPIO. LOW)

lain:

GPIO.output (senarai , GPIO. HIGH)

def utama ():

s = Skrin ()

teken = "Alamat IP tempatan:"

untuk surat dalam teken:

s.stuur_teken (surat)

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

cetak (teken2)

s.stuur_instructie (0xc0)

untuk huruf2 dalam teken2:

s.stuur_teken (huruf2)

jika _name_ == '_main_': #Program bermula dari sini

cuba:

utama ()

kecuali KeyboardInterrupt:

lulus

Kemudian kita boleh membuat perkhidmatan untuk memulakan LCD pada permulaan.

Disyorkan: