如何在多軸機裝遙控的LED航燈?

How to DIY remote control LED light to your multicopter?

請先看以下完成品的片。可遙控開關,改變閃光效果,效果式樣也可以自定。如果你也想DIY到你的多軸機上,只要小於HK$100,一些焊接技巧和簡單的編程知識。

需要的材料如下:

WS2812 LED
WS2812 燈條
SparkFun-Pro-Micro
SparkFun Pro Micro (Arduino)

關於WS2812

我以為LED燈條就是LED燈條啦,但原來它們有很多種,甚麼WS2801, WS2811 和 WS2812,而我們要用的是WS2812,因為無論在接線和編程上它都比較簡單方便。

通常WS2812都是以一米為單位賣的,例如你隻四軸機想裝四條燈條,你可以買一條回來自己剪開便好了。

WS2812只有三條接線,5v電源,地線和數據線。要注意數據的方向,燈條上有箭頭指示。數據線要焊在DIN上, 如果焊錯了在DOUT,燈條是不會著的。

How to wire WS2812 LED


關於電源

你需要提供5v電源給Arduino和LED燈條。你可以用獨立電源或由多軸機電池取電。多軸機電池一般由7v-21v不等,所以必須降壓才可接上,否則你會馬上燒掉Arduino和燈條

不要由receiver,flight controller取電。如果你使用了大量的LED,receiver和flight controller都沒有足夠的電流可以提供,最壞的情況可使你失去愛機。

如果已經接上了燈條,不要單獨用USB接上Arduino,要先接上5v電才插USB,否則可能會燒了Arduino。

如果用降壓,也要知道它可提供的電流。每粒LED使用60mA電流,例如一條一米的燈條有60粒LED,60 x 60mA = 3600mA = 3.6A,要確保你的降壓板能提供3.6A電流而不會過熱燒掉。否則便要滅少LED的數量。

 每一顆LED用60mA電(紅綠藍各20 mA)

How to wire WS2812 LED and Arduino


關於Arduino

Arduino是控制LED燈條如何閃動的控製器,如果你沒有接觸過Arduino,可以看看它的網站,有很清楚的教學,基本的如何使用就不在這裡說了。

Arduino有很多版本,我使用了SparkFun Pro Micro,因為它細,而且有USB頭,不用FTDI,比較方便。

淘寶有很多這個版本的複製品,名稱都不一樣,文件更不用說了。找了好一回才知道原版是SparkFun Pro Micro,也找到了清楚的文件,使用起來也確定些。(對不起,我有想過買原版的,但運費貴過塊版,實在買不下去。)


LED data pin連接Arduino

我用了pin9-6連接4條LED,可以根據需要連接不同數量的燈條,pin位也可以任意,編程時對應輸出的pin位就行了。還要加上470Ω電阻,以保護Arduino。
How to wire WS2812 LED Arduino and data line




關於遙控

我們可以用遙控來開關LED,改變顏色,閃光效果等。我用的receiver是FrSky X8R,把channel12連到Arduino的A0 pin,同樣地channel和pin位沒有硬性規定,視乎你的需要而改變,編程時應改動就好了。

連接-WS2812-LED-Arduino-FrSky-X8R

我設定了channel12到遙控的TRN switch,這個鍵會自動回彈,剛好可用來每撥一次改變LED到下一個的顯示模式。

FrSky-TH9X-TRN-switch


WS2812-led-arduino-wiring
Arduino接線完成圖
LED 接線測試中
LED 接線測試中

在Arduino編程控制WS2812

我們已完成了硬件的連接,可以看看如何加入軟件,使LED做事了。

控制LED,有兩個很好用的library:

 如果你還沒有安裝Arduino的軟件,可以先看看入門篇

如果你用SparkFun Pro Micro,可以跟這裡裝driver

我用的是FastLED,由它的example中找了一些合適的再作修改,得到以下的程式:

[cpp]
#include <FastLED.h>

#define LED_TYPE WS2811
#define COLOR_ORDER GRB
#define BRIGHTNESS 255
#define FRAMES_PER_SECOND 120

#define LED_TOP_PIN 6
#define LED_LEFT_PIN 8
#define LED_RIGHT_PIN 7
#define LED_BACK_PIN 9
#define RC_PIN A0

#define LONG_LEDS_NUM 12
#define LEDS_NUM 8

CRGB leds_top[LONG_LEDS_NUM];
CRGB leds_left[LEDS_NUM];
CRGB leds_right[LEDS_NUM];
CRGB leds_back[LEDS_NUM];

void setup() {
delay(3000); // 3 second delay for recovery
FastLED.addLeds<LED_TYPE, LED_TOP_PIN, COLOR_ORDER>(leds_top, LONG_LEDS_NUM).setCorrection(TypicalLEDStrip);
FastLED.addLeds<LED_TYPE, LED_LEFT_PIN, COLOR_ORDER>(leds_left, LEDS_NUM).setCorrection(TypicalLEDStrip);
FastLED.addLeds<LED_TYPE, LED_RIGHT_PIN, COLOR_ORDER>(leds_right, LEDS_NUM).setCorrection(TypicalLEDStrip);
FastLED.addLeds<LED_TYPE, LED_BACK_PIN, COLOR_ORDER>(leds_back, LEDS_NUM).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(BRIGHTNESS);

pinMode(RC_PIN, INPUT);
}

// List of patterns to cycle through. Each is defined as a separate function below.
typedef void (*SimplePatternList[])();
SimplePatternList gPatterns = { off, flash, off, police };

uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current
uint8_t gHue = 0; // rotating “base color” used by many of the patterns
int pulse_light = LEDS_NUM-1;
int leds_pos = 0;
int rc;
int rc_high = true;

void loop() {

rc = pulseIn(A0, HIGH, 25000);

leds_pos ++;
leds_pos = (leds_pos > 100) ? 0 : leds_pos;

// Top LED effect
topEffect();

// Call the current pattern function once, updating the ‘leds’ array
gPatternsgCurrentPatternNumber;

// pulse light in last LED of arms
pulse();

// send the ‘leds’ array out to the actual LED strip
FastLED.show();
// insert a delay to keep the framerate modest
// FastLED.delay(1000 / FRAMES_PER_SECOND);

// do some periodic updates
EVERY_N_MILLISECONDS( 20 ) {
gHue++; // slowly cycle the “base color” through the rainbow
}
EVERY_N_SECONDS( 10 ) {
// nextPattern(); // change patterns periodically
}

// RC control
if (rc > 1500 && !rc_high) {
rc_high = true;
nextPattern();
}
if (rc < 1500 && rc_high) {
rc_high = false;
}

}

#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0]))

void nextPattern()
{
// add one to the current pattern number, and wrap around at the end
gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns);
}

void topEffect()
{
// a colored dot sweeping back and forth, with fading trails
fadeToBlackBy( leds_top, LONG_LEDS_NUM, 30);
int pos = beatsin16(40, 0, LONG_LEDS_NUM);
leds_top[pos] += CHSV( gHue, 255, 192);
}

void off()
{
for (int i = 0; i < LEDS_NUM; i++) {
leds_left[i] = CRGB::Black;
leds_right[i] = CRGB::Black;
leds_back[i] = CRGB::Black;
}
}

void flash()
{
fadeToBlackBy( leds_left, LEDS_NUM, 50);
fadeToBlackBy( leds_right, LEDS_NUM, 50);
fadeToBlackBy( leds_back, LEDS_NUM, 50);
if (leds_pos < pulse_light) { leds_left[leds_pos] = CRGB::Red; leds_right[leds_pos] = CRGB::Blue; leds_back[leds_pos] = CRGB::White; } } void police() { CRGB c1 = CRGB::Red; CRGB c2 = CRGB::Blue; CRGB c3 = CRGB::White; if (leds_pos > 50) {
c1 = CRGB::Blue;
c2 = CRGB::Red;
c3 = CRGB::White;
}
if ((leds_pos % 5) == 0) {
c1 = c2 = c3 = CRGB::Black;
}
for (int i = 0; i < pulse_light; i++) {
leds_left[i] = c1;
leds_right[i] = c2;
leds_back[i] = c3;
}

}

void pulse()
{
if ((leds_pos % 50) == 0) {
leds_left[pulse_light] = leds_right[pulse_light] = leds_back[pulse_light] = leds_top[0] = CRGB::White;
} else {
leds_left[pulse_light] = leds_right[pulse_light] = leds_back[pulse_light] = leds_top[0] = CRGB::Black;
}
}
[/cpp]

下載NavLED.ino

下載後,修改一下pins位,燈的數量,以配合你硬件的設定,再上傳到Arduino執行便可以了。我只寫了兩個燈效,你有興趣可以輕易地修改或增加自己的燈效。

Sky Hero Spy試機,用錯frame type,一飛即反

剛剛砌好隻SkyHero Spy,立刻試機,但一飛即反!

起初以為是電機的次序錯了,又以為是方向錯了,又檢查了螺旋槳方向,全部無問題。

install firmware (Y6 frame),再做accelerometer calibration,再飛,再死。




 

imgres

原來我的frame type是Y6B,必須在Frame Type選Y6B。

 

Screen Shot 2015-10-06 at 2.25.52 am

選好了就成功了。




後來發現在Full Parameter List選Download Param File,把3DR Y6的設定載入,再自己調整不適合的會更方便。

Screen Shot 2015-10-06 at 1.43.32 am

 

Y6的螺旋槳應如何安裝?

How to set up Y6 props and motors?

1)摩打轉動的方向

這個星期在砌Sky-Hero SPY 600,SPY是一部Y6機,費了一番功夫在它的摩打轉向與螺旋槳上。

4DFD1A70-0904-488F-8FE4-20587693E619

由於都是Y6,所以跟著上面3DR Y6這張說明去調6個摩打。如圖以為要setup三個順時針及三個反時針的摩打,但裝好一試便知道錯了。它們都向同一個方向轉,負負得正嘛,反時針的摩打把它反轉裝,它變回順時針轉了!所以,所有的摩打都要順時針轉,裝好了便自然得到以上的結果了。原本很簡單的事,被我復雜化了。裝好,焊好了的摩打都要打開再焊,真的想殺人哦。

2)槳座問題

我買的是MT2814,是一對買的。很體貼的是正反槳座,給四軸用是剛剛好的,但給Y6就有問題了。於由6個摩打都向順時針轉,所以全部都應該用反槳座,使我有一半的槳座要再買了。

T-motor MT2814 710KV

T-motor CW & CWW prop adapter

3)螺旋槳的方向問題

還有,反轉了的摩打,螺旋槳會跟著反轉嗎?不是!所有螺旋槳都應該label向上,上面裝正槳,下面裝反槳就是了。

Building Sky-hero SPY 600
上下摩打向同一個方向轉,錯了!
Sky-hero Y6 MT 2814 motors and ESC
小心翼翼地調好方向又貼上labels,全都白費。

比較APC 12×4.5 MR 與 13×4.7 SF槳

試裝APC13吋槳上QAV500成功,做了一次簡單的測試,轉用13″槳是否有好處?

震動率:

左面的13″槳明顯地比右面的12″槳震動率高出30%有多。

APC 13x4.5 SF vs 12x4.7 MR vibration compare   Screen Shot 2015-09-22 at 9.45.14 am

 油門:

13″槳以45%油門維持高度(AltHold),12″槳要55%油門。

APC 13x4.5 SF vs 12x4.7 MR props throttle compare

飛行時間:

13″槳以45%油門AltHold,飛行時間會長一點嗎?也不是,反而12″槳有更長的飛行時間。

用的是4S電,設定了14.8v自動返航,13″槳更早開始返航。

APC 13x4.5 SF vs 12x4.7 props flight time compare

總結:

無論在飛行時間,震動率再看,較細的槳能提供更好的效能。但為什麼多數人還是追求更安裝更大的槳?我想是負載罷,如果要負載更大的電池,gimbal,相機,更大的槳是必須的。13″比12″槳減少10%的油門hold機,意味更重的負載。如果沒大負載的需要,大槳是沒有必要的。

Can QAV500 v2 mounting 13″ props

QAV500 v2 能裝13吋槳嗎?

