1 頁 (共 1 頁)

Arduino+超音波模組+processing=雷達系統

發表於 : 2023年 4月 10日, 06:55
cajhbb
2023-04-10_150511.jpg
2023-04-10_150511.jpg (110.05 KiB) 已瀏覽 2131 次
Arduino code

代碼: 選擇全部

#include <Servo.h> 
const int trigPin = 10;
const int echoPin = 11;
long duration;//歷時
int distance;//距離
Servo myServo; //物件
void setup() {
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT);
  Serial.begin(9600);
  myServo.attach(12); 
}
void loop() {
  
  for(int i=15;i<=165;i++){  
  myServo.write(i);
  delay(30);
  distance = calculateDistance();
  Serial.print(i); 
  Serial.print(","); 
  Serial.print(distance); 
  Serial.print(".");
  }
  
  for(int i=165;i>15;i--){  
  myServo.write(i);
  delay(30);
  distance = calculateDistance();
  Serial.print(i);
  Serial.print(",");
  Serial.print(distance);
  Serial.print(".");
  }
}

int calculateDistance(){ 
  
  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2);
  
  digitalWrite(trigPin, HIGH); 
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance= duration*0.034/2;//計算距離,公式為:distance = duration * 0.034 / 2
  return distance;
}
---------------------------------------------------------------------------------------
----------------------- 以下為 processing code ---------------------------
processing code

代碼: 選擇全部

// 這是 Processing 程式碼
// 從第 60 行到 199 行複製貼上程式碼

import processing.serial.*; // 匯入串列通訊的程式庫
import java.awt.event.KeyEvent; // 匯入處理按鍵事件的程式庫
import java.io.IOException; // 匯入處理輸入輸出異常的程式庫

Serial myPort; // 宣告一個串列物件 myPort

// 宣告變數
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); // 設定畫布大小
smooth(); // 啟用圖形平滑處理
myPort = new Serial(this,"COM10", 9600); // 設定串列通訊物件 myPort,指定 COM10 連接埠和 9600 波特率
myPort.bufferUntil('.'); // 設定串列物件以 . 為緩衝區結束符號
}

void draw() {
fill(98,245,31); // 設定填充色

noStroke(); // 設定無邊框

fill(0,4); // 設定填充色

rect(0, 0, width, height-height*0.065); // 畫一個矩形,作為雷達的背景

fill(98,245,31); // 設定填充色

drawRadar(); // 畫雷達圖形
drawLine(); // 畫距離線條
drawObject(); // 畫探測物體
drawText(); // 畫文字
}

void serialEvent (Serial myPort) { // 宣告處理串列事件的函數

data = myPort.readStringUntil('.'); // 讀取串列數據
data = data.substring(0,data.length()-1); // 去掉字串最後一個字符

index1 = data.indexOf(","); // 找到逗號的位置
angle= data.substring(0, index1); // 取得角度值
distance= data.substring(index1+1, data.length()); // 取得距離值

// 將字串型態的變數轉換為整數型態
iAngle = int(angle);
iDistance = int(distance);
}

