에듀이노-코딩교육 전문 쇼핑몰 에듀이노-코딩교육 전문 쇼핑몰

학교, 공공기관이라면 후불결제하세요!

 
현재 위치
  1. 게시판
  2. 묻고답하기

묻고답하기

기술문의 게시판입니다.

게시판 상세
제목 코딩 문의
작성자 김동진 (ip:)
  • 작성일 2021-06-21
  • 추천 추천하기
  • 조회수 147

안녕하세요 해당 제품 구매 후 사용중입니다.


해당 제품 동작을 하나의 신호를 받아서 작동하고 작동하지 않게 하고 싶습니다.


EMG라는 신호를 자동차 키트 아두이노에 수신한다고 가정했을때


EMG가 high 일때 자동차는 모든 동작을 멈추게 하고 싶고


EMG가 low 일때 자동차는 다시 움직였으면 좋겠습니다.


if 문을 사용하면 될 것 같은데 어느 시점에 삽입하면 되는지 다소 어려움이 있어 문의드립니다.


아래 코드문에 제가 생각하는 if문 위치를 작성해보았는데 도움 좀 주시면 감사하겠쓰니다.


작성코드


#include <SoftwareSerial.h>

#include <AFMotor.h>


AF_DCMotor motor_L(1);

AF_DCMotor motor_R(4);


int i;


//초음파센서 출력핀(trig)과 입력핀(echo), 변수, 함수 선언 //

int TrigPin = A0;

int EchoPin = A1;

long duration, distance;


void Obstacle_Check();

void Distance();

void Forward();

void Backward();

void Right();

void Left();

void Stop();


void setup() {

    Serial.begin(9600); // PC와의 시리얼 통신속도

    Serial.println("Eduino Smart Car Start!");


    pinMode(EchoPin, INPUT); // EchoPin 입력

    pinMode(TrigPin, OUTPUT); // TrigPin 출력


    motor_L.setSpeed(160);

    motor_L.run(RELEASE);

    motor_R.setSpeed(180);

    motor_R.run(RELEASE);

}


 if (EMG == HIGH) {

        Stop();

        }

else {

void loop() {

    Forward();

    delay(100);

    Obstacle_Check();

}

//장애물 확인 및 회피 방향 결정//


void Obstacle_Check() {

    int val = random(2);

    Distance();


    Serial.println(distance);


    while (distance < 200) {

        if (distance < 180) {

            Backward();

            delay(250);

            Stop();

            delay(50);

            Distance();

        }

        else{

            if (val ==0) {

                Right();

                delay(400);

            }

            else if (val ==1)  {

                Left();

                delay(400);

            }

            Distance();

        }

    }

}


}


//거리 감지//

void Distance() {

    digitalWrite(TrigPin, LOW);

    delay(2);

    digitalWrite(TrigPin, HIGH); // trigPin에서 초음파 발생(echoPin도  HIGH)

    delayMicroseconds(10);

    digitalWrite(TrigPin, LOW);

    duration = pulseIn(EchoPin, HIGH); // echoPin이 HIGH를 유지한 시간을 저장 한다.

    distance = ((float)(340 * duration)/1000) /2;

    delay(5);

}


//방향 제어 함수//

void Forward() {

    motor_L.run(FORWARD); motor_R.run(FORWARD);

    for (i=0; i<200; i=i+20) {

     motor_L.setSpeed(i); motor_R.setSpeed(i);

     delay(2);   

    }

    for (i=0;i<200;i=i-20){

        motor_L.setSpeed(i); motor_R.setSpeed(i);

        delay(2);

    }

}


void Backward() {

    motor_L.run(BACKWARD); motor_R.run(BACKWARD);

    for (i=0; i<200; i=i+20) {

     motor_L.setSpeed(i); motor_R.setSpeed(i);

     delay(2);   

    }

    for (i=0;i<200;i=i-20){

        motor_L.setSpeed(i); motor_R.setSpeed(i);

        delay(2);

    }

}


void Right() {

    motor_L.run(FORWARD); motor_R.run(BACKWARD);

    for (i=0;i<180;i=i+20){

        //j = i*1.3;    if(j>=200) j = 200;

        motor_L.setSpeed(i); motor_R.setSpeed(i);

        delay(2);

    }

    for (i=180; i<0; i=i-20){

        motor_L.setSpeed(i); motor_R.setSpeed(i);

        delay(2);

    }

}


void Left() {

      motor_L.run(BACKWARD); motor_R.run(FORWARD);

    for (i=0;i<180;i=i+20){

        //j = i*1.3;    if(j>=200) j = 200;

        motor_L.setSpeed(i); motor_R.setSpeed(i);

        delay(2);

    }

    for (i=180; i<0; i=i-20){

        motor_L.setSpeed(i); motor_R.setSpeed(i);

        delay(2);

    }  

}


void Stop() {

    motor_L.run(RELEASE); motor_R.run(RELEASE);

    for (i=200; i>=0; i=i-20) {

        motor_L.setSpeed(i); motor_R.setSpeed(i);

        delay(2);

    }

}


