twitter icon   twitter icon   rss icon

Linux.com Japan

Home Linux Jp チュートリアル Arduino をしゃべるリマインダー マシンにする - 第 1 部

Arduino をしゃべるリマインダー マシンにする - 第 1 部

原文は、こちらです。

fig-1-hackishglory

Arduino Uno、MaxBotix EZ1 超音波距離計、WAVE シールドと DS1307 リアルタイム クロックを利用して、Arduino リマインダー マシンを作成します。以前、「Arduino を害虫よけ器にする」で作成したものです。MaxBotix のそばを歩くと、WAVE シールドをトリガーして、指定された音声リマインダーを実行します。または、詩を読んだり、音楽を演奏したり、その他、何でも構いません。タイムアウト機能もあるので、いつまでもリマインダーを聞き続ける必要もありません。

第 2 部は、ここにあります。

この第 1 部では、半田不要のブレッドボードと、時間計測用に使う DS1307 リアルタイム クロックの使い方を学びます。第 2 部では、できたスケッチをロードして、実行します。

シリアル スピードを確認する

例で使うスケッチでは、シリアル スピードが 9600 です。もし使用しているシステムのシリアル スピードが異なると、Arduino のシリアル コンソールにはごみが表示されます。”stty” コマンドで、スピードを確認します。

$ stty -F /dev/ttyACM0 speed
9600

前もってやっておきたいこと

このプロジェクトを始める前に、「Arduino を害虫よけ器にする」を読んでください。基本的な電子工作用の道具、半田付けができること、Arduino の組み立てができること、そして各部品の説明や仕様書を見つけて、理解できることが必要です。Adafruit Industries、Jameco、Sparkfun、Digikey などで Arduino 関係の部品を購入できます (Digikey は日本にもあります)。必要な部品は以下のとおりです。

 「Arduino を害虫よけ器にする」には、WAVE シールドと MaxBotix 超音波距離測定器の接続方法とテスト方法が書かれています。DS1307 リアルタイム クロックは、Arduino の電源がオフのときも時間を保持します。これは、組み立てる必要があり、自分で時刻と日付を設定します。Adafruit.com にある説明書に従ってください。

すべての部品を接続する

Arduinoを害虫よけ器にする」では、MaxBotix を WAVE シールドに半田付けしました。今回は、ブレッドボードを使用して接続します。ブレッドボードは、プロトタイピングや実験に最適です。WAVE シールドは、Arduino の上に載せます。ですから、Arduino に接続するというよりも、WAVE シールドに接続することになります。WAVE シールドの電源、アナログ ピンの表示は見難いため、まず、Arduino からの簡単な接続図を作成しましょう。図 1 に全体の写真を掲載したので、結線図の作成はみなさんで行ってください。

図 2 は、結線を少しわかりやすく書いた図です。この図は、Fritzing という PCB (プリント基板) 用のプログラムで作成しました。Fritzing は MaxBotix 用のイメージを持っていなかったので、GIMP で作成しました(MaxBotix は大きさを変えられません)。

fig-2-schematic

もし、結線図でわからなければ、つぎのように順番に結線してください。

  • DS1307 は、5 ピンのヘッダーを持っています。このヘッダーをブレッドボード E 列の 1 行目から 5 行目に接続してください。注意点として、この RTC のピン配列は変わる可能性があるので正しい配列であることを確認してください。
  • WAVE シールドの A5 を DS1307 の SCL ピンに相当する行に接続。
  • WAVE シールドの A4 を DS1307 の SDA ピンに相当する行に接続。
  • WAVE シールドの GND ピンを、ブレッドボードのグランド レールのどれかのピンに接続。
  • WAVEシールドの5Vピンを、ブレッドボードの電源レールのどれかのピンに接続。
  • ブレッドボードのグラウンド ピンを DS1307 のグラウンド ピンに相当する行に接続。
  • ブレッドボードの電源ピンを DS1307 の 5V ピンに相当する行に接続。
  • MaxBotix のグラウンドと 5V をそれぞれブレッドボードのグラウンドと電源レールに接続。
  • MaxBotix の AN をブレッドボードの空いている行に接続。
  • WAVE シールドの A0 を上記と同じ行に接続。

ブレッドボードの扱いに慣れていないときには、列と行に注意してください。列とは、電源、グランドレールを共通にしています。行は、電源や信号用です。図 3 に、ブレッドボードを裏側から見た様子を示します。覆いを取って、レールがわかるようにしています。これらのレールは、導体の金属からできていて、ジャンパー線を挟み込めるようになっています。

私の使ったブレッドボードでは、各行は、5 つのピンを持っていました (図 4)。

fig-3-breadboard

5V ピンから複数デバイスへ供給する

容量が許す限り、Arduino の 5V 電源ピンから、複数のデバイスへ電力を供給し、グラウンドを共通にすることができます。その容量はどのくらいでしょうか。正確な値はわかりませんが、参考にできる値は ± 可能です。

ボード上の電圧レギュレーターは、電流が過大に流れたときや温度が一定値を超えたときに、ボードをシャット ダウンします。各 I/O (入出力) ピンの最大値は 40 mA ですが、実際にはそんなに使用しません。だいたい 20 mA くらいのマージンが取ってあります。Arduino ボード自体は、アイドル状態で 40 mA 消費します。USB プラグは、ソフト ヒューズが 500 mA 超で切れて、下がったら接続されるようになっています。まとめると、合計 300 mA (ボードに接続した全機器と、ボードに搭載されている部品の合計) が最大値となります。Maxbotix は 5V で3 mAくらい、DS1307 は、計測すると nA 単位でした。WAVE シールドは、再生中に 100 mA 消費します。ということで、このプロジェクトの消費電力は、問題ないことがわかりました。

Arduino の電源として、USB ポート、電池またはスイッチング電源を使うことができます。プラグは、2.1 mm径、センターが + です。電圧は、7 V から 12V が安全です。

リアルタイム クロックのテスト

まず、DS1307 リアルタイム クロックのテスト用スケッチをロードしましょう。RTC と Wire ライブラリが必要です。Wire は Arduino コアに含まれています。コアは、/usr/share/arduino/libraries/ を探すと見つかります。または、Arduino IDE 上で、File > Example > Wire としても見つかるでしょう。

RTC ライブラリには、いくつかの種類があります。私は Adafruit RTClib を使いました。これをダウンロードし、インストールしてください。Wire と RTC ライブラリの keywords.txt を読んで下さい。そこには、すべてのデータ タイプと関数の説明があります。最初にすべきことだと思います。コードを読みながら探して下さい。

fig-4-breadboard-clip

 

#include <wire.h>
#include "RTClib.h"
RTC_DS1307 RTC; 
void setup () {
    Serial.begin(9600);
    Serial.print("\nThe current date and time will be updated every three seconds:\n\n");
    Wire.begin();
    RTC.begin();  
}
void loop() { 
    DateTime now = RTC.now();   
    Serial.print("The day of the week is ");
    Serial.print(now.dayOfWeek(), DEC);
    Serial.println();
    Serial.println("The date and time are:");    
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.println(now.second(), DEC);
    delay(3000);   
    if (now.dayOfWeek() == 3) {
    Serial.print("\nhello, we have a match.\n\n");
    }
    else {
      Serial.print("\nI am ever so sorry, your numbers don't match. \n");
    }  
}

DS1307 RTC が if 文中の曜日と実際の曜日との一致を検出すると、以下のように表示されます。

The current date and time will be updated every three seconds:
The day of the week is 3
The date and time are:
2014/5/21 15:1:37
hello, we have a match.

これで、指定日にイベントを行うことができるようになりました。if 文の番号を変えると何が起こるでしょうか。

The current date and time will be updated every three seconds:
The day of the week is 3
The date and time are:
2014/5/21 15:2:43
I am ever so sorry, your numbers don't match.

Serial.print if 文に注意してください。変数を使わず、時間に関係する関数を呼び出しています。時間と日付に関する関数は、RTClib のスケッチに例が掲載されているとともに、keywords.txt にリストされています。DayOfWeek() 関数は、曜日を 1 から 7 の値で返します。月曜日から始まるので、3 は水曜日を意味します (ドキュメントを全部正確に読み通す以外に、ソースコード、RTClib.cpp を読むという方法もあります。他には、試行錯誤もありです)。

これは、複数条件の比較の例です。リマインダーのように、何かのイベントをトリガーするときは、センサーは、午後 3 時 45 分になったことを検知する必要があります。

if ((a0value < = 40) && (now.hour() == 15) && (now.minute() == 45))

スケッチ全体は、第 2 部で説明します。

リファレンス

Ladyada.net Arduino Tutorials

Arduino language reference

Ladyada.net Arduino Tutorials

Arduino language reference

入門書として、Simon Monk 著 Programming Arduino: Getting Started with Sketches、電子回路や C プログラミングを既に知っているならば、Michael Margolis 著 Arduino Cookbook, 2nd Edition などが良いと思います。

Linux Foundationメンバーシップ

30人のカーネル開発者

人気コンテンツ


Linux Foundationについて

Linux Foundation はLinux の普及,保護,標準化を進めるためにオープンソース コミュニティに資源とサービスを提供しています

 

The Linux Foundation Japan

サイトマップ

問い合わせ先

サイトに関するお問い合わせはこちらまで

Linux Foundation Japan

Linux Foundation

Linux Training

提案、要望

Linux.com JAPANでは広く皆様の提案、要望、投稿を受け付ける予定です。

乞うご期待!