Rocky Rover: Bangun Sistem Visi Robotik dengan PixyCam dan Arduino 101
Komponen dan Perlengkapan
- Arduino 101 (1 unit)
- Shield Motor/Stepper Adafruit V2 (1 unit)
- Chassis Tank SparkFun Dagu DG102 (1 unit)
- Baterai AA (1 set)
- Kabel USB-A ke B (1 buah)
- Paket Baterai USB Adafruit (1 unit)
- Standoff M2.5 dengan baut dan skru (4 buah)
- Konektor Baterai JST Polarized Jantan dan Betina (1 set)
- Header Jantan 40 Posisi 1 Baris (0.1") (1 unit)
- Kabel Jumper Jantan/Jantan (1 set)
- Pixy (CMUcam5) (1 unit)
- Kit Pan-Tilt Pixy untuk Pixy (1 unit)
Aplikasi dan Layanan Online
Tentang Proyek
Acara Hackster Live sangat luar biasa! Intel menyponsori acara Hackster Dallas kami dan mengirim beberapa Arduino 101 Intel untuk membangun Rover. Terima kasih Intel, terima kasih Arduino. Inilah Rover yang saya bangun untuk acara tersebut.
Saya membangun perangkat ini mengikuti tutorial dari Johnathan Hottell. Dia membuat beberapa video untuk membangun Rover BLE. Dan mudah untuk diikuti! Lihat di sini. Inilah video dari Johnathan Hottell.
Saya memiliki Rover dengan 4 motor jadi saya mengikuti ini.
Setelah membangun Rover dan menghubungkannya dengan Blynk, saya memutuskan untuk meningkatkan pembangunan dan menambahkan PixyCam. Saya memindahkan tempat baterai ke depan sehingga saya dapat memasang kamera pan/tilt.
PixyCam
PixyCam membuat visi robotik menjadi mudah. Pixy adalah sensor visi cepat untuk robotika DIY, mudah untuk mengajari Pixy sebuah objek hanya dengan menekan tombol. Itu mampu melacak ratusan objek secara bersamaan dan hanya menyediakan data yang sedang dilacak.
Saya memutuskan untuk melacak Labu Oranye.
Saya terkejut seberapa mudah untuk menjalankannya. Inilah tautan untuk petunjuk menghubungkan PixyCam ke Arduino. Klik di sini untuk petunjuk pemasangan mekanisme Pan/Tilt. Saya senang karena memiliki banyak gambar, sangat mudah diikuti. Saya mengikuti petunjuk pengaturan dan pembangunan, cara mengintegrasikan dengan Arduino. Saya menguji contoh-contoh mereka.
Inilah yang saya temukan tentang API.
API Arduino PixyCam
Menggunakan Pixy dengan Arduino sangat sederhana. Cukup sertakan header SPI dan Pixy:
#include <SPI.h>
#include <Pixy.h>
Dan buat instance global Pixy dengan menempatkan hal kecil ini di luar fungsi setup() dan loop():
Pixy pixy;
Metode terpenting dalam pustaka Arduino adalah getBlocks(), yang mengembalikan jumlah objek yang terdeteksi Pixy. Anda kemudian dapat melihat di array pixy.blocks[] untuk informasi tentang setiap objek yang terdeteksi (satu anggota array untuk setiap objek yang terdeteksi.) Setiap anggota array (i) berisi field berikut:
pixy.blocks[i].signature Nomor tanda tangan objek yang terdeteksi (1-7 untuk tanda tangan normal)pixy.blocks[i].x Lokasi x pusat objek yang terdeteksi (0 hingga 319)pixy.blocks[i].y Lokasi y pusat objek yang terdeteksi (0 hingga 199)pixy.blocks[i].width Lebar objek yang terdeteksi (1 hingga 320)pixy.blocks[i].height Tinggi objek yang terdeteksi (1 hingga 200)pixy.blocks[i].angle Sudut objek yang terdeteksi jika objek yang terdeteksi adalah kode warna.pixy.blocks[i].print() Fungsi anggota yang mencetak informasi objek yang terdeteksi ke port serial
Jadi mudah untuk berkomunikasi dengan Pixy dengan Arduino Anda! Untuk informasi lebih lanjut tentang Pustaka dan API Arduino, kunjungi di sini. Inilah kode yang digunakan untuk Rover. Saya memodifikasi kode BLE asli dan menambahkan pelacakan objek. Saat penyiapan:
void setup() { ..... pixy.init(); .... }
Loop utama terlihat seperti ini:
void loop() { ...... // baca data pixy dan dapatkan blok
static int i = 0;
int j;
uint16_t blocks;
char buf[32];
int32_t panError, tiltError;
blocks = pixy.getBlocks();
//jika ada blok
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++;
// frame akan memberatkan Arduino
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;
// Ukuran adalah luas objek.
// Kami menjaga rata-rata berjalan dari 8 terakhir.
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;
}
}
}
Agar Blynk dapat berjalan tanpa dikontrol oleh PixyCam, tutup kacap lensa. Ini akan memastikan PixyCam tidak mengganggu pengendalian bot. Jika proyek ini membuat Anda tertarik untuk pemrograman Arduino atau menggunakan PixyCam dalam proyek Anda berikutnya, silakan klik tombol "Hormati Proyek" dan ikuti saya.
Jangan ragu untuk bertanya.
Kode
Rocky Rover