Mục lục:

Đo vị trí ngón tay trên đàn Violin với ESP32: 6 bước
Đo vị trí ngón tay trên đàn Violin với ESP32: 6 bước

Video: Đo vị trí ngón tay trên đàn Violin với ESP32: 6 bước

Video: Đo vị trí ngón tay trên đàn Violin với ESP32: 6 bước
Video: Hướng dẫn đặt khuôn tay và Bấm ngón 1 trên đàn violin dễ hiểu nhất- dạy học violin-hà nội-0986205193 2024, Tháng mười một
Anonim
Đo vị trí ngón tay trên đàn Violin với ESP32
Đo vị trí ngón tay trên đàn Violin với ESP32
Đo vị trí ngón tay trên đàn Violin với ESP32
Đo vị trí ngón tay trên đàn Violin với ESP32

Là một người chơi violin, tôi luôn muốn có một ứng dụng hoặc công cụ có thể chỉ cho tôi vị trí của các ngón tay của tôi trên violin một cách chính xác. Với dự án này, tôi đã cố gắng xây dựng điều này. Mặc dù đây là một nguyên mẫu và bạn vẫn có thể thêm nhiều tính năng.

Tôi cũng đã cố gắng tách ESP32 và rPI và do đó tôi đã thực hiện ESP32 gửi dữ liệu không dây đến rPi. Đó có lẽ là điều khó khăn nhất của dự án này.

Điều rất quan trọng là ở cuối dự án này, không có gì được lưu trữ trên máy tính của bạn nhưng nó nằm trên rPI hoặc ESP32.

Bước 1: Vật liệu và công cụ

Vật liệu và Công cụ
Vật liệu và Công cụ

Trước khi đi vào chi tiết cụ thể của việc xây dựng dự án này, chúng ta cần một vài điều.

  1. 4x Linear Softpot: Chiết áp tuyến tính để đo vị trí của ngón tay (đàn violin có 4 dây)
  2. ESP32: Một mô-đun ESP32 để đọc dữ liệu từ các softpots tuyến tính.
  3. một cây vĩ cầm 4/4: một cây vĩ cầm để đặt các phím mềm tuyến tính lên trên.
  4. Raspberry Pi với thẻ SD: Raspberry pi sẽ lưu trữ cơ sở dữ liệu và trang web của chúng tôi.
  5. Chiết áp 10k: chiết áp cho độ sáng của màn hình LCD
  6. Màn hình LCD: một màn hình LCD để hiển thị cho các địa chỉ ip của rPi
  7. Bộ hàn: Để hàn tất cả các phần tử togheter
  8. Dây nam - nam và dây nam - nữ: Cáp để kết nối tất cả các phần tử
  9. Cáp micro USB: Để cấp nguồn cho ESP32

Bước 2: Kết nối Softpots với ESP32

Kết nối Softpots với ESP32
Kết nối Softpots với ESP32

Trước hết, chúng ta cần kết nối softpots của mình với esp32. Chúng tôi kết nối chân trái và chân phải với 5V và GND tương ứng. Chúng tôi kết nối chân giữa với chân tương tự trên ESP32. Chúng ta cũng cần kết nối chân giữa với điện trở 10k ohm và kết nối chân này với GND. Điều này để đầu ra của chúng tôi về các dấu mềm không trả về giá trị ngẫu nhiên.

Sau đó, chúng tôi kết nối ESP32 với cáp micro usb với máy tính của chúng tôi để chúng tôi có thể tải mã lên nó. Chúng tôi sẽ sử dụng Arduino IDE để lập trình ESP32. Nhưng trước tiên chúng ta cần cài đặt lõi Arduino cho ESP32 để chúng ta có thể tải lên nó. Điều này có thể được thực hiện ở đây.

Sau đó, chúng ta có thể bắt đầu viết mã.

Đầu tiên, chúng ta cần gán các chân của mình mà chúng ta đã kết nối chân giữa của các 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;

onTime dài không dấu;

