فهرست مطالب:

اندازه گیری موقعیت های انگشت روی ویولن با ESP32: 6 مرحله
اندازه گیری موقعیت های انگشت روی ویولن با ESP32: 6 مرحله

تصویری: اندازه گیری موقعیت های انگشت روی ویولن با ESP32: 6 مرحله

تصویری: اندازه گیری موقعیت های انگشت روی ویولن با ESP32: 6 مرحله
تصویری: انگشت گذاری روی ویولن 🎻 جای نتها رو پیدا کن 2024, جولای
Anonim
اندازه گیری موقعیت های انگشت روی ویولن با ESP32
اندازه گیری موقعیت های انگشت روی ویولن با ESP32
اندازه گیری موقعیت های انگشت روی ویولن با ESP32
اندازه گیری موقعیت های انگشت روی ویولن با ESP32

من به عنوان نوازنده ویولن همیشه یک برنامه یا ابزاری می خواستم که بتواند موقعیت انگشتانم روی ویولن را بسیار دقیق به من نشان دهد. با این پروژه سعی کردم این را بسازم. اگرچه این یک نمونه اولیه است و شما هنوز هم می توانید بسیاری از ویژگی ها را اضافه کنید.

من همچنین سعی کردم ESP32 و rPI را جدا کنم و بنابراین ESP32 را وادار به ارسال اطلاعات بی سیم به rPi کردم. که احتمالاً سخت ترین چیز در مورد این پروژه است.

همچنین بسیار مهم است که در پایان این پروژه هیچ چیزی در رایانه شما ذخیره نشود ، اما روی rPI یا ESP32 باشد.

مرحله 1: مواد و ابزارها

مواد و ابزار
مواد و ابزار

قبل از پرداختن به مشخصات ساخت این پروژه ، ما به چند مورد نیاز داریم.

  1. 4x Softpot خطی: پتانسیومترهای خطی برای اندازه گیری موقعیت انگشت (ویولن دارای 4 سیم است)
  2. ESP32: یک ماژول ESP32 برای خواندن داده ها از نرم افزارهای خطی.
  3. ویولن 4/4: ویولونی برای قرار دادن گلدان های نرم خطی در بالای صفحه.
  4. Raspberry Pi با کارت SD: تمشک pi که پایگاه داده و وب سایت ما را ذخیره می کند.
  5. پتانسیومتر 10k: یک پتانسیومتر برای روشنایی LCD
  6. صفحه LCD: یک صفحه LCD برای نشان دادن به مخاطبین ip rPi
  7. کیت لحیم کاری: برای لحیم کاری همه عناصر با هم
  8. سیم های مردانه به مرد و سیم های زن به زن: کابل هایی برای اتصال همه عناصر
  9. کابل میکرو USB: برای تغذیه ESP32

مرحله 2: اتصال Softpots به ESP32

اتصال Softpots به ESP32
اتصال Softpots به ESP32

اول از همه ما باید softpot های خود را به esp32 متصل کنیم. ما پین های چپ و راست را به ترتیب به 5V و GND متصل می کنیم. پین وسط را به پین آنالوگ در ESP32 وصل می کنیم. همچنین باید پین وسط را با مقاومت 10k اهم متصل کرده و آن را به GND وصل کنیم. این به این دلیل است که خروجی ما از softpots مقدار تصادفی را بر نمی گرداند.

سپس ESP32 را با کابل micro usb به رایانه خود وصل می کنیم تا بتوانیم کد را روی آن بارگذاری کنیم. برای برنامه نویسی ESP32 از Arduino IDE استفاده خواهیم کرد. اما ابتدا باید هسته Arduino را برای ESP32 نصب کنیم تا بتوانیم روی آن بارگذاری کنیم. این را می توان در اینجا انجام داد.

سپس می توانیم شروع به نوشتن کد کنیم.

ابتدا باید پین های خود را که پین وسط خود را در سافت پات ها به آنها متصل کرده ایم ، اختصاص دهیم.

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 ؛

softPotTime طولانی بدون علامت ؛

سپس می توانیم پین های خود را تنظیم کنیم. و ما باید مانیتور سریال و زمان خود را شروع کنیم.

