18. Project development¶
First week¶
During the first week of the Fab Academy class, we were assigned to choose a final project and work on it throughout the course. Initially, I had no idea what project to pursue. However, after some research on YouTube, I came across the concept of a vertical axis windmill, and I decided to work on that. Although I wasn’t particularly interested in this project, I proceeded with it.
VAWT¶
In the ninth week of the course, we learned about class-output devices, and I had the opportunity to create a PCB where I connected a stepper motor and an OLED display. This experience made me reconsider my project choice. After further exploration, I discovered a concept known as the “Dual-axis Solar Tracking System,” which intrigued me. I decided to change my project to focus on this solar tracking system.
Duel Axis Solar Tracking System¶
During the 11th week of the Fab Academy, I focused on an SMT (Surface Mount Technology) Phototransistor input device. This device allows me to measure the intensity of light. For my project, I placed four phototransistors in different quadrants, and I used a 3D printed shade to separate them. This arrangement ensures that each phototransistor receives light with varying intensities.
This component plays a crucial role in a dual-axis solar tracking system. By detecting the intensity of light falling on the phototransistors, the system can adjust the tilt of the solar panel accordingly. This helps optimize the solar panel’s position to capture the maximum amount of sunlight throughout the day.
During the 13th week of the Fab Academy, I focused on the nRF24L01 transceiver module, which enables wireless communication. I intend to utilize this module to establish data transmission between a solar panel and a control board.
By incorporating the nRF24L01 transceiver module into my project, I can establish a wireless communication link between the solar panel and the control board. This enables the transmission of data in both directions. The panel can send important information or measurements to the control board, while the control board can relay instructions or commands back to the panel as needed.
This wireless communication capability enhances the functionality and versatility of my dual-axis solar tracking system. It facilitates real-time monitoring, control, and coordination between the solar panel and the control board without the need for physical connections.
During the 15th week of the Fab Academy, we had a wildcard week review, where I learned that another participant in the Fab Academy 2023 batch is already working on a project similar to mine. Additionally, some of my Fab Academy friends informed me that it is a common project that has been done before.
Considering this feedback and the desire to work on something unique, I have decided to change my project once again. It’s important to explore new ideas and contribute something original to the Fab Academy community. I will take this opportunity to brainstorm and research for a fresh project idea that aligns with my interests and showcases my creativity.
The following day, I brought a toy called the “Talking Cactus” to the Fab Academy. This toy, given to my 5-year-old child by her cousin, had a problem with its speaker. I decided to investigate the issue and, if possible, repair it. The Talking Cactus is an interactive toy that mimics what we say and dances.
When my FabLab mentor, Mr. Saheen Palayi, saw the toy, he suggested that I undertake a project inspired by it. Intrigued by the idea, I searched the internet for character options and stumbled upon a cat character that caught my attention. I decided to shift my focus from the cactus to the cat.
My plan for the project was to create a mechanism that would raise the cat’s hand and move its hips in sync with the music while playing tracks stored on an SD card module. During my research, I came across a linkage mechanism on Pinterest, which seemed suitable for my project. Excited about this new direction, I began sketching rough designs to visualize the concept.
After beginning the design process in Fusion 360, my first task was to create the base cabin that would house the PCB and servo motor for the cat’s motion. However, I encountered difficulties while attempting to design the links that would enable the movement of the hands and hips.
At that moment, I recalled our mentor, Shaeen Palayi, mentioning the design of a similar robot. I decided to search for a relevant design that could serve as a reference. Fortunately, I found an appropriate design and imported an image of it into Fusion 360. Using the image as a guide, I began sketching and incorporating the necessary elements into my own design. This allowed me to overcome the obstacle and proceed with the project.
During the 16th week of the Fab Academy, as part of the “Application and Implication” assignment, I created a block diagram of the electronic circuit using an online application called Flow Chart Maker and Line Diagram. This tool allowed me to visualize and plan the overall structure of my circuit by representing it in a block diagram format.
After completing the seventeenth week of the Fab Academy, I proceeded with the design phase of the entire object. During the design process, I utilized various techniques to create the desired shape and structure.
One approach I employed was designing the entire body as a solid block.One approach I employed was designing the entire body as a solid block.
Additionally, I utilized the shell command extensively. This command enabled me to make all the parts of the object hollow.
Fusion Design¶
After completing the design phase of the robot, I moved on to the 3D printing process. To ensure ease of assembly and disassembly, I designed the robot parts in a modular manner.
For the assembly of the robot, I incorporated the use of screws in some parts. This allowed for a secure and stable connection between components, ensuring that they would stay in place during operation.
In addition to screws, I also utilized press-fit connections for certain parts.Press-fit connections simplified the assembly process and reduced the number of fasteners required.
By combining both screw-fastened and press-fit connections, I ensured that the robot parts could be easily assembled and disassembled when necessary. This modularity facilitated maintenance, repairs, and potential future modifications to the robot.
3D printing¶
Bottom base¶
The bottom base of the robot accommodates the main PCB (Printed Circuit Board) and the switch PCB.
Body¶
The body part of the project securely holds two servo motors using a clamp mechanism.
Head¶
Midpart¶
3D printing¶
All the parts 3D printed are arranged for test assembly
Casting¶
I am now at the stage of casting the mold. I want to ensure that the NeoPixel, located just below the midpart of the robot, is clearly visible. To achieve this, my plan is to cast a resin ring around the NeoPixel, allowing its light to shine through.
For that I made a 3D printed ring insted of milling.Applies some metal putty to get the surface smooth. After that I made a 3D printed case for pouring the sylicon mould. Keeping the 3D printed ring inside the case and poured the silicon rubber mold. I encountered an issue where the 3D printed ring floated on top of the silicon. However, I am able to find a solution to this problem,I suddenly press the ring with the stick and hold it for some time so that it will stick to the bottom of the case. Unfourtunatly I foget to take the picture. Finaly it works and I got the mold
I casted two resin rings, one with black bottom layer to resist the neo pixel light passing to the base. this was avoided because, the shade highlights and looks odd.So I casted a clear resin ring.
Milling Mold¶
Now its time to mill the eyes and switch of robot.
Now its time to cast with silicon rubber mixture
Fixing eyes inside the head¶
Casted slicon eyes pad is cut in to shape and placed inside the head and applied some hot glue.
Same process was repeated in the switch casting. Here O laminated the switch pad in between the switch PCB and bottom case whis is screwed to the base.
Designing PCB in KiCad¶
Power switch board
Main Board
USB C type
PCB Milling¶
Now its time for to mill the PCB. I decided to print three board, one main board and the other for switch and another for fixing the USB C type.
.
BOM¶
|Sl No| Part Name| Quantity |Price | Total | Source| |—| ------- |------- |----- |---- |----- | | 1 | 2mm Black Acrilic sheet| 1’ x 1’|-|-| Fab Inventory| | 2 | Neopixel| 250mm | Rs.450 |Rs.450 |Online store | | 3 |Push Botton| 1nos|-|-|Fab Inventory| | 4 |ESP 32 Wroom 32|1 nos|-|-| Fab Inventory| | 5 |SPI based SD card reader| 1nos | -|-|Fab Inventory | | 6 |Speaker3W| 1 nos|-|-|Fab Inventory| | 7 |Audio amplifier module | 1nos |-|-|Fab Inventory| | 8 |USB Mini|1nos|-|-|Fab Inventory| | 9 |1NMP441 omnidirectional microphone|1Nos|Rs.267|Rs.267|Online| | 9 |miscellaneous|-|-|-|Fab Inventory|
Soldering¶
Laser cutting¶
I prefered laser cutting for side panel of robot base. I faces a difficulties for drawing the side panel due to the cone shape. So I develop a sketch tracing from the base and placed over the cutting pad. From here I take the dimension and draw in living hinges in fusion.The dimension of living hinges are made maually. After some trial and error I got the perfect one which fix pefectly.
Assembly¶
Fixed the main board over the bottom bace cover, whic can be screwed to the base of robot.
Now two servo motors are placed inside the chest of the robot for hand movement.
One servo motor is place inside the midpart for the movement of hip part.
Fixing the speaker and neo pixel inside the head. Neo pixel is place at the back of the eyes pad and hot glued. there is a cavity for acoomadating the speaker and I placed a cap over the speaker to get a clear sound.
Below inage showing the wires connecting to power switch and USB port.
Below images are the semi test assembly, here you can see the black shaded neo pixel ring.The last image show the ring is replaced wiht clear one.
Programming¶
#include <Wire.h>
//Button
# define button 17
bool bPush = false;
//Neo Pixel LED
# define neoPixel 27
// How many leds in your strip?
# define NUM_LEDS 16
//i2s mic
# define I2S_WS 33
# define I2S_SD 35
# define I2S_SCK 32
//Servo pins
# define leftArm 21
# define rightArm 22
# define waist 26
# include
# include "SoundData.h"
# include "XT_DAC_Audio.h"
# include
Servo LeftArm;
Servo RightArm;
Servo Waist;
int pos = 0; // variable to store the servo position
int prepos = 1;
bool dir = true;
int period = 1000;
unsigned long time_now = 0;
unsigned long time_early = 0;
unsigned long loop1 = 0;
unsigned long loop2 = 0;
bool dirLED =true;
int count1 =0;
int count2 =0;
static uint8_t hue = 0;
# define NORMAL_SPEED 1 // These are the playback speeds, change to
# define FAST_SPEED 1.5 // see the effect on the sound sample. 1 is default speed
# define SLOW_SPEED 0.75 // >1 faster, <1 slower, 2 would be twice as fast, 0.5 half as fast
XT_DAC_Audio_Class DacAudio(25, 0); // Create the main player class object.
// Use GPIO 25, one of the 2 DAC pins and timer 0
XT_Wav_Class WarOfWorlds(WarOfWorldsWav); // create an object of type XT_Wav_Class that is used by
// the dac audio class (above), passing wav data as parameter.
// SpeedArray contains the order in which the code will playback the sample at the designated speeds
float SpeedArray[] = { NORMAL_SPEED, FAST_SPEED, SLOW_SPEED };
CRGB leds[NUM_LEDS];
void setup() {
LeftArm.attach(leftArm);
RightArm.attach(rightArm);
Waist.attach(waist);
FastLED.addLeds(leds, NUM_LEDS);
FastLED.setBrightness(84);
leds[14] = CRGB(0,255,0);
leds[15] = CRGB(0,255,0);
for(int i=0; i<=13; i++)
{
leds[i] = CRGB(255,0,0);
}
FastLED.show();
}
void fadeall() {
if(count1<=NUM_LEDS)
{
count1++;
}
else
{
count1=0;
}
leds[count1].nscale8(250);
loop1=time_now;
}
void loop() {
time_now = millis();
if (digitalRead(button) && !bPush) {
bPush = true;
}
playMusic(0);
// if( bPush)
// {
// for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
// // in steps of 1 degree
// Waist.write(pos); // tell servo to go to position in variable 'pos'
// delay(15); // waits 15ms for the servo to reach the position
// }
// for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
// Waist.write(pos); // tell servo to go to position in variable 'pos'
// delay(15); // waits 15ms for the servo to reach the position
// }
// }
if (pos != prepos) {
LeftArm.write(pos);
RightArm.write(180 - pos);
Waist.write(pos);
prepos = pos;
}
}
void playMusic(int speed) {
DacAudio.FillBuffer(); // Fill the sound buffer with data, required once in your main loop
if (WarOfWorlds.Playing == false && bPush) {
WarOfWorlds.Speed = SpeedArray[speed];
DacAudio.Play(&WarOfWorlds);
}
if (WarOfWorlds.Playing == true) {
Move();
// cyclon();
bPush = false;
}
}
void Move() {
if ((time_now - time_early) >= 15) {
if (dir) {
pos++;
} else {
pos--;
}
if (pos >= 180) { dir = false; }
if (pos <= 0) { dir = true; }
time_early = time_now;
}
}
void cyclon()
{
// Now go in the other direction.
if ((time_now - loop2) >= 10)
{
if (dirLED) {
count2++;
} else {
count2--;
}
if (count2 >= (NUM_LEDS)-1) { dirLED = false; }
if (count2 <= (NUM_LEDS)-1) { dirLED = true; }
leds[count2] = CHSV(hue++, 255, 255);
// Show the leds
FastLED.show();
// now that we've shown the leds, reset the i'th led to black
// leds[i] = CRGB::Black;
fadeall();
loop2=time_now;
}
}
Slide¶
Video¶
(Download fusion Design step Files.)
(Download KICad Design Files for main PCB.)
(Download KICad Design Files for power switch PCB.)
(Download KICad Design Files for USB C type PCB.)
Check List¶
1. What tasks have been completed?
2. What tasks remain?
3. What's working?
4. What's not?
5. What questions need to be resolved?
6. What will happen when?
7. What have you learned?
All the above question are answered as on dated 31/5/2023.
What tasks have been completed?¶
-
Designing of body part, bottom base, Middle part of the robot and mold ring for casting resign ring.
-
Test assembly of body part fitted with servo motor.
What tasks remain?¶
- Designing of hear assembly
- Lase cut of ling hinges.
- Desingning of PCB
- Production of PCB
- Programming
- Full Assembly
What’s working?¶
- Servo movement attached to hand is properlly working.
What’s not?¶
- As if now, I not able to say which one will not work. All the parts have to be printed and assembled for furhter checking
What questions need to be resolved?¶
- Is it required to give LED for eyes of robot.
- Is it possible to fix the microphone inside the head.
What will happen when?¶
What have you learned?¶
Since Week Two of my learning journey, I have been able to apply the knowledge and skills I acquired to almost every aspect of this project.
Starting with Fusion 360, I utilized it to design all the different parts of the robot.
For the eye part and switch, I utilized the milling process to cast them, ensuring a perfect fit and functionality.
To incorporate living hinges into my project, I made use of laser cutting.
By molding and casting I was able to replicate copies of a specific component.
In this project’s electronic design was key. I chose the right components and designed circuits using my understanding of electronics. I learned the necessary skills to design custom PCBs.
Lastly, programming was an integral part of this project. I utilized my programming knowledge to develop code that controlled the behavior and interactions of the robot.
Overall, I can say that doing this assignment effectively was made possible by the information I acquired starting in Week Two. Each step, including designing with Fusion 360, using a variety of fabrication methods like milling, laser cutting, moulding, and casting, as well as electronic design, PCB production, and programming, has been essential in realising my concept.
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.