không dấu dài softPotTime;

Sau đó, chúng tôi có thể thiết lập các ghim của mình. Và chúng ta cần khởi động màn hình nối tiếp và thời gian của chúng ta.

void setup () {

onTime = millis ();

Serial.begin (115200);

Serial.println ("Khởi động chương trình");

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT); }

void getdata (byte pdata ) {

// Đọc giá trị ADC của soft pot

Sau đó, chúng tôi cần đọc các chân của mình để chúng tôi có thể nhận dữ liệu của mình.

int softPotADC1 = analogRead (SOFT_POT_PIN1);

nt softPotADC2 = analogRead (SOFT_POT_PIN2);

int softPotADC3 = analogRead (SOFT_POT_PIN3);

int softPotADC4 = analogRead (SOFT_POT_PIN4);

Sau đó, chúng tôi đặt các giá trị trong một danh sách để chúng tôi có thể dễ dàng xuất nó sau này.

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

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

int softpot = Tên ;

if (softpot> 10) {

pdata [0] = i;

pdata [1] = softpot;

pdata [2] = millis ();

} } }

}

Bước 3: Kết nối không dây ESP32 và RPI

Để kết nối không dây ESP32 và RPI, chúng tôi sẽ sử dụng một thư viện có tên là websocket. Để cài đặt thư viện này, chúng ta có thể lấy các tập tin tại đây. Chúng tôi sẽ cần thay đổi một số mã trong chính các tệp để sử dụng thư viện này cho ESP32.

Chúng tôi sẽ cần thay đổi MD5.c và MD5.h.

  • MD5Init thành MD5InitXXX
  • MD5Update to MD5UpdateXXX
  • MD5 Cuối cùng đến MD5FinalXXX

Chúng tôi cũng sẽ cần xóa các dòng avr / io.h trong các tệp sha1.

Sau đó, chúng tôi có thể thêm thư viện vào Arduino IDE của chúng tôi bằng cách phác thảo> bao gồm thư viện> thêm thư viện. ZIP và sau đó chúng tôi có thể chọn thư viện của bạn trong một tệp zip.

Sau đó, chúng ta có thể bắt đầu viết mã của mình.

Đầu tiên cho ESP32:

Bao gồm cả thư viện của chúng tôi

#include #include

Gán lại các chân của chúng tôi.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

Chỉ định máy chủ Wi-Fi của chúng tôi

Máy chủ WiFiServer (80);

Khởi động máy chủ websocket của chúng tôi

WebSocketServer webSocketServer;

Gán SSID của chúng tôi và mật khẩu wifi của bạn

const char * ssid = "wifi SSID của bạn";

const char * password = "mật khẩu wifi của bạn";

void setup () {

Thiết lập màn hình nối tiếp của bạn

Serial.begin (115200);

Thiết lập softpots của bạn

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT);

Khởi động Wi-Fi của chúng tôi và kết nối với nó

WiFi.begin (ssid, mật khẩu);

trong khi (WiFi.status ()! = WL_CONNECTED) {

chậm trễ (1000);

Serial.println ("Đang kết nối với WiFi.."); }

Serial.println ("Đã kết nối với mạng WiFi");

Serial.println (WiFi.localIP ());

server.begin (); chậm trễ (100); }

void getdata (char * pdata) {

Đọc dữ liệu của bạn

// Đọc giá trị ADC của 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);

Đặt dữ liệu vào danh sách và chuyển đổi nó sang hệ thập lục phân.

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

}

