2014年9月18日 星期四

USB 充電擴充方案

出門在外,常常兩個人待了手機*2,平板*2和相機*1,為了充電每次都要帶一大堆adapter

所以減輕負擔,DIY 一個擴充方案,只要使用一個大電流輸出的adapter,即可一次充5台裝置

就算使用一般adapter,出門在外過夜,一個晚上也是能將所有裝置充飽


usb 擴充座的部分可以分開,接到大容量行動電源




DIY 大容量行動電源(22000mAh)

很久以前的作品,一直都丟在背包內
大容量,出門在外平板手機隨便充都不怕電力不足



內部使用5顆平板用電池(4400mAh),總容量為22000mAh(1s5p)

升壓電路使用一般可調式升降壓電路板,價錢大約一百出頭,順便加上一個充電用JST頭,方便使用模型用充電器充電

外觀使用大創39元鐵製鉛筆盒,搭配JST與USB 輸出




使用JST輸出的原因,就是可以搭配之前製作的5輸出USB擴充座
一次可以充五台,每一台2A的充電都稱得住








DIY 隨身行動電源 (10000mAh)




5V 1.2A 升壓電路板,掏寶買的,一個約2-30元台幣


使用手機的鋰聚電池(2500mAh)四顆容量總共10000mAh(1s4p)

與小米電源相比,無論體積或重量都獲勝

最後焊上充電的JST插頭,方便使用模型用充電器充電並包上銀色外衣








2014年7月27日 星期日

to be continue... Android build environment setup(ubuntu 12.04)

  1. install Ubuntu 12.04 LTS 64bit
  2. follow google's instruction:
    1. https://source.android.com/source/initializing.html
      1. install oracal JDK 6 
        1. sudo apt-get install software-properties-common
        2. sudo add-apt-repository ppa:webupd8team/java
        3. sudo apt-get update
        4.  
      2. install required packages 
        1. sudo apt-get install git gnupg flex bison gperf build-essential \ zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \ libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \ libgl1-mesa-dev g++-multilib mingw32 tofrodos \ python-markdown libxml2-utils xsltproc zlib1g-dev:i386 libglapi-mesa:i386 
        2. sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
      3.  get and setup repo
        1. mkdir ~/bin
        2. add "PATH=~/bin:$PATH" in ~/.bash then run bash again
        3. curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
        4. chmod a+x ~/bin/repo
      4. download source code
        1. create new directory for download project, then switch to that directory
        2. repo init -u https://android.googlesource.com/platform/manifest
        3. repo sync -j10
      5. setup ccache (compiler cache, for speedup build time)
        1. add "export USE_CCACHE=1" in ~/.bashrc 
        2. run "prebuilts/misc/linux-x86/ccache/ccache -M 50G" in your project

2014年7月5日 星期六

android 廣告阻擋原理

android 底層是linux kernel

在linux 上面,系統要做domain name->IP的查找時,會先去檢查/etc/hosts裡面是否有寫靜態的對應,如果沒有才會真正去做DNS。

故要阻擋廣告,只要有一份廣告網址的列表,將其加到/etc/hosts內,並對應至127.0.0.1(localhost) 即可

2014年4月23日 星期三

一般模型伺服機控制原理

普通類比伺服機
  1. 控制訊號使用pwm
    1. 周期約20ms
    2. 拉high時間控制伺服機轉動角度
      1. 1ms: 0度
      2. 1.5ms: 90度
      3. 2ms: 180度


將一般伺服機改為連續轉動的伺服機(continuous rotation servo)

一般伺服機的動作角度大約為0-180度

若要改造成可以連續轉動,主要修改的步驟如下


  1. 不要使用偵測擺臂角度的可變電阻
    1. 將可變電阻上面的線路切斷,並量測最大電阻(ex. 5K 歐姆)
    2. 將控制板上偵測可變電阻的線路用最大電阻的一半(ex. 2.5K 歐姆)分別接到Vin與Gnd(使控制板覺得擺臂角度一直維持在中立點)
  2. 改造機構使其連續旋轉
    1. 通常殼上或齒輪上會有限制最大轉動角度的機構(例如突出物),將其切除即可

由於將可變電阻改成固定電阻,所以控制板會覺得擺臂位置一直在九十度(中立點),
  • 若此時送給伺服機的訊號為
    • 90度,馬達不會旋轉
    • 小於90度,馬達往某一方向轉
    • 大於90度,馬達往另一方向轉
可以注意到,若送給伺服機的訊號角度與90度差越多,控制板會認為目前位置與目標位置差距越大,所以會讓馬達轉越快

伺服機內部構造/控制電路

拆了一個壞掉的伺服機

內部使用的控制晶片為YT5188,是控制伺服器專用的晶片,搭配少量外部原件即可控制馬達正反轉與速度與偵測擺臂位置

馬達經過減速齒輪控制擺臂,擺臂連接5K電阻使控制晶片可以偵測其位置

datasheet上建議使用推動馬達的電晶體建議為2SA695


ps.日本的電晶體的命名規則(JIS)
http://elect.taivs.tp.edu.tw/course/ch04_11.htm

2014年4月13日 星期日

日本大阪自由行

四天都在大阪的輕鬆行


  • 大阪觀光指南
    • http://www.osaka-info.jp/enjoy_osaka/ch_t/
網路:

  • 中華電信 日本 3G上網
    • 開通三天
      • 第一天台灣時間晚上6:00開通到第四天晚上六點(此時應該已經在機場了)
    • 最高上限999

行程:

  • 第一:天:
  • 第二天
    • 早上
      • 大阪城公園/天守閣
      • 造幣局
      • 天滿宮
    • 下午
      • 大阪車站城
      • 梅田百貨公司 吃
    • 晚上
      • 道頓掘夜景/觀光船
  • 第三天
    • 早上
      • 大阪港
      • 海遊館
      • 天寶山大觀覽車
      • 大阪府咲州廳舍
    • 下午 - 晚上
      • 心齋橋商店街
      • 日本橋
  • 第四天
    • 早上
      • 天王寺
      • 通天閣
      • 吊鐘燒
    • 下午:
      • 16:00出發到機場
      • 17:10到關西國際機場(逛機場免稅商店加吃晚餐)
      • 19:10 起飛
      • (台灣時間)20:50到桃園
      • (台灣時間)22:00到台北車站
      • (台灣時間)22:00到家


2014年4月8日 星期二

GY-273 使用HMC5883晶片的三軸電子羅盤 e-compass

data sheet
http://www.seeedstudio.com/wiki/images/4/42/HMC5883.pdf

***注意*** module上面標示的Y軸與Z軸是顛倒的!!
  1. I2C addr為 7bit 0x1E,最後一個bit為控制i2c read/write
    1. master read: 0x3D
    2. master write: 0x3C
  2. 有兩種控制模式:
    1. 連續讀取
    2. 單次讀取
  3. 參考data sheet內有範例:


每次讀取間隔約需要6.26ms


所有register列表:

  • 設定:
    • Configuration register A/B
    • Mode register
  • 讀取資料
    • Date output X MSB/LSB register
    • Date output Y MSB/LSB register
    • Date output Z MSB/LSB register
  • CHIP狀態
    • Status register
  • 辨認chip
    • Identification register




register細節












2014年3月31日 星期一

草稿 - GY-521(MPU-6050)三軸陀螺儀/加速度感應器

官方網頁
http://www.invensense.com/mems/gyro/mpu6050.html

product spec
http://www.invensense.com/mems/gyro/documents/PS-MPU-6000A-00v3.4.pdf

register map
http://www.invensense.com/mems/gyro/documents/RM-MPU-6000A-00v4.2.pdf



等待已久的三軸陀螺儀/加速度感應器/磁場感應器終於到貨

等待已久的三軸陀螺儀/加速度感應器/磁場感應器終於到貨

可以開始研究了!

GY-521 (MPU6050)
GY-273 (HMC5883L)

2014年3月20日 星期四

Arduino 小技巧 - 修改servo library, 使其更新動作速度更快


http://www.diy-robots.com/?p=1183

一般servo控制,都是20ms更新一次,每次拉高一段時間,拉高的時間範圍約為1000-2000us, 
1500us為中間點

可以修改Arduino servo library,使更新間隔降到2500us(2.5ms),對於需要快速控制的用途很有幫助

libraries\Servo\Servo.h
//#define REFRESH_INTERVAL    20000     // minumim time to refresh servos in microseconds 
#define REFRESH_INTERVAL 2500

2014年3月19日 星期三

Arduino - LCD控制

參考

  1. http://coopermaa2nd.blogspot.tw/2010/12/arduino-lab9-2x16-lcd-world.html
  2. http://www.spikenzielabs.com/SpikenzieLabs/LCD_How_To.html
  3. http://arduino.cc/en/Tutorial/HomePage#.Uym-zvmSyXo 內的 LiquidCrystal Library

使用內建的library可以很輕易的控制LCD

可以注意到使用pin 8 9 10 11這樣設定可以當作小電流的5V與GND,提供LCD背光與Vee(調整對比)電壓調整使用
關於把GPIO當作5V來源,可以參考這篇文章:
http://ddddiy.blogspot.tw/2014/03/arduino-gpio5v-or-gnd.html


範例:
#include

LiquidCrystal lcd(0, 1, 4, 5, 6, 7);//rs, enable, d4, d5, d6, d7 

void setup(){
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);

  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);

  lcd.begin(16, 2);

  lcd.print("aaaabbbbccccdddd");
}

void loop(){
  lcd.setCursor(0, 1);

  lcd.print(millis( )/1000);

  delay(100);
}




Arduino 小技巧 - 使用GPIO當作5V or GND的方法

有時候測試時沒有使用麵包版,
版子上又有多餘的GPIO時,若電流很小(例如驅動一般LED),可以使用GPIO當作VCC/GND

以Leonardo為例,GPIO可以輸出40mA
http://arduino.cc/en/Main/ArduinoBoardLeonardo#.Uym72PmSyXo

Summary

MicrocontrollerATmega32u4
Operating Voltage5V
Input Voltage (recommended)7-12V
Input Voltage (limits)6-20V
Digital I/O Pins20
PWM Channels7
Analog Input Channels12
DC Current per I/O Pin40 mA
DC Current for 3.3V Pin50 mA
Flash Memory32 KB (ATmega32u4) of which 4 KB used by bootloader
SRAM2.5 KB (ATmega32u4)
EEPROM1 KB (ATmega32u4)
Clock Speed16 MHz


ex:
  pin8: 5V
  pin9: 0V

code:
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);


草稿 - DIY 四軸飛行器


  1. sensor: Gyro + G-sensor
  2. 機身目前狀態: 將Gyro + G-sensor的值經過Kalman filter運算後取得
  3. 平衡機身的方法使用PID
  4. 控制機身:
    1. 油門:PID運算過程中加入油門量
    2. YAW: 修改對角線馬達油門量,一組增加,一組減少
    3. ROLL/PITCH: 修改步驟2的機身狀態

2014年3月18日 星期二

PID控制

PID 的概念其實很簡單,裡面三個大部分

  • P: proportional, 比例控制
    • 假設目前四軸姿態是水平於地面,要前傾時,需降低前兩顆馬達轉速並增加後兩顆馬達的轉速,傾斜的速度跟馬達出力差異的對應這邊就是P
    • 假設目標是前傾十度,目前姿態為水平,預計要輸出多少轉速差來達到這10度的變化
  • I: integral, 誤差的積分
    • 誤差:每次預估的結果與實際量測結果的差值,會每個loop一值累加
    • 目標是讓平均誤差接近0
    • 假設前一個loop,使用10%的前後馬達轉速差依照P預計下一個取樣點會從水平變為前傾10 度, 此時真正從sensor量出來的姿態是前傾9 度,那這次誤差就是-1,這部分可以當作這次控制訊號輸出時的參考因素
  • D: derivative, 微分,基本上就是預測之後趨勢
    • 對誤差的部分作微分,基本上就是找出斜率,推故下個時間點的誤差,這部分可以當作這次控制訊號輸出時的參考因素



https://www.google.com.tw/search?q=PID&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjQ3MDb8K_OAhWFjZQKHcEICzkQ_AUICCgB&biw=1280&bih=614#imgrc=IoZD3kF8eZVYsM%3A
隨著時間一次次把實際量測的值算出P/I/D後,依各自的權重加總,算出這次控制真正的輸出,一次次這樣做便能趨近預計目標值且穩定不震盪
這個演算法只需儲存少數的資料,用少數的運算量,即可達到不錯的效果,不過需要人工調出PID 的參數
PID調參數也是一門學問,目前有些四軸飛控板有自動調PID參數功能,這部分也是可以研究的領域





===================================================
很不錯的影片表示PID 間的關係


超淺顯易懂的教學
http://bbs.5imx.com/forum.php?mod=viewthread&tid=891184&fromuid=241202


http://4rdp.blogspot.tw/2008/05/pid-speed-control.html
http://4rdp.blogspot.tw/2008/12/apply-pid-to-control-lego-nxts-speed.html
http://4rdp.blogspot.tw/2013/11/pid-control-1.html
http://4rdp.blogspot.tw/2013/11/pid-control-2.html
http://4rdp.blogspot.tw/2013/12/pid-control-3.html


https://en.wikipedia.org/wiki/PID_controller
http://www.expertune.com/tutor.aspx

草稿 - Android app - Tasker

2014年3月10日 星期一

Arduino藍芽遙控小車

使用Arduino搭配兩個模組

  1. MTADRL293D 馬達控制板
    1. http://ddddiy.blogspot.tw/2014/02/mtadrl293d.html
  2. HC-05 藍芽模組
    1. http://ddddiy.blogspot.tw/2014/02/hc-05-bt-module.html

做法:
  1. 參考這裡將HC-05 藍芽模組設定好,接上VCC/GND,並將HC-05的TX/RX接到Leonardo的RX/TX
  2. 將MTADRL293D插上Leonardo
  3. 將MTADRL293D的M1/M4(在這張版子上這兩顆馬達吃BATT的電,另外兩顆吃5V)接到車子左右兩顆馬達的正負極
  4. MTADRL293D接上電池

車身/履帶/減速機: 田宮 工作樂系列

範例程式碼:

2014年3月3日 星期一

Arduino小技巧 - Library寫法

觀察一下原本內建的library,可以發現Arduino的library寫法非常簡單

以我自己所寫的74HCT595N library為例:

  1. 撰寫 xxx.h
    • class定義, 常數...
  2. 撰寫 xxx.cpp
    • 實做class 
  3. 新增 keywords.txt
    • Datatypes (KEYWORD1)
    • Methods and Functions (KEYWORD2)
    • Constants (LITERAL1)
  4. 將三個檔案放入一個資料夾xxx後,丟到
    • arduino-1.0.5-r2\libraries
  5. 可以順便寫個範例程式,放入examples資料夾,丟到
    • arduino-1.0.5-r2\libraries\xxx


範例:



發現官方說明文件:
http://arduino.cc/en/Guide/Libraries#.Uxxb7vm1bNk

=======================================================

目前發現,無法從一個Library A去使用另一個Library B

  • 編譯時會提示找不到B.h
    • 將#include "B.h" 改成#include "../B/B.h"後,可以找到.h 檔,但仍找不到實作的部分
目前暫時的解決方法是把B.h/B.cpp複製到A的資料夾內