いつのまにか IDE 0021 がリリースされていました。
まあ、あんまり関係ないかもしれませんが・・・
とりあえず、ダウンロードしておきます。
いつのまにか IDE 0021 がリリースされていました。
まあ、あんまり関係ないかもしれませんが・・・
とりあえず、ダウンロードしておきます。
さて、こんどは・・・サーボを接続してみます。
サーボって、ラジコンとかでジーコジーコ音を立てるモ-ターですね。
(なんちゅう表現!)
Arduinoではサーボ用の命令もあるので簡単に接続できる・・・ハズです。
でも、その出力が9Pinと10Pinを使うようです。
それって、LCDの表示に使っちゃっているじゃないですか・・・
ということで、まずは9,10Pinを空けることからやっていきます。
10Pinに接続していたジャンパー線を13Pinに移動しました。
6~9Pinに接続してたジャンパー線を5Pin~に移動しました。
LiquidCrystal lcd(5,6,7,8,13,11,12);
これで、LCDへの接続線の移植は終了です。
さて、肝心のサーボモーターに接続します。
秋月電子で買ってきたサーボは「フタバと同じ接続」だそうです。
これは、白:シグナル 赤:VDD 黒:GND だそうです。
なので、白を9Pin、赤を+5V、黒をGNDに接続してプログラムを実行してみると・・・
サーボモータからは、ギュンギュン音が出ますが、まったく動かず・・・
LCDのバックライトがチラチラと光ります。
なんか、怪しい!
やっぱり、電源を別にしないとダメなのかなぁ。
ということで、電池ボックスで6Vをサーボモーター用に供給したら・・・
あっさりできました。
ということは、やっぱりサーボモーターが出すノイズ?でArduinoが誤動作しちゃうらしいです。
(よく判りませんが、とにかく、ちゃんと動作しない!)
ずっと前に、電子工作の師匠が「制御系と駆動系は別電源」と言っていたのを、改めて認識しました。
で、一旦は実験を終了したのですが・・・
あとで、気が付いて、もう一回・・・
こんどは、パソコンとのUSBケーブルを外して、電池ボックスの6Vだけでやってみたら・・・
出来ちゃいました。
単に、USBケーブルからの給電が弱かっただけみたい!
これをArduinoねたにして良いのか判りませんが・・・
M&Y家族が大好きな「頭文字D」
自動車に水を入れたコップを載せ、コップの水をこぼさないように運転していたら、運転が上手になった・・・らしい(笑)
ありゃ現実的には無理でしょうが・・・
でも・・・加速度センサーを活用すれば、水をこぼさない装置とかできそうだなぁ・・・
と思ったら、既にArduinoを使って作った人がいらっしゃいました。
</object>
YouTube: コップの水がこぼれない車載テーブルをarduinoで.wmv
この映像をじっと見ていると・・・酔います! (笑)
いやっ、そうじゃなくて、装置がちゃんと機能しているのがわかります。
Arduinoと3次元加速度センサー、サーボモーターで実現したようです。
実験の時の水の量をもっと増やしてほしいですねぇ。
プログラムを組むときに、普通は各pinの入出力を最初に定義します。
夏休みの宿題で、YがArduinoを使って何やらやっていたのですが・・・
「動かない!」と質問してきました。
今やっているのは、単純にボタンを押したら別のランプ(LED)が点くという単純なものなのですが、単純なプログラムなのに、ちゃんと動きません。
いや、単純にA6ポートに接続したLEDが点灯しません。
「pinModeはA5が19だから、A6は20でいいのだよねぇ。」
と首をひねっています。
リファレンスを見ても。
アナログ入力ピンはデジタルピンとしても使えます。アナログ入力ピン0がデジタルピン14、アナログ入力ピン5がデジタルピン19に対応します。
と書かれているだけです。
いろいろ実験した結果の私の結論としては・・・
NANOではA6とA7はデジタル出力に使えない!
です。
いや、何か単純な間違いをしているのでしょうか?
pinMode( 20,OUTPUT );
と記述しても、エラーも出ないし・・・あたりまえか・・・
I2C接続の超音波センサーである、SRF02のアドレス変更に挑戦してみました。
これまで、I2Cモジュールの接続は、あっけないほど簡単だったのですが・・・
今回のアドレス書き換えには苦労しました。
まず、ネットで書き換えのための説明を確認すると・・・
3つのコマンドを順番に送れば良いことが判りました。
0xA0,0xAA,0xA5
です。
その後に、新しいアドレスにしたい数値を送付します。
試しに・・・デフォルトの0xE0を0xF2に変えようと思って、以下のプログラムを実行してみます。 (以下は主要部分だけ)
Wire.beginTransmission(i2cAddress);
Wire.send(0xA0);
Wire.send(0xAA);
Wire.send(0xA5);
Wire.send(0xF2);
Wire.endTransmission();
さて、書き換わったかと思いきや・・・なにも変わっていません。
そうか、やっぱり先頭に Command の 0x00 を書かないとだめなのか・・・
Wire.beginTransmission(i2cAddress);
Wire.send(0x00);
Wire.send(0xA0);
Wire.send(0xAA);
Wire.send(0xA5);
Wire.send(0xF2);
Wire.endTransmission();
よし、これで・・・変わらない・・・
もう、いろいろやってみました。
でも・・・変わらない・・・
もう一回、冷静にネットでSRF02のアドレス書き換えについて書かれているページを検索して、英語を何度も読んでみたところ・・・
アドレス書き換えのためのコマンド1個1個を独立して送らなければならないようです。
ということで・・・
Wire.beginTransmission(i2cAddress);
Wire.send(0x00);
Wire.send(0xA0);
Wire.endTransmission();
Wire.beginTransmission(i2cAddress);
Wire.send(0x00);
Wire.send(0xAA);
Wire.endTransmission();
Wire.beginTransmission(i2cAddress);
Wire.send(0x00);
Wire.send(0xA5);
Wire.endTransmission();
Wire.beginTransmission(i2cAddress);
Wire.send(0x00);
Wire.send(0xF2);
Wire.endTransmission();
としてみたら・・・やっとアドレスが書き換わりました。
今回は長かった!
これで、やり方は理解できました。
(9.99GBPの出資がムダにならずに済んでほっとしてます。)
で、このSRF02の素晴しいところは・・・電源を入れると、設定されている自分のアドレスをLEDの点滅で表示してくれるんです。 これなら、アドレスを変更しても、判らなくなることがありません。
こんなに小さいのに素晴しい機能です。
怒濤のごとく続く いろいろなセンサーを接続してみようコーナー(勝手に作るな!)です。
今回は、超音波センサーです。(秋月で購入した SRF02)
これも、これまで出てきた超音波センサーと何が違うのでしょうか?
はい、こちらは、I2C接続なんですね。
いつものように、2本の線(SDAとSCL)を接続して・・・あっさり完了です。
でもデータのやり取りがちょっとだけ違います。
センサーから、測距データを貰う前に、どの単位で計測するかを指示しなければなりません。
(インチかセンチメートルか)
で、センサーから送られてくるデータは、距離の数値がその単位で送られてきます。
17cmなら「17」、25cmなら「25」
NXTの超音波センサーなら当たり前のことですけど・・・普通のモジュールがこのようになっているとは、ちょっとビックリです。
ただし、このセンサーの弱点は、最小測定範囲が16cmなのです。
ですので、16cm未満の距離は測れないどころか、対象物を16cmより近づけると、センサーが送り出す数値が大きかったり小さかったり不定になります。
ケチケチしないで、もっと高級なヤツを買えば良かったかなぁ。
でも、こんなセンサーが一個 1,300円で手に入るのだから・・・良い時代ですよねぇ。
先日、我が家に届いた赤外線センサーを実験して見ました。
これも、I2C接続なので、信号線を2本接続するだけです。
そして、プログラムも・・・単純!
と思って実行したのですが、うんともすんとも動きません。
今度はいったい何がダメなんだよ!
いろいろ調べたら・・・SDAとSCLのプルアップの抵抗が必要みたいです。
SDAとSCLに10KΩの抵抗を入れて、再度やってみると・・・
あっさり動作しました。
これ、すごいです。
単純に温度が表示できます。
何もしないと、気温(室温)が表示され、手をかざすと手の温度が表示されます。
小数が表示されないのが、とても残念ですねぇ。
さらに、8個のセンサーがあり、8方向の温度をそれぞれ測ることが出来るんです。
これで、測ると・・・私のノートパソコンの熱い部分は37℃のようです。
さらに、熱い空気のでる排気口は42℃と表示されます。
なんか、楽しいです。
ついでに、サーボを制御する機能まで搭載しているらしいです。
サーボでこのセンサーを動かすと2次元のサーモグラフィーのような出力結果が得られるらしいです。
でも、その制御方法は・・・英語なので全くわかりません。(涙)
方位センサーです。
またですか?
そうです。
でも、今回のは、これまでのとはちょっと違います。
3次元での方位検出が出来るのです。
と、いっても完全に3次元とまでは出来ないようで・・・多少傾けても方位を検出できる、というものらしいです。
じゃあ、Arduinoに接続してみます。
って、I2C接続なので、4本の線(電源とGNDを除くと2本)を接続するだけなので、超簡単です。
プログラムもセンサーのレジスタを読み出すだけです。
こんなに、簡単でいいの?
これで、1つのセンサーで方位と傾きを検出することが出来そうです。
ちなみに・・・
このセンサーの実験をしていて・・・
ある時から、液晶(LCD)に文字が全く表示できなくなりました。
何も映らない!?
何で!?
で、よく調べたら、液晶の明るさ(文字のコントラスト)を調整する半固定抵抗がズレていただけでした。
さらに、このセンサーは、あらかじめピンヘッダーが半田付けされているのですが、基板の上側に出ています。
ですので、ブレッドボードに刺すときにはひっくり返さなければなりません。
で、ひっくり返すときに間違って、VCCとGNDを逆に配線してしまいました。 (俗に言う、「逆挿し」)
それを知らずに、Arduinoに接続したUSBケーブルをパソコンに挿すと・・・
「USBに不明なデバイス」と表示されて、Arduinoが接続できなくなりました。
また、何で!? とクエッションマークが頭のなかで回りました。
センサーの基板に触れたら
熱っちぃ!
そこで、逆挿しにやっと、気が付きました。
まあ、気が付いて良かったです。
Japaninoを使用していたパソコンに Arduino NANO を接続しても、「不明なデバイス」と言って、認識されないことがありました。
その場合は、
http://www.ftdichip.com/Drivers/VCP.htm
にある、ドライバを入れると良いようです。
また、方位センサー?
と、言われちゃうかもしれませんが・・・
全然違う方位センサーです。
型番はHM55Bというものです。
これは、前の記事でおもちゃを分解して取り出したものです。
以前、AVRねたで紹介したものですが・・・研究を中断していました。
(別名・・・さぼっていた)
Arduinoだと、結構簡単に実験できるので、またやる気が湧いてきました。
ということで、早速接続してみます。
このセンサーは6個の端子があります。
VCCは3Vなので、3.3Vの3端子レギュレータで降圧して供給します。
まあ、いろいろ面倒なことは考えずに接続してみます。
CSB:D3 CLK:D2 DOUT:D1 DIN:D0
にそれぞれ接続します。
で、プログラムは
#include <LiquidCrystal.h>
#define CSB 3
#define CLK 2
#define DOUT 1
#define DIN 0
LiquidCrystal lcd(5,6,7,10,11,12,13);
void OutZero()
{
digitalWrite( DIN,LOW );
delayMicroseconds(1);
digitalWrite( CLK,LOW );
delayMicroseconds(1);
digitalWrite( CLK,HIGH );
}
void OutOne()
{
digitalWrite( DIN,HIGH );
delayMicroseconds(1);
digitalWrite( CLK,LOW );
delayMicroseconds(1);
digitalWrite( CLK,HIGH );
}
int ReadOut()
{
int d;
delayMicroseconds(1);
digitalWrite( CLK,LOW );
if( digitalRead( DOUT )==HIGH)
d=1;
else
d=0;
delayMicroseconds(1);
digitalWrite( CLK,HIGH );
return(d);
}
void setup()
{
pinMode(CSB,OUTPUT);
pinMode(CLK,OUTPUT);
pinMode(DOUT,INPUT);
pinMode(DIN,OUTPUT);
digitalWrite( CSB,HIGH );
digitalWrite( CLK,HIGH );
digitalWrite( DIN,HIGH );
}
void loop()
{
int d,i,x,y;
digitalWrite( CSB,LOW );
OutZero();
OutZero();
OutZero();
OutZero();
digitalWrite( CSB,HIGH );
digitalWrite( CSB,LOW );
OutOne();
OutZero();
OutZero();
OutZero();
digitalWrite( CSB,HIGH );
delay(30);
digitalWrite( CSB,LOW );
OutOne();
OutOne();
OutZero();
OutZero();
lcd.clear();
lcd.setCursor(0,0);
for(i=0;i<4;i++)
{
d=ReadOut();
// lcd.print( d,HEX );
}
x=0;
for(i=0;i<11;i++)
{
x=x<<1;
x=x+ReadOut();
}
if( x >= 1024)
x=x-2048;
lcd.print( " x:" );
lcd.print( x,DEC );
y=0;
for(i=0;i<11;i++)
{
y=y<<1;
y=y+ReadOut();
}
if( y >= 1024)
y=y-2048;
lcd.print( " y:" );
lcd.print( y,DEC );
digitalWrite( CSB,HIGH );
delay( 1000 );
}
これで、2組の数値x、yが取り出されます。
これをarctanで角度に戻すと・・・方位になるハズです。
でも、面倒なので2つの数値を取り出すところまでしか、まだやっていません。
ちなみに、数値の精度は11bitのうち7bit位しか使ってないようなので、実用性は低いと思います。(苦笑)
それでも、ヤフオクで100円とかで手に入れたおもちゃなので・・・そんなもんでしょうね。
次は超音波センサーを接続してみます。
何で買ったかは記憶に無いのですが・・・EZ1という超音波センサーのユニットが転がっていましたのでそれを接続してみます。
このユニットは3種類の出力方法があります。
・シリアル接続
・普通のアナログ出力
・PWM出力
シリアル接続は・・・難しそうなのでパス。
普通のアナログ出力は、問題なくできました。(あたりまえ!)
で、PWM出力に挑戦です。
EZ1のPW端子をArduinoのデジタル入力(D7)につなぎます。
プログラムは
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,10,5,4,3,2);
void setup()
{
pinMode(7,INPUT);
}
void loop()
{
long x;
x = pulseIn(7,HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print( x,DEC );
delay( 250 );
}
こんな感じです。
いや、もう、簡単にできて良いのでしょうか?
これだと、常に超音波を出し続けることになります。
センサーのRX端子をLOWにするとセンサーを停止し、HIGHにするとセンサーを有効にできますので、必要の無い時には停止し、必要のあるときにだけ超音波を出すことができるようです。
では、次はI2Cの実験です。
何で買ったか判らないけど・・・方位センサーHMC6352があったので、これを接続してみました。
HMC6352は、Vcc、GND、SDA、SCLの4本を接続します。
で、ArduinoとはSDAをA4、SCLをA5に接続するならわしのようです。
で、プログラムは
#include <LiquidCrystal.h>
#include <Wire.h>
const int i2cAddress = 0x42 >> 1;
LiquidCrystal lcd(12,11,10,5,4,3,2);
void setup()
{
Wire.begin();
}
void loop()
{
int h;
h = readHeading();
lcd.clear();
lcd.setCursor(0,0);
lcd.print( h,DEC );
delay( 250 );
}
int readHeading()
{
int heading;
Wire.beginTransmission(i2cAddress);
Wire.send("A");
Wire.endTransmission();
delay(6);
Wire.requestFrom(i2cAddress, 2);
heading = Wire.receive();
heading = heading << 8;
heading += Wire.receive();
return(heading);
}
これで、方位を0~3600の数値でLCDに表示します。
次は早速、3次元加速度センサーでアナログ入力の確認など・・・
使用したセンサーはKXM52-1050という3次元加速度センサーです。
これのX軸出力をA0ポートに、Y軸をA1ポート、Z軸をA2ポートにそれぞれ接続しました。
プログラムは
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,10,5,4,3,2);
void setup()
{
}
void loop()
{
int x,y,z;
x = analogRead(0);
y = analogRead(1);
z = analogRead(2);
lcd.clear();
lcd.setCursor(0,0);
lcd.print( x,DEC );
lcd.setCursor(5,0);
lcd.print( y,DEC );
lcd.setCursor(10,0);
lcd.print( z,DEC );
delay( 250 );
}
こんな感じですね。
LCDに x、 y、 z の数値が表示されました。
ブレッドボードごと傾けると数値が変化します。