void drawRadar() {
pushMatrix(); // 儲存目前的繪圖矩陣狀態
translate(width/2,height-height0.074); // 移動繪圖原點到中心點
noFill(); // 不填充圖形
strokeWeight(2); // 設置線條寬度
stroke(98,245,31); // 設置線條顏色
// 繪製弧形線條
arc(0,0,(width-width0.0625),(width-width0.0625),PI,TWO_PI);
arc(0,0,(width-width0.27),(width-width0.27),PI,TWO_PI);
arc(0,0,(width-width0.479),(width-width0.479),PI,TWO_PI);
arc(0,0,(width-width0.687),(width-width*0.687),PI,TWO_PI);
// 繪製角度線條
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-height0.074); // 移動繪圖原點到中心點
strokeWeight(9); // 設置線條寬度
stroke(255,10,10); // 設置線條顏色為紅色
pixsDistance = iDistance((height-height0.1666)0.025); // 計算目標距離對應到畫面上的像素距離
// 限制目標距離在40公分以內
if(iDistance<40){
// 根據角度和距離繪製目標
line(pixsDistancecos(radians(iAngle)),-pixsDistancesin(radians(iAngle)),(width-width*0.505)cos(radians(iAngle)),-(width-width0.505)*sin(radians(iAngle)));
}
popMatrix(); // 恢復繪圖矩陣狀態
}
void drawLine() {
  pushMatrix();
  strokeWeight(9);
  stroke(30,250,60);
  translate(width/2,height-height*0.074); 
  line(0,0,(height-height*0.12)*cos(radians(iAngle)),-(height-height*0.12)*sin(radians(iAngle))); 
  popMatrix();
}
void drawText() { 
  
  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("Zeno_Modiff", 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(); 
}

舵機的用法

發表於 : 2023年 4月 13日, 08:39
cajhbb
舵機的用法
Arduino的Servo庫。這個庫可以讓你通過控制引腳輸出的 PWM 信號來控制舵機的角度。

#include <Servo.h>這一行代碼是讓Arduino知道你要使用Servo庫。在你的程式中加入這一行代碼后,你就可以使用 Servo 類來創建一個 Servo 物件。

Servo myServo;這一行代碼是創建了一個名為的 Servo 物件。你可以使用這個物件來控制一個舵機。例如,你可以使用 來告訴 Arduino,哪個引腳連接了舵機。之後,你可以使用 來控制舵機轉到特定的角度。myServomyServo.attach(pin)myServo.write(angle)

例如,下面是一個簡單的程式,控制舵機連接在引腳 9 上,讓舵機轉到 90 度角,然後停止 2 秒鐘,再轉回到 0 度角,再停止 2 秒鐘,然後不斷迴圈:

代碼: 選擇全部

#include <Servo.h>
Servo myServo;

void setup() {
  myServo.attach(9); // 連接舵機的引腳為 9
}

void loop() {
  myServo.write(90); // 轉到 90 度角
  delay(2000);       // 停止 2 秒鐘
  myServo.write(0);  // 轉回到 0 度角
  delay(2000);       // 停止 2 秒鐘
}


arduino 與 超音波模組HC-SR04 距離計算範例與說明

發表於 : 2023年 4月 13日, 08:44
cajhbb
arduino 與 超音波模組HC-SR04 距離計算範例與說明
超音波模組 HC-SR04 可以透過發送一個超音波脈衝,並接收其反射波來計算與物體的距離。這個模組可以透過 Arduino 的輸出引腳發送脈衝,並透過輸入引腳接收反射波。以下是一個簡單的程式碼範例:

微秒(microsecond)是時間的單位之一,是秒的一百萬分之一(1 μs = 0.000001 s),通常用於測量高速事件或電子裝置中的時間延遲。在 Arduino 程式中,使用 'delayMicroseconds

代碼: 選擇全部

const int trigPin = 9; // 設定超音波模組的 Trig 引腳
const int echoPin = 10; // 設定超音波模組的 Echo 引腳

void setup() {
  Serial.begin(9600); // 初始化串口通訊
  pinMode(trigPin, OUTPUT); // 設定 Trig 引腳為輸出
  pinMode(echoPin, INPUT); // 設定 Echo 引腳為輸入
}

void loop() {
  long duration, distance; // 儲存超音波回傳的訊號時間和計算的距離
  digitalWrite(trigPin, LOW); // 將 Trig 引腳設為低電位
  delayMicroseconds(2); // 延遲 2 微秒
  digitalWrite(trigPin, HIGH); // 將 Trig 引腳設為高電位
  delayMicroseconds(10); // 延遲 10 微秒
  digitalWrite(trigPin, LOW); // 再將 Trig 引腳設為低電位

  duration = pulseIn(echoPin, HIGH); // 計算 Echo 引腳接收到的高電位時間
  distance = duration * 0.034 / 2; // 計算距離,公式為:distance = duration * 0.034 / 2

  Serial.print("Distance: "); // 輸出計算出的距離
  Serial.print(distance);
  Serial.println(" cm");

  delay(500); // 每 500 毫秒重新計算距離
}


processing 如何讀取 arduino 串列訊號

發表於 : 2023年 4月 13日, 09:07
cajhbb
2023-04-13_170528.png
2023-04-13_170528.png (86.6 KiB) 已瀏覽 2123 次

代碼: 選擇全部

import processing.serial.*;

Serial myPort;  // 宣告一個 Serial 物件
String message = "";  // 儲存讀取到的訊息

void setup() {
  size(400, 400);
  // 開啟串列埠
  myPort = new Serial(this, "COM6", 9600);  // 第一個參數是指 Processing 程式本身,第二個參數是串列埠的名稱,第三個參數是鮑率
}

void draw() {
  background(255);
  // 讀取串列訊息
  if (myPort.available() > 0) {
    message = myPort.readString();
  }
  // 將訊息顯示在螢幕上
  textSize(20);//文字大小
  fill(0);
  text(message, 50, 50);//文字所在的坐標
}