trykmkmの備忘録

自称組み込みエンジニアのブログ

Raspberry PiでFT232Hのi2cデバイス制御(2)

 今回は、Raspberry Piの環境を構築します。

 

 使用するRaspberry Piは、"Raspberry Pi 1 Model A+ 512MB"です。

 element14 RASPBRRY-MODA+-512M 【本体】Raspberry Pi Model A+ 512MB

 また、上記モデルはネットワークのポートが無く、USBポートが無いため、USBハブとUSB LANアダプタを使用します。

 10/100M USB2.0用 LANアダプター | LUA3-U2-ATX

 また、運用上SSHWinSCPを想定していますが、初回起動時は、Raspberry Piを直接操作しないといけないため、USBマウス、USBキーボードを使用します。

 構成は図1の通りになります。

 

f:id:trykmkm:20171014183303p:plain

 図1 Raspberry Pi環境

 

 

 まず、microSDカードにOSをインストールします。

 手順は、Etcherを使用した方法(下記URL)でインストールします。

 Noobsは時間がかかるため、Etcherにしました。

Installing operating system images - Raspberry Pi Documentation

 

1.下記URLよりイメージファイルをダウンロード

  Download Raspbian for Raspberry Pi

  DownLoad Zipをクリック。

f:id:trykmkm:20171014165848p:plain

  (2017/10/14現在、2017-09-07-raspbian-stretch.zipが最新版となります)  

 

2.Etcherをダウンロード。

  Download for ・・・をクリック

f:id:trykmkm:20171014170149p:plain

 

3.Etcher-Setup-1.1.2-x64.exe2を実行し、Etcherをインストール。

4.Etcherを起動

5.EtcharのSelect imageで2017-09-07-raspbian-stretch.zipを指定 。(下記キャプチャ参照)

f:id:trykmkm:20171014170431p:plain

 

6.microSDカードをPCに差し込み、Etcherのchangeで指定。(上記キャプチャ参照)

7.EtcherのFLASH!ボタンクリック。上記キャプチャ参照)

 

 これで、SDカードへのOSインストールは完了しました。

 今回は一旦終了します。

 次回は、Raspberry Piの基本的な設定をしていきたいと思います。

 

 

 

Raspberry PiでFT232Hのi2cデバイス制御(1)

 数ヶ月前、raspberry piでFT232Hを介したi2cデバイス制御をトライする機会がありました。(下図参照)f:id:trykmkm:20171006211938p:plain

図1 FT232Hを介したi2cデバイス接続

 

 結果は、失敗でした。オシロスコープで波形を見た限りでは、FT232HのSDA,SCLラインから、信号は出力していたので、どうやらデバイスからのACK bitの受信ができてないような感じでした。

 

 今回の記事では、その時のトライの備忘録を記載していきます。また、リベンジとして、raspberry piでFT232Hを介したi2cセンサ制御の実現を目指します。

 

 Raspberry PiでFT232のi2cデバイスを制御する方法ですが、Adafruitが一覧を公開しており、下記5つの方法があります。

 

 ①Adafruit Python GPIO library

 ②libmpsse library

 ③libFTDI library

 ④FTDI's?LibMPSSE-I2C?and?LibMPSSE-SPI?libraries.

 ⑤FTDI's official D2XX drivers and libraries.

 

 ①から順に実施していこうと思いますが、まずはRaspberry Piの環境を構築していきます。

 また、記事のコメント欄にアドバイス等を残して頂ければ幸いです。

 よろしくお願いいたします。

超音波・レーザ測距センササンプルプログラム(終)

 今回で、超音波・レーザ測距センササンプルプログラムシリーズも最終回にしようと思います。

 最終回は、(6)で作成したハード(ブレッドボード基板)を、ユニバーサル基板で実装しようと思います。プログラムは(7)で作成したものが動きます。

 

 基板は、秋月電子で販売している片面ガラス・ユニバーサル基板を使用します。

 また、マイコンモジュール、センサ類がとり外せるように、ピンヘッダを使用します。

 Nch MOSFETは、BSS138を変更します。そのまま実装できる2KS4017を使用します。ただし、パッドが超音波測距センサに接触するので、基板中央側に足を曲げて少し倒します。

 

 基板に使用する部品一式は下記の通りです。

 ・片面ガラス・ユニバーサル基板(ブレッドボード配線パターンタイプ): パーツ一般 秋月電子通商 電子部品 ネット通販

 ・NchパワーMOSFET 2SK4017(Q) (60V5A): 半導体 秋月電子通商 電子部品 ネット通販

 ・分割ロングピンソケット 1x42 (42P): パーツ一般 秋月電子通商 電子部品 ネット通販

 

 基板配線図は下記の通りになります。

f:id:trykmkm:20171003000548p:plain

 

 図1 基板配線図

 

 実物は下記写真の通りになります。

f:id:trykmkm:20171003005111j:plain f:id:trykmkm:20171003005124j:plain

図2 部品実装基板(左:表面 右:裏面) 

 

 上記基板に部品を実装していきます。

 超音波測距センサ(SRF02)は、グラつくので下記部品を使用して固定します。

 

 ・プラスチックナット+連結(6角ジョイント)スペーサー(10mm)セット: 電子工作便利商品 秋月電子通商 電子部品 ネット通販

 ・【共立エレショップ】>> ジュラコン中空スペーサー M3×1mm[RoHS]★受注単位有★: 【能動・受動・機構パーツ】 << 電子部品,半導体,キットの通販

 ・3mmプラスチックネジ(7mm)+ナットセット: 電子工作便利商品 秋月電子通商 電子部品 ネット通販

 

f:id:trykmkm:20171003010705j:plain f:id:trykmkm:20171003010724j:plain

図3 部品装着基板(左:横 右:真上) 

 

 最後に、基板を土台に固定します。

 土台は、下記の部品を使用しました。

 

 ・アクリル板強化透明 180×320×1.0mm IR001SS1の通販ならマルツオンライン(120mm x 130mm にカット)

 ・樹脂ネジ M3 8mm(西川電子部品)  2個

 ・樹脂スペーサー M3 3mm(西川電子部品) 2個

 ・樹脂ナット M3 (超音波測距センサを固定したものと同じ) 2個

 ・PD.2125BL | RS Pro ゴム足 黒,高さ:3.5mm, 粘着剤付き | RS Pro 【通販RS】

 ・https://ec.cando-web.co.jp/item/4521006213936

 

仕上がったものは、下記になります。

f:id:trykmkm:20171003013951j:plain

図4 測距ユニット 横置き

 

f:id:trykmkm:20171003014545j:plain

図5 測距ユニット 縦置き (ブックエンドに輪ゴムで固定)

超音波・レーザ測距センササンプルプログラム(7)

 今回は前回変更したハード上で動作する、超音波測距センサ(SRF02)とレーザ測距センサ(VL530X)の同時測定サンプルを作ります。

 

 (4)で動かしたレーザ測距サンプルをベースに、超音波センサのロジックを組み込みます。

 手順を下記に示します。

 

 ①ベースになるプロジェクトをコピー( (4)で使用したHelloWorld_53L0A1を右クリックし、名前を付けて保存)

f:id:trykmkm:20170927210522p:plain

 

 ②任意の名称を入力し、OKボタンクリック。(ここでは、UltraSonicAndLaser2とする。)

 f:id:trykmkm:20171001003418p:plain

 

 ③UltraSonicAndLaser2のmain.cppのコードを下記の通りに書き換え。(超音波センサのリードロジック追加。SRF02シリアルモードの詳細)

//This software includes the work that is distributed in the Apache License 2.0

#include "mbed.h"
#include "x_nucleo_53l0a1.h"
#include <stdio.h>

/* This VL53L0X Expansion board test application performs a range measurement in polling mode
on the onboard embedded top sensor. */

//#define VL53L0_I2C_SDA D14
//#define VL53L0_I2C_SCL D15
#define VL53L0_I2C_SDA p28 //D14->p28変更
#define VL53L0_I2C_SCL p27 //D15->p27変更

DigitalInOut pin(p12); //リセット制御ピン