void loop () {

Kết nối khách hàng của bạn (rPI)

Máy khách WiFiClient = server.available ();

if (client.connected ()) {

chậm trễ (10);

if (webSocketServer.handshake (client)) {

Serial.println ("Máy khách đã kết nối");

Gửi và nhận dữ liệu.

while (client.connected ()) {

dữ liệu char [30];

getdata (dữ liệu);

Serial.println (dữ liệu);

webSocketServer.sendData (dữ liệu);

chậm trễ (10); // Cần có độ trễ để nhận dữ liệu chính xác}

Serial.println ("Máy khách đã ngắt kết nối");

chậm trễ (100); }

khác {

Serial.println ("shitsfuckedyo");

} } }

Sau đó, đối với rPI trong python:

Nhập thư viện của chúng tôi

nhập thời gian nhập web

Gán một biến thể toàn cầu i

i = 0

Đặt tối đa 200 tin nhắn mà chúng tôi có thể nhận được

nrOfMessages = 200

lớp Websocket ():

def _init _ (bản thân):

Khởi tạo websocket của chúng tôi và kết nối nó với ESP32 của chúng tôi

self.ws = websocket. WebSocket ()

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

Nhận dữ liệu của chúng tôi

def công việc (bản thân):

self.ws.send ("tin nhắn nr: 0")

result = self.ws.recv () time.sleep (0.5) trả về kết quả

Đóng websocket sau khi nhận được mọi thứ

đóng def (tự):

self.ws.close ()

Bước 4: Kết nối trang web và cơ sở dữ liệu của bạn

Đối với việc kết nối Cơ sở dữ liệu và trang web của chúng tôi, trước hết bạn cần tạo cơ sở dữ liệu của mình trên pi bằng cách cài đặt mariadb: sudo apt install mariadb.

Sau đó, bạn có thể gia nhập nó bằng cách thực hiện: sudo mariadb.

Sau đó, bạn cũng sẽ cần phải tạo trang web của mình. Bạn có thể làm điều này theo bất kỳ cách nào bạn muốn, nhưng bạn phải sử dụng Flask và bạn cần có một biểu mẫu trong HTML để dừng và bắt đầu dữ liệu của mình.

Sau đó, bạn có thể chèn mã này để kết nối cơ sở dữ liệu và trang web của mình (cả trang web và cơ sở dữ liệu của bạn đều phải ở trên pi của bạn, điều này có thể được thực hiện bằng cách sử dụng tab triển khai trong cài đặt của pycharm)

từ flkkext.mysql nhập MySQL

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

app.config ["MYSQL_DATABASE_DB"] = "tên cơ sở dữ liệu của bạn"

app.config ["MYSQL_DATABASE_USER"] = "người dùng cơ sở dữ liệu của bạn"

app.config ["MYSQL_DATABASE_PASSWORD"] = "mật khẩu cơ sở dữ liệu của bạn"

Chức năng lấy dữ liệu ra khỏi cơ sở dữ liệu của chúng tôi.

def get_data (sql, params = None):

conn = mysql.connect ()

cursor = conn.cursor ()

print ("lấy dữ liệu")

cố gắng:

print (sql)

cursor.execute (sql, params)

ngoại trừ Exception as e:

in (e)

trả về Sai

result = cursor.fetchall ()

dữ liệu =

cho hàng trong kết quả:

data.append (danh sách (hàng))

cursor.close ()

conn.close ()

trả lại dữ liệu

Chức năng chèn dữ liệu vào cơ sở dữ liệu của chúng tôi

def set_data (sql, params = None):

conn = mysql.connect ()

cursor = conn.cursor ()

cố gắng:

log.debug (sql)

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

log.debug ("SQL uitgevoerd")

ngoại trừ Exception as e:

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

trả về Sai

cursor.close ()

conn.close ()

trả về True

Chúng tôi cũng sẽ cần phân luồng ứng dụng của mình để bạn có thể làm những việc khác trong khi ghi.

class ThreadedTask (threading. Thread):

def _init _ (self,):

Thiết lập chuỗi

threading. Thread._ init _ (self)

Tạo danh sách để lưu giữ tất cả dữ liệu đã nhận của bạn

self.data_all =

def run (tự):

time.sleep (5)

Nhập mã python của riêng bạn nơi bạn nhận dữ liệu

import get_websocket

Nhận dữ liệu của bạn

w = accept_websocket. Websocket ()

Nối dữ liệu của bạn vào danh sách của bạn và in nó.

cho tôi trong phạm vi (0, 200):

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

print (self.data_all)

task = ThreadedTask ()

Sau đó, bạn có thể thực hiện task.run () để bắt đầu Luồng của mình và bắt đầu nhận dữ liệu.

Bước 5: Kết nối mọi thứ lại với nhau

Kết nối mọi thứ với nhau
Kết nối mọi thứ với nhau

Để chạy trang web của bạn từ Pi, bạn phải sử dụng một dịch vụ:

[Unit] Description = bản sao uWSGI để phân phát giao diện web project1

After = network.target

BindsTo = mysqld.service

After = mysqld.service

[Dịch vụ]

Thay đổi thành người dùng của bạn

Người dùng = pi

Nhóm = www-data

Tại đây, bạn phải nhập thư mục tệp Flask của mình

WorkingDirectory = / home / pi / project1 / web

Thư mục tệp ini của bạn có thể được tìm thấy sau.

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

[Cài đặt]

WantedBy = multi-user.target

uwsgi-flask.ini mà bạn cần đặt trong thư mục bạn đã chỉ định trong ExecStart ở trên

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

master = true process = 5

plugins = python3

socket = project1.sock chmod-socket = 660 chân không = true

die-on-term = true

Bây giờ bạn có thể đọc dữ liệu của mình và hiển thị nó trên trang web của bạn.

Bước 6: Thêm: Kết nối màn hình LCD

Thêm: Kết nối màn hình LCD
Thêm: Kết nối màn hình LCD
Thêm: Kết nối màn hình LCD
Thêm: Kết nối màn hình LCD
Thêm: Kết nối màn hình LCD
Thêm: Kết nối màn hình LCD

Chúng tôi có thể kết nối màn hình LCD để có thể hiển thị địa chỉ ip của Pi cho trang web của chúng tôi.

nhập RPi. GPIO dưới dạng thời gian nhập GPIO

nhập lệnh

GPIO.cleanup ()

D0 = 22

D1 = 5

D2 = 6

D3 = 13

D4 = 19

D5 = 26

D6 = 20

D7 = 21

danh sách = [22, 5, 6, 13, 19, 26, 20, 21]

E = 24

RS = 23

Màn hình lớp học:

def _init _ (bản thân):

GPIO.setmode (GPIO. BCM)

self.setup ()

# Bộ chức năng self.stuur_instructie (0x3f) # Hiển thị self.stuur_instructie (0x0c) #On + con trỏ self.stuur_instructie (0x01) @staticmethod def setup (): GPIO.setup (list, GPIO. OUT) GPIO.setup ([E, RS], GPIO. OUT)

def stuur_instructie (self, byte):

GPIO.output (E, GPIO. HIGH)

GPIO.output (RS, GPIO. LOW)

self.set_GPIO_bits (byte)

time.sleep (0,005)

GPIO.output (E, GPIO. LOW)

def stuur_teken (tự, char):

temp = ord (char)

GPIO.output (E, GPIO. HIGH)

GPIO.output (RS, GPIO. HIGH)

self.set_GPIO_bits (tạm thời)

time.sleep (0,005)

GPIO.output (E, GPIO. LOW)

def set_GPIO_bits (self, byte):

cho tôi trong phạm vi (0, 8):

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

GPIO.output (danh sách , GPIO. LOW)

khác:

GPIO.output (danh sách , GPIO. HIGH)

def main ():

s = Màn hình ()

teken = "Địa chỉ IP cục bộ:"

cho chữ cái trong teken:

s.stuur_teken (thư)

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

in (teken2)

s.stuur_instructie (0xc0)

cho letter2 trong teken2:

s.stuur_teken (letter2)

if _name_ == '_main_': # Chương trình bắt đầu từ đây

cố gắng:

chủ chốt()

ngoại trừ KeyboardInterrupt:

đi qua

Sau đó, chúng ta có thể tạo một dịch vụ để khởi động màn hình LCD khi khởi động.

Đề xuất: