תוכן עניינים:

מדידת תנוחות אצבע על כינור עם ESP32: 6 שלבים
מדידת תנוחות אצבע על כינור עם ESP32: 6 שלבים

וִידֵאוֹ: מדידת תנוחות אצבע על כינור עם ESP32: 6 שלבים

וִידֵאוֹ: מדידת תנוחות אצבע על כינור עם ESP32: 6 שלבים
וִידֵאוֹ: אסתי לומדת על מיניות גברית | אסתי בשטח 2024, יולי
Anonim
מדידת תנוחות אצבע בכינור עם ESP32
מדידת תנוחות אצבע בכינור עם ESP32
מדידת תנוחות אצבע בכינור עם ESP32
מדידת תנוחות אצבע בכינור עם ESP32

כנגן כינור תמיד רציתי אפליקציה או כלי שיכול להראות לי את מיקום האצבעות שלי על הכינור בצורה מדויקת מאוד. עם הפרויקט הזה ניסיתי לבנות את זה. למרות שזהו אב טיפוס ועדיין תוכל להוסיף תכונות רבות.

ניסיתי גם להפריד בין ה- ESP32 לבין ה- rPI וכך גרמתי ל- ESP32 לשלוח נתונים אלחוטיים ל- rPi. וזה כנראה הדבר הכי קשה בפרויקט הזה.

כמו כן, חשוב מאוד שבסוף הפרויקט הזה שום דבר לא יאוחסן במחשב שלך, אלא שהוא נמצא ב- rPI או ב- ESP32.

שלב 1: חומרים וכלים

חומרים וכלים
חומרים וכלים

לפני שנכנס לפרטים של בניית הפרויקט הזה אנחנו צריכים כמה דברים.

  1. 4x סיר לינארי: פוטנציומטרים ליניאריים למדידת מיקום האצבע (לכינור יש 4 מיתרים)
  2. ESP32: מודול ESP32 לקריאת הנתונים מנקודות הרך הלינאריות.
  3. כינור 4/4: כינור למקם את הסיכות הרכות הלינאריות למעלה.
  4. פטל פטל עם כרטיס SD: פטל פאי שיאחסן את מסד הנתונים והאתר שלנו.
  5. פוטנציומטר 10k: פוטנציומטר לבהירות ה- LCD
  6. מסך LCD: מסך LCD להצגה לתוספי ה- ip של ה- rPi
  7. ערכת הלחמה: להלחמה של כל האלמנטים יחד
  8. חוטי זכר לזכר וחוטי זכר לנקבה: כבלים לחיבור כל האלמנטים
  9. כבל מיקרו USB: להפעלת ה- ESP32

שלב 2: חיבור ה- Softpots ל- ESP32

חיבור ה- Softpots ל- ESP32
חיבור ה- Softpots ל- ESP32

קודם כל עלינו לחבר את סירים הרכים שלנו ל- esp32. אנו מחברים את הסיכות השמאלית והימנית ל- 5V ו- GND בהתאמה. אנו מחברים את הסיכה האמצעית לסיכה אנלוגית ב- ESP32. עלינו גם לחבר את הסיכה האמצעית בהתנגדות של 10k אוהם ולחבר זאת ל- GND. זאת על מנת שהפלט שלנו מהסירים הרכים לא יחזיר ערך אקראי.

לאחר מכן אנו מחברים את ה- ESP32 עם כבל המיקרו 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;

onTime לא חתום;

softPotTime ארוך ללא חתימה;

ואז נוכל להגדיר את הסיכות שלנו. ואנחנו צריכים להתחיל את המסך הטורי שלנו ואת הזמן שלנו.

הגדרת בטל () {

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

getdata void (בייט 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] = i;

pdata [1] = softpot;

pdata [2] = מיליס ();

} } }

}

שלב 3: חיבור ה- ESP32 וה- RPI באופן אלחוטי

לחיבור ESP32 ו- RPI באופן אלחוטי, נשתמש בספרייה הנקראת websocket. כדי להתקין את הספרייה הזו, אנו יכולים להשיג את הקבצים כאן. נצטרך לשנות קוד כלשהו בקבצים עצמם על מנת להשתמש בספרייה זו עבור ESP32.

נצטרך לשנות את MD5.c ו- MD5.h.

  • MD5Init ל- MD5InitXXX
  • MD5Update to MD5UpdateXXX
  • MD5Final עד MD5FinalXXX

נצטרך גם למחוק את שורות avr/io.h בקבצי sha1.

לאחר מכן נוכל להוסיף את הספרייה ל- IDE Arduino שלנו על ידי סקיצה> כלול ספרייה> להוסיף ספריית. ZIP ואז נוכל לבחור את הספרייה שלך בקובץ 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 = "SSID ה- wifi שלך";

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

if (client.connected ()) {

עיכוב (10);

if (webSocketServer.handshake (לקוח)) {

Serial.println ("לקוח מחובר");

שליחה וקבלה של נתונים.

while (client.connected ()) {

נתוני צ'ארה [30];

getdata (נתונים);

Serial.println (נתונים);

webSocketServer.sendData (נתונים);

עיכוב (10); // עיכוב הדרוש לקבלת הנתונים בצורה נכונה}

Serial.println ("הלקוח נותק");

עיכוב (100); }

אחר {

Serial.println ("shitsfuckedyo");

} } }

ואז עבור ה- rPI בפייתון:

ייבוא הספריות שלנו

זמן יבוא websocket

הקצאת משתנה גלובלי i

i = 0

קביעת 200 הודעות לכל היותר שנוכל לקבל

nrOfMessages = 200

class Websocket ():

def _init _ (עצמי):

אתחול שקע האינטרנט שלנו וחיבורו ל- ESP32 שלנו

self.ws = websocket. WebSocket ()

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

קבלת הנתונים שלנו

עבודה def (עצמי):

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.

אז תצטרך גם ליצור את האתר שלך. אתה יכול לעשות את זה כרצונך, אך עליך להשתמש בבקבוק ועליך שיהיה לך טופס ב- HTML שלך לעצור ולהפעיל את הנתונים שלך.

לאחר מכן תוכל להכניס קוד זה כדי לחבר את מסד הנתונים שלך ואתר האינטרנט שלך (אתר האינטרנט שלך וגם מסד הנתונים צריכים להיות שניהם ב- pi שלך, ניתן לעשות זאת באמצעות כרטיסיית הפריסה בהגדרות של pycharm)

מאת ייבוא flaskext.mysql MySQL

app.config ["MYSQL_DATABASE_HOST"] = "מארח מקומי"

app.config ["MYSQL_DATABASE_DB"] = "שם מסד הנתונים שלך"

app.config ["MYSQL_DATABASE_USER"] = "משתמש בסיס הנתונים שלך"

app.config ["MYSQL_DATABASE_PASSWORD"] = "סיסמת מסד הנתונים שלך"

פונקציה להוצאת נתונים ממאגר הנתונים שלנו.

def get_data (sql, params = None):

conn = mysql.connect ()

סמן = conn.cursor ()

print ("קבלת נתונים")

לְנַסוֹת:

הדפסה (sql)

cursor.execute (sql, params)

למעט חריגה כמו e:

הדפס (ה)

להחזיר שקר

result = cursor.fetchall ()

נתונים =

לשורה בתוצאה:

data.append (רשימה (שורה))

cursor.close ()

conn.close ()

להחזיר נתונים

פונקציה להכנסת נתונים למסד הנתונים שלנו

def set_data (sql, params = None):

conn = mysql.connect ()

סמן = conn.cursor ()

לְנַסוֹת:

log.debug (sql)

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

log.debug ("SQL המבצע")

למעט חריגה כמו e:

log.exception ("מידע על ביצוע SQL: {0})". פורמט (ה))

להחזיר שקר

cursor.close ()

conn.close ()

להחזיר נכון

נצטרך גם להשחיל את היישום שלנו כך שתוכל לעשות דברים אחרים בזמן שאתה מקליט.

class ThreadedTask (threading. Thread):

def _init _ (עצמי,):

הגדרת חוט

threading. Thread._ init _ (עצמי)

יצירת רשימה לאחסון כל הנתונים שהתקבלו

self.data_all =

ריצה Def (עצמי):

time.sleep (5)

ייבא קוד פיתון משלך היכן שאתה מקבל את הנתונים

יבוא קבלת_אתר אינטרנט

קבל את הנתונים שלך

w = Receive_websocket. Websocket ()

הוסף את הנתונים שלך ברשימה והדפס אותם.

עבור i בטווח (0, 200):

self.data_all.append (w.work (). פיצול (","))

הדפס (self.data_all)

task = ThreadedTask ()

לאחר מכן תוכל לבצע task.run () כדי להפעיל את האשכול שלך ולהתחיל לקבל נתונים.

שלב 5: חיבור הכל ביחד

מחברים הכל ביחד
מחברים הכל ביחד

כדי להפעיל את האתר שלך מה- Pi שלך עליך להשתמש בשירות:

[Unit] Description = מופע uWSGI לשרת ממשק אינטרנט project1

אחרי = network.target

BindsTo = mysqld.service

אחרי = mysqld.service

[שֵׁרוּת]

שנה למשתמש שלך

משתמש = pi

קבוצה = www-data

כאן עליך להזין את ספריית קובץ הבקבוק שלך

מדריך עבודה =/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

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

הגדרת פונקציות self.stuur_instructie (0x3f) #הצגת self.stuur_instructie (0x0c) #On + סמן self.stuur_instructie (0x01) @staticmethod הגדרת הגדרות (): GPIO.setup (רשימה, 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 (E, GPIO. LOW)

def stuur_teken (self, char):

temp = ord (char)

פלט 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.out (רשימה , GPIO. LOW)

אַחֵר:

פלט GPIO.out (רשימה , GPIO. HIGH)

def main ():

s = מסך ()

teken = "כתובת IP מקומית:"

למכתב בציור:

s.stuur_teken (אות)

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

הדפס (teken2)

s.stuur_instructie (0xc0)

לאות 2 בציור 2:

s.stuur_teken (אות 2)

אם _name_ == '_ עיקר_': #תוכנית החל מכאן

לְנַסוֹת:

רָאשִׁי()

למעט מקלדת הפרעה:

לַעֲבוֹר

לאחר מכן נוכל ליצור שירות להפעלת ה- LCD בעת ההפעלה.

מוּמלָץ: