Arduino

Arduino電力計 - 2系統対応の回路図とスケッチ

目次
  1. Arduino電力計 - プロトタイプ
  2. Arduino電力計 - 回路図とスケッチ
  3. Arduino電力計 - サージ対策
  4. Arduino電力計 - Pachubeにデータをアップロードする
  5. Arduino電力計 - ケースに組み込む
  6. Arduino電力計 - 2系統対応の回路図とスケッチ

イントロダクション


IMGP0150

おまたせいたしました。2系統の入力に対応したArduino電力計の回路図とスケッチを公開します。2系統入力の対応に加えてちょっと大き目のキャラクタLCDもつけてみました。リアルタイムに消費電力がわかると楽しいですからね。


回路図


Arduino電力計回路図

キャラクタLCDと電圧計測用のトランス部分を回路図に追記しました。キャラクタLCDは秋月電子の20×4行。トランスは大阪高波の電源トランス(100V-6V)です。フューズは0.3Aのガラス管タイプ、バリスタはZNRV14221U。

スケッチ


今回のバージョンからArduinoの1.0に対応しています。Arduino 0022以前のバージョンをお使いの方はArduino 1.0にアップデートしてください。

このスケッチにはPachube(パッチベイ)に計測した電力情報をアップロードする機能が組み込まれています。それらの機能をお使いになる場合は settings.h のENVIRONMENT_ID、API_KEY、macAddressを書き換えてお使いください。

Download: Power meter /w Arduino
http://code.google.com/p/arms22/downloads/detail?name=watt_pachube-1.0.zip

Arduino - Software
http://arduino.cc/en/Main/Software



picoPSU-160-XT
picoPSU-160-XT
posted with amazlet at 12.01.30
Mini-Box
売り上げランキング: 41674


最近はこんな小さなPC用の電源が発売されているんですね。これ12V入力-3.3V/5V/12V出力のDC-DCコンバーターです。電子工作にも使えるかも。


Arduino 1.0 リリース

arduino-1_0-screenshot.png

11月30日にArduino 1.0がリリースされました。1つの節目としてさまざまな変更が加えられおり、標準ライブラリや内部構造が大きく変更されています。既存のスケッチやライブラリは少なからず手を入れないと動作しない場合が多いようです。。僕が公開しているスケッチやライブラリも修正しないと動かないもがほとんどです。。順次対応していきます。

Arduino Software
http://arduino.cc/en/Main/Software

Arduino Software Release Notes
http://arduino.cc/en/Main/ReleaseNotes


開発環境

  • 新しい拡張子
    従来の .pde から .ino に変わりました。"Arduino"の最後の3文字、"ino"の部分だそうです。
  • 新しいツールバーアイコンに新しいカラースキーム
  • 選択されているボードとシリアルポートの表示
  • プログレスバーの追加
    コンパイルとアップロードの進捗が画面右下に表示されます。また環境設定で compilation と upload にチェックを入れておくとコンパイルとアップロードの詳細情報がコンソールに表示されます。


