酒と薔薇の日々(その2)

好きなことだけ求めて生きるアスペ気味のINTJ人

[ Arduino ] RTCモジュール実験 [ DS1307 ]

2022年07月05日 22時21分44秒 | マイコン(ESP32・Arduino等)

よみやさんの動画などを参考にやってみた。
そもそもこのRTCモジュールは彼の動画を見て購入してた。(2月)
ゆくゆくは「PlotClock」に使うつもり。

【電池モジュールをCR2032に変更】

ネット記事を読むとこの基盤で使う電池はリチウムイオン充電池「LIR2032」だそうで、買うと結構高価
AliExで買えば1個100円程度だが9月までは待てない。(航空便不可らしい)

ネットで調べるとキャンドゥ辺りで100円で売っているやつが内蔵してるそうな。
早速買いに行ったが、3大100均ショップで未発見
親切なキャンドゥ店員さんが過去の商品まで調べてくれたが、もう何円も前に絶版になったらしい。
超残念

 改造前

手持ち在庫のLR2032を使うことにした。
これでも数年は電池が持つそうです。

【基盤の改造】

ネットで調べると抵抗とダイオードを外しR6をブリッジすれば良いと書いてある。

改造後の写真 「↑」部分をハンダゴテで温めて部品を取り去る。
R6はハンダもりもり

いやーほんま小さいですね~ 一個は何処かへ吹き飛ばされて無くなった。
こんな部品をホットプレートでハンダ付けするなんて私には無理です。

5Pinソケットをハンダ付けして完成
電池をセットしたが結構固くてソケットを壊しそうだった。

【Arduinoと接続】

I2C通信を行うので、
 GND を Arduino GND
 VCC を Arduino 5V
 SDA を Arduino A4
 SCL を Arduino A5
に接続

【ソフトウエア編 I2Cアドレス確認】

I2C通信用の「Wire」ライブラリは導入済みだったので、
サンプル「i2c_scanner」をライブラリから引っぱり出す。

0x50 が メモリ
0x68 が RTC
アドレスだそうです。

ちなみに、0x50は4KbのEEPROMが実装されており記憶領域として使えるそう。(よみやさん)
なので、Arduinoで取得したセンサーデータをここに記憶させておき、一括データ送信などが可能
また電池バックアップされた58byteのRAMも使える。

【ソフトウエア編 I2Cアドレス確認】

RTCモジュールから時刻を取得してみるサンプルを動かす。

基盤メーカーが提供しているので、ここから「RTC.zip」をDLする。



Arduino IDEのツールバーからスケッチ/ライブラリをインクルードを選択

 

「zip形式のライブラリをインストール」を選び保存したzipファイルを指定する。

ライブラリのサンプル「RTC」を開いて、Arduinoに書き込む。

 

速度を合わせてシリアル窓を開けば現在時刻が表示された。

RTClib」なるライブラリもあるそうです。

ちなみに、Arduinoに”プログラム転送した時刻”が自動でモジュールへ書き込まれるそうです。
私は、ほぼほぼ正しい時刻でOK
そうでなければ時分秒設定プログラムを書かなければならない。(これはキーボードもないので超面倒)

RTC.adjust(DateTime(__DATE__, __TIME__)); の行をプログラムのsetup();で動かせばその時間に設定するそうです。

こちらにも説明がありました。

-------
1時間してシリアルコンソールを開いたり、リセットするとRTC内で時間をカウントアップしていないようだ???
Arduinoからの給電を止めると「2001/1/1」になったり
ボード内でちゃんと時間が進んでいない。最後にアクセスした時間で止まってる。
そんな感じなのだ。・・・変

電池を抜いて電圧測ったら1.1V
パッケージに電池有効期限は2023年2月と書いてあったがもはやお前は 死んどる!
電池を抜いたら「2165/165/165 165:165:85」になりました。

電池交換。ダイソーの奴今度は2027年有効電池でした。

電池を入れて再起動
あれれ「2022/7/5 22:22:xx」のままだ
あ、これがコンパイル時の時刻か

void setup () {
    Serial.begin(9600);
    Wire.begin();
    RTC.begin();
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
        ここにあった記述を外に出す
  }
  RTC.adjust(DateTime(__DATE__, __TIME__)); ここね
}

これで再書き込み

現在時刻になりました。
再度時間をおいて起動・・・れれれ、時間がさっきの書き込み時刻から再開
ああ、「RTC.adjust(DateTime(__DATE__, __TIME__)); 」の記述を残して書き込んだままではだめなのか??
この1行を削って再コンパイル&送り込み

今度は「2000/1/1 0:0:0」??になる

続いて、2022/7/6 11:7:31~開始
時間が進んどらん!
何回リセットしても、ここからが現在時刻ですとデータを送ってくる!!
そりゃ書き込んだ時刻だろうが。
ネットを探すとこういう粗悪品が結構混じっているらしい。

くそっ OLEDに続いてまたも粗悪品を掴まされたか。

この業者からは二度と買わない。

-----サンプルソース---------
#include
#include "RTClib.h"
RTC_DS1307 RTC;

void setup () {
    Serial.begin(9600);
    Wire.begin();
    RTC.begin();
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}
void loop () {
    DateTime now = RTC.now(); 
    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.print(now.second(), DEC);
    Serial.println(); 
    delay(1000);
}


リアルタイムクロック[ DS1307 ] メモ

2022年07月05日 20時34分55秒 | マイコン(ESP32・Arduino等)

2月に買って投げてたリアルタイムクロックモジュール [ DS1307 ]

コイン電池が必要と調べるとリチウムイオン電池 [ LIR2032 ] が必要らしい。
キャンドゥ辺りで100円で売っているそうな。
早速買ってきて分解し取り出し。

KKHMF DS1307 RTC クロックモジュール小型RTC I2C 24C32メモリArduino用 
 118円
    リアルタイムクロックDS1307 搭載、I2C接続
    EEPROM:AT24C32(32Kb)搭載
    発振器動作中のバッテリバックアップモードの消費電流は500nA以下の低消費電力
    モジュールにEEPROMを搭載しているので、日付時刻と共にセンサーなどの数値を保存することが出来ます
    コンパクトなデザイン:27mm * 28mm * 8.4mm

「DS1307」がメインチップ 「24C32」がメモリ
------------
ちなみにI2Cアドレスは下記の通りでした。
DS1307Z 0x68
AT24C32 0x50
あと1Wireのデジタル温度センサDS18B20を
載せられるようになっています。

コイン電池は充電されないように、R5を取り除きました。
これで充電されなくなり安全は確保。
つでにR4取り除き、R6をゼロオーム(両端ショート)にしました。
CR.2032だと少しきついです、CR2025でもよかったかもしれません。

ライブラリはgithubからTinyRTClibをダウンロードして使いました

詳細な解説サイト
https://ht-deko.com/arduino/tiny_rtc.html
製造元にスケッチ
https://www.elecrow.com/wiki/index.php?title=Tiny_RTC
よみや
 RTC編
 https://www.youtube.com/watch?v=M2k31l_cgxA
  I2Cアドレス 0x50:EPROM 0x68:RTC
 メモリ編
 https://www.youtube.com/watch?v=DvmBkLhbZV8
  56ByteのバックアップされたRAM
  4KのEEPROM

この基盤は温度センサー「DS18B20」がつけられると。
 我が家のはDS18B20を内蔵した防水パッケージ
 https://blog.goo.ne.jp/villanova555/e/72053479ae57ebe677847a9793974e5b
 https://blog.goo.ne.jp/villanova555/e/5357b57112a510990d4f6c9bba0aed26
 これ繋げられるじゃん!
 「右下にはダイオードのようなシルク印刷 (U1) がありますが、ここには DS18B20 という温度センサーが取り付けられます」
  https://ht-deko.com/arduino/tiny_rtc.html
   電池側の左下にトランジスタ風3本足があるが、これ。

「じわじわ進む」
 あ、今気づいたけど、このモジュールって温度センサーDS18B20用のパターンもついてるんですね。
 ただ、DS18B20は別売り。I2Cとは別に1 wireで接続する必要があるので・・・・
   https://jiwashin.blogspot.com/2015/11/blog-post_44.html
   1307に限らないですが、RTCは通電当初はあんまり精度が良くなくて「まぁ…値段相応かな」と思うんですが、
   数日経つと普通のクォーツ程度の精度に落ち着いてきます。  
「ゆるプロ」にも詳細な解説有
 http://try3dcg.world.coocan.jp/note/i2c/ds1307.html
 ※CR2032への改造記事あり(ダイオードだけ外す)

温度計=>これは事項補正用だと思われる。

-----------

LIR2032
AliExなら送料込1個100円程度だが到着が2ヶ月先・・・船便でしか送れないらしい
スイッチサイエンスの電池は450円 RTCモジュールって1000円~3000円とか

CR2032で代替するには充電機能を封ずる必要あり。
「D1・R4・R5・R6部品を取り除き、R6部分を直結する」
https://kenaka.xsrv.jp/kotapon/2021/09/06/ds1307tukate/
-------------
「ゆるプロ」
 http://try3dcg.world.coocan.jp/note/i2c/ds1307.html
 ※CR2032への改造記事あり(ダイオードだけ外す)
「あめぶろ」
 https://ameblo.jp/amano-jacky-nochio/entry-12028255704.html


SPI OLED 0.96インチ モジュール実験 [SSD1306](3/3)「U8g2」ライブラリ編

2022年07月05日 17時15分15秒 | マイコン(ESP32・Arduino等)

ハードウエアSPIでも試してみた。

「U8g2」ライブラリをインスコするのだが、

2個ヒットしたので「U8g2_for_Adafruit_GFX」の方をインスコ
こちらのほうが特化してるので良さげに思えた。
Pinアサインがそのまま使える。

サンプルの「Hllo_Adafruit_SSD1306」を読み込んだ。
元ソースのピンアサインが以下のようになってる。
Adafruit_SSD1306 display(/*MOSI*/ 11, /*CLK*/ 13, /*DC*/ 9, /*RESET*/ 8, /*CS*/ 10);
今までは
#define OLED_MOSI   9 #define OLED_CLK   10 #define OLED_DC    11 #define OLED_CS    12
だったので、
Adafruit_SSD1306 display(/*MOSI*/ 9, /*CLK*/ 10, /*DC*/ 11, /*RESET*/ -1, /*CS*/ 12);
に変更してみた。

