10 במרץ 2023

FreedomBox פסח 2023

תקציר

"מִמִּצְרַיִם גְּאַלְתָּנוּ, מִבֵּית עֲבָדִים פְּדִיתָנוּ".

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

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

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

צורת המחומש מעוטרת בציורים וקטוריים שנרכשו מחברת ShutterStock, כולם קשורים למסורת חג הפסח. פאה אחת העיצוב כולל גריל רמקול 3W, בעוד שהכיסוי מצויד בכפתור Arcade אדום וענק מבית Adafruit.



תאור הפרוייקט

תאור מפורט של הפרוייקט ורשימת רכיבים, כלים, תוכנות וקישורים, ניתן למצוא כאן:

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

התכנון מבוסס על מעבד אודיו ומעבד ESP32 זעיר מבית Seeed.

רכיבים

  • Seeed Studio XIAO ESP32C3 - Main processor
  • DFRobot, DFPlayer mini - Music player/Amplifier
  • לוח MDF 3mm. במידות 40X70 ס"מ
  • כפתור ארקייד גדול אדום מAdafruit
  • רמקול 3W מAdafruit + פלוס מכסה מותאם בהדפסת תלת מימד.
  • כבל USB Type A-TypeC. 
  • כבלי גישור מסוג Dupont נקבה לנקבה.
כאמור, קישורים לחלקים מופיעים בפרסום באתר Hackster בקישור למעלה.

חיתוך ובניה

היות וקניתי את התמונות הווקטוריות ShutterStock, אני יכול לשתף רק את המבנה הגולמי של הקופסא שבוצע באתר https://en.makercase.com


קבצי DXF. ניתן קישור לפרסום לHackster.

חיתוך לייזר באמצעות מכונת Ortur Laser Master 3.


תחילת הרכבת הפאות


הרכבת הרמקול



הרכבת הלחצן



הרכבת המעבדים 


התוצאה הסופית





תוכנה, חומרה וחיווט

השתמשתי בשני המדריכים הנהדרים האלה במדריכים קדימה כדי לחבר את מעבד xiao ESP32 ל-DFPlayer.


מעבד XIAO של חברת Seeed

מקור: אתר Seeed

מעבד האודיו והמגבר

מקור: אתר DFrobot


חיווט חשמלי






יצרתי גרסה קצרה לשיר הפסח (ששר זבולון נתנוב בניגון החב"די) ושמרתי אותו כקובץ mp3.00001 בכרטיס  mini SD של DFPlayer. 
כדי להשמיע את השיר, השתמשתי בפונקציית UART של פינים 6 ו-7 של מעבד Xiao.
בכל פעם שהלחצן נלחץ, נשלחת פקודה סיריאלית ל-DFPlayer כדי להפעיל את קובץ השמע המתאים. הסבר מפורט מאד על הרכיב ניתן למצוא במדריכים של DFRobot שצירפתי למעלה.

קוד המקור


/***************************************************
This code utilize Freedom Box design based on example by
By [Angelo qiao](Angelo.qiao@dfrobot.com)
Adaptations and xiao code by Asaf Matan
GNU Lesser General Public License.
****************************************************/
#include "Arduino.h"
#include <HardwareSerial.h>
#include "DFRobotDFPlayerMini.h"
//Define two Serial devices mapped to the two internal UARTs
HardwareSerial MySerial0(0);
DFRobotDFPlayerMini myDFPlayer;
const int buttonPin = D2;
// State of the push button
int buttonState = 0;
void printDetail(uint8_t type, int value);
void setup()
{
delay(5000);
MySerial0.begin(9600, SERIAL_8N1, -1, -1);
Serial.begin(115200);
pinMode(buttonPin, INPUT_PULLUP);
Serial.println();
Serial.println(F("DFRobot DFPlayer Mini Demo"));
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
if (!myDFPlayer.begin(MySerial0)) { //Use softwareSerial to communicate with mp3.
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Please recheck the connection!"));
Serial.println(F("2.Please insert the SD card!"));
while(true);
}
Serial.println(F("DFPlayer Mini online."));
myDFPlayer.volume(20); //Set volume value. From 0 to 30
myDFPlayer.play(1); //Play the first mp3
}
void loop()
{
buttonState = digitalRead(buttonPin);
if (buttonState == LOW)
{
myDFPlayer.play(1);
if (myDFPlayer.available())
{
printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
}
}
delay(500);
}
void printDetail(uint8_t type, int value){
switch (type) {
case TimeOut:
Serial.println(F("Time Out!"));
break;
case WrongStack:
Serial.println(F("Stack Wrong!"));
break;
case DFPlayerCardInserted:
Serial.println(F("Card Inserted!"));
break;
case DFPlayerCardRemoved:
Serial.println(F("Card Removed!"));
break;
case DFPlayerCardOnline:
Serial.println(F("Card Online!"));
break;
case DFPlayerPlayFinished:
Serial.print(F("Number:"));
Serial.print(value);
Serial.println(F(" Play Finished!"));
break;
case DFPlayerError:
Serial.print(F("DFPlayerError:"));
switch (value) {
case Busy:
Serial.println(F("Card not found"));
break;
case Sleeping:
Serial.println(F("Sleeping"));
break;
case SerialWrongStack:
Serial.println(F("Get Wrong Stack"));
break;
case CheckSumNotMatch:
Serial.println(F("Check Sum Not Match"));
break;
case FileIndexOut:
Serial.println(F("File Index Out of Bound"));
break;
case FileMismatch:
Serial.println(F("Cannot Find File"));
break;
case Advertise:
Serial.println(F("In Advertise"));
break;
default:
break;
}
break;
default:
break;
}
}
view raw freedombox.ino hosted with ❤ by GitHub

מילות סיכום

שמחתי מאד לבצע את הפרוייקט בשיתוף עם חברת Seeed. יהיו אולי כאלו שיתהו על השילוב של רוחניות וטכנולוגיה, אבל זה חלק ממי שאני. אני להוט להתחבר, לשתף ולדון עם אחרים שחולקים נקודות מבט דומות.
ניתן ליצור קשר בתגובות וכן בקישור הזה: http://linktr.ee/asafmatan

אין תגובות:

הוסף רשומת תגובה