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

레고 파워 기능 제어

구성품 및 소모품

Arduino UNO
× 1
Texas Instruments 듀얼 H-Bridge 모터 드라이버 L293D
(사진에 표시된 표면 실장 버전이 아닌 긴 핀이 있는 것을 구매)
× 1
브레드보드(일반)
× 1
9V 대 배럴 잭 커넥터
× 1
Lego Power Functions 연장 와이어(항목:8886)
× 3
HC-05 블루투스 모듈
× 1

이 프로젝트 정보

전기 모터와 서보 모터가 있는 멋진 레고 파워 펑션 모델이 있습니까? 이 튜토리얼에서는 Arduino와 최소한의 전자 부품으로 레고 모델을 제어하는 ​​방법을 보여 드리겠습니다. 초보자도 쉽게 이해할 수 있도록 회로와 프로그래밍에 대해 자세히 설명하겠습니다. (아들이 없는 경우) 직접 조립해야 하는 레고 모델은 도와드리지 않겠습니다.

또한 MIT 앱 발명가를 사용하여 원격 제어 Android 앱을 프로그래밍하는 방법도 배웁니다. 곧 뒷마당에 나만의 레고 화성 탐사선이 있을 것입니다!

이것은 제 첫 Arduino 프로젝트이며 제 아들은 레고 파워 기능이 있는 아름다운 레고 테크닉 자동차 모델(9398 4X4 크롤러)을 가지고 있습니다. 조향용 레고 서보 모터 1개와 운전용 레고 L 모터 2개. 그는 내가 이 프로젝트를 위해 자동차를 사용하는 것을 허락했습니다(내가 모터 케이블을 자르지 않는 한). 여기에서 완성된 프로토타입을 테스트합니다.

Power Functions 배선 이해

먼저 Lego Power Functions Extension 전선(레고 웹 상점에서 품목 8886)을 구입합니다. 다음으로 (진지하게) 잘라냅니다. 우리는 한쪽 끝에 레고 브릭이 있고 다른 쪽 끝에 핀이 있는 "브레이크아웃" 케이블을 만들 것입니다. 또는 이와 유사한 핀을 납땜하십시오. 다음은 배선에 대한 설명입니다.

GND는 접지를 의미하며 배터리 팩(양극)의 음극(-) 단자입니다. C1 및 C2는 극성을 전환하여 모터와 서보가 방향을 전환하도록 할 수 있습니다. TechnicRobot은 모든 것을 자세히 설명하는 멋진 비디오를 만들었습니다. (경고:이 작업은 자신의 책임으로 하는 것입니다. 무언가를 망치는 경우 책임을 지지 않습니다!) 레고 서보 커넥터의 경우 핀을 4개의 케이블 모두에 납땜해야 합니다. 밝은 회색 플러그를 사용할 수 있습니다. 배터리 상자와 브레드보드를 ​​연결하는 전원 케이블의 경우 +9 볼트와 GND만 필요하지만 짙은 회색 플러그를 사용해야 합니다(수 커넥터가 필요하기 때문에).

모터 케이블의 경우 C1과 C2만 연결하면 되며 밝은 회색 플러그를 사용할 수 있습니다. (자세한 내용은 회로도를 참조하세요.)

L293D 칩으로 레고 모터 제어하기

우리는 DC 모터를 위한 가변 속도 제어와 레고 서보를 위한 위치 제어를 원합니다. 이것은 펄스 폭 변조(PWM)에 의해 달성됩니다. Arduino의 프로그래밍 언어는 PWM을 사용하기 쉽게 만듭니다. 간단히 analogWrite(pin, dutyCycle)를 호출하십시오. 여기서 dutyCycle은 0에서 255 사이의 값입니다. PWM 핀은 arduino에서 ~로 표시되어 있습니다.

Arduino 출력 핀은 최대 5볼트입니다. 레고 모터가 9볼트를 필요로 하고 각각 100mA 이상을 당기는 동안 30mA입니다. 우리는 그 사이에 일종의 "스위칭 장치"가 필요합니다. 우리는 또한 DC 모터를 양방향으로 작동할 수 있기를 원합니다. 이러한 기능은 소위 H 브리지로 해결됩니다. 하나의 통합 칩에 두 개의 H 브리지가 포함된 L293D를 사용할 것입니다. 즉, 레고 모터(M)를 칩의 다른 면에 병렬로 연결하고 레고 서보(S)를 연결할 수 있습니다. (두 개의 모터를 독립적으로 제어하려면 두 번째 L293D가 필요합니다.) 레고 서보도 GND와 레고 +9 볼트에 연결해야 합니다.

이 칩은 레고 +9볼트와 아두이노 +5볼트를 완전히 분리된 상태로 유지합니다. 절대로 함께 연결하지 마십시오. 그렇지 않으면 무언가가 손상될 수 있습니다! 그러나 모든 접지선을 L293D 접지 핀과 함께 연결해야 합니다.

Arduino에서 핀 9를 사용하여 모터 속도를 제어하고 핀 2와 5를 사용하여 회전 방향을 제어합니다. 레고 서보는 모터처럼 제어됩니다. 우리는 핀 3을 위치에 연결하고 핀 6과 8을 방향(왼쪽 또는 오른쪽)에 연결합니다.

프로그램 상단에서 사용된 Arduino 핀을 상수로 정의합니다. 또한 모터를 제어하는 ​​데 사용할 몇 가지 변수를 정의합니다.

// 모터 제어 디지털 출력 핀은 전역 상수로 정의됩니다.const int controlPin1A =2; const int controlPin2A =5; const int ENablePin =9; // 전역 상수로 정의된 서보 제어 디지털 출력 핀 const int controlPin3A =6; const int controlPin4A =8; const int 서보ENablePin =3; // 모터 제어 전역 변수:int motorSpeed ​​=0; // 모터 속도 0..255int motorDirection =1; // 정방향(1) 또는 역방향(0)// 서보 제어 전역 변수:int steering =0; // 서보 위치 0..255int SteeringDirection =0; // 왼쪽(0) 및 오른쪽(1) 

설정에서 이러한 핀을 pinmode() 명령을 사용하여 출력으로 정의한 다음 digitalWrite()를 사용하여 0V로 설정합니다.

