วันพุธที่ 4 เมษายน พ.ศ. 2561

ใบงานที่ 8 Radar System

นางสาว กัญญารัตน์  สังขพันธ์ 1สทค.2 6031280023

นาย  จารุเดช  สังข์ประไพ 1สทค.2 6031280027



การทำ Radar System ด้วยโปรแกรม Arduino Uno และโปรแกรม Processing 3

สำหรับโปรแกรม Processing 3  เป็นซอฟท์แวร์ระบบเปิด  เหมาะสำหรับผู้ต้องการพัฒนาโปรแกรมเกี่ยวกับการสร้างภาพเคลื่อนไหวที่สัมพันธ์กัน ในที่นี้เราจะมานำมาใช้งานในส่วนของจอ Radar System เพื่อดูว่าตัวอุปกรณ์ กับ ซอฟต์แวร์นั้น สัมพันธ์กันหรือไม่

ดาวน์โหลดโปรแกรม Processing 3 ได้ที่นี่


อุปกรณ์

1. Arduino Uno 1 บอร์ด




2. Servo Motor (SG90) 1 ตัว




3. HC-SR04 1 ตัว





4. สายไฟผู้-ผู้





5. ใบพัด Servo Motor 1 ใบ






รูปวงจร



Download Frizing file ที่นี่

Code Program Arduino

// 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;
}

Code Program Processing 3

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,"COM5", 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(" VIRAL SCIENCE ", 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(); 
}


ดาวน์โหลด Code ของโปรแกรมทั้ง 2 ได้ที่นี่


https://drive.google.com/file/d/0B27c2BryUv06R3BXV3VUUVRzMXM/view


ขอขอบคุณ Code ของโปรแกรม Arduino และ Processing จาก


https://www.youtube.com/watch?v=RSAj_ydbg48


อธิบาย


Radar System นี้เกิดจากการนำเอา Servo Motor (SG90) กับ HC-SR04 มาใช้งานร่วมกัน เมื่อ Upload Code จากโปรแกรม Arduino ลงบอร์ด จะเห็นได้ว่า Servo Motor จะหมุนไปและหมุนกลับเหมือนกับ Radar System และจากจอ Radar ในโปรแกรม Processing จะเห็นได้ว่าเมื่อ Radar ตรวจจับวัตถุได้จะขึ้นเป็นแทบสีแดงตามระยะของวัตถุที่อยู่ใกล้หรือไกล


วิดีโอประกอบ



วันอังคารที่ 3 เมษายน พ.ศ. 2561

ใบงานที่ 7 Measure Distance with Arduino and Ultrasonic Sensor

นางสาว กัญญารัตน์  สังขพันธ์ 1สทค.2 6031280023

นาย  จารุเดช  สังข์ประไพ 1สทค.2 6031280027



การต่อใช้งาน Servo Motor (SG90) กับ HC-SR04 


อุปกรณ์



1. Servo Motor (SG90) 1 ตัว




2. HC-SR04 1 ตัว




3. บอร์ด Arduino Uno 1 บอร์ด




4. สายไฟผู้-ผู้




5. ใบพัดมอเตอร์ Single fan 1 ตัว




6. โปรโตบอร์ด 1 บอร์ด




7.  กระดาษสำหรับใช้วัด





รูปวงจร

Download Frizing file ที่นี่


Code Program Arduino


#include <Servo.h>  //Load Servo Library
int trigPin=13; //Sensor Trip pin connected to Arduino pin 13
int echoPin=11;  //Sensor Echo pin connected to Arduino pin 11
int servoControlPin=6; //Servo control line is connected to pin 6
float pingTime;  //time for ping to travel from sensor to target and return
float targetDistance; //Distance to Target in inches
float speedOfSound=776.5; //Speed of sound in miles per hour when temp is 77 degrees.
float servoAngle; //Variable for the value we want to set servo to.

Servo myPointer;  //Create a servo object called myPointer

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(servoControlPin, OUTPUT);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  
  myPointer.attach(servoControlPin);  //Tell arduino where the servo is attached.

}

void loop() {
  // put your main code here, to run repeatedly: 
  
  digitalWrite(trigPin, LOW); //Set trigger pin low
  delayMicroseconds(2000); //Let signal settle
  digitalWrite(trigPin, HIGH); //Set trigPin high
  delayMicroseconds(15); //Delay in high state
  digitalWrite(trigPin, LOW); //ping has now been sent
  delayMicroseconds(10); //Delay in low state
  
  pingTime = pulseIn(echoPin, HIGH);  //pingTime is presented in microceconds
  pingTime=pingTime/1000000; //convert pingTime to seconds by dividing by 1000000 (microseconds in a second)
  pingTime=pingTime/3600; //convert pingtime to hourse by dividing by 3600 (seconds in an hour)
  targetDistance= speedOfSound * pingTime;  //This will be in miles, since speed of sound was miles per hour
  targetDistance=targetDistance/2; //Remember ping travels to target and back from target, so you must divide by 2 for actual target distance.
  targetDistance= targetDistance*63360;    //Convert miles to inches by multipling by 63360 (inches per mile)
  Serial.print("The Distance to Target is: ");
  Serial.print(targetDistance);
  Serial.println(" cm");
  Serial.print("The Distance to Target is: ");
  Serial.print(targetDistance);
  Serial.println(" inches");
  
  servoAngle = (106./7.) * targetDistance + 37; //Calculate Servo Angle from targetDistance
  myPointer.write(servoAngle); //write servoAngle to the servo
  Serial.print("Angle ");
  Serial.println(servoAngle);
  delay(100); //delay tenth of a  second to slow things down a little.
}

Download Arduino Code ที่นี่

อธิบายวงจร

