FC2カウンター FPGAの部屋 Zybot に超音波距離センサを搭載する10(Zybot に取り付けた)

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Zybot に超音波距離センサを搭載する10(Zybot に取り付けた)

Zybot に超音波距離センサを搭載する9(IP のUIO番号を確認)”の続き。

前回までで、超音波距離センサ・インターフェースIP の動作が確認できて、Linux のUIO ドライバを使えるように設定した。今回は、Zybot に超音波距離センサを搭載して、Linux 上で動作を確認した。

まずは、超音波距離センサをユニバーサル基板に搭載してピンヘッダを付けた。ピンヘッダからブレッドボード・ジャンパーコード(オス-メス)でZYBO のPmod JB まで接続した。ジャンパーコードの色は変えてある。+3.3V は赤、GND は黒、SIG は青にしてある。
その取り付けや接続の様子を写真で示す。
Ultrasonic_senser_inf_73_161220.jpg

Ultrasonic_senser_inf_74_161220.jpg

これで前回作ったBOOT.bin と devicetree.dtb をMicro SD カードに入れて、ZYBO に挿入して電源をON して、Ubuntu 14.04 を起動した。
Zybot ディレクトリの下にultrasonic_sensor ディレクトリを作って、cam_disp_plat などを入れた。隊列走行の時とは、超音波距離センサのエントリがデバイスツリーに増えただけなので、そのままカメラを表示することができた。
Ultrasonic_senser_inf_71_161219.png

その下に、us_sensor_test ディレクトリを作成した。us_sensor_test.c を作成して、gcc -o us_sensor_test us_sensor_test.c でコンパイルした。us_sensor_test が生成された。
Ultrasonic_senser_inf_72_161219.png

./us_sensor_test でアプリケーションを起動すると、距離を測定することができた。
Ultrasonic_senser_inf_70_161219.png

us_sensor_test.c を示す。

// us_sensor_test.c
// 2016/12/19 by marsee
// 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include "xultrasonic_sensor_inf.h"

void main(){
    int fd16;
    volatile unsigned int *ultrasonic_sensor_inf_0;
    int ret_val;
    float measure;
    
    // ultrasonic_sensor_inf_0 (UIO 16)
    fd16 = open("/dev/uio16", O_RDWR); // ultrasonic_sensor_inf_0 interface AXI4 Lite Slave
    if (fd16 < 1){
        fprintf(stderr, "/dev/uio16 (ultrasonic_sensor_inf_0) open error\n");
        exit(-1);
    }
    ultrasonic_sensor_inf_0 = (volatile unsigned *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd16, 0);
    if (!ultrasonic_sensor_inf_0){
        fprintf(stderr, "ultrasonic_sensor_inf_0 mmap error\n");
        exit(-1);
    }
    
    while(1){
        usleep(200000); // 200 ms
        
        ultrasonic_sensor_inf_0[0] = 0x1// ap_start = 1
        
        while((ultrasonic_sensor_inf_0[0] & 0x2) == 0// wait ap_done
            usleep(500); // 5 us
            
        if(ret_val = (int)ultrasonic_sensor_inf_0[4]) // 0x10 : Data signal of ap_return
            printf("Error: %d\n", ret_val);
        
        measure = (float)ultrasonic_sensor_inf_0[6] * 0.000342 / 2.0// 0x18 : Data signal of count_val
        printf("Distance is %.2f cm\n", measure);
    }
    munmap((void *)ultrasonic_sensor_inf_0, 0x10000);
    close(fd16);
}



これで、超音波距離センサ・インターフェースIP をLinuxからも使うことができた。
  1. 2016年12月20日 04:29 |
  2. Zybot
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3668-5c9adad3
この記事にトラックバックする(FC2ブログユーザー)