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

로키 로버: 픽시캠(PixyCam)과 아두이노 101로 로봇 비전 시스템 구축

부품 및 소모품

아두이노 101 1개
아다프루트 모터/스테퍼 쉴드 V2 1개
스파크펀 다구 DG102 탱크 섀시 1개
AA 배터리 1세트
USB-A to B 케이블 1개
아다프루트 USB 배터리 팩 1개
M2.5 스탠드오프 (너트, 나사 포함) 4개
수/암 극성 JST 배터리 커넥터 1세트
수컷 헤더 40핀 1열 (0.1") 1개
수-수 점퍼 와이어 1세트
픽시 (CMUcam5) 1개
픽시 팬-틸트 키트 1개

앱 및 온라인 서비스

프로젝트 소개

인텔 아두이노 101 기반 픽시캠 로버

해크스터 라이브 이벤트는 정말 멋집니다! 인텔이 우리 해크스터 댈러스 이벤트를 후원하며 인텔 아두이노 101을 보내주어 로버를 제작했습니다. 감사합니다 인텔, 감사합니다 아두이노. 이 로버는 이벤트를 위해 제작한 것입니다.

존athan 호텔의 튜토리얼을 따라 이 장치를 제작했습니다. 그는 BLE 로버 제작 비디오를 만들었으며 따라하기 매우 쉽습니다! 여기에서 확인하세요. 존athan 호텔의 비디오도 있습니다.

4모터 로버라 이 가이드를 따랐습니다.

로버를 제작하고 블링크로 연결한 후, 픽시캠을 추가하여 개선하기로 했습니다. 배터리 홀더를 앞쪽으로 이동하여 팬/틸트 카메라를 장착했습니다.

픽시캠 (PixyCam)

픽시캠은 로봇 비전을 쉽게 만듭니다. 픽시는 DIY 로봇용 고속 비전 센서로, 버튼만 누르면 물체를 학습시킬 수 있습니다. 수백 개의 물체를 동시에 추적할 수 있으며 추적 중인 데이터만 제공합니다.

로키 로버: 픽시캠(PixyCam)과 아두이노 101로 로봇 비전 시스템 구축

주황색 호박을 추적 대상으로 정했습니다.

로키 로버: 픽시캠(PixyCam)과 아두이노 101로 로봇 비전 시스템 구축

시작하기가 얼마나 쉬운지 놀랍습니다. 아두이노에 픽시캠 연결 지침과 팬/틸트 메커니즘 조립 지침이 있습니다. 그림이 많아 매우 따라하기 쉽습니다. 설정 및 빌드 지침, 아두이노 통합 방법을 따라하고 예제를 테스트했습니다.

로키 로버: 픽시캠(PixyCam)과 아두이노 101로 로봇 비전 시스템 구축

픽시캠 아두이노 API

아두이노에서 픽시 사용은 매우 간단합니다. SPI와 픽시 헤더를 포함하기만 하면 됩니다:

#include <SPI.h>
#include <Pixy.h>

그리고 setup()과 loop() 함수 밖에 전역 인스턴스를 생성합니다:

Pixy pixy;

아두이노 라이브러리에서 가장 중요한 메서드는 getBlocks()로, 픽시가 감지한 물체 수를 반환합니다. pixy.blocks[] 배열에서 각 감지된 물체에 대한 정보(감지된 물체당 배열 멤버 하나)를 확인할 수 있습니다. 각 배열 멤버(i)에는 다음 필드가 포함됩니다:

아두이노로 픽시와 통신하는 것이 이처럼 간단합니다! 아두이노 라이브러리와 API에 대한 자세한 내용은 여기를 참조하세요. 로버에 사용된 코드는 다음과 같습니다. 원래 BLE 코드를 수정하고 물체 추적 기능을 추가했습니다. 설정 중:

void setup() {
  .....
  pixy.init();
  ....
}

메인 루프는 대략 다음과 같습니다:

void loop() {
  ......
  // 픽시 데이터 읽기 및 블록 가져오기
  static int i = 0;
  int j;
  uint16_t blocks;
  char buf[32];
  int32_t panError, tiltError;
  blocks = pixy.getBlocks();
  // 블록이 있는 경우
  if (blocks) {
    panError = X_CENTER - pixy.blocks[0].x;
    tiltError = pixy.blocks[0].y - Y_CENTER;
    panLoop.updatePan(panError);
    tiltLoop.update(tiltError);
    pixy.setServos(panLoop.m_pos, tiltLoop.m_pos);
    i++;
    // 프레임이 아두이노 속도를 늦추지 않도록 10프레임마다 처리
    if (i % 10 == 0) {
      int trackedBlock = 0;
      sprintf(buf, "Detected %d:\n", blocks);
      Serial.print(buf);
      long maxSize = 0;
      for (j = 0; j < blocks; j++) {
        sprintf(buf, " block %d: ", j);
        Serial.print(buf);
        pixy.blocks[j].print();
        long newSize = pixy.blocks[j].height * pixy.blocks[j].width;
        if (newSize > maxSize) {
          trackedBlock = j;
          maxSize = newSize;
        }
      }
      int32_t followError = RCS_CENTER_POS - panLoop.m_pos;
      // 크기는 물체 면적. 최근 8개의 이동 평균 유지
      size += pixy.blocks[trackedBlock].width * pixy.blocks[trackedBlock].height;
      size -= size >> 3;
      int forwardSpeed = constrain(400 - (size / 256), -100, 400);
      int32_t differential = (followError + (followError * forwardSpeed)) >> 8;
      int leftSpeed = constrain(forwardSpeed + differential, -400, 400);
      int rightSpeed = constrain(forwardSpeed - differential, -400, 400);
      motor1->setSpeed(leftSpeed);
      motor3->setSpeed(leftSpeed);
      motor2->setSpeed(rightSpeed);
      motor4->setSpeed(rightSpeed);
      double width = pixy.blocks[trackedBlock].width;
      if (width <= 5) {
      } else if (width < 20 && !running) {
        Serial.println("running");
        motor1->run(FORWARD);
        motor3->run(FORWARD);
        motor2->run(FORWARD);
        motor4->run(FORWARD);
        running = true;
      } else if (width > 80 && !running) {
        Serial.println("running");
        motor1->run(BACKWARD);
        motor3->run(BACKWARD);
        motor2->run(BACKWARD);
        motor4->run(BACKWARD);
        running = true;
      } else if (width >= 20 && width <= 80 && running) {
        motor1->setSpeed(128);
        motor2->setSpeed(128);
        motor3->setSpeed(128);
        motor4->setSpeed(128);
        motor2->run(RELEASE);
        motor4->run(RELEASE);
        motor1->run(RELEASE);
        motor3->run(RELEASE);
        running = false;
      }
    }
  }
}

픽시캠이 로버를 제어하지 않고 블링크만 실행하려면 렌즈 캡을 씌우세요. 그러면 픽시캠이 간섭하지 않습니다. 이 프로젝트가 아두이노 프로그래밍이나 다음 프로젝트에서 픽시캠 사용에 관심이 생기게 했다면 "프로젝트 존중" 버튼을 누르고 팔로우해 주세요.

질문은 자유롭게 해주세요.

코드

로키 로버

전체 코드는 GitHub 저장소에서 확인할 수 있습니다.

제조공정

  1. 아두이노 POV 클락: 퍼시스턴스 오브 비전 LED 디스플레이 제작
  2. SERENA: TFT LCD 터치스크린 탑재 아두이노 메가 2560 커스텀 알람 시스템
  3. 아두이노 구동 3D 프린팅 로봇 팔 만들기: 단계별 가이드
  4. 아두이노 프로젝트를 위한 최적화된 전원 솔루션
  5. 아두이노 메가 기반 닌텐도 눙크 컨트롤 6자유도 로봇 암 키트
  6. 아두이노 101 BLE + 블링크(Blynk): 블루투스 제어 탱크 로봇 DIY
  7. 아두이노 101과 tinyTILE BLE로 만드는 스마트 매칭 선글라스
  8. 아두이노 우노와 ATtiny85로 만드는 휴대용 POV(잔상) 디스플레이
  9. DIY 아두이노 스마트워치 - 애플 워치 스타일 직접 제작
  10. 로봇 수술 비전 시스템 조명 설계 최적화: 고화질 3D 복강경 사례