2016年2月11日 星期四

益杉A4 空氣感測器 + 2X16 LCD 
將 A4 PM2.5感測器的排線剪斷(沒錯,不要懷疑),並將第1,2,5根接線(分別為紫色、橘色、色)。
第一根接線(紫) 5V 接腳,將第二根接線(橘)插入 GND 接腳,將第根線( MSP430 Launchpad P1.1 RX接腳 如下圖

用開源的工具Energia 不用太多的學習,這個 code  SerialDisplay 是從  File  Examples  LquidCrystal  修改來的。

Energia sketches are C/C++ based and compiled with the open-source compiler MSPGCC. The Energia language comes from Wiring. The Energia environment is based on Processing and includes modifications made by Wiring.




// include the library code:
#include  "LiquidCrystal.h"
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(P2_0, P2_1, P2_2, P2_3, P2_4, P2_5);
unsigned int PM25 = 0; 
void setup() {
  lcd.begin(16, 2);   // set up the LCD's number of columns and rows: 
  Serial.begin(9600);   // opens serial port, sets data rate to 9600 bps
}

void SerialData()
{
  uint8_t mData = 0;
  uint8_t i = 0;
  uint8_t mPkt[32] = {0};
  while (Serial.available())
  {
    mData = Serial.read();
lcd.clear();
    delay(2);
    if (mData == 0x32) 
    { 
      mPkt[0] =  mData; 
      mData = Serial.read();
      if (mData == 0x3d)
      {
        mPkt[1] =  mData; 
        for (i = 2; i < 30; i++)         {
          mPkt[i] = Serial.read();
          delay(2);
        }
        PM25 = (uint16_t)mPkt[7] | (uint16_t)(mPkt[6] << 8);
        return;
      }
    }
  }
  mData = Serial.read();
  lcd.println(mData);
}
void loop() {
  SerialData(); 
  lcd.print("PM2.5=");
  lcd.print(PM25);
  lcd.println(" ug/m3");
  delay(500);

}
有圖有真相,在沒用 Energia 之前用TI 的CCS 光是工具就浪費了很多時間。
下一步就是接上WiFi 讓手機可以連,再用手機的GPS資訊和PM 值送上 internet


2013年5月20日 星期一

ssh 登入反應慢 & sftp logging 功能開啟

從 client 端 ssh 連至 linux 主機,輸入 account 後總是要等很久才會顯示要求輸入密碼。

解決方式1: ‧vi /etc/ssh/sshd_config 增加 UseDNS no 在此檔案內。
解決方式2: ‧vi /etc/ssh/ssh_config 修改 GSSAPIAuthentication yes 為 GSSAPIAuthentication no 
這樣一來重新登入 linux 主機應該就不會遇到反應很慢的問題了。(至少在我設定後是可行的) 


2. 從 client 端使用 winscp (sftp) 上傳 or 下載檔案都沒 log 可以查看做了些什麼事。

解決方式:
#vi /etc/ssh/sshd_config
修改 Subsystem sftp /usr/lib/openssh/sftp-server 為 Subsystem sftp

/usr/lib/openssh/sftp-server -l INFO -f LOCAL1

#vi /etc/syslog.conf 新增設一行
 local1.info /var/log/sftp.log
#/etc/init.d/ssh restart ;
#/etc/init.d/sysklogd restart
使用 winscp 上傳 or 下載檔案後再看看 server 上的 /var/log/sftp.log ,什麼都記下來了。

2010年7月20日 星期二

QTFont: Cannot find font directory

通过buildroot配置编译好qtopia后,下载到开发板上,配置好环境变量:

export QWS_DISPLAY="LinuxFb:mmWidth480:mmHeight272:0"
export QWS_SIZE="480x272"
export LD_LIBRARY_PATH=/usr/lib

然后去运行demo程序,出现:

# /usr/demos/chip/chip -qws
QFontDatabase: Cannot find font directory /home/crifan/buildroot/buildroot-2009.08/project_build_arm/uclibc/root/usr/lib/fonts - is Qt installed correctly?
Aborted

【解决过程】

1.由于之前已经折腾了关于qtopia的配置并编译,所以,对于qt的官方的文档中的这部分说明:

http://qt.nokia.com/doc/qtopia4.3/running-qtopia.html

“Environment Settings to Run Qtopia

There are no specific environment variables required to run Qtopia, however there are some that can be set to control Qtopia's features.

If you specified -no-rpath you will need to set LD_LIBRARY_PATH so that the libraries can be found.

Qtopia does not require PATH to be set but third party applications may expect it to include /bin.

You may wish to set some environment variables to configure Qtopia Core. You may also need to set QTOPIA_PHONE_DEVICE. See Qtopia Environment Variables for details on how to set environment variables.



应该还算理解了其意思,说的是,如果你当初编译qtopia的时候,在./configure 中加了-no-rpath,根据说明:

“ -no-rpath .......... Do not use the library install path as a runtime
library path.
+ -rpath ............. Link Qt libraries and executables using the library
install path as a runtime library path. Equivalent
to -R install_libpath


意思就是,不要使用你的安装路径,即-prefix指定的路径,如果没用-prefix指定,那么就是默认的/usr/local /Trolltech/QtEmbedded-4.5.3:
“ -prefix ...... This will install everything relative to
(default /usr/local/Trolltech/QtEmbedded-4.5.3)”

而我这里当初配置的是-prefix $(TARGET_DIR)/usr,即 -prefix /home/crifan/buildroot/buildroot-2009.08/project_build_arm/uclibc/root /usr意思是将qtopia安装到buildroot中rootfs中的usr下面。

并且,按照其说明,不需要配置其他环境变量了,只是由于编译的时候,加了-no-rpath,所以需要配置一下对应的 LD_LIBRARY_PATH,这里由于之前配置成/home/crifan/buildroot/buildroot-2009.08 /project_build_arm/uclibc/root/usr,buildroot中make的时候,编译qt并make install到对应的rootfs文件夹的usr下面了,而现在rootfs已经烧写到板子了,已经进了rootfs了,所以要配置成/usr /lib,以便qt程序运行的时候,能找到对应的库文件。

所以,其他参数,应该就没有再需要配置的了,应该就可以工作的了。

而且,关于

http://qt.nokia.com/doc/qtopia4.3/qtopiacore-envvars.html

中,也介绍了,关于qt-core的一些环境变量,主要是QWS_DISPLAY,我这里,也按照网上别人的帖子和官方文档中的说明,去配置了:

export QWS_DISPLAY="LinuxFb:mmWidth480:mmHeight272:0"
export QWS_SIZE="480x272"



export QWS_DISPLAY="LinuxFb:/dev/fb0"
了,但是,还是无法工作,运行测试程序,还是显示错误:

# /usr/demos/mainwindow/mainwindow -qws
QFontDatabase: Cannot find font directory /home/crifan/buildroot/buildroot-2009.08/project_build_arm/uclibc/root/usr/lib/fonts - is Qt installed correctly?

最后,无意间,在网上看到别人的帖子:

http://hi.baidu.com/a263238386/blog/item/6ff055dda933033e5882dd32.html

发现有个关于qt font的环境变量:export QT_QWS_FONTDIR=$QTDIR/lib/fonts

所以,自己就去加了一下:

export QT_QWS_FONTDIR=/usr/lib/fonts

export LD_LIBRARY_PATH=/usr/lib
或者

export QTDIR=/usr
export LD_LIBRARY_PATH=$QTDIR/lib
export QT_QWS_FONTDIR=$QTDIR/lib/fonts

结果,qt的demo程序就可以运行了,呵呵。

总结一下解决方法就是:

正确设置QT_QWS_FONTDIR, 指定qt的font具体路径,这样程序才能找到font。

此处我的是

export QT_QWS_FONTDIR=/usr/lib/fonts

实际结果表明,这些相关的qt的环境变量,是必须的,要指定好对应的位置,让qt能找到qt的lib和font等必须的资源,才可以运行qt的 demo和example的。

其他的参数,好像这个,可有可无的:

export QT_PLUGIN_PATH=$QTDIR/plugins/

如果用到鼠标和键盘,那估计

http://qt.nokia.com/doc/qtopia4.3/qtopiacore-envvars.html

中的QWS_MOUSE_PROTO和QWS_KEYBOARD 也要配置好的。有空再去试试。

【提示】

1.关于-prefix参数,为何不用qt默认的配置的/usr 而去自己修改为$(TARGET_DIR)/usr:

因为默认的qt.mk中原先配置的是 -prefix /usr,会去讲qtopia安装到我buildroot所在Linux的/usr下面,很弱智的,这样,你buildroot中去make,最后的 qtopia的make install会去将生成的qt的东西,用于arm板子的qt的东西,会安装到你当前X86的PC上的Linux下的/usr中,这不扯淡的吗。。

所以,才会去在buildroot中package/qt.mk中,配置成QT_CONFIGURE += -prefix $(TARGET_DIR)/usr

【引用】

1。Online Reference Documentation

http://qt.nokia.com/doc/qtopia4.3/index.html

2.Qtopia Developer Resources

http://qt.nokia.com/doc/qtopia4.3/index.html

3.Running Qtopia
http://qt.nokia.com/doc/qtopia4.3/running-qtopia.html

4.Qtopia Core Environment Variables
http://qt.nokia.com/doc/qtopia4.3/qtopiacore-envvars.html

5.QT 4.5.2 嵌入式开发平台的搭建

http://hi.baidu.com/a263238386/blog/item/6ff055dda933033e5882dd32.html

6.环境变量QWS_DISPLAY

http://fanzhichao.blog.hexun.com/23669000_d.html

2010年2月25日 星期四

FrameBuffer的一夜hack

資料來源
http://www.lslnet.com/linux/f/docs1/i48/big5328178.htm

對FrameBuffer的一夜hack。。。

大家都知道Unix/Linux系統是由命令驅動的。那麼最基本的系統是命令行的(就是想DOS一樣的界面)。X-Window-System是Unix/Linux上的圖形系統,它是通過X-Server來控制硬件的。但有一些Linux的發行版在引導的時候就會在屏幕上出現圖形,這時的圖形是不可能由X來完成的,那是什麼機制呢?答案是FrameBuffer。
FrameBuffer不是一個圖形系統,更不是窗口系統。它比X要低級,簡單來說FrameBuffer就是一種機制的實現。這種機制是把屏幕上的每個點映射成一段線性內存空間,程序可以簡單的改變這段內存的值來改變屏幕上某一點的顏色。X的高度可移植性就是來自於這種機制,不管是在那種圖形環境下,只要有這種機制的實現就可以運行X。所以在幾乎所有的平台上都有相應的X版本的移植。
好了,閒話少說,下面我們來看看可以利用FrameBuffer來幹點什麼。首先看看你是否有了相應的驅動:找一下在/dev/下是否有fb*這個設備文件,這是個字符類的特殊文件。

ls -l /dev/fb0 (Enter)
crw-rw---- 1 root video 29, 0 Jan 27 15:32 /dev/fb0

如果沒有這個文件也可以找找其他的比如:/dev/fb1,/dev/fb2...如果找不到這些文件,那就得重新編譯內核了。下面假設存在這個文件/dev/fb0,這就是FrameBuffer的設備文件。
有了這個我們可以play with FrameBuffer了。(一下的操作不一定要在X下,可以在啟動了FrameBuffer的虛擬控制台下)

cat /dev/fb0 > sreensnap

ls -l sreensnap

-rw-r--r-- 1 wsw wsw 6291456 Jan 27 21:30 sreensnap

我們得到了一個恰好6M的文件,再做下面的操作:

clear /*清楚屏幕的輸出*/
cat sreensnap > /dev/fb0
是不是奇怪的事情發生了?好像是中了病毒一般?屏幕又恢復了以前的狀態?不用著急,

clear

這樣屏幕就正常了。

通過以上的操作,我想你也猜到了。文件/dev/fb0就是控制屏幕上的每一點的顏色的文件。我們可以寫程序來改變這個文件的內容,就可以方便的在屏幕上畫圖了:-)

我下面就來寫一個小程序,探測一下屏幕的屬性。


#include
#include
#include
#include
#include

int main () {
int fp=0;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
fp = open ("/dev/fb0",O_RDWR);

if (fp < 0){
printf("Error : Can not open framebuffer device\n");
exit(1);
}

if (ioctl(fp,FBIOGET_FSCREENINFO,&finfo)){
printf("Error reading fixed information\n");
exit(2);
}

if (ioctl(fp,FBIOGET_VSCREENINFO,&vinfo)){
printf("Error reading variable information\n");
exit(3);
}

printf("The mem is :%d\n",finfo.smem_len);
printf("The line_length is :%d\n",finfo.line_length);
printf("The xres is :%d\n",vinfo.xres);
printf("The yres is :%d\n",vinfo.yres);
printf("bits_per_pixel is :%d\n",vinfo.bits_per_pixel);
close (fp);
}

struct fb_var_screeninfo 和 struct fb_fix_screeninfo 兩個數據結構是在/usr/include/linux/fb.h中定義的,裡面有些有趣的值:(都是無符號32位的整數)
在fb_fix_screeninfo中有
__u32 smem_len 是這個/dev/fb0的大小,也就是內存大小。
__u32 line_length 是屏幕上一行的點在內存中佔有的空間,不是一行上的點數。
在fb_var_screeninfo 中有
__u32 xres ,__u32 yres 是x和y方向的分辨率,就是兩個方向上的點數。
__u32 bits_per_pixel 是每一點佔有的內存空間。

把上面的程序編譯以後運行,在我的機器上的結果如下:
The mem is :6291456
The line_length is :4096
The xres is :1024
The yres is :768
bits_per_pixel is :32

內存長度恰好是6M,每行佔有4M的空間,分辨率是1024x768,色彩深度是32位。細心的你可能已經發現有些不對。屏幕上的點有1024x768=786432個,每個點佔有32比特。屏幕一共的佔有內存數為32x786432=25165824 就是3145728字節,恰好是3M但是上面的程序告訴我們有6M的存儲空間。這是因為在現代的圖形系統中大多有緩衝技術,顯存中存有兩頁屏幕數據,這是方便快速的改變屏幕內容實現動畫之類比較高的要求。關於這種緩衝技術有點複雜,我們目前先不討論。對於我們來說只有這3M內存來存放這一個屏幕的顏色數據。
好了,現在你應該對FrameBuffer有一個大概的瞭解了吧。那麼接下來你一定會想在屏幕上畫一些東西,讓我們先從畫一個點開始吧。先說說我的想法:在類Unix系統中,一切東西都是文件。我們對屏幕的讀寫就可以轉換成對/dev/fb0的讀寫。那麼就把/dev/fb0用open打開,再用lseek定位要讀寫的位置,最後調用read或者write來操作。通過這麼一大段的操作我們才完成了對一個點的讀或者寫。這種方法開銷太大了。還有一種方法,我們把/dev/fb0映射到程序進程的內存空間中來,然後得到一個指向這段存儲空間的指針,這樣就可以方便的讀寫了。但是我們要知道能映射多少和該映射多少,這能很方便的從上面一個程序得出的參數來決定。
下面是程序代碼:

#include
#include
#include
#include
#include

int main () {
int fp=0;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
long screensize=0;
char *fbp = 0;
int x = 0, y = 0;
long location = 0;
fp = open ("/dev/fb0",O_RDWR);

if (fp < 0){
printf("Error : Can not open framebuffer device\n");
exit(1);
}

if (ioctl(fp,FBIOGET_FSCREENINFO,&finfo)){
printf("Error reading fixed information\n");
exit(2);
}

if (ioctl(fp,FBIOGET_VSCREENINFO,&vinfo)){
printf("Error reading variable information\n");
exit(3);
}

screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
/*這就是把fp所指的文件中從開始到screensize大小的內容給映射出來,得到一個指向這塊空間的指針*/
fbp =(char *) mmap (0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fp,0);
if ((int) fbp == -1)
{
printf ("Error: failed to map framebuffer device to memory.\n");
exit (4);
}
/*這是你想畫的點的位置坐標,(0,0)點在屏幕左上角*/
x = 100;
y = 100;
location = x * (vinfo.bits_per_pixel / 8) + y * finfo.line_length;

*(fbp + location) = 100; /* 藍色的色深 */ /*直接賦值來改變屏幕上某點的顏色*/
*(fbp + location + 1) = 15; /* 綠色的色深*/
*(fbp + location + 2) = 200; /* 紅色的色深*/
*(fbp + location + 3) = 0; /* 是否透明*/
munmap (fbp, screensize); /*解除映射*/
close (fp); /*關閉文件*/
return 0;

}

因為這是對線性存儲空間的讀寫,所以代碼有點不清晰,不易理解。但是有了這個基本的代碼實現,我們可以很容易寫一些DrawPoint之類的函數去包裝一下低層的對線性存儲空間的讀寫。但是有了畫點的程序,再寫出畫線畫圓的函數就不是非常困難了。

這些就是我對FrameBuffer的初步研究,匆忙之間寫些東西不成文章,以後要寫些更高級一點的函數的實現。

好東西。感到好熟悉,十幾年前在DOS下寫圖形界面的程序就是讀寫0xa000那段內存,輸出漢字也沒問題。原來linux也能這樣用。有時間琢磨琢磨。

好貼。支持你的努力

好文章,讓我瞭解了fb是怎麼工作的。

Gtk Qt 是不是通過操作 fb 來畫圖的呢?
這樣畫的圖在鼠標移過時,圖就會被更新,那更新出來的圖,是存在那裡的呢?
fb 裡存放的數據是否存有正在看的電影的顯示呢?

強人+強貼..........

framebuffer 要比X-window-system低級。而GTK和QT是建立在Xlib上的,至於如何來實現鼠標那應該是X-server的事情了,在安裝X-window-system(debian)時會讓你選擇要不要內核的framebuffer支持,理論上選和不選都可以。如果不選,X會用它自帶的驅動來實現對線性內存空間的讀寫改變屏幕顯示。

這只是一個機制,實現不一定非要framebuffer不可。但在Linux(kernel>2.2)上用framebuffer來實現X總是可以的。

嘿嘿,又長見識了,望樓主多分享經驗及心得,值得加精鼓勵;)

希望多看到這種文章

有個叫 direct frame buffer 的項目,做的類似於樓主所說的事情:
http://www.directfb.org/

謝謝樓主分享,回去好好研究一下

qt的嵌入式版qte使用的是framebuffer

2010年1月17日 星期日

使用Git與Github管理軟體開發專案

https://billy3321.blogspot.com/2009/02/github-howto.html
git要如何使用。

首先,開啟一個專案只要輸入

git init

再來,每次修改好了以後,可以先將修改存入stage

git add <modified files>

若一次修改大量檔案,可以將所有檔案修改都add進去stage

git add .

之後commit提交一次的修改

git commit -m "註解"

另外也可以把git add與git commit用一個指令完成

git commit -a -m "註解"

git特別的一點是,他可以在本地端開啟並使用。上面這些用法完全不用伺服器,本機就可以執行。

本地端會有自己的repo,可以在飛機上,各種沒有網路的地方都可以順利使用並提交任何變更。

等您覺得修改好了,可以放上伺服器的時候,確保網路連線並輸入

git push

就可以將這邊的檔案與變更提交到github上面。
如果您在github上的版本較新,也可以輸入

git pull

更新本地端的repo。

如果今天tom的test repo有了新的變更,告訴billy,billy要將變更merge到自己的repo中,可以在本地端輸入

git pull git://github.com/tom/test.git

pull這個指令其實涵蓋了fetch(將變更複製回來)以及merge。
因此經過merge後,tom的變更就加入到billy的repo囉!

另外版本控制系統的branch功能也很有意思,若您的程式碼同時要修改bug,又要加入新功能,可以fork出一個branch,一個專門修bug,一個專門加入新功能,等到穩定後再來merge

git branch bug_fix #建立branch,名為bug_fix
git checkout bug_fix #切換到bug_fix這個branch
git checkout master #換為主要的repo
git merge bug_fix #把bug_fix這個branch和現在的branch合併
git push origin bug_fix:refs/heads/bug_fix #把bug_fix這個branch推至遠端repo上面

若有branch在remote,想要查看並checkout出來

git branch -r #查看遠端branch
git checkout -b bug_fix_local bug_fix_remote #把本機端切換為遠端的bug_fix_remote branch,並命名為bug_fix_local

還有其他可以觀看repo狀態的工具

git log #可以查看每次commit的改變
git diff #可以查看最近一次改變的內容,加上參數可以看其他的改變,並互相比較
git show #可以看某次的變更

若想知道目前repo的狀態,可以輸入

git status

這邊只是一些簡單的功能,還有更多的功能,等大家去摸
想要深入了解git,可以看
http://excess.org/article/2008/07/ogre-git-tutorial/
這個教學影片說明的很詳細。

這個投影片也非常棒,強力推荐:
寫給大家的Git教學
http://www.slideshare.net/littlebtc/git-5528339

也有很多小工具,比如這個
http://gugod.org/2008/11/github-badge.html
可以把您目前的github repos顯示在blog上面

希望大家也能在git上面使用github開心的開發!

參考資料
http://github.com/guides/home
http://kylecordes.com/2008/04/30/git-windows-go/
http://nathanj.github.com/gitguide/creating.html
http://www.qweruiop.org/nchcrails/posts/49
http://www.slideshare.net/littlebtc/git-5528339

網誌存檔

關於我自己