רספברי פיי (Raspberry Pi) כרשמקול מתוזמן ומתוכנת (סוג של חלק ב’)

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

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

אז במדריך הקודם למדנו קצת על Shell Scripting, והשתמשנו במעט מאוד קוד כדי להפעיל מערכות יחסית מורכבות. זה הכוח האדיר של Shell Scripting. כל מה שאפשר להפעיל באמצעות תוכנות שורת פקודה (Command line programs) אפשר לנצל לצרכינו במעט עבודה, יחסית.

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

קריאת המדריך הקודם

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

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

כמו בכל סיפור - שלושה חלקים: התחלה, אמצע וסוף

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

לצורך כך, ניצור שלושה קבצים בתקיית /home/pi. לקובץ ההתחלה קראתי startofday.sh, לקובץ האמצע recording.sh ולקובץ שאחראי על סוף התהליך קראתי endofday.sh. לא מאוד מקורי, אבל עובד.

צרו את שלושת הקבצים בתקייה, ובאמצעות chmod דאגו שהמערכת מורשת להפעיל את הקבצים (ראו מדריך קודם אם אתם לא זוכרים איך (“הופכים את הקובץ shell לexecutable“).

 

צרו את שלושת הקבצים

צרו את שלושת הקבצים

קובץ ראשון - startofday.sh

עורכים את הקובץ הראשון ומזינים לתוכו את הקוד הבא:

#!/bin/sh
dayis=$(date +"%Y-%m-%d")

mkdir "$dayis"
chmod +x "$dayis"

הסבר:

שורה 1: שים לב, רספברי פיי, זהו קובץ shell
שורה 2: בתוך המשתנה dayis נזין את התאריך של היום בפורמט של שנה-חודש-יום
שורה 3: צור ספריה באמצעות הפקודה mkdir(בתקיה הראשית, כי לא ציינו אחרת) בשם שנמצא בתוך משתנה dayis
שורה 4: שנה את הספריה כך שהיא תהיה נגישה לכולם (שאפשר יהיה לכתוב בה)

קובץ שני - recording.sh

עורכים את הקובץ השני, ומזינים לתוכו את הקוד הבא:

#!/bin/sh
dateis=$(date +"%Y-%m-%d-%H-%M")
dayis=$(date +"%Y-%m-%d")
arecord -v -f dat -r 48 -D hw:1,0 -d 18000 -c 2 -N "$dayis"/"$dateis".wav

הסבר:

שורה 1: כנ”ל
שורה 2: בתוך המשתנה dateis נזין את התאריך של היום בפורמט של שנה-חודש-יום-שעה-דקה
שורה 3: בתוך המשתנה dayis נזין את התאריך של היום בפורמט של שנה-חודש-יום
שורה 4: נתחיל הקלטה עם התוכנה arecord של 18,000 שניות (חמש שעות) כשקובץ הפלט ימוקם בתוך התקייה שיצרנו בקובץ הראשון (מתוך המשתנה dayis) עם השם שנמצא בתוך המשתנה dateis.

כמה דברים להעיר כאן:

  • את העבודה הבסיסית עם arecord הסברתי כבר, צריך לדאוג להכיר את המיקרופון שלכם ולהגדיר אותו כראוי, ולצורך זה גשו למדריך הקודם.
  • בעיקרון אפשר להוסיף לשורת פקודה כזו (שורה 4), אחרי ה-N:
    | lame $"dateis".mp3ובזה להפעיל את התוכנה lame כדי להמיר את הקובץ ישירות לmp3 בלי לעבור בwav. אבל… נתקלתי כאן בבעיה. לעיתים בניסויים שלי הarecord הפסיק להקליט אחרי נניח 3 שעות. אז רציתי להשתמש בפקודה שתבדוק אם arecord עובדת או לא, ואם לא אז שתקליט ואם כן שלא תפתח עוד הקלטה (כדי לא לגרום למערכת לקרוס מעודף תהליכים וקבצים מיותרים. ההגדרה -N בדיוק עושה את זה. זאת הגדרה של arecord שמתחילה את ההקלטה רק אם arecord כרגע לא בשימוש. אבל… והנה האבל מגיע. היא לא עובדת כמו שצריך אם אני מוסיף את התוספת של lame. לכן אנחנו נאלצים להקליט את כל הקבצים בwav, ורק בקובץ הסיום להתעסק עם ההמרה.

קובץ שלישי - endofday.sh

עורכים את הקובץ השלישי, endofday.sh ומזינים את הקוד הבא:

#!/bin/sh
killall arecord
dateis=$(date +"%Y-%m-%d-%H-%M")
dayis=$(date +"%Y-%m-%d")

cd ~/$dayis

for file in *.wav
    do lame "$file" 
    rm "$file"
done

הסבר:

שורה 1: כנ”ל
שורה 2: אם arecord עובדת, לסגור בכוח את התהליך.
שורה 3: כנ”ל
שורה 4: כנ”ל

שורה 6: להכנס באמצעות הפקודה cd לתוך תקיית היום ששמורה במשתנה dayis

שורה 8: לולאה עבור כל קובץ wav שנמצא בתקייה
שורה 9: להפעיל עבור הקובץ את lame (שתמיר את הwav לקובץ mp3 של ההקלטה המקורית, דהיינו מקווץ בערך פי 10, סדר גודל של 50 מגה במקום חצי ג’יגה).
שורה 10: למחוק באמצעות הפקודה rm (קיצור של remove) את קובץ הwav שהמרנו זה עתה.

דגשים:

  • זאת הייתה הפשרה שאיפשרה לי לדלג על המרה ישירה לmp3. פשוט להמיר בסוף היום את כל הקבצים שישנם.
  • למה שיהיה יותר מקובץ אחד? הרי אמרנו לarecord להקליט 5 שעות רצוף? ובכן, כמו שאמרתי, ראיתי שהקלטה של חמש שעות עשויה להשתבש, אז באמצעות cron בשלב הבא, עקפתי את הבעיה הזו.

לעדכן את cron

כעת נכתוב בטרמינל, כמו שכבר עשינו במדריך הראשון crontab -e, ונזין את ההגדרות הבאות:

55 7 * * * /home/pi/startofday.sh
*/1 8-12 * * * /home/pi/recording.sh
5 13 * * * /home/pi/endofday.sh

הסבר:

  • ההגדרה הראשונה תפעיל את הקובץ startofday.sh בחמישה לשמונה, והקובץ ייצור תקיית עבודה ליום זה.
  • ההגדרה השניה תפעיל את הקובץ recording.sh בכל דקה בין 8:00 ל12:59. למה כל דקה? שתי סיבות:
    • אמרנו שיכול להיות שarecord תפסיק להקליט. זה יכול להיות בגלל עומס מערכת, או אפילו הפסקת חשמל. בגלל שcron היא פעולת מערכת בסיסית, ובהנחה שבשעה חמישה לשמונה המערכת עבדה ויצרה את הקובץ, גם אם הייתה הפסקת חשמל ב10:07 כבר בדקה אחרי יתחיל קובץ חדש.
    • הדרך למנוע עשרות של הקלטות סרק ותהליכים עודפים של התכנית הוא, כמו שכבר אמרנו באמצעות ההגדרה -N שבתוך פקודת ההקלטה של arecord שבתוך הקובץ recording.sh. בכל דקה הcron יפעיל את recording.sh מחדש אבל אם arecord עובדת כבר (דהיינו מקליטה כרגע) הוא פשוט לא יתחיל הקלטה חדשה ויסיים את התהליך שאותו יתחיל דקה אחרי שוב ושוב יבדוק את אותה הבדיקה. אם מתי שהוא ההקלטה הסתיימה במקרה, arecord יתחיל קובץ חדש, ובסוף נקבל את כל זמן ההקלטה מינוס המרווח שבין הקריסה ועד לדקה העגולה הבאה.
  • ההגדרה השלישית תפעיל את הקובץ endofday.sh באחת וחמישה, תעצור את arecord אם היא עדיין עובדת (והיא אמורה עדיין לעבוד, בזכות הלולאה שבהגדרת cron של recording.sh) ואז תמיר את כל הקבצים שיש בתקיה של היום לקבצי mp3 ותמחק את כל האחרים.
הגדרת הcron שמתאימה למטרה שלנו

הגדרת הcron שמתאימה למטרה שלנו

זהו, המשימה הושלמה

אם הכל עובד כראוי, תוכלו להתבונן ב13:15 פחות או יותר, ולראות בין קובץ אחד למספר קבצי mp3 שמכילים את ההקלטה בתוך התקיה ששמה הוא התאריך של היום. ככה יקרה בכל יום ובכל יום הקלטות של בערך 50M יתווספו, ויאפשרו לכם להקליט 20 יום על כל ג’יגה שבכרטיס הזיכרון (מינוס ג’יגה אחת חופשית שכדאי להשאיר לעבודת המערכת). אם יש לכם כרטיס זיכרון של 16GB, וההתקנה הבסיסית משאירה אתכם עם 10.5 ג’יגה, אפשר להניח שבמצב הנוכחי הרשמקול יכול להשאר ולהקליט 9.5*20 = 190 יום! רצופים, כל עוד הוא מחובר לחשמל.

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

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

הצטרפות

דילוג לתוכן