เป็นการนำเอา Servo Motor (SG90) และ HC-SR04 และใช้ Ultrasonic ของ HC-SR04 เพื่อใช้จับระยะทางและให้ใบพัดของมอเตอร์หมุน ตามระยะที่ีกำหนดโดยใช้กระดาษในการวัดตัวเลขที่ใบพัดของ Servo Motor (SG90) จะชี้ไป โดย 1 ตัวเลข = 1 นิ้วใน Serial Monitor ซึ่ง Servo Motor สามารถ หมุนได้ 180 องศา ซึ่งจะได้ตั้งแต่ 0-7 นิ้ว โดยประมาณ

วิดีโอประกอบ



วันพฤหัสบดีที่ 29 มีนาคม พ.ศ. 2561

ใบงานที่ 6 การควบคุม Servo Motor (SG90) ด้วย Arduino UNO R3

นางสาว กัญญารัตน์  สังขพันธ์ 1สทค.2 6031280023

นาย  จารุเดช  สังข์ประไพ 1สทค.2 6031280027


Servo Motor (SG90)

Servo คืออุปกรณ์มอเตอร์ ที่สามารถควบคุมการหมุนที่แม่นยำ เซอร์โว SG90 มีขนาดเล็กแรงบิด 1.2-1.4 kg/cm

   สีน้ำตาลเป็นสายกราวด์ สีแดงเป็นไฟเข้า 4.8-7.2V สีส้มเป็นสัญญาณอินพุต  หมุน 0-180องศา ถ้าทำให้หมุ่น 360 ต่อเนื่่อง องศาให้ใช้ 2.2K ohm


สเปคของ Servo Motor (SG90)


ขนาด 21.5mmx11.8mmx22.7mm

น้ำหนัก 9 กรัม
ความเร็วเมื่อไม่มีโหลด 0.12 วินาที/ุ60องศา (4.8V)
แรงบิด 1.2-1.4 kg/cm (4.8V)
ทำงานที่อุณหภูมิ -30-60 องศาเซลเซียส
เวลาหยุดก่อนรับคำสั่งใหม่ 7 มิลลิวินาที
ทำงานที่ไฟ 4.8V - 6V


นิยมใช้ร่วมกับ


Mounting Bracket for Servo SG90
Switching Power supply แหล่งจ่ายไฟ 5V 5.5A
Switching Power supply แหล่งจ่ายไฟ 5V 10A
Switching Power supply แหล่งจ่ายไฟ 5V 20A



การควบคุม Servo Motor (SG90) ด้วย Arduino UNO R3

อุปกรณ์

1. Servo Motor (SG90) 1 ตัว




2. ใบพัด 1 ใบ




3. สายไฟผู้-ผู้




4. บอร์ด Arduino 1 บอร์ด







รูปวงจร


Download Frizing file  ที่นี่

Code Program Arduino

สั่งให้มอเตอร์หมุนตั้งแต่ 0-180 องศา

#include <Servo.h>

Servo servo;
int angle = 10;

void setup() {
  servo.attach(8);
  servo.write(angle);
}

void loop() 

 // scan from 0 to 180 degrees
  for(angle = 0 ; angle < 180; angle++)  
  {                                  
    servo.write(angle);               
    delay(15);                   
  } 
  // now scan back from 180 to 0 degrees
  for(angle = 180; angle > 0; angle--)    
  {                                
    servo.write(angle);           
    delay(15);       
  } 
  } 

Download Arduino Code ที่นี่

สั่งให้มอเตอร์หมุนตั้งแต่ 45-135 องศา

#include <Servo.h>

Servo servo;
int angle = 10;

void setup() {
  servo.attach(8);
  servo.write(angle);
}

void loop() 

 // scan from 0 to 180 degrees
  for(angle = 45 ; angle < 135; angle++)  
  {                                  
    servo.write(angle);               
    delay(15);                   
  } 
  // now scan back from 180 to 0 degrees
  for(angle = 135; angle > 45; angle--)    
  {                                
    servo.write(angle);           
    delay(15);       
  } 
  } 

Download Arduino Code ที่นี่

สั่งให้มอเตอร์หมุนตั้งแต่ 90-180 องศา

#include <Servo.h>

Servo servo;
int angle = 10;

void setup() {
  servo.attach(8);
  servo.write(angle);
}


void loop() 

 // scan from 0 to 180 degrees
  for(angle = 90 ; angle < 180; angle++)  
  {                                  
    servo.write(angle);               
    delay(15);                   
  } 
  // now scan back from 180 to 0 degrees
  for(angle = 180; angle > 90; angle--)    
  {                                
    servo.write(angle);           
    delay(15);       
  } 
  } 

Download Arduino Code ที่นี่

อธิบายวงจร 

เมื่อเรากำหนดมุมในโปรแกรม Arduino for(angle = มุมที่ต้องการเริ่ม ; angle < มุมที่ต้องการให้หยุด; angle++) หลังจากกำหนดจุดเริ่มหมุนเสร็จ ต่อมาก็กำหนดจุดหมุนกลับที่  for(angle = มุมที่ต้องการให้หมุนกลับ; angle > มุมที่ต้องการให้หยุดหมุนกลับ; angle--) จากนั้นเมื่อกด Upload ตัว Servo Motor (SG90) จะเริ่มหมุนใบพัดตามมุมที่เราตั้งไว้ ซึ่ง SG90 จะหมุนได้เพียง 180 องศา 

วิดีโอประกอบ

วิดีโอมอเตอร์หมุนตั้งแต่ 0-180 องศา




วิดีโอมอเตอร์หมุนตั้งแต่ 45-135 องศา




วิดีโอมอเตอร์หมุนตั้งแต่ 90-180 องศา