회로

다른 쓸모없는 기계를 만드는 방법 : 만들기 쉽고 사용하기가 어렵습니다! : 9 단계 (그림 포함)

다각화되는 요즘 무선 환경의 '3대 트렌드'

다각화되는 요즘 무선 환경의 '3대 트렌드'

차례:

Anonim

이렇게 많은 쓸모없는 기계는 건축되고, 왜 다른 것을 건축 하는가? 간단히 말해서, 그것은 정말로 재미 있습니다 :), 재미있는 놀이와 함께 놀 수 있습니다.
나는이 버전에 특성을 부여하려고 노력했다. 나는 항상 상자 안을 생각하고있는 누군가가 있다는 것을 느꼈다. 그래서 여기에서 노력했다. 나는 "그녀"에게 삶을주는 데 성공했으면한다!
나는 당신이 당신의 건물을 쉽게 만들고 씁쓸하거나 더 나은 성격을 갖게되기를 희망하면서 모든 단계를 당신과 함께 나누게되어 정말 기쁩니다! 내 버전은 Arduino를 기반으로합니다. 과용이라고 생각할 수도 있지만 유연성을 고려할 때 가치가 있다고 생각합니다.
모두 함께 모인 비디오입니다. 나중에 부품, 계단, 회로도 및 코드로 이동합니다.
의견 및 / 또는 질문이있을 경우 알려주십시오.
희망을 즐기세요!
에프.

용품:

1 단계 : 작동 원리

모든 것이 Arduino 보드에 연결되어 있고 보드가 스위치가 로직 HIGH로 설정 될 때까지 대기합니다. 즉, 스위치를 쓸어 넘기면 보드가 두 개의 서보 모터에 특정 방식으로 이동하도록 신호를 보냅니다. , "손"에 연결된 서보는 스위치를 OFF 위치로 가볍게 쓸어 넘기고 다시 "상자"서보가있는 상자로 되돌아갑니다. 모든 것이 반복됩니다.
위의 비디오를 보았을 때, 스위치가 토글 될 때마다 기계는 다른 방식으로 응답합니다. 이것은 Arduino 코드에 다른 타이밍으로 다른 기능을 쓰는 것만으로 이루어집니다 (나는 "Moves"라고 부릅니다). 스위치가 토글 될 때마다 모든 작업이 완료 될 때까지 새로운 작업을 호출합니다. 다시 시작합니다. 9 단계에서 순차 대신 임의의 이동을 선택하는 다른 버전의 코드를 제공했습니다. Arduino에 충분한 메모리가있는 한 원하는만큼의 움직임을 추가 할 수 있습니다.
Arduino가 항상 켜져 있기 때문에, 기계를 사용하지 않을 때 배터리를 절약하기 위해 스위치를 추가했습니다. 난 이미 스위치에서 현재 간단한 HIGH / LOW 감지 대신 인터럽트를 사용하고 슬립 모드와 결합 할 계획입니다. 이것은 기계가 사용되지 않을 때 전력을 절약하고 언제나 준비가 가능하게합니다. (하지만 코드도 복잡해집니다) 이제는 단순한 ON / OFF 스위치 일 뿐이며 보드는 항상 전원이 공급됩니다 .

2 단계 : 부품

필요할 것이예요:
필수 :
1. 상자
2. PWM 출력이있는 모든 Arduino 보드 (이전에는 일주일이 걸렸습니다. Diecimila)
3. 표준 RC 서보 모터 2 대 (저는 Futaba-S3003을 사용했습니다. 3,2 Kg / cm의 토크를 가졌으므로 문이나 손을 움직일 수있을 정도의 힘을 가졌습니다)
4. 6-12 V 배터리 (저는 AR 무인 배터리를 사용했는데, 11.1 v / 1000 mA입니다)
3. 트리거를위한 ​​SPTT 또는 SPST 스위치 (기본적으로 사용자에게 적합한 모든 스위치!)
5. 배터리의 또 다른 스위치
6. 이동 / 코드를 위에서 다시 시작하려는 경우 Arduino를 재설정하는 푸시 버튼.
7. 일부 점퍼 선

선택 과목:
당신이 상자를 움직이는 것을 포함한 움직임을 디자인하고 싶다면 (비디오의 마지막 움직임처럼), 다음을 얻을 수 있습니다 :
1. Arduino 모터 실드는 다른 프로젝트에도 유용합니다 (또는 H- 브릿지를 직접 디자인하여 검색 할 수 있습니다)
2. 값싼 RC 자동차로 DC 모터와 기어 박스를 가져갈 수 있습니다.
또한 "선택 사항"섹션에서 스위치가 켜지거나 꺼질 때 클린 트리거를 갖는 하드웨어 디 바운스 회로를 구축했습니다. 이것은 지연되거나 타이머를 사용하여 arduino 소프트웨어에서 쉽게 건너 뛰고 구현할 수 있습니다. 인터럽트를 사용하도록 코드를 곧 바꿀 것이기 때문에 하드웨어 디 바운싱을했기 때문에 후자는 루틴에서 지연 / 타이머 기능의 신뢰성있는 사용을 허용하지 않기 때문에 향후 사용을 위해 간단한 디 바운스 회로를 구축해야했습니다. . 이 부분을 건너 뛰고 싶다면 arduino의 핀 2에 간단한 스위치 / 저항기를 연결하고 소프트웨어 디 바운스 루틴을 구현하십시오.
하드웨어 디 바운스 :
1. 10mF 전해 콘덴서
2. 10K 저항
3. 논리 NOT 게이트, 즉 인버터 (칩 74HC04) 이것은 6 개의 인버터를 가지고 있지만, 하나만 필요합니다.
그것을 구축하자 …

