Daftar Isi:

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

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

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

Sebagai pemain biola, saya selalu menginginkan aplikasi atau alat yang dapat menunjukkan posisi jari saya pada biola dengan sangat tepat. Dengan proyek ini saya mencoba membangun ini. Meskipun ini adalah prototipe dan Anda masih dapat menambahkan banyak fitur.

Saya juga mencoba memisahkan ESP32 dan rPI dan dengan demikian saya membuat ESP32 mengirim data nirkabel ke rPi. Yang mungkin merupakan hal yang paling sulit tentang proyek ini.

Juga sangat penting bahwa pada akhir proyek ini tidak ada yang disimpan di komputer Anda selain di rPI atau ESP32.

Langkah 1: Bahan dan Alat

Bahan dan alat
Bahan dan alat

Sebelum masuk ke spesifikasi membangun proyek ini, kita memerlukan beberapa hal.

  1. 4x Linear Softpot: Potensiometer Linear untuk mengukur posisi jari (biola memiliki 4 senar)
  2. ESP32: Modul ESP32 untuk membaca data dari softpot linier.
  3. a 4/4 biola: biola untuk menempatkan softpot linier di atas.
  4. a Raspberry Pi dengan kartu SD: raspberry pi yang akan menyimpan database dan situs web kami.
  5. Potensiometer 10k: potensiometer untuk kecerahan LCD
  6. Layar LCD: layar LCD untuk ditampilkan ke alamat ip rPi
  7. Solder Kit: Untuk menyolder semua elemen bersama-sama
  8. Kabel male-to-male dan kabel male-to-female: Kabel untuk menghubungkan semua elemen
  9. Kabel Micro USB: Untuk menyalakan ESP32

Langkah 2: Menghubungkan Softpot ke ESP32

Menghubungkan Softpot ke ESP32
Menghubungkan Softpot ke ESP32

Pertama-tama kita perlu menghubungkan softpot kita ke esp32. Kami menghubungkan pin kiri dan kanan ke 5V dan GND masing-masing. Kami menghubungkan pin tengah ke pin analog pada ESP32. Kita juga perlu menghubungkan pin tengah dengan resistansi 10k ohm dan menghubungkannya ke GND. Ini agar output softpot kita tidak mengembalikan nilai acak.

Kemudian kita sambungkan ESP32 dengan kabel micro usb ke pc kita sehingga kita bisa mengupload kode ke dalamnya. Kami akan menggunakan Arduino IDE untuk memprogram ESP32. Tetapi pertama-tama kita perlu menginstal inti Arduino untuk ESP32 sehingga kita dapat mengunggahnya. Ini bisa dilakukan di sini.

Kemudian kita bisa mulai menulis kode.

Pertama kita perlu menetapkan pin yang kita hubungkan dengan pin tengah 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;

onTime lama yang tidak ditandatangani;

softPotTime panjang yang tidak ditandatangani;

Kemudian kita bisa mengatur pin kita. Dan kita perlu memulai monitor serial dan waktu kita.

batalkan pengaturan() {

onTime = milis();

Serial.begin(115200);

Serial.println("Program dimulai");

pinMode(SOFT_POT_PIN1, INPUT);

pinMode(SOFT_POT_PIN2, INPUT);

pinMode(SOFT_POT_PIN3, INPUT);

pinMode(SOFT_POT_PIN4, INPUT); }

void getdata(byte pdata) {

// Baca nilai ADC soft pot

Kemudian kita perlu membaca pin kita sehingga 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 menempatkan nilai dalam daftar sehingga kami dapat dengan mudah menampilkannya nanti.

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

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

int softpot = Nama;

if (softpot > 10){

pdata[0] = saya;

pdata[1] = softpot;

pdata[2] = milis();

} } }

}

Langkah 3: Menghubungkan ESP32 dan RPI Secara Nirkabel

Untuk menghubungkan ESP32 dan RPI secara nirkabel, kita akan menggunakan library yang disebut websocket. Untuk menginstal perpustakaan ini, kita bisa mendapatkan file di sini. Kita perlu mengubah beberapa kode dalam file itu sendiri untuk menggunakan perpustakaan ini untuk ESP32.

Kita perlu mengubah MD5.c dan MD5.h.

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