게시글 신고하기

신고사유

신고해주신 내용은 쇼핑몰 운영자의 검토 후 내부 운영 정책에 의해 처리가 진행됩니다.

평점 0점
첨부파일
비밀번호 수정 및 삭제하려면 비밀번호를 입력하세요.
  • 커피타임 2021-06-21 0점
    수정 삭제 댓글
    스팸글 소프트웨어시리얼 헤더를 보아 블루투스를 통해서 on, off 기능을 실행하시려는 건가요?

    if문이 loop 부분 안에 있어야됩니다
    계속 반복해야 되니까요

    제 생각엔 switch문을 사용해서 제어하는 게 어떨까 싶네요

    변수 MC선언해서 스위치문에서 EMG가 0과 1일 때 각각 0, 1넣고
    밑에서 if문으로 MC==0, 1일 때 작동 각각 설정해주면 되지 않을까요?
  • 김동진 2021-06-21 0점
    수정 삭제 댓글
    스팸글 안녕하세요 제가 코딩에 대한 경험이 없어서 해당 코딩은 유튜브 영상내에 나오는 코딩은 직접 입력한거 입니다.
    블루투스 기능은 사용하지 않고 제가 이 자동차 제품 위에 공기청정기 아두이노를 올릴 생각인데
    공기청정기에서 공기가 나쁨 신호를 자동차에서 받아서 공기가 나쁠 때 자동차가 동작을 하지 않고 공기를 정화후 좋을 때 다시 움직이는 방법으로 사용하려고 합니다.
    말씀하신 if 문이 loop문 내에 있어야 한다면
    void loop() {

    Forward();

    delay(100);

    Obstacle_Check();

    }
    이 구간 말씀하시는거 맞나요?
    void loop() {
    if(EMG==HIGH){
    stop();
    }
    else {
    Forward();

    delay(100);

    Obstacle_Check();
    }
    }
    이런식으로 들어오는게 맞나요?
  • 아몬드 브리즈 2021-06-21 0점
    수정 삭제 댓글
    스팸글 네 맞아요 센서를 뭐 쓰시는 지는 모르겠지만 미세먼지 센서면 보통 pm2.5정도 측정 값 알려줄텐데 EMG 1과 0으로 할 게 아니라 루프문 안에
    if(dust>250){
    void go();
    }
    else{
    void stop();
    }
    이런 식으로 가시는 게 어떨까요

    각각 조건에 맞는 수식 입력해주시구요

    해당 함수 사용은 4휠 스마트 RC카 강의자료에 모터드라이버 다루는 예제에서 참조하시면 좋을 것 같습니다.
  • 나그네 2021-06-21 0점
    수정 삭제 댓글
    스팸글 IF 문은 LOOP()문 안에 삽입해 작성해 주세요 !

    질문을 보니까 2가지 방법으로 가능할 것같네요

    첫번째) 동작함수(forward(), back() 등)안에 조건문을 삽입해 EMG 신호 수신 시, 동작을 멈추는 코드로 구성하는 방법.

    두번째) loop()문에 신호를 수신하는 조건문을 생성하고 그 조건문안에 기존 동작코드를 삽입해 신호를 수신할때만 정지하고 아니면 기존 기능을 수행할 수 있도록 코드를 구성하는 방법 시도하시면 될것같습니다.

    신호 송수신 체계가 블루투스인지 시리얼통신인지 모르겠지만 사용하는 통신체계에 맞는 코드구성을 해주세요 꼭!
  • 김동진 2021-06-21 0점
    수정 삭제 댓글
    스팸글 안녕하세요 제가 코딩에 대한 경험이 없어서 해당 코딩은 유튜브 영상내에 나오는 코딩은 직접 입력한거 입니다.
    블루투스 기능은 사용하지 않고 제가 이 자동차 제품 위에 공기청정기 아두이노를 올릴 생각인데
    공기청정기에서 공기가 나쁨 신호를 자동차에서 받아서 공기가 나쁠 때 자동차가 동작을 하지 않고 공기를 정화후 좋을 때 다시 움직이는 방법으로 사용하려고 합니다.
    말씀하신 if 문이 loop문 내에 있어야 한다면
    void loop() {

    Forward();

    delay(100);

    Obstacle_Check();

    }
    이 구간 말씀하시는거 맞나요?
    void loop() {
    if(EMG==HIGH){
    stop();
    }
    else {
    Forward();

    delay(100);

    Obstacle_Check();
    }
    }
    이런식으로 들어오는게 맞나요?

스팸신고 스팸해제

댓글 수정

비밀번호 :

수정 취소

/ byte

비밀번호 : 확인 취소

댓글 입력

댓글달기이름 :비밀번호 : 관리자답변보기

확인

/ byte

왼쪽의 문자를 공백없이 입력하세요.(대소문자구분)

에게만 댓글 작성 권한이 있습니다.

댓글 입력

댓글달기이름 :비밀번호 :

확인

/ byte

왼쪽의 문자를 공백없이 입력하세요.(대소문자구분)

에게만 댓글 작성 권한이 있습니다.

«
»