3 단계 : 상자 만들기

적합한 상자를 사용할 수 있습니다. 나는 광산을 만들었지 만, 완벽하지는 못했지만 여전히 개인적이었다. :)
1. 5mm BALSA 목재 2 장을 사용했는데, 커터를 사용하여 작업하기가 매우 쉽고 가벼운 무게로 비교적 견고했습니다.
2. Cyanoacrylat 접착제 (일명 강한 고속 작동 접착제) 5 튜브 사용
여기있어:
에이 22 x 14 x 14 cm 상자

4 단계 : 회로도

위 그림은 Fritzing을 사용하여 그린 것으로, 다음을 보여줍니다.
상단 부분 : arduino 메인 보드, 2 서보 및 스위치 연결. 앞에서 언급했듯이, 전체 디 바운스 (상단 오른쪽) 회로를 간단한 저항 / 스위치로 대체 할 수 있습니다.
"도어"와 "핸드"서보는 모두 Arduino의 5v 핀에서 직접 구동됩니다. 신호선은 각각 핀 9와 핀 10에 연결됩니다. 이 핀은 PWM을 지원하므로 서보의 각도 / 위치 (최대 0도에서 180도까지)를 제어하는 ​​데 사용합니다.
참고 : 빨간색 푸시 버튼은 재설정 된 것입니다 (arduino 보드의 얼굴과 비슷한). 상자를 열지 않고 언제든지 보드 / 소프트웨어를 다시 설정할 수있는 빠른 액세스 권한을 추가했습니다. RESET 핀을 접지에 연결하기 만하면 리셋됩니다.
하단 부분 : DC 모터를 사용하고 기계를 주변으로 이동하려면 필요합니다. Arduino 모터 실드입니다. Arduino 위에 장착되어있어 두 보드의 모든 핀이 서로 연결되어 있습니다. 나는 명확하게하기 위해 분리되어있는 것처럼 아래에 그들을 보여주고있다, 잘만되면! 이 실드는 믿을 수 없을 정도로 최대 2 개의 DC 모터 (2 채널 A / B)를 제어 할 수 있습니다. 지금 단 하나만 사용하고 있습니다. 사용 가능한 2 채널 / 모터의 코드, 방향, 속도 및 브레이크를 설정할 수 있습니다. 아래 그림과 같이 채널 B를 사용하고 있습니다. 어디 핀
방향은 13, 속도는 핀 11, 브레이크 제어는 핀 8.
배터리는 11.1 / 1000 mA이며 차폐물에 연결되어 DC 모터, 메인 arduino 보드 및 서보 모터에 전원을 공급합니다. 방패를 사용하지 않는다면, 배터리를 메인 arduino 보드의 전원 배럴에 직접 연결할 수 있습니다.

5 단계 : 서보 고정

여기 손과 문 servos가 설치되어 있습니다 :
먼저 올바른 위치에 서보를 설치해야하는데 필요한 움직임을 얻을 때까지 약간의 시행 착오가 필요합니다. arduino IDE에서 제공되는 Servo 예제를 사용하여 각각 필요한 서보 및 처짐량을 테스트 할 수 있으므로 도어 및 핸드 서보의 최종 위치 및 암 길이를 결정할 수 있습니다.
팔은 단순히 발사 나무로 만들어 졌기 때문에, 나는 그들을 찢어지기에 더 두껍게 만들었다.
아래는 내가 어떻게했는지입니다. 손 서보에 관한 단 한 마디. 서보 샤프트가 커버 가장자리 바로 아래에 있어야합니다 (아래 그림 참조). 그러면 스위치를 성공적으로 맞출 수있는 손을 만드는 데 어려움을 피할 수 있으며 상자로 돌아갈 수 있습니다.


6 단계 : 스위치, Servos 및 Arduino 연결

설계도 단계에서 모든 연결을 확인하고 위에 표시된 것과 비슷한 상자 안의 모든 것을 넣으십시오.

7 단계 : 옵션 : DC 모터 및 배터리

위의 그림은 DC 모터 기어 박스 (저렴한 RC 자동차에서 가져온 것)를 넣는 방법이며, 타자와 스위치 배치를 보여줍니다.
박스를 균형있게 배치 할 수 있도록 가능한 한 가운데에 기어를 놓으십시오. 사용 된 배터리가 약간 무거 우며 (100 gr) 약간의 흔들림이 발생하기 때문에 최종 조립 후에 상자의 무게를 상자에 넣어야합니다. 상자를 전환하거나 이동할 때.
직류 모터 속도 핀에 의해 제어된다. 11, 방향 핀으로 13, 및 브레이크 핀에 8, 이것들은 arduino motor shield의 채널 B로 간주됩니다.
어셈블리를 통해 나는 단순한 진짜 상자를 갖기 위해 모든 전선 스위치와 다른 구성 요소를 숨기려고했습니다. 이것은 바퀴에 적용되므로 바퀴와 배터리를 호스트하는 바퀴 주위에 테두리를 만들고 빨간색 재설정 버튼에 대한 액세스도 제공합니다.

8 단계 : 코드

arduino 용 코드를 작성하려면 arduino IDE가 필요합니다 (여기에서 다운로드하십시오)
버전 1.0.5를 사용하고 있습니다. 올바른 COM 포트 (윈도우)를 선택하고 IDE에서 보드 유형을 선택한 다음 아래 코드를 사용하고 업로드하십시오.
참고 : 내가 servos의 최대 처짐을 설정하기 위해 코드에서 사용한 값은이 상자의 servos 위치, 축 및 각도를 고려하여 정확하게 작성되었습니다. 나는 재판을 통해 이것을 얻었다. 그래서 당신은 당신의 상자에 따라 당신 자신의 가치를 고안 할 필요가 있습니다. 서보 배치.
참고로, 각 서보에 사용 된 최소 / 최대 값은 다음과 같습니다. 코드에서 볼 수 있습니다.
문 :
80 숨기기, 155 완전 열림
손:
0 숨기기, 129 스위치 밀기

다음은 코드입니다 (아래에서 복사 / 붙여 넣기 대신이 단계에 첨부 된 파일을 다운로드하는 것이 좋습니다).
#포함
서보 도어 서보;
Servo handServo;
int switch_pin = 2; // 핀 2에 스위치를 설정합니다.
// 모터 변수
int motorThrottle = 11;
int motorDirection = 13;
int motorBrake = 8;
int pos = 0;
int selectedMove = 0; // 이동 ​​선택기
int Testmove = 0; // 테스트 모드 : 선택한 이동 하나만 테스트하도록 숫자를 이동하도록 설정합니다.
// (정상적으로 실행하려면 0으로 설정, 즉 amm 이동시 roundrobbin)
void setup ()
{
Serial.begin (9600);
pinMode (switch_pin, INPUT);
doorServo.attach (9); // 9 번 핀에 문 서보 설정
handServo.attach (10); // 핀 10에 핸드 서보를 놓습니다.
doorServo.write (80); // 숨겨진 위치에 문을 놓습니다.
handServo.write (0); // 숨기기 위치로 손을 놓습니다.

// 채널 B를 설정하십시오 (채널 A는 도어 및 핸드 서보로 예약되어 있으므로 동시에 사용할 수 없습니다)
pinMode (motorDirection, OUTPUT); // 모터 채널 B 핀을 시작합니다.
pinMode (모터 브레이크, 출력); // 브레이크 채널 B 핀을 시작합니다.

}

void loop ()
{
if (Testmove! = 0) {
selectedMove = 테스트 이동;
}

// 스위치가 켜져 있으면 문을 움직여 손을 끕니다.
if (digitalRead (switch_pin) == HIGH)
{

if (selectedMove> 10) {selectedMove = 0; } // 모든 동작이 재생되면 처음부터 동작을 반복합니다
/ / 아래는 모든 "이동"내가 지금까지 설계, 각 코드 아래에 작성된 함수입니다, abit 이상한 이름을 execuse? 일부는 아랍어로 쓰여지 듯이 그렇다.
if (selectedMove == 0) {switchoff (); }
else if (selectedMove == 1) {switchoff (); }
else if (selectedMove == 2) {switchoffbitaraddod (); }
else if (selectedMove == 3) {crazydoor (); }
else if (selectedMove == 4) {crazyslow (); }
else if (selectedMove == 5) {m7anika7anika (); }
else if (selectedMove == 6) {m3alla2 (); }
else if (selectedMove == 7) {switchoff (); }
else if (selectedMove == 8) {matrix (); }
else if (selectedMove == 9) {sneak (); }
else if (selectedMove == 10) {zee7 (); }

if (Testmove == 0) {
selectedMove ++; // 테스트 모드가 아닌 경우 swith to next move
}
}
}

// 움직임 라이브러리
// 기본 동작
void switchoff ()
{
// 움직이는 문
for (pos = 80; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}

// 움직이는 손
for (pos = 0; pos <129; pos = 4)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 손
for (pos = 129; pos> = 0; pos- = 4)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 문
for (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}
}

// 이동 ​​3 : 열어서 대기 한 다음 손을 움직이고 대기 한 다음 전환하고 숨 깁니다.
void switchoffbitaraddod ()
{
// 움직이는 문
for (pos = 80; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}
지연 (800);
// 움직이는 손
for (pos = 0; pos <100; pos = 4)
{
handServo.write (pos);
지연 (15);
}
지연 (1000);
for (pos = 100; pos <129; pos = 4)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 손
for (pos = 129; pos> = 0; pos- = 5)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 문
for (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (pos);
지연 (15);


}

}

// 4로 이동 : 문을 연 다음 여러 번 닫고 기다린 다음 신속하게 스위치를 끄고 숨 깁니다.

void crazydoor ()
{

// 움직이는 문
for (pos = 80; pos <125; pos = 3)
{
doorServo.write (pos);
지연 (15);
}

// 숨어있는 문
for (pos = 125; pos> = 80; pos- = 5)
{
doorServo.write (pos);
지연 (15);
}
// 움직이는 문
for (pos = 80; pos <110; pos = 3)
{
doorServo.write (pos);
지연 (15);
}

// 숨어있는 문
for (pos = 110; pos> = 80; pos- = 15)
{
doorServo.write (pos);
지연 (15);
}
지연 (700);
// 움직이는 문
for (pos = 80; pos <125; pos = 3)
{
doorServo.write (pos);
지연 (15);
}
지연 (700);
// 숨어있는 문
for (pos = 125; pos> = 80; pos- = 5)
{
doorServo.write (pos);
지연 (15);
}

// ---- 중 ---- // 스위치
// 움직이는 문
for (pos = 80; pos <155; pos = 8)
{
doorServo.write (pos);
지연 (15);
}

// 움직이는 손
for (pos = 0; pos <129; pos = 3)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 손
for (pos = 129; pos> = 0; pos- = 3)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 문
for (pos = 155; pos> = 80; pos- = 15)
{
doorServo.write (pos);
지연 (15);
}

}

// 5 단계로 이동 : 문을 연 다음 손을 매우 천천히 앞으로 이동하여 매우 천천히 감추고 빠르게 문을 닫습니다.
void crazyslow ()
{
// 움직이는 문
for (pos = 80; pos <155; pos = 1)
{
doorServo.write (pos);
지연 (30);
}

// 움직이는 손
for (pos = 0; pos <129; pos = 1)
{
handServo.write (pos);
지연 (30);
}

// 숨어있는 손
for (pos = 129; pos> = 0; pos- = 1)
{
handServo.write (pos);
지연 (30);
}

// 숨어있는 문
for (pos = 155; pos> = 125; pos- = 1)
{
doorServo.write (pos);
지연 (30);
}
지연 (100);
for (pos = 125; pos> = 80; pos- = 4)
{
doorServo.write (pos);
지연 (15);
}

}
// 이동 ​​6 :
void m7anika7anika () {
// 움직이는 문
for (pos = 80; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}

// 움직이는 손
for (pos = 0; pos <70; pos = 1)
{
handServo.write (pos);
지연 (15);
}
지연 (800);


// 숨어있는 문
for (pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}

// 숨어있는 문
for (pos = 130; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}
// 숨어있는 문
for (pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}
// 숨어있는 문
for (pos = 130; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}

handServo.write (40);
지연 (1000);

// 움직이는 손
for (pos = 40; pos <129; pos = 4)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 손
for (pos = 129; pos> = 0; pos- = 4)
{
handServo.write (pos);
지연 (15);
}


for (pos = 120; pos> = 80; pos - = 1)
{
doorServo.write (pos);
지연 (15);
}



}
void m3alla2 () {
// 움직이는 문
for (pos = 80; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}

// 움직이는 손
for (pos = 0; pos <127; pos = 4)
{
handServo.write (pos);
지연 (15);
}
// 숨어있는 문
for (pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}
지연 (2000);

for (pos = 130; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}

for (pos = 155; pos> = 140; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}
for (pos = 140; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}
지연 (500);
// 숨어있는 손
for (pos = 127; pos> = 0; pos- = 4)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 문
for (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}
}

void matrix ()
{
// 움직이는 문
for (pos = 80; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}

// 움직이는 손
for (pos = 0; pos <80; pos = 4)
{
handServo.write (pos);
지연 (15);
}

for (pos = 80; pos <129; pos = 1)
{
handServo.write (pos);
지연 (30);
}
지연 (300);

for (pos = 129; pos> = 0; pos- = 4)
{
handServo.write (pos);
지연 (10);
}

// 숨어있는 문
for (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}

}
무효 몰래 ()
{
// 움직이는 문
for (pos = 80; pos <130; pos = 1)
{
doorServo.write (pos);
지연 (30);
}
지연 (2000);

// 움직이는 손
for (pos = 0; pos <40; pos = 1)
{
handServo.write (pos);
지연 (30);
}

지연 (500);

for (pos = 130; pos <155; pos = 4)
{
doorServo.write (pos);
지연 (15);
}
지연 (100);

for (pos = 40; pos <90; pos = 4)
{
handServo.write (pos);
지연 (15);
}
지연 (500);
// 숨어있는 손
for (pos = 90; pos> = 70; pos- = 4)
{
handServo.write (pos);
지연 (15);
}
지연 (100);
for (pos = 70; pos <90; pos = 4)
{
handServo.write (pos);
지연 (15);
}
지연 (100);
for (pos = 90; pos> = 70; pos- = 4)
{
handServo.write (pos);
지연 (15);
}
지연 (100);

for (pos = 70; pos <129; pos = 4)
{
handServo.write (pos);
지연 (15);
}

for (pos = 129; pos> = 0; pos- = 4)
{
handServo.write (pos);
지연 (15);
}
// 숨어있는 문
for (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}
}


void zee7 ()
{
// 움직이는 문
for (pos = 80; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}
지연 (2000);
// 왼쪽으로 1/2 속도 앞으로
digitalWrite (motorDirection, LOW); // 채널 B의 오른쪽 방향을 설정합니다.
digitalWrite (motorBrake, LOW); // B 채널에 대한 브레이크 연결 해제
analogWrite (모터 스로틀, 100); // 모터를 채널 B에서 전속력으로 회전시킵니다.
지연 (300);
digitalWrite (motorBrake, HIGH); // 채널 B의 브레이크를 풉니 다.
지연 (2000);

// 오른쪽으로 후진 @ 반 속도
digitalWrite (motorDirection, HIGH); // 채널 B의 LEFT 방향을 설정합니다.
digitalWrite (motorBrake, LOW); // B 채널에 대한 브레이크 연결 해제
analogWrite (모터 스로틀, 100); // 모터를 채널 B에서 절반 속도로 회전시킵니다.
지연 (300);
digitalWrite (motorBrake, HIGH); // 채널 B의 브레이크를 풉니 다.
지연 (1000);

// 움직이는 손
for (pos = 0; pos <129; pos = 4)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 손
for (pos = 129; pos> = 0; pos- = 4)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 문
for (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}
}


9 단계 : 선택적 업데이트 : 동작 감지

나는 근접 센서를 오늘 (GP2Y0A21) 가지고있어, 사용자가 토글 스위치에 접근하면 기계를 움직일 수있다 :)
이 추가 단계를 위해, 나는 당신이 운동을 허용하기 위해 이미 바퀴를 만들었다 고 가정하고있다. (선택적인 단계 8을 보라). 이제 남은 것은 센서를 추가하고 움직임 감지 코드를 수정하는 것입니다.
센서에는 3 개의 전선이 있으며 노란색 신호선이 3 번 핀 arduino에서 빨간 검은 에 연결되어있다. v5 바닥 보드에 각각.
나는 그림과 같이 센서를 문 아래에 숨겨 놓았다. 따라서 문이 열렸을 때만 사용자의 움직임을 볼 수있다. 정확히 내가 필요한 것!
또한 코드를 약간 변경하여 (여기) 움직임 감지 루틴을 구현했습니다 (코드를 참조하십시오. zee7 () ), 움직임이 감지되었을 때 상자가 처음부터 오른쪽으로 이동 한 다음 왼쪽으로 이동하면 손으로 스위치를 비껴서 숨 깁니다. 코드가 크게 주석 처리되었습니다. 과용하지 않았 으면합니다.
아래에서 업데이트 된 코드를 찾을 수 있습니다. 또한 기계가 무작위로 이동을 선택하도록했음을 유의하십시오.이 설정은 단순히 설정하여 순차적으로 변경할 수 있습니다. 부울 randomize = false;
좋은 제안에 감사드립니다!
코드 (아래에서 복사 / 붙여 넣기 대신이 단계에 첨부 된 파일을 다운로드하는 것이 좋습니다.):
#포함
서보 도어 서보;
Servo handServo;
부호없는 long TimerA, TimerB; // 움직임 감지 루틴을위한 타이머
int switch_pin = 2; // 핀 2에 스위치를 설정합니다.
// 모터 변수
int motorThrottle = 11;
int motorDirection = 13;
int motorBrake = 8;
// 거리 변수
int motionPin = 3; // 아날로그 0의 모션 센서 핀
int lastDist = 0; // 마지막 거리를 기억합니다.
int currentDist = 0;
int thresh = 200; // 움직임의 임계 값 (원하는 움직임 감지 감도를 얻을 수 있도록 설정)

int pos = 0;
int selectedMove = 0; // 이동 ​​선택기
int Testmove = 0; // 테스트 모드 : 선택한 이동 하나만 테스트하도록 숫자를 이동하도록 설정합니다.
// (0으로 설정하면 정상적으로 실행됩니다. 즉, 모든 이동에 라운드 로빈)
부울 randomize = true; // true이면 상자는 무버를 무작위로 처리하고 false로 설정하면 1에서 10까지 순차적으로 이동합니다

void setup ()
{
Serial.begin (9600);
pinMode (switch_pin, INPUT);
doorServo.attach (9); // 9 번 핀에 문 서보 설정
handServo.attach (10); // 핀 10에 핸드 서보를 놓습니다.
doorServo.write (80); // 숨겨진 위치에 문을 놓습니다.
handServo.write (0); // 숨기기 위치로 손을 놓습니다.
// 채널 A는 도어 및 핸드 서보로 예약되어 있으므로 동시에 사용할 수 없습니다.
pinMode (motorDirection, OUTPUT); // 모터 채널 B 핀을 시작합니다.
pinMode (모터 브레이크, 출력); // 브레이크 채널 B 핀을 시작합니다.

}

void loop ()
{
// 스위치가 켜져 있으면 문을 움직여 손을 끕니다.
if (digitalRead (switch_pin) == HIGH)
{

if (Testmove == 0)
{

if (randomize == false)
{
if (selectedMove> 10)
{
selectedMove = 0; // 모든 동작이 재생되면 처음부터 동작을 반복합니다.
}
}
그밖에
{
selectedMove = 무작위 (11);
}
}
그밖에
{
selectedMove = 테스트 이동;
}
Serial.println (selectedMove);
if (selectedMove == 0) {switchoff (); }
else if (selectedMove == 1) {switchoff (); }
else if (selectedMove == 2) {switchoffbitaraddod (); }
else if (selectedMove == 3) {crazydoor (); }
else if (selectedMove == 4) {crazyslow (); }
else if (selectedMove == 5) {m7anika7anika (); }
else if (selectedMove == 6) {m3alla2 (); }
else if (selectedMove == 7) {switchoff (); }
else if (selectedMove == 8) {matrix (); }
else if (selectedMove == 9) {sneak (); }
else if (selectedMove == 10) {zee7 (); }

if (Testmove == 0 && randomize == false) {
selectedMove ++; // 테스트 모드가 아닌 경우 다음 이동으로 전환합니다.
}
}
}
// 움직임 라이브러리
// 기본 동작
void switchoff ()
{
// 움직이는 문
for (pos = 80; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}

// 움직이는 손
for (pos = 0; pos <129; pos = 4)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 손
for (pos = 129; pos> = 0; pos- = 4)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 문
for (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}
}

