Tiny RTC DS1307 I2C その2

暑くて、夏到来ですね。8月に入って、また今年も暑い夏がやってきました!

昼間はとても、PC触る気にならないので自然と夜型になります。昼は友達とお茶して、構想を練っていました。

 

さて、RTC を半田付けして配線してソフトウェアをコピペして動かしてみました。

ProMini につけてみました。配線は4本で、2本は電力、2本がデータ通信です。ProMini のA4(SDA) と A5(SCL) がどこにあるのかわからず、ピンをつける前のを見て判明。

promini

とりあえず、こんな感じでPC にシリアル経由でデータを流してみました。

2

シリアル通信に、時が流れて、電源を切って再接続しても、当然ながら時が刻まれています。

1

プログラムソースは以下な感じです。

/*
 Tiny RTC (DS1307) Sample.
 RTClib.h
  --> https://github.com/jcw/rtclib

 JunkHack 2015.07.31(Fri)
 */

#include <Wire.h>    // Wire lib.
#include "RTClib.h"  // need to install the RTClib by jcw

RTC_DS1307 RTC;      // RTC Modul

void setup(void) {

  Wire.begin(); // Initialisiere I2C
  RTC.begin(); // Initialisiere RTC
  Serial.begin(9600);

  // Set SQW/Out signal frequency to 1 Hz.
  RTC.setSqwOutSignal(RTC_DS1307::Frequency_1Hz);

  // Serial mes.
  Serial.print(__DATE__ " " __TIME__); // コンパイルしたときの日時 Aug  1 2015 13:24:48
  Serial.println(" : Tiny RTC DS1307 I2C --- test");

  // RTC にクロックがセットされているか?
  if (! RTC.isrunning()) {

    // コンパイル時の、現在の日付と時刻を設定
    RTC.adjust(DateTime(__DATE__, __TIME__));          // IDE の PC 時刻
    Serial.println("Current time to the RTC");
  }
  else Serial.println("RTCは、すでに実行されています。");
}

void loop(){
  DateTime now=RTC.now(); // Current time geting from RTC
  show_time_and_date(now);  // Print Serial
  delay(1000); // 1 Sec
}

// set week
String get_day_of_week(uint8_t dow){

  String dows="  ";
  switch(dow){
   case 0: dows="Sun"; break;
   case 1: dows="Mon"; break;
   case 2: dows="Tue"; break;
   case 3: dows="Wed"; break;
   case 4: dows="Thu"; break;
   case 5: dows="Fri"; break;
   case 6: dows="Sat"; break;
  }

  return dows;
}

// print date time. ex 2015.07.31(Fri) 23:22:31
void show_time_and_date(DateTime datetime){
  // 2015.07.31(Fri) 
  Serial.print(datetime.year(),DEC);
  Serial.print(".");
  if(datetime.month()<10)Serial.print(0);
  Serial.print(datetime.month(),DEC);
  Serial.print(".");
  if(datetime.day()<10)Serial.print(0);
  Serial.print(datetime.day(),DEC);
  Serial.print("(");
  Serial.print(get_day_of_week(datetime.dayOfWeek()));
  Serial.print(") ");

  // Time 23:22:31
  if(datetime.hour()<10)Serial.print(0);
  Serial.print(datetime.hour(),DEC);
  Serial.print(":");
  if(datetime.minute()<10)Serial.print(0);
  Serial.print(datetime.minute(),DEC);
  Serial.print(":");
  if(datetime.second()<10)Serial.print(0);
  Serial.println(datetime.second(),DEC);
}

実際に動かしてみると、なるほどーという感じで実感が沸きます。時刻はIDE の PC からの時刻をコンパイル時に定数に渡してそれをセットしている感じですので、転送完了までタイムラグがあり、正確にセットするには工夫が必要だとわかりました。

ArduinoNano 単体で VGA出力

時計をどっかに出力したいけども、手元に出力するものがないので、なんか良い方法はないかなぁと調査していたところ、なんと、Arduino 単体でVGA 出力できるそうではないですか!以下、横スクロールしている写真です。

2

抵抗が5本とジャンク品のマザーボードからぶっこぬいてきた、VGAメスに配線し、VGA 出力できました。

写真 2

配線するだけで、良いとはまさに盲点。

写真 1

全体像はこんな感じ。

1

まだ時計のデータは表示していませんが、このVGA出力で、RTC の情報なんかを表示してみようと思っています。

 

