trykmkmの備忘録

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

このブログについて

このブログは、自称組み込みエンジニアのtrykmkmが調査したことを、記録として残していくものです。

 

思うがままに追記していくので、見づらいと思いますが、ご了承ください。

 

誤字、脱字、誤記など沢山あるため、一度掲載した記事でもちょくちょく更新します。

注意してください。

Raspberry PiでFT232Hのi2cデバイス制御(一旦終)

 今回は、(7)の続きで、libftdiを直接使用したFT232Hのi2cデバイス制御の受信プログラムを作成しようと思います。

 プログラムは、Ori Idanさんが公開している、FT4232用リードコマンドを流用します。

 

 ラズパイの状態は、(7)の作業を終えた状態です。

 試験基板を挿入し、カレントディレクトリはホームディレクトリ(/home/pi)の状態から始めます。

 

 下記に作業手順を記載します。 

 

 ①プログラムをFT4232から FT232H 用にするため、i2cget.cの314行目の0x6011を0x6014にします。

 

 ②デバッグモードを有効にするため、i2cget.cの38行目を debug = 1 に書き換えます。 送信したデータがターミナルに表示できます。

 

  ③コマンドmakeを入力して、実行ファイルを生成します。

 

 ④i2csendとi2cgetでセットで下記コマンドを入力します。コマンドの使い方の詳細は、ここを参照。

 sudo ./i2csend 0x60 0x00 0x35

 sudo ./i2cget 0x60 1

 

 結果は、下記の通り、エラー(Error: all fine)が発生しました。

f:id:trykmkm:20171210184453p:plain

 

 このError: all fineをソース上からみたところ、下記339行目が原因と思われます。

 dwNumBytesRead = ftdi_read_data(&ftdic, InputBuffer, 2);

恐らく、事前にセットする&ftdicの値が正しくないと思われます。

 

 よって、getのプログラムを作るには、  libftdiの使い方を詳しくみていく必要がありますが、見通しがたたないのでこのシリーズは終了とします。

 また、機会があれば調査して、getのコマンドを完成させたいと思います。

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

 今回は、libftdiを直接使用したFT232Hのi2cデバイス制御プログラムを作成しようと思います。

 プログラムは、Ori Idanさんが公開している、FT4232用ライト・リードコマンドを流用します。この記事ではライトを作成したいと思います。

 

 ラズパイの状態は、(5)の作業を終えた状態です。(厳密にいえばAdafruitのライブラリを使用しないので⑫まででOK)

 試験基板を挿入し、カレントディレクトリはホームディレクトリ(/home/pi)の状態から始めます。(OSは(3)、試験基板は(4)を参照)

 

 下記に手順を記載します。 

 ①まず、libftdiのパッケージをインストール(※1)するため

  コマンド sudo apt-get install libftdi-dev -y を入力します。

 

 ②下記コマンドを入力して、ソースコード一式をラズパイにダウンロードます。

  すでにmaster.zipというファイルがある場合は、上記コマンド入力前に、リネームか削除しておきましょう。

 

 ③ファイルを解凍します。unzip master.zip

 

 ④解凍したフォルダ内部に移動します。 cd ftdi-i2c-master 

 

 ⑤プログラムをFT4232から FT232H 用にするため、i2csend.の183行目の0x6011を0x6014にします。

 

 ⑥デバッグモードを有効にするため、i2csend.cの38行目を debug = 1 に書き換えます。 送信したデータがターミナルに表示できます。

 

 ⑦関数メインを下記コードに書き換えます。書き換える理由は、不要なオプション削除と、既存コードがデバイスアドレスを1bitシフトしたデータとそのままのデータを送る処理になっているからです。そのため、元のコードを修正しています。

int main(int argc, char *argv[]) {
    int i, a;
    char *s, *serial;
    int b = 0;
    int flag = 1;

    if(argc < 2) {
        printf("i2csend: Send data over i2c bus using ftdi FT232H port 0 I2C\n");
        return 1;
     }

    for(a = 1; a < argc; a++) {
        for(a = 1; a < argc; a++) {
            s = argv[a];
            if(*s == '-') { // This is a command line option 
                s++;
                a++;
                if(*s == 'c')
                    chan = 0;
               else if(*s == 'g')
                    gpio = 0;
               else {
                    printf("Unknown option -%c\n", *s);
                    exit(1);
              }
          }
         else
            break;
     }
    InitializeI2C(chan, gpio);
    HighSpeedSetI2CStart();

    for(i = a ; i < argc; i++) {
       // Acutaly send bytes
       s = argv[i];
       b = 0;
       if(*s == '0')
           s++;
       if(*s == 'x')
           s++;

        while(*s) {
            if(!isxdigit(*s)) {
                printf("%c Invalid hex value: %s\n", *s, argv[i]);
                break;
             }
            b *= 16;
            *s = toupper(*s);
            if(*s >= 'A')
                b += (*s - 'A' + 10);
            else
                b += (*s - '0');
                s++;
        }

        if(flag){
            flag = 0;
            b = b << 1; // R/W bit should be 0
        }

        if(debug)
            printf("Sending %02X\n", b);
        b = SendByteAndCheckACK((unsigned char)b);
        if(debug) {
            if(b)
               printf("Received ACK\n");
            else
               printf("Error reading ACK\n");
        }
  }
    HighSpeedSetI2CStop();
    ftdi_write_data(&ftdic, OutputBuffer, dwNumBytesToSend);
    dwNumBytesToSend = 0;

    ftdi_usb_close(&ftdic);
    ftdi_deinit(&ftdic);

    return 0;
}

 

 ⑧コマンド make を入力

  これで、コマンド i2csend ができました。

  使い方は、下記コマンドを入力します。

 sudo ./i2csend デバイスアドレス レジスタアドレス データ ・・・

   デバイスアドレス、レジスタアドレス、データは16進数形式で入力します。

  例として、DRV8830の出力端子を1V正転にするときの入力を示します。

f:id:trykmkm:20171204022928p:plain

 

 今回は、ここまでです。次回は、i2cgetを確認する予定です。

 

 ------------------------------------------------------------------------------------

 ※前回までのセットアップで、libftdiを使用できる環境が構築済と思っていたんですが、何か足りなかったぽいです。この作業をしないで、後述のmakeを実施すると下記のようなエラーが出ます。

f:id:trykmkm:20171120223419p:plain

 Perhaps you should add the directory containing `libftdi.pc'で検索したところ、下記のページに引っ掛かりました。

Compilation dependencies · Issue #1 · matthiasbock/flashrom-ice40 · GitHub

上記ページによれば、aptgetでlibftdiをインストールすればよさそうです。

すでにソースからコンパイルしてインストールしたのに、大丈夫でしょうか?

pythonに異常がでたら、OSセットアップからやり直しましょうか(汗)

ソースコードからインストールするのと、apt-getでインストールするのは何が違うのか・・・。自身への課題としておきましょう。

 

 

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

 今回は、AdafruitのFT232Hスクリプトを使って、試験基板のDRV8830を制御していこうと思います。

 ラズパイは、前回のFT232Hスクリプトのインストールが完了している状態で、かつ、カレントディレクトリはホームディレクトリです。

 

  まず、Adafruitが公開しているi2cデバイススキャンプログラムを動かします。コードは、下記URLリンクにある、I2C Device Enumerationにあるものです。

I2C | Adafruit FT232H Breakout | Adafruit Learning System

 手順を下記します。

 

①ターミナルに下記コマンドを入力します。

(サンプルコードダウンロード)

 

②ターミナルに  mv download i2cScan.py 入力

(サンプルコードのファイル名変更)

 

③ ターミナルに  sudo python i2cScan.py 入力

(サンプルコード実行)
成功すれば、DRV8830のデバイスアドレス0x60が表示します。下記キャプチャ参照。

f:id:trykmkm:20171104000751p:plain

 

 次に、DRV8830にデータをリードライトするテストプログラムを動かしてみたいと思います。

 手順を下記します。

 

①ターミナルに vi testDRV8830.py 入力

 

②ターミナルに i を入力し、VIを挿入モードにし、下記コードをコピペし、esc キー押下し、wq を入力してVI終了。

import Adafruit_GPIO.FT232H as FT232H
import time
import sys

# Temporarily disable FTDI serial drivers.
FT232H.use_FT232H()

# Find the first FT232H device.
ft232h = FT232H.FT232H()

 

# Set i2c instance as DRV8830.
i2c = FT232H.I2CDevice(ft232h, 0x60)

 

# check DRV8830.
if i2c.ping():
    print 'DRV8830 Found'
else:
    print 'DRV8830 is not found. Program end!!'
    sys.exit()

 

# write FAULT registor clear
i2c.write8(0x01, 0x80)

 

# read CONTROL registor clear
value = i2c.readU8(0x00)

 

# CONTROL register value check & write CONTROL registor
if value == 0x66:
    # 2V reverse -> 1V forward
    i2c.write8(0x00, 0x35)
    print 'Output 1V Forward'
else:
    # 0V/1V forward -> 2V reverse
    i2c.write8(0x00, 0x66)
    print 'Output 2V Reverse'

 

③ターミナルに  sudo python testDRV8830.py 入力

(テストプログラム実行)
実行するごとに、DRV8830の出力が-2V⇒1V⇒-2V⇒1V⇒・・・となります。

テスターでDRV8830のVout1,Vout2端子を確認すれば、出力値を確認できます。

キャプチャの様子を下記します。

f:id:trykmkm:20171104003328p:plain

 

 以上で、Adafruit のFT232Hスクリプトを使用したi2cデバイス制御はできました。

 よって、このブログ記事の目的は果たせました。

 次回以降も、引き続き別の方法でFT232のi2cデバイス制御をトライしていきたいと思います。 

 

 

 

 

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

 今回は、Adafruitが公開しているFT232Hスクリプト をインストールします。

 

 ラズパイに電源投入後、試験基板を挿入し、カレントディレクトリはホームディレクトリ(/home/pi)の状態から始めます。(OSは(3)、試験基板は(4)を参照)

 

 基本的には、Adafruitが公開している手順に沿って進めます。

 下記に手順を記載します。 

 

①ターミナルに sudo apt-get upgrade 入力

 (インストールされてるパッケージの更新)

 

②ターミナルに sudo apt-get update 入力

 (サーバからパッケージの入手)

 

③ターミナルに下記コマンドを入力

  sudo apt-get install build-essential libusb-1.0-0-dev swig cmake python-dev libconfuse-dev libboost-all-dev

(FT232Hスクリプトに必要となるライブラリ、パッケージ類を一括インストールします)

途中で  Do you want to continue? [Y/n] と聞かれるので、 Y を入力

 

④ターミナルに下記コマンドを入力

 (FT232Hスクリプトの元となるライブラリのソースコードダウンロード)

 

⑤ ターミナルに  tar xvf libftdi1-1.2.tar.bz2 入力

 (上記ライブラリのソースコードを解凍)

 

⑥ ターミナルに  cd libftdi1-1.2 入力

 (上記解凍ディレクトリ内に移動)

 

⑦ ターミナルに  mkdir build  入力

 (ビルドファイル生成用のディレクトリ作成)

 

⑧ ターミナルに cd build  入力

 (上記ビルドファイル生成用のディレクトリ内に移動)

 

⑨ターミナルに下記コマンドを入力

  cmake -DCMAKE_INSTALL_PREFIX="/usr/" -DPYTHON_INCLUDE_DIR="/usr/include/python2.7" -DPYTHON_LIBRARIES="/usr/lib/python2.7/" ../

 (コンパイル設定)

 

⑩ ターミナルに make 入力

 (ビルド開始)

 

⑪ターミナルに sudo make install 入力

 (ビルドしたファイルをインストール)

 

⑫ターミナルに cd  入力

 (ホームディレクトリに移動)

 

⑬ターミナルに下記コマンドを入力

 (FT232Hスクリプトダウンロード)

 

⑭ターミナルに unzip master.zip 入力

 (FT232Hスクリプト解凍)

 

⑮ターミナルに cd Adafruit_Python_GPIO-master  入力

 (FT232Hスクリプト解凍ディレクトリ内に移動)

 

⑯ターミナルに sudo python setup.py install  入力

 (FT232Hスクリプトインストール)

 

 インストール作業は⑮で終了です。⑯以降は、インストールの成功・失敗を判定するための確認作業になります。

 

⑰ターミナルに python  入力

 (python起動)

 

⑱ターミナルに import Adafruit_GPIO 入力

 

⑲ターミナルに import ftdi1  入力

 ここで、エラー等の応答が無ければOKです。

 

⑳ ターミナルに quit ()   入力

  (python終了)

 

 ⑰~⑳の流れは下記キャプチャ参照

f:id:trykmkm:20171103175959p:plain

 

 上記キャプチャより、インストール成功と判断します。2017年6月頃に同じ手順でFT232Hスクリプトのインストールを試しましたが、エラーが出て失敗しました。時間があったら、6月と今月の結果の原因を探ってみたいと思います。

 よって次回は、FT232Hスクリプトを使用して、試験基板向けのサンプルプログラムを動かしていきます。

 余談ですが、AdafruitのwebページはPDFドキュメントが公開されており、プリントするときは、こちらを使用した方がいいです。

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

 今回は、Raspberry Piに接続するFT232H+i2cデバイスのハードを作成します。

 使用するFT232Hモジュールは、Adafruit製のものを使用します。制御対象のi2cデバイスは、秋月製DRV8830モジュールを使用します。

 回路は、ここのページ記載の通り、D1とD2をショート、D1はSDAとして使用しプルアップする、D0はSCLとして使用しプルアップします。

 

 図1に回路図を示します。

f:id:trykmkm:20171103000232p:plain

 図1 FT232H試験回路

 

 図1の回路図をブレッドボードに配線した基板を図2に示します。

 

 

f:id:trykmkm:20171103001941j:plain f:id:trykmkm:20171103001952j:plain

図2 FT232H試験基板(左:モジュールなし 右:モジュール実装)

 

今回使用した部品を下記に記します。

FT232H使用USB⇔GPIO+SPI+I2C変換モジュール: 半導体 秋月電子通商 電子部品 ネット通販

ブレッドボード EIC−801: パーツ一般 秋月電子通商 電子部品 ネット通販

DRV8830モータードライバモジュール: 組立キット 秋月電子通商 電子部品 ネット通販

 

 最後に、上記基板がRaspberry Piで認識するか確認します。

 下記に手順を示します。

 

 ①まずは、前回環境を構築したRaspberry PiをFT232Hを接続していない状態で起動します。SSHで接続するので、Raspberry Piにディスプレイ、マウス、キーボードは不要です。下記の図の通りに接続して下さい。

f:id:trykmkm:20171017221343p:plain

 

 ②PCのteratermからSSHで接続し、ログインします。

 

 ③ログイン後、FT232H試験基板を接続します。

 

 ④コマンド dmesg を入力します。

 

  ⑤コンソール" Detected FT232H "が表示されていれば認識しています。

  (下記キャプチャ参照)

f:id:trykmkm:20171017221806p:plain

 

 以上になります。

 次回は、Adaftuit製FT232H pythonライブラリをトライしてきます。

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

 前回の続きでRaspberry Piの環境を構築していきます。

 

 前回SDカードにRaspberry PiのOSはインストールしたので、今回はRaspberry Piの設定をしていきます。

 

 まず、下記の通り、Raspberry Piを接続します。

f:id:trykmkm:20171014183303p:plain

 

 ①OSインストール済のSDカードをRaspberry Piに挿入し、電源を投入します。

 

 ②しばらく待機すると、デスクトップ画面が表示します。

 

 ③デスクトップ画面表示後、

  Menu⇒Prefarence⇒Raspberry Pi Configurationをクリック。

f:id:trykmkm:20171015230812p:plain

 

  ④SystemタブのBootをTo CLIに変更。

f:id:trykmkm:20171015233504p:plain

 

 ⑤SSHを有効にする

f:id:trykmkm:20171015233744p:plain

 

  ⑥LocalisationタブのSet KeyboardをJapaneseにセットする。

  (KeyboardLayoutのOKボタンクリック、Raspberry Pi ConfigurationのOKボタンをクリック)

f:id:trykmkm:20171015235317p:plain

 

 ⑦再起動

   Menu⇒Shutdown⇒Rebootをクリック。

 

 ⑧コマンドで、ipアドレスを設定。(詳細略 下記リンク参照)

  Raspbian(jessie)の固定IPアドレス設定方法

 

 以上で、Raspberry Piの設定は終了です。

 今後は、USBマウス、キーボードを取り外した状態で、SSHでリモート接続した状態で作業をします。

 次回は、制御対象のハードを作成します。

 

 なお、ここまでの設定内容からやり直せるように、下記URLの方法で、SDカード内容をPCに保存しておきましょう。

  SDカードのコピー方法 | Making Mugbot マグボットの作り方