질문게시판 > 아두이노 센서3개와 모터제어 코딩 도와주세요!

TODAY1,172 TOTAL2,267,993
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 질문게시판 | 아두이노 센서3개와 모터제어 코딩 도와주세요!

페이지 정보

작성자 RLOP35 작성일2022-06-13 23:54 조회1,104회 댓글2건

본문

	

저번에도 코딩관련해서 글썼었는데 답변을 제대로 드리지않아 기분나쁘게 해드린점 우선 죄송합니다.

저번코딩에서 loop문을 수정하여 센서 업데이트 구문을 따로 주기를 설정하고 모터부분에서 따로 주기를 설정하여 동작하려고 합니다.(충돌시 원인파악을 빨리 찾고 두구문을 나눠서 충돌을 없애기위해서 입니다.)

[알고리즘은 열감지가 열원을 감지하여 로봇의 방향을 모터로 움직입니다. 그렇게 되면 가장높이 인식되는
열이 로봇의 중앙에 위치하도록 움직이고, 중앙에 맞춰지면 열원으로 접근합니다. 그리고 15cm이내 접근

하면 초음파센서가 이를 인식하여 모터를 멈춥니다. 그리고 사람이 압력센서에 압력을 가하면(압력값 150 이상) 다시 모터가 작동하는 알고리즘입니다.]

현재 다시 수정한 코드는

#include <SoftwareSerial.h>

#include <Adafruit_AMG88xx.h>

#include<Servo.h> 

#include <Wire.h>

#include "masks.h"

 

#define CONTROL_MOTOR 30

 

unsigned long tTime[2];

 

Servo yServo;

Servo xServo;

Adafruit_AMG88xx amg;

 

float pixels[AMG88xx_PIXEL_ARRAY_SIZE];

 

int distance = 0;

int sensor = A2;

int pinRX = 10;

int pinTX = 11;

 

unsigned char data_buffer[4] = {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();

   if ( currentTime - preTime1 > 100) //millis함수

  {

   preTime1 = currentTime;

   

   /*압력센서 업데이트*/

   int val = analogRead(sensor); //압력센서

   Serial.println(val);

 

   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];

   }

    Serial.print(Xpos);

    Serial.println("Xpos=");

   

   /*초음파 센서 업데이트*/

      do{

     for(int i=0;i<4;i++)

     {

       data[i]=mySerial.read();

     }

    }while(mySerial.read()==0xff);

 

    mySerial.flush();

 

    if(data[0]==0xff)

    {

      int sum;

      sum=(data[0]+data[1]+data[2])&0x00FF;

      if(sum==data[3])

      {

        distance=(data[1]<<8)+data[2];

        if(distance>30)

          {

           Serial.print("distance=");

           Serial.print(distance/10);

           Serial.println("cm");

        }

      }

    }

  }


 

   if(currentTime-tTime[0] > CONTROL_MOTOR)

   {

      여기 센서에 대해 모터를 제어하는 구문을 작성해야합니다.

   }

 

 

   //센서값은 loop문 마다 갱신

   }

 

이고 mask.h 파일은

 

float Xmask[] = {

  -0.0500, -0.0375, -0.0250, -0.0125, +0.0125, +0.0250, +0.0375, +0.0500,

  -0.0500, -0.0375, -0.0250, -0.0125, +0.0125, +0.0250, +0.0375, +0.0500,

  -0.0500, -0.0375, -0.0250, -0.0125, +0.0125, +0.0250, +0.0375, +0.0500,

  -0.0500, -0.0375, -0.0250, -0.0125, +0.0125, +0.0250, +0.0375, +0.0500,

  -0.0500, -0.0375, -0.0250, -0.0125, +0.0125, +0.0250, +0.0375, +0.0500,

  -0.0500, -0.0375, -0.0250, -0.0125, +0.0125, +0.0250, +0.0375, +0.0500,

  -0.0500, -0.0375, -0.0250, -0.0125, +0.0125, +0.0250, +0.0375, +0.0500,

  -0.0500, -0.0375, -0.0250, -0.0125, +0.0125, +0.0250, +0.0375, +0.0500,

};

float Ymask[] = {

  -0.0500, -0.0375, -0.0250, -0.0125, +0.0125, +0.0250, +0.0375, +0.0500,

  -0.0500, -0.0375, -0.0250, -0.0125, +0.0125, +0.0250, +0.0375, +0.0500,

  -0.0500, -0.0375, -0.0250, -0.0125, +0.0125, +0.0250, +0.0375, +0.0500,

  -0.0500, -0.0375, -0.0250, -0.0125, +0.0125, +0.0250, +0.0375, +0.0500,

  -0.0500, -0.0375, -0.0250, -0.0125, +0.0125, +0.0250, +0.0375, +0.0500,

  -0.0500, -0.0375, -0.0250, -0.0125, +0.0125, +0.0250, +0.0375, +0.0500,

  -0.0500, -0.0375, -0.0250, -0.0125, +0.0125, +0.0250, +0.0375, +0.0500,

  -0.0500, -0.0375, -0.0250, -0.0125, +0.0125, +0.0250, +0.0375, +0.0500,

};

입니다.

 

void loop 의 CONTROL_MOTOR 구문에는

if (Xpos > 0.20) //열감지 시작
       {
             xServo.write(80);
             yServo.write(0);         
       }
      else if(Xpos < -0.20) 
       {
             yServo.write(80);
             xServo.write(0);
       }       
      else  
       {
            yServo.write(80);
            xServo.write(80);
       }     //열감지 끝
          if(distance < 15) //초음파 시작
            {
              xServo.write(0);
              yServo.write(0);
            }               //초음파 끝
              if(val>150)
                {          //압력센서 시작
                    xServo.write(80);
                    yServo.write(80);                     
}
로 돌렸는데 열감지에 대한 모터만 작동하고 있습니다. 제 생각으로는 else문으로 끝나서 계속 열감지 구문만 반복해서 돌아가는게 아닌가 생각이 들긴합니다만
경우의수를 나눠서 코딩을 해보라고 하셔서 여러 방법으로 코딩도 해봤지만 모터가 작동하지 않는 경우도 있어서 도저히 방법을 알수없어 다시한번 질문드립니다..ㅠㅠ 부탁드립니다.
bldc모터는 프로펠러를 끼워서 물레방아 형식으로 돌아가게 할생각이고 물위에 띄워서 열원을따라 접근하는 로봇입니다.
  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 2

조회수 1,104

master님의 댓글

master 작성일

경우의수를 나눠서 코딩을 해보라고 하셔서 여러 방법으로 코딩도 해봤지만 모터가 작동하지 않는 경우도 있어서 도저히 방법을 알수없어 다시한번 질문드립니다
//
사람이 알 수가 없다면 코드를 작성하지 못하는 것입니다.
알고리즘 훈련이 안되어 있으니 경우의 수를 나누어서 알고리즘을 만들지 못하는 것입니다.

master님의 댓글

master 작성일

if(distance>15){
  if((Xpos>-0.20)&&(Xpos<0.20)){ yServo.write(80); xServo.write(80); }
  else                        { yServo.write(80); xServo.write( 0); }
}
else{
  if(val>150){ xServo.write(80); yServo.write(80); }
  else      { xServo.write( 0); yServo.write( 0); }
}

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
답변 답변글 답변 : steppermulti5 질문댓글[1] master 22-06-22 217
질문 atmega128 avr usart 질문 snoflak 22-06-21 344
답변 답변글 답변 : atmega128 avr usart 질문댓글[5] master 22-06-21 665
질문 사용자 정의 함수 변환 하는 방법댓글[2] 이미지첨부파일 da0800 22-06-21 290
질문 atmega128댓글[1] 이미지 양의노래 22-06-20 390
질문 아두이노 동시동작 재질문댓글[9] 이미지첨부파일 죠르디 22-06-20 912
질문 초음파센서로 dc모터 제어하기댓글[1] 첨부파일 난쟁2 22-06-20 470
질문 아두이노 동시동작댓글[7] 죠르디 22-06-19 597
질문 ATMEGA128 UART,FND 연동 질문 JMOD 22-06-19 400
답변 답변글 답변 : ATMEGA128 UART,FND 연동 질문댓글[1] master 22-06-20 331
질문 atmeg128 질문이요댓글[1] 이미지첨부파일 공대생er 22-06-18 341
질문 atmega128 초음파 센서로 신호등 시간초 늘리기 서동씨 22-06-18 363
답변 답변글 답변 : atmega128 초음파 센서로 신호등 시간초 늘리기댓글[1] master 22-06-18 449
질문 atmega128댓글[2] 망경이 22-06-18 493
질문 앱인벤터 이용해서 수동 자동 할라고하는데 ..잘안됩니다. (온도에따른 자동 수동 선풍기 )댓글[1] 따랑해영 22-06-18 803
답변 답변글 질문 : 앱인벤터 이용해서 수동 자동 할라고하는데 ..잘안됩니다. (온도에따른 자동 수동 선풍기 )댓글[1] 이미지첨부파일 따랑해영 22-06-19 266
답변 답변글 질문 : 앱인벤터 이용해서 수동 자동 할라고하는데 ..잘안됩니다. (온도에따른 자동 수동 선풍기 ) 앱인벤… 이미지첨부파일 따랑해영 22-06-19 1299
질문 서보모터와 초음파센서댓글[1] 브링미히어 22-06-17 631
질문 LCD 도와주세요 ㅜㅠㅠㅠ댓글[2] 이미지첨부파일 dentist22 22-06-17 568
질문 안녕하세요 atmega128 질문드리고 싶습니다. (자동 분리수거 기계, 소리 주파수 변환)댓글[3] dlcldl 22-06-17 721
질문 아두이노 delay를 millis로 바꾸고 싶습니다. 슨슨슨모 22-06-16 879
답변 답변글 답변 : 아두이노 delay를 millis로 바꾸고 싶습니다. master 22-06-17 457
질문 아두이노 LCD 시계 이미지첨부파일 dentist22 22-06-16 632
답변 답변글 답변 : 아두이노 LCD 시계 master 22-06-17 600
질문 ATMEGA128 HIGH LOW신호 수신 질문 yhj2644 22-06-16 550
답변 답변글 답변 : ATMEGA128 HIGH LOW신호 수신 질문댓글[3] master 22-06-17 639
질문 보드레이트 관련 재질문댓글[9] 죠르디 22-06-16 720
질문 서보모터, 사운드센서 질문댓글[3] 죠르디 22-06-16 724
질문 안녕하세요! 아두이노 로봇팔 질문! 이미지첨부파일 구찌만두 22-06-16 665
답변 답변글 답변 : 안녕하세요! 아두이노 로봇팔 질문! master 22-06-16 621
게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기