void setup () {

onTime = millis ()؛

Serial.begin (115200) ؛

Serial.println ("شروع برنامه") ؛

pinMode (SOFT_POT_PIN1 ، INPUT) ؛

pinMode (SOFT_POT_PIN2 ، INPUT) ؛

pinMode (SOFT_POT_PIN3 ، INPUT) ؛

pinMode (SOFT_POT_PIN4 ، INPUT) ؛ }

void getdata (بایت pdata ) {

// مقدار ADC قابلمه نرم را بخوانید

سپس باید پین های خود را بخوانیم تا بتوانیم داده های خود را دریافت کنیم.

int softPotADC1 = analogRead (SOFT_POT_PIN1) ؛

nt softPotADC2 = analogRead (SOFT_POT_PIN2) ؛

int softPotADC3 = analogRead (SOFT_POT_PIN3) ؛

int softPotADC4 = analogRead (SOFT_POT_PIN4) ؛

سپس مقادیر را در یک لیست قرار می دهیم تا بعداً بتوانیم به راحتی آن را خروجی دهیم.

برای (int i = 0 ؛ i <4؛ i ++) {

int Names = {softPotADC1 ، softPotADC2 ، softPotADC3 ، softPotADC4} ؛

int softpot = نام ؛

if (softpot> 10) {

pdata [0] = i ؛

pdata [1] = softpot ؛

pdata [2] = millis ()؛

} } }

}

مرحله 3: اتصال ESP32 و RPI به صورت بی سیم

برای اتصال بی سیم ESP32 و RPI ، از کتابخانه ای به نام websocket استفاده می کنیم. برای نصب این کتابخانه ، می توانیم فایل ها را از اینجا دریافت کنیم. برای استفاده از این کتابخانه برای ESP32 ، باید برخی از کدها را در خود فایلها تغییر دهیم.

ما باید MD5.c و MD5.h را تغییر دهیم.

  • MD5Init به MD5InitXXX
  • MD5 به روز رسانی به MD5UpdateXXX
  • MD5Final به MD5FinalXXX

همچنین باید خطوط avr/io.h را در فایل های sha1 حذف کنیم.

سپس می توانیم کتابخانه را با طرح> شامل کتابخانه> افزودن کتابخانه ZIP به Arduino IDE خود اضافه کنیم و سپس کتابخانه شما را در یک فایل فشرده انتخاب کنیم.

پس از آن می توانیم نوشتن کد خود را شروع کنیم.

ابتدا برای ESP32:

از جمله کتابخانه ما

#شامل #شامل شود

دوباره پین های خود را اختصاص می دهیم.

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 ما

سرور WiFiServer (80) ؛

راه اندازی سرور شبکه وب ما

WebSocketServer webSocketServer؛

اختصاص SSID و رمز عبور وای فای شما

const char* ssid = "SSID فای شما"؛

const char* رمز عبور = "رمز وای فای شما"؛

void setup () {

مانیتور سریال خود را راه اندازی کنید

Serial.begin (115200) ؛

سافت پات های خود را راه اندازی کنید

pinMode (SOFT_POT_PIN1 ، INPUT) ؛

pinMode (SOFT_POT_PIN2 ، INPUT) ؛

pinMode (SOFT_POT_PIN3 ، INPUT) ؛

pinMode (SOFT_POT_PIN4 ، INPUT) ؛

وای فای ما را راه اندازی کرده و به آن متصل می شویم

WiFi.begin (ssid ، رمز عبور) ؛

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

تاخیر (1000) ؛

Serial.println ("اتصال به WiFi..") ؛ }

Serial.println ("متصل به شبکه WiFi") ؛

Serial.println (WiFi.localIP ()) ؛

server.begin ()؛ تأخیر (100) ؛ }

void getdata (char *pdata) {

خواندن اطلاعات شما

// مقدار ADC قابلمه نرم را بخوانید

int softPotADC1 = analogRead (SOFT_POT_PIN1) ؛

int softPotADC2 = analogRead (SOFT_POT_PIN2) ؛

int softPotADC3 = analogRead (SOFT_POT_PIN3) ؛

int softPotADC4 = analogRead (SOFT_POT_PIN4) ؛

قرار دادن داده ها در یک لیست و تبدیل آنها به هگزا دسیمال.

sprintf (pdata ، "٪ x ،٪ x ،٪ x ،٪ x ،٪ x" ، softPotADC1 ، softPotADC2 ، softPotADC3 ، softPotADC4 ، millis ()) ؛

}

