2016年8月5日 星期五

DIY google cardboard

從十元的店買了一個望遠鏡來拆鏡片,加上手機盒製成,跟手機搭配性100%






使用Arduino 搭配光電晶體(非光敏電阻)來偵測螢幕高速閃動


這是當初為了工作,偵測螢幕閃動頻率所做的小玩具
使用光電晶體是因為影片通常為30 or 60 fps, 33ms的速度對光敏電阻來說反應太慢

兜起來後發現如果解析度要高,需使用極大的電組(100M歐姆以上),
到電子材料行找了好久才找到一些10M歐姆的來串聯





AR底盤四驅車,改用鋰電與降壓電路調速

原本使用兩顆3號電池約3V, 直接改成兩顆14500鋰電約7.2V
14500大小與3號電池相同,但由於電池是平頭,須對底盤稍微修正干涉的部分

之後在馬達與電池接觸的銅片間斷開,串接上開關是降壓電路以調速




田宮 plasma 馬達電刷折斷修復




透過分解,學習數位由標尺定位的原理





自製簡易14500鋰電定電壓充電器


DIY 修復破箱的行李箱

1. 沿著裂縫邊鑽一對對的洞
2. 使用束線帶縫合
3. 使用3M duct tape (你沒聽錯,就是流言終結者最愛用的那個)黏起來防水





DIY 更換Zenfone2 ZE551ML 螢幕

基本上沒什麼難度,就一直拆螺絲
只有電池黏超緊拆下來時要很小心








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日 星期四

DIY寶特瓶抽絲器

Diy寶特瓶抽絲器

山寨網路上的創意
使用一塊木頭
1. 橫切深度比刀片短邊小一點點
2. 直切一條縫
3. 最後使用金屬墊片固定刀片






我的第一台穿越機 - kingkong250

這是一開始為了研究CC3D 飛控組的
馬達/電變/機身都是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, 使得充電器開啟輸入電壓保護,所以只能改用慢充

網路強者自製 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圓形碳纖棒黏合補強後,再鑽出合適的孔位




JJ1000 小四軸更換馬達

1. 將壞掉的馬達剪下,留一小段線並套上熱縮管
 2. 焊上新馬達

 3.熱縮套移至定位,加熱收縮,並將馬達裝回去

2016年8月3日 星期三

linux share memory用法

http://www.ecst.csuchico.edu/~beej/guide/ipc/shmem.html

可以用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
void *shmat(int shmid, const void *shmaddr, int shmflg);
  • attach會把個shmid的share memory的位址放到shmaddr
  • 若失敗則shmaddr為-1
int shmdt(const void *shmaddr);
  • 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 &amp;&amp; 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}'

混合C與C++的程式

參考這個網站的:
http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html

在c++的程式內,使用C++標準函式庫,需要標明namespace:
#include &lt;&gt;; //cstdio

int main(){
...
std::printf(...);
...
}


在c++的程式內,使用C標準函式庫,用法跟c一樣:
#include &lt;&gt; //stdio.h

int main(){
...
printf(...);
...
}


在c++的程式內,使用C函式庫:
extern "C" {
#include "" //my-header.h
}

int main(){
...
my_func(...);
...
}


若要同一個header file給c與c++直接使用,也可以在header內加上exter "C",並判斷目前是c或c++使用

------------------------------
//my-header.h
#ifdef __cplusplus
extern "C" {
#endif

my-function(...);

#ifdef __cplusplus
}
#endif

------------------------------
//main.cpp

#include "" //my-header.h

int main(){
...
my_func(...);
...
}
------------------------------

若不想要include my-header.h,只要使用某幾個c function,可以直接宣告完整的prototype
//main.cpp
extern "C" my_func(int a, int b, int c);
or
//main.cpp
extern "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.cpp
extern "C" my_cpp_func(int a, int b);

my_cpp_func(int a, int b){
...
}