עולם הרספברי פיי הוא עולם מקסים של טכנולוגית חומרה ותוכנה בקוד פתוח. אפשר לעשות איתו המון דברים. ממרכז בידור ביתי, דרך בתים חכמים, מערכות השקייה והמון דברים נוספים. הפעם נלמד איך מבצעים פעולות שחוזרות על עצמן בתזמון קבוע ברספברי פיי, מה שיכול להיות שימושי לפעמים.
קרה המקרה ונזדקקתי למכשיר שיקליט אודיו מספר שעות ביום קובץ הקלטה באיכות טובה, ושיוכל לעשות זאת לאורך ימים רבים. כדי לחסוך מקום כדאי שההקלטה תתמקד רק בשעות שאני זקוק לה, ושתתחיל כל יום מחדש בשעה נקובה. זאת משימה קצת גדולה על ארדואינו בעיקר מבחינת העבודה עם איכות ההקלטה הדיגיטלית המתבקשת וכמות הזיכרון הקשיח הדרוש כדי לשמור קבצים כה גדולים. רספברי פיי to the rescue!
חיבור המיקרופון וזיהוי שלו כאמצעי הקלטה באמצעות arecord
קצת על arecord
arecord היא תוכנת commandline שעובדת עם הדרייבר ALSA לכרטיס הקול של הרספברי פיי. בעזרתה ניתן להקליט קול דרך שורת הפקודה בטרמינל (את הטרמינל, המסך השחור בו כותבים פקודות בטקסט, נפתח על ידי לחיצה על CTRL+ALT+T, ברוב המקרים זה יעבוד) נחבר את המיקרופון לרספברי פיי ונבחן את מכשירי ההקלטה שהarecord מזהה, באמצעות הפקודה הבאה בטרמינל.
arecord --list-devices
את הפלט של הפקודה אפשר לראות למטה. במקרה שלנו, אפשר לראות שהמיקרופון זוהה (USB PnP Sound Device, כמובן שיכול להיות שבמקרה שלכם יהיה משהו אחר). הוא גם מציין את מספר הכרטיס (2) ואת מספר המכשיר (0). מספרים חשובים להמשך.
לקריאה נוספת
- כללי על arecord – תוכנה להקלטת קול משורת הפקודה: https://linux.die.net/man/1/arecord
בדיקה של קצב הדיגום של המיקרופון
כעת כדאי שנבדוק אם המיקרופון מצליח להקליט באיכות סבירה. לכן נקליד בטרמינל את הפקודה הבאה.
arecord -f dat -r 192 -D hw:2,0 -d 5 -c 2 test.wav
בואו נבין רגע מה הפקודה הזו עושה. נפרק אותה לגורמים:
שם התוכנה שבחרנו להפעיל – arecord
קבע את הפרומט כdigital audio tape (כן, יש כזה דבר, וזה מקובל) – -f dat
קבע את קצב הדגימה של המיקרופון ל192000Hz. זה נשמע לא תקין, אבל אל דאגה התוכנה תדייק אותנו עוד רגע – -r 192-
קביעת מכשיר ההקלטה, כאן המספרים ששמרנו שימושיים, קודם שמים את מספר הכרטיס ואחרכך את מספר המכשיר -D hw:2,0
משך ההקלטה, בשניות (במקרה הזה 5 שניות) – -d 5
מספר ערוצי ההקלטה, במקרה הזה אני מנסה שניים – -c 2
שם הקובץ שאליו אני רוצה שההקלטה תשמר, הוא ישמור את ההקלטה בתיקיה הראשית /home/pi
- אם המיקרופון לא יכול להקליט בשני ערוצים, הוא יציין Channels count non available. המיקרופון הזה דורש ערוץ אחד בלבד.
- במקרה שלי הוא בחן 192000 וקיבל חזרה 48000. אז צריך לשנות ל48000. ואז הוא לא יציג את הבעיה הזו בפעם השניה.
בדיקה שהקובץ נוצר
אם הכל התבצע קשורה, יופיע תחת התיקיה /home/pi קובץ wav בשם test.wav
חשוב: במקרה ויש לכם הרבה רעש רקע, ואתם עובדים דגם יחסית חדש של רספברי נסו לעקוב אחרי הקישור למטה, כדי לשנות את קצב הדיגום גם בקובץ ההגדרה של pulseaudio
לקריאה נוספת:
- בדיקה ודיוק של קצב הדיגום של המיקרופון: https://bbs.archlinux.org/viewtopic.php?id=125803
יצירת קובץ shell בתקיית pi
אוקי, אז אנחנו יודעים להקליט. עכשיו צריך להצליח להקליט בצורה אוטומטית בזמן שאנחנו נגדיר. כי לשם זה התכנסנו.
ניגש לתקיית /home/pi, ונייצר בה קובץ sh חדש, בשם record.sh (או כל שם אחר לצורך העניין, השם עצמו לא משנה.
אחרי שהקובץ נוצר, נלחץ על כפתור ימין ונפתח אותו באמצעות הtext editor. נזין בו את הקוד הבא.
#!/bin/sh var=$(date +"%Y-%m-%d-%H-$M-%S") arecord -f dat -r 48 -D hw:2,0 -d 5 -c 1 record-${var}.wav
ומה הקוד אומר?
שורה ראשונה: אנחנו מספרים למערכת שזהו קובץ Shell. שהם קבצים שנועדו להריץ באופן רציף פקודות טרמינל, כמו שאנחנו עושים עכשיו ידנית, אבל בצורה של תוכנה לינארית, כלומר – שורה אחר שורה. אז הסימן הזה שמופיע בשורה הראשונה מאפשר למערכת לזהות שזהו אכן קובץ שכזה.
שורה שניה: אנו מזינים מבנה תאריך לתוך משתנה שקוראים לו var. המטרה היא שנוכל להבדיל אחר כך את הקבצים לפי התאריך שלהם, כי יכולים להיות לנו הרבה כאלו (תלוי בתדירות ההקלטה כמובן). מבנה התאריך שלנו יהיה מורכב משנה-חודש-יום-שעה-דקה-שניה. משהו כמו 2020-12-7-18-56-23. וכל זה נכנס לתוך המשתנה var.
שורה שלישית: מכירים אותה כבר. היא שורת הפקודה שהפעילה את ההקלטה מהמיקרופון באמצעות arecord, אבל הפעם בסופה אפשר לראות את המשתנה מוטמע בשם הקובץ כך שהקבצים שיוקלטו לא “ידרסו” אחד את השני.
שלושת הפקודות הללו בעיקרון צריכות לרוץ בכל פעם שנרצה להקליט קובץ אחת אחרי השניה. עדיין אנחנו צריכים לכוון את השעון, כי כרגע אם נרצה להפעיל את record.sh נצטרך להפעיל אותו ידנית ואז לא עשינו שום דבר.
לקריאה נוספת:
- מה זה shell scripting – ויקיפדיה האנגלית: https://en.wikipedia.org/wiki/Shell_script
- שימושי אבל מעמיק וארוך – מדריך מלא לכתיבת shell עבןר לינוקס: https://www.shellscript.sh/first.html
- פורמט תאריך בפקודות וקבצי shell – איך כותבים תאריך כך שישתנה בשם הקובץ: https://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/
הופכים את הקובץ shell לexecutable
ls -l /home/pi/record.sh chmod +x /home/pi/record.sh ls -l /home/pi/record.sh
לפני שנפעיל את הפעולה המתוזמנת, אנו צריכים להפוך את קובץ הrecord.sh שלנו לבר הרצה(או Executable באנגלית. משם נגזרת הסיומת EXE שעדיין מאפיינת קובץ הפעלה של תוכנות רבות). השורה הראשונה והשלישית בודקות את השינוי בהרשאות, ואפשר לראות שהשורה האמצעית אכן עשתה שינוי בהרשאות הקובץ. הx-ים מסמלים את ההרשאה לExecutable.
לקריאה נוספת
- הסבר מעמק על הפקודה chmod והרשאות באופן כללי: https://www.howtogeek.com/437958/how-to-use-the-chmod-command-on-linux/
יצירת פקודה חוזרת באמצעות crontab
עכשיו רק צריך להגדיר לרספברי פיי להריץ את קובץ הsh שלנו בזמנים מוגדרים. את זה נעשה באמצעות הכלי Cron, שעוזר לנו לסנכרן ללוח הזמנים משימות בסביבות לינוקס, כמו זו של הרספברי פיי. נתחיל בלהקליד בטרמינל:
crontab -e
בפעם הראשונה הוא ישאל אם ליצור קובץ כי לא קיים כזה. ונבחר באפשרות מספר 1, שהיא לפתוח את הקובץ בעזרת כלי עריכת הטקסט בטרמינל שנקרא nano. תוכן הקובץ ייפתח בעורך בטרמינל. בסוף הרבה שורות שמסומנות כתגובה, כותבים את פקודת הcron שלנו
*/2 * * * * /home/pi/record.sh
הכי קל להכנס עכשיו לאתר crontab guru ו/או משתמשים במדרכים למטה כדי לקבוע את דפוס החזרה של פקודת הcron. כי יש חשיבות לכוכביות ולמספרים בהתחלה, הם קובעים את החזרה. במקרה של מה שעשיתי כאן – דרשתי מהמערכת להריץ את הקובץ record.sh בכל 2 דקות.
אז שומרים את הקובץ (לוחצים על CTRL+O; ואז CTRL+T – אז בוחרים את הקובץ crontab, ולוחצים שוב CTRL+X כדי לצאת).
הוא יספר לנו שהוא עשה התקנה לcrontab חדש אחרי שיצאנו.
לקריאה נוספת
- הכי שימושי – מתרגם Crontab – אתם כותבים את הגדרת החזרה והוא אומר לכם לפי השעה מתי הפעם הבאה שההגדרה הזו אמורה לפעול: https://crontab.guru (לבדיקת נכונות ההגדרה שלכם)
- הפעלת shell באמצעות crontab
https://superuser.com/questions/81262/how-to-execute-shell-script-via-crontab/81266 - Cron וCrontab – איך עובדים עם זה: https://phoenixnap.com/kb/how-to-list-display-view-all-cron-jobs-linux
- עוד הסבר על איך Crontab עובד: https://www.raspberrypi.org/documentation/linux/usage/cron.md
- ועוד אחד: https://www.geeksforgeeks.org/crontab-in-linux-with-examples/
אם הכל עובד, זה אמור לעבוד
אפשר לראות בתמונה את הקבצים העוקבים נוצרים בקצב המוגדר. נותר רק לחזור ולשנות את הגדרות הזמן ולהתאים אותם לצורך – זמן תחילת ההקלטה, וזמן סיום ההקלטה (כלומר משך הזמן שבו ההקלטה פועלת מרגע תחילתה.
ומה אם ההקלטה ממש ארוכה? קובץ wav הוא לא מכווץ בכלל... אי אפשר MP3?
אפשר, אבל בשביל זה צריך להתקין (אם היא לא מותקנת) תוכנת שורת פקודה נוספת בשם lame
sudo apt-get install lame
אחרי ההתקנה, הsyntax של שורת ההקלטה צריך להשתנות:
arecord -f dat -D hw:2,0 -r 48000 -d 500 -c 2 | lame -h record.mp3
לפי הmanual של lame, כמו שהוא מופיע כאן, -h יחפש את האיכות הגבוהה ביותר, וימיר את התוצר של arecord ישירות לmp3. מה שייתן לנו קובץ בנפח קטן בהרבה (בערך חמישית).
בונוס: אם כל מה שרציתם מהshell הוא הקלטה חוזרת, אפשר לוותר עליו ולעבוד רק עם הcron
בעיקרון, כתיבת סקריפטים לshell מאפשרת לנו לעשות המון פעולות מגוונות. במקרה הזה השתמשנו בה רק כדי לשנות את שמות הקבצים. היופי בcron שהוא יודע לעשות את זה בעצמו, ולכן אם זאת הסיבה היחידה שהשתמשנו בShell אז אפשר לוותר עליו ולהשאר רק עם הcron.
למשל, בתמונה שלמטה תראו את הsyntax הנכון. במקרה הזה אני שומר את הקבצים בתקיית הuser הראשית (/home/name/…) אבל אפשר כמובן לשנות זאת לפי הצורך.
*/10 * * * * arecord -f dat -r 48000 -D hw:2,0 -d 480 -c 2 record`date "+\%Y\%m\%d\%H\%M "`.mp3
- התזמון אומר כל 10 דקות (תבדקו בעצמכם בcronguru)
- תפתח את arecord
- תקליט בפורמט dat
- בקצב דגימה של 48000 Hz (דיברנו על זה כבר, זאת דרישה של המיקרופון)
- הכתובת של המיקרופון היא 0,2
- תקליט למשך 480 שניות (שמונה דקות)
- בשני ערוצים
- בקובץ record ואז חתימת התאריך שנמצאת בתוך ה
date "+...."
דוגמא אחרת - שעון מעורר
דוגמא אחרת יכולה להיות להשתמש בomxplayer, תוכנה שמשמיעה קבצי קול.
אם נייצר קובץ sh חדש שנקרא alarmclock.sh
ונכתוב בו:
#!/bin/bash omxplayer -o alsa filename.mp4
נשנה לקובץ את ההראשות ההרצה שלו (זוכרים) ונוסיף בcrontab, את הגדרת הזמן הנכונה, נניח
30 7 * * * /home/pi/alarmclock.sh
נקבל שעון מעורר שבכל בוקר בשבע וחצי משמיע את הקובץ Filename.mp4.
מכאן השמיים הם הגבול. ספרו לי מה עשיתם.
לתוכן זה נכתבו 0 תגובות