جدول المحتويات:
- الخطوة 1: المواد والأدوات
- الخطوة 2: توصيل Softpots بـ ESP32
- الخطوة 3: توصيل ESP32 و RPI لاسلكيًا
- الخطوة 4: ربط موقع الويب الخاص بك وقاعدة البيانات
- الخطوة 5: ربط كل شيء معًا
- الخطوة 6: إضافي: توصيل شاشة LCD
فيديو: قياس أوضاع الإصبع على الكمان باستخدام ESP32: 6 خطوات
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:40
بصفتي عازف كمان ، كنت أرغب دائمًا في تطبيق أو أداة يمكنها أن تبين لي موقع أصابعي على الكمان بدقة شديدة. مع هذا المشروع حاولت بناء هذا. على الرغم من أن هذا نموذج أولي ولا يزال بإمكانك إضافة العديد من الميزات.
حاولت أيضًا فصل ESP32 و rPI ، وبالتالي جعلت ESP32 يرسل البيانات لاسلكيًا إلى rPi. وهو على الأرجح أصعب شيء في هذا المشروع.
من المهم أيضًا أنه في نهاية هذا المشروع لا يتم تخزين أي شيء على جهاز الكمبيوتر الخاص بك ولكنه إما على rPI أو ESP32.
الخطوة 1: المواد والأدوات
قبل الدخول في تفاصيل بناء هذا المشروع ، نحتاج إلى بعض الأشياء.
- 4x Softpot الخطي: مقاييس الجهد الخطية لقياس موضع الإصبع (للكمان 4 أوتار)
- ESP32: وحدة ESP32 لقراءة البيانات من البرامج الخطية.
- كمان 4/4: كمان لوضع الأواني الطرية الخطية في الأعلى.
- Raspberry Pi مع بطاقة SD: raspberry Pi الذي سيخزن قاعدة البيانات والموقع الإلكتروني الخاص بنا.
- مقياس جهد 10 كيلو: مقياس جهد لسطوع شاشة LCD
- شاشة LCD: شاشة LCD لعرض عناوين IP الخاصة بـ rPi
- مجموعة اللحام: لحام جميع العناصر معًا
- الأسلاك من ذكر إلى ذكر والأسلاك من ذكر إلى أنثى: كبلات لتوصيل جميع العناصر
- كابل Micro USB: لتشغيل ESP32
الخطوة 2: توصيل 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 حتى نتمكن من إظهار عنوان 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 عند بدء التشغيل.
موصى به:
نظام الحضور القائم على بصمة الإصبع و RFID باستخدام Raspberry Pi وقاعدة بيانات MySQL: 5 خطوات
بصمة الإصبع ونظام الحضور المستند إلى RFID باستخدام Raspberry Pi وقاعدة بيانات MySQL: فيديو لهذا المشروع
أوضاع Netflix Mood: 3 خطوات
ملفات تعريف Netflix Mood: يوجه هذا التوجيه مستخدم Netflix من خلال الخطوات لتخصيص خوارزمية Netflix لتقديم توصيات بناءً على حالتك المزاجية
علبة الكمان الذكية: 7 خطوات (بالصور)
حافظة الكمان الذكية: الموسيقى جزء مهم من حياتي. لقد كنت أعزف على الكمان منذ 10 سنوات ، لكن هناك مشكلة واحدة. لا أعرف أبدًا كم من الوقت تدربت. في مشروعي ، سأتتبع درجة الحرارة والرطوبة ووقت الممارسة. إنه محترف قائم بذاته
ESP8266 مراقبة درجة حرارة Nodemcu باستخدام DHT11 على خادم ويب محلي - احصل على درجة حرارة الغرفة ورطوبتها على متصفحك: 6 خطوات
ESP8266 مراقبة درجة حرارة Nodemcu باستخدام DHT11 على خادم ويب محلي | احصل على درجة حرارة الغرفة ورطوبتها على متصفحك: مرحبًا يا شباب اليوم سنصنع الرطوبة & amp؛ نظام مراقبة درجة الحرارة باستخدام ESP 8266 NODEMCU & amp؛ جهاز استشعار درجة الحرارة DHT11. سيتم الحصول على درجة الحرارة والرطوبة من مستشعر DHT11 & amp؛ يمكن رؤيته على متصفح أي صفحة ويب ستتم إدارتها
ماكينة الصراف الآلي باستخدام Arduino (بصمة الإصبع + بطاقة RFID): 4 خطوات (بالصور)
ماكينة الصراف الآلي باستخدام Arduino (بصمة الإصبع + بطاقة RFID): مرحبًا يا أصدقاء ، أعود بفكرة جديدة لماكينة الصراف الآلي باستخدام Arduino ، يمكن أن تكون مفيدة في المناطق الريفية حيث الخدمات غير النقدية غير ممكنة ، إنها فكرة صغيرة ، أتمنى لقد استمتعت به ، فلنبدأ