// 이동 ​​3 : 열어서 대기 한 다음 손을 움직이고 대기 한 다음 전환하고 숨 깁니다.
void switchoffbitaraddod ()
{
// 움직이는 문
for (pos = 80; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}
지연 (800);
// 움직이는 손
for (pos = 0; pos <100; pos = 4)
{
handServo.write (pos);
지연 (15);
}
지연 (1000);
for (pos = 100; pos <129; pos = 4)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 손
for (pos = 129; pos> = 0; pos- = 5)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 문
for (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (pos);
지연 (15);


}

}

// 4로 이동 : 문을 연 다음 여러 번 닫고 기다린 다음 신속하게 스위치를 끄고 숨 깁니다.

void crazydoor ()
{

// 움직이는 문
for (pos = 80; pos <125; pos = 3)
{
doorServo.write (pos);
지연 (15);
}

// 숨어있는 문
for (pos = 125; pos> = 80; pos- = 5)
{
doorServo.write (pos);
지연 (15);
}
// 움직이는 문
for (pos = 80; pos <110; pos = 3)
{
doorServo.write (pos);
지연 (15);
}

// 숨어있는 문
for (pos = 110; pos> = 80; pos- = 15)
{
doorServo.write (pos);
지연 (15);
}
지연 (700);
// 움직이는 문
for (pos = 80; pos <125; pos = 3)
{
doorServo.write (pos);
지연 (15);
}
지연 (700);
// 숨어있는 문
for (pos = 125; pos> = 80; pos- = 5)
{
doorServo.write (pos);
지연 (15);
}

// ---- 중 ---- // 스위치
// 움직이는 문
for (pos = 80; pos <155; pos = 8)
{
doorServo.write (pos);
지연 (15);
}

// 움직이는 손
for (pos = 0; pos <129; pos = 3)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 손
for (pos = 129; pos> = 0; pos- = 3)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 문
for (pos = 155; pos> = 80; pos- = 15)
{
doorServo.write (pos);
지연 (15);
}

}

// 5 단계로 이동 : 문을 연 다음 손을 매우 천천히 앞으로 이동하여 매우 천천히 감추고 빠르게 문을 닫습니다.
void crazyslow ()
{
// 움직이는 문
for (pos = 80; pos <155; pos = 1)
{
doorServo.write (pos);
지연 (30);
}

// 움직이는 손
for (pos = 0; pos <129; pos = 1)
{
handServo.write (pos);
지연 (30);
}

// 숨어있는 손
for (pos = 129; pos> = 0; pos- = 1)
{
handServo.write (pos);
지연 (30);
}

// 숨어있는 문
for (pos = 155; pos> = 125; pos- = 1)
{
doorServo.write (pos);
지연 (30);
}
지연 (100);
for (pos = 125; pos> = 80; pos- = 4)
{
doorServo.write (pos);
지연 (15);
}

}
// 이동 ​​6 :
void m7anika7anika () {
// 움직이는 문
for (pos = 80; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}

// 움직이는 손
for (pos = 0; pos <70; pos = 1)
{
handServo.write (pos);
지연 (15);
}
지연 (800);


// 숨어있는 문
for (pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}

// 숨어있는 문
for (pos = 130; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}
// 숨어있는 문
for (pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}
// 숨어있는 문
for (pos = 130; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}

handServo.write (40);
지연 (1000);

// 움직이는 손
for (pos = 40; pos <129; pos = 4)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 손
for (pos = 129; pos> = 0; pos- = 4)
{
handServo.write (pos);
지연 (15);
}


for (pos = 120; pos> = 80; pos - = 1)
{
doorServo.write (pos);
지연 (15);
}



}
void m3alla2 () {
// 움직이는 문
for (pos = 80; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}

// 움직이는 손
for (pos = 0; pos <127; pos = 4)
{
handServo.write (pos);
지연 (15);
}
// 숨어있는 문
for (pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}
지연 (2000);

for (pos = 130; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}

for (pos = 155; pos> = 140; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}
for (pos = 140; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}
지연 (500);
// 숨어있는 손
for (pos = 127; pos> = 0; pos- = 4)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 문
for (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}
}

void matrix ()
{
// 움직이는 문
for (pos = 80; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}

// 움직이는 손
for (pos = 0; pos <80; pos = 4)
{
handServo.write (pos);
지연 (15);
}

for (pos = 80; pos <129; pos = 1)
{
handServo.write (pos);
지연 (30);
}
지연 (300);

for (pos = 129; pos> = 0; pos- = 4)
{
handServo.write (pos);
지연 (10);
}

// 숨어있는 문
for (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}

}
무효 몰래 ()
{
// 움직이는 문
for (pos = 80; pos <130; pos = 1)
{
doorServo.write (pos);
지연 (30);
}
지연 (2000);

// 움직이는 손
for (pos = 0; pos <40; pos = 1)
{
handServo.write (pos);
지연 (30);
}

지연 (500);

for (pos = 130; pos <155; pos = 4)
{
doorServo.write (pos);
지연 (15);
}
지연 (100);

for (pos = 40; pos <90; pos = 4)
{
handServo.write (pos);
지연 (15);
}
지연 (500);
// 숨어있는 손
for (pos = 90; pos> = 70; pos- = 4)
{
handServo.write (pos);
지연 (15);
}
지연 (100);
for (pos = 70; pos <90; pos = 4)
{
handServo.write (pos);
지연 (15);
}
지연 (100);
for (pos = 90; pos> = 70; pos- = 4)
{
handServo.write (pos);
지연 (15);
}
지연 (100);

for (pos = 70; pos <129; pos = 4)
{
handServo.write (pos);
지연 (15);
}

for (pos = 129; pos> = 0; pos- = 4)
{
handServo.write (pos);
지연 (15);
}
// 숨어있는 문
for (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}
}

//이 움직임은 문을 열고 스위치 근처에서 감지되면 움직임을 기다립니다.
// 상자가 먼저 오른쪽으로 이동 한 다음 왼쪽으로 이동하고 마지막으로 손이 이동하여 스위치를 끕니다.
void zee7 ()
{

//문호 개방
for (pos = 80; pos <155; pos = 3)
{
doorServo.write (pos);
지연 (15);
}
지연 (1200); // 문을 연 후 센서 판독 값을 안정화하기 위해 대기하십시오.

// 타이머를 설정하고 센서를 읽습니다.
// 임계 값을 초과하는 이동을 기다리거나 타이머가 만료되면 (5 초),
lastDist = analogRead (motionPin);
TimerA = millis ();

while (millis () - TimerA <= 5000)
{
currentDist = analogRead (motionPin);

// 현재 거리가 마지막 거리에서 임계 값 이상 벗어 났습니까?
// 그렇다면 상자를 오른쪽으로 이동합니다.
if ((currentDist> lastDist thresh || currentDist <lastDist - thresh) || currentDist> 300)
{
// 왼쪽으로 반 속도를 전달합니다 (속도와 지연을 선택하십시오.
// (상자와 배터리 전압에 따라 지연이 (300) 지연되므로 운동이 바람직 함)
digitalWrite (motorDirection, LOW); // 채널 A의 오른쪽 방향을 설정합니다.
digitalWrite (motorBrake, LOW); // B 채널에 대한 브레이크 연결 해제
analogWrite (모터 스로틀, 100); // 모터를 채널 B에서 전속력으로 회전시킵니다.
지연 (300);
digitalWrite (motorBrake, HIGH); // 채널 B의 브레이크를 풉니 다.
단절;
}
lastDist = currentDist;
}

// 타이머를 설정하고 센서를 읽습니다.
// 임계 값을 초과하는 이동을 기다리거나 타이머가 만료되면 (5 초),
지연 (1200); // 문을 연 후 센서 판독 값을 안정화하기 위해 대기하십시오.
lastDist = analogRead (motionPin);
TimerB = millis ();
while (millis () - TimerB <= 5000)
{
currentDist = analogRead (motionPin);
// 상자가 이미 오른쪽으로 이동 했습니까? 현재 거리가 마지막 거리에서 임계 값 이상 벗어 났습니까?
// 그렇다면 왼쪽으로 이동합니다.
if ((currentDist> lastDist thresh || currentDist <lastDist - thresh) || currentDist> 300)
{
// 역방향으로 반 속도 @ 오른쪽으로 속도와 지연을 선택하십시오.
// (상자와 배터리 전압에 따라 지연이 (300) 지연되므로 운동이 바람직 함)
digitalWrite (motorDirection, HIGH); // 채널 B의 LEFT 방향을 설정합니다.
digitalWrite (motorBrake, LOW); // B 채널에 대한 브레이크 연결 해제
analogWrite (모터 스로틀, 100); // 모터를 채널 B에서 절반 속도로 회전시킵니다.
지연 (300);
digitalWrite (motorBrake, HIGH); // 채널 B의 브레이크를 풉니 다.
단절;
}

lastDist = currentDist;

}
지연 (100);
// 움직이는 손
for (pos = 0; pos <130; pos = 4)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 손
for (pos = 130; pos> = 0; pos- = 4)
{
handServo.write (pos);
지연 (15);
}

// 숨어있는 문
for (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (pos);
지연 (15);
}
}

3 명의 사람들이이 프로젝트를 만들었습니다!

  • AndyC159가 만들었습니다!

  • SamL84가 그것을 만들었습니다!

  • melton1313이 (가) 만들었습니다!

이 프로젝트를 만들었습니까? 그것을 우리와 공유하십시오!

권장 사항

  • 스크류 분류 기계

  • PCB BOT (라인 팔로우, 장애물 회피 및 단일 PCB 내의 블루투스 제어 로봇)

  • 인터넷 클래스 클래스

  • 무지개 경연 대회의 색상

  • 팸플릿

  • 파티 챌린지

194 토론

0

areyoutrying

4 년 전 소개

고마워! 나는이 instructable : 쓸모없는 드래곤을 기반으로 첫 번째 Arduino 프로젝트를 만들었습니다!

4 답글 0

아얀areyoutrying

대답 3 년 전

당신의 드래곤 기계는 굉장합니다. !!! 예술적

0

TJAOkevinareyoutrying

대답 3 년 전

굉장한 !!!!!

0

리아 치areyoutrying

4 년 전 소개

너는 끝내 준다 :) !!!

드래곤을위한 위대한 인격! 드래곤이 직접 카메라를 바라 보면서 (다시보기) 비디오를 다시 할 수 있으면 좋겠다. 나는 이것이 들썩 들썩 할 것 같아서 몰래 빠져 나온다.

