İçindekiler:
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-23 15:13
Bir kemancı olarak her zaman, parmaklarımın kemandaki konumunu çok hassas bir şekilde gösterebilecek bir uygulama veya araç istedim. Bu proje ile bunu oluşturmaya çalıştım. Bu bir prototip olmasına rağmen, yine de birçok özellik ekleyebilirsiniz.
Ayrıca ESP32 ve rPI'yi ayırmaya çalıştım ve böylece ESP32'nin rPi'ye kablosuz veri göndermesini sağladım. Muhtemelen bu projeyle ilgili en zor şey budur.
Bu projenin sonunda bilgisayarınızda hiçbir şeyin depolanmaması da çok önemlidir, ancak ya rPI ya da ESP32'dedir.
Adım 1: Malzemeler ve Araçlar
Bu projeyi inşa etmenin özelliklerine girmeden önce birkaç şeye ihtiyacımız var.
- 4x Lineer Softpot: Bir parmağın konumunu ölçmek için Lineer Potansiyometreler (bir kemanın 4 teli vardır)
- ESP32: Lineer softpot'lardan verileri okumak için bir ESP32 modülü.
- 4/4 keman: lineer softpot'ları üste yerleştirmek için bir keman.
- SD kartlı bir Raspberry Pi: veritabanımızı ve web sitemizi depolayacak bir ahududu pi.
- 10k potansiyometre: LCD'nin parlaklığı için bir potansiyometre
- LCD ekran: rPi'nin ip adreslerini göstermek için bir LCD ekran
- Lehimleme Kiti: Tüm elemanların birlikte lehimlenmesi için
- Erkek-erkek teller ve erkek-dişi teller: Tüm elemanları bağlamak için kablolar
- Mikro USB kablosu: ESP32'ye güç sağlamak için
Adım 2: Softpot'ları ESP32'ye Bağlama
Öncelikle softpotlarımızı esp32'ye bağlamamız gerekiyor. Sol ve sağ pinleri sırasıyla 5V ve GND'ye bağlıyoruz. Orta pimi ESP32'deki bir analog pime bağlarız. Ayrıca 10k ohm dirençli orta pini de bağlayıp bunu GND'ye bağlamamız gerekiyor. Bu, softpot'ların çıktısının rastgele değer döndürmemesi içindir.
Daha sonra mikro usb kablosu ile ESP32'yi pc'mize bağlayarak kod yükleyebiliriz. ESP32'yi programlamak için Arduino IDE'yi kullanacağız. Ama önce ESP32 için Arduino çekirdeğini yüklememiz gerekiyor ki ona yükleyebilelim. Bu burada yapılabilir.
Ardından kod yazmaya başlayabiliriz.
İlk olarak softpotların orta pinimizi bağladığımız pinlerimizi atamamız gerekiyor.
const int SOFT_POT_PIN1 = 34;
const int SOFT_POT_PIN2 = 35;
const int SOFT_POT_PIN3 = 32;
const int SOFT_POT_PIN4 = 33;
imzasız uzun onTime;
imzasız uzun softPotTime;
Daha sonra pinlerimizi kurabiliriz. Ve seri monitörümüzü ve zamanımızı başlatmamız gerekiyor.
geçersiz kurulum() {
onTime = millis();
Seri.başla(115200);
Serial.println("Program başlangıcı");
pinMode(SOFT_POT_PIN1, INPUT);
pinMode(SOFT_POT_PIN2, INPUT);
pinMode(SOFT_POT_PIN3, INPUT);
pinMode(SOFT_POT_PIN4, GİRİŞ); }
void getdata(byte pdata) {
// Soft pot'un ADC değerini oku
Ardından verilerimizi alabilmemiz için pinlerimizi okumamız gerekiyor.
int softPotADC1 = analogRead(SOFT_POT_PIN1);
nt softPotADC2 = analogRead(SOFT_POT_PIN2);
int softPotADC3 = analogRead(SOFT_POT_PIN3);
int softPotADC4 = analogRead(SOFT_POT_PIN4);
Sonra değerleri bir listeye koyarız, böylece daha sonra kolayca çıktısını alabiliriz.
for (int i=0; i < 4; i++){
int İsimler = {softPotADC1, softPotADC2, softPotADC3, softPotADC4};
int softpot = İsimler;
if (softpot > 10){
pdata[0] = ben;
pdata[1] = yumuşak nokta;
pdata[2] = millis();
} } }
}
Adım 3: ESP32 ve RPI'yi Kablosuz Olarak Bağlama
ESP32 ve RPI'yi kablosuz olarak bağlamak için websocket adlı bir kitaplık kullanacağız. Bu kütüphaneyi kurmak için dosyaları buradan alabiliriz. Bu kütüphaneyi ESP32 için kullanabilmek için dosyaların kendisindeki bazı kodları değiştirmemiz gerekecek.
MD5.c ve MD5.h'yi değiştirmemiz gerekecek.
- MD5Init'ten MD5InitXXX'e
- MD5UpdateXXX için MD5Update
- MD5Final'den MD5FinalXXX'e
Ayrıca sha1 dosyalarındaki avr/io.h satırlarını da silmemiz gerekecek.
Ardından Sketch > include library > add. ZIP library ile kütüphaneyi Arduino IDE'mize ekleyebiliriz ve ardından kütüphanenizi bir zip dosyasında seçebiliriz.
Bundan sonra kodumuzu yazmaya başlayabiliriz.
ESP32 için ilk:
Kütüphanemiz dahil
#include #include
Pinlerimizi tekrar atamak.
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 sunucumuzu atama
WiFiSunucu sunucusu(80);
Websocket sunucumuzu başlatıyoruz
WebSocketServer webSocketServer;
Wifi ağınızın SSID'sini ve şifresini atama
const char* ssid = "wifi SSID'niz";
const char* password = "wifi şifreniz";
geçersiz kurulum() {
Seri monitörünüzü ayarlama
Seri.başla(115200);
Softpot'larınızı ayarlama
pinMode(SOFT_POT_PIN1, INPUT);
pinMode(SOFT_POT_PIN2, INPUT);
pinMode(SOFT_POT_PIN3, INPUT);
pinMode(SOFT_POT_PIN4, GİRİŞ);
Wi-Fi'mizi başlatmak ve ona bağlanmak
WiFi.begin(ssid, şifre);
while (WiFi.status() != WL_CONNECTED) {
gecikme(1000);
Serial.println("WiFi'ya Bağlanıyor.."); }
Serial.println("WiFi ağına bağlı");
Serial.println(WiFi.localIP());
server.begin(); gecikme(100); }
geçersiz getdata(char *pdata) {
Verilerinizi okumak
// Soft pot'un ADC değerini oku
int softPotADC1 = analogRead(SOFT_POT_PIN1);
int softPotADC2 = analogRead(SOFT_POT_PIN2);
int softPotADC3 = analogRead(SOFT_POT_PIN3);
int softPotADC4 = analogRead(SOFT_POT_PIN4);
Verileri bir listeye yerleştirmek ve onaltılıya dönüştürmek.
sprintf(pdata, "%x, %x, %x, %x, %x", softPotADC1, softPotADC2, softPotADC3, softPotADC4, millis());
}
boşluk döngüsü () {
İstemcinizi bağlama (rPI)
WiFiClient istemcisi = server.available();
if (client.connected()) {
gecikme(10);
if (webSocketServer.handshake(istemci)) {
Serial.println("İstemci bağlandı");
Veri gönderme ve alma.
while (client.connected()) {
karakter verileri[30];
getdata(veri);
Seri.println(veri);
webSocketServer.sendData(veri);
gecikme(10); // Verileri doğru almak için gereken gecikme }
Serial.println("İstemci bağlantısı kesildi");
gecikme(100); }
Başka {
Serial.println("sıçmış");
} } }
Ardından python'daki rPI için:
Kitaplıklarımızı içe aktarma
websocketimport zamanını içe aktar
Globale variabel i atama
ben = 0
Alabileceğimiz maksimum 200 mesaj belirleme
nrOfMessages = 200
sınıf Websocket():
tanım _init_(kendi):
Web soketimizi başlatma ve onu ESP32'mize bağlama
self.ws = websocket. WebSocket()
self.ws.connect("ws://172.30.248.48/")
Verilerimizi almak
def work(self):
self.ws.send("mesaj no: 0")
sonuç = self.ws.recv() time.sleep(0.5) dönüş sonucu
Her şeyi aldıktan sonra websocket'i kapatma
def close(self):
self.ws.close()
Adım 4: Web Sitenizi ve Veritabanınızı Bağlama
Veritabanımızı ve web sitemizi bağlamaya gelince, öncelikle mariadb: sudo apt install mariadb'yi yükleyerek veritabanınızı pi üzerinde oluşturmanız gerekir.
O zaman şunu yaparak erişebilirsiniz: sudo mariadb.
Ardından, web sitenizi de oluşturmanız gerekecektir. Bunu istediğiniz gibi yapabilirsiniz, ancak Flask kullanmanız ve verilerinizi durdurmak ve başlatmak için HTML'nizde bir form olması gerekir.
Ardından, veritabanınızı ve web sitenizi bağlamak için bu kodu ekleyebilirsiniz (hem web sitenizin hem de veritabanınızın her ikisinin de pi'nizde olması gerekir, bu, pycharm ayarlarındaki dağıtım sekmesini kullanarak yapılabilir)
flaskext.mysql'den MySQL'i içe aktarın
app.config["MYSQL_DATABASE_HOST"] = "localhost"
app.config["MYSQL_DATABASE_DB"] = "veritabanı adınız"
app.config["MYSQL_DATABASE_USER"] = "veritabanı kullanıcınız"
app.config["MYSQL_DATABASE_PASSWORD"] = "veritabanı şifreniz"
Veritabanımızdan veri almak için işlev.
def get_data(sql, params=Yok):
bağlantı = mysql.connect()
imleç = bağlantı.cursor()
print("veri alma")
denemek:
yazdır(sql)
imleç.execute(sql, paragraflar)
e olarak İstisna hariç:
yazdır(e)
dönüş Yanlış
sonuç = imleç.fetchall()
veri =
sonuç satırı için:
data.append(list(satır))
imleç.kapat()
bağlantı.kapat()
veri döndürme
Veritabanımıza veri ekleme işlevi
def set_data(sql, params=Yok):
bağlantı = mysql.connect()
imleç = bağlantı.cursor()
denemek:
log.debug(sql)
imleç.execute(sql, params) conn.commit()
log.debug("SQL uitgevoerd")
e olarak İstisna hariç:
log.exception("Fout bij uitvoeren van sql: {0})".format(e))
dönüş Yanlış
imleç.kapat()
bağlantı.kapat()
dönüş True
Ayrıca, kayıt yaparken başka şeyler yapabilmeniz için uygulamamızı işlememiz gerekecek.
class ThreadedTask(threading. Thread):
tanım _init_(kendi,):
İplik kurma
threading. Thread._init_(self)
Alınan tüm verilerinizi tutmak için bir liste oluşturma
self.data_all =
def run(self):
zaman.uyku(5)
Verileri aldığınız kendi python kodunuzu içe aktarın
Receive_websocket'i içe aktar
Verilerinizi alın
w = alıcı_websocket. Websocket()
Verilerinizi listenize ekleyin ve yazdırın.
i aralığında (0, 200):
self.data_all.append(w.work().split(", "))
print(self.data_all)
görev = ThreadedTask()
Ardından, Thread'inizi başlatmak ve veri almaya başlamak için task.run() işlevini yapabilirsiniz.
Adım 5: Her Şeyi Bir Araya Bağlamak
Web sitenizi Pi'nizden çalıştırmak için bir hizmet kullanmanız gerekir:
[Unit]Description=uWSGI örneği, proje1 web arayüzüne hizmet edecek
Sonra=network.hedef
BindsTo=mysqld.service
Sonra=mysqld.service
[Hizmet]
Kullanıcınıza göre değiştirin
kullanıcı=pi
Grup=www-veri
Burada Flask dosyanızın dizini girmelisiniz.
WorkingDirectory=/home/pi/project1/web
Daha sonra bulunabilecek ini dosyanızın dizini.
ExecStart=/usr/bin/uwsgi --ini /home/pi/project1/conf/uwsgi-flask.ini
[Düzenlemek]
WantedBy=çok kullanıcılı.hedef
Yukarıdaki ExecStart'ta belirttiğiniz dizine yerleştirmeniz gereken uwsgi-flask.ini
[uwsgi]modül = web:app sanalenv = /home/pi/project1/env
master = gerçek süreçler = 5
eklentiler = python3
soket = proje1.sock chmod-socket = 660 vakum = doğru
zamanında ölmek = doğru
Artık verilerinizi okuyabilir ve web sitenizde görüntüleyebilirsiniz.
6. Adım: Ekstra: LCD Ekranı Bağlama
Web sitemiz için Pi'mizin ip adresini gösterebilmemiz için bir LCD ekran bağlayabiliriz.
RPi. GPIO'yu GPIOimport zamanı olarak içe aktar
komutları içe aktar
GPIO.cleanup()
D0 = 22
D1 = 5
D2 = 6
D3 = 13
D4 = 19
D5 = 26
D6 = 20
D7 = 21
liste = [22, 5, 6, 13, 19, 26, 20, 21]
E = 24
RS = 23
sınıf Ekranı:
tanım _init_(kendi):
GPIO.setmode(GPIO. BCM)
self.setup()
#Fonksiyon seti self.stuur_instructie(0x3f) #Display self.stuur_instructie(0x0c) #On + imleç self.stuur_instructie(0x01) @staticmethod def setup(): GPIO.setup(list, GPIO. OUT) GPIO.setup([E, RS], GPIO. OUT)
tanım stuur_instructie(kendi, bayt):
GPIO.output(E, GPIO. HIGH)
GPIO.output(RS, GPIO. LOW)
self.set_GPIO_bits(bayt)
zaman.uyku(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(temp)
zaman.uyku(0.005)
GPIO.output(E, GPIO. LOW)
def set_GPIO_bits(self, byte):
i aralığında (0, 8):
if (bayt & (2**i)) == 0:
GPIO.output(list, GPIO. LOW)
Başka:
GPIO.output(liste, GPIO. HIGH)
tanım ana():
s = Ekran()
teken = "Yerel IP adresi:"
teken'deki mektup için:
s.stuur_teken(harf)
teken2 = commands.getoutput("ip addr show wlan0 | grep -Po 'inet \K[d.]+'")
yazdır(teken2)
s.stuur_instructie(0xc0)
teken2'deki letter2 için:
s.stuur_teken(harf2)
if _name_ == '_main_': #Program buradan başlayarak
denemek:
ana()
KeyboardInterrupt hariç:
geçmek
Ardından, başlangıçta LCD'yi başlatmak için bir hizmet oluşturabiliriz.
Önerilen:
Arduino UNO ile Arayüzleme Kapasitif Parmak İzi Sensörü: 7 Adım
Arduino UNO ile Arayüzleme Kapasitif Parmak İzi Sensörü: Hey, naber beyler! Akarsh burada CETech'ten. Bugün projelerimize koruyucu bir katman ekleyeceğiz. Endişelenme, aynısı için herhangi bir koruma atamayacağız. DFRobot.So
Arduino ile Parmak İzi Sensörü: 5 Adım
Arduino ile Parmak İzi Sensörü: Merhaba, Bu yazımızda Arduino ile parmak izi sensörünün nasıl kullanılacağını göreceğiz. Parmak İzi sensörü ile evinize, ofisinize, garajınıza ve çok daha fazlasına güvenlik ekleyebilir ve kilitleyebilirsiniz. Sadece güvenlikle ilgili değil, bu modülü istediğiniz yerde kullanabilirsiniz
Arduino ile Parmak İzi Dolabı: 7 Adım
Arduino ile Parmak İzi Dolabı: Merhaba, Bu yazımızda biyometrik Parmak İzi deseni üzerinde çalışan Güvenlik Dolabı yapacağız.Umarım beğenirsiniz. #nasıl #yapılır #Parmak İzi #Dolap
Arduino ile Toprak Nemini Ölçme: 6 Adım
Arduino ile Toprak Nemini Ölçme: Bu hızlı eğitimde, arduino kullanarak bir Toprak Nem Sensörünü nasıl okuyacağınızı ve Arduino Seri Monitörde Toprak Nem Seviyesini nasıl yazdıracağınızı göstereceğim. Sinhala frim'de yazdığım orijinal yazıya bu linkten ulaşabilirsiniz
Arduino İle Taşınabilir Mesafe Ölçme Cihazı!: 9 Adım (Resimli)
Arduino ile Taşınabilir Mesafe Ölçme Cihazı!: Bu Talimatı okurken, aralarındaki mesafeleri ölçmek için kullanabileceğiniz bir yakınlık sensörünün nasıl oluşturulacağını ve neyi işaret ederseniz edin öğreneceksiniz. PICO, Arduino uyumlu kart ve halihazırda mevcut olan diğer birkaç elektronik parçayı kullanır