Skip to content

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

alternate text

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

alternate text

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.

alternate text

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.

alternate text

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.

alternate text

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.

alternate textalternate text

alternate textalternate text

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.

alternate text

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.

alternate text

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.

alternate text

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

alternate text

The bottom base of the robot accommodates the main PCB (Printed Circuit Board) and the switch PCB.

Body

alternate text

The body part of the project securely holds two servo motors using a clamp mechanism.

alternate text

alternate text

Midpart

alternate text

3D printing

All the parts 3D printed are arranged for test assembly

alternate text

alternate text

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.

alternate text alternate text

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

alternate text

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.

alternate text alternate text alternate text

Milling Mold

Now its time to mill the eyes and switch of robot.

alternate text

alternate text

alternate text

Now its time to cast with silicon rubber mixture

alternate text

Fixing eyes inside the head

Casted slicon eyes pad is cut in to shape and placed inside the head and applied some hot glue.

alternate text alternate text alternate text

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.

alternate textalternate text

alternate text

Designing PCB in KiCad

Power switch board alternate text alternate text

Main Board alternate text alternate text

USB C type

alternate text alternate text

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.

alternate text

alternate textalternate text. alternate textalternate text

alternate text

BOM

alternate text |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

alternate text

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.

alternate text

alternate textalternate text

Assembly

Fixed the main board over the bottom bace cover, whic can be screwed to the base of robot.

alternate text alternate text

Now two servo motors are placed inside the chest of the robot for hand movement.

alternate textalternate text

One servo motor is place inside the midpart for the movement of hip part.

alternate text

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. alternate text

alternate text

Below inage showing the wires connecting to power switch and USB port.

alternate text

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.

alternate text alternate text alternate textalternate text

alternate textalternate text

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

alternate text

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.)

This project is licence under

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?

alternate text

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.

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.