這篇文章來源于DevicePlus.com英語網站的翻譯稿。
該項目的目標是向您介紹CMUcam5 Pixy,并展示如何在您自己DIY的項目中實現相機功能,您會發現即使對于一個復雜的機電系統(比如輪式自主機器人)來說,這也是非常簡單易執行的操作。Pixy是一種靈活、緊湊、可調節且易于設置的相機傳感器,能夠檢測并傳遞某些類型對象的信息。我們將介紹有關相機的基礎知識,并了解在Pixy和Arduino之間進行通信的一般方法。
硬件
Arduino Uno (您可以使用任何 Arduino)
CMUcam5 Pixy 相機
伺服電機 (S06NF)
一小塊木頭(用來將相機安裝到伺服上, 我將只使用螺絲安裝)
線纜 (用于相機USB MINI 以及Uno USB B)
用于伺服的外接5V電源(警告!如果您將伺服連接到您的Arduino上,并通過USB供電,您的 Arduino將會被燒壞)。
軟件
Arduino IDE 1.6.9
PixyMon 軟件
用于Arduino的PixyMon庫
圖1:CMUcam5 Pixy相機
CMUcam5 Pixy是一款小型、易于操作、成本低且開源的相機。它擁有獨立的處理器,每秒可對探測到的信息進行50次輸出。它還可以與Arduino、Raspberry Pi等連接。CMUcam5 Pixy使用非常常見的接口,例如SPI、12C、UART以及USB,并且具有一個自定義程序,可讓您連接到您的設備上,點擊此處可以免費下載。
設置Pixy
點擊此處下載軟件PixyMon并安裝。安裝時,請通過USB連接Pixy,然后檢查RGB Led燈是否亮起。
打開PixyMon,并確保Pixy是通過USB進行連接的。如果所有連接正確,它將輸出相機所“看到”的內容。例如,我放置了一個紫色的蓋子作為測試對象,來檢查Pixy相機的輸出。
圖2:Pixy Raw輸出圖像
進入“Action”子菜單,并點擊“Set Signature 1”,視頻將會停滯,您可以選擇想要用相機檢測的顏色/對象。
標記好顏色/對象后,視頻將會開始播放,并且相機傳感器將會對顏色/對象進行檢測,如圖3所示。在同一時間,您最多可以設置7個想要檢測的對象/顏色。如果您進行了正確標記,并且設置了視野范圍,就可以實現對多個對象/顏色的檢測。
圖3:Pixy檢測下的視圖
如果想要清除預設標記,您可以點擊Action -> Clear All Signatures,直接清除所有標記 ,或者選擇Clear Signature 來對標記一一清除(在控制頁面輸入標記編號)。
點擊Settings -> Signature 1進行調整,您可以修改Pixy視野尺寸的大小。
其他設置(File -> Configure)
通過更改相機亮度,您可以在黑暗環境中進行信息探測。
在 Camera 選項中,您可以調整白平衡,這非常有用。
使用 Action -> Default 程序,您將只看到所檢測到的顏色,沒有視頻輸出。
有一個專用于在您的Arduino上使用Pixy的自定義庫。我使用的是Arduino Uno,但是您可以使用任何版本。這個庫非常有用,不僅為初學者提供了簡單的示例,也為專家提供了絕佳的開發平臺。
首先,我們要設置一個檢測對象,類似于我們之前在設置相機時所進行的操作。
點擊此處下載Arduino庫(在“Arduino libraries and examples ”文件夾下)。[https://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。
/* * 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 #include 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; j180 || ((((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的檢測對象設置為圓形紫色容器,然后進行編程,這樣一來,每當這種容器進入相機的視野,伺服就會控制離開這個物體。
裝置結構:
圖4:已完成的裝置結構
我使用的是S06NF伺服,并且用小螺絲釘將伺服連接到相機上,如圖5所示。
圖5:相機與伺服電機連接
對于硬件部分,僅進行簡單的接線。將SPI線纜連接到相機上,將伺服與Arduino連接。我使用引腳9來控制伺服。
圖6:接線圖
警告!
不要忘記連接GND。如果您沒有將電源、伺服和Arduino GND連接在一起,伺服器將會奔潰!
這里,我使用的是用于5V電源的舊型適配器。
總結
在本教程中,我們介紹了PixyMon相機的基礎知識,并且開發了一個簡單的伺服驅動應用。我們創建了一個會離開檢測對象而不是對象追蹤的系統。在第二部分中,我們會繼續深入拓展這個理念,開發出一種具有多個伺服的交互系統,通過將一個球作為對象,實現對桌子方位的控制。
如果您有任何意見或疑問,請在Google +上留言,并關注我們的動態。
繼續閱讀本文的第二部分 >
審核編輯黃宇
-
電源
+關注
關注
184文章
17824瀏覽量
251236 -
傳感器
+關注
關注
2552文章
51356瀏覽量
755636 -
Arduino
+關注
關注
188文章
6477瀏覽量
187543
發布評論請先 登錄
相關推薦
評論