תוכן עניינים:
2025 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2025-01-13 06:57
ל- Nain 1.0 יהיו בעצם 5 מודולים ניתנים להסרה-
1) זרוע - הניתנת לשליטה באמצעות סרוו.
2) גלגלים - הניתנים לשליטה באמצעות מנועי DC.
3) רגל - ניין יוכל לעבור בין גלגלים או רגליים לתנועה.
4) ראש - ניתן לשלוט בראשו להנהנות שונות.
5) מודול מצלמה- הניתן לממשק לגישה לזיהוי פנים.
יחד עם זה NAIN יוכל לדבר ולתקשר עם משתמשים ויוכל להראות לך את השעה לפי השעון המובנה שלו. תהיה לו שליטה אלחוטית באמצעות Wi-Fi /Bluetooth.
שלב 1: דרושים רכיבים
- סרוו מוטורס -4
- ארדואינו מגה - 1
- פטל פטל - 1
- מצלמת USB -1
- רמקול -1
- מנועי DC -2
- L293D -1
- מארז סוללות - 1
- גלגלים -2
- גלגלי קיקור - 2
יחד עם אלה תצטרך רצועות מרובעות מאלומיניום כדי ליצור את הגוף ואת הברגים והאומים כדי שיתאימו להם כראוי.
שלב 2: מבנה הגוף
מבנה הגוף יהיה עשוי מוטות מרובעים מאלומיניום קלים שיסייעו בהרכבתו בקלות.
נכון לעכשיו הרכיב אותם כפי שמוצג באיור וכן גזור רווחים מתאימים למנועי הסרוו שיוצמדו לזרועות.
צרף תחתית בסיס עץ משושה.
מתחת לבסיס העץ, חבר את מנועי וגלגלי DC כפי שאנו עושים בכל רובוט עוקב קו.
מעניין להוסיף שני גלגלי קיק- אחד מלפנים ושני בחלק האחורי של הרובוט.
שלב 3: חיווט וקידוד
כדי לחבר את המודולים השונים עיין בקודים המצורפים בחלק זה.
ראשית בדקנו כל מודול באמצעות קודים עצמאיים ולאחר מכן שילבנו את כולם באחד ושלטנו בתנועת הגלגלים והזרועות באמצעות מודול בלוטות '.
שלב 4: פטל פטל וזיהוי תמונות
זיהוי תמונות מתבצע באמצעות מצלמת USB ו- Raspberry Pi.
לשם כך יהיה עליך להתקין את ספריית קורות החיים OPEN ב- Pi שלך.
תוכל לעשות זאת מכאן-https://github.com/jabelone/OpenCV-for-Pi
לאחר מכן תצטרך לבצע זיהוי תמונה באמצעות שלה cascade.
תוכל לעשות זאת מכאן -https://thecodacus.com/category/opencv/#. WvsNC4iFPDc
לאחר עיון בקישור לעיל ובעקבותיו, ביצעתי כמה שינויים בקוד הסופי בו השתמשתי שהדבקתי למטה -
מחולל הנתונים:
importcv2
cam = cv2. VideoCapture (0)
גלאי = cv2. CascadeClassifier ('Classifiers/face.xml')
i = 0
קיזוז = 50
name = raw_input ('הזן את המזהה שלך')
בעוד שזה נכון:
ret, im = cam.read ()
אפור = cv2.cvtColor (im, cv2. COLOR_BGR2GRAY)
פנים = גלאי.detectMultiScale (אפור, scaleFactor = 1.2, minNeighbors = 5, minSize = (100, 100), דגלים = cv2. CASCADE_SCALE_IMAGE)
עבור (x, y, w, h) בפנים:
i = i+1
cv2.imwrite ("dataSet/face."+name+'.'+str (i)+".jpg", אפור [y-offset: y+h+offset, x-offset: x+w+offset])
cv2. מלבן (im, (x-50, y-50), (x+w+50, y+h+50), (225, 0, 0), 2)
cv2.imshow ('im', im [y-offset: y+h+offset, x-offset: x+w+offset])
אם cv2.waitKey (100) & 0xFF == ord ('q'):
לשבור
# הפסקה אם מספר המדגם הוא יותר מ -20
elif (i> 20):
לשבור
cam.release ()
cv2.destroyAllWindows ()
הוא ייצור מערך נתונים של התמונות שלך שישמשו לאימות.
מאמן:
importcv2, os
ייבא numpy כמו np
מתמונת ייבוא PIL
מזהה = cv2.face.createLBPHFaceRecognizer ()
cascadePath = "מסווגים/face.xml"
faceCascade = cv2. CascadeClassifier (cascadePath);
path = 'dataSet'
def get_images_and_labels (נתיב):
image_paths = [os.path.join (נתיב, f) עבור f ב- os.listdir (נתיב)]
# תמונות יכילו תמונות פנים
תמונות =
תוויות # יכילו את התווית שהוקצתה לתמונה
תוויות =
עבור image_path ב- image_paths:
# קרא את התמונה והמיר לגווני אפור
image_pil = Image.open (image_path).convert ('L')
# המר את פורמט התמונה למערך numpy
image = np.array (image_pil, 'uint8')
# קבל את התווית של התמונה
nbr = int (os.path.split (image_path) [-1].split (".") [1].replace ("פנים-", ""))
#nbr = int (''. join (str (ord (c)) עבור c ב- nbr))
הדפס nbr
# זיהוי הפנים בתמונה
פנים = faceCascade.detectMultiScale (תמונה)
# אם זוהתה פנים, צרף את הפנים לתמונות ואת התווית לתוויות
עבור (x, y, w, h) בפנים:
images.append (תמונה [y: y + h, x: x + w])
labels.append (nbr)
cv2.imshow ("הוספת פרצופים לערכת הטריינג …", תמונה [y: y + h, x: x + w])
cv2.waitKey (10)
# החזר את רשימת התמונות ורשימת התוויות
החזר תמונות, תוויות
תמונות, תוויות = get_images_and_labels (נתיב)
cv2.imshow ('מבחן', תמונות [0])
cv2.waitKey (1)
מזהה.טראן (תמונות, מערך np.array (תוויות))
מזהה.סבר ('trainer/trainer.yml')
cv2.destroyAllWindows ()
גַלַאִי
importcv2
ייבא numpy כמו np
ייבוא מערכת הפעלה
c = 0
מזהה = cv2.face.createLBPHFaceRecognizer ()
מזהה.load ('trainer/trainer.yml')
cascadePath = "מסווגים/face.xml"
faceCascade = cv2. CascadeClassifier (cascadePath);
cam = cv2. VideoCapture (0)
fontface = cv2. FONT_HERSHEY_SIMPLEX
fontscale = 1
fontcolor = (255, 255, 255)
בעוד שזה נכון:
ret, im = cam.read ()
אפור = cv2.cvtColor (im, cv2. COLOR_BGR2GRAY)
פנים = faceCascade.detectMultiScale (אפור, 1.2, 5)
עבור (x, y, w, h) בפנים:
cv2. מלבן (im, (x-50, y-50), (x+w+50, y+h+50), (225, 0, 0), 2)
Id = identifier.predict (אפור [y: y+h, x: x+w])
אם (מזהה <70):
אם (Id == 1):
Id = "Shashank"
elif (Id == 2):
אם (c == 0):
Id = "Shivam"
c = c+1
os.system ("דוגמת 'ברוכים הבאים ל- Shivam Access Granted'")
אַחֵר:
Id = "Shivam"
אַחֵר:
מזהה = "לא ידוע"
cv2.putText (im, str (Id), (x, y+h), fontface, fontscale, fontcolor)
cv2.imshow ('im', im)
אם cv2.waitKey (10) & 0xFF == ord ('q'):
לשבור
cam.release ()
cv2.destroyAllWindows ()
שלב 5: LCD ורמקול
השתמשתי גם בתצוגת LED I2C ורמקול.
הנורית נשלטת באמצעות Arduino Mega והקוד שלה מופיע בקוד הסופי.
עבור רמקול, הוא מחובר ל- Raspberry Pi ומשתמש ב- eSpeak Utility.
אתה יכול למצוא את ההפניה שלו כאן-https://www.dexterindustries.com/howto/make-your-raspberry-pi-speak/
שלב 6: השלבים האחרונים
הרכיבו הכל והתכוננו למפץ.