從十元的店買了一個望遠鏡來拆鏡片,加上手機盒製成,跟手機搭配性100%
2016年8月5日 星期五
使用Arduino 搭配光電晶體(非光敏電阻)來偵測螢幕高速閃動
這是當初為了工作,偵測螢幕閃動頻率所做的小玩具
使用光電晶體是因為影片通常為30 or 60 fps, 33ms的速度對光敏電阻來說反應太慢
兜起來後發現如果解析度要高,需使用極大的電組(100M歐姆以上),
到電子材料行找了好久才找到一些10M歐姆的來串聯
AR底盤四驅車,改用鋰電與降壓電路調速
原本使用兩顆3號電池約3V, 直接改成兩顆14500鋰電約7.2V
14500大小與3號電池相同,但由於電池是平頭,須對底盤稍微修正干涉的部分
之後在馬達與電池接觸的銅片間斷開,串接上開關是降壓電路以調速
PID study
很不錯的影片表示PID 間的關係
https://www.facebook.com/permalink.php?story_fbid=1127678127264480
超淺顯易懂的教學
http://robotrabbit.blogspot.tw/2012/12/pid-pid.html?m=1
自製田宮四驅車改遙控車
補充,沒想到網路上也有人跟我做類似的事....
https://www.facebook.com/gesarichi/videos/10207311536620297/
自製四驅車改裝遙控車,且加裝轉向機構
(#15258 http://www.tamiya.com/english/products/15258steering/steering.htm)
目前已經可以使用遙控器,像遙控車一樣控制
電池的做法跟之前改裝類似(http://ddddiy.blogspot.tw/2016/08/ar.html),所以可以沿用四驅車的開關
電源直接提供給電子變速器,電變內建BEC供電給接收機
接收機接受到訊號後,一動輸出用來控制電變改變車速,另一動用來做轉向
去公園實際試跑,發現跟真的遙控車相比有幾個缺點
1. 改裝的這顆電變只有前進和剎車沒有後退
2. 前輪轉向幅度不夠,造成轉彎半徑太大,且轉到底時阻力太大<==#15258機構問題
3. 輪徑太小且無避震,在溜冰場之類的平地比較適合
2016年8月4日 星期四
我的第一台穿越機 - kingkong250
這是一開始為了研究CC3D 飛控組的
馬達/電變/機身都是kingkong出品,出名的CP值高
由於塑膠機身太不耐摔了,後來已經改成使用碳纖機架
http://ddddiy.blogspot.tw/2016/08/qav250.html
馬達/電變/機身都是kingkong出品,出名的CP值高
由於塑膠機身太不耐摔了,後來已經改成使用碳纖機架
http://ddddiy.blogspot.tw/2016/08/qav250.html
QAV250組裝 - 修改為電池放入機身
QAV250組裝 - 修改為電池放入機身
原始機架設計如第一章圖,四個機臂為3mm碳纖版,機身部分使用兩片1mm碳纖夾著鎖起來
我修改為下面碳纖跟機臂加入2cm M3銅柱,將所有電裝都裝在這層的空間
上層空間剛好可以直放3s 2200 電池,修掉後面干涉電源線的部分即可
自製18650 行動充電站
架構:
27 顆18650, 2600mah
點焊成9並三串,最終為 11.1v/23.4Ah, 並拉出T插接頭 與分壓接頭
B6充電器直接改裝拉出T插公頭,可以額外吃充電站的電
目前實測只能全速充兩輪四軸的電池(11.1v 2200mAh * 6),第三輪由於高電流壓降會到低於10V, 使得充電器開啟輸入電壓保護,所以只能改用慢充
27 顆18650, 2600mah
點焊成9並三串,最終為 11.1v/23.4Ah, 並拉出T插接頭 與分壓接頭
B6充電器直接改裝拉出T插公頭,可以額外吃充電站的電
目前實測只能全速充兩輪四軸的電池(11.1v 2200mAh * 6),第三輪由於高電流壓降會到低於10V, 使得充電器開啟輸入電壓保護,所以只能改用慢充
網路強者自製 FrSky 規格接收 - RX-F801
網路強者自製 的FrSky 規格接收 - RX-F801 終於收到了,
實際測試一兩百公尺都沒問題
下個目標是研究支援雙向傳輸協定
spec 可參考之前文章:http://ddddiy.blogspot.tw/2016/08/frsky-x9d_3.html
網路上討論/開發的網址: http://www.rcgroups.com/forums/showthread.php?t=2124647
[30%] 自製F450 四軸機架 - 目前到達第二代
原本使用市售F450機架
第一代:
10mm碳纖管,由於螺絲直接對所應力大,加上墜機碳纖管很容易裂掉報銷
所以開始研發第二代...
第二代:
主結構為四根25cm 碳纖管,外方內圓(8mm x 6mm)
在中心板跟馬達座部分使用6mm圓形碳纖棒黏合補強後,再鑽出合適的孔位
第一代:
10mm碳纖管,由於螺絲直接對所應力大,加上墜機碳纖管很容易裂掉報銷
所以開始研發第二代...
第二代:
主結構為四根25cm 碳纖管,外方內圓(8mm x 6mm)
在中心板跟馬達座部分使用6mm圓形碳纖棒黏合補強後,再鑽出合適的孔位
2016年8月3日 星期三
linux share memory用法
http://www.ecst.csuchico.edu/~beej/guide/ipc/shmem.html
可以用man 2 shmget查詢相關資料
需要include
主要有四個function:
int shmget(key_t key, size_t size, int shmflg);
若要移除已經建立的share memory,須使用shmctl:
先拿到shmid之後,用shmctl即可移除
shmctl(shmid,IPC_RMID,0);
可以用man 2 shmget查詢相關資料
需要include
sys/shm.h
主要有四個function:
- shmget() - 建立共享記憶體
- shmat() - attach 共享記憶體
- shmdt() - detach 共享記憶體
- shmctl() - 設定共享記憶體
int shmget(key_t key, size_t size, int shmflg);
- key可以這樣用:(key_t)1234
- size:以byte為單位的大小
- shmflag:
IPC_CREATE | 0666
(0666是權限) - 若shmflag內有IPC_EXCL 則表示:
若之前用同一個key建立過share memory,則此次建立會失敗(防止用到已創立過的)
若沒用這flag就會連接到同一個地方 - 回傳值是shmid,錯誤時則會回傳-1
- attach會把個shmid的share memory的位址放到shmaddr
- 若失敗則shmaddr為-1
- detach
若要移除已經建立的share memory,須使用shmctl:
先拿到shmid之後,用shmctl即可移除
shmctl(shmid,IPC_RMID,0);
寫個簡單範例.
#include#include int main(int argc, char* argv[]){ int data[100]; int shmid; void *shared_memory = (void *)0; shmid = shmget ((key_t) 123, sizeof (int) * 100, 0666 | IPC_CREAT); if (shmid == -1) { fprintf (stderr, "shmget failed\n"); exit (1); } shared_memory = shmat (shmid, (void *)0, 0); if (shared_memory == (void *)-1) { fprintf (stderr, "shmat failed\n"); exit (1); } printf ("Memory attached at %X\n", shared_memory); if(argc == 2 && strcmp(argv[1], "-d") == 0){ printf("reset data to 0!\n"); ((int *)shared_memory)[0] = 0; } printf("old data:%d\n", ((int *)shared_memory)[0]++); printf("new data:%d\n", ((int *)shared_memory)[0]); exit(0); }
取得LINUX系統實際記憶體剩餘空間
在linux下,沒用到的記憶體空間會被拿來當作buffer/cache使用,
以加速I/O存取
所以會感覺記憶體占用很多,
其實實際上如果程式需要記憶體,
就會釋放buffer/cache的空間,所以通常記憶體幾乎都是保持在很高的使用量。
使用free指令,
"-/+ buffers/cache"那一行的free就是實際上系統剩下來沒被其他程式吃掉的記憶體大小
可以用以下的指令取得真實的剩餘空間
echo -n free memory:;free -m | grep buffers/cache | awk '{print $4}'
以加速I/O存取
所以會感覺記憶體占用很多,
其實實際上如果程式需要記憶體,
就會釋放buffer/cache的空間,所以通常記憶體幾乎都是保持在很高的使用量。
使用free指令,
"-/+ buffers/cache"那一行的free就是實際上系統剩下來沒被其他程式吃掉的記憶體大小
可以用以下的指令取得真實的剩餘空間
echo -n free memory:;free -m | grep buffers/cache | awk '{print $4}'
混合C與C++的程式
參考這個網站的:
http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html
在c++的程式內,使用C++標準函式庫,需要標明namespace:
#include <>; //cstdioint main(){...std::printf(...);...}
在c++的程式內,使用C標準函式庫,用法跟c一樣:
#include <> //stdio.hint main(){...printf(...);...}
在c++的程式內,使用C函式庫:
extern "C" {#include "" //my-header.h}int main(){...my_func(...);...}
------------------------------//my-header.h#ifdef __cplusplusextern "C" {#endifmy-function(...);#ifdef __cplusplus}#endif------------------------------//main.cpp#include "" //my-header.hint main(){...my_func(...);...}------------------------------
若不想要include my-header.h,只要使用某幾個c function,可以直接宣告完整的prototype
//main.cpp
extern "C" my_func(int a, int b, int c);
or
//main.cppextern "C" {my_func1(int a, int b, int c);my_func2(int a, int b, int c);my_func3(int a, int b, int c);}
用到時直接用
//main.cpp
my_func1(...);
若要讓c程式call到c的某個function, 使用extern "C"可以使complier將此function給linker的資訊使用c的格式
//my.cppextern "C" my_cpp_func(int a, int b);my_cpp_func(int a, int b){...}
訂閱:
文章 (Atom)

















































