該專案的目標是向您介紹CMUcam5 Pixy,並展示如何在您自己DIY的項目中實現相機功能,您會發現即使對於一個複雜的機電系統(比如輪式自主機器人)來說,這也是非常簡單易執行的操作。Pixy是一種靈活、緊湊、可調節且易於設定的相機感測器,能夠檢測並傳遞某些類型物件的資訊。我們將介紹有關相機的基礎知識,並瞭解在Pixy和Arduino之間進行通信的一般方法。
CMUcam5 Pixy是一款小型、易於操作、成本低且開源的相機。它擁有獨立的處理器,每秒可對探測到的資訊進行50次輸出。它還可以與Arduino、Raspberry Pi等連接。CMUcam5 Pixy使用非常常見的介面,例如SPI、12C、UART以及USB,並且具有一個自訂程式,可讓您連接到您的裝置上,點擊此處可以免費下載。
設定 Pixy
點擊此處下載軟體PixyMon並安裝。安裝時,請透過USB連接Pixy,然後檢查RGB Led燈是否亮起。
打開PixyMon,並確保Pixy是透過USB進行連接的。如果所有連接正確,它將輸出相機所“看到”的內容。例如,我放置了一個紫色的蓋子作為測試物件,來檢查Pixy相機的輸出。
進入“Action”子功能表,並點擊“Set Signature 1”,視訊將會停滯,您可以選擇想要用相機檢測的顏色/物件。
標記好顏色/物件後,視訊將會開始播放,並且相機感測器將會對顏色/物件進行檢測,如圖3所示。在同一時間,您最多可以設定7個想要檢測的物件/顏色。如果您進行了正確標記,並且設定了視野範圍,就可以實現對多個物件/顏色的檢測。
如果想要清除預設標記,您可以點擊Action-> Clear All Signatures,直接清除所有標記 ,或者選擇Clear Signature來對標記一一清除(在控制頁面輸入標記編號)。
點擊Settings -> Signature 1進行調整,您可以修改Pixy視野尺寸的大小。
有一個專用於在您的Arduino上使用Pixy的自訂程式館。我使用的是Arduino Uno,但是您可以使用任何版本。這個程式館非常有用,不僅為初學者提供了簡單的範例,也為專家提供了絕佳的研發平台。
首先,我們要設定一個檢測物件,類似於我們之前在設定相機時所進行的操作。
點擊此處下載Arduino程式館(在“Arduino libraries and examples”資料夾下)。 [http://www.cmucam.org/attachments/download/1157/arduino_pixy-0.1.7.zip]。這將實現您的Arduino和Pixy相機之間的通信。然後,將其添加到Arduino IDE(Sketch->Include Library->Add .zip Library)。
點擊Example->Pixy->hello_world,打開一個名稱為hello_world的簡單範例。
將其上傳到您的研發板上,並打開端子(Tools->Serial Monitor)。
此時,您將看到一條資訊,顯示“Starting… ”,然後將顯示有關檢測到的物件的資訊。
hello_world 代碼釋義
在 setup() 函數中,對編號和pixy進行初始化和相關設定。
loop() 函數包含幾個變數,這些變數用於列印以及從pixy獲取模組。使用 pixy.getBlocks() 函數,我們可以獲取檢測到的物件。 if (i%50==0) 代碼可以用來設定我們想要獲取資訊的FPS。如果我們想要每秒鐘獲取一條資訊,就要寫 %1 而不是 %50。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
/* * explaining the (((pixy.blocks[j].x)/2)+10)-60 * with pixy.blocks[j].x we get the x position of the object detected * we divide it because the max value it can read is 320 * I did the + 10 for small adjustments * the -60 is used for rotating away from the object */ #include <Servo.h> #include <Pixy.h> Servo myservo; // create servo object to control a servo Pixy pixy; // create pixy object for controlling the pixy camera // function for testing the servo void test_camera(){ myservo.write(0); delay(1000); myservo.write(90); delay(1000); myservo.write(180); delay(1000); myservo.write(90); // get the camera centered } void setup() { //Serial.begin(9600); // initialize serial myservo.attach(9); // attaches the servo on pin 9 to the servo object test_camera(); // executing testing for the servo pixy.init(); // initing the pixy camera } void loop() { //variables static int i = 0; int j; uint16_t blocks; char buf[32]; int32_t xpos; // grabing the blocks blocks = pixy.getBlocks(); // If there are detect blocks if (blocks) { i++; // we are using 50FPS if (i%50==0) { sprintf(buf, "Detected %d:\n", blocks); for (j=0; j<blocks; j++) { sprintf(buf, " block %d: ", j); //Serial.println((((pixy.blocks[j].x)/2)+10)-60); //print out to what position will the servo go // this is used so the servo can't get stuck at minimum and maximum values if(((((pixy.blocks[j].x)/2)+10)-60) > 180 || ((((pixy.blocks[j].x)/2)+10)-60) < 0 ) { myservo.write(90); // if at min or max go to the middle } else{ // if there is no problem with min and max myservo.write((((pixy.blocks[j].x)/2)+10)-60); } } } } } |
sprintf(buf, “Detected %d:\n”, blocks); 輸出由ID檢測到的當前物件,並將必要的資料放入緩衝區。在for迴圈中,我們將會獲得所有類型的資訊,包括檢測物件、寬度、高度、x、y以及標記資訊。
現在,Pixy已經成功連接到了Arduino,我將做一個簡單的實驗,將Pixy連接到伺服,並且在相機“看到“某種類型的顏色/物件時讓伺服控制離開。
在本實驗中,我將把Pixy的檢測物件設定為圓形紫色容器,然後進行程式設計,這樣一來,每當這種容器進入相機的視野,伺服就會控制離開這個物體。
裝置結構:
我使用的是S06NF伺服,並且用小螺絲釘將伺服連接到相機上,如圖5所示。
對於硬體部分,僅進行簡單的接線。將SPI線纜連接到相機上,將伺服與Arduino連接。我使用引腳9來控制伺服。
警告!
不要忘記連接GND。如果您沒有將電源、伺服和Arduino GND連接在一起,伺服器將會奔潰!
這裡,我使用的是用於5V電源的舊型合適器。
在本課程中,我們介紹了PixyMon相機的基礎知識,並且研發了一個簡單的伺服驅動應用。我們創建了一個會離開檢測物件而不是物件追蹤的系統。在第二部分中,我們會繼續深入拓展這個理念,研發出一種具有多個伺服的交互系統,透過將一個球作為物件,實現對桌子方位的控制。
如果您有任何意見或疑問,請在Google +上留言,並關注我們的動態。