2019年2月25日 星期一

[leetcode][python] 46. Permutations

leetcode 連結:
https://leetcode.com/problems/permutations/



這題是找出一組不重複的集合的所有排列組合


做法很簡單,使用遞迴的方式,輪流從集合內拿出不同的內容放入解答內,直到集合內所有內容被挑完,這樣解答就是其中一種可能性


[leetcode][C] 50. Pow(x, n)


https://leetcode.com/problems/powx-n/



顧名思義,這題是想自己實做pow(x, n)

最簡單的方法當然是直接把x 乘以n次,但這樣時間複雜度就變成O(n),

要加快速度,有一個做法就是重複利用已經乘過的數

舉例來說,pow(2,5) = 2*2*2*2*2 = (2*2)*(2*2不用重算)*2


[leetcode][python] 48. Rotate Image

leetcoded 連結:
https://leetcode.com/problems/rotate-image/


這題基本概念是把矩陣想成是像"回" 字形一樣一圈圈,一次處理一圈


2018年8月7日 星期二

LED 旋轉顯示器

demo 影片

source code: https://github.com/cy-arduino/led_spin_display

載具(開發用):

馬達: 無刷( 2212, 980KV)

電變: 30A

PWM轉速控制: arduino nano


本體

LED:

單色16顆


供電:

電池


傳輸:

無線(BT HS-05, SPP)


轉速偵測:

光遮斷器


開發版:

arduino nano



設定方法: 

透過BT SPP,下command控制LED 顯示內容


範例:

好棒棒.txt 

gogogo.txt

2016年9月5日 星期一

[研究中]naze32(rev5) + FrSky X8R + MinimOSD + Bluetooth


Naze32 rev5
user manual
http://www.abusemark.com/downloads/naze32_rev3.pdf

MinimOSD 設定
https://oscarliang.com/minimosd-micro-setup-naze32-pid-rssi/

Bluetooth 設定 - done

  • 可以使用這個 http://ddddiy.blogspot.com/2014/02/hc-05-bt-module.html
    • baudrate 設定有對應即可正常運作
  • 直接接到版子中央的TX/RX pin(這邊應該就是轉USB port的hardware UART1)
  • 這邊實際使用時發現Naze32 TX RX  是倒過來的,所以跟BT module 是TX-TX, RX-RX,跟一版接法不同

FrSky X8R

  • 控制訊號
    • PWM - done 
      • 直接接channel 1-8
      • 這樣由於pin被佔據,無法使用uart2/softserial/telemetry....
        • https://github.com/cleanflight/cleanflight/blob/master/docs/Blackbox.md
          • Pin RC3 on the side of the board is UART2's Tx pin. If Blackbox is configured on UART2, MSP can still be used on UART1 when the board is armed, which means that the Configurator will continue to work simultaneously with Blackbox logging. Note that inPARALLEL_PWM mode this leaves the board with 6 input channels as RC3 and RC4 pins are used by UART2 as Tx and Rx. Cleanflight automatically shifts logical channel mapping for you when UART2 is enabled in Ports tab so you'll have to shift receiver pins that are connected to Naze32 pins 3 to 6 by two.
    • SBUS - 研究中
      • Naze32 rev5 + FrSky X8R 需要SBUS 反向器,參考
        • https://oscarliang.com/sbus-smartport-telemetry-naze32/
          • 使用電晶體 http://skory.gylcomp.hu/alkatresz/bc547b.pdf
        • 或是直接使用inverter http://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf
    • telemetry - 研究中
      • 需注意要使用SBUS, PWM gpio 被占據無法使用
        • 參考 https://oscarliang.com/sbus-smartport-telemetry-naze32/
    • RSSI- 研究中

2016年8月19日 星期五

Android - Nexus 刷官方image

https://developers.google.com/android/nexus/images


  1. 進入fastboot
    1. adb reboot bootloader
  2. unlock bootloader
    1. fastboot flashing unlock
    2. fastboot oem unlock <==舊裝置用這個
  3. 燒image
    1. 執行flash-all script
  4. lock bootloader
    1. fastboot flashing lock
    2. fastboot oem lock <==舊裝置用這個


Nexus4: occam
目前最新image 為5.1.1 (LMY48T)


2016年8月18日 星期四

碳刷馬達毀損分析


原本50%油門跑了十多條3s電池都沒事
改成100%油門後一條沒跑完就卡死冒煙
原因是漆包線從電刷夾漆包線的地方斷開
這應該算是馬達瑕疵,夾起來的地方有傷到使得線徑變細 導致大電流時在傷到的地方燒斷,馬達被噴出來的漆包線卡死

