에듀이노-아두이노 전문 교육쇼핑몰 에듀이노-코딩교육 전문 쇼핑몰
뒤로가기

묻고답하기

제목

코딩 문의

작성자 김동진(ip:)

작성일 2021-06-21

조회 150

평점 0점  

추천 추천하기

내용

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


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


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

    }

}


첨부파일

비밀번호
수정

비밀번호 입력후 수정 혹은 삭제해주세요.

댓글목록

  • 작성자 커피타임

    작성일 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

왼쪽의 문자를 공백없이 입력하세요.

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

관련 글 보기

고객센터

    1670-9626

  • 팩스.063-902-6678
  • 이메일.eduino@robodyne.co.kr
  • Kakao. 에듀이노
  • 운영시간 : AM 10:00 ~ PM 16:30
  • 점심시간 : PM 12:00 - PM 13:00 토/일/공휴일 휴무
  • 고객센터 연결하기
입금계좌
  • 예금주: (주)로보다인시스템
  • 국민. 754801-01-760296
  • 농협. 301-0234-1423-01
  • IBK기업은행. 506-080015-01-016
배송 안내
  • 배송 방법 : 택배
  • 배송 지역 : 전국지역
  • 배송 비용 : 조건부 무료 : 주문 금액 100,000원 미만일 때 배송비 3,000원을 추가합니다.
  • 배송 기간 : 1일 ~ 2일
  • 배송 안내 :
    - 제주도, 산간벽지나 도서지방은 별도의 추가금액을 지불하셔야 하는 경우가 있습니다.
    고객님께서 주문하신 상품은 입금 확인후 배송해 드립니다. 다만, 상품종류에 따라서 상품의 배송이 다소 지연될 수 있습니다.
교환/반품 안내
교환 및 반품이 가능한 경우
- 상품을 공급 받으신 날로부터 7일이내 단, 가전제품의
  경우 포장을 개봉하였거나 포장이 훼손되어 상품가치가 상실된 경우에는 교환/반품이 불가능합니다.
- 공급받으신 상품 및 용역의 내용이 표시.광고 내용과
  다르거나 다르게 이행된 경우에는 공급받은 날로부터 3월이내, 그사실을 알게 된 날로부터 30일이내

교환 및 반품이 불가능한 경우
- 고객님의 책임 있는 사유로 상품등이 멸실 또는 훼손된 경우. 단, 상품의 내용을 확인하기 위하여
  포장 등을 훼손한 경우는 제외
- 포장을 개봉하였거나 포장이 훼손되어 상품가치가 상실된 경우
  (예 : 가전제품, 식품, 음반 등, 단 액정화면이 부착된 노트북, LCD모니터, 디지털 카메라 등의 불량화소에
  따른 반품/교환은 제조사 기준에 따릅니다.)
- 고객님의 사용 또는 일부 소비에 의하여 상품의 가치가 현저히 감소한 경우 단, 화장품등의 경우 시용제품을
  제공한 경우에 한 합니다.
- 시간의 경과에 의하여 재판매가 곤란할 정도로 상품등의 가치가 현저히 감소한 경우
- 복제가 가능한 상품등의 포장을 훼손한 경우
  (자세한 내용은 고객만족센터 1:1 E-MAIL상담을 이용해 주시기 바랍니다.)

※ 고객님의 마음이 바뀌어 교환, 반품을 하실 경우 상품반송 비용은 고객님께서 부담하셔야 합니다.
  (색상 교환, 사이즈 교환 등 포함)
«
»