İçindekiler:

ESP32 ile Kemanda Parmak Pozisyonlarını Ölçme: 6 Adım
ESP32 ile Kemanda Parmak Pozisyonlarını Ölçme: 6 Adım

Video: ESP32 ile Kemanda Parmak Pozisyonlarını Ölçme: 6 Adım

Video: ESP32 ile Kemanda Parmak Pozisyonlarını Ölçme: 6 Adım
Video: TİKTOK DİLENCİLERİ PART 1 DAHA NELER DEDİRTEN Video #tiktok #tiktokvideo #tiktokvideo 2024, Temmuz
Anonim
ESP32 ile Kemanda Parmak Pozisyonlarını Ölçme
ESP32 ile Kemanda Parmak Pozisyonlarını Ölçme
ESP32 ile Kemanda Parmak Pozisyonlarını Ölçme
ESP32 ile Kemanda Parmak Pozisyonlarını Ölçme

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

Malzemeler ve Araçlar
Malzemeler ve Araçlar

Bu projeyi inşa etmenin özelliklerine girmeden önce birkaç şeye ihtiyacımız var.

  1. 4x Lineer Softpot: Bir parmağın konumunu ölçmek için Lineer Potansiyometreler (bir kemanın 4 teli vardır)
  2. ESP32: Lineer softpot'lardan verileri okumak için bir ESP32 modülü.
  3. 4/4 keman: lineer softpot'ları üste yerleştirmek için bir keman.
  4. SD kartlı bir Raspberry Pi: veritabanımızı ve web sitemizi depolayacak bir ahududu pi.
  5. 10k potansiyometre: LCD'nin parlaklığı için bir potansiyometre
  6. LCD ekran: rPi'nin ip adreslerini göstermek için bir LCD ekran
  7. Lehimleme Kiti: Tüm elemanların birlikte lehimlenmesi için
  8. Erkek-erkek teller ve erkek-dişi teller: Tüm elemanları bağlamak için kablolar
  9. Mikro USB kablosu: ESP32'ye güç sağlamak için

Adım 2: Softpot'ları ESP32'ye Bağlama

Softpot'ları ESP32'ye Bağlama
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

Her Şeyi Birbirine Bağlamak
Her Şeyi Birbirine 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

Ekstra: LCD Ekranı Bağlama
Ekstra: LCD Ekranı Bağlama
Ekstra: LCD Ekranı Bağlama
Ekstra: LCD Ekranı Bağlama
Ekstra: LCD Ekranı Bağlama
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: