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

토킹 포탈 2 터렛 건

구성품 및 소모품

Arduino Nano R3
× 1

필요한 도구 및 기계

3D 프린터(일반)

이 프로젝트 정보

이야기

이번 크리스마스에 저는 Portal 2 게임에서 작동하는 Portal 포탑 건을 설계하고 제작하기로 결정했습니다. . 저에게 이것은 무엇이든 만들기 전에 먼저 Fusion 360에서 전체 어셈블리를 적절하게 모델링하는 연습이었습니다. 이 디자인은 MP3 플레이어 칩, 거리 센서, 서보, LED 및 3D 인쇄 부품인 Arduino Nano를 사용합니다.

여기서 목표는 게임에서 나오는 음성과 발사를 시뮬레이션하는 LED를 사용하여 3개의 "축"으로 움직이는 것이었습니다.

<울>
  • 앞에 누군가를 감지하면 "날개"를 엽니다. 슬라이더가 있는 크랭크 메커니즘을 사용하십시오.
  • <울>
  • 개봉 후에도 사람이 남아 있으면 떨어질 때까지 발사하십시오. LED와 기관총 소리.
  • <울>
  • 사람이 더 이상 거기에 없으면 스캔 검색 루틴을 실행합니다.
  • <울>
  • 닫고 다른 사람이 올 때까지 잠을 자요.
  • <울>
  • 포탈 터렛 사운드와 게임의 음성을 사용합니다.
  • 나는 디자인에 약간의 자유를 주어 게임에서 본 것과 눈에 띄게 동일하지만 기능적이고 인쇄할 수 있도록 만들려고 노력했습니다. 온라인에서 찾은 몇 가지 기본 스케치로 모델링과 계획을 시작했습니다...

    소리는 microSD 카드에 저장되며 뒷면에서 접근할 수 있으므로 나중에 소리를 업데이트하거나 변경할 수 있습니다. 검은색 채우기 스트립과 일렬로 되어 있어 한 번 설치하면 본질적으로 보이지 않습니다. 이 고라운드에 사용된 18개의 개별 표현과 소리.

    라이더 센서(time-of-flight)는 직사각형 프로파일의 칩에 있습니다. 이 센서는 일단 조립되면 전면에서 거의 보이지 않습니다.

    1단계:Fusion 360 모델링

    디자인은 온라인에서 찾은 스케치에서 시작되었습니다. 이 이미지를 캔버스로 사용하여 3가지 뷰의 윤곽을 스케치하기 시작했습니다. 그런 다음 그것들을 3D로 밀어낸 다음 일반적인 모양을 껍질을 벗기고 자르는 문제였습니다. 모든 전자 제품은 내가 생각하기에 적절하다고 생각되는 곳에 삽입 및 배치되는 구성 요소로 Fusion에서 제작되었습니다. 운전 매개변수:

    <울>
  • Arduino Nano는 완전히 조립된 후 업데이트를 위해 액세스할 수 있는 커넥터가 있어야 했습니다.
  • <울>
  • MicroSD 카드는 동일한 방식으로 액세스할 수 있어야 하며 일단 설치되면 이상적으로는 보이지 않아야 합니다.
  • <울>
  • Time-of-Flight 센서도 보이지 않아야 합니다.
  • <울>
  • 후면 전원용 2.1mm 전기 커넥터
  • <울>
  • 인쇄된 부분은 최대한 크게 합니다(작은 부분이 많지 않음)
  • <울>
  • 지지대 없이 인쇄
  • 기본 모양에 구성 요소(Nano, 기타 칩, 서보)를 추가한 후 필요에 따라 이동 및 배치하고 쉘 내부에서 이를 지지할 수 있는 지지 구조를 구축했습니다.

    날개 개방 메커니즘은 크랭크 및 슬라이드 메커니즘이었습니다. 왜요? 크랭크 기구를 사용하고 싶었기 때문에! 이것은 몇 가지 합병증을 추가했지만 이점도 있었습니다. 형상이 결정되면 작동 반복성이 보장되고 최소 및 최대 한계가 거의 보장됩니다.

    전체 모델이 제작되고 작동하고 제작(인쇄) 및 조립할 수 있다는 확신이 들었을 때 저는 계속해서 부품을 인쇄하고 프로토타입을 제작했습니다. 문제가 해결되면 모델로 돌아가 외관과 조립성을 개선하기 위해 약간의 조정을 했습니다(단어인가요?). 이러한 변화의 결과물이 바로 이 모델입니다.

    이것은 상자 모양이 많지 않기 때문에 꽤 부담이 되었고, 한 번 모이면 조정할 수 있는 실제 액세스가 없이 꽤 단단히 닫힙니다. 저는 이 프로젝트에서 다른 구성 요소에 포함된 구성 요소를 사용하는 것과 같이 꽤 많은 것을 배웠습니다. 이것은 빠른 액세스를 위해 연결된 하위 어셈블리를 조작하고 유지하도록 했습니다. 결국 노력할 가치가 있었습니다!

    2단계:3D 인쇄 부품

    포털 포탑 v4.zip이 업데이트되었으며 최신 포탑을 만드는 데 필요한 모든 인쇄 부품이 포함되어야 합니다.

    --- 새로운 "후면 테스트 다리". 원본과 일치하지 않지만 뒷면에 있으며 직선형 미니 USB 커넥터를 똑바로 사용할 수 있습니다. ---

    이것은 모든 부품에 PLA를 사용하여 Prusa Mk2에 인쇄되었습니다. 인쇄 방향이 매우 분명해야 합니다. 본체는 지지대가 없는 수직 위치로 인쇄되었습니다. 연결해야 할 측면에 큰 간격이 있지만 범프를 제외하고 꽤 표준적인 설정에서는 큰 문제가 없었습니다. 좋은 필라멘트와 몇 가지 좋은 인쇄 설정으로 전면과 후면의 범프를 사실상 제거할 수 있습니다. 나는 0.2mm가 슬라이서에서 잘 작동하고 괜찮은 결과를 산출한다는 것을 발견했습니다. 더 크고 구멍이 채우기 스트립 근처의 몸체에 나타나기 시작했습니다.

    채널과 돌출부의 디자인은 45도 챔퍼로 이루어지므로 "공간에 매달리는" 요소가 최소화됩니다.

    조립품을 조립하기 위해 할 일이 거의 없었습니다. 채널로 미끄러지는 충전 스트립은 이제 폭이 줄어들고 두께가 일정하게 되어 매우 간단해졌습니다. 이 인쇄된 조각(가장자리에 인쇄됨)을 사용하는 대신 스트립으로 절단된 얇고 검은색 재료를 사용할 수 있다고 생각합니다.

    기교가 필요한 한 영역은 피치 프레임의 슬라이더 핀입니다. 1/8" 드릴 비트와 약간의 윤활유로 쫓는 보어 구멍의 직선 핀(못)이 오래갑니다.

    렌즈%2Bv3b.stl 바디-RHS%2Bv4.stl Body-LHS%2Bw%2Bcomponents%2Bv4.stl 날개%2BRH%2Bbottom%2Bv4.stl 날개%2BRH%2Btop%2Bv4.stl 날개%2BLH%2Bbottom%2Bv4.stl 날개%2BLH%2Btop%2Bv4.stl 피치%2BFrame%2Bv4.stl 다리%2B-%2BREAR%2Bv4.stl 채우기%2Bstrips%2Bv3.stl 다리%2B-%2BREAR%2Btest.stl 피치%2BFrame%2B-%2Bmodified%2B1.stl 날개%2Bv6.zip Arduino%2BBase%2Bw%2BRadio.stl Portal%2BTurret%2Bv4.zip

    3단계:구성요소

    V4(빨간 포탑)는 브리징이 작아 v4 날개와 피치 프레임이 필요합니다.

    v6 날개 있다 옵션 허용 다르다 색상 "총". 나는 개인적으로 이와 같은 것을 만들지 않았지만 잘 작동해야합니다.

    모델이 완성되고 프로토타입이 만족스러워서 그림과 같이 플라스틱 구성 요소로 rev 2를 인쇄했습니다. 여기에 있는 모든 것은 검정색과 디자인 색상(이 경우 파란색)이 포함된 PLA이며 중앙 "렌즈" 또는 레이저 눈을 위한 약간의 반투명 PLA입니다.

    이 사진은 배선을 제외하고 구성 요소를 꽤 잘 포착합니다.

    4단계:전자 제품

    빌드는 다음 구성 요소를 사용합니다.

    <울>
  • 아두이노 나노(1)
  • <울>
  • DFPlayer 미니 MP3 플레이어(또는 MP3-TF-16P)(1)
  • <울>
  • VL53L0X ToF 범위 센서(1)
  • <울>
  • 일반 SG90 마이크로 서보(3)
  • <울>
  • 5mm 빨간색 LED(5개)
  • <울>
  • LED용 220옴 저항(5)
  • <울>
  • 1kOhm 저항(1)
  • <울>
  • 4cm 스피커, 4옴, 3와트(1)
  • <울>
  • 2.1mm 전원 커넥터(1)
  • <울>
  • 3" 긴 프레임 못(4개)
  • <울>
  • M2 x 6 나사(8개)
  • <울>
  • M2.5 x 8 나사(2)
  • <울>
  • M3 x 8 나사(4개)
  • <울>
  • M3 x 12 나사(4개)
  • <울>
  • M3 x 16 나사(2개)
  • <울>
  • 수축 랩
  • <울>
  • 작은 타이 랩
  • 모든 구성 요소는 Arduino, Amazon 또는 Banggood 및 기타 소스에서 쉽게 구할 수 있습니다.

    나사는 구색 키트에서 조달했습니다. 그렇지 않으면 그들을 얻는 것이 엉덩이가 아프다...

    5단계:기계 조립

    기계적 조립의 대부분은 합리적입니다. 인쇄된 부품은 필요에 따라 탭핑된 더 큰 구멍으로 인쇄되므로 최종 조립 전에 나사로 빠르게 추격하면 도움이 되고 나사로 조인 구성 요소의 조립이 매우 쉬워집니다.

    Arduino와 MP3 칩은 하드웨어 없이 크래들에 끼워집니다. VL53LOX는 패스너 없이 전면 쉘에 끼워집니다. 먼저 시험적합한 후 배선을 제거하고 설치하십시오.

    슬라이더 어셈블리는 4개의 프레임 못을 슬라이더 레일로 사용합니다. 지름이 약 1/8"이고 머리가 잘린 상태입니다. 이것은 전기 프레임 못을 사용하는 DeWalt 프레임 못 조각에서 가져왔습니다. 말할 필요도 없이 매끄러운 못은 필수입니다.

    서보는 그림과 같이 장착됩니다. 방향이 중요합니다. 피치 및 피벗 서보는 조각으로 설치할 때 "중앙"에 있습니다. 크랭크는 열린 위치에 있을 때 정면에서 볼 때 반시계 방향으로 회전하여 닫히도록 설치됩니다. 열린 위치는 로드와 크랭크가 일직선으로 일직선이 되도록 하고 잠길 때까지 10도 더 회전합니다.

    다리 조립이 가장 쉬운 부분입니다. 2-2.5mm 나사, 각 다리의 팔꿈치 위로 다리 캡이 스냅됩니다. 레그 플레이트의 상단 위로 돌출되지 않는 것보다 패스너를 사용하십시오. 그렇게 하면 회전 범위를 조정해도 회전하는 몸체가 바인딩되지 않습니다.

    인쇄된 부품에 대한 모든 서보 연결은 서보와 함께 제공되는 짧은 흰색 크랭크를 사용하여 이루어집니다. 이 크랭크는 인쇄된 부품을 누르기만 하면 됩니다. 각 서보에 연결된 부품에 스플라인 구멍을 인쇄하려고 시도했지만 제한적이고 반복 가능한 성공을 거두었습니다. 서보와 함께 제공되는 크랭크를 사용하면 훨씬 쉽습니다.

    크랭크 어셈블리는 더 긴 2.5mm 나사를 사용합니다. 크랭크 로드는 크랭크 하프 사이에 끼어서는 안 됩니다. 실제로 Crank2 부품 없이 더 짧은 나사를 사용해 볼 수 있습니다. 그것도 잘 작동해야 합니다(날개가 자유롭게 미끄러지면 감지할 수 있는 토크가 없을 것입니다).

    스피커는 스피커를 캡처하는 서보 마운트(2개)로 캡처됩니다. 이 "다리" 사이에 스피커를 설치하고 피치 서보에 고정하여 제자리에 고정합니다. 그런 다음 이 서보를 피치(슬라이더) 어셈블리에 연결하고 로드가 있는 크랭크 어셈블리에 연결합니다. 이 모든 것이 조립되기 전에 4개의 작은 나사로 LHS 본체에 설치됩니다.

    아두이노와 MP3 플레이어를 임시 위치에 놓고 메인 내장을 설치하면 재미가 시작됩니다 - 배선!

    6단계:배선

    V5 - 라디오 옵션(빨간색 포탑 사진). 여기에는 nRF24L01 무선 칩이 포함됩니다. 모든 연결을 수용하도록 Arduino 핀 배선을 완전히 변경합니다. 자세한 내용은...

    최종 포장은 빡빡하므로 여기에서 와이어 길이를 파악하는 데 시간을 할애하는 것이 좋습니다. 내가 결국에는 대부분의 상호 연결 전선이 3" - 4" 사이였습니다.

    LED는 220옴 저항으로 직접 배선된 다음 테스트를 거친 후 약간의 수축 랩과 약간의 배선 꼬임이 뒤따릅니다. 여기에서 약간의 배선(CAT5 유형 통신 배선)이 있고 눈에 보이는 배선이 눈에 띄지 않도록 하기 위해 여기에서 라이트 게이지 배선을 사용했습니다.

    기계식 비트는 쉘에 모의 맞춤된 다음 와이어 라우팅을 파악한 다음 와이어를 절단하고 준비합니다.

    나는 내가 뭔가를 엉망으로 만들고 기어를 벗긴 경우 서보를 연결하고 교체할 수 있도록 서보 커넥터를 만들었습니다. 이것은 내 첫 프로토타입에서 엉망이 된 후에 확실히 도움이 되었습니다.

    일단 대부분의 배선에 만족하면 LED가 마지막에 납땜되었습니다. 그런 다음 유선 어셈블리를 쉘의 절반에 조심스럽게 채울 때입니다. 마지막 단계는 전원 커넥터가 모두 내부에 삽입되면 전원 와이어에 납땜하는 것입니다.

    -- 중요 참고 사항:Nano 뒤에 채워진 배선이 재설정 버튼을 누르지 않도록 하십시오!! 이것은 분명히 문제를 일으키고 장치가 제대로 작동하지 못하게 합니다. --

    이 시점에서 모든 배선이 완료되지만 최종 조립 전에 Nano에 코드를 업로드하고 전원을 켜서 LED, 서보 및 MP3 플레이어가 모두 설계된 대로 작동하는지 확인하는 것이 중요합니다. 그런 다음 나머지 기계 부품을 함께 조립할 차례입니다.

    7단계:Arduino 코드

    업데이트된 코드! 정리하고 약간의 수정을 했습니다.

    첨부된 파일은 영상과 같이 기기를 구동하기 위해 제가 생각해낸 파일입니다. 터렛의 특성과 작동 방식을 변경하기 위해 계속 수정하겠습니다. 다양한 옵션이 있습니다.

    필요에 따라 호출하는 서브루틴을 사용하여 코드를 구성했습니다. 본체를 깨끗하게 유지시켜주고 여러가지 특성을 가지고 놀때 꽤 도움이 되었습니다. 다양한 동작에 대한 코드를 조작하는 데 도움이 되었습니다.

    또한 예를 들어 주차 위치와 최소 및 최대 범위를 조정하고 조정하는 데 도움이 되는 많은 변수를 미리 사용했습니다.

    내 코드에서 DFMiniMP3 라이브러리를 사용했습니다. DFRobot과 같은 다른 라이브러리를 시도했지만 문제가 있어서 이 라이브러리로 돌아갔습니다. 그것은 내가 기능을 유지하기 위해 '정적 공허' 조각을 유지해야 한다는 것을 의미했습니다. 이것들은 작업에 필요하지 않지만 저는 마스터 코더가 아닙니다. VL53LOX 라이브러리만큼 간단하고 깔끔한 또 다른 라이브러리에 대해 듣고 싶습니다. 더 나은 방법을 찾으면 알려주세요!

    사운드의 경우 SD 카드에 "mp3"라는 이름의 폴더가 있고 파일 이름이 0001.mp3, 0002.mp3 등입니다. 처음 4자리는 이 형식이어야 합니다. 그러나 특정 소리를 식별하는 데 도움이 되도록 그 뒤에 임의의 접미사를 추가할 수 있습니다. 예는 https://www.dfrobot.com/blog-277.html을 참조하십시오. 폴더에 사용된 내 파일 이름의 사진을 포함했습니다. 번호는 코드의 콜아웃에 해당합니다.

    Portal Turret 소리의 Wikipedia 페이지에서 가져온 사운드 파일입니다. 코드는 임의의 사운드 파일(2개 중 1개 또는 3개 사운드)을 촬영하여 오래되지 않도록 합니다.

    8단계:최종 본체 조립

    이 부분은 검은색 채우기 스트립 때문에 약간 까다롭습니다. 최종 어셈블리의 규모는 스트립과 수용 홈이 작을 정도로 충분히 작습니다. 이 때문에 다른 쪽을 끼우려고 하기 전에 스트립이 저항을 거의 받지 않고 맞는지 확인하기 위해 포인터나 기타 작은 긁는 도구로 채널을 추적해야 했습니다.

    전선을 깔끔하게 묶고 필요에 따라 묶으면 훨씬 더 쉬워집니다.

    나는 지금 이들 중 몇 개를 함께 넣었고 두 개의 반쪽을 먼저 합친 다음 채우기 스트립을 삽입하는 것이 더 쉽다는 것을 알게 되었습니다. 인필 스트립이 빠지지 않도록 하는 "선반"으로 한쪽 면을 반으로 삽입한 다음 살짝 들어 올려 살짝 눌러 넣습니다. 이제 나쁘지 않습니다.

    이것은 까다로운 부분 중 하나였습니다. 언젠가는 이 어셈블리에 대해 다시 생각하게 될 것입니다. 하지만 완성되었을 때 모양이 마음에 들고 상당히 견고합니다.

    9단계:날개 어셈블리

    날개 LED가 튀어나온 상태로 몸체가 조립되었으니 날개를 준비하고 조립할 차례입니다.

    슬라이더 구멍은 1/8" 드릴 비트로 쫓은 다음 청소해야 합니다. 볼트 커터, 바이스 그립, 쇠톱 또는 좋아하는 못 절단 도구를 사용하여 못에서 머리를 잘라냅니다. 슬라이더 핀(잘린 못 )을 각 날개 조각에 압입하여 날개에 설치합니다. 곧고 버가 제거되고 매끄러운 못이 이 작업을 만드는 열쇠입니다. 날개 슬라이더와 구멍은 윤활유를 바르고 크랭크 로드를 연결하고 작동하기 전에 테스트해야 합니다. 흑연 또는 기타 PLA에 적합한 윤활유를 권장합니다. 개인 윤활유의 작은 튜브가 정말 잘 작동하고 저렴하다는 것을 알았습니다. 정말 매끄럽습니다. 또한 파트너나 부모가 와서 정확히 무엇을 물어볼 때 약간의 '스플레인'이 필요합니다 작업대에서 필요합니다!!

    먼저 날개 부분이 어디로 가는지 파악하고 해당 부분을 먼저 슬라이드해 봅니다. 그런 다음 핀이 설치되면 상단과 하단 절반을 함께 맞추고 약간의 윤활유를 바르고(Q-팁이 잘 작동함) 날개가 잘 미끄러지는지 확인합니다. 이것은 까다로울 수 있지만 바인딩 없이 날개가 쉽게 미끄러지는지 확인하지 않으면 실망스러운 시간을 보낼 수 있습니다. 날 믿어...

    날개가 제대로 작동하면 날개를 제자리에 밀어 넣고 날개의 구멍 위에 커넥팅 로드를 놓고 나사 하나로 조립하기만 하면 됩니다. 그런 다음 LED가 총 구멍에 삽입되고 와이어가 날개에 고정되어 사용할 준비가 된 것입니다! 모든 것이 테스트되면 뜨거운 접착제를 사용하여 제자리에 고정할 수도 있습니다.

    10단계:친구들을 놀라게 하고 충격을 주세요!!

    이 디자인에서 마지막으로 주의할 점은 각진 플러그가 회전할 때 뒷다리를 방해하지 않기 때문에 좋은 아이디어라는 것입니다. 수정된 뒷다리(v3)는 약간의 공간을 제공하기 위해 늘었습니다.

    일단 구축되고 연결되면(5V 또는 Nano에 적합), 프로그래밍된 거리 내에서 누군가가 감지될 때까지 조용히 앉아 있다가 다시 살아나 그 영역에 들어오는 모든 사람을 죽입니다!!

    하나(또는 그 이상)를 구축하고 새로운 기능이나 개념이 떠오르면 알려주세요!

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

    코드

    <울>
  • 무전기(RED)가 포함된 포털 포탑
  • 포탈 터렛 w 라디오(RED)C/C++
    포탑에 사용되는 코드입니다. 여기에는 다른 페이지에 있는 마스터 터렛 컨트롤로 제어할 수 있는 코드가 포함됩니다.
    다양한 맛에는 조정이 필요합니다.
    ///* Portal Turret - 옵션 및 라디오!! * 크리스 노왁 - 2019년 2월 * https://www.instructables.com/member/ChrisN219/ * https://create.arduino.cc/projecthub/Novachris/talking-portal-2-turret-gun-637bf3 * * 이것은 이 코드에는 MTC(Maseter Turret Control)로 제어되는 Cara Mia Opera, * 채팅 시간 및 수동 모드를 수행하는 데 필요한 모든 기능이 포함되어 있습니다. * MTC는 다른 빌드에 포함된 별도의 컨트롤러입니다. 터렛 *은 MTC 없이 이 코드를 사용하여 자율적으로 작동합니다. * * 코드는 3개의 포탑과 함께 작동하도록 제작되었지만 각각은 독립적으로 작동합니다. * 많은 디버깅 코드가 남아 있습니다. 원하는 대로 사용하거나 정리합니다. 대부분 디버깅되지만 * 완벽하지는 않습니다. 당신이 지불한 가격을 감안할 때, 나는 그것이 괜찮다고 생각합니다!;) * ================================================================================================ #include #include "Arduino.h#include #include #include #include #include # include class Mp3Notify{public:static void OnError(uint8_t errorCode) { // Serial.println()을 의미하는 코드는 DfMp3_Error를 참조하십시오. Serial.print("통신 오류 "); Serial.println(오류 코드); } 정적 무효 OnPlayFinished(uint8_t globalTrack) { Serial.println(); Serial.print("#의 재생이 완료되었습니다."); Serial.println(글로벌트랙); } 정적 무효 OnCardOnline(uint8_t 코드) { Serial.println(); Serial.print("카드 온라인 "); Serial.println(코드); } 정적 무효 OnCardInserted(uint8_t 코드) { Serial.println(); Serial.print("카드 삽입"); Serial.println(코드); } 정적 무효 OnCardRemoved(uint8_t 코드) { Serial.println(); Serial.print("카드 제거"); Serial.println(코드); }}; Servo servo_pivot;Servo servo_wings;Servo servo_pitch;VL53L0X sensor;// soundcardSoftwareSerial secondarySerial(4, 2) 설정; // RX, TXDFMiniMp3 mp3(secondarySerial);// radioRF24 설정 radio(10, 9); // nRF24L01 (CE,CSN)RF24네트워크 네트워크(무선); // 네트워크에 라디오 포함 const uint64_t this_node =01; // 이 포탑 - 빨간색 - 8진수 형식( 04,031 등)const uint64_t WHT =02; // 포탑 02 - Whiteconst uint64_t BLU =03; // 포탑 03 - Blueconst uint64_t MTC =00; // 마스터 터렛 제어 unsigned long previousMillis1 =0;unsigned long previousMillis2 =0;unsigned long previousMillis3 =0;byte LED_LH_up =A1;byte LED_LH_down =A2;byte LED_CENTRE =A3;byte LED_RH_up =7;byte LED_RH_down =8; 6; //화이트바이트 윙스 =3; //옐로바이트 PITCH =5; //블루바이트 파크PIVOT =96; //톱바이트에서 볼 때 더 작은 수는 CW로 회전합니다. posPIVOT =96;byte maxPIVOT =116;byte minPIVOT =76;byte WINGclose =165;byte WINGopen =10;byte WINGpos =160;byte parkPITCH =86;byte posPITCH =86; 바이트 maxPITCH =96, 바이트 minPITCH =75, 바이트 위치 =90, 바이트 펄스 =20, 바이트 피치CW =1, 바이트 피벗CW =1, 바이트 randomWake, 바이트 randomOpen, 바이트 randomFalse, 바이트 randomStart, 바이트 randomDisengage, int triggerDistance =300, 바이트 buttonStatus, 바이트 busyRed =1, 바이트 restModeWhite, 바이트 goState, int x, int y, 바이트 pb1State, // 파이어바이트 pb2State; // say random commentbyte pb3State;byte randomPic;// MTC(Master Turret Control)의 페이로드// int payload [] ={0, 1, 2 , 3 , 4 , 5 };// int payload [] ={x , y, pb1State, pb2State, pb3State, goState};int payload [6];/* "채팅 시간"에 대한 "대화" 맵입니다. * 0-99 =붉은 터렛 속담 * 100-199 =하얀 터렛 속담 * 200-299 =푸른 터렛 속담 * 모든 SD 카드의 파일은 0-100으로 저장됩니다. * 여기에서 흰색의 경우 파일 번호에 100을 추가하고 파란색의 경우 200을 추가합니다. * 파일 204는 BLUE 터렛, 파일 번호 0004입니다. */ int chatSayings [] ={ 0, // i =0에서 일시 중지를 시작하고 "rounds"가 뒤따릅니다... 204, 164, 25, // 1 205, 127, 76, // 2 208, 162, 65, // 3 143, 230, 23, // 4 130, 41, 225, // 5 153, 31, 133, // 6 234, 49, 155, / / 7 229, 175, 74, // 8 231, 58, 226, // 9 161, 223, 59, // 10 227, 68, 236, // 11 136, 50, 224, // 12 0 34, 1 , 78, // 13 222, 42 // End};/* 이것은 RED 및 WHITE 포탑 타이밍 맵입니다. 그들은 말을 공유합니다. * 이 타이밍은 개별 속담을 재생하는 데 필요한 * 시간(밀리초)에 해당합니다. * 위의 문구를 원하는 대로 변경하되, 이 타이밍은 변경하지 마십시오. * 예를 들어, i =2는 chatSayings[2] 파일을 재생하는 데 * 0.8초(NormalTimings[2])가 걸립니다. */int NormalTimings [] ={1000, // i =0에서 일시 중지 시작, 이어서 "rounds"...2600, 800, 2800, 900, 1700, 1600, 1300, 2500, 1400, 1900, // 1 - 101600, 2300, 800, 3000, 300, 100, 200, 0, 0, 300, // 11 - 20298000, 1300, 0, 3, 2600, 1300, 1400, 1900, 1400, 19100 , 1000, 1000, 2100, 1500, 1300, 1100, 800, 1200, 1000, // 31 - 402200, 1700, 1300, 1400, 1500, 5000 , 900, 2400, 1200, 1100, 2100, 2000, 2500, 1700, // 51 - 601100, 1000, 1100, 500, 1900, 0, 130, 900, 0, 130, 901 , 1700, 1100, 1100, 1500, 1500, 500, 900, // 71 - 802100 // 81};/* BLUE 포탑 타이밍 맵입니다. * 이 타이밍은 개별 속담을 재생하는 데 필요한 * 시간(초)에 해당합니다. * 예를 들어, i =2는 chatSayings[2] 파일을 재생하는 데 0.9초(DefectiveTimings[2])가 걸립니다. */int DefectiveTimings [] ={1000, // i =0에서 일시 중지 시작, 이어서 "rounds"...1700, 900, 2000, 600, 1100, 1800, 1900, 3000, 1500, 800, // 1 - 102100, 800, 1900, 900, 3200, 2700, 0, 0, 0, 2000, // 11 - 204400, 800, 3200, 900, 1400, 200, 1200, 2000, 1200 , 1400, 2100, 1000, 1600, 1000, 1200 // 31 - 40};//////////////////////////////// ////////////////////////////////////// //===========================================================================================================////////////////////////////////////////////////////// ////////////// 무효 설정(){ secondarySerial.begin(9600);// Serial.begin(9600);// mp3.begin(); mp3.setVolume(22); Wire.begin(); SPI.begin(); // 라디오 설정 radio.begin(); radio.setPALevel(RF24_PA_LOW); // 라디오를 저전력으로 설정합니다. 모두 서로 가까이 radio.setDataRate(RF24_2MBPS); // 여러 라디오에서 이것이 가장 잘 작동한다는 것을 알았습니다. network.begin(70, this_node); //(채널, 노드 주소) sensor_read(); 핀모드(LED_LH_up, 출력); 핀모드(LED_LH_다운, 출력); 핀모드(LED_CENTRE, 출력); 핀모드(LED_RH_up, OUTPUT); 핀모드(LED_RH_다운, 출력); 디지털 쓰기(LED_CENTRE, HIGH); 활성화_서보(); Servo_wings.write(WINGopen); // 날개를 연다.servo_pivot.write(parkPIVOT); // 파크 피벗 서보_pitch.write(parkPITCH); // 파크 피치 randomWake =random(1, 3); mp3.playMp3FolderTrack(1); // 깨우기 주석 재생 delay(2000); Servo_wings.write(WINGclose); // 날개 닫기 delay(1500); 디지털 쓰기(LED_CENTRE, LOW); turn_off_servos(); 바쁜 레드 =0;}/////////////////////////////////////////////// ////////////////////////=========================메인 루프 ===============================/////////////////////// ////////////////////////////////////////////////// 무효 루프( ){ while (sensor.readRangeSingleMillimeters()>triggerDistance) { //센서 앞에 아무것도 없고 아무것도 하지 않음 ReadNet(); 쓰기넷(); output_sensor(); if (payload[5] ==1) { // MTC와 함께 사용되는 조건. 포탑은 MTC 지연(500) 없이 자동으로 작동합니다. 쓰기넷(); Cara_Mia(); // 오페라 타임!! } else if (페이로드[5] ==2) { 지연(500); 쓰기넷(); 잡담 시간(); // 잡담 시간!!} ReadNet(); } else if (페이로드[5] ==3) { 지연(500); 쓰기넷(); 수동 제어 (); // 수동 제어 } } if (sensor.readRangeSingleMillimeters()triggerDistance){ // 열렸고 사람이 사라짐 falseActivate(); // "어디 갔니?"라고 말하십시오. 코멘트 및 마감 지연(2000); 스캔 영역(); // 영역 스캔 수행 } else { // 누군가 분명히 거기에 - 발사!! 관계를 맺다(); 지연(2400); for (int j=0; j <=2; j++){ if (sensor.readRangeSingleMillimeters()=maxPIVOT) 피벗CW =0; if (posPIVOT <=minPIVOT) 피벗CW =1; if (posPITCH>=maxPITCH) pitchCW =0; if (posPITCH <=minPITCH) pitchCW =1;}/////////////////////////////////////// ///////////////////////////////=======================활성화 ================================/////////////// ////////////////////////////////////////////////////// ////void activate(){ // 날개를 펴고 무언가를 말합니다. busyRed =1; 리드넷(); 쓰기넷(); output_sensor(); 디지털 쓰기(LED_CENTRE, HIGH); // randomOpen의 LED 눈 =random(3, 6); // 임의의 여는 주석 선택 mp3.playMp3FolderTrack(randomOpen); // 무작위로 "당신이 보입니다" 주석을 재생합니다. servo_wings.write(WINGopen); // 날개 열기 output_sensor(); 지연(3400);}////////////////////////////////////////////// /////////////////////////=====================거짓 활성화 ==============================////////////////////////// ///////////////////////////////////////////// 무효 falseActivate(){ / / 바쁜빨간색 =1; 리드넷(); 쓰기넷(); output_sensor(); randomFalse =random(6, 9);// 임의의 시작 주석 선택 mp3.playMp3FolderTrack(randomFalse); // 무작위로 재생 "어디에 갔습니까?" 주석 지연(1800);}///////////////////////////////////////////// //////////////////////////========================스캔 AREA =============================//////////////////// /////////////////////////////////////////////////void scanArea(){ // continue scanning for a bit after falseActivate busyRed =1; ReadNet(); WriteNet(); output_sensor(); mp3.playMp3FolderTrack(2); // "searching..." servo_pitch.write(parkPITCH); delay(1600); servo_pitch.detach(); servo_wings.detach(); mp3.playMp3FolderTrack(21); for (int i=0; i <=220; i++){ //scan for a little bit... output_sensor(); if (pivotCW ==0) posPIVOT =posPIVOT - 1; // increment one step CW if CW =0 if (pivotCW ==1) posPIVOT =posPIVOT + 1; // otherwise go one step other direction if (posPIVOT>=maxPIVOT) pivotCW =0; // if max rotation clockwise, switch to counterclockwise if (posPIVOT <=minPIVOT) pivotCW =1; // if min rotation counterclockwise,switch to clockwise servo_pivot.write(posPIVOT); if (sensor.readRangeSingleMillimeters()=(850 + (i * 100))) { // 1050 randomWingPos =random(10 + (i*20), (60 + (i*20))); servo_wings.write(randomWingPos); previousMillis1 =millis(); } } } disengage(); busyRed =0; goState =0; mp3.stop(); ReadNet(); delay(1000);}/////////////////////////////////////////////////////////////////// //=======================CHATTY TIME ===========================/////////////////////////////////////////////////////////////////////void Chatty_time(){ busyRed =1; WriteNet(); int i =0; int talk; int saying; int timeadder =750; int talkTime =NormalTimings[i]; int randomPivotPos; activate_servos(); servo_wings.write(WINGopen); digitalWrite(LED_CENTRE, HIGH); do { ReadNet(); WriteNet(); //output_sensor(); // used for debugging... if (i>=43) { // end of sequence busyRed =0; WriteNet(); disengage(); 반품; } unsigned long currentMillis =millis(); // grab current time if ((unsigned long)(currentMillis - previousMillis3)>=talkTime) { if (chatSayings[i] <100) { // RED Turret talking talk =chatSayings[i]; saying =chatSayings[i]; talkTime =(NormalTimings[saying] + timeadder); } else if ((chatSayings[i]> 99) &&(chatSayings[i] <200)) { // WHITE turret talking talk =0; saying =chatSayings[i] - 100; talkTime =(NormalTimings[saying] + timeadder); } else { // BLUE turret talking talk =0; saying =chatSayings[i] - 200; // sound file # of BLUE talkTime =(DefectiveTimings[saying] + timeadder); // Time for that saying } if (talk ==0) { digitalWrite(LED_CENTRE, LOW); } else { digitalWrite(LED_CENTRE, HIGH); mp3.playMp3FolderTrack(talk); } randomPivotPos =random(minPIVOT, maxPIVOT); servo_pivot.write(randomPivotPos); Serial.println(); Serial.print(F("i:")); Serial.print (i); Serial.print ("\t"); Serial.print(F("chatSayings[i] ")); Serial.print (chatSayings[i]); Serial.print ("\t"); Serial.print(F("Saying ")); Serial.print (saying); Serial.print ("\t"); Serial.print(F("talk ")); Serial.print (talk); Serial.print ("\t"); Serial.print(F("chat time ")); Serial.print (talkTime); Serial.print ("\t"); Serial.print(F("busyRed:"));Serial.print (busyRed); Serial.print(" "); previousMillis3 =millis(); 나는 ++; } } while (payload[4] ==1); busyRed =0; WriteNet(); digitalWrite(LED_CENTRE, LOW); disengage();}/////////////////////////////////////////////////////////////////// //=======================MANUAL CONTROL =======================/////////////////////////////////////////////////////////////////////void ManualControl(){ int servoWings; int servoPitch; int servoPivot; activate_servos(); servo_wings.write(WINGopen); digitalWrite(LED_CENTRE, HIGH); ReadNet(); do { output_sensor(); ReadNet(); servoPivot =map(payload[0], 1023, 0, minPIVOT, maxPIVOT); servoPitch =map(payload[1], 1023, 0, minPITCH, maxPITCH); servo_pivot.write(servoPivot); servo_pitch.write(servoPitch); unsigned long currentMillis =millis(); // grab current time if (payload[3] ==0) { if ((unsigned long)(currentMillis - previousMillis1)>=2500) { randomPic =random(1, 20); mp3.playMp3FolderTrack(randomPic); previousMillis1 =millis(); } } if (payload[2] ==0){ fire(); } } while (payload[5] ==3); disengage(); busyRed =0; WriteNet(); digitalWrite(LED_CENTRE, LOW); }/////////////////////////////////////////////////////////////////////=========================RECEIVING ===========================/////////////////////////////////////////////////////////////////////void ReadNet(){ network.update(); if ( network.available() ) { RF24NetworkHeader header; network.peek(header); network.read(header, &payload, sizeof(payload));} // Read the package }/////////////////////////////////////////////////////////////////////=========================SENDING =============================/////////////////////////////////////////////////////////////////////void WriteNet(){ network.update(); RF24NetworkHeader header4(MTC); bool ok4 =network.write(header4, &busyRed, sizeof(busyRed));/* if (ok4) { // used for debugging... Serial.print("MTC ok4 ");} else { Serial.print("------- ");} */}

    맞춤형 부품 및 인클로저

    Lens%2Bv3b.stl Body-RHS%2Bv4.stl Body-LHS%2Bw%2Bcomponents%2Bv4.stl Wing%2BRH%2Bbottom%2Bv4.stl Wing%2BRH%2Btop%2Bv4.stl Wing%2BLH%2Bbottom%2Bv4.stl Wing%2BLH%2Btop%2Bv4.stl Pitch%2BFrame%2Bv4.stl Leg%2B-%2BREAR%2Bv4.stl Infill%2Bstrips%2Bv3.stl Leg%2B-%2BREAR%2Btest.stl Pitch%2BFrame%2B-%2Bmodified%2B1.stl Arduino%2BBase%2Bw%2BRadio.stl

    회로도

    Schematic that I made for building the turret.

    제조공정

    1. 주황색
    2. 단두대
    3. 비석
    4. 수영복
    5. 실리콘
    6. 보드카
    7. 캐러셀
    8. 소파
    9. Endworking 터렛으로 사이클 시간 단축