حلقه خالی () {

اتصال مشتری (rPI)

مشتری WiFiClient = server.available ()؛

if (client.connected ()) {

تأخیر (10) ؛

if (webSocketServer.handshake (مشتری)) {

Serial.println ("مشتری متصل است") ؛

ارسال و دریافت داده ها.

while (client.connected ()) {

داده های char [30]؛

getdata (داده) ؛

Serial.println (داده) ؛

webSocketServer.sendData (داده) ؛

تأخیر (10) ؛ // تأخیر مورد نیاز برای دریافت صحیح داده ها}

Serial.println ("مشتری قطع شده است") ؛

تأخیر (100) ؛ }

دیگری {

Serial.println ("shitsfuckedyo")؛

} } }

سپس برای rPI در پایتون:

وارد کردن کتابخانه های ما

واردات websocketimport زمان

تعیین یک variabel globale i

من = 0

تنظیم حداکثر 200 پیام که می توانیم دریافت کنیم

nrOfMessages = 200

وب سایت کلاس ():

def _init _ (خود):

راه اندازی شبکه اینترنتی ما و اتصال آن به ESP32

self.ws = websocket. WebSocket ()

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

دریافت داده های ما

کار دف (خود):

self.ws.send ("شماره پیام: 0")

result = self.ws.recv () time.sleep (0.5) نتیجه بازگشت

بستن شبکه وب پس از دریافت همه چیز

def close (خود):

self.ws. close ()

مرحله 4: اتصال وب سایت و پایگاه داده

در مورد اتصال پایگاه داده و وب سایت ما ، قبل از هر چیز باید پایگاه داده خود را روی pi با نصب mariadb: sudo apt install mariadb ایجاد کنید.

سپس می توانید با انجام این کار به آن دسترسی پیدا کنید: sudo mariadb.

سپس شما همچنین باید وب سایت خود را ایجاد کنید. شما می توانید این کار را هر طور که دوست دارید انجام دهید ، اما باید از Flask استفاده کنید و باید یک فرم در HTML خود برای توقف و شروع داده های خود داشته باشید.

سپس می توانید این کد را برای اتصال پایگاه داده و وب سایت خود وارد کنید (هر دو وب سایت و پایگاه داده شما باید هر دو در pi شما باشند ، این را می توان با استفاده از برگه استقرار در تنظیمات pycharm انجام داد)

از flaskext.mysql وارد کردن MySQL

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

app.config ["MYSQL_DATABASE_DB"] = "نام پایگاه داده شما"

app.config ["MYSQL_DATABASE_USER"] = "کاربر پایگاه داده شما"

app.config ["MYSQL_DATABASE_PASSWORD"] = "گذرواژه پایگاه داده شما"

عملکردی برای خارج کردن داده ها از پایگاه داده ما.

def get_data (sql ، params = هیچکدام):

conn = mysql.connect ()

مکان نما = conn.cursor ()

چاپ ("دریافت داده")

تلاش كردن:

چاپ (sql)

cursor.execute (sql ، params)

به استثنای e:

چاپ (ه)

بازگشت False

result = cursor.fetchall ()

داده =

برای ردیف در نتیجه:

data.append (لیست (سطر))

cursor.close ()

conn.close ()

بازگشت داده ها

عملکردی برای قرار دادن داده ها در پایگاه داده ما

def set_data (sql ، params = هیچکدام):

conn = mysql.connect ()

مکان نما = conn.cursor ()

تلاش كردن:

log.debug (sql)

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

log.debug ("SQL uitgevoerd")

به استثنای e:

log.exception ("Fout bij uitvoeren van sql: {0})". قالب (ه))

بازگشت False

cursor.close ()

conn.close ()

بازگشت True

ما همچنین باید برنامه خود را به صورت موضوعی قرار دهیم تا بتوانید کارهای دیگری را در حین ضبط انجام دهید.

کلاس ThreadedTask (threading. Thread):

def _init _ (خود ،):

راه اندازی موضوع

thread. موضوع._ init _ (خود)

ایجاد یک لیست برای نگهداری همه داده های دریافتی شما

self.data_all =

def run (خود):

زمان خواب (5)

کد پایتون خود را در جایی که داده ها را دریافت می کنید وارد کنید

Receive_websocket را وارد کنید

داده های خود را دریافت کنید

w = دریافت_شبکه. وبسایت ()

داده های خود را در لیست خود قرار دهید و چاپ کنید.

برای i در محدوده (0 ، 200):

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

چاپ (self.data_all)

task = ThreadedTask ()

سپس می توانید task.run () را برای شروع موضوع و دریافت داده ها انجام دهید.

مرحله 5: همه چیز را به هم متصل کنید

اتصال همه چیز به یکدیگر
اتصال همه چیز به یکدیگر

برای اجرای وب سایت خود از Pi شما باید از یک سرویس استفاده کنید:

[واحد] توضیحات = نمونه uWSGI برای ارائه رابط وب Project1

After = network.target

BindsTo = mysqld.service

پس از = mysqld.service

[سرویس]

به کاربر خود تغییر دهید

کاربر = pi

گروه = www-data

در اینجا شما باید دایرکتوری فایل Flask خود را وارد کنید

WorkingDirectory =/home/pi/project1/web

فهرست فایل ini شما که بعداً می توانید پیدا کنید.

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

[نصب]

WantedBy = multi-user.target

uwsgi-flask.ini که باید در دایرکتوری که در ExecStart بالا مشخص کرده اید قرار دهید

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

استاد = فرآیندهای واقعی = 5

افزونه = python3

سوکت = project1.sock chmod-socket = 660 خلاء = true

سررسید = درست

اکنون می توانید داده های خود را بخوانید و در وب سایت خود نمایش دهید.

مرحله 6: اضافی: اتصال صفحه LCD

اضافی: اتصال صفحه LCD
اضافی: اتصال صفحه LCD
اضافی: اتصال صفحه LCD
اضافی: اتصال صفحه LCD
اضافی: اتصال صفحه LCD
اضافی: اتصال صفحه LCD

ما می توانیم یک صفحه LCD متصل کنیم تا بتوانیم آدرس IP Pi خود را برای وب سایت خود نشان دهیم.

وارد کردن RPi. GPIO به عنوان زمان GPIOimport

وارد کردن دستورات

GPIO.cleanup ()

D0 = 22

D1 = 5

D2 = 6

D3 = 13

D4 = 19

D5 = 26

D6 = 20

D7 = 21

لیست = [22 ، 5 ، 6 ، 13 ، 19 ، 26 ، 20 ، 21]

E = 24

RS = 23

صفحه کلاس:

def _init _ (خود):

GPIO.setmode (GPIO. BCM)

self.setup ()

#Function set self.stuur_instructie (0x3f) #Display self.stuur_instructie (0x0c) #On + cursor self.stuur_instructie (0x01)staticmethod def setup (): GPIO.setup (list، GPIO. OUT) GPIO.setup (، RS] ، GPIO. OUT)

def stuur_instructie (خود ، بایت):

GPIO.output (E ، GPIO. HIGH)

GPIO.output (RS ، GPIO. LOW)

self.set_GPIO_bits (بایت)

زمان خواب (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 (دما)

زمان خواب (0.005)

GPIO.output (E ، GPIO. LOW)

def set_GPIO_bits (خود ، بایت):

برای i در محدوده (0 ، 8):

if (بایت & (2 ** i)) == 0:

GPIO.output (لیست ، GPIO. LOW)

دیگری:

GPIO.output (لیست ، GPIO. HIGH)

def main ():

s = صفحه ()

teken = "آدرس IP محلی:"

برای نامه در teken:

s.stuur_teken (نامه)

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

چاپ (teken2)

s.stuur_instructie (0xc0)

برای letter2 در teken2:

s.stuur_teken (حرف 2)

if _name_ == '_main_': #برنامه از اینجا شروع می شود

تلاش كردن:

اصلی ()

به جز KeyboardIntruptrupt:

عبور

سپس می توانیم یک سرویس برای شروع LCD هنگام راه اندازی ایجاد کنیم.

توصیه شده: