산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

조이스틱 제어 RC 자동차

구성품 및 소모품

Arduino UNO
× 1
Arduino USB 호스트 실드
× 1
XBOX360 무선 컨트롤러
× 1
XBOX360 수신기
× 1
1 L293D 모터 드라이버
× 1
7812
× 1
78S12
× 1
스위치
× 1
방열판
× 1
전원 플러그
× 1
9V 배터리 플러그가 있는 8개의 1v5 AA 배터리용 배터리 커넥터
× 1

이 프로젝트 정보

1. 차를 타세요!

우선 오래된 RC카가 필요합니다. 다행히 몬스터 트럭을 찾았습니다. 이것은 매우 흥미로울 수 있습니다!

2개의 모터를 제어하는 ​​케이블을 제외한 모든 전자 장치를 제거합니다.

2. Arduino와 방패

Arduino 보드(저는 Arduino UNO를 선택했습니다)를 가지고 USB 호스트 실드를 그 위에 꽂습니다.

3. 자동차에 Arduino 연결

Arduino UNO와 USB 호스트 실드 위에 실드를 연결하고 자동차에 나사로 고정합니다. 나는 오래된 전자 회로에 구멍 중 하나를 사용했습니다.

4. 회로 만들기

나는 브레드 보드에서 내 것을 만들었지 만 perfboard에서 만들 수도 있습니다. 기본적으로 회로는 두 개의 드라이버(L293D 또는 SN754410)와 두 개의 전압 안정기로 구성됩니다. 전압 안정기는 배터리의 전압을 제한하는 데 사용됩니다. 사실 저는 15-18V의 최대 전압을 가지기 위해 10-12개의 AA 1.5V 배터리를 사용하는 것이 좋습니다. 그러면 RC 자동차로 더 많은 시간을 보낼 수 있습니다. 모터는 많은 양의 전류를 필요로 하기 때문에 차량을 정지 위치(약 2A)에서 움직이기 위해서는 78S12와 같은 강력한 전압 안정기가 필요합니다.

드라이버 작동 방식에 대한 자세한 정보를 원하시면 여기를 참조하십시오!

5. 자동차에 회로 연결

회로를 배치할 수 있는 RC 자동차의 빈 곳을 찾으십시오. 내가 가지고 있는 몬스터 트럭에는 공간이 많이 있습니다. 일단 배치되면 회로를 두 개의 모터에 연결합니다. 마지막으로 무선 수신기를 USB 호스트 실드에 연결합니다.

6. 강령

코드는 Circuits@home의 Kristian Lauszus가 GitHub에 호스팅한 USB 호스트 라이브러리 2.0의 예를 기반으로 합니다.

USB_Host_Shield_2.0
/*Xbox Wireless Reciver 라이브러리의 예제 스케치 - Kristian Lauszus가 개발했으며 무선으로 최대 4개의 컨트롤러를 지원합니다. 자세한 내용은 블로그 게시물을 참조하십시오. http://blog.tkjelectronics.dk/2012/12 /xbox-360-receiver-added-to-the-usb-host-library/ orsend me an e-mail:[email protected]*/#include // 보기만 필요한 IDE 만족 ino.#ifdef dobogusinclude#include #endifUSB Usb;XBOXRECV Xbox(&Usb);#define motorPinOne 5 //선택한 핀에는 PWM이 있어야 합니다.#define motorPinTwo 6 //선택한 핀에는 다음이 있어야 합니다. PWM#define motor2PinOne 4 #define motor2PinTwo 7#define BRAKE 2/* 모터의 회전 속도를 정의합니다. 0에서 255 사이여야 합니다. */int pulse =0;int forward =0;int break_on =0;void setup() { TCCR1B =TCCR1B &0b11111000 | 0x02; Serial.begin(115200); if (Usb.Init() ==-1) { Serial.print(F("\r\nOSC가 시작되지 않았습니다.")); 동안(1); //정지 motors_stop(); 센터(); } Serial.print(F("\r\nXbox 무선 수신기 라이브러리 시작됨")); 핀모드(모터핀원, 출력); 핀모드(모터핀투, 출력); 핀모드(motor2PinOne, OUTPUT); 핀모드(motor2PinTwo, OUTPUT); 핀 모드(브레이크, 출력); digitalWrite (BRAKE, LOW);} 무효 루프() { Usb.Task(); if(Xbox.XboxReceiverConnected) { for(uint8_t i=0;i<4;i++) { if(Xbox.getButtonPress(L2, i)) { Serial.print("L2:"); Serial.print(Xbox.getButtonPress(L2, i)); 펄스 =Xbox.getButtonPress(L2, i); 앞으로 =0; 시계 방향(); } if(Xbox.getButtonPress(R2, i)) { Serial.print("R2:"); Serial.println(Xbox.getButtonPress(R2, i)); 펄스 =Xbox.getButtonPress(R2, i); 앞으로 =1; 시계 반대 방향(); } if(Xbox.getAnalogHat(LeftHatX, i)> 7500 || Xbox.getAnalogHat(LeftHatX, i) <-7500 || Xbox.getAnalogHat(LeftHatY, i)> 7500 || Xbox.getAnalogHat(LeftHatY, i) 7500 || Xbox.getAnalogHat(RightHatX, i)> 7500 || Xbox.getAnalogHat(RightHatX, i) <-7500 || Xbox.getAnalogHat(RightHatY, i)> 7500 || Xbox.getAnalogHat i(RightHatY, 7500) { if(Xbox.getAnalogHat(LeftHatX, i)> 7500) { Serial.print(F("LeftHatX:")); Serial.print(Xbox.getAnalogHat(LeftHatX, i)); Serial.print("\t"); if (Xbox.getAnalogHat(LeftHatX, i)> 26000) turn_right(); 그렇지 않으면 센터(); } if (Xbox.getAnalogHat(LeftHatX, i) <-7500) { Serial.print(F("LeftHatX:")); Serial.print(Xbox.getAnalogHat(LeftHatX, i)); Serial.print("\t"); if (Xbox.getAnalogHat(LeftHatX, i) <-26000) turn_left(); 그렇지 않으면 센터(); } if(Xbox.getAnalogHat(LeftHatY, i)> 7500 || Xbox.getAnalogHat(LeftHatY, i) <-7500) { Serial.print(F("LeftHatY:")); Serial.print(Xbox.getAnalogHat(LeftHatY, i)); Serial.print("\t"); } if(Xbox.getAnalogHat(RightHatX, i)> 7500) { Serial.print(F("RightHatX:")); Serial.print(Xbox.getAnalogHat(RightHatX, i)); Serial.print("\t"); } if (Xbox.getAnalogHat(RightHatX, i) <-7500) { Serial.print(F("RightHatX:")); Serial.print(Xbox.getAnalogHat(RightHatX, i)); Serial.print("\t"); } if(Xbox.getAnalogHat(RightHatY, i)> 7500 || Xbox.getAnalogHat(RightHatY, i) <-7500) { Serial.print(F("RightHatY:")); Serial.print(Xbox.getAnalogHat(RightHatY, i)); } 직렬.println(); } if(Xbox.getButtonClick(UP, i)) { Serial.println(F("위쪽")); } if(Xbox.getButtonClick(DOWN, i)) { Serial.println(F("아래로")); } if(Xbox.getButtonClick(LEFT, i)) { Serial.println(F("왼쪽")); } if(Xbox.getButtonClick(오른쪽, i)) { Serial.println(F("오른쪽")); } if(Xbox.getButtonClick(START, i)) { Serial.println(F("시작")); } if(Xbox.getButtonClick(BACK, i)) { Serial.println(F("뒤로")); } if(Xbox.getButtonClick(L3, i)) Serial.println(F("L3")); if(Xbox.getButtonClick(R3, i)) Serial.println(F("R3")); if(Xbox.getButtonClick(L1, i)) Serial.println(F("L1")); if(Xbox.getButtonClick(R1, i)) Serial.println(F("R1")); if(Xbox.getButtonClick(XBOX, i)) { Xbox.setLedMode(회전, i); Serial.println(F("Xbox")); } if(Xbox.getButtonClick(A, i)) { Serial.println(F("A")); } if(Xbox.getButtonClick(B, i)) { Serial.println(F("B")); 디지털 쓰기(브레이크, 높음); 브레이크 온 =1; 펄스 =100; if (앞으로) 시계 방향(); 그렇지 않으면 시계 반대 방향(); } if(Xbox.getButtonClick(X, i)) Serial.println(F("X")); if(Xbox.getButtonClick(Y, i)) { Serial.println(F("Y")); motors_stop(); } } } delay(1);}void clock(){ Serial.print("회전은 시계 방향이고 속도는 "); Serial.println(펄스); analogWrite(모터핀원,펄스); // H-브리지의 1번 다리를 낮게 설정 analogWrite(motorPinTwo,0); if (brake_on) { 지연(600); 디지털 쓰기(브레이크, 낮음); 브레이크 온 =0; 펄스 =0; }}void counterClockwise(){ Serial.print("회전은 시계 반대 방향이고 속도는 "); Serial.println(펄스); analogWrite(모터핀원, 0); // H-브리지의 1번 다리를 낮게 설정 analogWrite(motorPinTwo,pulse); if (brake_on) { 지연(600); 디지털 쓰기(브레이크, 낮음); 브레이크 온 =0; 펄스 =0; }} 무효 turn_left(){ digitalWrite(motor2PinOne,HIGH); // H-브리지의 1번 다리를 로우로 설정합니다. digitalWrite(motor2PinTwo,LOW);}void turn_right(){ digitalWrite(motor2PinOne,LOW); // H-브리지의 1번 다리를 낮게 설정합니다. digitalWrite(motor2PinTwo,HIGH);}void motors_stop(){ analogWrite(motorPinOne,0); analogWrite(motorPinTwo,0); 펄스 =0;} 무효 센터(){ digitalWrite(motor2PinOne, LOW); digitalWrite(motor2PinTwo, LOW);} 
<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • 코드 스니펫 #1
  • 코드 스니펫 #1Arduino
    /* Xbox Wireless Reciver 라이브러리의 예제 스케치 - Kristian Lauszus가 개발함 최대 4개의 컨트롤러를 무선으로 지원합니다. 자세한 내용은 블로그 게시물을 참조하십시오. http://blog.tkjelectronics.dk/2012/12/xbox-360 -receiver-added-to-the-usb-host-library/ 또는 이메일을 보내주십시오:[email protected] */#include // IDE를 만족시키십시오. in the ino.#ifdef dobogusinclude#include #endifUSB Usb;XBOXRECV Xbox(&Usb);#define motorPinOne 5 //선택한 핀에는 PWM이 있어야 합니다.#define motorPinTwo 6 //선택한 핀에는 PWM이 있어야 합니다#define motor2PinOne 4 #define motor2PinTwo 7#define BRAKE 2/* 모터의 회전 속도를 정의합니다. 0에서 255 사이여야 합니다. */int pulse =0;int forward =0;int break_on =0;void setup() { TCCR1B =TCCR1B &0b11111000 | 0x02; Serial.begin(115200); if (Usb.Init() ==-1) { Serial.print(F("\r\nOSC가 시작되지 않았습니다.")); 동안(1); //정지 motors_stop(); 센터(); } Serial.print(F("\r\nXbox 무선 수신기 라이브러리 시작됨")); 핀모드(모터핀원, 출력); 핀모드(모터핀투, 출력); 핀모드(motor2PinOne, OUTPUT); 핀모드(motor2PinTwo, OUTPUT); 핀 모드(브레이크, 출력); digitalWrite (BRAKE, LOW);} 무효 루프() { Usb.Task(); if(Xbox.XboxReceiverConnected) { for(uint8_t i=0;i<4;i++) { if(Xbox.getButtonPress(L2, i)) { Serial.print("L2:"); Serial.print(Xbox.getButtonPress(L2, i)); 펄스 =Xbox.getButtonPress(L2, i); 앞으로 =0; 시계 방향(); } if(Xbox.getButtonPress(R2, i)) { Serial.print("R2:"); Serial.println(Xbox.getButtonPress(R2, i)); 펄스 =Xbox.getButtonPress(R2, i); 앞으로 =1; 시계 반대 방향(); } if(Xbox.getAnalogHat(LeftHatX, i)> 7500 || Xbox.getAnalogHat(LeftHatX, i) <-7500 || Xbox.getAnalogHat(LeftHatY, i)> 7500 || Xbox.getAnalogHat(LeftHatY, i) 7500 || Xbox.getAnalogHat(RightHatX, i)> 7500 || Xbox.getAnalogHat(RightHatX, i) <-7500 || Xbox.getAnalogHat(RightHatY, i)> 7500 || Xbox.getAnalogHat i(RightHatY, 7500) { if(Xbox.getAnalogHat(LeftHatX, i)> 7500) { Serial.print(F("LeftHatX:")); Serial.print(Xbox.getAnalogHat(LeftHatX, i)); Serial.print("\t"); if (Xbox.getAnalogHat(LeftHatX, i)> 26000) turn_right(); 그렇지 않으면 센터(); } if (Xbox.getAnalogHat(LeftHatX, i) <-7500) { Serial.print(F("LeftHatX:")); Serial.print(Xbox.getAnalogHat(LeftHatX, i)); Serial.print("\t"); if (Xbox.getAnalogHat(LeftHatX, i) <-26000) turn_left(); 그렇지 않으면 센터(); } if(Xbox.getAnalogHat(LeftHatY, i)> 7500 || Xbox.getAnalogHat(LeftHatY, i) <-7500) { Serial.print(F("LeftHatY:")); Serial.print(Xbox.getAnalogHat(LeftHatY, i)); Serial.print("\t"); } if(Xbox.getAnalogHat(RightHatX, i)> 7500) { Serial.print(F("RightHatX:")); Serial.print(Xbox.getAnalogHat(RightHatX, i)); Serial.print("\t"); } if (Xbox.getAnalogHat(RightHatX, i) <-7500) { Serial.print(F("RightHatX:")); Serial.print(Xbox.getAnalogHat(RightHatX, i)); Serial.print("\t"); } if(Xbox.getAnalogHat(RightHatY, i)> 7500 || Xbox.getAnalogHat(RightHatY, i) <-7500) { Serial.print(F("RightHatY:")); Serial.print(Xbox.getAnalogHat(RightHatY, i)); } 직렬.println(); } if(Xbox.getButtonClick(UP, i)) { Serial.println(F("위쪽")); } if(Xbox.getButtonClick(DOWN, i)) { Serial.println(F("아래로")); } if(Xbox.getButtonClick(LEFT, i)) { Serial.println(F("왼쪽")); } if(Xbox.getButtonClick(오른쪽, i)) { Serial.println(F("오른쪽")); } if(Xbox.getButtonClick(START, i)) { Serial.println(F("시작")); } if(Xbox.getButtonClick(BACK, i)) { Serial.println(F("뒤로")); } if(Xbox.getButtonClick(L3, i)) Serial.println(F("L3")); if(Xbox.getButtonClick(R3, i)) Serial.println(F("R3")); if(Xbox.getButtonClick(L1, i)) Serial.println(F("L1")); if(Xbox.getButtonClick(R1, i)) Serial.println(F("R1")); if(Xbox.getButtonClick(XBOX, i)) { Xbox.setLedMode(회전, i); Serial.println(F("Xbox")); } if(Xbox.getButtonClick(A, i)) { Serial.println(F("A")); } if(Xbox.getButtonClick(B, i)) { Serial.println(F("B")); 디지털 쓰기(브레이크, 높음); 브레이크 온 =1; 펄스 =100; if (앞으로) 시계 방향(); 그렇지 않으면 시계 반대 방향(); } if(Xbox.getButtonClick(X, i)) Serial.println(F("X")); if(Xbox.getButtonClick(Y, i)) { Serial.println(F("Y")); motors_stop(); } } } delay(1);}void clock(){ Serial.print("회전은 시계 방향이고 속도는 "); Serial.println(펄스); analogWrite(모터핀원,펄스); // H-브리지의 1번 다리를 낮게 설정 analogWrite(motorPinTwo,0); if (brake_on) { 지연(600); 디지털 쓰기(브레이크, 낮음); 브레이크 온 =0; 펄스 =0; }}void counterClockwise(){ Serial.print("회전은 시계 반대 방향이고 속도는 "); Serial.println(펄스); analogWrite(모터핀원, 0); // H-브리지의 1번 다리를 낮게 설정 analogWrite(motorPinTwo,pulse); if (brake_on) { 지연(600); 디지털 쓰기(브레이크, 낮음); 브레이크 온 =0; 펄스 =0; } } 무효 turn_left(){ digitalWrite(motor2PinOne,HIGH); // H-브리지의 1번 다리를 로우로 설정합니다. digitalWrite(motor2PinTwo,LOW);}void turn_right(){ digitalWrite(motor2PinOne,LOW); // H-브리지의 1번 다리를 낮게 설정합니다. digitalWrite(motor2PinTwo,HIGH);}void motors_stop(){ analogWrite(motorPinOne,0); analogWrite(motorPinTwo,0); 펄스 =0;} 무효 센터(){ digitalWrite(motor2PinOne, LOW); digitalWrite(motor2PinTwo, LOW);}
    깃허브
    https://github.com/felis/USB_Host_Shield_2.0https://github.com/felis/USB_Host_Shield_2.0

    제조공정

    1. Bluetooth를 통해 제어되는 Raspberry Pi Robot
    2. 제스처 제어 대화형 테이블 조명
    3. Raspberry Pi를 통한 Alexa 제어 LED
    4. Nunchuk 제어 로봇 팔(Arduino 포함)
    5. Arduino Nano:조이스틱으로 2개의 스테퍼 모터 제어
    6. 음성 제어 로봇
    7. Arduino + Processing + PHP를 사용한 자동차 카운터
    8. Arduino 제어 피아노 로봇:PiBot
    9. Wi-Servo:Wi-Fi 브라우저 제어 서보모터
    10. Arduino 조이스틱