使用したライブラリは、VGAX Library for Arduino UNO です。イタリアのMaffiodo, Sandroさんが作られたものです。リンク先行くと、画像のようなピクセル表示の絵なんかも出せます。このVGA 出力の表示方法を考えたのは、今から3年前にオーストラリアのNick Gammon さんがフォーラムでリリースしたのが最初のようです。

 

面白いのは、RGB 信号を抵抗で降圧させて、あとは垂直・水平同期信号を出して、GND入れて6本の配線でVGA コネクタへつながります。このあたりの評価を解析したまじめなサイト(Arduinoを用いたVGA映像信号の出力・穴田 拓磨さん)もあり、勉強になりました。トランジスタと抵抗4本とコンデンサを使ったエミッタフォロワ回路の紹介もあり、波形は断然綺麗でした。

 

今や、HDMI や DVI が主流のビデオ出力信号ですが、アナログRGB のVGA も用途によっては活躍する場がありますので、覚えておいて損はないですね。

なつかしのテニスゲーム!

これ、幼稚園くらいにやったような記憶があります。

あまりの懐かしさに、ちょっと感動しました。120 x 60ピクセルでのゲームも原点に返っていいかもです。

pong

まだ操作パッドは作っていないんですが、arduino 単体でVGA に表示してテニスゲームが出来るなんて想像すらしませんでした。

pong1

ソースコードは、ここに作者がアップロードしています。

