このブログについて
このブログは、自称組み込みエンジニアの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)が発生しました。
この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 ができました。
使い方は、下記コマンドを入力します。
デバイスアドレス、レジスタアドレス、データは16進数形式で入力します。
例として、DRV8830の出力端子を1V正転にするときの入力を示します。
今回は、ここまでです。次回は、i2cgetを確認する予定です。
------------------------------------------------------------------------------------
※前回までのセットアップで、libftdiを使用できる環境が構築済と思っていたんですが、何か足りなかったぽいです。この作業をしないで、後述のmakeを実施すると下記のようなエラーが出ます。
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が表示します。下記キャプチャ参照。
次に、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端子を確認すれば、出力値を確認できます。
キャプチャの様子を下記します。
以上で、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 入力
⑯ターミナルに sudo python setup.py install 入力
(FT232Hスクリプトインストール)
インストール作業は⑮で終了です。⑯以降は、インストールの成功・失敗を判定するための確認作業になります。
⑰ターミナルに python 入力
(python起動)
⑱ターミナルに import Adafruit_GPIO 入力
⑲ターミナルに import ftdi1 入力
ここで、エラー等の応答が無ければOKです。
⑳ ターミナルに quit () 入力
(python終了)
⑰~⑳の流れは下記キャプチャ参照
上記キャプチャより、インストール成功と判断します。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に回路図を示します。
図1 FT232H試験回路
図1の回路図をブレッドボードに配線した基板を図2に示します。
図2 FT232H試験基板(左:モジュールなし 右:モジュール実装)
今回使用した部品を下記に記します。
・FT232H使用USB⇔GPIO+SPI+I2C変換モジュール: 半導体 秋月電子通商 電子部品 ネット通販
・ブレッドボード EIC−801: パーツ一般 秋月電子通商 電子部品 ネット通販
・DRV8830モータードライバモジュール: 組立キット 秋月電子通商 電子部品 ネット通販
最後に、上記基板がRaspberry Piで認識するか確認します。
下記に手順を示します。
①まずは、前回環境を構築したRaspberry PiをFT232Hを接続していない状態で起動します。SSHで接続するので、Raspberry Piにディスプレイ、マウス、キーボードは不要です。下記の図の通りに接続して下さい。
②PCのteratermからSSHで接続し、ログインします。
③ログイン後、FT232H試験基板を接続します。
④コマンド dmesg を入力します。
⑤コンソール" Detected FT232H "が表示されていれば認識しています。
(下記キャプチャ参照)
以上になります。
次回は、Adaftuit製FT232H pythonライブラリをトライしてきます。
Raspberry PiでFT232Hのi2cデバイス制御(3)
前回の続きでRaspberry Piの環境を構築していきます。
前回SDカードにRaspberry PiのOSはインストールしたので、今回はRaspberry Piの設定をしていきます。
まず、下記の通り、Raspberry Piを接続します。
①OSインストール済のSDカードをRaspberry Piに挿入し、電源を投入します。
②しばらく待機すると、デスクトップ画面が表示します。
③デスクトップ画面表示後、
Menu⇒Prefarence⇒Raspberry Pi Configurationをクリック。
④SystemタブのBootをTo CLIに変更。
⑤SSHを有効にする
⑥LocalisationタブのSet KeyboardをJapaneseにセットする。
(KeyboardLayoutのOKボタンクリック、Raspberry Pi ConfigurationのOKボタンをクリック)
⑦再起動
Menu⇒Shutdown⇒Rebootをクリック。
⑧コマンドで、ipアドレスを設定。(詳細略 下記リンク参照)
以上で、Raspberry Piの設定は終了です。
今後は、USBマウス、キーボードを取り外した状態で、SSHでリモート接続した状態で作業をします。
次回は、制御対象のハードを作成します。
なお、ここまでの設定内容からやり直せるように、下記URLの方法で、SDカード内容をPCに保存しておきましょう。
SDカードのコピー方法 | Making Mugbot マグボットの作り方