Final Project¶
This week I worked on defining my final project idea and started to getting used to the documentation process.
Video¶
Concept¶
Dragon Robot is a gesture controlled robot using an accelerometer to detect the hand movements & Bluetooth modules for circuits to communicate with each other. I have used Attiny microcontrollers & two DC motors. I wanted to make a dragon robot because I am interested in robotics & I like dragons. It can be used to encourage others to learn more about robotics. Applications and implications week has some details like the cost.
Circuit Design¶
I needed to make two circuits, one for the dragon & the other for the controller. Circuits are based on an Attiny44 & Attiny84 microcontroller with a 20MHz crystal. I designed the circuit using eagle. The circuit consists of the following major copmonents: The microcontroller,a serial header, a power in header, spi programming header and the headers. I created the scehmatic and pcb board on eagle. Exported the images in GIMP & added borders.
This is the electronic part of my project
Controller Circuit¶
Made the circuit in input week .
The final tracing & board PNG images
Eagle Board (right click + Save link as)
Eagle Schematic (right click + Save link as)
I have connected this circuit to bluetooth module using a circuit that I made for interface and application programming
& I have used 9v battery as a power supply & connected it to LM2596 DC-DC to reduce the voltage to 5v.
Then I replaced the 9v battery & LM2596 with 3 AA batteries which gives around 4.5v.
Dragon Circuit¶
Modified controller circuit by removing accelerometer circuit & adding header for motors & usb port for power.
Then milled the circuit & soldered the parts. I followed the same steps as in week 5 .
I have connected this circuit to bluetooth module using a circuit that I made & connected a motor driver to the circuit. I connected a 9v battery & a power switch & 2 DC motors to the motor driver. I used a power bank (5v) as a power supply for the main circuit.
Download schematic (right click + Save link as)
Download board (right click + Save link as)
Download board traces (right click + Save link as)
Download board border (right click + Save link as)
Driver Circuit¶
At first I used a made DC motor driver module, but then I made my own motor Driver circuit. I have used Neil circuit as a refrence. I have used A4953 Full-Bridge DMOS PWM Motor Drivers & this is it’s datasheet . A4953 is provided in a low-profile 8-pin SOICN package (suffix LJ).
The output drivers are all low-RDS(on) , N-channel DMOS drivers that feature internal synchronous rectification to reduce power dissipation. The current in the output full bridge is regulated with fixed off-time pulse width modulated (PWM) control circuitry. The IN1 and IN2 inputs allow two-wire control for the bridge.
I have added 2 A4953 driver, 4 capacitors (used same values as Neil, 2 1uF & 2 10uF), 4 headers (1 for input signals, 1 for output signals, 1 for power supply, 1 for Vref), a power source & ground. Att some parts I needed less pins for header but I used 4 pin header for more stability.
Then, I started connecting them but after several tries I had to add a jumper (0 ohm resistor) to connect all parts).
& this is the final connection
& these are the images I used to create the rml files.
Download schematic (right click + Save link as)
Download board (right click + Save link as)
Download board traces (right click + Save link as)
Download board border (right click + Save link as)
The minimum load supply voltage the driver needs is 8v that’s why I used a 9v battery.
And this is how the circuit looks like.
Intial testing with the new driver circuit
Final testing
Code¶
I combined & modified the codes I used in previous weeks like input week & networking week & this website for DC motor control.
Controller Code¶
#include <TinyWireM.h> #include <SoftwareSerial.h> SoftwareSerial mySerial(PA4, PA5); int state = 0; #ifdef DEBUG #endif int accelX, accelY, accelZ; char mpu = 0x68; int dirct = 0 ; SoftwareSerial Monitor(PA1, PA0); // We will only use Tx on PortB 4 void setup() { Monitor.begin(9600); TinyWireM.begin(); delay(1000); // We need to do three things. 1. Disable sleep mode on the MPU (it activates on powerup). 2. Set the scale of the Gyro. 3. Set the scale of the accelerometer // We do this by sending 2 bytes for each: Register Address & Value TinyWireM.beginTransmission(mpu); TinyWireM.write(0x6B); // Power setting address TinyWireM.write(0b00000000); // Disable sleep mode (just in case) TinyWireM.endTransmission(); TinyWireM.beginTransmission(mpu); TinyWireM.write(0x1B); // Config register for Gyro TinyWireM.write(0x00000000); // 250° per second range (defau<) TinyWireM.endTransmission(); TinyWireM.beginTransmission(mpu); //I2C address of the MPU TinyWireM.write(0x1C); // Accelerometer config register TinyWireM.write(0b00000000); // 2g range +/- (defau<) TinyWireM.endTransmission(); mySerial.begin(38400); // Default communication rate of the Bluetooth module } void loop() { getAccel(); getDirrection(); Monitor.println(dirct); mySerial.println(dirct); mySerial.write('dirct'); } void getDirrection(){ if (accelX>5000) //front { dirct = 1; } if (accelX<-5000) //back { dirct = 2; } if (accelY>5000) //left { dirct = 3; } if (accelY<-5000) //right { dirct = 4; } if(accelX < 5000 && accelX > -5000 && accelY < 5000 && accelY > -5000){ //stop dirct = 0; } } void getAccel() { TinyWireM.beginTransmission(mpu); //I2C address of the MPU TinyWireM.write(0x3B); // Acceleration data register TinyWireM.endTransmission(); TinyWireM.requestFrom(mpu, 6); // Get 6 bytes, 2 for each DoF accelX = TinyWireM.read() << 8; // Get X upper byte first accelX |= TinyWireM.read(); // lower accelY = TinyWireM.read() << 8; // Get Y upper byte first accelY |= TinyWireM.read(); // lower accelZ = TinyWireM.read() << 8; // Get Z upper byte first accelZ |= TinyWireM.read(); // lower }
Dragon Code¶
#include<SoftwareSerial.h> SoftwareSerial mySerial(PA4, PA5); int dirct ; int IN1 = PA3; // MCU Digital Pin 9 to IN1 on L298n Board int IN2 = PA2; // MCU Digital Pin 8 to IN2 on L298n Board int IN3 = PA1; // MCU Digital pin 7 to IN3 on L298n Board int IN4 = PA0; // MCU Digital pin 6 to IN4 on L298n Board SoftwareSerial Monitor(PA1, PA0); void setup() { Monitor.begin(9600); //pinMode(ENA, OUTPUT); //Set all the L298n Pin to output //pinMode(ENB, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); mySerial.begin(38400); // Default communication rate of the Bluetooth module } void loop() { if(mySerial.available()){ //Checks whether data is comming from the serial port dirct = mySerial.read(); Monitor.println(dirct); } // Controlling the Motor if (dirct == 1) { // Forward digitalWrite(IN1, HIGH); // Turn HIGH motor A digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); // turn HIGH motor B digitalWrite(IN4, LOW); // To set the turning speed to 200 out of possible range 0 to 255 } if (dirct == 2) { // Back digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); } if (dirct == 3) { //right digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); } if (dirct == 4) {//left digitalWrite(IN1, LOW); // Turn the motor off digitalWrite(IN2, LOW); // Turn the motor off digitalWrite(IN3, HIGH); // Turn the motor off digitalWrite(IN4, LOW); // Turn the motor off } if (dirct == 0) {//stop digitalWrite(IN1, LOW); // Turn the motor off digitalWrite(IN2, LOW); // Turn the motor off digitalWrite(IN3, LOW); // Turn the motor off digitalWrite(IN4, LOW); // Turn the motor off } }
Dragon Design¶
The biggest challange was deciding the easiest and most efficeint way to make the dragon.
Dragon Body¶
I made a new simple design using 3D Builder for the dragon.
Then, I exported it in Pepakura & sprcified the directions & saved the file in dxf format.
After that, I opened the dxf file using Inkscape & arranged the parts based on laser cutter size.
DXF File Download (right click + Save link as)
pdf File 1 Download (right click + Save link as)
pdf File 2 Download (right click + Save link as)
The dxf file generated by Pepakura, has dark grey colour for the parts that needs to be cut & red for the parts that need scoring. Set the laser cutting settings & laser cut the parts on a bit think paper. Used mat board settings as a refrence & modified them to cut the paper.
For the parts to be cut through I used speed 100 & power 30 & for scoring the parts than need to be bend I used speed 100 & power 5 both at frequency 500.
Assembeled the parts using stick glue.
Made red colour resin by mixing 70% of resin & 30% of hardener (using weight calculation). Added few drops of colour & mixed them well.
Started painting it with resin & it dried within less than a day.
After it dried, I applyed a second layer.
After drying
As a final touch I made wings from molds that I made before in week 10 .
DXF File Download (right click + Save link as)
PDF File part1 Download (right click + Save link as)
PDF File part2 Download (right click + Save link as)
Dragon Base Design¶
Important factors to consider in my design was the size of wheels & circuits to allow comfortable usage and the assembly method. I used Inkscape to design the base. At first, I made it in rectangle shape. I designed half of the shape then duplicated it & merged them. Made slots for motors support & added holes for wires & support wheel.
Then changed the shape to circle to give support to the dragons body & added more slots & holes to secure other parts.
Set the laser cutting settings & laser cut the parts on acrylic. Used acrylic settings as a refrence to cut the base. I used speed 12 & power 100 with frequency 5000.
SVG File Download (right click + Save link as)
PDF File Download (right click + Save link as)
I needed an extra wheel for balance. Found a 3D pingpong ball holder design.
Pingpong ball size 40 mm & the ball we have is 30 mm. 3D printing steps & limitation can be found in this link . Printed it with 75% of original design size but was a bit small. 77% of original size was a perfect match.
STL File Download (right click + Save link as)
After assembly
Modified arrangement
Dragon Controller¶
I used the head design generated from Pepakura & made some modifications to it. I adeed slots for the yellow strap & holes to fasten the accelerometer circuit.
I laser cut it on mat board but changed the original settings a bit. For the parts to be cut through I used speed 30 & power 50 & for the parts than need to be bend I used speed 30 & power 20 both at frequency 2500.
I fastened the strap & the accelerometer circuit. then, glued the the head parts together.
SVG File Download (right click + Save link as)
PDF File Download (right click + Save link as)
Final Looks¶
Dragon Robot by Ghadeer Alharmi is licensed under a Creative Commons Attribution 4.0 International License.