I wanna make something to help children who have difficulty completing their assignments to complete them , through a board to write their assignment on and help them choose the way they want to arrange their assignments , and temporary work that makes them feel the time factor , and also by encouraging the child with motivational phrases while working .
The reason I am interested in this idea is that I have seen many children having difficulty completing their homework. It may seem simple, but for some it actually causes a problem.
For inspiration, at first I did not look for projects similar to what I wanted to do. I wanted to first think about the solutions that I could offer and then search again for what could be added but while thinking but while thinking, I thought about what the children liked and tried to add them in harmony with each other. I thought about making the device a mixture of manual and digital work, so I thought about providing the device with a whiteboard , in order to allow the child to write on it, and I see that writing helps a lot in expressing ideas well, and to allow the child to write in the way he prefers, whether writing, drawing, or combining them, and also in graphic maps, as for the manual part . Then after that I moved to think about the digital part, so I thought about making a timer to help the child understand the factor of time and providing the device with a display screen to display the timer on. I also wanted to add some motivational phrases to the screen, which in turn encourage the user, and also add a speaker that speaks what appears on the screen.
software
Machines
Materials
Firstly, Designing the robot's body ,
using fusion 360 :
I started sketching the faces of the body one by one ( using rectangle and circle ) .
Without forgetting to make sure that the sketch was fully defined .
Made the joints' place * using T_slot
Extruded the sketches and copy & paste similar parts ( front & back and sides ) .
Jointed them together starting with the bottom to the top .
And checked the interference to make sure that they have jointed successfully .
Saved each face of the design in * DXF format
5 . using laser work :
Imported my DXF file
Set the settings of color , speed and power .
Saved the file in *AI format .
took it on my memory card .
using UltiMaker_Cura :
Opened the file in cura
Set the orientation and starting face
Adjusted settings of ( layer height , infill , support and adhesion )
Make slice and show preview
save to get G_code .
For laser cutter :
I turned the machine on
Opened my file on the PC connected to the machine
Checked its settings again (color , speed , power)
Downloaded my file
Went to the machine ,
specified the starting point using arrows and enter
Tested the focus by pressing pulse
Tested the frame of the design by pressing frame
After finishing preparation pressed start
For 3d printer :
Opened my file on my PC
Checked its settings again (orientation , scale , lay flat , infill , support , adhesion)
Saved to the disk
Took G_CODE from PC to the memory card to connected it to the machine
Went to the machine ,
choose gray filament and put it in the machine
Using control knob
Choose print from SD then choose my file name
Checked speed and heating temperature for the filament and bed
The circuit consists of three push button (used as an input components) control three choices :
Start , to start working with a timer help you realize the factor of time .
Pause , to stop the timer for some reason .
Reset , to return again if after stopping .
The effect of the buttons appears on the LCD screen(used as an output components) , where the timer appears on it with selected mode.
There is a dfplayer module with a speaker (used as an output components) ,to communicate with the child .
software
Components
The power source is a 9v adapter , as this device will be used during studying or doing an office tasks so, It will be stable in its place on the desk .
To operate the components in the circuit, It does not need more than 9 volts,
as it consist of LCD Screen and DFPlayer Module with three push buttons control them . And The Arduino runs on 9 volts .
To build the code :
Firstly, I started with bringing the libraries needed for LCD Screen and DFPlayer .
Then , defined the buttons with const int variables and their states with bool variables for control the displaying period of it .
Then defined the work and break times with an unsigned long variables as it a long periods .
After that went to the void setup to set the start settings :
Set the buttons as an INPUT_PULLUP and the setting of LCD Screen and DFPlayer .
With a user welcome message .
And after that went to the void loop to make the conditions of the code:
First one : by click on the yellow button , the timer start , over time there are encourage messages written and heared .
Second one : by click on the green button , the timer be paused .
Third one : by click on the red button , the timer be reset .
There is the code :
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
// إعدادات شاشة LCD باستخدام I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // شاشة LCD 16x2
// إعداد DFPlayer Mini
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
// تعريف أزرار التحكم
const int startButton = 4; // الزر الأول
const int pauseButton = 5; // الزر الثاني
const int resetButton = 6; // الزر الثالث
// تعريف المتغيرات الخاصة بالتحكم في المؤقت
unsigned long startTime = 0; // وقت البدء
unsigned long currentTime = 0; // الوقت الحالي
bool isRunning = false; // حالة المؤقت
bool isPaused = false; // حالة التوقف
// تعريف الفترات الزمنية
unsigned long workTime = 45000; // 45 ثانية للعمل
unsigned long restTime = 15000; // 15 ثانية للاستراحة
bool isWorkPeriod = true; // هل نحن في فترة العمل؟
// لتجنب تكرار أوامر الزر عند الضغط الطويل
bool lastStartButtonState = LOW;
bool lastPauseButtonState = LOW;
bool lastResetButtonState = LOW;
bool hasDisplayedKeepGoing = false; // حالة لعرض "Keep Going!"
void setup() {
// إعداد الأزرار كمداخل مع مقاومات السحب الداخلية (INPUT_PULLUP)
pinMode(startButton, INPUT_PULLUP);
pinMode(pauseButton, INPUT_PULLUP);
pinMode(resetButton, INPUT_PULLUP);
// إعداد شاشة LCD
lcd.init(); // تهيئة شاشة LCD
lcd.backlight(); // تشغيل الإضاءة الخلفية
// إعداد DFPlayer Mini
mySoftwareSerial.begin(9600);
if (!myDFPlayer.begin(mySoftwareSerial)) {
lcd.clear();
lcd.print("DFPlayer Error!");
while (true); // توقف إذا لم يتم الاتصال بنجاح
}
myDFPlayer.volume(25); // تعيين مستوى الصوت (0-30)
lcd.clear();
lcd.print("Ready to Start!"); // رسالة أولية
myDFPlayer.play(1);
}
void loop() {
// قراءة حالة الأزرار
bool startButtonState = digitalRead(startButton);
bool pauseButtonState = digitalRead(pauseButton);
bool resetButtonState = digitalRead(resetButton);
// التحقق من حالة زر البدء مع التبديل (toggle)
if (startButtonState == LOW && lastStartButtonState == HIGH) {
if (!isRunning) {
startTime = millis(); // حفظ وقت البدء
isRunning = true;
isPaused = false;
hasDisplayedKeepGoing = false; // إعادة تعيين حالة عرض "Keep Going"
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Work Time!"); // بدء فترة العمل
myDFPlayer.play(2); // تشغيل الملف الصوتي الأول (رسالة "Work Period")
isWorkPeriod = true; // نبدأ بفترة العمل
}
}
lastStartButtonState = startButtonState;
// التحقق من حالة زر التوقف مع التبديل (toggle)
if (pauseButtonState == LOW && lastPauseButtonState == HIGH) {
if (isRunning && !isPaused) {
isPaused = true;
isRunning = false;
lcd.clear();
lcd.print("Paused!");
myDFPlayer.play(3); // تشغيل الملف الصوتي الثاني (رسالة "Paused")
}
}
lastPauseButtonState = pauseButtonState;
// التحقق من حالة زر إعادة التعيين مع التبديل (toggle)
if (resetButtonState == LOW && lastResetButtonState == HIGH) {
isRunning = false;
isPaused = false;
startTime = 0;
lcd.clear();
lcd.print("Timer Reset!");
myDFPlayer.play(4); // تشغيل الملف الصوتي الثالث (رسالة "Timer Reset")
delay(2000);
lcd.clear();
lcd.print("Ready to Start!");
isWorkPeriod = true; // إعادة التعيين لفترة العمل
}
lastResetButtonState = resetButtonState;
// حساب الوقت إذا كان المؤقت يعمل
if (isRunning) {
currentTime = millis() - startTime;
if (isWorkPeriod) {
// فترة العمل
if (currentTime >= workTime) {
// إذا انتهت فترة العمل، نبدأ فترة الاستراحة
lcd.clear();
lcd.print("Great Job!");
myDFPlayer.play(5); // تشغيل الملف الصوتي الرابع (رسالة "Great Job")
delay(2000); // عرض "Great Job!" لمدة 2 ثانية
lcd.clear();
lcd.print("Rest Time!"); // بدء فترة الاستراحة
myDFPlayer.play(6); // تشغيل الملف الصوتي الخامس (رسالة "Rest Period")
startTime = millis(); // إعادة ضبط الوقت لبداية الاستراحة
isWorkPeriod = false; // الانتقال إلى فترة الاستراحة
} else if (currentTime >= workTime / 2 && !hasDisplayedKeepGoing) {
// إذا تم نصف فترة العمل، عرض "Keep Going!"
lcd.clear();
lcd.print("Keep Going!");
myDFPlayer.play(7); // تشغيل الملف الصوتي السادس (رسالة "Keep Going")
unsigned long keepGoingStartTime = millis(); // بدء وقت عرض الرسالة
while (millis() - keepGoingStartTime < 2000) {
// عرض الوقت أثناء عرض "Keep Going!"
currentTime = millis() - startTime;
lcd.setCursor(0, 1);
lcd.print("Time: ");
lcd.print(currentTime / 1000); // طباعة الوقت بالثواني
lcd.print("s ");
}
lcd.clear();
lcd.print("Work Time!"); // العودة لعرض "Work Period!"
hasDisplayedKeepGoing = true; // تعيين الحالة بعد عرض الرسالة
}
// عرض الوقت الحالي على السطر الثاني
lcd.setCursor(0, 1); // السطر الثاني
lcd.print("Time: ");
lcd.print(currentTime / 1000); // طباعة الوقت بالثواني
lcd.print("s ");
} else {
// فترة الاستراحة
currentTime = millis() - startTime; // تحديث الوقت في فترة الاستراحة
if (currentTime < restTime) {
// عرض الوقت المتبقي في فترة الاستراحة
lcd.setCursor(0, 1);
lcd.print("Rest Time: ");
lcd.print((restTime - currentTime) / 1000); // طباعة الوقت المتبقي بالثواني
lcd.print("s ");
} else {
// إذا انتهت فترة الاستراحة، نعيد المؤقت أو نعرض رسالة جديدة
lcd.clear();
lcd.print("Ready to Start!");
myDFPlayer.play(8); // تشغيل الملف الصوتي السابع (رسالة "Ready to Start")
isRunning = false; // إيقاف المؤقت بعد فترة الاستراحة
}
}
}
delay(200); // تأخير صغير لتجنب طباعة سريعة جداً
}
I started with the digital part,
I started testing the ingredients individually:
First , Tested the DFPlayer module , At first there was a problem with the dfplayer module as the SD card needed a format ,but after solving this problem , I managed to upload MP3 files on and It's all done .
Then , tested LCD Screen , first used I2C Scanner code to make sure that the Arduino read the LCD , then used example Hellow world to start using my LCD .
After that tested the buttons with a small circuit to make sure that they reflect well .
Finally , integrated all of them together and built the code step by step .
Yes , of course . I asked my friends for give me their opinion , some one told me to provide the device with a clock , It was a good idea but I did not do that .The idea that I built upon , when I asked the mothers about the way children like to express what is inside them, and they told me that it is writing or drawing, which made me think about using the whiteboard.
My friend and I have a similar project to each other. Also, we are both beginners in the field of programming, and we use new components that we see for the first time, so we help each other write the code and understand it.
When I was facing any problem , the first thing I do is : check the wiring , and to avoid this problem I tested all the wires continuity , but sometimes make a big mistake and the positive terminal replaces the negative terminal which caused a short circuit !
Also while testing DFPlayer module , the sd card needed to be format, and I did not know how to do that so , I asked the fab lap specialist to help me with that .
Wanna saying something but , the code make me try and try lots of times to achieve this!
I was hoping to make the robot move, like waving its hands when unlocking the device. I also hope that in the near future he will become more intelligent and connected with people.