2019-9-9 11:31 上傳
點擊文件名下載附件
步驟4:機械裝配
你可以自由地用你自己的創造力去嘗試,把軸承和支撐部件連接起來,這兩個軸由鋁型材制成。
同時激發你的創造力,設計支持步進電機。NEMA17是一個標準,看看數據表中的電機機械規格,確保你設計了一個很好的支架,并用正確的螺栓將其固定在上面。
您可以設計支架并將其三維打印,例如第一張圖片,也可以用鋁制作支架。你需要有人的幫助,有一個數控銑床這樣做。
你將需要相當精確和明智地使用你的卡尺來設計這些零件。
小提示:當你設計兩個連接在一起的部件時,我建議你在兩個部件之間留有0.2毫米或0.1毫米的公差。
從圖片中獲取主要想法,并使用您最喜歡的cam軟件進行自己的設計,一旦您將三維模型通過電子郵件發送到您當地的fablab,他們將非常樂意使其成為現實。
你可以在這里找到你當地的工廠實驗室。
步驟5:使用app inventor開發應用程序
我用一個叫做app inventor的偉大的在線生成器設計了這個應用程序。
你可以在這個鏈接上找到這個應用程序。(你可以用你的谷歌賬號登錄)
或者您可以在下面下載.aia文件并將其導入到app inventor中。
我會解釋一下這個應用程序:
1)重要的初始位是通過藍牙將應用程序連接到機器人。
有一個帶有藍牙標志的列表選擇器。當用戶單擊它時,將顯示可用的藍牙列表,用戶可以從HC-06連接到藍牙客戶端,該客戶端實際上是藍牙網絡。
顯示一條消息,說明連接已發生,并顯示以下消息,告訴用戶打開電機以向系統供電。
2)我想評論的另一點是命令。
-應用程序將通過藍牙向Arduino發送不同的單個字符。
-我使用了簡單的大寫字母:例如,字母“d”是將x軸向后移動的命令。同時,此命令還會將應用程序上的小麥克風圖標(ImageSprite1)向后移動4像素。
-一些命令是:
A→Y軸前進,麥克風圖標4像素前進
O→家
“G”→將當前X和Y位置保存在插槽1中
“H”→從插槽1 X和Y位置加載,并將電機和麥克風圖標移到那里
3)用戶可以在250px x 250px畫布上拖動小麥克風圖標,無需使用箭頭即可移動電機。這是一個有趣的特性,它是由一個名為imagesprite1.dragged的長邏輯塊完成的。
-它獲取在畫布上拖動圖像的像素位置。
-當250 px的最大值對應于72°電機的62次運動以到達鋁直線導軌的末端時,進行線性比例。這個比例允許Arduino知道馬達必須向前/向后旋轉到圖標被拖動的相應位置的次數。
-例如,如果系統最初處于起始位置,則圖標位于x=0px和y=0px
-用戶拖動X=70px和Y=100px位置的圖標
-比例后,電機運動為x1=17和y1=24
-一個類似“.17,24*;”的命令字符串被發送到hc-06
-Arduino固件隨后將解析此字符串并相應地移動電機。這意味著X軸電機將向前旋轉17倍72°,Y軸電機將向前旋轉24倍72°。
小心!為了避免在拖動圖像時反彈,并確保在用戶實際釋放拖動圖標時執行正確的命令,我還必須插入塊imagesprite1.touchup
-在此塊中,發送一個簡單的“u”字符,以確保當Arduino找到“u”字符時,它將執行上一個最終命令字符串,但忽略上一個跳轉的字符串:
例如:“.12,19*;.14,22*;.17,24*;u”要執行的正確命令是“u”之前的命令,也就是說“.17,24*”,在有兩個彈跳接觸之前。我必須把這個插進去,以避免彈跳的接觸,這是混亂的一切。
我希望通過這個解釋,你能更清楚地看到應用程序中的邏輯塊。不過,你想學多久就學多久。你在下面找到.aia文件。或者只是安裝它并下載.apk文件。
Mic Roller.rar
(4.98 MB, 下載次數: 7)
2019-9-9 11:43 上傳
點擊文件名下載附件
GraphicBluetoothstepmotor_copy.rar
(1.89 MB, 下載次數: 8)
2019-9-9 11:43 上傳
點擊文件名下載附件
步驟6:Arduino固件
下面是所有C編程愛好者的部分。請隨意下載Arduino代碼,您可能會注意到某些部分可能會被修改和簡化,但它仍然工作得很好。
此代碼中使用的最重要的庫是laurb9的步進驅動程序庫,您可以在github上的以下鏈接中找到它
https://github.com/laurb9/steperdriver網站
我們最初使用這個庫定義步進電機,然后旋轉它們。
另一個重要的庫是Arduino Uno的EEPROM庫,用于保存X、Y和Z軸的位置。
我已經盡力盡可能多地引用代碼,給出每一位的所有可能的解釋。不過,下面我也將進一步評論一些內容。
1)在void setup()部分中,代碼只執行一次。在Arduino代碼的以下部分中,檢查是否存在串行通信,直到用戶發送ON命令,才發生任何事情。用戶按下后,等待的下一個命令是:
O→主命令
“Z”→“關閉”命令
do //this cycle waits until someone click the ON button on the app{ if(Serial.available()>0) { state=Serial.read(); Serial.println(readString); //prints string to serial port out } }while(state!='V'); //system ON commanddigitalWrite(8, LOW); do //this cycle waits that the user push either Home Button or OFF button { if(Serial.available()>0) { state=Serial.read(); Serial.println(readString); //prints string to serial port out } } while((state!='O')&&(state!='Z'));
2)-你還記得在應用程序中我們曾經發送命令'd'來向后發送馬達嗎?-你還記得我們把Y限位開關連接到插腳10和GND?最初,我們檢查Y電機是否能夠實際后退:如果按下引腳10上的限位開關,Arduino將讀取GND,即使在應用程序上按下后退按鈕,也不會發生任何事情。如果不按下限位開關,我們只需用簡單的步進指令將電機旋轉72°。旋轉(72)并減小1的y變量。if(limitYstate==HIGH) { if(c == 'B') //Y motor backward { stepperY.rotate(72); //the value is not negative because I mounted the motors upside-down in my assembly, sorry delay(5); Y--; Serial.println("Y value, "); Serial.println(Y); Serial.println("Y motor backward"); readString=""; } }
3)這是一個難點,基本上我們在這里捕獲用戶拖動應用程序上的麥克風圖標時發送的字符串,然后我們解析這些數據。例如,也就是說,我們將子字符串轉換為整數:x=“17”變成xm=17y=“24”變為ym=24在這個過程中,我們將每個字符串加載到緩沖區數組中,最后使用atoi()命令獲取整數值。你還記得拖動麥克風徽標時應用程序中的彈跳問題嗎?好吧,電機不會移動,直到在序列上讀到字符“u”,然后電機才會根據最后的xm和ym值旋轉。
if (c == ';') // character ; means that the user has dragged the microphone icon on the app { Serial.println(); Serial.print("captured String is : "); //we have captured the string with the X Y Z values, now we need to parse it and elaborate it, the following commands are for parsing Serial.println(readString); //prints string to serial port out, used for debugging ind1 = readString.indexOf('.'); //finds location of . ind2 = readString.indexOf(','); //finds location of , XString = readString.substring(ind1+1, ind2); //captures the string between charactes . and , ind3 = readString.indexOf('*'); //find location of * which delimits the end string YString = readString.substring(ind2+1, ind3); //captures the string between charactes , and * char buf1[XString.length()+1]; //create a characters array long as substring X XString.toCharArray(buf1, XString.length()+1); //load string X in the array buf1 char buf2[YString.length()+1]; //create a characters array long as substring Y YString.toCharArray(buf2, YString.length()+1); //load the string Y in array buf2 Xm = atoi(buf1); //convert the string in arra buf 1, which is a character with the value of X in an integer Ym = atoi(buf2); //convert the string in arra buf 2, which is a character with the value of Y in an integer readString=""; //clears variables for new input XString=""; YString=""; Serial.print("X = "); //we print everything on the serial monitor for debugging Serial.println(X); Serial.print("Y = "); Serial.println(Y); Serial.print("Xm = "); Serial.println(Xm); Serial.print("Ym = "); Serial.println(Ym); } if (c == 'U') //move the motors in the position of the X Y values read from the app movement { Serial.print("X = "); Serial.println(X); Serial.print("Y = "); Serial.println(Y); Serial.print("final Xm = "); Serial.println(Xm); Serial.print("final Ym = "); Serial.println(Ym); stepperX.rotate(-72*(Xm-X)); delay(5); stepperY.rotate(-72*(Ym-Y)); delay(5); X=Xm; Y=Ym; readString=""; }
finale4.rar
(3.12 KB, 下載次數: 5)
2019-9-9 11:48 上傳
點擊文件名下載附件
步驟7:結束
祝賀你!如果你到了這里,你可以好好拍一下自己的肩膀。如果你是一個音響工程師或音樂家,你可能也節省了一點錢,因為藍牙控制的麥克風放置機器人可能是相當昂貴的。我希望這個項目能激勵你做許多類似的其他或升級這個。謝謝你的支持!