جدول المحتويات:

قياس أوضاع الإصبع على الكمان باستخدام ESP32: 6 خطوات
قياس أوضاع الإصبع على الكمان باستخدام ESP32: 6 خطوات

فيديو: قياس أوضاع الإصبع على الكمان باستخدام ESP32: 6 خطوات

فيديو: قياس أوضاع الإصبع على الكمان باستخدام ESP32: 6 خطوات
فيديو: ويبينار العطاء الرقمي | مقدمة في برمجة الـ Arduino وانترنت الأشياء 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: raspberry Pi الذي سيخزن قاعدة البيانات والموقع الإلكتروني الخاص بنا.
  5. مقياس جهد 10 كيلو: مقياس جهد لسطوع شاشة LCD
  6. شاشة LCD: شاشة LCD لعرض عناوين IP الخاصة بـ rPi
  7. مجموعة اللحام: لحام جميع العناصر معًا
  8. الأسلاك من ذكر إلى ذكر والأسلاك من ذكر إلى أنثى: كبلات لتوصيل جميع العناصر
  9. كابل Micro USB: لتشغيل ESP32

الخطوة 2: توصيل Softpots بـ ESP32

توصيل Softpots بـ ESP32
توصيل Softpots بـ ESP32

بادئ ذي بدء ، نحتاج إلى توصيل softpots الخاصة بنا بـ esp32. نقوم بتوصيل المسامير اليسرى واليمنى بـ 5V و GND على التوالي. نقوم بتوصيل الدبوس الأوسط بالدبوس التمثيلي على ESP32. نحتاج أيضًا إلى توصيل الدبوس الأوسط بمقاومة 10 كيلو أوم وتوصيل هذا بـ GND. هذا حتى لا يُرجع ناتجنا من البرامج الحاسوبية قيمة عشوائية.

ثم نقوم بتوصيل ESP32 بكابل micro usb بجهاز الكمبيوتر الخاص بنا حتى نتمكن من تحميل الكود إليه. سوف نستخدم Arduino IDE لبرمجة ESP32. لكننا نحتاج أولاً إلى تثبيت نواة 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 ؛

بدون توقيع طويل في الوقت المناسب ؛

softPotTime طويلة بدون توقيع ؛

ثم يمكننا إعداد دبابيسنا. ونحتاج إلى بدء جهاز العرض التسلسلي ووقتنا.

الإعداد باطل() {

onTime = مللي () ،

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) ؛ }

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 = الأسماء ؛

إذا (softpot> 10) {

pdata [0] = أنا ؛

pdata [1] = softpot ؛

pdata [2] = مللي () ؛

} } }

}

الخطوة 3: توصيل ESP32 و RPI لاسلكيًا

لتوصيل ESP32 و RPI لاسلكيًا ، سنستخدم مكتبة تسمى websocket. لتثبيت هذه المكتبة ، يمكننا الحصول على الملفات هنا. سنحتاج إلى تغيير بعض التعليمات البرمجية في الملفات نفسها لاستخدام هذه المكتبة لـ ESP32.

سنحتاج إلى تغيير MD5.c و MD5.h.

  • MD5Init إلى MD5InitXXX
  • MD5: التحديث إلى MD5UpdateXXX
  • MD5 النهائي إلى MD5FinalXXX

سنحتاج أيضًا إلى حذف أسطر avr / io.h في ملفات sha1.

ثم يمكننا إضافة المكتبة إلى Arduino IDE الخاص بنا عن طريق رسم> تضمين مكتبة> إضافة مكتبة. ZIP ومن ثم يمكننا تحديد مكتبتك في ملف مضغوط.

بعد ذلك يمكننا البدء في كتابة الكود الخاص بنا.

الأول بالنسبة لـ 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) ؛

بدء تشغيل خادم websocket الخاص بنا

WebSocketServer webSocketServer ؛

تعيين SSID وكلمة المرور لشبكة wifi الخاصة بك

const char * ssid = "wifi SSID الخاص بك" ؛

const char * password = "كلمة مرور wifi الخاصة بك" ؛

الإعداد باطل() {

إعداد جهاز العرض التسلسلي الخاص بك

Serial.begin (115200) ؛

إعداد البرامج الخاصة بك

pinMode (SOFT_POT_PIN1 ، INPUT) ؛

pinMode (SOFT_POT_PIN2 ، INPUT) ؛

pinMode (SOFT_POT_PIN3 ، INPUT) ؛

pinMode (SOFT_POT_PIN4 ، INPUT) ؛

بدء wifi الخاص بنا والاتصال به

WiFi.begin (SSID ، كلمة المرور) ؛

بينما (WiFi.status ()! = WL_CONNECTED) {

تأخير (1000) ؛

Serial.println ("الاتصال بشبكة WiFi..") ؛ }

Serial.println ("متصل بشبكة WiFi") ؛

Serial.println (WiFi.localIP ()) ؛

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

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 () ؛

إذا (client.connected ()) {

تأخير (10) ؛

if (webSocketServer.handshake (عميل)) {

Serial.println ("العميل متصل") ؛

إرسال واستقبال البيانات.

بينما (client.connected ()) {

بيانات شار [30] ؛

getdata (بيانات) ؛

Serial.println (بيانات) ؛

webSocketServer.sendData (بيانات) ؛

تأخير (10) ؛ // التأخير المطلوب لاستلام البيانات بشكل صحيح}

Serial.println ("العميل مفصول") ؛

تأخير (100) ؛ }

آخر {

Serial.println ("shitsfuckedyo") ؛

} } }

ثم بالنسبة لـ rPI في Python:

استيراد مكتباتنا

وقت الاستيراد websocketimport

تعيين متغير عالمي i

أنا = 0

تعيين 200 رسالة كحد أقصى يمكننا استقبالها

nrOfMessages = 200

فئة Websocket ():

def _init _ (ذاتي):

بدء تشغيل مقبس الويب الخاص بنا وتوصيله بـ ESP32

self.ws = websocket. WebSocket ()

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

استقبال بياناتنا

العمل def (الذات):

self.ws.send ("message nr: 0")

النتيجة = النتيجة self.ws.recv () time.sleep (0.5)

إغلاق المقبس الشبكي بعد استلام كل شيء

مواطنه قريبه (ذاتي):

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:

طباعة (هـ)

عودة كاذبة

النتيجة = 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})". تنسيق (e))

عودة كاذبة

cursor.close ()

conn.close ()

عودة صحيح

سنحتاج أيضًا إلى ربط تطبيقنا بحيث يمكنك القيام بأشياء أخرى أثناء التسجيل.

فئة ThreadedTask (threading. Thread):

def _init _ (ذاتي ،):

إعداد الخيط

مؤشر ترابط._ init _ (ذاتي)

إنشاء قائمة للاحتفاظ بجميع البيانات المستلمة الخاصة بك

self.data_all =

المدى def (النفس):

time.sleep (5) الوقت.

استيراد كود بيثون الخاص بك حيث تتلقى البيانات الخاصة بك

استيراد Receiver_websocket

استقبل بياناتك

w = Receive_websocket. Websocket ()

ألحق بياناتك في قائمتك واطبعها.

بالنسبة لـ i في النطاق (0 ، 200):

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

طباعة (self.data_all)

المهمة = ThreadedTask ()

بعد ذلك يمكنك تنفيذ task.run () لبدء موضوعك والبدء في تلقي البيانات.

الخطوة 5: ربط كل شيء معًا

ربط كل شيء معًا
ربط كل شيء معًا

لتشغيل موقع الويب الخاص بك من Pi الخاص بك ، يجب عليك استخدام خدمة:

[الوحدة] الوصف = مثيل uWSGI لخدمة واجهة الويب الخاصة بالمشروع 1

بعد = network.target

BindsTo = mysqld.service

بعد = خدمة mysqld

[خدمة]

التغيير إلى المستخدم الخاص بك

المستخدم = pi

المجموعة = www-data

هنا يجب عليك إدخال دليل ملف Flask الخاص بك

دليل العمل = / 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

socket = project1.sock chmod-socket = 660 فراغ = صحيح

يموت على المدى = صحيح

يمكنك الآن قراءة بياناتك وعرضها على موقع الويب الخاص بك.

الخطوة 6: إضافي: توصيل شاشة LCD

نشاط إضافي: توصيل شاشة LCD
نشاط إضافي: توصيل شاشة LCD
نشاط إضافي: توصيل شاشة LCD
نشاط إضافي: توصيل شاشة LCD
نشاط إضافي: توصيل شاشة LCD
نشاط إضافي: توصيل شاشة LCD

يمكننا توصيل شاشة LCD حتى نتمكن من إظهار عنوان IP الخاص بـ Pi لموقعنا على الويب.

استيراد RPi. GPIO كوقت استيراد GPIO

أوامر الاستيراد

GPIO.cleanup ()

D0 = 22

D1 = 5

د 2 = 6

د 3 = 13

د 4 = 19

د 5 = 26

د 6 = 20

د 7 = 21

القائمة = [22 ، 5 ، 6 ، 13 ، 19 ، 26 ، 20 ، 21]

ه = 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 ([E ، RS] ، GPIO. OUT)

def stuur_instructie (ذاتي ، بايت):

إخراج GPIO (E ، GPIO. HIGH)

خرج GPIO (RS ، GPIO. LOW)

self.set_GPIO_bits (بايت)

time.sleep (0.005)

إخراج GPIO (E ، GPIO. LOW)

def stuur_teken (self، char):

temp = ord (شار)

إخراج GPIO (E ، GPIO. HIGH)

إخراج GPIO (RS ، GPIO. HIGH)

self.set_GPIO_bits (درجة الحرارة)

time.sleep (0.005)

إخراج GPIO (E ، GPIO. LOW)

def set_GPIO_bits (ذاتي ، بايت):

بالنسبة لـ i في النطاق (0 ، 8):

إذا (بايت & (2 ** i)) == 0:

GPIO.output (القائمة ، GPIO. LOW)

آخر:

GPIO.output (القائمة ، GPIO. HIGH)

def main ():

ق = شاشة ()

teken = "عنوان IP المحلي:"

للرسالة في teken:

s.stuur_teken (حرف)

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

طباعة (teken2)

s.stuur_instructie (0xc0)

للحرف 2 في teken2:

s.stuur_teken (حرف 2)

if _name_ == '_main_': # البرنامج يبدأ من هنا

محاولة:

الأساسية()

باستثناء لوحة المفاتيح المقاطعة:

يمر

ثم يمكننا إنشاء خدمة لبدء تشغيل شاشة LCD عند بدء التشغيل.

موصى به: