【樹莓派+.NET MF打造視頻監控智能車】控制篇(樹莓派)

對已經具有必定Linux基礎的人來講,樹莓派學習起來應該很是簡單天然。在他們眼中,樹莓派就是一個簡易版的,卡通版的Linux而已。可是對我這樣一個早已習慣微軟技術生態系統的人或者初學者來講,要實現一個簡單程序的編寫、編譯到運行,仍是不太容易的。html

 

上圖是我搭建的一個相對完整的樹莓派開發環境,有顯示(HDMI轉VGA->7寸顯示屏800*480),有鍵盤和鼠標等,固然這些不是必須的,只是對初學者來講,顯的比較直觀。linux

爲了下降學習和開發難度,樹莓派上提供多種編程語言選擇,好比Python、Java、C/C++等linux可支持的開發語言。在圖形界面下,能夠在IDE環境相對簡單的進行Python編程、調試、運行等。若是基於第三方支持庫,還能夠用Python操控GPIO等。編程

出於對C/C++語言的熱愛,我仍是選擇了基於GNU C進行程序開發,下圖是已經安裝到智能小車上的樹莓派。咱們須要搭建一個沒有顯示、鼠標和鍵盤下的編程、部署、運行調試環境。windows

 

至於如何燒寫樹莓派的系統到SD卡上,咱們這裏就再也不熬敘了,已有不少入門文章進行了相關的講解和說明。本篇文章主要介紹,搭建一個便於和Windows平臺交互的編程平臺,藉助wiringPi C/C++庫,操做GPIO和串口通訊。服務器

第一步:遠程登陸樹莓派網絡

咱們選擇安裝的樹莓派系統鏡像爲Raspbian,系統默認啓動後,就是支持遠程SSH鏈接的。咱們能夠下載一個免費的PuTTY工具軟件進行遠程鏈接。socket

 

打開鏈接,輸入用戶名:pi  密碼:raspberry(默認) 會出現以下畫面。編程語言

 

第二步:安裝簡易FTP服務函數

爲了便於把Windows系統中已經寫好的C文件部署到樹莓派中,咱們安裝一個簡單的FTP服務。咱們選擇的是一個開源的比較輕量級的FTP服務器vsftpd,下面簡單說一下安裝步驟:工具

一、  安裝vsftpd服務

sudo apt-get install vsftpd

二、  開啓vsftpd服務

sudo service vsftpd start

三、  修改配置文件

sudo nano /etc/vsftpd.conf

找到並修改

anonymous_enable=NO   //不容許匿名訪問

local_enable=YES        //容許本地用戶訪問

write_enable=YES        //容許寫

local_umask=022         //設定上傳後文件權限掩碼

存盤退出。

四、  重啓vsftpd服務

sudo service vsftpd restart

 

打開windows上任意一款FTP客戶端軟件(我一直使用的是FlashFXP),配置相關IP、用戶和密碼(用戶名:pi  密碼:raspberry)。

 

鏈接成功後,會出現以下畫面:

 

 

第三步:安裝wiringPi

 WiringPi是第三方封裝的一個針對樹莓派平臺的GPIO控制庫函數,WiringPi遵照GUN Lv3。wiringPi使用C或者C++開發而且能夠被其餘語言轉包應用。

詳情請參見這篇文章:http://blog.csdn.net/xukai871105/article/details/17737005

 

有了以上三步的準備,咱們就能夠在Windows編寫開發C語言代碼,遠程部署到樹莓派,經過樹莓派上的GCC工具進行編譯,而後執行。編寫代碼以前,咱們先了解一下樹莓派的GPIO接口,以下圖所示:

 

咱們須要完成三個功能,1、GPIO控制一個LED閃爍;2、經過串口和凌霄板進行通訊;3、輸出PWM信號控制舵機。

下面咱們將一一介紹上面三個功能的實現。

1、GPIO控制LED燈閃爍

硬件接線:咱們選擇一個LED發光二極管,焊接一個1K左右的電阻,把一根杜邦線剪開,分別焊接到二極管兩個管腳上(其中一個焊接在電阻另一端)。LED較長的管腳爲正極,咱們接在樹莓派第11管腳上,也就是GPIO0上。另一端,咱們接在25管腳上(可任意接在一個標有0V的管腳上)。

咱們在記事本(推薦使用EverEdit)編寫相關代碼,以下圖所示:

 

把LED.C文件經過FlashFXP上傳到樹莓派上去。用GCC進行編譯,而後執行,以下圖所示:

 

若是硬件沒有問題,那麼你應該能夠看到LED燈在閃爍了。

2、樹莓派和凌霄開發板串口通訊

2.1 關閉串口調試功能

串口還不能直接使用,由於默認是綁定調試端口的,因此咱們必須先關閉該功能。

命令行中輸入以下命令:

sudo nano /boot/cmdline.txt

將如下內容

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

改成

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

 

輸入以下命令:

sudo nano /etc/inittab

將如下內容

#Spawn a getty on Raspberry Pi serial line

T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

改成

#Spawn a getty on Raspberry Pi serial line

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

 

而後重啓樹莓派。

 

2.2 硬件接線

8號管腳爲TX,10號管腳爲RX,是TTL電平的,咱們和凌霄開發板的子板接口19和20管腳進行鏈接。

樹莓派 8  (TX) -- 凌霄開發板19(RX)

樹莓派 10 (RX) -- 凌霄開發板20(TX)

樹莓派 6  (0v) -- 凌霄開發板03(GND)

 

2.3 .NET Micro Framework串口編程

咱們要求的功能相對簡單,並不要求雙向通訊,凌霄開發板接收到控制攝像頭雲臺的按鍵信息後,直接發送給樹莓派(若是經過網絡遠程控制小車,則能夠由樹莓派經過wifi socket編程獲取遠程的按鍵控制信息,而後經過串口發給凌霄開發板,由後者控制小車,後續若是有時間,能夠作一個這方面的功能)。

串口定義:

  static SerialPort piPort = new SerialPort("COM4", 9600);

在Main函數中,進行串口打開操做:

piPort.Open();

在按鍵事件中發送按鍵信息:

static void ps2_Click(object sender, PS2.ButtonArgs e)

{

    if (e.key == PS2.Key.RRocker)

    {

        PS2 ps2 = (PS2)sender;

        PS2.ButtonArgs button = ps2.GetButton(PS2.Key.L2);

        if (button.state == 1)  //按下L2按鍵,咱們才發送搖桿的信息

        {

            byte[] buffer = new byte[] { 0xAA, (byte)e.x, (byte)e.y, 0x55 };

            piPort.Write(buffer, 0, 4);

            piPort.Flush();

        }

}

}

2.4 樹莓派串口編程

打開串口:

if ((fd = serialOpen ("/dev/ttyAMA0", 9600)) < 0)

{

    fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;

    return 1;

}

接收數據:

while(1)

{

           if(serialDataAvail (fd)>=4)   //判斷接收緩衝區的個數

           {

              if (read (fd, buffer, 4) == 4)

              {                   

                        if(buffer[0]==0xAA && buffer[3]==0x55)

                        {

                                printf("x:%d y:%d\r\n",buffer[1],buffer[2]);               

                        }

              }

           }

           else

           {

              delay (10) ;

      }

}
    注:WiringPi對外封裝並無提供串口read函數,只提供了單個字符的獲取,咱們直接採用linux自己提供的read函數。

2.5 通訊測試

編寫相關文件,傳輸到樹莓派,而後進行編譯。運行程序後,咱們操做Sony PS2按鍵,應該能夠看到以下信息輸出:

 

3、樹莓派PWM輸出控制

樹莓派僅提供一個物理硬件PWM輸出IO,也就是GPIO1,第12管腳。實際測試發現,其週期爲6.64us左右,WiringPi封裝的接口還不能修改該週期的大小(後續有時間能夠研究一下底層相關代碼),這不符合舵機控制的須要,舵機通常要求20ms左右的週期。另外攝像頭雲臺是控制兩路舵機,因此一個物理硬件PWM也不夠。因此咱們採用軟PWM,也就是用普通的GPIO,經過時鐘中斷,模擬PWM方波輸出。

咱們用GPIO1(12管腳)和GPIO2(13管腳)來模擬PWM輸出,因此硬件接線也是舵機的PWM信號輸入管腳和樹莓派的這兩個管腳相連(舵機5V的供電專門供,不要直接從樹莓派5V管腳上取)。

PWM初始化代碼:

#define PWM1  1

#define PWM2  2

softPwmCreate (PWM1, pwmV1, 200) ;  //1=100us  7~28  

softPwmCreate (PWM2, pwmV2, 200) ;  //1=100us  7~28  

 

在串口的信息接收中,輸出PWM,從而控制舵機。

if (read (fd, buffer, 4) == 4)

{                     

    if(buffer[0]==0xAA && buffer[3]==0x55)

    {

          pwmV1 = 7 + (int)(buffer[1]*21.0/255.0); //x

          pwmV2 = 7 + (int)(buffer[2]*21.0/255.0); //y

          softPwmWrite(PWM1, pwmV1);        

          softPwmWrite(PWM2, pwmV2);                                

    }                

}

部署到樹莓派,編譯,運行,若是咱們手頭有示波器,咱們應該能夠看到GPIO1和GPIO2輸出的波形。

以上程序若是和凌霄板共同運行,應該能夠看到以下效果:

視頻連接:http://v.youku.com/v_show/id_XNjY2MTE1NjQ0.html

 

文章導航:

一、【樹莓派+.NET MF打造視頻監控智能車】遙控篇

二、【樹莓派+.NET MF打造視頻監控智能車】控制篇(.NET MF)

三、【樹莓派+.NET MF打造視頻監控智能車】控制篇(樹莓派)

四、【樹莓派+.NET MF打造視頻監控智能車】視頻篇

 小結:

一、 樹莓派硬件設計小巧,會讓一些人由於樹莓派而喜歡上Linux

二、 Linux畢竟不是一個實時系統,在作軟PWM的時候,你會發現舵機會抖動,而且幅度還不小(因爲凌霄系統已經提供了16路PWM,因此後續仍是由凌霄系統控制全部的舵機)

三、 Linux系統的鏡像大概2.8G左右,和凌霄系統的幾百K相比,仍是挺重量級的,而且啓動時間會比較長一些。

相關文章
相關標籤/搜索