SONAR uses the concept of ultrasonic waves that get reflected from the object in front of it. And the time it takes between the transmission and reception tells us about the distance it has traveled.
Components Required
Arduino UNO
Servo Motor
Ultrasonic Sensor
Jumper wires
Laptop
Circuit Diagram
After making the connection you have to make a sketch and copy paste the below Arduino code into your arduino and upload the code.
Then you have to extract the processing software and open the processing.exe and copy and paste the processing code given below.
After you done that you have to connect your ardunio to your computer.
Open the arduino software.
Go to the TOOLS > PORTS
In the port list you will the something like com26 or com6
You have to remeber this com## (HERE ## represent the number)
Then in the processing code you have to change this line shown in the figure below
Arduino Code
// Includes the Servo library
#include <Servo.h>.
// Defines Tirg and Echo pins of the Ultrasonic Sensor
const int trigPin = 10;
const int echoPin = 11;
// Variables for the duration and the distance
long duration;
int distance;
Servo myServo; // Creates a servo object for controlling the servo motor
void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600);
myServo.attach(12); // Defines on which pin is the servo motor attached
}
void loop() {
// rotates the servo motor from 15 to 165 degrees
for(int i=15;i<=165;i++){
myServo.write(i);
delay(30);
distance = calculateDistance();// Calls a function for calculating the distance measured by the Ultrasonic sensor for each degree
Serial.print(i); // Sends the current degree into the Serial Port
Serial.print(","); // Sends addition character right next to the previous value needed later in the Processing IDE for indexing
Serial.print(distance); // Sends the distance value into the Serial Port
Serial.print("."); // Sends addition character right next to the previous value needed later in the Processing IDE for indexing
}
// Repeats the previous lines from 165 to 15 degrees
for(int i=165;i>15;i--){
myServo.write(i);
delay(30);
distance = calculateDistance();
Serial.print(i);
Serial.print(",");
Serial.print(distance);
Serial.print(".");
}
}
// Function for calculating the distance measured by the Ultrasonic sensor
int calculateDistance(){
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH); // Reads the echoPin, returns the sound wave travel time in microseconds
distance= duration*0.034/2;
return distance;
}
Processing Code
import processing.serial.*; // imports library for serial communication
import java.awt.event.KeyEvent; // imports library for reading the data from the serial port
import java.io.IOException;
Serial myPort; // defines Object Serial
// defubes variables
String angle="";
String distance="";
String data="";
String noObject;
float pixsDistance;
int iAngle, iDistance;
int index1=0;
int index2=0;
PFont orcFont;
void setup() {
size (1200, 700); // ***CHANGE THIS TO YOUR SCREEN RESOLUTION***
smooth();
myPort = new Serial(this,"COM18", 9600); // starts the serial communication
myPort.bufferUntil('.'); // reads the data from the serial port up to the character '.'. So actually it reads this: angle,distance.
}
void draw() {
fill(98,245,31);
// simulating motion blur and slow fade of the moving line
noStroke();
fill(0,4);
rect(0, 0, width, height-height*0.065);
fill(98,245,31); // green color
// calls the functions for drawing the radar
drawRadar();
drawLine();
drawObject();
drawText();
}
void serialEvent (Serial myPort) { // starts reading data from the Serial Port
// reads the data from the Serial Port up to the character '.' and puts it into the String variable "data".
data = myPort.readStringUntil('.');
data = data.substring(0,data.length()-1);
index1 = data.indexOf(","); // find the character ',' and puts it into the variable "index1"
angle= data.substring(0, index1); // read the data from position "0" to position of the variable index1 or thats the value of the angle the Arduino Board sent into the Serial Port
distance= data.substring(index1+1, data.length()); // read the data from position "index1" to the end of the data pr thats the value of the distance
// converts the String variables into Integer
iAngle = int(angle);
iDistance = int(distance);
}
void drawRadar() {
pushMatrix();
translate(width/2,height-height*0.074); // moves the starting coordinats to new location
noFill();
strokeWeight(2);
stroke(98,245,31);
// draws the arc lines
arc(0,0,(width-width*0.0625),(width-width*0.0625),PI,TWO_PI);
arc(0,0,(width-width*0.27),(width-width*0.27),PI,TWO_PI);
arc(0,0,(width-width*0.479),(width-width*0.479),PI,TWO_PI);
arc(0,0,(width-width*0.687),(width-width*0.687),PI,TWO_PI);
// draws the angle lines
line(-width/2,0,width/2,0);
line(0,0,(-width/2)*cos(radians(30)),(-width/2)*sin(radians(30)));
line(0,0,(-width/2)*cos(radians(60)),(-width/2)*sin(radians(60)));
line(0,0,(-width/2)*cos(radians(90)),(-width/2)*sin(radians(90)));
line(0,0,(-width/2)*cos(radians(120)),(-width/2)*sin(radians(120)));
line(0,0,(-width/2)*cos(radians(150)),(-width/2)*sin(radians(150)));
line((-width/2)*cos(radians(30)),0,width/2,0);
popMatrix();
}
void drawObject() {
pushMatrix();
translate(width/2,height-height*0.074); // moves the starting coordinats to new location
strokeWeight(9);
stroke(255,10,10); // red color
pixsDistance = iDistance*((height-height*0.1666)*0.025); // covers the distance from the sensor from cm to pixels
// limiting the range to 40 cms
if(iDistance<40){
// draws the object according to the angle and the distance
line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),(width-width*0.505)*cos(radians(iAngle)),-(width-width*0.505)*sin(radians(iAngle)));
}
popMatrix();
}
void drawLine() {
pushMatrix();
strokeWeight(9);
stroke(30,250,60);
translate(width/2,height-height*0.074); // moves the starting coordinats to new location
line(0,0,(height-height*0.12)*cos(radians(iAngle)),-(height-height*0.12)*sin(radians(iAngle))); // draws the line according to the angle
popMatrix();
}
void drawText() { // draws the texts on the screen
pushMatrix();
if(iDistance>40) {
noObject = "Out of Range";
}
else {
noObject = "In Range";
}
fill(0,0,0);
noStroke();
rect(0, height-height*0.0648, width, height);
fill(98,245,31);
textSize(25);
text("10cm",width-width*0.3854,height-height*0.0833);
text("20cm",width-width*0.281,height-height*0.0833);
text("30cm",width-width*0.177,height-height*0.0833);
text("40cm",width-width*0.0729,height-height*0.0833);
textSize(40);
text("exasub.com", width-width*0.875, height-height*0.0277);
text("Angle: " + iAngle +" °", width-width*0.48, height-height*0.0277);
text("Distance: ", width-width*0.26, height-height*0.0277);
if(iDistance<40) {
text(" " + iDistance +" cm", width-width*0.225, height-height*0.0277);
}
textSize(25);
fill(98,245,60);
translate((width-width*0.4994)+width/2*cos(radians(30)),(height-height*0.0907)-width/2*sin(radians(30)));
rotate(-radians(-60));
text("30°",0,0);
resetMatrix();
translate((width-width*0.503)+width/2*cos(radians(60)),(height-height*0.0888)-width/2*sin(radians(60)));
rotate(-radians(-30));
text("60°",0,0);
resetMatrix();
translate((width-width*0.507)+width/2*cos(radians(90)),(height-height*0.0833)-width/2*sin(radians(90)));
rotate(radians(0));
text("90°",0,0);
resetMatrix();
translate(width-width*0.513+width/2*cos(radians(120)),(height-height*0.07129)-width/2*sin(radians(120)));
rotate(radians(-30));
text("120°",0,0);
resetMatrix();
translate((width-width*0.5104)+width/2*cos(radians(150)),(height-height*0.0574)-width/2*sin(radians(150)));
rotate(radians(-60));
text("150°",0,0);
popMatrix();
}
Everyone must have seen those big lights in red, yellow, and green color at the corner of every road. Some even flash. Some stay lit all day long.
Big junctions have a separate controller which synchronizes these lights. So that the traffic flows smoothly. And the possibility of having a deadlock is minimized. That is very complex and requires a deep understanding of road traffic and human perception.
To make a simple traffic light. You will require three LED in RED, Yellow, and Green color.
Components Required:
Arduino Red 5mm LED Yellow 5mm LED Green 5mm LED 330-ohm resistor Jumper wires Breadboard small
# If-else Python
a = 1
b = 1
if (a < b):
print("A is Lesser than B")
elif (a ==b):
print("A is equal to B")
else:
print("A is Greater than B")
How to perform a while loop operation
# While Loop
# Using While Loop to perform multiplication using Addition
A = 13131313
sum = 0;
counter = 1
while (counter < 11):
sum = A + sum
print(A," x ",counter," = ",sum)
counter = 1 + counter
When you create a parametric model in FreeCAD. The model will look very bland. You can add different colors to your 3d model face and you can even make your model transparent to help view the underneath wireframes.
But when you have to present the work to a more general audience you can’t really show a dull-colored 3D object. You need to have the 3D model in some rendering environment which will add colors, shadows, lights, a camera, etc.
12mm Button CAP in FreeCad
As you can see in the above image it is not very pleasing to look at. It will not look very good on a website or printed in a pamphlet.
So we export the 3d model from the FreeCAD to a .stl file.
That STL file will be imported into the blender software.
There in the blender environment, we can add different lights, cameras, colors, and textures to make it look more pleasing to view and create a nice scene.
12mm Buttom Cap TOP view12mm Buttom Cap Bottom view
As you can see these images are more presentable to a wider audience.
They are two software packages designed by two independent teams. Both of them are free to use.
To create a product you will need an enclosure that will house all the essential components inside it. And this enclosure can be built in FreeCAD.
I am using FreeCAD 0.20.1
There are some Addons that I have installed.
You can install Addon from “Tools > Addon Manager”
KiCad StepUP workbench
Glass
PieMenu
A2Plus (for making assembly from different individual parts)
Fasteners Workbench (Easy to use the preconstructed model of many standard nuts, bolts, screws, washers, etc.)
KiCad StepUP workbench provides an ECAD-MCAD collaboration tool.
From what I learned in FreeCAD you create Sketch that can be exported to KiCad PCB.
The KiCad uses the Sketch created in the FreeCAD as Edge Cuts.
Edge Cuts are the outline of the PCB in which all your components along with all the tracks, via, hole, and other miscellaneous items must reside.
Youtube video from user mathcodeprint
This video demonstrates a basic example.
It is not a perfect collaborating tool. There are other software tools available from big companies but they are not affordable for a budding engineer.
The ECAD/MCAD collabration proccess:
Design your schematic in Kicad.
Assign Footprint and make sure that each footprint have a 3d model assigned to its footprint.
make a pcb and update the component from the schematics. place a grid origin. Using the grid origin draw a rectangle in the edge cut layer.
Save the pcb.
After doing the above steps open the PCB in the FreeCAD KiCadStepUp workbench.
Load the PCB into the freecad environment using the “ksu PushPull > Load Board” option
Make changes to the sketch and the 3d model.
If you select a 3d model and make changes to its position.
To make changes to the 3d model. You have to select that particular model. And then you have to select the model from the Model view. Right click on the model in the Model view and select Transform.
Three orthogonal arrow will be preseneted to you in three different color. You can move the model by selecting the conical arrow heads.
You have to push the changes by selecting that model into the kicad pcb.
After you have saved the kicad will automatically adust its footprint automatically.
It is this PUSH PULL method of making the changes to your pcb dimension and component positions.