結局同じ不具合症状が出た。
表示位置とか変だしフォントサイズがデカくて(1指定でも4サイズ)、どのみち使えそうにない。

-----------------

続いてオリジナルの「U8g2」ライブラリをインスコ

u8g2→full_buffer→HelloWorldのサンプルを読み込む。
61行目に在る
//U8G2_SSD1306_128X64_NONAME_F_4W_HW_SPI u8g2
を探してコメント//を外す。
後のハードウエアは定義は削除(動かしたソースはブログ最後尾)

VCC・GND、CLK = 13、MOSI= 11、CS = 10、D/C = 9 に結線し直し。

が、一回おきに表示が上下に分断されたり、表示位置が移動する、
妙なドットが表示されるなど不具合あり。

ロゴ表示もできた。が、数回の表示でめちゃくちゃに崩れた。(写真載せるのもめんどい)

やはりハード故障なんだろう。
もしかすると微妙に上下に移動したり表示が分断されるのは、黄色と青色の境目にOLEDが実装されていないせいかも。

・「U8g2」やってよかったこと
 U8g2はメモリ使用量が26%とAdafruit_SSD1306の約半分だった
 文字表示+線だけならこのライブラリが正解です。
 フォントも綺麗でプロポーショナルな点は良い。
 サンプルのBitmap画像も表示できました。
 忍耐という修練が進んだこと。

結線
① VCC    -> 3.3/5V
② GND   -> GND
③ CLK    -> 10 pin
④ MOSI  -> 9 pin
⑤ CS       -> 12 pin
⑥ D/C     -> 11 pin

--------------------
#include "Arduino.h"
#include "U8g2lib.h"
#include "SPI.h"

U8G2_SSD1306_128X64_NONAME_F_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);

void setup(void) {
  u8g2.begin();
}

void loop(void) {
  u8g2.clearBuffer();  // clear the internal memory
  u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
  u8g2.drawStr(0,30,"Hello World!"); // write something to the internal memory
  u8g2.sendBuffer();  // transfer internal memory to the display
  delay(1000);  
}


SPI OLED 0.96インチ モジュール実験 [SSD1306](2/3)

2022年07月05日 14時57分28秒 | マイコン(ESP32・Arduino等)

結論:このOLEDボードは欠陥品だった。(純正を含め2基盤で試験し、3.3V/5V双方でも実験)
   文字だけでも表示が乱れるが、グラフィックを多用すればするだけグジャグジャになる

上から起動直後
10秒後の表示の乱れ(DisplayOFFとかで対応できるのか?)
そして6時間後の動かなくなった表示
-------------------

基本的な使い方はこちら
ATOM-LITEで使う記事はこちら

わかったこと

・ディスプレイバッファをクリアし
 文字なりを書き込み
 ディスプレイバッファを表示
 これで表示される仕組み
・画面表示(display.display())してそのまま、座標指定で文字を書くと、重ね描きになる。
・標準フォント(1)で、縦は8行 上2行が黄色 横20文字
・標準フォント(2)で、縦は4行 上1行が黄色 横10文字

【この製品について】
・上2行は黄色色固定、下は青色
・黄色と青色エリアには謎の非表示領域があって、表示は分断される
・SPI接続で無駄に6pinも使うという古い仕様
・買うなら「一色版」で「I2C」接続のもの!

このハズレ製品は
・高速でLINEを繰り返し描かせるなど酷使するとおかしくなる。
 Line引いて画面更新してを延々繰り返すなどね。
・Fontサイズを変えるとおかしくなる
とてもこのパーツはマトモには使えない。

これ以上時間をかけるのはバカらしいので止める。

-------------------------------

#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"

#define SCREEN_WIDTH 128 // 解像度 X
#define SCREEN_HEIGHT 64 // 解像度 Y

// pinアサイン SPI
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET -1     // 未使用は-1 元は13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup() {
  Serial.begin(9600);
  if(!display.begin(SSD1306_SWITCHCAPVCC)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  countup();    // 数値カウントアップ
}
void loop() {
}
//-------countUp-------------------------
void countup(){
  display.cp437(true);    // シヨする文字コード宣言
  display.setTextSize(2); // 文字サイズ 1:横20字*縦8字 上2行黄 2:横10字*縦4字 上1行黄
  display.setTextColor(SSD1306_WHITE);  // 文字色

  for(int i=0;i<1000;i++){
    display.clearDisplay(); // 画面バッファ初期化
//  display.drawLine(0, 20, 128, 20, WHITE);   //線(始点終点指定)
    display.setCursor(0, 0);// 画面左上指定
    display.print(" X= ");
    display.print(i);
    display.setCursor(0, 40); // 数段下
    display.print(" Y= ");
    display.print(random(i*13));
    
    display.display();  // 表示
    delay(100);        // 時間待ち
  }
}