BASIC4MCU | 질문게시판 | 아두이노 센서 3개와 모터 bldc연동 코딩
페이지 정보
작성자 RLOP35 작성일2022-06-09 16:54 조회1,142회 댓글0건첨부파일
본문
안녕하십니까 현재 아두이노 센서(열감지, 초음파, 압력) 센서 3개를 이용하여 모터를 제어하는 코딩중에 있습니다.
알고리즘은 열감지 센서가 처음 열원을 인식하고 접근을 하며 15cm이내로 접근하면 초음파센서가 이를 인식하여 멈춥니다.
그리고 압력센서값이 100이 넘어가면 다시 모터가 작동하는 방식입니다.
현재 초음파센서와 압력센서를 결합후 두개를 모터와 연동하는 작업은 완료했고 열감지 코드를 이 코드에 결합하면
제대로 작동하지 않네요.. 모니터링 결과에 열감지 방향계산 값만 입력이되고 초음파와 압력센서는 입력이 되지 않습니다.
열감지에 의해 모터가 동작하는것만 가능합니다 현재 이코드로는
#include <SoftwareSerial.h>
#include <Adafruit_AMG88xx.h>
#include<Servo.h>
#include <Wire.h>
#include "masks.h"
Servo yServo;
Servo xServo;
Adafruit_AMG88xx amg;
float pixels[AMG88xx_PIXEL_ARRAY_SIZE];
int sensor = A2;
int pinRX = 10;
int pinTX = 11;
unsigned char data_buffer[4] = {0};
int distance = 0;
unsigned char CS;
SoftwareSerial mySerial(pinRX, pinTX);
unsigned long int preTime=0;
void setup()
{
Serial.begin(9600);
bool status;
// default settings
status = amg.begin();
if (!status) {
Serial.println("Could not find a valid AMG88xx sensor, check wiring!");
while (1);
}
delay(100); // let sensor boot up
// 서보모터 초기 위치로 이동
xServo.attach(9);
yServo.attach(8);
}
void loop(){
unsigned long int currentTime = millis();
amg.readPixels(pixels);
float Xpos = 0;
float Ypos = 0;
int temp;
int Tmin = 1000, Tmax = 0;
// 최소 최대값 추출
for (int i = 1; i <= AMG88xx_PIXEL_ARRAY_SIZE; i++) {
temp = pixels[i - 1] * 10;
Tmin = Tmin > temp ? temp : Tmin;
Tmax = Tmax < temp ? temp : Tmax;
}
//열원의 방향 계산
for (int i = AMG88xx_PIXEL_ARRAY_SIZE; i >= 1; i--) {
int temp = (pixels[i - 1] * 10);
int intTemp = map(temp, Tmin, Tmax, 0, 100);
int idx = map(temp, Tmin, Tmax, 0, 21);
float fltTemp = (float)intTemp / 100.0;
Ypos += fltTemp * Xmask[i - 1];
Xpos += fltTemp * Ymask[i - 1];
}
if( currentTime - preTime > 1000){
preTime = currentTime;
Serial.print(Xpos);
Serial.println("Xpos =");
//온도의 방향대로 서보 방향 조절
if (Xpos > 0.10) {
xServo.write(60);
yServo.write(0);
}
else if (Xpos < -0.10) {
yServo.write(60);
xServo.write(0);
}
else{
xServo.write(60);
yServo.write(60);
}
if (mySerial.read() == 0xff)
{
data_buffer[0] = 0xff;
for (int i = 1; i < 4; i++)
{
data_buffer[i] = mySerial.read();
}
CS = data_buffer[0] + data_buffer[1] + data_buffer[2];
if (data_buffer[3] == CS)
{
distance = (data_buffer[1] << 8) + data_buffer[2];
Serial.print("distance: ");
Serial.print(distance /10);
Serial.println("cm");
}
if(distance < 150){
xServo.write(0);
yServo.write(0);
}
else {
xServo.write(60);
yServo.write(60);
}
int val=analogRead(sensor);
Serial.println(val);
if(val>100){ xServo.write(60); yServo.write(60);} // 정회전
else {xServo.write(0); yServo.write(0);} // 정지
delay(1000);
}
// Run if data available
}
}
댓글 0
조회수 1,142등록된 댓글이 없습니다.