拆開後可發現馬達的碳刷沒什麼磨損,如果沒意外壽命應該可以很長...








自製小四軸機架

自製機架加上8520馬達,使用F180 機板
總重38.5g







2016年8月8日 星期一

DIY PC 加裝第二電源供應器

應該是高中時做的...
將第二顆電源供應器的啟動/接地與第一顆相連,並改裝放入光碟機的殼內,用來獨立供電給多顆硬碟




DIY 顯示卡改裝渦輪風扇






DIY LAMA 直升機倒飛

這個部分跟一般六動直升機倒飛不同,而是直接將葉片反裝,再修改遙控系各動的正反性來達到(所以沒辦法降落XD)

https://goo.gl/photos/yEcdytLwuHQacgma9

自製電壓測量電路


影片可看到使用可變電阻分壓,轉動可變電阻,LED燈號會隨之變動

https://goo.gl/photos/yEcdytLwuHQacgma9

CASIO P505 改裝

這是之前舊數位相機的改裝,架起來後看起來很厲害

  1. 增加外接行動電源(4*3號充電電池)
  2. 閃光燈遮光罩
  3. 外接廣角/微距鏡
  4. 4.2v定電壓座充






















大型壓克力機械魚

這是老弟在大學時的作品,當時幫忙構想了驅動馬達的部分,使用PWM 控制

自製四軸直升機飛控板

基本上這個架構是自己陸續看一些東西後整理出來的一個大致的架構
目前input 跟output 部分都有經驗了,會等姿態的部分研究差不多後,就可以全部都整合都起來...




考慮到成本與實際上飛行時的載重,應該會採用這台450來當作載具測試
用普通的2212馬達/電變加上紅白機架兩千塊即可打發,撞壞比較不傷荷包



使用gyro + g-sensor 達到姿態控制

這篇文章用來紀錄一下使用sensor取得物體姿態(yaw/row/pitch)的部分
  • g-sensor
    • 在物體靜止不動時,加速度只有固定的地心引力,故可透過此加速度在三軸上的分量來計算姿態
    • 但在物體動作時,除了重力,物體本身改變姿態的加速度會混進去造成失真,以前做的的專題就是只使用g-sensor, 在快速動作時,可看到螢幕上顯示的動作與實際物體動作有一點點落差
  • gyro
    • 輸出單位時間內在某個軸上旋轉的角度(很精確)
    • 時間長會有積分誤差
      • 簡單的使用一軸來舉例
        • 瞬間旋轉10度,此時由於精確度很高,可能量出來誤差只有0.001度,所以此時取得的姿態仍很正確
        • 但隨著時間增加,物體一直動作,每次轉動的誤差會一直累加,造成一段時間後物體的角度跟程式內上看到的角度誤差會越來越大
  • gyro+g-sensor 
    • 結合兩種sensor的優點,去算出一個接近真實姿態的輸出,既可精確表達姿態,又能避免誤差累積
      • 卡爾曼濾波
        • http://ddddiy.blogspot.tw/2014/02/blog-post.html

2016年8月7日 星期日

使用手機實做飛機黑盒子


這是2008年念研究所時跟同學寫的其中一個專題
當初會做這個專案,最主要目的是我為了想個好理由光明正大的來玩遙控飛機,不過做出來似乎效果不錯,出乎意料的在課程上拿了高分...
最近看到照片突然好懷念以前研究所的時光,寫出來紀念一下


整體主要分幾個部分

  1. 手機端(openmoko)
    1. 儲存GPS資料(經緯度與高度)
    2. 讀取g-sensor值
      1. 偵測碰撞後傳簡訊回報GPS坐標<==墜機時可以找到飛機
      2. 透過bluetooth(SPP)及時送出g-sensor的值 <==很炫,但距離短不實用
  2. NB端
    1. 透過bluetooth接收g-sensor 的值
      1. 即時計算姿態
      2. 使用opengl即時顯姿態
    2. offline
      1. 將手機儲存的GPS 紀錄使用google earth reply, 在PC上replay 整個飛行的軌跡 







GY-521模組(MPU6050, g-sensor + gyro)


GY-521是一個標榜為"六軸"的模組,包含了三軸陀螺儀跟三軸加速度計

上面的MEMS 是MPU6050

MPU6050除了可以讀出個別sensor的值外,也可以當作i2c master, 外掛一顆e-compass, 對host(如arduino)來看,直接變成一個9軸模組

官網文件
https://www.invensense.com/wp-content/uploads/2015/02/MPU-6000-Datasheet1.pdf
https://www.invensense.com/wp-content/uploads/2015/02/MPU-6000-Register-Map1.pdf

參考資料
http://www.den-uijl.nl/electronics/gyro.html
http://playground.arduino.cc/Main/MPU-6050
http://www.geekmomprojects.com/gyroscopes-and-accelerometers-on-a-chip/





arduino 解析PPM 訊號


這是在弄X9D+ 搖控器控制jj1000四軸時,因為發現四軸飛在空中時偶爾會抖一下,debug後發現問題的紀錄
http://ddddiy.blogspot.tw/2016/08/x9d-nrf24l01-v2x2-protocoljj1000.html


PPM(Pulse code Modulation mode) 訊號格式可以參考這邊
http://diydrones.com/profiles/blogs/705844:BlogPost:38393

基本上就是把PWM 訊號全部編碼整合在一個pin 上
在遙控模型的領域內,PWM 格式"一般"定義如下

  • 每個clock周期總長20ms
  • 拉high 
    • 1ms: 通道最小值
    • 1.5ms: 通道最小值
    • 2ms: 通到最大值

而PPM 內每個通道用的時間相同,只是改成時間到時瞬間拉一下high(送interrupt)
可參考網路上這張圖
https://www.google.com.tw/search?biw=1280&bih=614&tbm=isch&sa=1&q=PPM+&oq=PPM+&gs_l=img.3..0i19l10.7835.7835.0.8134.1.1.0.0.0.0.54.54.1.1.0....0...1c.1.64.img..0.1.53.DsrA7tEbXa8#imgrc=68KP1G0WoL6ovM%3A

一開始先來個脈波,之後依各通道的值對應的時間到了送出一個脈波,最後low的時間夠長,可以用來判斷一個大週期的結束

舉個例子來說,假設共四通道,各通道的值為

  • CH1: 最小值
  • CH2: 中立點
  • CH3: 中立點
  • CH4: 最大值

實際上送出的訊號如下
|上一個週期| ↑↓(1ms)↑↓(1.5ms)↑↓(1.5ms)↑↓(2ms)↑↓(明顯大於2ms的時間) |下一個週期|
所以只要用中斷抓rising edge並計算間隔後,即可知道各通道對應的值,最後剩下來的時間,長度明顯大於2ms, 當作sync 訊號來判斷此次周期已結束
照這個設計來看,20ms 可放入8通道的訊號(9通道無法分辨sync)




來看一下之前控制jj1000四軸的程式,這個project一開始是clone網路上其他玩家的project
原本的設計有一些問題
https://github.com/goebish/nrf24_multipro/

原本的code做法如下

  • setup
  • loop
    • 確認protocol, 對RF 模組做初始化與對頻
    • 從Servo_data[chan]取出目前各通道的值
  • ISR
    1. 讀出目前timer值<==可得知經過多少us
    2. reset timer
    3. 小於510us 當作雜訊,紀錄長度
    4. 大於1910當作sync
    5. 其他則是將讀出的數據加上雜訊依序填入Servo_data[chan]
這個做法沒有判斷目前PPM 訊號的high/low,每次狀態改變都會觸發中斷,會造成中斷數量增加,且以PPM設計來說拉high時間短,很有可能掉中斷(level trigger的狀況,如果轉換過快,沒有在high or low停留一段時間,比較可能會漏掉),使得干擾等因速會影響到該大週期內,每個channel 的對應
以工作的經驗來說,這類型的訊號適合用edge trigger, 搭配PPM 的設計,使用rising edge trigger較合適
實際遇到問題,通常下一個大週期就會回復正常,但飛行時就會導致四軸在空中會突然抖一下

修正成下面的做法後調整PPM判斷參數與interrupt,中斷數量可以也少一半,且實際飛行也穩定多了
  • initial
    • PPM_IN_MIN=510
    • PPM_IN_MAX=2200
  • setup
    • PPM pin 設為input
    • 註冊ISR(rising)
    • 設定timer1 每1us增加1
  • loop
    • 確認protocol, 對RF 模組做初始化與對頻
    • 從Servo_data[chan]取出目前各通道的值
  • ISR
    1. 讀出目前timer值<==可得知經過多少us
    2. reset timer
    3. 目前timer小於PPM_IN_MIN當作雜訊,紀錄長度
    4. 目前timer大於PPM_IN_MAX當作sync
    5. 其他則是將讀出的數據加上雜訊依序填入Servo_data[chan]