ありぎりす の徒然日記

アクセスカウンタ

zoom RSS RaspberryPiで鉄道模型を動かしてみる その4

<<   作成日時 : 2016/07/26 12:06   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

DACで速度制御その1:
前回PWMを使って鉄道模型車両の速度を制御しました。
今回はDACを使ってみましょう。
DACとはDigital to Analog Converter のこと。
このデバイスを使えばアナログ電圧を出力できるので、
モータドライバ(TA7291P)への指令電圧を加減して、
モータの速度制御が可能になる、とゆう寸法です。

で、今回 ありぎりす が用いるDACがこちら、
画像

MCP4726秋月電子通商から購入、一個150円)です。

このMCP4726は、I2Cとゆうシリアル通信で指令された
12ビットの数値に従って電圧を出力するとゆうものです。

まずはラズパイでI2Cを使えるようにしなければいけません。

 Menu → 設定 → RaspberryPiの設定
 ”インターフェイス” タブを開いて I2C を有効に設定。
 再起動

これでI2Cが有効になるはずです。

念のために、
 /boot/config.txt が
 
dtparam=i2c_arm=on

となっていること、
 /etc/modules に
 
i2c-dev

があることを確認してください。

参考:
 【Rabbit Note】
 『最近の Raspberry Pi で I2C を有効化』

つぎにI2Cの動作確認に便利なツールを入手します。
ターミナルウィンドウを開いて
 $ sudo apt-get install i2c-tools
と入力すると、必要なツールが入手できます。

それではMCP4726を配線します。
画像


 Vout 出力電圧
 Vss  グランド   ラズパイのGNDに接続
 Vdd  電源    ラズパイの3.3Vに接続
 SDA  I2Cデータ  ラズパイのGPIO2に接続
 SCL  I2Cクロック ラズパイのGPIO3に接続
 Vref  使用しない

こんな感じ
画像


で、ターミナルで
 $ i2cdetect -y 1
とやると、
画像

このように表示されます。

この”60”とゆうのがDACに割り当てられたアドレスとゆうことです。

と、まぁここまでは割とすんなり進んだのですが・・・
この”60”とゆうアドレスに何をどうやって書き込んだら
電圧を出力できるのか、が理解らない。

秋月電子通商のサイトには、詳細なデータシートが公開されて
いるのですが、英語なのと、電気的な特性とか通信のタイミングとかは
あっても、アプリケーションからの使用例なんかは載ってない。 (T^T)

で、ネット検索をしてみたら、以下のサイトを発見。
参考:
 【hogen】
 『MCP4726 DAC を Rapsberry Pi I2C で使う』

さっそく、ターミナルから
 $ i2cset -y 1 0x60 0x40 0xff 0xf0 i
と入力したら、Vout から3.3V出力されました。 ヽ(´▽`)ノ

ところが今度はC言語のプログラムからどうやって指令すればいいのかが
理解らない。
いろいろネット検索してみても見つからない。
とゆうか、そもそもwiringPiには、
I2Cにブロック送信するための関数が用意されていない。 (T^T)

しかたがないので、ブロック送信関数を自作してwiringPiに追加。
ビルドしなおして実行してみた・・・だけど、出力でない・・・ orz
デバイスドライバからの戻り値は正常終了が返ってきてるのに、何で?

ここでちょっと行き詰まった。
 『デバイスドライバのソースを探しだして解析してみないとダメかなぁ?
  そんなことやりたくねぇなぁ (´∩`。)』
などと考えていたら・・・閃いた。 (・◡・)!
 『i2cset を使って手入力すれば電圧出力出来るんだったら、
  標準関数の ”system” を使えばいいんじゃね?』

で、以下のような関数を作ってみた。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>

int dac_out(int value)
{
 char str_data[40];
 char low[10];
 char high[10];

 value = value << 4;

 sprintf(low,"0x%.2x ",(value & 0xf0));
 sprintf(high,"0x%.2x ",((value >> 8) & 0xff));
 strcpy(str_data,"i2cset -y 1 0x60 0x40 ");
 strcat(str_data,high);
 strcat(str_data,low);
 strcat(str_data,"i &\n");
 system(str_data);

 return 0;
}


やったぁ、DACからアナログ電圧出力できたぁ。 ヽ(´▽`)ノ

だけど、このDACで出力できるのは5Vまで。
鉄道模型の車両を動かすには、12Vくらいまで出力できないといけない・・・

続きは次回

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
RaspberryPiで鉄道模型を動かしてみる その4 ありぎりす の徒然日記/BIGLOBEウェブリブログ
文字サイズ:       閉じる