Kita juga perlu menghapus baris avr/io.h di file sha1.

Kemudian kita dapat menambahkan library ke Arduino IDE kita dengan sketch > include library > add. ZIP library dan kemudian kita dapat memilih library dalam file zip.

Setelah itu kita bisa mulai menulis kode 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 server wifi kami

Server WiFiServer (80);

Memulai server websocket kami

WebSocketServer webSocketServer;

Menetapkan SSID dan kata sandi wifi Anda

const char* ssid = "SSID wifi Anda";

const char* kata sandi = "kata sandi wifi Anda";

batalkan pengaturan() {

Menyiapkan monitor serial 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);

Memulai wifi kami dan menghubungkannya

WiFi.begin(ssid, kata sandi);

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

penundaan (1000);

Serial.println("Menghubungkan ke Wi-Fi.."); }

Serial.println("Tersambung ke jaringan WiFi");

Serial.println(WiFi.localIP());

server.mulai(); penundaan(100); }

void getdata(char *pdata) {

Membaca data Anda

// Baca nilai ADC 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);

Menempatkan data dalam daftar dan mengubahnya menjadi heksadesimal.

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

}

lingkaran kosong() {

Menghubungkan klien Anda (rPI)

Klien WiFiClient = server.available();

jika (klien.terhubung()) {

penundaan (10);

if (webSocketServer.handshake(klien)) {

Serial.println("Klien terhubung");

Mengirim dan menerima data.

while (client.connected()) {

data karakter[30];

getdata(data);

Serial.println(data);

webSocketServer.sendData(data);

penundaan (10); // Diperlukan penundaan untuk menerima data dengan benar }

Serial.println("Klien terputus");

penundaan(100); }

lain {

Serial.println("sialan");

} } }

Kemudian untuk rPI dengan python:

Mengimpor perpustakaan kami

impor websocket waktu impor

Menetapkan variabel globale i

saya = 0

Mengatur maksimum 200 pesan yang dapat kami terima

nrOfMessages = 200

kelas Websocket():

def _init_(sendiri):

Menginisialisasi soket web kami dan menghubungkannya ke ESP32 kami

self.ws = websocket. WebSocket()

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

Menerima data kami

pasti bekerja (sendiri):

self.ws.send("nomor pesan: 0")

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

Menutup soket web setelah menerima semuanya

def tutup (sendiri):

diri.ws.close()

Langkah 4: Menghubungkan Situs Web dan Basis Data Anda

Untuk menghubungkan Database dan situs web kami, pertama-tama Anda harus membuat database Anda di pi dengan menginstal mariadb: sudo apt install mariadb.

Kemudian Anda dapat mengaksesnya dengan melakukan: Sudo mariadb.

Kemudian Anda juga perlu membuat situs web Anda. Anda dapat melakukan ini sesuka Anda, tetapi Anda harus menggunakan Flask dan Anda harus memiliki formulir di HTML Anda untuk menghentikan dan memulai data Anda.

Kemudian Anda dapat memasukkan kode ini untuk menghubungkan basis data dan situs web Anda (baik situs web dan basis data Anda harus berada di pi Anda, ini dapat dilakukan dengan menggunakan tab penerapan di pengaturan pycharm)

dari flaskext.mysql impor MySQL

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

app.config["MYSQL_DATABASE_DB"] = "nama database Anda"

app.config["MYSQL_DATABASE_USER"] = "pengguna basis data Anda"

app.config["MYSQL_DATABASE_PASSWORD"] = "kata sandi basis data Anda"

Berfungsi untuk mengeluarkan data dari database kita.

def get_data(sql, params=None):

samb = mysql.koneksi()

kursor = penghubung.kursor()

print("mendapatkan data")

mencoba:

cetak (sql)

cursor.execute(sql, params)

kecuali Pengecualian sebagai e:

cetak (e)

kembali Salah

hasil = cursor.fetchall()

data =

untuk baris dalam hasil:

data.tambahkan(daftar(baris))

kursor.tutup()

samb.tutup()

kembalikan data

Fungsi untuk memasukkan data ke dalam database kami

def set_data(sql, params=None):

samb = mysql.koneksi()

kursor = penghubung.kursor()

mencoba:

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 Salah

kursor.tutup()

samb.tutup()

kembali Benar

Kami juga perlu memasang aplikasi kami sehingga Anda dapat melakukan hal-hal lain saat Anda merekam.

kelas ThreadedTask(threading. Thread):

def _init_(sendiri,):

Menyiapkan utas

threading. Thread._init_(mandiri)

Membuat daftar untuk menyimpan semua data yang Anda terima

self.data_all =

def run (sendiri):

waktu.tidur(5)

Impor kode python Anda sendiri tempat Anda menerima data

impor receiver_websocket

Terima data Anda

w = accept_websocket. Websocket()

Tambahkan data Anda dalam daftar Anda dan cetak.

untuk saya dalam rentang (0, 200):

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

cetak(self.data_all)

tugas = ThreadedTask()

Kemudian Anda dapat melakukan task.run() untuk memulai Thread Anda dan mulai menerima data.

Langkah 5: Menghubungkan Semuanya Bersama

Menghubungkan Semuanya Bersama
Menghubungkan Semuanya Bersama

Untuk menjalankan situs web Anda dari Pi Anda, Anda harus menggunakan layanan:

[Unit]Deskripsi=instance uWSGI untuk melayani antarmuka web project1

Setelah=jaringan.target

BindsTo=mysqld.service

Setelah = mysqld.service

[Melayani]

Ubah ke pengguna Anda

Pengguna=pi

Grup=www-data

Di sini Anda harus memasukkan direktori file Flask Anda

WorkingDirectory=/home/pi/project1/web

Direktori file ini Anda yang dapat ditemukan nanti.

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

[Install]

WantedBy=multi-pengguna.target

uwsgi-flask.ini yang perlu Anda tempatkan di direktori yang Anda tentukan di ExecStart di atas

[uwsgi]modul = web:aplikasi virtualenv = /home/pi/project1/env

master = proses sebenarnya = 5

plugin = python3

socket = project1.sock chmod-socket = 660 vakum = true

mati-on-term = benar

Sekarang Anda dapat membaca data Anda dan menampilkannya di situs web Anda.

Langkah 6: Ekstra: Menghubungkan Layar LCD

Ekstra: Menghubungkan Layar LCD
Ekstra: Menghubungkan Layar LCD
Ekstra: Menghubungkan Layar LCD
Ekstra: Menghubungkan Layar LCD
Ekstra: Menghubungkan Layar LCD
Ekstra: Menghubungkan Layar LCD

Kami dapat menghubungkan layar LCD sehingga kami dapat menunjukkan alamat ip Pi kami untuk situs web kami.

impor RPi. GPIO sebagai GPIOimpor waktu

perintah impor

GPIO.pembersihan()

D0 = 22

D1 = 5

D2 = 6

D3 = 13

D4 = 19

D5 = 26

D6 = 20

D7 = 21

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

E = 24

RS = 23

layar kelas:

def _init_(sendiri):

GPIO.setmode(GPIO. BCM)

pengaturan sendiri()

#Fungsi mengatur self.stuur_instructie(0x3f) #Menampilkan 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(sendiri, byte):

GPIO.output(E, GPIO. HIGH)

GPIO.output(RS, GPIO. LOW)

self.set_GPIO_bits(byte)

waktu.tidur(0.005)

GPIO.output(E, GPIO. LOW)

def stuur_teken(diri sendiri, karakter):

suhu = ord(char)

GPIO.output(E, GPIO. HIGH)

GPIO.output(RS, GPIO. HIGH)

self.set_GPIO_bits(temp)

waktu.tidur(0.005)

GPIO.output(E, GPIO. LOW)

def set_GPIO_bits(sendiri, byte):

untuk saya dalam rentang (0, 8):

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

GPIO.output(daftar, GPIO. LOW)

lain:

GPIO.output(daftar, GPIO. HIGH)

def utama():

s = Layar()

teken = "Alamat IP lokal:"

untuk surat dalam teken:

s.stuur_teken(surat)

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

cetak(teken2)

s.stuur_instructie(0xc0)

untuk letter2 di teken2:

s.stuur_teken(surat2)

if _name_ == '_main_': #Program dimulai dari sini

mencoba:

utama()

kecuali KeyboardInterrupt:

lulus

Kemudian kita dapat membuat layanan untuk memulai LCD saat start-up.

Direkomendasikan: