Mục lục:
- Bước 1: Vật liệu và công cụ
- Bước 2: Kết nối Softpots với ESP32
- Bước 3: Kết nối không dây ESP32 và RPI
- Bước 4: Kết nối trang web và cơ sở dữ liệu của bạn
- Bước 5: Kết nối mọi thứ lại với nhau
- Bước 6: Thêm: Kết nối màn hình LCD
Video: Đo vị trí ngón tay trên đàn Violin với ESP32: 6 bước
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-30 13:34
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ụ
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.
- 4x Linear Softpot: Chiết áp tuyến tính để đo vị trí của ngón tay (đàn violin có 4 dây)
- ESP32: Một mô-đun ESP32 để đọc dữ liệu từ các softpots tuyến tính.
- 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.
- 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.
- Chiết áp 10k: chiết áp cho độ sáng của màn hình LCD
- Màn hình LCD: một màn hình LCD để hiển thị cho các địa chỉ ip của rPi
- Bộ hàn: Để hàn tất cả các phần tử togheter
- Dây nam - nam và dây nam - nữ: Cáp để kết nối tất cả các phần tử
- Cáp micro USB: Để cấp nguồn cho ESP32
Bước 2: 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
Để 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
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:
Hộp đàn Violin thông minh: 7 bước (có hình ảnh)
Smart Violin Case: Âm nhạc là một phần quan trọng trong cuộc sống của tôi. Tôi đã chơi violin được 10 năm, nhưng có 1 vấn đề. Tôi không bao giờ biết mình đã luyện tập trong bao lâu. Trong dự án của mình, tôi sẽ theo dõi nhiệt độ, độ ẩm và thời gian luyện tập. Đó là một chuyên gia độc lập
Đấu vật ngón tay cái gây sốc: Chiến thắng của ngón tay cái chiếu sáng (V.O.L.T.): 6 bước
Đấu vật ngón tay cái gây sốc: Chiến thắng của ngón tay cái chiếu sáng (V.O.L.T.): Dit apparaat geeft duimpje westelen een nieuwe twist: de verliezer krijgt een schok! Daarnaast telt het apparaat zelf af tot 3, zodat je nooit meer vals kan spelen
Theo dõi thời tiết M5Stack M5stick C dựa trên ESP32 với DHT11 - Theo dõi nhiệt độ độ ẩm & chỉ số nhiệt trên M5stick-C với DHT11: 6 bước
Theo dõi thời tiết M5Stack M5stick C dựa trên ESP32 với DHT11 | Theo dõi nhiệt độ độ ẩm và chỉ số nhiệt trên M5stick-C Với DHT11: Xin chào các bạn, trong phần hướng dẫn này, chúng ta sẽ học cách giao tiếp cảm biến nhiệt độ DHT11 với m5stick-C (một bảng phát triển của m5stack) và hiển thị nó trên màn hình của m5stick-C. Vì vậy, trong hướng dẫn này, chúng ta sẽ đọc nhiệt độ, độ ẩm & nhiệt tôi
Một ổ đĩa ngón tay cái ngon: 5 bước
A Delicious Thumb Drive: Cách làm bất tử một cốc nước giải khát ngon bằng cách tạo nó vào ổ USB Thumb. Điều này được lấy cảm hứng từ tài liệu hướng dẫn của larskflem Cách làm cho một món quà USB trở nên đáng nhớ hơn. Chi phí của nó cũng rất thấp (ngoại trừ chính ổ đĩa) ) Mục đích của t
Điện thoại di động cho bàn tay đeo găng hoặc ngón tay béo: 3 bước
Điện thoại di động cho Bàn tay Găng tay hoặc Ngón tay béo: Tôi có một chiếc Sony Ericsson C702, một chiếc điện thoại thân thiện với hoạt động ngoài trời / thể thao tuyệt vời. Nó không thấm nước & chống bụi và có GPS tích hợp. Tôi sử dụng điện thoại của mình với các ứng dụng GPS khác nhau để ghi lại và xuất bản các chuyến đi xe đạp leo núi của tôi trên web trong thời gian thực. NS