Serial uart(p13, p14); //SRF02 UART通信

static X_NUCLEO_53L0A1 *board=NULL;


//UARTデータ送信
void SendCmd(const char address, const char cmd)
{
    uart.putc(address); //データ送信
    wait_us(100); //100us待機
    uart.putc(cmd); //データ送信
    wait_us(100); //100us待機
}


//超音波距離取得
uint16_t getUssDistance(void)
{
    uint16_t distance = 0;
    SendCmd(0x00,0x51);//cmモード設定コマンド送信
    wait_ms(70);//70mS待機
    SendCmd(0x00,0x5E);//データ取得コマンド送信
    wait_ms(10);//10mS待機
    distance = (uart.getc() << 8); //測定データ(MSB)取得
    distance = distance | uart.getc(); //測定データ(LSB)取得
    wait_ms(250); //250mS待機
    return distance;
}

 

/*=================================== Main ==================================
=============================================================================*/
int main()
{
    int status;
    uint32_t distance;

    DevI2C *device_i2c = new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);

 

    //センサリセット処理追加
    pin.output();
    pin = 1;
    wait(0.1);
    pin = 0;

/* creates the 53L0A1 expansion board singleton obj */
    //board = X_NUCLEO_53L0A1::instance(device_i2c, A2, D8, D2);
    board = X_NUCLEO_53L0A1::instance(device_i2c);//インスタンス生成方法変更

/* init the 53L0A1 expansion board with default values */
    status = board->init_board();
    if (status) {
        printf("Failed to init board!\n\r");
        return 0;
    }

    while (1) {
        status = board->sensor_centre->get_distance(&distance); //レーザ測距センサデータ取得
        if (status == VL53L0X_ERROR_NONE) {
            printf("LASER (VL5310X) : %4d [cm]\n", distance/10); //レーザ距離表示(cm単位に変更)
            printf("ULTRASONIC (SRF02) : %4d [cm]\n\n", getUssDistance());//超音波距離取得&表示
        }
    }
}

※本来は、通信エラー時の処理を入れるべきですが、あくまで動作確認用のためプログラムの記述は成功ルートのみで済ませました。

 

 ④保存ボタンクリック後、コンパイルボタンをクリックして実行ファイル(UltraSonicAndLaser2_LPC1768.bin)生成。

 

 ⑤mbedをPCに接続し、mbedにUltraSonicAndLaser2_LPC1768.binを保存。

 

 ⑥teratermでmbed Serial portを指定し、ボーレート9600bpsに指定すれば、センサの測定データが連続で出力します。下記にキャプチャを示します。

f:id:trykmkm:20171001005521p:plain

 

超音波・レーザ測距センササンプルプログラム(6)

 前回、音波測距センサ(SRF02)とレーザ測距センサ(VL530X)の同時測定サンプルプログラムの作成にトライしましたが、実現できませんでした。

 

 よって今回は、前回とは別の方法でプログラム作成を模索したいと思います。

 方法は下記2つです。 

 

 ①ST-micro以外のライブラリ・APIを使用

 ②超音波センサをi2cではなく、uartモードで使用。

 

  まずは、①の方法を実施してみたいと思います。

 VL530X用のAPIを公開しているユーザさんのリンクを下記します。

  ・GitHub - dbaba/vl53l0x-mbedos: Pololu mbed OS 5 library for VL53L0X time-of-flight distance sensor

  ・GitHub - ARMmbed/VL53L0X-mbedOS

 

 両APIを使用してみて、付属のサンプルや、簡単なサンプルを作成して実行ファイルを生成してみましたが、プログラムが動作しませんでした。

 どうやらデータのi2cの受信でコケている感じです。

 

 よって、②の方法で行きたいと思います。

 

 ②はSRF02をuartで使用するため、ハードを変更します。

 回路図は下記の通りです。

 SRF02をUARTで接続するのはもちろんですが、modeピンをGND接続する必要があります。

f:id:trykmkm:20170930001256p:plain

図1 超音波・レーザ測距センササンプルプログラム用回路図2

 

 基板配線はブレッドボードを使用しました。実物は下記になります。

f:id:trykmkm:20170930005712j:plain f:id:trykmkm:20170930005735j:plain

図2 超音波・レーザ測距センサ用基板2(左:部品あり 右:配線のみ )

 

 次回は、音波測距センサとレーザ測距センサの同時測定サンプルプログラムの作成します。

 

 

超音波・レーザ測距センササンプルプログラム(5)

 今回はいよいよ、超音波測距センサ(SRF02)とレーザ測距センサ(VL530X)の同時測定サンプルを製造していきたいと思います。

 

 前回動かしたサンプルをベースに、超音波センサのロジックを組み込みます。

  手順を下記に示します。

 

 ①ベースになるプロジェクトをコピー(前回使用したHelloWorld_53L0A1を右クリックし、名前を付けて保存)

f:id:trykmkm:20170927210522p:plain

 

 ②任意の名称を入力し、OKボタンクリック。(ここでは、UltraSonicAndLaserとする。)

f:id:trykmkm:20170927210604p:plain

  

 

 ③前々回使用した、超音波センサ用関数のコードSRF02.cとSRF02.hをUltraSonicAndLaserにコピー。

(SRF02.cとSRF02.hを右クリックでコピーを選択し、フォルダUltraSonicAndLaser上でctrl+v)

f:id:trykmkm:20170927213435p:plain

 

 ④UltraSonicAndLaserのmain.cppのコードを下記の通りに書き換え。

  (超音波センサのリードロジック追加)

//This software includes the work that is distributed in the Apache License 2.0

#include "mbed.h"
#include "x_nucleo_53l0a1.h"
#include <stdio.h>

#include "SRF02.h" //

/* This VL53L0X Expansion board test application performs a range measurement in polling mode
on the onboard embedded top sensor. */

//#define VL53L0_I2C_SDA D14
//#define VL53L0_I2C_SCL D15
#define VL53L0_I2C_SDA p28 //D14->p28変更
#define VL53L0_I2C_SCL p27 //D15->p27変更

DigitalInOut resetPin(p12);

SRF02 sensor(p28,p27,0xE0); //SRF02インスタンス(SDAピン, SCLピン, i2cデバイスアドレス指定)

static X_NUCLEO_53L0A1 *board=NULL;


/*=================================== Main ==================================
=============================================================================*/
int main()
{
    int status;
    uint32_t distance;

    //センサリセット処理追加
    resetPin.output();
    resetPin = 1;
    wait(0.1);
    resetPin = 0;

    DevI2C *device_i2c = new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);

    /* creates the 53L0A1 expansion board singleton obj */
    //board = X_NUCLEO_53L0A1::instance(device_i2c, A2, D8, D2);
    board = X_NUCLEO_53L0A1::instance(device_i2c); //インスタンス生成方法変更

    /* init the 53L0A1 expansion board with default values */
    status = board->init_board();
    if (status) {
        printf("Failed to init board!\n\r");
        return 0;
    }

    while (1) {
        status = board->sensor_centre->get_distance(&distance);
        if (status == VL53L0X_ERROR_NONE) {
            //printf("Distance : %ld\n", distance);
            printf("LASER(LV53L0X) : %4d [cm]\n",distance/10); //cm単位に変更

            //超音波センサ距離取得
            int distance = sensor.readcm();
            //USBシリアルポートに距離出力
            printf("ULTRASONIC(SRF02) : %4d [cm]\n",distance);
            //0.5秒待機
            wait(0.5);
        }
    }
}

 

⑤UltraSonicAndLaserをコンパイル

 ここで、コンパイルボタンをクリックすれば、実行ファイルが生成されるのですが・・・。

 下記のようなエラーが発生しました。

f:id:trykmkm:20170927221650p:plain

 エラー168とは、かぎ括弧の閉じ側が無いとか、関数宣言のところにセミコロンが無い場合に発生するものらしいです。

  

 いろいろ調査してみましたが、上記のエラーを解決することができませんでした。

 どうやら、STmicroのLV53L0Xライブラリを使用すると、他のi2cデバイスは使用できなくなるみたいです。

 よって、次回は別の方法を模索してみようと思います。

 

超音波・レーザ測距センササンプルプログラム(4)

 今回は、前々回作成したハード上で、STmicroが公開しているレーザ測距センサ(VL53L0X)サンプルプログラムを動作させるサンプルプログラムを作成します。

 

 前回と同様、サンプルプログラムを動かすまでの手順を下記します。

 

 ①サンプルコードをmbedの開発環境にインポートするため、まずはブラウザでmbedにログインします。

 

 ②ブラウザで下記ページに移動します。

 HelloWorld_53L0A1 - a mercurial repository | Mbed

 

 ③サンプルコードをインポートします。画面のImpor into Compilerをクリックします。(下記キャプチャ参照)

f:id:trykmkm:20170924012251p:plain

 

 ④サンプルコードインポートを許可します。Importボタンをクリックします。

  今回は、Import Nameはそのまま、HelloWorld_53L0A1とします。(下記キャプチャ参照)

f:id:trykmkm:20170924012316p:plain

 

 ⑤開発環境のマイプログラム内にHelloWorld_53L0A1が追加されます。

 

 ⑥サンプルコードのリビジョンを変更します。

  最新版だとコンパイルが通らないため、コンパイルできるリビジョンに変更します。

 マイプログラム内のHelloWorld_53L0A1を選択し、右クリックして、リビジョンをクリックします。

f:id:trykmkm:20170924024109p:plain

 

⑦9番目のリビジョンを選択して、ワーキングコピーをこのリビジョンに切り替えるをクリックします。

f:id:trykmkm:20170924024737p:plain

 

⑧ファイル名をmain.cppのコードを一部変更します。

  理由は、下記の2つのためです。

  ・既存のコードは、i2cピンがmbed LPC1768ではない

  ・プログラム起動時にセンサをリセットさせる

  main.cppをクリックします。(下図参照)

 f:id:trykmkm:20170924013802p:plain

 

⑨main.cppを下記コードに変更

//This software includes the work that is distributed in the Apache License 2.0

#include "mbed.h"
#include "x_nucleo_53l0a1.h"
#include <stdio.h>

/* This VL53L0X Expansion board test application performs a range measurement in polling mode
on the onboard embedded top sensor. */

//#define VL53L0_I2C_SDA D14
//#define VL53L0_I2C_SCL D15
#define VL53L0_I2C_SDA p28 //D14->p28変更
#define VL53L0_I2C_SCL p27 //D15->p27変更

DigitalInOut resetPin(p12);

static X_NUCLEO_53L0A1 *board=NULL;


/*=================================== Main ==================================
=============================================================================*/
int main()
{
    int status;
    uint32_t distance;

    //センサリセット処理追加
    resetPin.output();
    resetPin = 1;
    wait(0.1);
    resetPin = 0;

    DevI2C *device_i2c = new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);

    /* creates the 53L0A1 expansion board singleton obj */
    //board = X_NUCLEO_53L0A1::instance(device_i2c, A2, D8, D2);
    board = X_NUCLEO_53L0A1::instance(device_i2c); //インスタンス生成方法変更

    /* init the 53L0A1 expansion board with default values */
    status = board->init_board();
    if (status) {
        printf("Failed to init board!\n\r");
        return 0;
    }

    while (1) {
        status = board->sensor_centre->get_distance(&distance);
        if (status == VL53L0X_ERROR_NONE) {
            //printf("Distance : %ld\n", distance);
            printf("LASER(LV53L0X) : %4d [cm]\n",distance/10); //cm単位に変更
        }
    }
}

 

⑩保存ボタンクリック後、コンパイルボタンをクリックして実行ファイル(HelloWorld_53L0A1_LPC1768.bin)生成。

 

⑪mbedをPCに接続し、mbedにHelloWorld_53L0A1_LPC1768.binを保存。

 

teratermでmbed Serial portを指定し、ボーレート9600bpsに指定すれば、センサの測定データが連続で出力します。下記にキャプチャを示します。

f:id:trykmkm:20170924025120p:plain

 

 次回は、超音波測距センサとレーザ測距センサの測定データを出力するサンプルプログラムを作成します。