色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

CMUcam5 Pixy視覺相機傳感器簡介第二部分—創建球平衡梁

YYXIAO ? 來源:DevicePlus ? 作者:DevicePlus ? 2023-03-01 17:56 ? 次閱讀

這篇文章來源于DevicePlus.com英語網站的翻譯稿。

點擊此處跳轉至本文第一部分 >

pYYBAGPzEyKASW12AAy960d-m9I535.png

這是CMUcam5 Pixy簡介的第二部分。如果您對PixyMon不太熟悉,請先回顧 CMUcam5 Pixy視覺相機傳感器簡介。在第一部分中,我介紹了Pixy的基礎知識,解釋了hello_world代碼,并創建了一個簡單的伺服驅動的應用程序。在本教程中,我將進一步探索Pixy的應用,創建一個球平衡梁。通過一個伺服來設置平衡梁的角度,使球停留在中間,當然,Pixy相機傳感器會對球進行追蹤。

硬件

Arduino Uno (您可以使用任何 Arduino)

CMUcam5 Pixy 相機

伺服電機 (S06NF)

木片和螺絲

數據線(用于相機USB MINI 以及Uno USB B)

用于伺服的5V外部電源(!警告!如果您將伺服連接到Arduino通過USB進行供電,您的Arduino將會被燒壞)

軟件

Arduino IDE 1.6.9

PixyMon 軟件 (https://cmucam.org/projects/cmucam5/wiki/Install_PixyMon_on_Windows_Vista_7_8)

PixyMon 用于 Arduino 的庫(https://cmucam.org/projects/cmucam5/wiki/Latest_release)

Processing 3.1.1 (https://processing.org/download/?processing)

Processing的簡單介紹

poYBAGPzEyaAdq1HAAQvK5Qm474143.png

Processing是非常有用又靈活的一款軟件。它主要用于視覺藝術和科技領域的視覺語言。這款軟件具有100多個庫,可支持各種項目。它的文檔非常齊全,提供了許多使用指南,涵蓋了從編程基礎到可視化等各種主題。它能夠支持所有操作系統(GNU/Linux, Mac OS X, 和 Windows)。該軟件的設計幾乎和Arduino IDE相同。

今天,我們將使用Processing,通過串行通信實現與Arduino之間的通信。

pYYBAGPzEyeAdYXrAACAArfRchM672.png

圖1:Processing界面

項目概況

在此項目中,我將制作一個球平衡梁,一個用木頭制成的“通道”將會像一桿秤那樣使球保持平衡(圖2)。平衡梁44cm寬,3cm高。我把它制造的像通道一樣狹窄,使我們所追蹤的球不會掉落出去。

我使用S06NF伺服電機來移動整個平衡梁,該電機由Arduino進行控制。之后我們會看一下在本教程后面部分的代碼。現在,我已經將伺服放置在了距離平衡梁左端?的位置。

poYBAGPzEyqAZs6VAAIEfmmF9o4174.png

圖2:S06NF STD 伺服電機/ ?RobotShop inc.

伺服將上下移動平衡梁,同時,球也會沿著該路徑移動。

poYBAGPzEzeAcZK0ADIEQeOchkA509.gif

圖3:平衡梁上下移動

數碼相機將會放置在平衡梁上。我將相機的視野范圍設置為僅限于平衡梁。這樣,相機就會只追蹤球,不追蹤任何其他物體了。

平衡梁結構

首先,我們需要一些用于構建平衡梁的材料。我將要使用的是一種簡單的XXMM木材(20cm x 27cm)。我用圓鋸來切割木材,但是您可以使用現有的任何類型的鋸來完成切割,只要能夠保障切割面平整、均勻即可。

poYBAGPzEzyAYUUfAA6Ov4P5-2M143.png

圖4:XXMM木材

請記住,只有使用正確的工具才能夠制造出完美的平衡梁!我使用的是一把錘子、一把直尺、釘子、砂紙、熱膠、一個鉆頭和一把鋸子。

pYYBAGPzEz-AEHptAAdaMVjrS8c856.jpg

圖5:工具

首先,我將制造一個通道,使球能夠在其中左右移動。通道的側面由四塊木板組成(每個21cm x 3cm)。通道在高度方向的兩端將由兩塊木板(4cm x 3cm)封接。底座的尺寸是42cm x 3cm x 1cm。

我使用15mm大帽釘來連接零部件。

pYYBAGPzE0KAPHJ2AAiQl_LJlcg377.png

圖6:封閉通道

在通道中間建立傾斜點有很多種方法。我使用了一種非常簡單的方法,因為成本最低且最容易實現。我用了一個長釘子,兩個像軸承一樣的小管子,先標記了通道的中心點,然后將這些小軸承熱粘合到該中心點,再插入釘子。

poYBAGPzE0SALFpDAAESfBGzkYY401.png

圖7:用于構建傾斜點的釘子和管子

為了設置傾斜點,我們還需要為釘子制作支架。我用了兩塊8cm x 2cm的木板,如圖8所示。我還制作了一個小平臺,可以將所有東西放置在一起,尺寸為12cm x 4.5cm。

poYBAGPzE0iAU62UAA5-qJU02o0193.png

圖8:傾斜點支架

我使用了一小塊木材來安裝伺服并將其架起。

pYYBAGPzE0qAXX24AADdkJI33vM731.png

圖9:安裝在木板上的伺服

在本教程中我使用的是Arduino UNO,但是您也可以使用其他具有SPI連接器的Arduino來連接到Pixy相機。

連接所有部件

一旦構建完成,下一步就是將Pixy相機連接到Arduino,然后再連接到伺服。原理圖與 CMUcam5 Pixy視覺相機傳感器簡介中的相同。我仍然使用外部5V電源為伺服供電。

!警告!不要忘記連接接地端。如果沒有將電源、伺服和Arduino接地端相連接,伺服將會失控!

pYYBAGPzE02AerufAARF7Pk1p00586.png

圖10:接線圖

接下來,我需要在平衡梁結構上方的某個位置設置Pixy,以便它可以隨時檢測到球的位置。調整設置使其僅可以對球進行檢測。請參考第一部分進行設置。

poYBAGPzE0-Ad0q-AAPvjvbxF7w885.png

圖11:Pixy視覺

現在,讓我們來看一些代碼。為了檢測伺服是否工作正常,我修改了中間、最右邊和最左邊的角度,使其適合于我的結構。

#include 



uint8_t leveled = 110;     //middle positon for s1 to keep the board leveled

uint8_t far_right = 180;     //far left positon for s1 to keep the board leveled

uint8_t far_left = 0;     //far right positon for s1 to keep the board levele

Servo s;  

void setup(){

s.write(leveled);

  delay(2000);

  s.write(far_right);

  delay(2000);

  s.write(far_left);

  delay(2000);

}

void loop(){

}

當然,您可以根據自己的喜好來調整變量。

之前,我介紹了一個名叫Processing的軟件。我將使用它通過串行通信來實現與Arduino的通信。

Arduino 代碼

簡單的串行通信:

#include 
#include  

char val; // Data received from the serial port
 int ledPin = 13; // Set the pin to digital I/O 13
void setup() {
   pinMode(ledPin, OUTPUT); // Set pin as OUTPUT
   Serial.begin(9600); // Start serial communication at 9600 bps
 }
 void loop() {
   if (Serial.available())
   { // If data is available to read,
 	val = Serial.read(); // read it and store it in val
   }
   if (val == '1')
   { // If 1 was received
 	digitalWrite(ledPin, HIGH); // turn the LED on
   } else {
 	digitalWrite(ledPin, LOW); // otherwise turn it off
   }
   delay(10); // Wait 10 milliseconds for next reading
}

Processing 代碼

import processing.serial.*;

Serial myPort;  // Create object from Serial class

void setup()
{
  size(200,200); //make our canvas 200 x 200 pixels big
  String portName = Serial.list()[0]; //change the 0 to a 1 or 2 etc. to match your port
  myPort = new Serial(this, portName, 9600);
}
void draw() {
  if (mousePressed == true)
  {                       	//if we clicked in the window
   myPort.write('1');     	//send a 1
   println("1");  
  } else
  {                       	//otherwise
  myPort.write('0');      	//send a 0
  }  
}

改代碼創建了一個200×200像素的窗口并初始化串行端口。draw()空函數用于檢查是否在窗口上按下了鼠標(如果按下寫入1,沒有按下則寫入0)。

現在,我們來測試代碼。點擊運行,然后嘗試點擊窗口中任意位置,這時您的LED燈應發生閃爍,這就表示著一切工作正常!

poYBAGPzE1qAflPDACx_9TH3g-Y867.gif

圖12:Processing 和 Arduino代碼的基本測試

使用Processing編程

我獲取了伺服的相關值,并在Processing中對其進行了處理,所以產生了一個類似于下圖所示的圖片。

poYBAGPzE2SAQAZ6ACOFno8cAoY264.gif

圖13:示例圖片

請用以下代碼創建圖像:

import processing.serial.*;

Serial myPort;        // The serial port
int xPos = 1;         // horizontal position of the graph
float inByte = 0;

void setup () {
  // set the window size:
  size(400, 300);

  // List all the available serial ports
  // if using Processing 2.1 or later, use Serial.printArray()
  println(Serial.list());

  // I know that the first port in the serial list on my mac
  // is always my  Arduino, so I open Serial.list()[0].
  // Open whatever port is the one you're using.
  myPort = new Serial(this, Serial.list()[0], 9600);

  // don't generate a serialEvent() unless you get a newline character:
  myPort.bufferUntil('n');

  // set inital background:
  background(0);
}
void draw () {
  // draw the line:
  stroke(127, 34, 255);
  line(xPos, height, xPos, height - inByte);

  // at the edge of the screen, go back to the beginning:
  if (xPos >= width) {
    xPos = 0;
    background(0);
  } else {
    // increment the horizontal position:
    xPos++;
  }
}


void serialEvent (Serial myPort) {
  // get the ASCII string:
  String inString = myPort.readStringUntil('n');

  if (inString != null) {
    // trim off any whitespace:
    inString = trim(inString);
    // convert to an int and map to the screen height:
    inByte = float(inString);
    println(inByte);
    inByte = map(inByte, 0, 1023, 0, height);
  }
}

Arduino 代碼:

#include 
#include 
#include 
#include  

//37       	164       	288

uint8_t leveled = 110;    	//middle positon for s1 to keep the board leveled	
uint8_t far_right = 180;    	//far left positon for s1 to keep the board leveled
uint8_t far_left = 0;    	//far right positon for s1 to keep the board levele
int current_pos = leveled;
int percentage,var,_percen;


Servo s;        	
Pixy pixy;

void test_board(){
  while(Serial.read() != 'b');
  Serial.write("Starting test");
  s.write(leveled);
  delay(2000);
  s.write(far_right);
  delay(2000);
  s.write(far_left);
  delay(2000);
  Serial.write("Finished test, press any key to continue");
  while(Serial.read() != 'c');
  s.write(current_pos);
  Serial.write("Continued");
}

void setup() {
  Serial.begin(9600);
  s.attach(9);
  pixy.init();
  while (!Serial);
  //test_board();
  s.write(current_pos);
}
void _servo(unsigned char side,int var){
  //by the % we get how "hard" we need to wip :D
  var = var - 90;
  if(side == 'L'){
	//Serial.write("LEFT");
	//90  180
	_percen = 90 + var;
	s.write(_percen);
  }else{
	//Serial.write("RIGHT");
	//0  90
	_percen = 90 - var;
	s.write(_percen);
  }
}
void loop() {
  static int i = 0;
  int j;
  uint16_t blocks;
  char buf[32];
 
  // grab blocks!
  blocks = pixy.getBlocks();
 
  // If there are detect blocks, print them!
  if (blocks)
  {
	i++;
	
	// do this (print) every 50 frames because printing every
	// frame would bog down the Arduino
	if (i%1 ==0)
	{
  	//sprintf(buf, "Detected %d:n", blocks);
  	//Serial.print(buf);
  	for (j=0; j= 0){
    	//  Serial.write("LEFT");
      	var = percentage / 0.4;
      	_servo('L',var);
    	}else if(percentage >= 60 && percentage <= 110){
      	//Serial.write("RIGHT");
      	var = (percentage - 60) / 0.5;
      	_servo('R',var);
    	}else{
      	//Serial.write("MIDDLE");
    	}
  	}
	}
  } 
 
}

代碼釋義

我將x的位置從Pixy轉換為0-100%,并由此了解球的具體位置。通過獲取球的位置,我可以調整伺服轉速。如果球的位置<=10%,伺服會轉得更快來維持平衡;如果在~40%附近,伺服會以很低的轉速來維持平衡。想要一直保持平衡是比較棘手的,我們可以改進算法以使其更加精確。

以下是一些有益于提升的建議:

? 嘗試多種算法
? 有多種類型的數學算法可以進行計算。我至少嘗試了兩到三種,但是最后決定選擇該算法。我建議您自己來編寫算法,以更好地掌握這種平衡的方法。

? 更好的硬件
? 對于本項目來說,沒有什么材料可稱得上是完美的,木材就更差得遠了。如果我擁有及時可用的資源,那我會選擇用金屬來建造它,這樣整個項目將會更加穩定和精確。

? 變得更快
? 我們如何做到使其更快地恢復平衡?我在這里使用了一個簡單的伺服。我們可以將其替換為UART或者AX-12之類的伺服,它們會強大、快速得多。速度也與算法有關。同樣,我建議您嘗試不同的算法,以找到適用于您的目的的算法。

有許多項目使用類似的概念來對平衡某物體。除了Pixy,您還可以將OpenCV與任何網絡相機一起使用來檢測目標和顏色。除了Processing,還有Max/MSP版本5。您可以使用距離傳感器、壓力傳感器等。因此,有多種方式可以幫助您對該項目進行提升,使其更加堅固、穩定和更快。

審核編輯黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2552

    文章

    51237

    瀏覽量

    754782
  • Arduino
    +關注

    關注

    188

    文章

    6472

    瀏覽量

    187355
收藏 人收藏

    評論

    相關推薦

    Sony偏振傳感器加持 Blackfly S工業相機突破視覺成像反光難題

    Q為什么采用傳感器偏振?A:視覺系統一直都在試圖克服玻璃、塑料和金屬等反光表面產生的動態或多余光線、反射、朦朧和眩光影響。TeledyneFLIR的BlackflyS機器視覺工業相機
    的頭像 發表于 12-27 17:02 ?363次閱讀
    Sony偏振<b class='flag-5'>傳感器</b>加持 Blackfly S工業<b class='flag-5'>相機</b>突破<b class='flag-5'>視覺</b>成像反光難題

    視覺AI之旅:一起探索 FiftyOne ——第二部分 入門指南

    /journey-into-visual-ai-exploring-fiftyone-together-part-ii-getting-started-14cca5adfcd3 ? ? 一,前言 上次我們介紹了《視覺AI之旅:一起探索 FiftyOne——第一
    的頭像 發表于 12-24 17:00 ?76次閱讀
    <b class='flag-5'>視覺</b>AI之旅:一起探索 FiftyOne ——<b class='flag-5'>第二部分</b>  入門指南

    松下MPS媒體制作平臺第七篇:視頻混合插件(第二部分)

    第七篇:視頻混合插件(第二部分) 視頻混合(Video Mixer)插件可以輕松進行主體鍵控,不受拍攝地點的局限,同時便于將多種視頻素材進行合成。 關于視頻混合的操作介紹,我們一
    的頭像 發表于 12-19 13:38 ?140次閱讀
    松下MPS媒體制作平臺第七篇:視頻混合<b class='flag-5'>器</b>插件(<b class='flag-5'>第二部分</b>)

    安森美機器視覺系統解決方案

    ,它還用于驗證數據矩陣碼、檢查食品包裝和讀取條形碼。機器視覺系統方案指南將全面介紹機器視覺系統方案及市場趨勢,本文為第二部分,將重點介紹系統描述、方案概述、系統實現。
    的頭像 發表于 11-14 09:53 ?277次閱讀
    安森美機器<b class='flag-5'>視覺</b>系統解決方案

    Air780EP硬件設計原理解析(第二部分

    ? 接下來,我們繼續學習第二部分。 3.3 電源供電 ? 3.3.1 模塊電源工作特性 在模塊應用設計中,電源設計是很重要的一部分。由于LTE射頻工作時最大峰值電流高達1.5A,在最大發射功率時會
    的頭像 發表于 11-06 15:06 ?243次閱讀
    Air780EP硬件設計原理解析(<b class='flag-5'>第二部分</b>)

    0.4mm層疊封裝(PoP)封裝的PCB組裝指南,第二部分

    電子發燒友網站提供《0.4mm層疊封裝(PoP)封裝的PCB組裝指南,第二部分.pdf》資料免費下載
    發表于 10-15 11:33 ?0次下載
    0.4mm層疊封裝(PoP)封裝的PCB組裝指南,<b class='flag-5'>第二部分</b>

    精密制造的革新:光譜共焦傳感器與工業視覺相機的融合

    在現代精密制造領域,對微小尺寸、高精度產品的檢測需求日益迫切。光譜共焦傳感器憑借其非接觸、高精度測量特性脫穎而出,而工業視覺相機則以其高分辨率、實時成像能力著稱。兩者的融合,不僅解決了傳統檢測方式在
    的頭像 發表于 09-26 11:47 ?365次閱讀

    求助,opa695的datesheet問題求解

    opa695的手冊上第14頁圖3 第一部分的電容是隔直作用。datesheet說第二部分的電容也是隔直作用。這里的直流是哪里來的?不是在第一部分就隔掉了嗎?我用TI的軟件tian90 仿真此圖
    發表于 09-13 07:00

    如何進行電源設計–第5部分

    電子發燒友網站提供《如何進行電源設計–第5部分.pdf》資料免費下載
    發表于 09-07 11:11 ?0次下載
    如何進行電源設計–第<b class='flag-5'>5</b><b class='flag-5'>部分</b>

    電源設計方法-第5部分

    電子發燒友網站提供《電源設計方法-第5部分.pdf》資料免費下載
    發表于 09-06 14:58 ?0次下載
    電源設計方法-第<b class='flag-5'>5</b><b class='flag-5'>部分</b>

    如何進行電源供應設計-第5部分

    電子發燒友網站提供《如何進行電源供應設計-第5部分.pdf》資料免費下載
    發表于 08-30 09:36 ?0次下載
    如何進行電源供應<b class='flag-5'>器</b>設計-第<b class='flag-5'>5</b><b class='flag-5'>部分</b>

    使用rt_thread_mdelay函數后出現hardfault的原因?

    !! \\r\\n\"); } // 線程中第二部分使用的延時,進入while循環立馬報錯 hw_ethernet_write(send_buf, sizeof(send_buf)); while
    發表于 07-16 07:07

    美國商務部長呼吁推動第二部芯片法案,助力全球半導體主導地位

    雷蒙多在參加英特爾IFS Direct Connect 2024代工活動時呼吁稱,為了實現美國成為全球芯片強國有必要進行聯邦補助。她提出了制定第二部《CHIPS法案》的必要性,以便繼續對半導體行業的國內行動提供支持。
    的頭像 發表于 02-25 15:56 ?786次閱讀

    如何校準ph傳感器 pH傳感器的校準方法

    對中的玻璃膜和參比電極之間的電勢差。pH值是一個十重要的參數,對于許多實驗室、工業和環境監測應用來說都是不可或缺的。然而,pH傳感器的準確性和可靠性需要經常校準以確保準確度和穩定性。 第二部分:pH
    的頭像 發表于 02-18 11:33 ?2192次閱讀

    TE Connectivity工業事業推出1000V高壓傳感連接,國產傳感器跨入1英寸時代

    板電容力傳感器,包含一個上層氧化硅板、一個中層氧化硅板和兩板間的空隙; 第二部分是一個微型的無線傳輸模塊,可用于完成植入傳感器、以及可穿
    的頭像 發表于 01-26 08:45 ?491次閱讀
    TE Connectivity工業事業<b class='flag-5'>部</b>推出1000V高壓<b class='flag-5'>傳感</b>連接<b class='flag-5'>器</b>,國產<b class='flag-5'>傳感器</b>跨入1英寸時代
    主站蜘蛛池模板: 在线精品国精品国产不卡| 成人永久免费视频网站在线观看| 国产精品久久久久久久人热 | 日本久久道一区二区三区| 村妇偷人内射高潮迭起| 亚洲国产精品99久久久久久| 久久精品国产99欧美精品亚洲| 97在线精品视频免费| 丝瓜涩涩屋黄瓜香蕉丝瓜| 久久er国产免费精品| 超碰免费视频公开观看| 亚洲第一综合天堂另类专| 美女洗澡脱得一二干净| 国产精品…在线观看| 在线不卡中文字幕| 日韩欧美高清一区| 久久精品热线免费| 福利啪啪吧| 在线免费观看亚洲视频| 色多多污版app下载网站| 久久本道久久综合伊人| 成人无码国产AV免费看| 一区在线观看在线| 天堂tv免费tv在线tv香蕉| 久久伊人青青| 国产亚洲精品久久77777| 99久久无码热高清精品| 亚洲女初尝黑人巨磁链接| 青青草原网址| 久久视热频这里只精品| 国产精品久久久久久免费播放| 777EY_卡通动漫_1页| 亚洲高清国产拍精品动图| 全是肉的高h短篇列车| 久久无码av三级| 国产亚洲精品成人a在线| jizz中国女人| 2020无码最新国产在线观看| 亚洲AV无码乱码国产麻豆穿越| 热の中文 AV天堂| 蜜桃视频无码区在线观看|