2012年10月23日 星期二

Google Static Map API 網址範例講解


靜態地圖網址構成:
http://maps.google.com/maps/api/staticmap?
center=24.9678,121.19200
&markers=color:red|label:C|24.9678,121.19200
&zoom=16
&maptype=roadmap
&size=700x700
&sensor=true


center=24.9678,121.19200
#中心點=座標位置<資策會座標>

&markers=color:red|label:C|24.9678,121.19200
#地圖標記=顏色:紅色<自定義>|標記字元:C<自定義>|資策會座標<自定義>

&zoom=16
#放大倍數=16<自定義>

&maptype=roadmap
#地圖樣式=roadmap
· roadmap:(預設) 標準道路圖圖片,與一般在「Google 地圖」網站中顯示的一樣。如果沒有另外指定 maptype 值,Static Maps API 就會根據預設使用 roadmap 方塊。
· satellite:衛星圖片。
· terrain:實際立體模型地圖圖片,可顯示地形和植被。
· hybrid:衛星和道路圖的混合圖片,在衛星圖片上顯示一層透明的主要街道和位置名稱。

&size=700x700
#圖片解析度=700x700<自定義>

&sensor=true
#感應器偵測=開啟

2012年10月22日 星期一

QT4.8 Porting on ARM6410L/編譯環境 Ubuntu 10.04LTS Kernel 2.6.32-38-generic

-----------------前置工作安裝Cross Tool Chain -----------------

sudo apt-get install autoconf automake libtool
wget https://www.dropbox.com/s/viw8gg5n896kfu3/4.3.1-eabi-armv6-20080707.tar.bz2
sudo mkdir -p /usr/local/arm
sudo chmod 1777 /usr/local/arm
sudo chown -R $USER:$GROUPS /usr
cd /usr/local/arm
tar jxvf ~/Download/4.3.1-eabi-armv6-20080707.tar.bz2
vi .bashrc在底下新增兩行
CCACHE_PATH=/usr/local/arm/4.3.1-eabi-armv6/usr/bin:$CCACHE_PATH
PATH=/usr/local/arm/4.3.1-eabi-armv6/usr/bin:$PATH
重新啟動Terminal 或者source .bashrc

-----編譯需要的函式庫:zlib、tslib、libmad、libid3tag、madplay-----


wget http://www.csie.nctu.edu.tw/~yenming/lab.tar.gz
tar xvf lab.tar.gz
//移植zlib
tar xvf zlib-1.2.5.tar.gz
cd  zlib-1.2.5/
./configure --prefix=/opt/arm/usr --shared
vi Makefile
修改
AR=arm-linux-ar rc
RANLIB=arm-linux-ranlib
make
make install
//移植tslib
wget https://www.dropbox.com/s/0zi00hu2nri9nxa/tslib1.4.tar.gz.gz
tar xvf tslib1.4.tar.gz
cd tslib
./autogen.sh
./configure --prefix=/opt/arm/usr CC=arm-linux-gcc --host=arm-linux ac_cv_func_malloc_0_nonnull=yes
make
make install
vi /opt/arm/usr/etc/ts.conf
將第二行
#module_raw input
改成module_raw input  (注意前方不要留空格)

module variance delta=300  //濾波參數
module dejitter delta=500    //降噪參數
//移植libmad
tar xvf libmad-0.15.1b.tar.gz
cd  libmad-0.15.1b
./configure --host=arm-linux --prefix=/opt/arm/usr --disable-shared --disable-debugging
vi Makefile
刪除--fforce-mem字串
make
make install
//移植libid3tag
sudo apt-get source libid3tag
sudo chown -R  $USER:$GROUPS libid3tag-0.15.1b
./configure CC=/usr/local/arm/4.3.1-eabi-armv6/usr/bin/arm-linux-gcc --prefix=/opt/arm/usr --host=arm-linux --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/opt/arm/usr/include LDFLAGS=-L/opt/arm/usr/lib
make
make install
//移植madplay
sudo apt-get source madplay
sudo chown -R $USER:$GROUPS madplay-0.15.2b
./configure CC=/usr/local/arm/4.3.1-eabi-armv6/usr/bin/arm-linux-gcc --prefix=/opt/arm/usr --host=arm-linux --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/opt/arm/usr/include LDFLAGS=-L/opt/arm/usr/lib
make
make install
---------------------進入正題,開始移植Qt4.8---------------------
wget http://releases.qt-project.org/qt4/source/qt-everywhere-opensource-src-4.8.2.tar.gz
tar xvf  qt-everywhere-opensource-src-4.8.2.tar.gz
cd qt-everywhere-opensource-src-4.8.2
export QTDIR=$PWD
export PATH=$QTDIR:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:/opt/arm/usr/lib:$LD_LIBRARY_PATH
vi $QTDIR/mkspecs/qws/linux-arm-g++/qmake.conf
QMAKE_CC = arm-linux-gcc
QMAKE_CXX = arm-linux-g++
QMAKE_LINK = arm-linux-g++
QMAKE_LINK_SHLIB = arm-linux-g++
QMAKE_AR = arm-linux-ar cqs
QMAKE_OBJCOPY = arm-linux-objcopy
QMAKE_STRIP = arm-linux-strip

mkdir -p /opt/arm/usr
./configure --prefix=/opt/arm/usr -xplatform qws/linux-arm-g++ -little-endian -no-qvfb -embedded arm -qt-zlib -qt-libpng -qt-libtiff -qt-libmng -qt-libjpeg  -no-webkit -no-freetype -no-openssl -qt-mouse-tslib -L/opt/arm/usr/lib -I/opt/arm/usr/include 
//出現選擇 、這是版權問題的選擇、如果用在商業用途請詳細確認
Type 'c' if you want to use the Commercial Edition.
Type 'o' if you want to use the Open Source Edition.
# 輸入o
Type '3' to view the GNU General Public License version 3.
Type 'L' to view the Lesser GNU General Public License version 2.1.
Type 'yes' to accept this license offer.
Type 'no' to decline this license offer.
# 輸入yes 

//可以去買個飲料, 大約10分鐘
make
//可以吃個飯, 大約50分鐘
make install
//大約15分鐘

將編好的程式移植到目標版上
mkdir -p ~/rootfs/opt/arm/usr
cp -a /opt/arm/usr ~/rootfs/opt/arm/usr

vi ~/rootfs/etc/profile
---新增以下內容---

export TSLIB_ROOT=/opt/arm/usr
export TSLIB_TSDEVICE=/dev/event1
export TSLIB_CALIBFILE=$TSLIB_ROOT/etc/pointercal
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export QTDIR=/opt/arm/usr
export QWS_MOUSE_PROTO="tslib"
export QWS_DISPLAY=LinuxFb:mmWidth=100:mmHeight=100
export QWS_SIZE="480x272"
export PATH="/opt/arm/usr/bin:$PATH"
export LD_LIBRARY_PATH="/opt/arm/usr/lib:$LD_LIBRARY_PATH"
export PKG_CONFIG_PATH="/opt/arm/usr/lib/pkgconfig"


如果你是用燒錄影像檔的方式到目標板上的話
在此特別注意影像檔案大小
是否超過編譯Kernel時所設定的rootfs容量大小
相關設定在kernel源碼資料夾下的
arch/arm/plat- s3c/include/plat/partition.h
如果有超過卻有沒修改的話會有以下幾個錯誤特徵:
無法正常開機
遺失一些lib
某些指令無法正常執行
所以~還是儘快重編kernel調整磁區大小吧!
另外簡單介紹一下partition.h 設定參數
offset表示開始位置size表示容量大小
像右圖就是設定
.name="U-boot",
.offset = 0,
.size    = (4*SZ_1M),
.name="Kernel",
.offset  (1*SZ_1M),
.size (1*SZ_3M),
0x8000000換算為10進位剛好是本塊nand flash大小128Mb

/****在目標版上測試tslib能否使用****/
在目標版執行tslib1.4校正TouchPanel
ts_calibrate
校正Touch Panel邊界,跟著它出現的畫面做操作
ln -s /opt/arm/usr/etc/pointercal /etc/pointercal
建置連結tslib執行時會參照的檔案
ts_test
測試Touch Panel是否正常
/****在目標版上測試QT及其觸控供能否使用****/
opt/arm/usr/demo/textedit/textedit -qws


2012年10月21日 星期日

ADC0804實作電路與功能展示

由於我們使用ADXL_335三軸加速度感測模組為類比輸出,故需搭配ADC(Analog to Digital Converter)將其數值作為轉換,轉換單位大小可由10k可變電阻調整。
因為x、y、z軸都需要一個ADC作為轉換、轉換後的數位輸出共佔3*8個Port,我們還需要2*2的Port作為HC-SR04超音波測距模組驅動與接收訊號腳、並且需要有4個與Arm-6410L作溝通的GPIO腳位;但8051上面所提供的Port不夠我們使用,所以
最後選擇Arduino Mega 2560為我們最後的前端微處理器。
以下為實作8051透過ADC讀取三軸加速度傳感器上Z軸G值:
(圖上按鍵與兩條連結線請無視;當初忘了拔起來)





GPS GR-210 Mini Din 電源線材DIY

等阿等~終於等到學長拿GPS來借我們用
阿~什麼?沒有電源?要自己想辦法?
好吧~只好發揮DIY精神利用2.5mmDC公母座自己做一個Mini Din的轉5V2A電源
實作過程忘了拍就算了吧...我們直接看完工照

注意:本張圖片只限GR-210轉接使用!這是實測的圖、跟市面上公規的相反;要實作最好還是自己先量過VCC跟GND腳位喔!



Arduino Mega 2560 Sensor Code 解說

/*這段程式包含了讀取三軸加速度感測模組ADXL-335 xyz軸的類比輸出、超音波測具模組HC-SR04*2的輸出控制及輸入接收與距離換算,在程式內我們定義HC-SR04有效偵測距離為2.5m以下。
我們將Sensor所偵測的資料透過判斷式轉換成訊號事件表signal[3][3]並定義什麼樣的訊號組合該做什麼樣的回饋,並具有優先判斷碰撞的功能。*/
/*****************靈敏度調適*****************/
const int sr_ran=30; //超音波警示距離30cm
const int ad_ran=20; //三軸20個單位
/*****************環境參數******************/
int first=1;//宣告第一次讀取感測試值旗標
unsigned long time=0; //宣告晶片開啟時間暫存器
unsigned long previoustime=0; //宣告前一次晶片開啟時間暫存器
const unsigned int delaytime=1000; //宣告自定義延遲時間ms
const unsigned long timeout=15000;
/*宣告HC-SR04偵測之有效距離換算式為(2*距離/音速)秒=
29.41(公分/微秒)
我們所使用之宣告為微秒(μs)
沒有設定的話 pulseIn()的timeout預設為1秒,
注意timeout設定值要適宜、太高的話在超音波任何一邊沒有收到echo訊號的情況下
會嚴重影響到讀取感測器數值的速度!;太低則讀取不到echo訊號!*/
/**************** 超音波測距模組****************/
const int f_TrigPin = 4; //宣告前方超音波發送腳位f_TrigPin為PWM I/O 4
const int f_EchoPin = 5; //宣告前方超音波接收腳位f_EchoPin為PWM I/O 5
const int b_TrigPin = 6; //宣告後方超音波發送腳位b_TrigPin為PWM I/O 6
const int b_EchoPin = 7; //宣告後方超音波接收腳位b_EchoPin為PWM I/O 7
/****************超音波感測值暫存器****************/
long f_duration,b_duration, f_cm,b_cm;
//前方傳回時間,後方傳回時間,前方換算距離,後方換算距離
/****************三軸加速度感測器****************/
const int x = 0; //設定x軸讀取腳位 0
const int y = 1; //設定y軸讀取腳位 1
const int z = 2;//設定z軸類讀取腳位 2
/****宣告x、y、z_in暫存器用來放置三軸加速度數據****/
int x_in;
int y_in;
int z_in;
/****宣告x、y、z_bef暫存器用來放置前一次的三軸加速度數據****/
int x_bef;
int y_bef;
int z_bef;
/*****定義數位腳位47,49,51,53為與Arm6410L溝通之GPIO****/
int sig0=47;
int sig1=49;
int sig2=51;
int sig3=53;
/*****訊號事件列表*****/
int front=0,back=0,treaix=0;//宣告訊號暫存器
const char signal[3][3]={0,2,0,1,0,1,0,2,0};
//0代表安全狀態,1代表前方距離警示,2代表後方距離警示
/****輸入、輸出與鲍率設定****/
void setup()
{
/*******設定鲍率********/
Serial.begin(9600);
/*******設定sig0,1,2,3為GPIO輸出********/
pinMode(sig0,OUTPUT);
pinMode(sig1,OUTPUT);
pinMode(sig2,OUTPUT);
pinMode(sig3,OUTPUT);
/*******設定超音波測具模組I/O*******/
pinMode(f_TrigPin,OUTPUT);
pinMode(f_EchoPin,INPUT);
pinMode(b_TrigPin,OUTPUT);
pinMode(b_EchoPin,INPUT);
/*******設定三軸加速度感測模組I/O*******/
pinMode(x,INPUT);
pinMode(y,INPUT);
pinMode(z,INPUT);
}
/****主程式****/
void loop()
{
sigcache:
/**** 讀取三軸加速器數值 ***/
x_in = analogRead(x);
y_in = analogRead(y);
z_in = analogRead(z);
/*********** 超音波前方 *********/
digitalWrite(f_TrigPin, HIGH);
delayMicroseconds(10); //延遲10微秒
digitalWrite(f_TrigPin, LOW);
f_duration = pulseIn(f_EchoPin, HIGH,timeout); //f_duration=傳回時間
f_cm = microsecondsToCentimeters(f_duration); //前方距離換算
/*********** 超音波後方 *********/
digitalWrite(b_TrigPin, HIGH);
delayMicroseconds(10); //延遲10微秒
digitalWrite(b_TrigPin, LOW);
b_duration = pulseIn(b_EchoPin, HIGH,timeout); //b_duration=傳回時間
b_cm = microsecondsToCentimeters(b_duration); //後方距離換算
/************前方測距結果印出************/
Serial.print(“Front distance:");
Serial.print(f_cm);
Serial.println(" cm");
/************後方測距結果印出************/
Serial.print(“Back distance:");
Serial.print(b_cm);
Serial.println(" cm");
/************判斷式回饋區************/
if(( f_cm > sr_ran ))
front=0;
if(( f_cm!=0 )&&( f_cm < sr_ran))
front=1;
if(f_cm==0)
front=2;
if(( b_cm > sr_ran ))
back=0;
if(( b_cm!=0 )&&(b_cm < sr_ran))
back=1;
if(b_cm==0)
back=2;
treaix=(z_in < ( z_bef – ad_ran ) ) || ( z_in > ( z_bef + ad_ran ));
/***********事件回饋區***********/
if(first==0)
{
if(treaix) //碰撞事件
{
digitalWrite(sig3, HIGH),digitalWrite(sig2, LOW),digitalWrite(sig1, LOW),digitalWrite(sig0, LOW);
//GPIO碰撞事件訊號
Serial.println(“================================================================CRASH================================================================");
delay(1000); //等一秒
digitalWrite(sig3, LOW),digitalWrite(sig2, LOW),digitalWrite(sig1, LOW),digitalWrite(sig0, LOW);
//GPIO碰撞事件訊號還原
}
}
if(first==1) //剛開機沒有辦法取得前一次x、y、z數值,故需設定此旗標
{
first=0;
x_bef=x_in; //將前一次x軸數質放入x_bef儲存
y_bef=y_in; //將前一次y軸數質放入y_bef儲存
z_bef=z_in; //將前一次z軸數質放入x_bef儲存
}
switch(signal[front][back])
{
case 0:
goto sigcache; //如果為安全狀態、重新取的感測數值
case 1:
x_bef=x_in; //將前一次x軸數質放入x_bef儲存
y_bef=y_in; //將前一次y軸數質放入y_bef儲存
z_bef=z_in; //將前一次z軸數質放入z_bef儲存
digitalWrite(sig0, HIGH);//GPIO事件1訊號
Serial.println(“=========================================================Front BOMB=========================================================");
previoustime=millis();
while((time=millis()-previoustime) < delaytime) //自定義延時令我們在延時過程中還能讀取三軸資料做判斷運算
{
x_in = analogRead(x); //讀取x軸加速器數值
y_in = analogRead(y); //讀取y軸加速器數值
z_in = analogRead(z); //讀取z軸加速器數值
Serial.println(“=========================================================delay=========================================================");
if((z_in < ( z_bef – ad_ran ) ) || ( z_in > ( z_bef + ad_ran )))
{
digitalWrite(sig3, HIGH),digitalWrite(sig2, LOW),digitalWrite(sig1, LOW),digitalWrite(sig0, LOW);//GPIO碰撞事件訊號
Serial.println(“================================================================CRASH================================================================");
delay(1000); //等一秒
digitalWrite(sig3, LOW),digitalWrite(sig2, LOW),digitalWrite(sig1, LOW),digitalWrite(sig0, LOW);//GPIO碰撞事件訊號還原
}
}
digitalWrite(sig0, LOW); //還原GPIO事件訊號
break;
case 2:
x_bef=x_in; //將前一次x軸數質放入x_bef儲存
y_bef=y_in; //將前一次y軸數質放入y_bef儲存
z_bef=z_in; //將前一次z軸數質放入z_bef儲存
digitalWrite(sig1, HIGH);//GPIO事件2訊號
Serial.println(“=========================================================Back BOMB=========================================================");
previoustime=millis();
while((time=millis()-previoustime) < delaytime) //自定義延時令我們在延時過程中還能讀取三軸資料做判斷運算
{
x_in = analogRead(x);
y_in = analogRead(y);
z_in = analogRead(z);
Serial.println(“=========================================================delay=========================================================");
if((z_in < ( z_bef – ad_ran ) ) || ( z_in > ( z_bef + ad_ran )))
{
digitalWrite(sig3, HIGH),digitalWrite(sig2, LOW),digitalWrite(sig1, LOW),digitalWrite(sig0, LOW);//GPIO事件2訊號
Serial.println(“================================================================CRASH================================================================");
delay(1000); //等一秒
digitalWrite(sig3, LOW),digitalWrite(sig2, LOW),digitalWrite(sig1, LOW),digitalWrite(sig0, LOW);//GPIO事件2訊號還原
}
}
digitalWrite(sig1, LOW);//還原GPIO事件2訊號
break;
}
}
/** 將音速轉換成距離 『物體距離(公分) =回應時間÷29.41(公分/微秒)÷2(來回)』**/
long microsecondsToCentimeters(long microseconds)
{
return microseconds / 29.41 / 2;
}

Arduino Mega 2560 簡介 & 環境安裝

Arduino Mega 2560  簡介
Arduino Mega 2560為使用C語言作為開發環境的微控制器
本身具有54組數位I/O input/output端(其中14組可做PWM輸出),16組類比I/O,4組UART(hardware serial ports),32組數位I/O,使用 16 MHz 的晶體震盪器。

由於具有bootloader,因此能夠通過USB直接下載程式而不需經過其他外部燒入器。
供電部份可選擇由USB直接提供電源,或者使用變壓器及電池作為外部供電。
由於開放原代碼,以及使用Java概念(跨平臺)的C語言開發環境,讓Arduino的周邊模組以及應用迅速的成長。(網路上可以找到很多相關應用程式碼、LIB、硬體套件)


環境安裝



將Arduino與電腦連接,在電腦上、裝置管理員-通用序列匯流排控制器會找到未安裝的裝置、
在此裝置上按滑鼠右鍵選擇更新驅動程式:
->選擇是,只有現在
->選擇從清單或特定位置安裝
->選擇搜尋時包括這個位置:(指定到我們主程式包的資料夾)
->下一步

完成安裝驅動程式,並記下此裝置使用的COMPORT(COM1、COM2...)。

到主程式資料夾開啟arduino.exe

在File下拉式選單中開啟Preferences視窗

在第二行的語言選項 選擇繁體中文

在Tools下拉式選單中將Board選項設為Arduino Mega 2560

在Tools下拉式選單中將Serial Port選項設為驅動程式所設定之COM Port

重新啟動arduino.exe 完成所有設定








BOA Server on Ubuntu PC架設流程

wget http://www.csie.nctu.edu.tw/~yenming/lab.tar.gz //取得Boa程式碼
tar xvf lab.tar.gz
tar xvf boa-0.94.14c21.tar.gz
cd boa-0.94.14c21

vi src/boa.c

將247~252行註解掉./configure

make

sudo cp src/boa /usr/bin

sudo mkdir -p /etc/boa

sudo mkdir -p /var/www/cgi-bin

cd boa-0.94.14c21/examples

vi boa.conf

48行 User 0

49行 Group 0

74行 Errorlog&87行 AcessLog
可以不指定 或者到他指定的地方touch檔案並設成777權限

118行ServerName 把#拿掉

158行 DocumentRoot /var/www

177行 DirectoryMaker /etc/boa/boa_indexer

207行 text/html

211行 CGIPATH /bin:/usr/bin:/var/www/cgi-bin

240行 ScripAlias /cgi-bin/ /var/www/cgi-bin/

sudo cp boa.conf /etc/boa

將想要掛載的首頁檔案命名為index.html 放在/var/www/

打開Terminal 打上sudo bao即可掛載完成

ifconfig 查看當前ip位置

在瀏覽器上打上ip位置即可瀏覽boa首頁