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]

2016年8月6日 星期六

四驅車相關網站 - 紀錄


四驅車相關網站

四驅車GP晶片計畫

自從去年發現租屋處附近開了一家四驅車店家之後,就又重新燃燒起熱血
台灣不流行的期間基本上幾乎完全沒有消息,也沒有軌道可玩(日本好一點四驅車一直都存在,但也是沉寂多年官方沒有辦全國性的比賽)

回鍋後發現現在的玩家有很大的比例跟我一樣是二十多到三十多歲的大人,小時候有玩過,長大後又跳進來玩
可能因此導致現在軌道跟十多年前相比比較偏向技術軌,多了很多難度,所以不是單純比高速,而是變成在不飛車的前提下盡快跑完全程

之前看了很多四驅車相關的網站、論壇、玩家的部落格
基本上是都是以田宮 or 半田宮 的規則在玩,使用固定的機制去應付像是跳台或交換到這種難關
例如跳台落地為了穩定度,改成避震車或使用金球、吊鐘,為了過彎加裝單向輪/彈簧前後翼等...
為了因應不同場地而做調整,須累積大量的經驗,熟悉各種零件的特性,以整體賽道所有難關的"最大公約數" 的方向去做調整

在這個過程中,不斷的去發揮創意改裝與測試,真的有很多樂趣,這也是四驅車吸引人的地方

不過玩了一陣子後,就一直在想以這種玩法,就算玩到最極限,也是要配合賽道在各種方面(速度、重量、改裝方式等...)做取捨,所以漸漸地有了一個想法:
何不結合單晶片,讓車子自行適應軌道後做調整,這樣可以使用幾個基本車型(像是輕量高速型或是扭力型)來稱霸所有類型跑道

其實這就是卡通裡的GP 晶片啊!!!
在網路上有看到一些玩家使用單晶片改裝GP晶片,但是偏向語音或人工控制車子
https://www.youtube.com/watch?v=85913C7MjoQ
https://www.youtube.com/watch?v=C1x2Jdm_9eA


而我比較感興趣的部分則是讓車子自行學習,能夠自行適應各種跑到跑出不錯的成績

有了這個想法後,漸漸的想了一些可行的架構與做法,部分的功能也曾經做出可行的成品
(綠色部分是已經有做過有經驗的部分,藍色部分是已有方向正在研究中,紅色部分是還沒有想法或是需要重頭學習的領域)

目前先規劃一下架構,整理一下有能力與需要學習的部分,最後再全部整合起來




四驅車軌道基本單位跟常見的排列

基本單位
彩虹交換道

波浪道

直線

轉彎(一片45)


常見組合關卡
上坡後接下波
上下坡接急轉彎


特殊關卡
360/720(這個應該是台灣原創的吧)


超高爬坡

富士山交換道

kingkong blheli電變刷FW & 調整參數

關於blheli的介紹

Blheli:

Blhelisuit:


燒錄教學
         可直接在網路上搜尋這份文件,有原廠的詳細設定教學

<<KINGKONG BLHeli电子调速器上位机设置和固件升级指南 - 1.0 - 中文 (1).pdf>>

blheli 簡介

blheli(https://github.com/bitdump/BLHeli) 是一個開源的無刷ESC(電子變速器) firmware,
原本是給使用silabs MCU架構的電變使用,新版的好像也支援Atmel了

很多市售的電變都可以刷成blheli, 預設參數運作起來就已經比大多數電變原本還好
且有更多可調整功能,有興趣也可以自行修改原始碼(天啊...組語)

目前很多型號電變,甚至直接原生搭載blheli FW
像是little bee、kingkong...甚至大廠像"好盈" 也推出幾款原生為blheli的型號




解決CC3D 翻滾速度


在CC3D 上,翻滾可在半自穩(Ratitude)或是手動(RATE/AERO...)控制
主要速度都是取決於"Rate" 參數

不過我發現我設定的兩個飛行模式,Rate都調相同,但翻滾速度卻有差
研究了一下發現原來在stabilization的進階設定內有一個Rate的最大限制,會擋住使用者設定的Rte值,須將"Max rate limit"設到比"Rate mode"大才行




arduino 超小型開發板digispark

這個開發板很特別

  • 優點
    • 有USB
  • 缺點
    • IO太少
    • 效能差
    • 需使用專用的IDE


建立開發環境與連接

基礎

專用版arduino


無法燒錄問題arduino-1.6.8
未知的板子digispark-tiny(平台avr,套件digistump

Error compiling for board Digispark (Default - 16.5mhz).
方法:
  • Uninstall through boards manager
  • Exit Arduino
  • Remove contents of .arduino15/staging/packages (I had a CRC doesn't match error) 
    • ==>位置在C:\Users\CY\AppData\Local\Arduino15
  • Remove .arduino15/packages/digistump
  • Reinstall boards through boards manager
  • Restart Arduino


我用的是這種,是model A(LEDpin1)







燒錄方法:
  1. 板子選digispark default 16.5mhz
  2. 燒錄器不須設定(不會看)
  1. 移除板子usb
  1. IDE 按上傳

  1. 插上板子usb


有library可軟體模擬成USB裝置
DigiCDC - Digispark USB CDC Serial Library

來自 <https://digistump.com/wiki/digispark/tutorials/digicdc

2016年8月5日 星期五

git - 使用bisect 夾板本找出有問題的修正

git內建提供binary search來找改爛掉的commit

初始化
  1. git bisect start
  1. git bisect good [commit/tag]
  1. git bisect bad [commit/tag]

之後就會跳到goodbad中間的一版commit,測試後可以標示為good or bad
git bisect [bad/good]
git 會自動根據測試結果繼續切,最後即可找到出問題的版本

結束後可以回到原本做bisect之前的狀態

git bisect reset

TCP 連線建立/斷開 與sequence number 與 selective ack(SACK)



建立:

Host A

Host B
1
SYN
->

2

<-
ACK
3

<-
SYN
4
ACK
->


        Step 2 and 3可以合併,共三行,所以叫做3-way handshake

Host A

Host B
1
SYN
->

2

<-
ACK, SYN
3
ACK
->



斷開:
由於TCP是雙向的,所以TX/RX方向都要送出FIN通知要結束


Host A

Host B
1
FIN
->

2

<-
ACK
3

<-
FIN
4
ACK
->


selective ack(SACK)
  • linux 可控制SACK 是否開啟: /proc/sys/net/ipv4/tcp_sack
  • 這邊說的server指傳送端,client指接收端
  • 由於TCP 原本ack 機制,client發現有掉了一個封包後(某個封包漏掉,但之後的有收到),會重送最後有收到封包的ACK,server 在收到這個ACK,得知掉封包時,又會從少掉的那個重送
  • 可以發現在server 知道掉包時,已經過一段時間,在這中間server 送出的封包,可能部分client還是有收到,但原本的機制會忽略掉這些部分,造成浪費
  • SACK機制可以讓client 通知server 雖然有掉封包,但是後面的某部分有收到,所以可以不用重送
    • 在原本機制中client重送最後收到封包的ACK 內,再帶SACK 欄位標明那些資料區段有收到,讓server避免重送已收到的封包

參考
http://packetlife.net/blog/2010/jun/7/understanding-tcp-sequence-acknowledgment-numbers/
http://packetlife.net/blog/2010/jun/17/tcp-selective-acknowledgments-sack/

android 增加防火牆規則擋IP

iptable加rule時,如果使用網址,只會在當下做解析,加入對應IP,如果對應有改變或是網站本身有做load balance,就無法完全擋掉

如果真的要擋網址,可能需在DNS 部分修改,在查詢某網址時記錄所有對應的IP,並動態更新iptables


(以鳥哥網站上的圖做修改)