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

묻고답하기

제목

라인 트레이서 코딩 문의

작성자 이무열(ip:)

작성일 2021-05-10

조회 480

평점 0점  

추천 추천하기

내용

모터 바퀴 앞바퀴가 정회전 뒷바퀴가 역회전 하는 상황 때문에 앞바퀴 둘과 뒷바퀴 둘을 묶은 후 뒷바퀴 묶은 결선을 플러스 마이너스 교환연결하여 모든 바퀴를 정회전 시켰습니다.

하지만 앞바퀴 뒷바퀴를 한데 묶다보니 코딩예제에서 우회전 좌회전할때 오른쪽 왼쪽이아닌 앞 뒤가 멈춰버리는 현상이 있습니다.


바꾼 상태로 좌회전과 우회전을 할 수 있게 하려면 코딩을 어떤식으로 짜야할까요? 도저히 모르겠어서 문의드립니다.


*/


int RightMotor_E_pin = 5;      // 오른쪽 모터의 Enable & PWM

int LeftMotor_E_pin = 6;       // 왼쪽 모터의 Enable & PWM

int RightMotor_1_pin = 8;      // 오른쪽 모터 제어선 IN1

int RightMotor_2_pin = 9;      // 오른쪽 모터 제어선 IN2

int LeftMotor_3_pin = 10;      // 왼쪽 모터 제어선 IN3

int LeftMotor_4_pin = 11;      // 왼쪽 모터 제어선 IN4


int L_Line = A5; // 왼쪽 라인트레이서 센서는 A3 핀에 연결

int C_Line = A4; // 가운데 라인트레이서 센서는 A4 핀에 연결

int R_Line = A3; // 오른쪽 라인트레이서 센서는 A5 핀에 연결


int motor_s = 230;     // 모터 속도 최대 255


int SL = 1;

int SC = 1;

int SR = 1;


void setup() {

  // declare the ledPin as an OUTPUT:

  pinMode(RightMotor_E_pin, OUTPUT);

  pinMode(LeftMotor_E_pin, OUTPUT);

  pinMode(RightMotor_1_pin, OUTPUT);

  pinMode(RightMotor_2_pin, OUTPUT);

  pinMode(LeftMotor_3_pin, OUTPUT);

  pinMode(LeftMotor_4_pin, OUTPUT);


  Serial.begin(9600);    // PC와의 시리얼 통신 9600bps로 설정

  Serial.println("Welcome Eduino!");

}


void loop() {

  int L = digitalRead(L_Line);

  int C = digitalRead(C_Line);

  int R = digitalRead(R_Line);


  Serial.print("digital : "); Serial.print(L); Serial.print(", "); Serial.print(C); Serial.print(", "); Serial.print(R); Serial.print("   ");


  if ( L == LOW && C == LOW && R == LOW ) {   // 0 0 0

    L = SL; C = SC; R = SR;

  }

  else if ( L == HIGH && C == LOW && R == HIGH ) {   // 0 0 0

    L = SL; C = SC; R = SR;

  }


  

  if ( L == 1 && C == 1 && R == 1 ) {  // 0 1 0

    motor_role(HIGH, HIGH, motor_s);

    Serial.println("직진");

  }

  else if ( L == 0 && C == 1 && R == 0 ) {  // 0 1 0

    motor_role(HIGH, HIGH, motor_s);

    Serial.println("직진");

  }

  else if (L == 0 && C == 1 && R == 1 ){   // 0 1 1

    motor_role(HIGH, HIGH, motor_s);

    Serial.println("우회전");

  }

  else if ( L == 0 && C == 0 && R == 1 ) {         // , 0 0 1

    Right_role(LOW, HIGH, motor_s);

    Serial.println("우회전");

  }

  else if (L == 1 && C == 1 && R == 0 ){     // 1 1 0, 

    motor_role(HIGH, HIGH, motor_s);

    Serial.println("좌회전");

  }

  else if (  L == 1 && C == 0 && R == 0 ) {         // 1 0 0

    Left_role(HIGH, LOW, motor_s);

    Serial.println("좌회전");


  }

  else if ( L == 0 && C == 0 && R == 0 ) {       // 1 1 1, 1 0 1

    motor_role(HIGH, HIGH, 0);

    Serial.println("정지");

  }

  


  SL = L; SC = C; SR = R;


}


void motor_role(int R_motor, int L_motor, int Speed) {

  digitalWrite(RightMotor_1_pin, R_motor);

  digitalWrite(RightMotor_2_pin, !R_motor);

  digitalWrite(LeftMotor_3_pin, L_motor);

  digitalWrite(LeftMotor_4_pin, !L_motor);


  analogWrite(RightMotor_E_pin, Speed);  // 우측 모터 속도값

  analogWrite(LeftMotor_E_pin, Speed);   // 좌측 모터 속도값

}


void Right_role(int R_motor, int L_motor, int Speed) {

  digitalWrite(RightMotor_1_pin, R_motor);

  digitalWrite(RightMotor_2_pin, !R_motor);

  digitalWrite(LeftMotor_3_pin, L_motor);

  digitalWrite(LeftMotor_4_pin, !L_motor);


  analogWrite(RightMotor_E_pin, max(Speed * 0.4, 50)); // 우측 모터 속도값

  analogWrite(LeftMotor_E_pin, min(Speed * 1.4, 255)); // 좌측 모터 속도값

}

void Left_role(int R_motor, int L_motor, int Speed) {

  digitalWrite(RightMotor_1_pin, R_motor);

  digitalWrite(RightMotor_2_pin, !R_motor);

  digitalWrite(LeftMotor_3_pin, L_motor);

  digitalWrite(LeftMotor_4_pin, !L_motor);


  analogWrite(RightMotor_E_pin, min(Speed * 1.4, 255)); // 우측 모터 속도값

  analogWrite(LeftMotor_E_pin, max(Speed * 0.2, 50)); // 좌측 모터 속도값

}


첨부파일 5AE5A46A-23B6-4259-BDC9-1DD2AFEC024C.jpeg

비밀번호
수정

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

댓글목록

  • 작성자 에듀이노 개발팀

    작성일 2021-05-11

    평점 0점  

    스팸글 안녕하세요 에듀이노 개발팀입니다.

    모터의 구동방향이 바뀌어 모터케이블을 하나로 묶어 사용할 경우 기존 제공되는 소스코드를 사용할 수 없습니다.

    강의자료를 기준으로 모터만 결선했을 경우, 모터의 검정색 케이블선이 위로 향해있는 구조라면 모터드라이버의 결선되는 모터케이블의 검정색 빨강색 순서를 바꿔서 결선해주시기바랍니다.
    결선이 완료되면, 소스코드의 motor_role 또는 motor_right / left의 코드의 신호 값을 수정해 테스트를 진행해주시기 바랍니다.

    모터의 결선상태가 모두 확인이 가능한 상태의이미지를 추가적으로 첨부해주시면 답변에 더욱 도움이되는점 참고부탁드리겠습니다.

    감사합니다.
댓글 수정

이름

비밀번호

내용

/ 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상담을 이용해 주시기 바랍니다.)

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