[youtube https://www.youtube.com/watch?v=mrRGosn48gw]

操作するパッドを作って遊びたいですね。

ESP12 ファームウエア

前からやりたかったんですが、後回しになっていたESP8266(ESP-12) のファームウェアの書き換えです。

いろんなところで紹介されているので、いまさらですが、忘れてしまうためにメモしておきます。

 

2014.08.09 現在で、オフィシャルのファームウェアは、以下のようです。昨日リリースですか!

Latest Version 1.3.0 Release date Aug 08, 2015

解答すると、以下のようなバイナリがあります。

$ cd esp8266/esp_iot_sdk_v1.3.0_15_08_08/esp_iot_sdk_v1.3.0/bin

$ tree
.
├── at
│   ├── eagle.flash.bin
│   ├── eagle.irom0text.bin
│   ├── readme.txt
│   ├── user1.1024.new.2.bin
│   └── user2.1024.new.2.bin
├── blank.bin
├── boot_v1.2.bin
├── boot_v1.4(b1).bin
├── esp_init_data_default.bin
└── upgrade

2 directories, 9 files

購入したときには、0.9.5あたりが入っていた記憶があります。(未確認)そのときは、確か、あまり確認もせずに、arduino IDE for ESP8266 から書き込んだのでどうなっていたかわかりませんが、再度、オフィシャルから見てみました。

 

このあたりは、オフィシャルのBBSを見たほうがいいです。結構なスピードでSDK のバージョンがあがっています。

Espressif / ESP8266 / Developer Zone /  Downloads / SDKs

http://bbs.espressif.com/viewforum.php?f=46

とりあえず、0.9.5 をもう一度入れて復習しておきます。BBS からSDK のesp_iot_sdk_v0.9.5_15_01_23を落として解凍してみました。

$ cd esp_iot_sdk_v0.9.5_15_01_23/esp_iot_sdk_v0.9.5/bin

$ tree
.
├── at
│   ├── readme.txt
│   ├── user1.512.new.bin
│   ├── user1.512.old.bin
│   ├── user2.512.new.bin
│   └── user2.512.old.bin
├── blank.bin
├── boot_v1.1.bin
├── boot_v1.2.bin
├── esp_init_data_default.bin
└── upgrade

GPIO0 Pin をGND に落としてBoot して、(もしくは、RST を GND に落としリセットして)以下のコマンドで書き込みます。

$ esptool.py -p /dev/tty.SLAB_USBtoUART write_flash 0x00000 boot_v1.2.bin 0x01000 at/user1.512.new.bin 0x3e000 blank.bin 0x7e000 blank.bin

※-p オプションの UART デバイスはお使いのものを

無事書き込みできると、以下のようになります。

Connecting…
Erasing flash…
Writing at 0x00000400… (100 %)
Erasing flash…
Writing at 0x00034800… (100 %)
Erasing flash…
Writing at 0x0003ec00… (100 %)
Erasing flash…
Writing at 0x0007ec00… (100 %)

Leaving…

CoolTerm などからUART 経由でログインし、115200 bps で接続すると、以下のようなコマンドの結果が返ってくればOKだと思います。

AT
OK
AT+GMR
AT version:0.21.0.0
SDK version:0.9.5
OK
AT+RST
OK

ets Jan  8 2013,rst cause:4, boot mode:(3,7)
wdt reset
load 0x40100000, len 816, room 16
tail 0
chksum 0x8d
load 0x3ffe8000, len 788, room 8
tail 12
chksum 0xcf
ho 0 tail 12 room 4
load 0x3ffe8314, len 288, room 12
tail 4
chksum 0xcf
csum 0xcf
2nd boot version : 1.2 
  SPI Speed      : 40MHz 
  SPI Mode       : QIO 
  SPI Flash Size : 4Mbit
jump to run user1
rlNÿ
ready

ATコマンドのドキュメントは、SDK のドキュメントの中のPDFにあるか、または、初版はオフィシャルBBSの以下にあります。

at_v0.20_14_11_28
http://bbs.espressif.com/viewtopic.php?f=5&t=64

さて、ESP-12 モジュールはどこまでこのファームウェアを上げれるのでしょうか?今や、技適が通った、ESP-13 や Pin数が増えたESP-12E などがあり、いまいち、違いが見えてきません。SDK 1.2 からは、mesh network ができるようになった模様です。また、patch で SSL もサポートされたようです。
2015/08/08 にリリースされた、SDK には、以下のように2種類のファームウェアがあります。

$ cd esp_iot_sdk_v1.3.0_15_08_08/esp_iot_sdk_v1.3.0/bin
$ tree
.
├── at
│   ├── eagle.flash.bin
│   ├── eagle.irom0text.bin
│   ├── readme.txt
│   ├── user1.1024.new.2.bin
│   └── user2.1024.new.2.bin
├── blank.bin
├── boot_v1.2.bin
├── boot_v1.4(b1).bin
├── esp_init_data_default.bin
└── upgrade

2 directories, 9 files

ReadMe を見ると以下のようです。

download:

boot_v1.2+.bin          0x00000

user1.1024.new.2.bin      0x01000

blank.bin               0x7e000 & 0xfe000

or

eagle.flash.bin        0x00000

eagle.irom0text.bin    0x40000

blank.bin        0x7e000 & 0xfe000

*NOTICE*:

1.If you use Esp Flash Download Tool, please MAKE SURE to choose FLASH SIZE to 8Mbit.

2.UPDATE is not supported in non-boot mode

Update steps

1.Make sure TE(terminal equipment) is in sta or sta+ap mode

ex. AT+CWMODE=3

    OK

    AT+RST

2.Make sure TE got ip address

ex. AT+CWJAP="ssid","12345678"

    OK

    AT+CIFSR

    192.168.1.134

3.Let’s update

ex. AT+CIUPDATE

    +CIPUPDATE:1    found server

    +CIPUPDATE:2    connect server

    +CIPUPDATE:3    got edition

    +CIPUPDATE:4    start start

    OK

note. If there are mistakes in the updating, then break update and print ERROR.

or とあるこの、eagle.*** というのが良くわかりません。これは何者でしょうかね?
とりあえず、このESP-12 は5つあるので全部壊すつもりで、いろいろ試してみるつもりです。技適が通ったタイプも価格がこなれてきたら、遊んでみようかと思います。IoT デバイスのDIY モジュールとしてこれからも活躍しそうですね。

 

さらに情報収集し、このあたりのBlog 記事には、面白いことが書いてありました。

Latest AT Firmware for ESP8266 with 512k Flash _ Kacang Bawang

http://kacangbawang.com/latest-at-firmware-for-esp8266-with-512k-flash/

SDK1.0.1 以降は、バイナリサイズが512kb に収まるには大きすぎるようで、esp-open-sdk で自前でビルドするのがいいよとのこと。そのほかも、いろいろと有益なことや、奇妙な書き込み順を帰ると出来ることなど書いてあります。

 

フラッシュのID というのをesptool でゲットできるそうで、やってみました。GPIO0 を GND に落として、次のコマンドを投げると

$ esptool.py -p /dev/tty.SLAB_USBtoUART flash_id

自分のESP-12 環境では、以下のように出ました。

Connecting…
Manufacturer: ef
Device: 4016

これはどうやら、メーカーコードと使用チップのようです。SPI のフラッシュメモリーで、この例だと、WINBOND のW25Q32 のようです。

http://code.coreboot.org/svn/flashrom/trunk/flashchips.h

/*
* W25X chips are SPI, first byte of device ID is memory type, second
* byte of device ID is related to log(bitsize).
*/
#define WINBOND_NEX_ID        0xEF    /* Winbond (ex Nexcom) serial flashes */
#define WINBOND_NEX_W25X10    0x3011
#define WINBOND_NEX_W25X20    0x3012
#define WINBOND_NEX_W25X40    0x3013
#define WINBOND_NEX_W25X80    0x3014
#define WINBOND_NEX_W25X16    0x3015
#define WINBOND_NEX_W25X32    0x3016
#define WINBOND_NEX_W25X64    0x3017
#define WINBOND_NEX_W25Q40_V    0x4013    /* W25Q40BV; W25Q40BL (2.3-3.6V) */
#define WINBOND_NEX_W25Q80_V    0x4014    /* W25Q80BV */
#define WINBOND_NEX_W25Q16_V    0x4015    /* W25Q16CV; W25Q16DV */
#define WINBOND_NEX_W25Q32_V    0x4016★    /* W25Q32BV; W25Q32FV in SPI mode (default) */

 

このデータシートは、以下のようで、32M-bit / 4M-byte ( 4,194,304 )あるそうですが?512Kbじゃないの?
http://www.marthel.pl/katalog/W25Q80_16_32c.pdf#page=18

うーん、そうだとしたら、うれしい誤算です。ちょっと未確認なので、512Kb ~ 4Mb あるかもというスタンスでこれから意識してみます。

まとめ

・esptool.py か、オフィシャルの書き込みツールを使ってファームをあげる
・書き込みには、GPIO0 をGND に落とす( and RST を GND でもいいようです)
おそらく、ブート時にGPIO0 が GND に落ちていればいいので、タイミングを逃せば、RST でもいいということかと理解。
・書き込みには、高品質な電源で、3.3V を供給するようにすると幸せ(ピーク電流が結構多い)
・ESP-12 では、esp_iot_sdk_v0.9.5_15_01_23 は動作した
・最新のファームウェアは、オフィシャルBBS を見ると詳しい
・自分のデバイスのフラッシュメモリはいくつ? esptool.py  のflash_id で見てみる
・オフィシャルのファームはESP-12 だとどこまで上げれるのか? フラッシュメモリサイズに依存しそうな感じ(未確認)
・esp-open-sdk を使って、自前でファームを作ることが可能
・オフィシャルのファームバージョンsdk_v1.3.0_15_08_08 に2つ組み合わせがあるのはなぜ?

参考

ともの技術メモ tag esp8266
http://tomono.eleho.net/tag/esp8266/

技適OKな中華IoTモジュールを使いこなす _ BRILLIANTSERVICE TECHNICAL BLOG
http://bril-tech.blogspot.jp/2015/07/okiot.html

ESP-12のファームウェアをv1.3.0 に

オフィシャルのツールがWindows のexe だったので、バーチャルボックスでインストール。

Flash download tool Vsersion:v1.2

http://bbs.espressif.com/viewtopic.php?f=57&t=433

DETECTED INFO に 32Mbit って出てました。前回、調査したように、やはりESP-12 には、32M-bit / 4M-byte ( 4,194,304 )あるようです。今まで、512Kb でもarduino とかと比べると、おおーたくさんあるねと思っていましたが、それの4倍です。ちょっと得した気分ですね。クリスタルは26Mhz のようです。

GW-20150812-000341 で、書き込みして、AP に接続できるようにしてリセットかけてみました。ちゃんとフラッシュに設定は保存されて、バージョンも1.3.0 になっていました。UART の都合上、Windows のCoolTerm で接続テストはやりました。

GW-20150812-000919

あと、マニュアルのP.55 に 前からできるみたいなんだけども、UART-WiFi passthrough modeというのがあって、WiFi経由でシリアルにパススルーできるようです。osx 側の nc は brew で netcat を入れています。osx のだとオプションが通らないので。

CoolTerm_0_と_ishizaka_—_ESP8266_—_netcat_—_ttys000_と_名称未設定

この設定は、フラッシュに保存されないようなのですが、IP と Port を打ち込めるようなものをESP側に付ければ、WiFi 経由でシリアルを操れることになりますね。これを、単機能にしてESPのAP に接続しにきたものをシリアルに流すだけのファームが透過のブリッジのファームウェアの原理なのかも。このあたりは、次回以降実験してみたいと思います。

あ、あとWEBにもオフィシャルのAT コマンド(ちょっと古いけど)があったので、メモ。

CIPMODE

https://github.com/espressif/esp8266_at/wiki/CIPMODE

ま、とりあえずフラッシュが4Mあって、SDK1.3も書き込めるということがわかったのでとりあえず今日はここまで。