BASIC4MCU | 질문게시판 | 아두이노 제어하기
페이지 정보
작성자 매드닥터 작성일2023-03-19 18:23 조회797회 댓글8건본문
제가 이번에 배운 아두이노를 활용하여 만들어보려 합니다.
목적
아두이노 모터와 초음파를 이용하여 진동이 울리는 것입니다.
1.모터를 0도에서 180도로 각도는 10 간격으로 제어한다
2.모터에 초음파를 달아 탐지한다. 초음파 거리는 1미터이다
3.모터 각도에 초음파 센서에 걸리면 진동이 발생한다.
일단 초음파 코드를 올렸습니다. 코드를 섞는 방법을 몰라 알려주세요
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
}
void loop()
{
long duration, distance;
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
duration = pulseIn (ECHO, HIGH);
distance = duration * 17 / 1000;
Serial.println(duration );
Serial.print("\nDIstance : ");
Serial.print(distance);
Serial.println(" Cm");
delay(1000);
}
댓글 8
조회수 797master님의 댓글
master 작성일
#include<Servo.h>
Servo servo;
//
const int TRIG=2,ECHO=3,MOTOR=4;
//
long duration,distance;
//
void sonar(){
digitalWrite(TRIG,1); delayMicroseconds(10); digitalWrite(TRIG,0);
duration=pulseIn(ECHO,1);
Serial.println(duration);
distance=duration*17/1000;
Serial.print("\nDIstance : "); Serial.print(distance); Serial.println(" Cm");
}
//
void setup(){
pinMode(MOTOR,OUTPUT);
pinMode(TRIG,OUTPUT); pinMode(ECHO,INPUT);
servo.attach(7);
}
//
void loop(){
for(int i=0;i<=180;i+=10){
servo.write(i); delay(100);
sonar();
if(distance<100)digitalWrite(MOTOR,1); // 1m 이내로 감지되면 진동모터 ON
else digitalWrite(MOTOR,0); // 진동모터 OFF
}
for(int i=180;i>=0;i-=10){
servo.write(i); delay(100);
sonar();
if(distance<100)digitalWrite(MOTOR,1); // 1m 이내로 감지되면 진동모터 ON
else digitalWrite(MOTOR,0); // 진동모터 OFF
}
}
매드닥터님의 댓글
매드닥터 작성일
감사합니다. 제가하나빠트린내용과 바뀐내용이 있습니다. 제가생각해도 각도의크기가너무작아 변경하였습니다. 각도는10도로 총18개이며 각각도에도달할때 초음파센서에 무언가탐지되면 울리는형식입니다. 또한 각 각도마다 진동센서를 나눌생각입니다. 쉽게말하자면 0도에무언가 감지되면 1번진동센서가 울리고 10도에 초음파에무언가 감지되면 2번 진동센서가 2초동안 울리는방식 입니다.
참고로 한번 아두이노를작성해보았습니다. 하지만 제가생각한대로 움직이지않습니다. ㅠㅠ
제가만든 코드입니다.
#include <Servo.h>
#define TRIGGER_PIN 2 // 초음파센서 트리거 핀
#define ECHO_PIN 3 // 초음파센서 에코 핀
#define VIBRATE_PIN 4 // 진동센서 핀
#define SERVO_PIN 5 // 서보모터 핀
#define SERVO_SPEED 5000 // 5초에 한 바퀴
Servo myservo;
void setup() {
myservo.attach(SERVO_PIN);
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(VIBRATE_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
for (int angle = 0; angle <= 180; angle += 10) { // 0도에서 180도까지 10도씩 이동
myservo.write(angle);
delay(SERVO_SPEED / 180); // 10도마다 이동
float distance = getDistance();
if (distance < 150) { // 초음파에 무언가 탐지
digitalWrite(VIBRATE_PIN, HIGH); // 진동센서 동작
delay(2000); // 2초간 진동
digitalWrite(VIBRATE_PIN, LOW); // 진동센서 종료
}
}
}
float getDistance() {
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
float duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2;
return distance;
}
master님의 댓글
master 작성일
뭐가되고 뭐가 안되는지 알아야 하지 않을까요?
//
1번 진동센서 2번 진동센서...라고 질문에 적으셨는데 코드는 진동센서가 1개 뿐입니다.
매드닥터님의 댓글
매드닥터 작성일
제가 설명이부족했습니다. 죄송합니다
일단재료는 아두이노 마이크로와 서보모터1개 초음파센서1개 진동모터가9개입니다
서보모터에 초음파센서를부착시켜 움직일수있게 합니다. 초음파센서는 무한히 45도움직입니다.또한속도는왕복 5초입니다.
여기서 진동모터의 작동방식은이렇습니다.
1번 진동모터(서보모터0~5도로 움직인다. 초음파센서1.5미터거리에 무언가 탐지되면 울린다.)
2번 진동모터(서보모터5~10도로 움직인다. 초음파센서1.5미터거리에 무언가 탐지되면 울린다.)
3번 진동모터(서보모터10~15도로 움직인다. 초음파센서1.5미터거리에 무언가 탐지되면 울린다.)
4번 진동모터(서보모15~20도로 움직인다. 초음파센서1.5미터거리에 무언가 탐지되면 울린다.)
5번 진동모터(서보모터20~25도로 움직인다. 초음파센서1.5미터거리에 무언가 탐지되면 울린다.)
6번 진동모터(서보모터25~30도로 움직인다. 초음파센서1.5미터거리에 무언가 탐지되면 울린다.)
7번 진동모터(서보모터30~35도로 움직인다. 초음파센서1.5미터거리에 무언가 탐지되면 울린다.)
8번 진동모터(서보모터35~40도로 움직인다. 초음파센서1.5미터거리에 무언가 탐지되면 울린다.)
9번 진동모터(서보모터40~45도로 움직인다. 초음파센서1.5미터거리에 무언가 탐지되면 울린다.)
참고로 진동모터가울리며 초음파센서에무언가탐지되어도 서보모터는 초기화하지않고 계속진행되는형식입니다.
아두이노 코드가너무복잡해 도움을청합니다.
master님의 댓글
master 작성일
진동모터가 초음파센서의 측정을 방해 할 수 있겠습니다.
한 개도 아니고 9개라면 더욱..
#include <Servo.h>
Servo myservo;
//
#define TRIGGER_PIN 2 // 초음파센서 트리거 핀
#define ECHO_PIN 3 // 초음파센서 에코 핀
#define VIBRATE_PIN 4 // 진동센서 핀
#define SERVO_PIN 5 // 서보모터 핀
#define SERVO_SPEED 5000 // 5초에 한 바퀴
//
void setup() {
myservo.attach(SERVO_PIN);
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(VIBRATE_PIN, OUTPUT);
Serial.begin(9600);
}
//
void loop() {
for(int a=0;a<=9;a++){ // 0도에서 45도까지 5도씩 이동
myservo.write(a*5); delay(556); // 5도마다 이동 // 556*9=5004ms
float distance=getDistance();
if(distance<150){ // 초음파에 무언가 탐지
digitalWrite(VIBRATE_PIN,HIGH); // 진동센서 동작
delay(2000); // 2초간 진동
digitalWrite(VIBRATE_PIN,LOW); // 진동센서 종료
}
}
//
for(int a=9;a>=0;a--){ // 45도에서 0도까지 5도씩 이동
myservo.write(a*5); delay(556); // 5도마다 이동 // 556*9=5004ms
float distance=getDistance();
if(distance<150){ // 초음파에 무언가 탐지
digitalWrite(VIBRATE_PIN,HIGH); // 진동센서 동작
delay(2000); // 2초간 진동
digitalWrite(VIBRATE_PIN,LOW); // 진동센서 종료
}
}
}
//
float getDistance() {
digitalWrite(TRIGGER_PIN, LOW); delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIGGER_PIN, LOW);
float duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2;
return distance;
}
매드닥터님의 댓글
매드닥터 작성일진동모터는 몸에부착시킬것이며 완전체(초음파센서와 서보모터의부착)은 제가들고다닐것입니다. 제가바라본방향에 어느각도에서 탐지되면 맞는방향의 진동모터가 몸에 진동을울리는것입니다. 왼쪽에서 울리면 몸의 왼쪽에서 오른쪽에서 탐지되면 몸의 오른쪽에서 내용이 이상하다면 그림으로 따로그려 올려드리겠습니다.
매드닥터님의 댓글
매드닥터 작성일
#include <Servo.h>
#include <NewPing.h>
#include <SoftwareSerial.h>
// 초음파 센서 핀 설정
#define trigPin 11
#define echoPin 12
#define maxDistance 150 // 최대 감지 거리 (단위: cm)
// 서보모터 핀 설정
#define servoPin 9
Servo servo;
// 음성 출력을 위한 소프트웨어 시리얼 설정
#define voiceTx 7
#define voiceRx 8
SoftwareSerial voice(voiceTx, voiceRx);
// 서보모터 각도 초기값 설정
int angle = 0;
// 초음파 센서 객체 생성
NewPing sonar(trigPin, echoPin, maxDistance);
void setup() {
// Serial 통신 시작
Serial.begin(9600);
// 서보모터 핀 모드 설정
servo.attach(servoPin);
// 음성 출력용 소프트웨어 시리얼 통신 시작
voice.begin(9600);
// 서보모터 초기 각도로 이동
servo.write(angle);
// 초기화 완료 메시지 출력
Serial.println("Initialization complete.");
}
void loop() {
// 초음파 센서로부터 거리 측정
int distance = sonar.ping_cm();
// 거리가 0보다 큰 경우 (감지 성공)
if (distance > 0) {
// 각도 및 거리 정보 출력
Serial.print("Angle: ");
Serial.print(angle);
Serial.print(" deg, Distance: ");
Serial.print(distance);
Serial.println(" cm");
// 음성으로 감지된 각도와 거리 정보 출력
voice.print("Object detected at ");
voice.print(angle);
voice.print(" degrees, ");
voice.print(distance);
voice.println(" centimeters away.");
// 각도를 5도 증가시키거나 40도에서 0도로 되돌림
angle += 5;
if (angle > 40) {
angle = 0;
}
// 서보모터를 다음 각도로 이동
servo.write(angle);
delay(500);
}
// 거리가 0인 경우 (감지 실패)
else {
// 실패 메시지 출력
Serial.println("Object not detected.");
// 서보모터를 0도로 이동하여 시작 위치로 되돌림
angle = 0;
servo.write(angle);
delay(500);
}
}
진동모터에관해서 문제점이있다고 말씀하셔서 음성출력코드와 함쳐서 만들어보았습니다. 진동모터는 빼는것으로 하였습니다. 여기에 서보모터의 속도를 조절하고싶어서 코딩을 하려하니 오류가 발생합니다. 도와주십시오 서보모터의 속도는 왕복 4초입니다.
매드닥터님의 댓글
매드닥터 작성일
원하는 완제품의기능 이렇습니다
서보모터는 45도를 5도간격으로 무한히 왕복운동을 한다 속도는 왕복기준5초이다.
초음파센서는 서보모터에 부착하여 회전하면서 탐지한다
5도간격마다 초음파센서가 몇미터안에 무언가 탐지되면 음성으로 (몇도 몇미터에 사물이탐지되었다고 말해준다)입니다
제가만든 코딩에서 부족한 것이있다면 도와주십시오 ㅠㅠ