答案是可以的,我裝了APC13x4.7 SF槳,只是與機身的距離十分近,只有4mm。正常情況是沒問題的,只是極端情況下,會有意外出現嗎?不能擔保哦。

QAV500 v2 mounting 13" props

QAV500 v2 mounting 13" props 4mm space left

今天近距離試飛了一次,速度也不高。效果不錯,原本要55%的油門才能AltHold,現在45%做到了。

這個設定是為了要裝兩顆5000mAh電而安排的。現在的飛行時間大約在一起12-15分鐘左右,希望提高升力,增大電量,可以增加時間至20-25分鐘。

AQV500 v2 loading 2 x 5000mAh batteries

 

PX4FLOW project 重新啟動,光流定位測試

( English version here )

由於APM Copter3.3的更新開始支援Optical Flow LOITER,我的PX4FLOW project也重開了。

昨天安裝了APM Copter3.3rc8 到Pixhawk中,由於還是試版,隻QAV500只可以作近距離試飛了。為的只是想早點嘗試PX4FLOW LOITER。一步步跟著文件做安裝,過程如下。

安裝:

開始時發現QAV500機底的前方有個位置很合適,又有縲絲位,就安裝在那裡了。

PX4FLOW under QAV500
PX4FLOW under QAV500

由於I2C的線長度不足問題,把PX4Flow轉了180度。x向機尾,y向左,FLOW_ORIENT_YAW必須設定為18000。(如果跟足文件,沒有旋轉,就不用改動FLOW_ORIENT_YAW)

px4flow-top

 

對焦:

你不能確定PX4Flow出廠的焦距是你所需要的,所以必須調較焦距。我用的是APM Planner,但那裡沒有可以顯示PX4Flow影像的功能,只有用QGroundControl,我連接QGroundControl的過程在這裡。看到PX4Flow影像輸出,就可以把鏡頭對著3米外的物件,鬆開鏡頭的螺絲,進行對焦。

 

效準(Flow Sensor Calibration):

跟著文件進行效準,一切順利,下載log file,得到以下的圖表:

FX4Flow Flow Sensor Calibration log flow_y
OF.floxY vs OF.bodyY
FX4Flow Flow Sensor Calibration log flow_x
OF.floxX vs OF.bodyX

以上是戶外的測試,接著我做了戶內的測試,效果差很多。

FX4Flow Flow Sensor Calibration (Indoor)
FX4Flow Flow Sensor Calibration (Indoor)

但做到Range Sensor Check就找不到數據。文件說可以在EKF5.meaRng看到距離的變化,但在log中這一項是0,不知是那裡出錯。文件說他們裝了外置的range finder,可能就是這個原因。我沒有打算為此而買一個Pulsed Light unit,就不理它去了試飛。

試飛後看到,比較GPS定位,Optical Flow定位還是不太穩定,有兩三米的移位,而且是在戶外做測試。如果要做到室內定位,一定要有厘米級的精確度,未知是否可以通過較準(calibration),或程式改良可以達到,又或者要加上雷射range finder才有改善。最起碼要買張地毯,家裡的地磚太平滑,不是很適合用來做光流定位。

PX4FLOW project restart

Since APM Copter3.3 start to support Optical Flow LOITER, my PX4FLOW project can be restarted

Yesterday, I installed APM Copter3.3rc8 to Pixhawk. Since it is a beta version, my QAV500 became a testing drone that can’t do long flight anymore in order to try the PX4FLOW LOITER earlier.

I followed the document to install the FA4FLOW.

HARDWARE INSTALL

I found there is a place under QAV500 bottom that mounts PX4FLOW easily.

PX4FLOW under QAV500
PX4FLOW under QAV500

I rotated the PX4Flow 180 angle, because of my I2C cable too short. x pointed to back, y pointed to left. I have to change the “FLOW_ORIENT_YAW” setting to 18000. ( If you not need to rotate the PX4Flow, just follow the document. No need to change the setting.)

px4flow-top

 

FOCUSING

You can’t sure the focusing of factory setup that is correct, so you have to adjust it. I use APM Planner, there is not interface to display PX4Flow visual video. Then I changed to use QGroundControl. You may check here for how to connect PX4Flow to QGroundControl. When you can see the video output, you can adjust the focus to 2-3m.

 

Flow Sensor Calibration

I followed the document to calibrate. The result is fine. Open the log file and got the chart below:

FX4Flow Flow Sensor Calibration log flow_y

OF.floxY vs OF.bodyY

FX4Flow Flow Sensor Calibration log flow_x
OF.floxX vs OF.bodyX

Then I did same test indoor, the result was much poorer, chart below:

FX4Flow Flow Sensor Calibration (Indoor)

When I do the Range Sensor Check, the document said that EKF5.meaRng will show the distance data, but my log is 0. I don’t know what is wrong.。I didn’t install range finder, may be this reason. However I would not buy a Pulsed Light unit for this. So, leave it then go to flight.

 

Compare to GPS, the Optical Flow is not show stable. It move 2-3M. I did the test outdoor. If I want it can stable indoor, it can’t move more then 0.5m. I don’t know can I improve it by calibration, or wait program upgrade.

正反槳坐,不再有螺旋槳飛脫的危險

經常聽到有螺旋槳飛脫的事件,因為慣性作用,無論上得多緊的螺旋槳都有鬆脫的危險。裝了正反槳坐,可使絲帽的螺旋與馬達的旋轉方向相反,慣性作用只會使絲帽上得更緊。
起初,不太確定槳座是否裝對,裝錯方向會有反效果喎,就用實驗確定。在120FPS的慢鏡下看到馬達開動,螺絲自動向下收緊,好有趣。

追船

很喜歡出海練習四軸機,掉下來都不會容易傷人。
大海茫茫,追船就是最好的題目。練習速度、高度、旋轉、穩定力等,也使拍攝有個目標。

此片由QAV500 v2 機架 + Pixhawk 飛控 + GoPro3 所拍攝。

後記:自從入手DJI後便很少用DIY機拍片。幾年後再看到此片,也自豪於DIY可以達到這個質素。

Navio+ @ Lumenier Danaus

有一次看到了Navio+,很快便決定要裝組一隻。(這是組件列表,請參考)

它可以在Raspberry Pi上運行APM copter,換句話說它是一部會飛的Linux,這使很多事情都變得有可能。

例如通過網絡控制,加上4G/3G USB,理論上可以在世界任何一個角落操控它(只要有穩定的網絡)。

跟隨Bernt的blog,已成功以raspicam作為鏡頭,通過WiFi傳送影像回Mission Planner,只有少少delay,相信作為慢速FPV使用也可以接受。下一步要買4G USB,試驗速度是否一樣。

此外,還想試驗object tracking的可行性,有了Linux就可以嘗試OpenCV,OpenTLD等library了。

但話說回來,Navio+還是很新,他們把APM code port到Linux還是實驗性。他們的網站也這樣說:Important! Keep in mind that the code for Navio is in the experimental state. Use it with caution! 我也不打算把它用作實際飛行,最好可以在室內實驗,試試自己的程式。因此,以Lumenier Danaus做機架就可以保護縲旋槳和室內的人了。

Navio+ at Lumenier Danaus (QAV250 base)
Navio+ at Lumenier Danaus, 雖然Navio+在250機架有點大,但整體很簡約,未計電池重量約430g。
Navio+ at Lumenier Danaus top (QAV250 base)
以Navio+的大小和Pixhawk差不多,只能放在機頂。內置U-blox M8N GPS,要找地方安置GPS天線。
Using RaspiCam for FPV
用RaspiCam作為FPV的鏡頭,很輕盈,不用獨立供電,提供1080p解像度,可直出Mission Planner。真的無話可說。
PRI remove USB and ethernet ports save 7g
移除USB和Ethernet ports,節省7克。
Navio+ 4G equipped
Navio+ 以4G網絡連接。

製作圖片:

Lumenier Danaus back
Lumenier Danaus back

Lumenier Danaus

Lumenier Danaus

Lumenier Danaus with T-Motor MN1806 2300kv
Lumenier Danaus with T-Motor MN1806 2300kv
Navio+ anti-vibrate
Navio+ anti-vibrate

Navio+ at Lumenier Danaus