本文介紹了由樹莓派驅(qū)動的水下無人機原型的設(shè)計過程、開發(fā)和組裝操作。
我在探索頻道上看了很多關(guān)于發(fā)明家的節(jié)目,有一次我決定自己做一些有趣的事情,這樣一次就可以真正令人印象深刻和困難:一些電動機、控制器、處理、相機。買了很多有用(而且不是很有用)的東西后,我開始思考應(yīng)該開始什么樣的項目。最后我得出的結(jié)論是,有很多飛行和駕駛無人機,但不是關(guān)于水下無人機(哈哈,現(xiàn)在看來,我當時簡直大錯特錯)。
在網(wǎng)上沖浪后,我發(fā)現(xiàn)了幾個有趣的項目,但其中大多數(shù)要么處于開發(fā)階段,要么價格不便宜。
展望未來,我可以說我有一個可以游泳幾米深的工作原型,盡管它有著部分優(yōu)點和缺點。我不能斷言我終于有了一個易于控制的東西,或者可以做的不僅僅是平息我的工程師熱情的東西。但是這些東西的所有單元都能正常工作,我的錯誤和經(jīng)驗可以幫助某人創(chuàng)造出真正重要的東西(即使它只對他自己有意義),這一點在我看來是非常重要的。
由于做了大量工作,本文可分為以下幾章:
選擇組件
電調(diào)編程
樹莓派服務(wù)器配置
使用 Raspberry Pi 處理電動機
樹莓派手電筒控制
客戶端-服務(wù)器通信協(xié)議
安卓應(yīng)用
視頻流
屏幕和操縱桿控制
施工組裝和測試
結(jié)論
選擇組件
您將在下面找到用于創(chuàng)建設(shè)備的不同內(nèi)容的列表。
母板
在眾多控制器中,我選擇了Raspberry Pi 3B 。我不會為這個項目推薦類似 Arduino 的板,因為它不會管理如此復(fù)雜的任務(wù),因為需要控制至少 4 個電機、二極管、陀螺儀、從相機發(fā)送視頻流并同時接收并處理來自控制設(shè)備的命令。Raspberry Pi 3B 帶有用于 RJ-45 連接器的內(nèi)置 Wi-Fi 和以太網(wǎng),這無疑會幫助您完成所有這些操作。
聯(lián)結(jié)渠道
在水下傳輸數(shù)據(jù)總是很困難。水是一個很好的盾牌,因此,您可以忘記任何無線數(shù)據(jù)傳輸。所以沒有其他選擇。
在水下傳輸數(shù)據(jù)的能力。
水下數(shù)據(jù)傳輸?shù)乃俣取?/p>
通用性(它非常適合 Raspberry Pi 3B 和發(fā)射器)。
基地發(fā)射器
NEXX迷你路由器 有 3 個主要的傳輸選項:
嘗試將 Wi-Fi 天線從水中連接到陸地(在這種情況下,應(yīng)該使用實心線而不是雙絞線),但存在很多爭議點。
在兩個 Raspberry Pi 3B 之間創(chuàng)建一個客戶端-服務(wù)器橋連接(這將是合適的,但更昂貴且更麻煩)。
使用雙絞線將迷你路由器與 Raspberry 連接。這個選項被作為基礎(chǔ),因為它是最可靠、最快速和最便宜的。經(jīng)驗證明,這是一個相當不錯的選擇。
電動馬達
N2830/2212 1000KV
在測試了 3 種不同的電機后,我選擇了這個模型。你可能會問為什么?因為它足夠強大,它有第二個軸,所以你可以同時使用 2 個螺旋槳。一般來說,所有電機在水中正常運行,直到藻類或沙子進入電機內(nèi)部。如果您選擇高速且功率較小的電機,您會發(fā)現(xiàn)這些類型的電機并不是最適合水的。更便宜的電機也沒有達到預(yù)期。
控制板 (ESC)
非洲式電調(diào) (30A)
這也很簡單。它可以編程為正向/反向切換,30安培的功率對于被測電機來說應(yīng)該足夠了。
Afro ESC USB 編程工具
ESC 的編程工具。使用此設(shè)備,您可以上傳必要的固件。但實際上,這就是問題所在。我不得不等了一個半月。
7-30В 3А或類似
這非常適合我們的目的 - 它擁有兩個上述 LED,它還連接到 Raspberry 并允許您調(diào)整 LED 的亮度。
陀螺儀
MPU-6050
一個三軸陀螺儀/加速度計,將位置數(shù)據(jù)發(fā)送到樹莓。有一些數(shù)據(jù),但不是很有用?。
相機
RPi 相機 F
您可以使用任何其他本機 Raspberry Pi 相機。主要條件是它應(yīng)該通過FFC連接,而不是USB。視頻流一直是一個大問題(延遲、編碼),或者更確切地說,這不是問題,只是需要很多時間才能開始。
操縱桿
iPega PG-9055 - 額外的控制助手,如果你的手濕了,相信我,他們會濕的,你可以使用這個設(shè)備控制無人機。
電池
Turnigy 2200mAh 3S 30C
再次進行了很多測試。18650 電池不適合,因為控制器具有 25A 的放電率,這對于峰值負載條件下的整個系統(tǒng)來說是不夠的(是的,幾塊電池在使用后就死了)。可以嘗試使用 6 節(jié)電池并獲得 50A,但難度更大。這樣的直流電不能使用電線傳輸(不要忘記大約 100 m 的距離)。所以我買了 Li-Po,它優(yōu)雅地完成了任務(wù),完美地融入了外殼。
驅(qū)動螺旋槳(主要問題之一)
電纜接頭
還有外殼、連接器、電線和其他東西。
電調(diào)編程
不幸的是,全新的 Afro ESC 只能向一個方向旋轉(zhuǎn),因此您需要更新固件。
現(xiàn)在正確連接電線很重要,否則其中一個設(shè)備可能會發(fā)生故障。
在這里,您將找到一些有關(guān)如何正確連接電線的簡短說明:
一對紅色和黑色粗線,末端有一個公連接器。是通用電源。在這種情況下,提供的電源將是 12V 和所需的安培數(shù)。
紅色——輸入端口“+”。
黑色 – 輸入端口“-”。
一根粗紅黑黃的電線負責(zé)電機電源。我們現(xiàn)在不會連接它們,但稍后我們會將這些電線連接到具有相似顏色的電動機的電線上。
細線負責(zé)控制電路板。
控制信號通過黃線傳輸。
紅線輸出5v(我沒用過)。它們有幾種不同的類型,您可以在此處了解更多信息。
黑線應(yīng)連接到端口“-”。
因此,讓我們將細線連接到鏈接器:將黑線(減號)和黃線(信號)連接在一起。請勿觸摸或?qū)⒓t線連接在一起。下一步——為電路板提供電源(黑色和紅色厚輸入)。我使用了這個靜態(tài)電源單元,但任何其他具有類似特性的電源都可以(12V,2+A)。
打開固件更新工具并選擇:
端口:選擇連接的 USB 端口。幸運的是,只有很少的選擇。
波特率:9600。
控制器:基于 atmega 8 的無刷 ESC(8kB 閃存)。
選擇下載的固件文件。單擊“運行”按鈕并祈禱:)
很快固件就會成功上傳到電調(diào),一切準備就緒。
使用 Raspberry Pi 處理電動機
一件重要的事情是,如果您正在構(gòu)建一個嚴肅的項目,而不僅僅是為了好玩,您不必使用 Raspberry PI 進行實時工作,例如電機處理。PWM 生成不會如您所愿,因此請使用單獨的板,例如 Arduino 進行控制。但是對于我的項目來說,使用 Raspberry 就足夠了。感謝Fabio Balzano在本文下方的評論中對此進行了解釋。
所以,讓我們開始我們工作中最有趣的部分——我們應(yīng)該為 Raspberry Pi 控件編寫代碼。找到項目文件夾~ /drone并在那里安裝 PiGpio 庫:
現(xiàn)在我將為您提供一些有關(guān) ESC 控制的簡短信息。我們應(yīng)該將某個頻率傳輸?shù)郊汓S線(控制)(參見“ESC 編程”部分)。afro_nfet_besc30_r1固件的范圍是1100-1900 ,其中值 1500 是平靜狀態(tài),1100 最大反向,1900 最大正向。創(chuàng)建文件engines.js并將JS代碼添加到其中:
//Calm state constant
const SERVO_ZERO = 1500;
//Connect 'pigpio' library
const Gpio = require('pigpio').Gpio;
// Define 4 motors using Raspberry pins (this process will be described below)
const servo1 = new Gpio(22, {mode: Gpio.OUTPUT});
const servo2 = new Gpio(10, {mode: Gpio.OUTPUT});
const servo3 = new Gpio(9, {mode: Gpio.OUTPUT});
const servo4 = new Gpio(27, {mode: Gpio.OUTPUT});
//Set each board into the state of "calm"
servo1.servoWrite(SERVO_ZERO);
servo2.servoWrite(SERVO_ZERO);
servo3.servoWrite(SERVO_ZERO);
servo4.servoWrite(SERVO_ZERO);
//After that you should enter the value into ESC
module.exports.engines = {
leftEsc: (value) => {
servo1.servoWrite(value);
},
rightEsc: (value) => {
servo2.servoWrite(value);
},
topLeftEsc: (value) => {
servo3.servoWrite(value);
},
topRightEsc: (value) => {
servo4.servoWrite(value);
}
}
為了使用此代碼,您應(yīng)該在app.js中編寫:
實際上這部分代碼servo1.servoWrite()負責(zé)控制。1100 - 電機反向轉(zhuǎn)動,1900 - 最大正向轉(zhuǎn)動。
在這里您可以找到 Raspberry pin 方案:
簡而言之,你應(yīng)該使用橙色的 GPIO。一對由 GPIO 10 和 GPIO 22 組成,第二對是 GPIO 9 和 GPIO 27(使用 27、22 和 10 -9 會更合乎邏輯,但我在焊接時沒有考慮到,所以我不得不更改它)。如果考慮序數(shù)(它們是灰色的),那么這些是 13、15 和 19、21 聯(lián)系人。您應(yīng)該將 ESC 的黃線連接到它們中的每一個,負號應(yīng)連接到一個 GND,例如 39 觸點。現(xiàn)在讓我們連接其他的東西。
將Afro ESC的電源線(紅色和黑色)連接到單獨的電源單元(12v),將電機連接到黃-紅-黑粗線,現(xiàn)在您可以嘗試它是如何工作的。
陀螺儀
連接示例:
VCC到引腳 1 (3.3V PWR)
GND到任何負號
SCL到引腳 5 (GPIO 3)
SDA到引腳 3 (GPIO 2)
正確連接一切并不難,如果談?wù)撥浖鼤唵巍行畔⒍伎梢栽诨ヂ?lián)網(wǎng)上輕松找到。在這里你應(yīng)該使用i2c-bus и i2c-mpu6050庫。將它們安裝到項目中:
創(chuàng)建文件gyroscope.js并添加:
const i2c = require('i2c-bus');
const MPU6050 = require('i2c-mpu6050');
const address = 0x68;
const i2c1 = i2c.openSync(1);
const sensor = new MPU6050(i2c1, address);
var reading = false;
var sensorData = {};
module.exports.gyroscope = {
getData : () => {
return JSON.stringify(sensorData);
},
readRotation : () => {
sensor.readRotation(function (err, rot) {
if (err) {
console.log(e);
return;
}
console.log(rot);
});
},
readSensor : () => {
if (!reading) {
reading = true;
}
sensor.read(function (err, data) {
reading = false;
if (err) {
console.log(err);
} else {
sensorData = data;
}
});
}
}
以一定的頻率運行 readSensor 方法,并從 getData 獲取上次調(diào)查的數(shù)據(jù)。會有很多位置分量(x,y,z,a)。我沒有足夠的時間來定義這些組件的含義,因為我有更重要的任務(wù)——處理。我知道調(diào)查它會更好,但結(jié)果的相關(guān)性對于當時的這個項目來說并不是很重要。
樹莓派手電筒控制
所以,讓我們繼續(xù)增加我們無人機的功能,現(xiàn)在我將向您介紹 LED。我有兩個XHP-50 LED 和 LED 脈沖驅(qū)動器(見上表)。它們很容易過熱,因此我建議您將它們與散熱器一起使用。你可以在同一個網(wǎng)上商店找到它們,最主要的是不要忘記尺寸。因此,將 LED 連接到散熱器上,使用電線將一個 LED 的負極焊接到另一個 LED 的正極(它們已標記)并焊接 - 和 + 線:
控制器和焊接:
電源 - 12V 正負,您可以使用與電機相同的輸入。LED 連接器應(yīng)連接到先前焊接的連接器,L- 到負,L+ 到正。在這種情況下,我們不需要模擬觸點(A),所以不要連接它。
現(xiàn)在我們對數(shù)字輸入(D)和接地輸入(G)感興趣。現(xiàn)在您應(yīng)該將數(shù)字輸入 (D) 與 GPIO11 連接,將接地輸入 (G) 與 GND 連接(您可以在 Raspberry 上選擇任何您想要的)。
現(xiàn)在讓我們回到 Raspberry Pi,創(chuàng)建一個文件light.js并添加以下內(nèi)容:
//Again the same library
const Gpio = require('pigpio').Gpio;
//Create Gpio for your pin
const light = new Gpio(11, {mode: Gpio.OUTPUT});
// You can set the value starting from 0 to 255 (I have found this info in the LED driver instructions)
const LIGHT_MIN = 0;
const LIGHT_MAX = 255;
//It will be needed for calculations
const LIGHT_DIAPASONE = LIGHT_MAX - LIGHT_MIN;
// Turn off the LED (the system starts with the LEDs turned on to maximum)
light.pwmWrite(LIGHT_MIN);
//Export work methods
module.exports.light = {
on: () => {
//Transmit the value 255 to the driver
light.pwmWrite(LIGHT_MAX);
},
off: () => {
// Transmit the value 0 to the driver
light.pwmWrite(LIGHT_MIN);
},
//Here will be the percent value from 0 to 100
set: (val) => {
if(val < 0 || val > 100) return;
//Calculate the value based on the percentage
val = Math.round(LIGHT_MIN + LIGHT_DIAPASONE / 100 * val);
console.log("Light:"+val);
//Transmit the value to the driver
light.pwmWrite(val);
}
}
我們可以使用app.js或引擎運行它:
客戶端-服務(wù)器通信協(xié)議
正如您從樹莓派的初始配置中了解的那樣,通信將使用套接字連接進行。您還需要一些在服務(wù)器和客戶端中硬編碼的命令集。當我自己做所有事情時,我決定使用我自己的格式,因為存在的選項與重量/可讀性標準不太匹配。因此,讓我們在考慮控制模型的情況下進行構(gòu)建,在這種情況下,它將是 Android 智能手機。
在這里你可以找到模型本身(應(yīng)用程序?qū)⒃谙旅婷枋觯?/p>
畫面分為兩部分。左邊部分代表水平軸(前后),右邊部分代表垂直軸。如果您將手指放在某個區(qū)域,這將被視為參考點并由一對電機控制,但它也是一個“平靜”點。
如果您的手指垂直向上滑動,兩個電機的正向旋轉(zhuǎn)速度將隨著功率從 0 到最大值(取決于接觸點到當前點的距離)緩慢增加。
如果您向下滑動手指,兩個電機將以一定速度反向旋轉(zhuǎn),該速度取決于與接觸點的距離。
如果您向右滑動手指,左側(cè)電機將向前旋轉(zhuǎn),而右側(cè)電機將反向旋轉(zhuǎn)。所以,實際上,我們需要知道偏離接觸點的角度(其中top=90,bottom=90,right=0,left=180)和速比——手指到接觸點的距離(從 0 到 100)。對象命令應(yīng)如下所示:
С - (command),任何命令都應(yīng)該以這個字母開頭;
: - 鍵值分隔符;
; - 鍵值對的分隔符;
L——表示觸摸是在屏幕左側(cè)進行的;
R - 表示觸摸是在屏幕的右側(cè)進行的;
LIGHT——代表光 :)
A ——ANGLE,偏差角;
V——價值,某物的價值。
因此,第一個命令聽起來像:“一對水平電機,方向 - 45 度(左電機處于最大速度(但最大值為 35%,基于 V),右電機停止),旋轉(zhuǎn)速度為 35%最大限度”。
第二條命令:“垂直電機對,方向 - 0 度(左電機最大轉(zhuǎn)速,右電機反向最大轉(zhuǎn)速),最大轉(zhuǎn)速”。
第三個命令:“以 50% 的亮度打開燈”。
當您通過套接字在鍵值塊中為每個值更改發(fā)送單獨的命令時,這就是它的工作原理。然后神奇地變成控制板上的命令。解釋這些數(shù)據(jù)的轉(zhuǎn)換會很無聊。所以大家可以試著自己研究一下,掌握控制器。
安卓應(yīng)用
最后,我們已經(jīng)到了嘗試創(chuàng)建控制器的時刻。一般來說,通信的意思是:“點擊屏幕上的東西——將值傳輸?shù)椒?wù)器”。我會寫一些關(guān)于應(yīng)用程序的內(nèi)容。沒有什么不尋常或特別具有挑戰(zhàn)性的,所以我不會發(fā)布所有代碼。如果您愿意,您可以訪問存儲庫并找到所需的信息。我還想指出,我沒有使用任何新奇的模式,如 MVVM、MVP、VIPER 等,因為我需要在最短的時間內(nèi)工作的應(yīng)用程序。UI 盡可能簡單。
首先,您應(yīng)該創(chuàng)建一個帶有狀態(tài)顯示視圖的活動。布局如下:
視頻顯示層(播放器封裝在一個片段中)。
JoystickView層是一個自定義視圖,其中dispatchTouchEvent方法被覆蓋,它處理手指在屏幕上的按下和移動。它將 UI 線從按下點繪制到當前狀態(tài)。多點觸控支持是強制性的,因為控制是用兩根手指執(zhí)行的。
一個帶有 Raspberry Pi 當前溫度的 TextView 的層(如果出現(xiàn)問題并且它開始過熱,您可以在它關(guān)閉/燃燒之前停止使用它)。幸運的是,我的 Raspberry 沒有發(fā)生這種情況。
陀螺儀顯示的數(shù)據(jù)層。在標簽值對中設(shè)置的 TextView。它顯示來自陀螺儀的“原始數(shù)據(jù)”。計劃處理這些數(shù)據(jù),但我沒有足夠的時間來做它并發(fā)明一個很酷的顯示它。
一個 SeekBar 層 - LED 控件,一個簡單的元素,它在拖動時將值從 0 更改為 100。
施工組裝和測試
現(xiàn)在我們已經(jīng)到了下一步——我們需要找到一些東西,我們可以放置上面提到的所有東西(哈哈)。在設(shè)計和組裝階段,我的朋友 Sergey 給了我很多幫助。實際上,他找到了一個外殼,做了一個鐵平臺,我們可以將電機安裝在不同的位置,然后將它們放在一起:
我先說 6 個電機的原型會更有效率,但對我來說,即使有 4 個電機也很難支持原型,這就是為什么決定用 4 個電機測試原型的原因。
首先,我們決定測試外殼的結(jié)構(gòu),這就是為什么我們沒有將所有電子設(shè)備都放入外殼中,而是簡單地將電機連接到平臺上,兩對雙絞線從電調(diào)發(fā)送信號到每個他們(ESC在測試期間一直留在內(nèi)陸)。
結(jié)論
所有這一切的主要結(jié)果是,我獲得了構(gòu)建此類單元和系統(tǒng)的豐富經(jīng)驗。在開發(fā)過程中使用了大量不同的設(shè)備,其管理比看起來要容易得多。四電機原型并沒有預(yù)期的那么好——控制這樣的設(shè)備非常困難。最好使用四個垂直電機和至少兩個水平電機。同時,它應(yīng)該用陀螺儀穩(wěn)定,因為對于人類來說,它很難完美地控制它,需要幫助(飛行無人機也是如此)。
此外,所有在售的電機都會被沙子和其他東西堵塞,所有單元都可能因腐蝕而損壞(這是合乎邏輯的),不適合此類項目。我沒有找到水下馬達(可以表明它是防水的,但它只能在 1-2 米的深度正常工作)。在這個項目之后,任何智能家居似乎都沒有那么復(fù)雜了。服務(wù)器,中繼命令,僅此而已。您需要的主要是有時間和愿望去做。其余的將隨之而來。
-
無人機
+關(guān)注
關(guān)注
228文章
10336瀏覽量
179609 -
樹莓派
+關(guān)注
關(guān)注
116文章
1698瀏覽量
105522
發(fā)布評論請先 登錄
相關(guān)推薦
評論