2016年8月3日 星期三
linux 上使用蜂鳴器通知某指令完成
1.先寫一隻能夠使蜂鳴器發出聲音的程式
2.beep:一個shell script使b2在指令完成時執行
3.把b2 and beep放至/bin
4.由於b2發出聲音要有root的權限,所以b2擁有者要設為root,然後對beep作setuid
http://www.google.com/url?q=http%3A%2F%2Flinux.vbird.org%2Flinux_basic%2F0220filemanager.php%23suid&sa=D&sntz=1&usg=AFrqEzfx6HcqK_4BpogqAlU2s7Ts5ttsug
//b2.c #include#include void play(unsigned int* freq, unsigned int* delay); int main(int argc, char* argv[]) { speaker(330, 5); speaker( 0, 5); speaker(330, 5); return 0; } int speaker(unsigned int freq,unsigned int delay) { static int flag=0,bit; if(flag==0) { flag=1; iopl(3); } outb(0xb6,0x43); outb((freq & 0xff),0x42); outb((freq >> 8),0x42); bit=inb(0x61); outb(3 | bit,0x61); usleep(10000*delay); outb(0xfc | bit,0x61); return; }
2.beep:一個shell script使b2在指令完成時執行
$* sudo ./b2
3.把b2 and beep放至/bin
4.由於b2發出聲音要有root的權限,所以b2擁有者要設為root,然後對beep作setuid
http://www.google.com/url?q=http%3A%2F%2Flinux.vbird.org%2Flinux_basic%2F0220filemanager.php%23suid&sa=D&sntz=1&usg=AFrqEzfx6HcqK_4BpogqAlU2s7Ts5ttsug
使用split 分割檔案
要把資料打包放到隨身碟上,
不過卻發現隨身碟為fat32,不支援單一大檔案,
所以google一下方便的分割方法
參考:
不過卻發現隨身碟為fat32,不支援單一大檔案,
所以google一下方便的分割方法
參考:
http://blog.24reader.com/vincentlam/2009/04/22/%E4%BD%BF%E7%94%A8tar%E6%89%93%E5%8C%85%E5%A3%93%E7%B8%AE%E4%B8%A6%E5%88%86%E5%89%B2%E7%82%BA%E5%9B%BA%E5%AE%9A%E5%A4%A7%E5%B0%8F%E7%9A%84%E6%AA%94%E6%A1%88/
http://lovejuan1314.javaeye.com/blog/457841
原本壓縮:
tar -zcvf XXXX.tar.gz XXXX
原本解壓縮:
tar -zxvf XXXX.tar.gz
壓縮並分割:
tar -zcvf- XXXX| split -a 1 -b 1000m - ./XXXX.tar.gz.
壓縮結果:
XXXX.tar.gz.a
XXXX.tar.gz.b
XXXX.tar.gz.c
...
解壓縮:
cat XXXX.tar.gz* | tar -zxvf-
http://lovejuan1314.javaeye.com/blog/457841
原本壓縮:
tar -zcvf XXXX.tar.gz XXXX
原本解壓縮:
tar -zxvf XXXX.tar.gz
壓縮並分割:
tar -zcvf- XXXX| split -a 1 -b 1000m - ./XXXX.tar.gz.
壓縮結果:
XXXX.tar.gz.a
XXXX.tar.gz.b
XXXX.tar.gz.c
...
解壓縮:
cat XXXX.tar.gz* | tar -zxvf-
C 程式的Comma operator
Comma operator 在wiki上的介紹:
http://en.wikipedia.org/wiki/Comma_operator
假設...
int aaa(){
...
}
void bbb(){
...
}
若遇到下面這種寫法
ret=flag? aaa(): bbb();
編譯時會發生錯誤:
error: void value not ignored as it ought to be
因為此時若flag為0,則ret=bbb();
但是bbb()沒有回傳東西(void),
此時可以使用下面這種寫法:
ret=flag? aaa(): (bbb(),NULL);
其中(bbb(),NULL)永遠回傳0(NULL)
http://en.wikipedia.org/wiki/Comma_operator
假設...
int aaa(){
...
}
void bbb(){
...
}
若遇到下面這種寫法
ret=flag? aaa(): bbb();
編譯時會發生錯誤:
error: void value not ignored as it ought to be
因為此時若flag為0,則ret=bbb();
但是bbb()沒有回傳東西(void),
此時可以使用下面這種寫法:
ret=flag? aaa(): (bbb(),NULL);
其中(bbb(),NULL)永遠回傳0(NULL)
android app 將檔案放入程式在/data下的目錄中
之前寫測試apk的經驗:
==================================
在專案的res下面增加raw資料夾
將需要的檔案放進去(不要包含".")
使用 copyFile("XXX.sh", R.raw.XXX);
存放進去的路徑可使用this.getFilesDir()取得
目錄應該是/data/data/com.YYY.ZZZ/files
==================================
在專案的res下面增加raw資料夾
將需要的檔案放進去(不要包含".")
使用 copyFile("XXX.sh", R.raw.XXX);
存放進去的路徑可使用this.getFilesDir()取得
目錄應該是/data/data/com.YYY.ZZZ/files
private boolean copyFile(String fName, int rawId){
InputStream inS = null;
OutputStream outS = null;
byte [] buf = new byte[1024];
int readByte = 0;
try {
inS = getApplicationContext().getResources().openRawResource(rawId);
outS = openFileOutput(fName,MODE_PRIVATE);
while((readByte = inS.read(buf, 0, 1024)) != -1){
outS.write(buf, 0, readByte);
}
inS.close();
outS.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
android 使用標示為hide的API - java reflection
framework中,有許多function上面使用@hide標示為隱藏,
在eclipse上面使用也無法編譯
不過可以使用下列方法解決:
http://eeepage.info/java-hide-class/
http://java.sun.com/developer/technicalArticles/ALT/Reflection/
舉例來說,開關softap使用wifiManager.setWifiApEnabled(),
但setWifiApEnabled()標示hide
可以用下列方法直接呼叫:
Method mMethod = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
mMethod.invoke(mWifiManager, new Object[] { null, true });
class.getMethod()的第一個參數為method名稱(字串),後面為這個method自己所需的參數(args)
method.invoke的第一個參數為執行這個method的class, 第二個參數為物件陣列,內容是要傳進此method的參數
在eclipse上面使用也無法編譯
不過可以使用下列方法解決:
http://eeepage.info/java-hide-class/
http://java.sun.com/developer/technicalArticles/ALT/Reflection/
舉例來說,開關softap使用wifiManager.setWifiApEnabled(),
但setWifiApEnabled()標示hide
可以用下列方法直接呼叫:
Method mMethod = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
mMethod.invoke(mWifiManager, new Object[] { null, true });
class.getMethod()的第一個參數為method名稱(字串),後面為這個method自己所需的參數(args)
method.invoke的第一個參數為執行這個method的class, 第二個參數為物件陣列,內容是要傳進此method的參數
X9D+ 使用NRF24L01 (v2x2 protocol)控制jj1000
整體架構大致如下,架構還蠻簡單的
- X9D+ 遙控器輸出電源與PPM訊號
- Arduino
- 負責選擇protocol
- 控制NRF24L01對頻
- 收PPM訊號,解析出來
- 透過NRF24L01傳送各通道訊號
目前可以動了,但有幾個問題
- jj1000 led 燈幾秒會閃一下
- 不動時,有時油門會突然稍微轉一下
- 目前懷疑控輸出的PPM 有問題,導致arduino 計算錯誤
- 上面兩個問題可以調整timing解決
jj1000 對頻方法
X9D
|
Leonardo
|
NRF24L01
|
PPM(pin1)
|
pin2
|
|
Vout(battery
voltage, pin3)
|
Vin
|
|
GND(pin4)
|
GND
|
GND
|
SPI-MISO(pin14)
|
MISO
|
|
SPI-MOSI(pin15)
|
MOSI
|
|
SPI-SCK(pin16)
|
SCK
|
|
pin9
|
CE
|
|
pin10
|
CS
|
|
3.3V
|
VCC
|
|
DBG(pin6
to 5V or 0V)
|
||
我的code(porting to Arduino Leonardo)
Use D:\work\arduino\arduino-1.6.8
porting to
arduino leonardo
1. change pin define
2. add debug function and dynamic debug message
- set DBG_ON=1 in source code
- connect DBG_pin(enable debug) to VCC or GND(disable debug)
3. abstract PPM_INPUT_MIN/MAX
4. fix bug about PPM ISR setup
- use digitalPinToInterrupt(PPM_pin)
5. increase throttle safe check delay to 1s
2. add debug function and dynamic debug message
- set DBG_ON=1 in source code
- connect DBG_pin(enable debug) to VCC or GND(disable debug)
3. abstract PPM_INPUT_MIN/MAX
4. fix bug about PPM ISR setup
- use digitalPinToInterrupt(PPM_pin)
5. increase throttle safe check delay to 1s
原始github source
除了AETR前四個通道,其餘通道功能如下(依協定不同有些微差異)
Channel 5: led
light, 3 pos. rate on CX-10, H7, inverted flight on H101
Channel 6: flip
control
Channel 7:
still camera
Channel 8:
video camera
Channel 9:
headless
Channel 10:
calibrate Y (V2x2), pitch trim (H7), RTH (H8 mini/H20), 360deg flip mode (H8
mini 3D/H22)
Channel 11:
calibrate X (V2x2), roll trim (H7)
Channel 12:
Reset / Rebind
reference:
遙控器輸出PPM格式 http://www.geek-workshop.com/thread-2408-1-1.html
reference:
遙控器輸出PPM格式 http://www.geek-workshop.com/thread-2408-1-1.html
FrSky X9D+ 雙向傳輸協定
為了之後使用arduino DIY 接收機的參考資料:
arduino有現成的lib可以用!!!
官方spec
https://drive.google.com/file/d/0B3S1vckBpeolUFR5T1docXprSjQ/view?usp=sharing
https://drive.google.com/file/d/0B3S1vckBpeolVkJYd0E1MEE2Skk/view?usp=sharing
https://drive.google.com/file/d/0B3S1vckBpeoldzBMUzlRbVQ0S0k/view?usp=sharing
快速線上測試各種語言程式
這個網站很方便,有時候想要快速測試一下語法很好用
http://www.tutorialspoint.com/codingground.htm
例如標準的C可以使用這個:
http://www.tutorialspoint.com/compile_c99_online.php
http://www.tutorialspoint.com/codingground.htm
例如標準的C可以使用這個:
http://www.tutorialspoint.com/compile_c99_online.php
FrSky X9D+ 遙控器語音製作
這支遙控器使用開源的opentx 系統,自由度非常高
可以在各種情境下撥放聲音,例如開關切換、時間倒數電壓警示....
內建語音的部分直接置換SD card內的聲音檔即可,網路上也已經有人做好各國語言的版本可以下載
也可以自己轉聲音檔進去,利用遙控器開關做切換與撥放
自製聲音檔須注意:
- 格式須為wav 32k 16bit mono
參考:
[TTS]文字轉語音
[TTS]文字轉語音
使用各式線上服務, 自行錄下
- Google 翻譯錄下來

工研院文字轉語音Web服務
使用acapela 轉換成語音後可以直接下載,下列是教學
https://www.youtube.com/watch?v=Wvsq4Iio_OA
[80%]DIY 無刷抽風扇
材料:
- 四軸淘汰下來的2212 1000KV + 1050槳
- 250直升機的舊電變
- 12v 5A變壓器
- 伺服機測試器
- 鐵絲網
馬達鎖上附贈的轉接座,
把變壓器改成T插接頭,直接接上直升機的舊電變(內建BEC),即可使用
下一步目標用有厚度的保麗龍切割成圓形,圍在螺旋槳沒有遮蓋到的地方,作成類似導風扇的效果
2015年10月12日 星期一
2015年5月3日 星期日
LG G2 Kitkat 升級 Lollipop 失敗
使用LG PC Suite ,前天收到Android lollipop更新,
但是按下去更新到一半就失敗,無法重開機進入系統,每次開機都卡在download的畫面
LG PC Suite可以重試,但一直無法成功
不過發現到一個現象: 每次更新image,成功的%都漸漸增加,感覺只要花時間一遍遍更新,就可以達到100%
經歷了一整天的重試,終於達到100%而順利開機了!!!!!
============================================================
由於重試幾次失敗後,重新更新就又會需要重新下載更新檔
有找到一個做法可以不用重新下載:
- 下載官方image
- 使用imei查詢機台可用最新的image(KDZ)
- 回傳的XML內會帶下載網址
- 或是上網直接抓
- http://lg-phone-firmware.com/index.php?id_mod=36
- 國家與電信商沒差,只須確認
- 型號 (D802/F320K/F320L...)
- ROM 大小(16/32)
- 使用LG Flash Tool 2014燒錄KDZ
- 上網抓LG Flash Tool 2014
- 解壓縮後將KDZ放到相同資料夾內
- 開啟LGFlashTool2014.exe
- Normal Flash: 不清data
- CSE Flash: 清data
- 第二個頁面按下start即可開始燒錄
- 燒錄失敗後重插USB,繼續重試
2015年1月11日 星期日
linux bash function for switch tmux session(若不存在則重新建立)
可以直接切換到Tmux 不同session
加在.bashrc內
tmux_goto_branch ()
{
P="$1"
if [ "$P" == ""]
then
echo "$0: must enter branch name..."
exit
fi
tmux has -t $PROJ
if [[ "$?" == "0" ]];
then
echo "$0: Session exist, switch to it";
tmux attach -t $PROJ
else
echo "$0: Session not exist, create a new one"
tmux new -s $PROJ -n $PROJ
fi
}
用法: tmux_goto_branch BRANCH_TEST
設定linux shell 提示字元與ssh 登入的title
查看ubuntu 的.bashrc, 可以發現下列設定:
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($ debian_chroot)}\[\033[01;32m\] \u@\h\[\033[00m\]:\[\033[01; 34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($ debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+( $debian_chroot)}\u@\h: \w\a\]$PS1"
;;
*)
;;
esac
其中可以看到如果要改顏色,可以使用顏色標示包起來
登入shell時,提示符號預設長這樣 username@server:~$
使用putty等軟體經由SSH 連入時,可以看到登入視窗的title也會跟著變,由此可知這個title是從linux內拿來的,就是上述最後一組PS1變數的設定
所以經由上述分析,可以寫一個function, 放在.bashrc內,之後就可以簡單的手動設定想要的提示符號與title
set_title ()
{
PS1="${debian_chroot:+($ debian_chroot)}\[\033[01;32m\] $*\[\033[00m\]:\[\033[01;34m\] \w\[\033[00m\]\$ "
PS1="\[\e]0;${debian_chroot:+( $debian_chroot)}$*: \w\a\]$PS1"
}
使用方法:
set_title "test title"
2014年12月15日 星期一
製作windows7 安裝隨身碟,啟用版本選擇
win7開始microsoft已經把所有版本(家用版/專業版....)整合在一起
不過教育版安裝時不會出現選單
前一陣子把筆電重灌,要使用筆電自帶家用進階版的序號,但安裝時如果不裝成家用進階版會拒絕吃這組序號
研究了一下後已經成功,寫個筆記紀錄一下
- 取得win7 ISO(win7 image 皆包含所有版本)
- 下載refus, 使用他將ISO檔製作開機USB 碟
- 雖然win7 image 皆包含所有版本,但有的ISO 無法選擇版本
- 原因是版本已經寫死在source/ei.cfg,由於已經做成隨身碟,將這個檔案拿掉即可選擇
2014年10月9日 星期四
四軸飛行器除錯
目前使用qq super飛控,基本上x 四軸模式可以飛行
配置:
qq super
xxd2212 x4
xsd 30a esc x4
11.1v 2200mah 25c
skyartec sky705 controller/receiver
450機架
飛行時間約11分
不過飛到一半常常會漸漸往左旋轉 ,且飛完後右上與左下無刷馬達會稍微熱一點
目前要等確認機身沒問題後,再開始自製飛控
猜測可能發生問題的地方:
1 正反槳浮力不同
換一組槳也是一樣
2 馬達馬力不同
目前交換左上與左下馬達 下次換測試交換右上與右下馬達看看
3 電變輸出不同
設定跑掉 or 不同批? <== 研究如何設定好盈電變
訂閱:
文章 (Atom)








