פעולות חוזרות ברסברי פיי בעזרת פקודות Shell

טכנולוגיה מתקדמת

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

קרה המקרה ונזדקקתי למכשיר שיקליט אודיו מספר שעות ביום קובץ הקלטה באיכות טובה, ושיוכל לעשות זאת לאורך ימים רבים. כדי לחסוך מקום כדאי שההקלטה תתמקד רק בשעות שאני זקוק לה, ושתתחיל כל יום מחדש בשעה נקובה. זאת משימה קצת גדולה על ארדואינו בעיקר מבחינת העבודה עם איכות ההקלטה הדיגיטלית המתבקשת וכמות הזיכרון הקשיח הדרוש כדי לשמור קבצים כה גדולים. רספברי פיי to the rescue!

חיבור המיקרופון וזיהוי שלו כאמצעי הקלטה באמצעות arecord

קצת על arecord

arecord היא תוכנת commandline שעובדת עם הדרייבר ALSA לכרטיס הקול של הרספברי פיי. בעזרתה ניתן להקליט קול דרך שורת הפקודה בטרמינל (את הטרמינל, המסך השחור בו כותבים פקודות בטקסט, נפתח על ידי לחיצה על CTRL+ALT+T, ברוב המקרים זה יעבוד) נחבר את המיקרופון לרספברי פיי ונבחן את מכשירי ההקלטה שהarecord מזהה, באמצעות הפקודה הבאה בטרמינל.

arecord --list-devices

את הפלט של הפקודה אפשר לראות למטה. במקרה שלנו, אפשר לראות שהמיקרופון זוהה (USB PnP Sound Device, כמובן שיכול להיות שבמקרה שלכם יהיה משהו אחר). הוא גם מציין את מספר הכרטיס (2) ואת מספר המכשיר (0). מספרים חשובים להמשך.

לקריאה נוספת

בדיקת מכשירים פנויים להקלטה ראשונית

בדיקת מכשירים פנויים להקלטה ראשונית

בדיקה של קצב הדיגום של המיקרופון

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

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. ואז הוא לא יציג את הבעיה הזו בפעם השניה.
כשזה הפלט, צריך להפחית את מספר ערוצי ההקלטה - אחרי האות c. עד למינימום שזה 1

כשזה הפלט, צריך להפחית את מספר ערוצי ההקלטה - אחרי האות c. עד למינימום שזה 1

כשזה הפלט, צריך לשנות את קצב הדגימה למה שכתוב שהוא מקבל מהמיקרופון - אחרי המילה Got

כשזה הפלט, צריך לשנות את קצב הדגימה למה שכתוב שהוא מקבל מהמיקרופון - אחרי המילה Got

בדיקה שהקובץ נוצר

אם הכל התבצע קשורה, יופיע תחת התיקיה /home/pi קובץ wav בשם test.wav

חשוב: במקרה ויש לכם הרבה רעש רקע, ואתם עובדים דגם יחסית חדש של רספברי נסו לעקוב אחרי הקישור למטה, כדי לשנות את קצב הדיגום גם בקובץ ההגדרה של pulseaudio

לקריאה נוספת:

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

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

אם הכל התבצע קשורה, בתקייה הראשית /home/pi יופיע קובץ לפי השם שנתתם לו

אם הכל התבצע קשורה, בתקייה הראשית /home/pi יופיע קובץ לפי השם שנתתם לו

יצירת קובץ 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 נצטרך להפעיל אותו ידנית ואז לא עשינו שום דבר.

לקריאה נוספת:

יצירת קובץ sh חדש

יצירת קובץ sh חדש

כתיבת הפקודות בתוך קובץ הsh, בעזרת ה-text editor

כתיבת הפקודות בתוך קובץ הsh, בעזרת ה-text editor

הופכים את הקובץ 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.

לקריאה נוספת

הxים מסמלים את השינוי לקובץ בר הרצה

הxים מסמלים את השינוי לקובץ בר הרצה

יצירת פקודה חוזרת באמצעות 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 -e, בפעם הראשונה, המערכת תבקש מאיתנו ליצור קובץ חדש

אחרי הפקודה crontab -e, בפעם הראשונה, המערכת תבקש מאיתנו ליצור קובץ חדש

תוכן הקובץ ייפתח בעורך בטרמינל. בסוף הרבה שורות שמסומנות כתגובה, כותבים את פקודת הcron שלנו

תוכן הקובץ ייפתח בעורך בטרמינל. בסוף הרבה שורות שמסומנות כתגובה, כותבים את פקודת הcron שלנו

נכנסים לאתר crontab guru ו/או משתמשים במדרכים למטה כדי לקבוע את דפוס החזרה של פקודת הcron

נכנסים לאתר crontab guru ו/או משתמשים במדרכים למטה כדי לקבוע את דפוס החזרה של פקודת הcron

שמירת הקובץ הנכון

שמירת הקובץ הנכון

הוא יספר לנו שהוא עשה התקנה לcrontab חדש אחרי שיצאנו

הוא יספר לנו שהוא עשה התקנה לcrontab חדש אחרי שיצאנו

אם הכל עובד, זה אמור לעבוד

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

 

ראו קבצים נוצרים בתקיה באופן עקבי. זה אומר שזה עובד.

ראו קבצים נוצרים בתקיה באופן עקבי. זה אומר שזה עובד.

ומה אם ההקלטה ממש ארוכה? קובץ 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 "+...."
פקודת cron שמכילה בפנים את חתימת התאריך הרגעית, ללא שימוש ב shell

פקודת cron שמכילה בפנים את חתימת התאריך הרגעית, ללא שימוש ב shell

דוגמא אחרת - שעון מעורר

דוגמא אחרת יכולה להיות להשתמש בomxplayer, תוכנה שמשמיעה קבצי קול.

אם נייצר קובץ sh חדש שנקרא alarmclock.sh

ונכתוב בו:

#!/bin/bash
omxplayer -o alsa filename.mp4

נשנה לקובץ את ההראשות ההרצה שלו (זוכרים) ונוסיף בcrontab, את הגדרת הזמן הנכונה, נניח

30 7 * * * /home/pi/alarmclock.sh

נקבל שעון מעורר שבכל בוקר בשבע וחצי משמיע את הקובץ Filename.mp4.

מכאן השמיים הם הגבול. ספרו לי מה עשיתם.

הגדרת זמן אפשרית לשעון מעורר קבוע בcrontab

הגדרת זמן אפשרית לשעון מעורר קבוע בcrontab

לתוכן זה נכתבו 0 תגובות

עליך להתחבר כדי לבצע פעולה זו...

הצטרפות

דילוג לתוכן