내 동영상을 공유해 주셔서 감사 드리며 내 도움이되었습니다.

0

areyoutrying리아 치

4 년 전 소개

나는 초기 단계에서 톱뷰를 보았지만 작동하지 않았다. (지저분한 내부를 너무 많이 보았다) 나는이 비디오를 찍었을 때 그것을 해산했다. 나는 네가 옳다고 생각한다. 마지막 단계에서 멋져 보였을 것이다! 불행하게도 나는 이미 용을 멀리 줬다. .. 다음 프로젝트에!

0

br1pro

4 년 전

아주 재미! 서보를 고치고 손을 디자인하는 일. 이 instructable 주셔서 감사합니다!

답글 1 개 0

리아 치br1pro

4 년 전 소개

위대한 일하는 사람! 정말 좋은 :) 어떤 동영상?

0

클린 콜린

5 년전

먼저 비디오를 보시고 웃어주세요.

답글 1 개 0

토바 야스 V클린 콜린

4 년 전 소개

나는 내가 그랬다라는 것을 알고있다! :디

0

리얼리

5 년전

비디오를 멋지게 만들었습니다. 마치 자신 만의 마음을 가진 것처럼 보입니다.

0

Elitekilla117

5 년 전 소개

Arduino와 riachis 코드가있는 쓸데없는 기계! Dr.who의 tardis로 만들어졌습니다. :)
http://www.youtube.com/watch?v=aDs0T52o6-M

2 답글 0

리아 치Elitekilla117

5 년 전 소개

그것을 사랑해 !!!! :) 정말 잘 한 남자, 너의 폭탄 박스를보고 행복해! 나 또한 각색과 음악 : P는 내가 할 수있는 3 작은 수정을 제안하는 자신을 막을 수 없어 :)?
- 기계를 서있는 위치에 두는 것은 좋을 것입니다. 문을 닫을 때 중력의 도움을 잃을 것입니다.하지만 간단한 해결책은 문 안쪽에 2 개의 고무줄을 붙이는 것입니다. 다른 쪽 끝에있는 박스의 안쪽면에 문 서보가 닫힐 때 문을 닫을 것입니다. 내 빌드 단계를 확인하면 6 단계에서 고무 밴드가 보입니다 …
- 손을 검은 색으로 칠하면 어떨까요?
! 또한 손끝은 피 묻은 붉은 색으로 칠해 지거나 미친 얼굴이나 그와 비슷한 것으로 꾸며질 수 있습니다.
- 아무 것도 일어나지 않을 때 마지막 움직임을 제거하고 (상자를 움직이는 것으로 가정) 자신의 움직임을 …
그럼에도 불구하고, 제안을 잊어 버려, 나는 당신의 machineeee을 사랑해! 감사합니다. 감사합니다. 감사합니다. 감사합니다. 감사합니다. 감사합니다.
희망 gf가 그것을 좋아했다!

0

Elitekilla117리아 치

5 년 전 소개

하하 칭찬 해줘서 고마워요. 사실 더 많은 것을하고 싶었지만 시간의 위기 때문에 제가 원했던 많은 세부 사항에 적합하지 않았습니다. 나는 팔에 약간의 색을 더하고 싶지만 시간이 없다. 그리고 나는 그 날카로운 자로 팔에 얼굴을 그리기를 원했지만 이미 싸서 크리스마스에 그녀에게 줄 준비가되어 있습니다. Hehehe. 그녀가 좋아할 것 같아. 나는 또한 그것을 서기를 원했지만 고무 밴드가 서보에 너무 많은 무게를 넣을 까봐 두려웠다. 문은 이미 꽤 무거워. 내가 당신을 계속 서스펜스로 빠져 나오기를 기다렸기 때문에 내가 마지막으로 한 행동. 하하하지만 모든 도움을 주셔서 감사합니다! 확실히 그만한 가치가있어!

0

뻐꾸기

5 년전

이건 내가 만들어야 만 해.

0

wrs715

5 년 전 소개

이것은 내가 생각했던 Arduino를 사용하여 본 첫 번째 프로젝트입니다. "그래, 그만한 가치가있어. 이제는 하나 가져와야 해." 환상적인 직업!

0

실리콘 호스트

5 년 전 소개

와우, 굉장한 공통의 프로젝트에 참여하십시오! 더 재미있는 당신의 회전 급강하를 사랑하십시오!

0

bob3030

5 년전

한 사람의 쓸모없는 장치는 다른 세상에서 완전히 굉장합니다. 우리는 생각하고, 즐겁게 지내며, 쓸모없는 많은 장치를 탐 내게되었습니다. 프로젝트를 업데이트 해 주셔서 감사합니다. 게시 해 주셔서 감사합니다.

0

워 블러

5 년 전 소개

사상 1 : Arduino를 사용하는 것은 어리석은 잔인한 행위입니다.
생각 2 : 비디오를 본 후 - Arduino를 사용하는 것은 순수한 천재입니다!
나는 당신의 창의력에 굴복한다!

0

뜸부기

5 년 전 소개

그게 정말 대단해! 종류의 벽 - E 성격을 생각 나게합니다. 그런 훌륭한 프로젝트에 감사드립니다!

0

기정 사실

5 년 전 소개

정말 쓸모 없어! 니스. 나는 영감을 얻었고 책상에 하나씩 지을 필요가있다. 감사.