void setup() { //other stuff.... // 디지털 출력 핀 선언:pinMode(controlPin1A, OUTPUT); // 1A pinMode(controlPin2A, OUTPUT); // 2A 핀모드(ENablePin, OUTPUT); // EN1,2 pinMode(controlPin3A, OUTPUT); // 3A 핀모드(controlPin4A, OUTPUT); // 4A 핀모드(servoENablePin, OUTPUT); // EN3,4 digitalWrite(ENablePin, LOW); // 모터 오프 digitalWrite(servoENablePin, LOW); // 스티어링 중심} 

이제 L293D 칩이 모터의 회전 방향을 제어하는 ​​방법을 이해해야 합니다. 다음 신호를 공급해야 합니다(높음 ==5볼트, 낮음 ==0볼트).

<울>
  • EN1,2 1A 2A
  • <울>
  • 높음 높음 낮음 모터가 좌회전(앞으로, motorDirection ==1)
  • <울>
  • 높음 낮음 높음 모터가 우회전(역회전, motorDirection ==0)
  • <울>
  • EN3,4 3A 4A
  • <울>
  • 높음 높음 낮음 서보 좌회전(steeringDirection ==0)
  • <울>
  • 높음 낮음 높음 서보가 우회전(steeringDirection ==1)
  • 확인. 방향과 속도/위치에 대한 전역 변수를 읽고 모터와 서보를 제어하는 ​​서브루틴을 작성할 준비가 되었습니다.

    void SetMotorControl(){ if (motorDirection ==1) //Forward { digitalWrite(controlPin1A, HIGH); digitalWrite(controlPin2A, LOW); } else //역방향 { digitalWrite(controlPin1A, LOW); digitalWrite(controlPin2A, HIGH); } analogWrite(ENablePin, motorSpeed); //속도 if (steeringDirection ==0) //왼쪽 { digitalWrite(controlPin3A, HIGH); digitalWrite(controlPin4A, LOW); } else //오른쪽 { digitalWrite(controlPin3A, LOW); digitalWrite(controlPin4A, HIGH); } analogWrite(servoENablePin, 스티어링); //서보 위치} 

    조이스틱이 있는 간단한 RC Android 앱

    다음으로 모델을 제어하는 ​​간단한 Android 앱을 빌드해 보겠습니다. (완성된 앱을 먼저 테스트하고 싶다면 구글 플레이 스토어에 올려두었습니다. 링크는 아두이노 RC 카 블루투스).

    우리는 MIT 앱 발명가 2를 사용할 것입니다. MIT 앱 발명가는 프로그래밍 및 앱 제작에 대한 혁신적인 초보자 입문서입니다. Google의 Mark Friedman과 MIT 교수 Hal Abelson이 공동으로 App Inventor 개발을 주도했습니다. MIT 모바일 학습 센터 직원이 관리하는 웹 서비스로 실행됩니다.

    Android 휴대폰에서 Google Play로 이동하여 MIT AI2 Companion 앱을 설치합니다. 컴퓨터의 Firefox 또는 Chrome 브라우저에서 내 RC 앱에 대한 링크를 엽니다(Internet Explorer는 지원되지 않음). 소스 코드를 보려면 Gmail 주소를 사용하여 로그인하고 계정을 만들어야 합니다. 휴대폰에서 컴패니언 앱을 열면 브라우저에서 소스 코드를 보고 변경하고 휴대폰에서 즉시 테스트할 수 있습니다.

    이제 브라우저에서 앱의 디자이너 보기를 볼 수 있습니다.

    하단에는 파란색 조이스틱볼이 있는 주황색 패드가 있습니다. 이제 프로그램을 보려면 블록 보기로 변경하십시오. 프로그램의 핵심은 파란색 조이스틱볼을 터치하고 드래그하는 손가락의 움직임을 추적하는 when-block입니다.

    손가락의 위치는 두 변수 currentX에서 추적됩니다. 및 현재Y 두 변수 조향에 대한 값을 계산하는 데 사용됩니다. 및 속도 (범위:-100..0..+100). 먼저 프로그램은 손가락이 패드 밖에 있는지 확인하고 값을 +/- 100으로 제한합니다. 손가락이 패드 안에 있으면 프로그램은 조향 값을 계산합니다. 및 속도 . 다음으로 프로그램은 다음 형식의 명령 문자열을 생성합니다.

    명령은 원격 제어를 위한 "RC"로 시작하고(미래에 더 많은 명령을 원할 수 있다는 생각) 쉼표가 뒤따릅니다. 그런 다음 스티어링에 대한 값을 보냅니다. 및 속도 . 명령 끝에 있는 개행 문자('\n')는 명령이 완료되었음을 Arduino에 보내는 신호입니다. 이 명령 문자열은 블루투스를 통해 Arduino로 전송됩니다. 참고로 문자열도 화면에 표시됩니다.

    Arduino로 블루투스 명령 읽기

    Bluetooth 명령 문자열을 읽으려면 HC-05 Bluetooth 모듈을 연결해야 합니다. 모듈 살펴보기:

    내 핀은 6개입니다. 우리는 4개의 핀만 필요합니다. VCC는 (양의) 공급 전압이고 GND는 접지입니다. 이 모듈은 6V 공급 전압을 허용하므로 arduino 5V 전원 핀에 연결할 수 있습니다. TXD 및 RXD는 직렬 신호입니다. 우리는 선을 넘어 TXD를 arduino RXD(핀 0)에 연결하고 그 반대로 연결해야 합니다. 주의: LEVEL:3.3V로 표시되며, 이는 RXD가 할 수 없음을 의미합니다. 5V arduino TXD(핀 1)에 직접 연결하십시오. 5V의 2/3인 출력 전압을 생성하기 위해 3개의 1kOhm 저항으로 전압 분배기를 구성해야 합니다(회로도 참조). 반면에 3.3V의 TXD 신호는 Arduino RXD에 직접 연결할 수 있습니다. Arduino는 3.3V를 HIGH로 인식합니다.

    핀 0과 1은 Arduino의 USB 포트와 공유되므로 USB를 통해 보드에 프로그램을 업로드하는 동안 핀 0과 1에서 RXD 및 TXD 신호를 분리해야 합니다. 케이블을 분리하지 않으면 업로드가 작동하지 않습니다.

    다음으로 HC-05 모듈을 Android 장치와 페어링해야 합니다. 블루투스를 켜십시오. 앱을 시작합니다. "블루투스 연결"을 누르십시오. 휴대전화가 보이도록 하고 HC-05 또는 이와 유사한 장치를 찾으세요. 장치를 선택합니다. 코드를 묻는 메시지가 표시됩니다. "1234"를 누르십시오. 조이스틱 화면으로 돌아가면 녹색으로 "연결됨"으로 표시되어야 합니다.

    이제 코드를 살펴보겠습니다.

    // 직렬 버퍼 크기:하나의 명령에 대해 예상되는 최대 입력 크기를 기반으로 계산#define INPUT_SIZE 30 void loop() { // 직렬 블루투스에서 다음 명령 가져오기(최종 0에 대해 1바이트 추가) char 입력[ INPUT_SIZE + 1]; // char 유형의 배열(C-string) // 새 줄 또는 버퍼가 가득 찰 때까지 직렬 읽기 또는 시간 초과 바이트 크기 =Serial.readBytesUntil('\n', input, INPUT_SIZE); // 마지막 0을 추가하여 C 문자열을 종료합니다. input[size] =0; // "RC,steering,speed,\n\0" 형식의 문자열 분할 char* command =strtok(input, ","); // 명령(RC) // 범위의 RC스티어링:-100(왼쪽).. 0 .. 100(오른쪽) char* RCsteering =strtok(NULL, ","); // 범위 내 RCspeed:-100(최대 속도 역방향).. 0 .. 100(최대 속도 정방향) char* RCspeed =strtok(NULL, ","); int iRC스티어링 =atoi(RC스티어링); // 문자열을 정수로 변환 int iRCspeed =atoi(RCspeed); // 문자열을 정수로 변환 // 나머지 프로그램}  

    Android 앱에서 보낸 문자열은 특수한 string-construct로 읽혀집니다. 즉, null 종료가 있는 C-string입니다. (0-문자는 프로그램이 문자열의 끝에 왔다는 것을 알려줍니다). 이것은 직렬 인터페이스(블루투스)에서 개행 문자('\n')를 얻을 때까지 읽는 함수 Serial.readBytesUntil('\n', input, ...)을 사용하여 수행됩니다. 그렇게 하면 input에 완전한 명령이 있을 때까지 바이트를 계속 읽습니다. :

    입력을 처리하는 매우 효율적인 방법 쉼표를 구분 기호로 사용하여 문자열을 부분으로 자르는 문자열 토큰 함수입니다. strtok()에 대한 첫 번째 호출은 "RC"를 반환합니다. 그런 다음 strtok()에 NULL을 전달하여 명령의 후속 부분을 읽습니다. 반환 값은 RCsteering에 저장됩니다. 및 RCspeed . 이러한 변수는 실제로 입력의 위치에 대한 포인터입니다. . atoi() 함수는 최종적으로 정수로 변환합니다. 이제:

    이제 거의 완료되었습니다. SetMotorControl() 루틴에 전달하기 전에 이 값에 2.55를 곱해야 합니다(모터 속도가 0..255 범위에 있음을 기억하십시오). 코드 섹션에서 나머지 프로그램을 공부하고 회로를 만들고 원격 제어 레고 모델을 테스트하세요!

    다음은 무엇입니까?

    이제 레고 모델을 제어하는 ​​Arduino가 있으므로 해당 모델을 로봇 공학 플랫폼으로 사용할 수 있습니다. 초음파 핑 센서를 추가하고, 자신만의 장애물 회피 로직을 프로그래밍하고, 자체 운전 로봇 화성 탐사선을 만드십시오. 또는 리모컨에 더 많은 명령을 추가하고 모델에 더 많은 기능을 추가하십시오. 그러나 먼저 Arduino가 모델이 블루투스 연결 범위를 벗어 났는지 파악하고 모델을 중지하는 방법을 찾으십시오. 솔루션에 대해 알려주세요.

    곧 프로토타이핑 브레드보드와 느슨한 케이블은 움직이는 모델에 적합하지 않다는 것을 알게 될 것입니다. 큰 단자대 커넥터가 있는 adafruit 모터실드를 구입하고 배선 및 재프로그래밍을 수행하십시오. 또한 대신 입력에 사용할 수 있는 디지털 신호를 확보할 수 있습니다. 센서의 더 나은 연결을 위해 센서 실드를 고려할 수도 있습니다.

    기존 프로젝트에 대해 알려주세요!

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • Legocar_v3_bluetooth
  • Legocar_v3_bluetoothArduino
    /* 블루투스로 제어되는 레고 파워펑션 자동차 모델 아두이노 우노가 모터와 서보를 제어 MIT 앱 인벤터 2로 개발된 안드로이드 앱으로 원격 제어 회로:* 직렬 통신(우노 핀 0,1 사용) 블루투스 모듈이 부착되어 있다. USB를 통해 프로그램을 로드할 때 분리) * 모터가 있는 L293D(Uno 디지털 핀 2,5,9 사용) * L293D와 서보(Uno 디지털 핀 6,8,3 사용) */// 사용된 라이브러리:#include  // Serial Peripheral Interface Library#include  // strtok 기능 포함:문자열을 토큰으로 분할// 직렬 버퍼 크기:블루투스를 통한 하나의 명령에 대해 예상되는 최대 입력 크기를 기반으로 계산 직렬 인터페이스#define INPUT_SIZE 30/ / 전역 상수로 정의된 모터 제어 디지털 출력 핀(2개의 레고 모터가 있는 4륜 구동):const int controlPin1A =2; // 2번 핀의 L293D 드라이버 입력 1A http://www.ti.com/lit/ds/symlink/l293.pdf Arduino 디지털 출력 핀 2에 연결된 const int controlPin2A =5; // Arduino 디지털 출력 핀 5const int ENablePin =9에 연결된 핀 7번의 L293D 드라이버 입력 2A; // L293D ENable(1,2) 핀 1번은 Arduino 디지털 출력 핀 9에 연결되어 입력됨 // 서보 제어 디지털 출력 핀은 전역 상수로 정의됨(1개의 레고 서보가 있는 서보 스티어링):const int controlPin3A =6; // Arduino 디지털 출력 핀 6에 연결된 10번 핀의 L293D 드라이버 입력 3A const int controlPin4A =8; // Arduino 디지털 출력 핀 8에 연결된 15번 핀의 L293D 드라이버 입력 4A const int servoENablePin =3; // L293D ENable(3,4) 핀 9번이 Arduino 디지털 출력 핀 3에 연결된 입력에 있음 // 모터 제어 전역 변수:int motorSpeed ​​=0; // 모터 속도 0..255int motorDirection =1; // 정방향(1) 또는 역방향(0)// 서보 제어 전역 변수:int steering =0; // 서보 위치 0..255int SteeringDirection =0; // 왼쪽(0) 및 오른쪽(1)void setup() { Serial.begin(9600); // 시리얼 통신 초기화 Serial.setTimeout(1000); // 1000ms 타임아웃 // 디지털 출력 핀 선언:pinMode(controlPin1A, OUTPUT); // 1A pinMode(controlPin2A, OUTPUT); // 2A 핀모드(ENablePin, OUTPUT); // EN1,2 pinMode(controlPin3A, OUTPUT); // 3A 핀모드(controlPin4A, OUTPUT); // 4A 핀모드(servoENablePin, OUTPUT); // EN3,4 digitalWrite(ENablePin, LOW); // 모터 오프 digitalWrite(servoENablePin, LOW); // 조종 중심}void loop() { // 직렬 블루투스에서 다음 명령 가져오기(최종 0에 1바이트 추가) char input[INPUT_SIZE + 1]; // null 종료가 있는 char(C-string) 유형의 배열(https://www.arduino.cc/en/Reference/String) 바이트 크기 =Serial.readBytesUntil('\n', input, INPUT_SIZE); //새 줄이나 버퍼가 가득 차거나 시간이 초과될 때까지 직렬을 읽습니다. // 마지막 0을 추가하여 C-문자열을 종료합니다. input[size] =0; // "RC,RCsteering,RCspeed,\n\0" 형식의 C-문자열인 명령을 읽습니다(개행 문자와 null로 끝남) char* command =strtok(input, ","); // 지금은 명령을 무시합니다(원격 제어용 RC는 당분간 앱에서 보내는 유일한 명령입니다) char* RCsteering =strtok(NULL, ","); // 다음은 Range:-100 (left).. 0 .. 100 (right) char* RCspeed =strtok(NULL, ","); // 다음은 범위에 있는 RCspeed입니다. -100(최대 속도 후진).. 0 .. 100(최대 속도 전진) int iRCsteering =atoi(RCsteering); // 문자열 RCsteering을 정수로 변환 iRCsteering int iRCspeed =atoi(RCspeed); // RCspeed 문자열을 정수 iRCspeed로 변환 // 모터 및 서보 제어 변수 설정 if (iRCsteering> 0) steeringDirection =1; // iRCsteering =1..100이면 우회전합니다. else drivingDirection =0; // iRCsteering =-100..0이라면 좌회전합니다. steering =int(2.55*abs(iRCsteering)); // 명령 0..100에 기반한 서보 위치 0..255 if (iRCspeed> 0) motorDirection =1; // iRCspeed =1..100이면 자동차를 앞으로 설정합니다. else motorDirection =0; // iRCspeed =-100..0이면 자동차를 역방향으로 설정합니다. motorSpeed ​​=int(2.55*abs(iRCspeed)); // 명령 0..100에 따라 속도를 0..255로 설정 SetMotorControl(); // 모터 방향 및 속도 조정 }void SetMotorControl()/*L293 논리:EN1,2 1A 2A HHL 모터가 왼쪽으로 회전(Forward; motorDirection ==1) HLH 모터가 오른쪽으로 회전(Reverse; motorDirection ==0) EN3,4 3A 4A HHL 서보 좌회전(steeringDirection ==0) HLH 서보 우회전(steeringDirection ==1) 모터 속도:EN1,2의 PWM 신호(490Hz, motorSpeed의 경우 디지털 출력 값 0..255)서보 위치:PWM 신호 켜기 EN3,4(490Hz, 위치에 대한 디지털 출력 값 0..255, 0은 직선)*/{ if (motorDirection ==1) //Forward { digitalWrite(controlPin1A, HIGH); digitalWrite(controlPin2A, LOW); } else //역방향 { digitalWrite(controlPin1A, LOW); digitalWrite(controlPin2A, HIGH); } analogWrite(ENablePin, motorSpeed); //속도 if (steeringDirection ==0) //왼쪽 { digitalWrite(controlPin3A, HIGH); digitalWrite(controlPin4A, LOW); } else //오른쪽 { digitalWrite(controlPin3A, LOW); digitalWrite(controlPin4A, HIGH); } analogWrite(servoENablePin, 스티어링); //서보 위치}
    Github Lego-car-Arduino
    소스 코드 Arduino를 포함합니다. 프리징 다이어그램; MIT 앱 발명가에게 업로드하기 위한 소스 코드 안드로이드 앱https://github.com/Notthemarsian/Lego-car-Arduino

    회로도

    Github Lego-car-Arduino
    소스 코드 Arduino를 포함합니다. 프리징 다이어그램; MIT 앱 발명가에게 업로드하기 위한 소스 코드 Android 앱https://github.com/Notthemarsian/Lego-car-Arduino 레고%20rc%20car%20v2.fzz

    제조공정

    1. 양날의 SaaS 검을 장악하십시오
    2. e의 거듭제곱 함수의 도함수
    3. e의 거듭제곱 함수의 도함수
    4. 더 안정적인 송전 부품을 위한 전략
    5. 전기 제어반의 기초
    6. 풍력 발전
    7. 영국 제조업체는 실수를 수정하는 데 250만 파운드 이상을 지출합니다.
    8. 전력 및 HVAC/기후 제어
    9. 프로세스 제어 시스템을 디버그하는 8단계
    10. 웹 처리의 장력 제어 – 주요 구성 요소