コア/標準ライブラリ

  • Serial送信の非同期化
    Serial.print()などデータの送信はバックグラウンドで行われるようになりました。Serial.flush()は受信データを破棄する処理から、送信データがすべて送信されるまで待つ処理に変更されました。
  • Serial.print(byteVal)は数値を文字として送信
    byte型を数値のまま送信したい場合は Serial.write(byteVal) を使います。あわせてBYTEキーワードも廃止されました。
    From:
    Serial.print(val, BYTE);
    or
    Serial.print(byteVal);
    To:
    Serial.write(byteVal);

  • Streamクラスに文字列パース関数を追加
    データを検索する find() と findUntil()、文字を数値に変換する parseInt() と parseFloat()、タイムアウト付きの読み込み関数 readBytes()とreadBytesUntil()が追加されました。setTimeout()を使ってタイムアウト時間を設定します。
      find(target);
    findUntil(target,term);
    readBytes(buffer,length);
    readBytesUntil(term,buffer,length);
    parseInt();
    parseFloat();
    setTimeout(timeout);

  • SoftwareSerialクラスの再実装
    NewSoftSerial が標準ライブラリとして取り込まれました。NewSoftSerialは複数のシリアルポートを制御することができます。受信できるのは1度に1つのポートだけです。
  • プログラムメモリに格納された文字列のプリントに対応
    次のように F() マクロで文字列をかこってやるとプログラムメモリから文字列が読み出されます。
    Serial.print(F("hello world")).

  • Stringクラスの再実装
    より安定したメモリ効率の良いバージョンになりました。
  • EthernetライブラリにDHCPとDNSのサポート追加
    begin(macAddress)とするとDHCPでIPアドレスを割り当てられます。localIP()でDHCPで割り当てられたIPアドレスが取得できます。Clientの接続はホスト名を指定して接続することができます。またいくつかのクラスにEthernetプリフィクスが追加されました。ClientはEthernetClient、ServerはEthernetServer、UDPはEthernetUDPに変更さました。IPアドレスを表す IPAddress クラスが追加されました。
    DHCPによるIPアドレスの割り当て
    Ethernet.begin(macAddress);
    クライアントの接続 From:
    Client client(server, 80);
    if(client.connect())
    To:
    EthernetClient client;
    if(client.connect("www.google.com",80))

  • UDP API変更
    他のストリーム系ライブラリと同様 write()、print()、println() に統一されました。データの送信はbeginPacket()とendPacket()で囲む必要があります。受信パケットのチェックはparsePacket()。送信元情報を取得する remoteIP() と remotePort() が追加されました。
    EthernetUDP udp;
    udp.beginPacket(ip,port);
    udp.write(data);
    udp.endPacket();

  • Wire API変更
    send()→write()、receive()→read()。Streamクラスを継承しているので print() や println() なども使えます。
    From:
    Wire.send(0x10);
    Wire.receive();
    To:
    Wire.write((byte)0x10);
    Wire.read();

  • SDライブラリの複数ファイルオープン対応
    ディレクトリを操作するための関数 isDirectory()、openNextFile()、rewindDirectory() が追加されました。


内部

  • Arduino APIを定義したヘッダの名称変更
    WProgram.h→Arduino.h に変更されました。以下のようにARDUINOマクロをチェックするコードを入れることでArduino 0022以前のバージョンと互換性を持たせることができます。
    #if defined(ARDUINO) && ARDUINO >= 100
    #include "Arduino.h"
    #else
    #include "WProgram.h"
    #endif

  • Printクラスのwrite()、print()、println()の戻り値をvoid型からsize_t型に変更
    write() は書き込まれたサイズを返します。Printクラスを継承するクラスは次のようにwrite()の戻り値を書き換え必要があります。
    From:
    void write(uint8_t);
    To:
    size_t write(uint8_t);

  • ネットワークアクセス用の抽象クラスClient、Server、UDPを追加
    EthernetClient、EthernetServer、EthernetUDPはこれからのクラスを継承しています。
  • Arduinoボードのピン定義ファイルを追加
    harware/variantsディレクトリ以下にArduinoボード毎のピン割り当てを定義したファイルを配置しています。
  • pins_arduino.h にArduinoボードの仕様に関する情報を追加(デジタル・アナログピンの数やSPIやI2Cの位置など)
    #define NUM_DIGITAL_PINS
    #define NUM_ANALOG_INPUTS

    const static uint8_t SS;
    const static uint8_t MOSI;
    const static uint8_t MISO;
    const static uint8_t SCK;

    const static uint8_t SDA;
    const static uint8_t SCL;
    const static uint8_t LED_BUILTIN;



関連情報


Arduino 1.0 now available.
http://arduino.cc/blog/2011/11/30/arduino-1-0-now-available/

Arduino IDEが新しくなりました(その2)
http://www.eleki-jack.com/FC/2011/12/arduino-ide2.html

Arduino IDEが新しくなりました(その1)
http://www.eleki-jack.com/FC/2011/12/arduino-ide1.html

オープンソースの自作マイコンシステムArduino、ソフトウェアバージョン1.0がリリースされる
http://sourceforge.jp/magazine/11/12/02/0444216

Arduino 1.0 is Out: Here’s What You Need To Know
http://blog.makezine.com/archive/2011/12/arduino-1-0-is-out-heres-what-you-need-to-know.html

Initial Review ? Arduino v1.0 IDE
http://tronixstuff.wordpress.com/2011/12/10/initial-review-arduino-v1-0-ide/


Dotsライブラリ003リリース

IMGP1044

Dotsduinoのソフトウェアライブラリ「Dots」の新しいバージョン003をリリースしました。変更点はArduino 1.0 の対応と新しいドットマトリクスの対応です。

MTM07で販売したDotsduinoからドットマトリクスが新しくなり(写真)、ピン配置が変わりました。その為、Dotsライブラリのピン割り当も変更しています。このDotsライブラリは新しいドットマトリクスと旧ドットマトリクスを自動的に判別するので従来のDotsduinoでもそのままお使いいただけます。

Dots 003
http://code.google.com/p/arms22/downloads/detail?name=Dots-003.zip

Arduinoソフトウェアはバージョン1.0以降をお使いください。Arduinoソフトウェアは以下のURLからダウンロードできます。

Download the Arduino Software
http://arduino.cc/en/Main/Software


変更点
  • 新しいドットマトリクスに対応
  • Arduino 1.0 に対応
  • 新しいサンプルを追加(UFOとカニ)


関連URL

ブラウザ上で動くDotsduino用パターンエディタ「Dotsduino Designer」

目次
イントロダクション



Dotsduino Designer

HI-ROM BLOGの中の人がDotsduino用のパターンエディタ「Dotsduino Designer」を作ってくれたよ。

Dotsduino Designerはブラウザ上で動作するDotsduino用のパターンエディタだ。8×40のドットマトリクスにマウスでパターンを描くだけで簡単にスクロールアニメーションを作ることができる(現在のところスクロールアニメーションのみ対応)。

パターンを描くと自動的にスケッチが生成されるので、スケッチをコピーしてArduinoに書き込む。

プレビュー機能がついているのでスケッチを書き込まなくてもパターンの動きを確認できる。スクロール速度の変更が可能でスライダーを動かすとdelayの値が書き換わって、プレビューのスクロール速度が変化する。

Dotsduino Designer
http://hi-rom.com/blog/archives/335

スイッチサイエンスさんは在庫切れ。galileo7ならまだ少し在庫あるみたい。次の入荷は12月ぐらいになる見こみ。

Dotsduino - galileo7
http://www.galileo-7.com/?pid=26976603

Arduinoの新製品

new_arduino_series_via_engadget.jpg
(via Engadget Galleries)

ニューヨークで開催されたMaker Faire 2011で新しいArduinoが発表された。

Arduino Leonardo
Atmega32U4を搭載したローコスト版Arduino。Atmega32U4はUSB機能を内蔵したマイコンなので外付けのUSBシリアルチップが不要に。「オリジナルUSB機器の開発に」と書かれている。Arduino UNOの後継かと思ったけど違うのかな。UNOが今後どうなるのか気になる。

Arduino Due
Arduinoシリーズ初のCortex-M3 ARMプロセッサ搭載。AtmelのSAM3Uプロセッサを搭載している。96MHz動作に256KBフラッシュメモリ、50KB SRAM、SPI 2個、I2C 2個、UARTS 5個、12bit アナログ入力が16本!Arduino MEGAの後継といった感じ。

Arduino Wifi Shield
無線チップとAVR32プロセッサを搭載したWifiシールド。AVR32プロセッサでTCP/IPのフルスタックを実装。Ethernet Shieldのコードがほんの少しの変更でそのまま使えるよう。ただ国内で使用するには技適認証を取得する必要があるのでこのへんAtmelとうまくやって、国内で買えるようにしてほしい。

Leonardo、Wifiシールドは10月末、Dueは11月末頃に販売の予定。


Arduino at Maker Faire New York 2011 - Engadget Galleries
http://www.engadget.com/photos/arduino-at-maker-faire-new-york-2011/

船田戦闘機 - Arduinoのニュース
http://www.nnar.org/archives/2430

Arduino Blog - Breakfast at Arduino
http://arduino.cc/blog/2011/09/17/arduino-launches-new-products-in-maker-faire/

Arduinoで遊ぼう - NTPを使ってインターネット経由で時刻をあわせる

2012/1/14 サンプルスケッチをArduino 1.0用に書き直しました。

NTP同期型キャラクタLCD時計

今日はインターネット経由で自動的に時刻を合わせる時計の作り方を紹介するよ。

一般的にインターネット経由で時刻を合わせる時はSNTPを使う。SNTPはNTPの簡易版で時刻を取得する目的に特化した通信プロトコルだ。クライアントはNTPサーバにUDP(ポート123番)を使って要求パケットを送る。そうするとNTPサーバから時刻情報が入った応答パケットが送られてくる。後は応答パケットから時刻情報を取り出し、キャラクタ液晶に時間を表示すればインターネット時計の完成だ。


SNTPパケット


SNTPパケット
(via ネットで時刻を合わせるプロトコル---SNTP・その3(第66回)

これはSNTPパケットの構造を表している。最後の2つのフィールドはオプションで前半部分の48バイトが正味のパケットとなる。このパケットはクライアントからの要求パケット、NTPサーバからの応答パケットの両方に使われる。要求パケットと応答パケットを同じ構造にすることでNTPサーバの処理負荷を軽減することができる。NTPサーバは送られてきた要求パケットの中身を書き換えて、そのまま送り返すだけだからね。

Transmit TimestampというフィールドにはNTPサーバが応答データを送信した時刻が格納されている。NTPサーバからクライアントまでの通信による遅れはあるけども、Transmit Timestampが現在の時刻情報となる。

時刻情報は1900年1月1日0:00(UTC)からの秒数=64ビットの符号無し固定小数点数(整数部32ビット、小数部32ビット)で表現される。64ビットのフィールドは4294967296秒=約136年でオーバーフローする。つまり今の仕様のままだと2036年の何処かで時間が1900年に巻き戻ってしまうのだ※1

※1...RFC2030を読むと一応対策があるみたい。MSB(最上位ビット)が1の場合、時刻は1968年〜2036年の間にあって、1900年1月1日0:00UTCから計算する。MSBが0の場合、時刻は2036年〜2104年の間にあって、2036年2月7日6時28分16秒UTCから計算するとある。


ハードウェア


時刻の表示にキャラクタ液晶を使います。インターネットの接続にはイーサーネットシールドが必要なので、Arduinoにイーサーネットシールドを接続してからキャラクタ液晶の配線を行ってください。

キャラクタLCDサンプル回路図
キャラクタLCD vs Arduino
VSS <-- GND
VDD <-- 5V
VO <-- 半固定抵抗の中点をつなぐ(両端は5VとGND)
RS <-- 7
R/W <-- GND
E <-- 6
D4 <-- 5
D5 <-- 4
D6 <-- 3
D7 <-- 2
K (バックライトLEDのカソード) <-- GND
A (バックライトLEDのアノード) <-- 100Ωの抵抗を直列に入れて5Vをつなぐ



ライブラリ


このサンプルスケッチでは時間の管理にTimeライブラリを使用しています。以下のURLからTimeライブラリをダウンロードして、Arduinoのライブラリフォルダにコピーしてください。

※Arduino 1.0からEthernetライブラリにDHCP機能が追加された為、EthernetDHCPライブラリを入れる必要はなくなりました。

Arduino Time library
http://www.arduino.cc/playground/Code/Time


サンプルスケッチ


このサンプルスケッチはEthernetライブラリのサンプルコード「UdpNtpClient」をベースに作成しています。DHCPによるIPアドレスの取得、キャラクタ液晶への時刻表示、Timeライブラリによる時間管理に対応しています。

簡単にスケッチを解説すると、setup()でSerial/Ethernet/EthernetUDP/LiquidCrystalの初期化を行い、最初の要求パケット(sendNTPpacket)を送信します。loop()では応答パケットの受信(Udp.parsePacket)、パケットからの時刻情報を取得、Timeライブラリに時刻情報をセット(setTime)、時刻情報のキャラクタ液晶への表示を行っています。

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <LiquidCrystal.h>
#include <Time.h>

// MACアドレス
byte mac[] = {
  0x00, 0x50, 0xc2, 0x97, 0x22, 0xc3 };

// UDPローカルポート番号
unsigned int localPort = 8888;

// NTPタイムサーバIPアドレス(ntp.nict.jp NTP server)
IPAddress timeServer(133, 243, 238, 164);

// NTPパケットバッファサイズ
const int NTP_PACKET_SIZE= 48;

// NTP送受信用パケットバッファ
byte packetBuffer[NTP_PACKET_SIZE];

// Udpクラス
EthernetUDP Udp;

// 最後にパケットを送信した時間(ミリ秒)
unsigned long lastSendPacketTime = 0;

// キャラクタLCDクラス(RS=>7, E=>6, D4=>5, D5=>4, D4=>3, D3=>2)
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup()
{
  Serial.begin(115200);
  Serial.println("Attempting to obtain a DHCP lease...");

  lcd.begin(20, 4);
  lcd.print("Starts sync...");

  if ( Ethernet.begin(mac) == 0 ) {
    Serial.println("Failed to configure Ethernet using DHCP");
    for(;;)
      ;
  }

  Serial.println("A DHCP lease has been obtained.");

  Serial.print("My IP address is ");
  Serial.println(Ethernet.localIP());

  Serial.print("Gateway IP address is ");
  Serial.println(Ethernet.gatewayIP());

  Serial.print("DNS IP address is ");
  Serial.println(Ethernet.dnsServerIP());
  Serial.println();

  Udp.begin(localPort);

  // 最初の時刻リクエストを送信
  sendNTPpacket(timeServer);
  lastSendPacketTime = millis();
}

void loop()
{
  if ( millis() - lastSendPacketTime > 180000 ){
    // NTPサーバへ時刻リクエストを送信
    sendNTPpacket(timeServer);
    // 時間を更新
    lastSendPacketTime = millis();
  }

  // NTPサーバからのパケット受信
  if ( Udp.parsePacket() ) {
    // バッファに受信データを読み込む
    Udp.read(packetBuffer, NTP_PACKET_SIZE);

    // 時刻情報はパケットの40バイト目からはじまる4バイトのデータ
    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);

    // NTPタイムスタンプは64ビットの符号無し固定小数点数(整数部32ビット、小数部32ビット)
    // 1900年1月1日0時との相対的な差を秒単位で表している
    // 小数部は切り捨てて、秒を求めている
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    Serial.print("Seconds since Jan 1 1900 = " );
    Serial.println(secsSince1900);

    // NTPタイムスタンプをUNIXタイムに変換する
    // UNITタイムは1970年1月1日0時からはじまる
    // 1900年から1970年の70年を秒で表すと2208988800秒になる
    const unsigned long seventyYears = 2208988800UL;
    // NTPタイムスタンプから70年分の秒を引くとUNIXタイムが得られる
    unsigned long epoch = secsSince1900 - seventyYears;
    Serial.print("Unix time = ");
    Serial.println(epoch);

    // Timeライブラリに時間を設定(UNIXタイム)
    // 日本標準時にあわせるために+9時間しておく
    setTime(epoch + (9 * 60 * 60));

    Serial.print("JST is ");
    Serial.print(year());
    Serial.print('/');
    Serial.print(month());
    Serial.print('/');
    Serial.print(day());
    Serial.print(' ');
    Serial.print(hour());
    Serial.print(':');
    Serial.print(minute());
    Serial.print(':');
    Serial.println(second());
    Serial.println();

    // LCDクリア
    lcd.clear();
    // 年/月/日を表示
    lcd.print(year());
    lcd.print('/');
    lcd.print(month());
    lcd.print('/');
    lcd.print(day());
    // 2行目3文字目にカーソルを移動
    lcd.setCursor(2, 1);
    // 時:分:秒を表示
    lcd.print(hour());
    lcd.print(':');
    lcd.print(minute());
    lcd.print(':');
    lcd.print(second());
  }
}

// send an NTP request to the time server at the given address 
unsigned long sendNTPpacket(IPAddress& address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE); 
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49; 
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;
  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  // NTP requests are to port 123
  Udp.beginPacket(address, 123);
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}


日本標準時プロジェクト - NICT公開NTP FAQ
http://www2.nict.go.jp/w/w114/tsp/PubNtp/qa.html

IPv4・IPv6・OSI用簡易ネットワーク時刻プロトコル(SNTP)Version 4
http://www.geocities.co.jp/SiliconValley/6876/rfc2030j.htm

ネットで時刻を合わせるプロトコル---SNTP・その3(第66回)
http://pc.nikkeibp.co.jp/article/knowhow/20081006/1008529/

Wikipedia - Network Time Protocol
http://ja.wikipedia.org/wiki/Network_Time_Protocol

NTPサーバ一覧
http://codenight.com/ntp/


Prototyping Lab ―「作りながら考える」ためのArduino実践レシピ (Make:PROJECTS)
小林 茂
オライリージャパン
売り上げランキング: 8320


Arduino EthernetとArduino MEGA ADK

Arduinoチームから新しいボードのご紹介。Arduino EthernetとArduino MEGA ADKです。

Arduino Ethernet, ADK Available for purchase
http://arduino.cc/blog/2011/07/13/arduino-ethernet-adk-available-for-purchase/

Arduino Ethernetはつい先日、SparkFunから発売されたEthernet Proと同じコンセプトのボードでEthernetシールドとArduino Unoが合体したようなボードだ。Arduino EthernetはEthernet ProとおなじくUSBシリアル変換のチップがついていないのでスケッチの書込みには別途、USBシリアル変換ボードが必要だ。Arduino EthernetはPoE(Power over Ethernet)に対応している。PoEはイーサーネットケーブルを介して電源を供給する仕組みで、PoEを利用するには別途、PoEモジュールをつける必要がある。

Arduino Ethernet
Arduino Ethernet
http://arduino.cc/en/Main/ArduinoBoardEthernet


続いてArduinoチームオフィシャルのADKボード、Arduino MEGA ADKです。USBホストシールドとArduino MEGAが合体したようなボードで、Androidにつないでナニかしたい時に使います。折角、USBホストの機能がついているのだからAndroid以外でも使いたいところ。安価なPC用USB機器が使えると楽しそうだ。USBマウスとかキーボード、Bluetooth、カメラ、etc

Arduino MEGA ADK
Arduino MEGA ADK
http://arduino.cc/en/Main/ArduinoBoardADK


最後はAndroidでナニかしたい時に便利なセンサーキット。はんだづけ不要でLEDやボタン、リレー、タッチセンサ、スライドボリュームなどを追加できる。

ADK Sensor Kit
ADK Sensor Kit
http://store.arduino.cc/ww/index.php?main_page=product_info&cPath=2_23&products_id=140



Ads by Google
最近の記事
カテゴリ
Arduino (99)
電子工作 (105)
スタバッテルミン (5)
スタバカップアンプ (17)
電光掲示板 (7)
イベント (49)
太陽電池 (12)
ニキシー管 (19)
ARM (8)
PIC (20)
USBデバイス (7)
V850 (17)
Xfind (6)
プログラミング (4)
Android (3)
未分類 (21)
カメラ (6)
本 (18)
mbed (1)
Amazon.co.jp
最近のトラックバック
以前の記事
リンク
プライバシーポリシー
当サイトでは、第三者配信による広告サービスを利用しています。このような広告配信事業者は、ユーザーの興味に応じた商品やサービスの広告を表示するため、当サイトや他サイトへのアクセスに関する情報 (氏名、住所、メール アドレス、電話番号は含まれません) を使用することがあります。このプロセスの詳細やこのような情報が広告配信事業者に使用されないようにする方法については、ここをクリックしてください。