SSブログ
前の10件 | -

ArduinoでLCDに表示させる [Arduino]

これまでArduinoからの出力はシリアルでPCを経由してモニタに出力していました。Serial.print()ってやつね。
いつまでもPCモニタに頼るわけにはいきませんので、今回はArduinoから文字を液晶ディスプレイ(LCD)にて表示させたいと思います。


使うのは、16×2行のキャラクタLCDモジュール、バックライト付きです。
これです↓
LCD16×2行 白色バックライト付 AQM1602Y-FLW-FBW
I2CキャラクタLCD_AQM1602Y.jpg
"https://akizukidenshi.com/catalog/g/gP-12619/"
インタフェースはI2C接続で、液晶コントローラはST7032iです。電源電圧は5V動作も可能なようですが、推奨の3.3Vで動作させることにしました。

ユニバーサル基板へLCDモジュールを実装します。
回路図とPCBEで作成した実装図を示します。
【回路図】
I2CキャラクタLCD_AQM1602Y回路図.png
回路図の各値はマニュアルを参考に設計しましたが、バックライトの抵抗は計算して100[Ω]としています。マニュアルを読むと順電圧Vf=3.1[V]、順電流If=30[mA]となっていたので、バックライトにかける電源電圧を5[V]とした場合、
 5.0 - 3.1 = 1.9[V] 1.9 / 30×1E-3 = 63.3[Ω]  手持ちの近い抵抗100[Ω]に決定です!

【実装図】
I2CキャラクタLCD_AQM1602Y実装図.jpg
白色で塗り潰してある領域はLCDモジュールが載る部分をマークしています。(配置配線不可)。

I2CキャラクタLCD_AQM1602Y実装.jpg
実際にユニバーサル基板上に実装した写真です。事前にPCBEで実装図を作成していたので、きれいに収まりました。

【配線図】
I2CキャラクタLCD_AQM1602Y-Arduino配線図.jpg
マニュアルに掲載されているArduino UNOとの接続例そのままの配線図です。
UNOは5[V]でLCDモジュールは3.3[V]のため、SDAとSCL信号にはUNOとLCDモジュールの間に電圧レベル変換モジュールを挟んでいます。
I2Cバス用双方向電圧レベル変換モジュール(FXMA2102)
"https://akizukidenshi.com/catalog/g/gM-05825/"

【スケッチ】
動作確認用のテストスケッチは、秋月のAQM1602XA-RN-GBWの取説に掲載のArduino用のプログラムを少し変更を加えたものです。
"https://akizukidenshi.com/catalog/g/gP-08779/"

LCDのスレーブアドレス( LCD_ADRS = 0x3E)は以下のArduino IDEのスケッチ例にあるスケッチを使うことで確認することができますので、確認後実物のアドレスと書き換えてください。
ファイル>スケッチ例>Wire>i2c_scanner

/*******************************************************************************
I2Cキャラクタ液晶(ST7032i)の動作テスト用プログラム
・駆動用IC:ST7032i
・インタフェース:I2C
・電源電圧=3.3V, SCL=A5, SDA=A4

*******************************************************************************/
#include 
#define LCD_ADRS 0x3E
 
char moji[] = "AQM1602Y-FLW-FBW";

//SCL=A5=LCDNo2 SDA=A4=LCDNo3
 
void setup() {
  Wire.begin();
  init_LCD();                       //液晶(ST7032i)初期化
}
 
void loop() {
  for (int i = 0; i < 16; i++) {
    writeData(moji[i]);             //文字列表示
  }
  writeCommand(0x40+0x80);          //2行目先頭
  for (int i = 0; i < 16; i++) {
    writeData(i+0xb1);
  }
  while(1){}//stop
}
//----main end----

//データ書き込み 
void writeData(byte t_data){
  Wire.beginTransmission(LCD_ADRS);
  Wire.write(0x40);
  Wire.write(t_data);
  Wire.endTransmission();
  delay(1);
}

//コマンド書き込み
void writeCommand(byte t_command) {
  Wire.beginTransmission(LCD_ADRS);
  Wire.write(0x00);
  Wire.write(t_command);
  Wire.endTransmission();
  delay(10);
}

//液晶(ST7032i)初期化
void init_LCD() {
  delay(100);
  writeCommand(0x38);   // FUNCTION SET
  delay(20);
  writeCommand(0x39);   // FUNCTION SET(IS=1)
  delay(20);
  writeCommand(0x14);   // Internal OSC freq.
  delay(20);
  writeCommand(0x73);   // Contrast set(上位と合わせて0x23)
  delay(20);
  writeCommand(0x56);   // Power/ION/Contrast control(Bon ON,3.3V用)
  //writeCommand(0x52); // Power/ION/Contrast control(Bon OFF,5V用)
  delay(20);
  writeCommand(0x6C);   // Follower control
  delay(20);
  writeCommand(0x38);   // FUNCTION SET(IS=0)
  delay(20);
  writeCommand(0x01);   // Clear Display
  delay(20);
  writeCommand(0x0C);   // Display ON/OFF control
  delay(20);
}




profile_picture_40×40.JPG
nice!(0)  コメント(0) 

PCBgogoで基板を作ってみた [Gadget]

前回、RC戦車2号機用にモータードライバを実装するため、fusionPCBで基板作製をしました。
#fusionPCBで基板を作ってみた
送信部と受信部を実装するため、2種類の基板を作製したいと思います。

今回もfusionPCBに出そうと思ったのですが、決済でトラブルがあり、新しいメーカを探すことにしました。
ネットでいくつかを調べて比較をしたところ『PCBgogo』が勢いがありそう(日本語サイトもある)ということでPCBgogoに発注することにしました。
"https://www.pcbgogo.jp/"

【Tips】 ちょっとしたノウハウをまとめます。
PCBEからガーバーファイルを出力する
PCBEからガーバーファイルを出力するのは、fusionPCBと同じやり方でOKでした。
その際、部品面をB面に変更するところも同じです。

お値段
PCBgogoでも、外寸100mm×100mmで10枚までは基板製造の基本料金は変わらないのは、fusionPCBと同じようです。
最初は、2種類の基板を作製するということで100mm×60mmの基板を40mm×60mmと60mm×60mmの基板にV-cutで分割することを考えていました。
ただ、追加料金が結構かかって合計16ドルくらいになるのとV-cutの指定の仕方に自信がなかったので”どうしようかなー”と思っていたのですが、”だったら最初から基本料金で2種類の基板を作ればいいじゃん!”と思いついて解決しました。
 基板製造 :$5.00×2種類
 送料 :$16.00
  -------------------------
 合計 :$26.00(¥2,860JPY)

期間
3月26日に発注して、4月6日に手元に届きました。
PCBgogoではガーバーファイルを送付してから一旦あちらでチェックをしてもらってOKになってから、本注文(支払い処理)になるのが特長のようです。
トラッキングで状況も確認でき、今回は途中のデリバリーでなかなかステータスが更新せず時間がかかったように感じましたが、無事に10日間で到着しました。

パッキング
運送過程で外箱は大きく損傷していましたが(箱が破れた個所がありテープで補修されていました)、
基板そのものは緩衝材でしっかりと梱包されており無事でした。丁寧に梱包されていると思いました。
PCBgogo①.JPG

実物
基板も想定通りにきれいに仕上げられてきました。
PCBgogo②.jpg

感想
PCBgogoでもう一つ特長的だったのが、営業担当さんから基板が届いたタイミングで日本語でメールをくれたことです。お相手はもちろん中国の方ですが、日本語で営業担当さんとやり取りができるのはアドバンテージかな、と思います。
今回PCBgogoに発注したことでfusionPCBと合わせて2つのメーカへ発注実績を持てたことは良かったなと思います。



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

DSPラジオを作る [ラジオ]

突然、ラジオ熱が高まるときってありませんか?私は、今そうです。
ラジオって作り終えたときに音が聞こえるか聞こえないかですぐに結果が分かるというところ、音が出た時の達成感でしょうかね。。。
このブログのテーマが電子工作という割にはラジオの記事が無いので、今回はラジオです。

今回作るのはDSPラジオです。ラジオが必要な機能がワンチップに収められており、いくつかの外付け部品を使って比較的簡単にラジオを作製することができます。
aitendoで約1年前に購入した部品がある!?ので、今回これをユニバーサル基板上で実装してみたいと思います。
★6959★DSPラジオモジュール(18バンド) [M6959]
DSPラジオm6959-476.jpg
"https://www.aitendo.com/product/6800"

AMバーアンテナは品名(品番)は購入当時から変わってしまったようです。
専用ホルダ付きAMバーアンテナ [BT500DH]
バーアンテナ(BT500DH).jpg
"https://www.aitendo.com/product/12068"

キットではないのですが、このままだと作り方が分かりませんので、aitendoサイトから技術情報をDLして参考にします。今回は最小構成回路図を参照して作りたいと思います。
最小構成回路図(M6959-sch).jpg

バンド選択は160kΩを10kΩ単位で選んでいくようなのですが(BAND-AM)、こんな18タップも抵抗とスイッチで作るのはスペース的に収まらないのと、何より手間がかかります[あせあせ(飛び散る汗)]
そのためここでは手抜きをして(これが最後に効いてくるのですが)、200kΩの可変抵抗で代用しました。

【回路図】
DSPラジオ[M6959]回路図.png

完成したのがこれ↓です。なかなか基板上にきれいにレイアウトできました。
DSPラジオ[M6959].JPG

ニッポン放送、文化放送、FM横浜はすぐに入感しましたね。
ただこのラジオの欠点は前述のバンド選択がアナログ式となってしまったのでTune(こちらも50kΩのアナログ)と2つのつまみを動かして選局するため、なかなか聞きたい局に合わないことなんでねー(笑)。
1,000円も出せば市販のラジオが買える時にわざわざ自作いうことなので、まぁ実用性はそこまで追い求めないということで。。。(笑)
でも、結構気に入ってるんですよ。できればきれいにケースに入れたいですね。



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

fusionPCBで基板を作ってみた [Gadget]

試作では、ユニバーサル基板に手配線をしていくのですが、だんだんそれも加齢とともに億劫になってくるわけです。。。
プリント基板の作製は、以前より興味はあって”いつか覚えないとなー”とは思っていたのですが、新しくCADソフトの使い方を覚えるのが難しそう。。。という理由で避けてきました。
今回、RC戦車2号機に向けてモータードライバを実装するにあたり、思い切ってチャレンジすることにしました。
【CADソフト】
「CADソフトに何を使うか?」これが一番悩みました。トラ技でも何度もKiCADの特集に目にしたこともあり、KiCADをインストールして少し触れてみました。
ネットでの情報もたくさんありそうですし、覚えればいろいろなことが出来そうだと思いましたが、よくよく考えてみると、そんなに複雑な回路基板を作ろうと思っているわけではないのですよね。せいぜい手配線が面倒だからきれいに楽をしたいという動機。配線チェックだってまだ目で追える程度のものですから、そんなに高機能なものは要らないのです。
しかもいくら高機能だからと言ってもお絵描きソフトで作ったものと、最終的にプリント基板の形になるゴールは同じわけです。
なので、今回採用したのが『PCBE』です。これは“高戸谷 隆 さん”がフリーで提供して頂いているCADソフトです。対応OSを見るとずいぶん古くからあるようです。
"https://www.vector.co.jp/soft/dl/winnt/business/se056371.html"
プリント基板エディタ PCBE0.63.13

【基板製造メーカ】
これもネットでググれば、いくつもの会社がヒットしますが、やっぱり国内メーカは思い付きで頼めるお値段ではないです(10枚で最低2万円くらい)。
そうなると必然的に中国メーカしかないのですが、評判の良さそうな『fusionPCB』にしました。日本語のサイトもあり、日本向けにも力を入れていることが感じられてgood!です。
"https://www.fusionpcb.jp/"

【作製した基板】
今回作製した基板は、モータドライバTA7288Pを3つ実装した3chのモータドライバ基板です。
■回路図
MD-TA7288P_r1.jpg

■基板
タミヤのユニバーサルプレートの大きさに合わせて外寸60mm×60mmで、それぞれ四隅から5mmのところにM3ネジが入る大きさのφ3.2mmの穴を開けています。

PCBEで設計した後に、fusionPCBの発注サイトにてガーバーファイルをアップロード、ビューワーで確認した画面です。Top viewとBottom viewです。これを見ると”基板を設計したんだなー”と実感がわいてきます!
・Top view
MD-TA7288Pボード_top.jpg
・Bottom view
MD-TA7288Pボード_btm.jpg

【Tips】 ちょっとしたノウハウをまとめます。
PCBEからガーバーファイルを出力する
fusionPCBのサイトに記載されている方法が一番簡単で、私もこのやり方でOKでした。
PCBEからガーバーファイルを出力する方法
"https://www.fusionpcb.jp/blog/?p=1094"

ただし、一か所変更したところがあります。
Step2と3の画面では部品面がA面となっているのですが、PCBEではデフォルトのレイヤーにて部品面はB面となっているため、部品面と半田面が逆になってしまいます。そのため、ラジオボタンで部品面をB面に変更しましょう。(ビューワーで確認した時に逆になっていることに気が付きました。)
PCBEガーバーファイル出力チェック.jpg

お値段
たぶん、ここが気になるところだと思います。
fusionPCBでは、外寸100mm×100mmで10枚までは基板製造の基本料金は変わらないようです。
 基板製造 :$4.90
 送料 :$18.29
 クーポン(値引):$5.00
 -------------------------
 合計 :$18.19(¥2,183 JPY)
初回割引クーポンを見つけましたので、早速使いました。ラッキーです!
送料込みで2,000円くらいで基板作製が出来るのであれば、手軽に利用出来ると思いました。

期間
11月27日に発注して、12月5日に手元に届きました。
途中、トラッキングで状況も確認できるので安心です。
MD-TA7288Pボード_トラッキング.JPG

パッキング
真空パックでピチッ!とパックされて、緩衝材入りの封筒に入って届きました。
非常に丁寧だと思います。
MD-TA7288Pボード_パッキング.JPG

実物
後から見ると"こうしておけば良かったな。。。"と思うところはありますが、基板自体は非常にきれいに仕上がってきました。
MD-TA7288Pボード.jpg

感想
初めて基板作製をしてみました。簡単といえども初めて触れるCADソフトの操作も覚えないといけないし多少時間はかかったと思いますが、思ったよりスムーズに出来たと思いました。
fusionPCBもお値段手ごろで、きれいな基板ができたので良かったです。



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

Wi-Fi対応SDカード FlashAir [Gadget]

前回までに温度センサとSDカードを使ってArduinoでデータロガーを作りました。
#Arduinoでデータロガーを作る【温度センサ+SDカード+RTC】

SDカードに書き込まれたログファイルは、通常、カードリーダを使ってPCへ転送するのですが、”毎回毎回カードを抜き差しするのもスマートではないなー”と思いもあって、SDカードに書き込まれたログファイルを無線で転送したいと思います。
そこで、東芝のFlashAirを使います。(今はKIOXIA社ですかね。)

Wi-Fi対応SDカード FlashAir
FlashAir(W-03).jpg
"https://akizukidenshi.com/catalog/g/gM-09865/"

★重要
FlashAirはWi-Fi内蔵のSDカードですが、すでに「生産終了」となっており、以前購入した秋月電子からも商品ページが無くなっています。
手持ちは"W-03(32GB)"なのですが、メーカのサポートも2021年5月終了しており、ソフトウェアのDLも出来なくなっています。
後継のW-04はまだ辛うじてサポートされているようです。
"https://personal.kioxia.com/ja-jp/support/legacy-products.html" >FlashAir

そんな中、「あさりのみそしる」さんのブログ記事を転載します。
W-03に関して、おそらく最後のまとめサイトだろうと思います。
【令和最新版】FlashAir W-03 シリーズで必要なものをダウンロードして残す
"https://asarinomisosoup.com/entry/2021/05/03/033609"

また、オーム社よりFlashAirを使った電子工作の書籍も見つけましたので載せておきます。
かんたん! スマートフォン+FlashAir[トレードマーク]で楽しむIoT電子工作
"https://www.ohmsha.co.jp/book/9784274220340/"
2017年発行で少し古いのですが、W-03を使っているので逆に古くて良かった感じです。

ソフトウェアのDLリンク先(外部サイトあり)
※今(2021年10月)時点での情報であり、この先もDL可能であるかどうかは分かりません。
■FlashAir設定ソフトウェア
W-04のソフトがW-03でも使用可能ですので、メーカサイトからDLして使用します。
FlashAir_tool_v401_C.zip
"https://personal.kioxia.com/ja-jp/support/legacy-products.html" >FlashAir

■FlashAir W-03 ソフトウェア更新ツール
これはW-03とW-04の区別があるようです。
FlashAirFWUpdateToolV3_v30002_Cw.zip
"https://www.touslesdrivers.com/index.php?v_page=23&v_code=65400&v_langue=en"


【Tips】
最初はFlashAirのWi-Fi接続が不安定でした。。。
調べてみると、FlashAirはWi-Fiを内蔵しているため、通常のSDカードより消費電力が大きく、電力が不足するとWi-Fiを認識しない等動作が不安定にケースが多くあるそうです。
解決には、SDカードソケットのUSBコネクタから電源を別ラインから供給することが効果的です。

SDカード配線引出基板
USBコネクタは電源供給用です(基板上で5V→3.3Vに変換)
SDカード配線引出基板.jpg
"https://akizukidenshi.com/catalog/g/gK-10967/"



profile_picture_40×40.JPG
nice!(0)  コメント(1) 

DVB-T+DAB+FM USB チューナー 放熱キット [SDR]

DVB-T+DAB+FM USB チューナーを動作させると、中のチップがかなり熱くなります。
ググると、皆さん、いろいろと熱対策をしているようでしたので、真似てやってみようと思います。
最初はヒートシンクを付けようと思ったのですが、専用の放熱キットがあったので取り付けてみました。
TV28Tv2DVB-T(R820T)[DVB-T+DAB+FM]/R820T2 & SDR/チューナー専用放熱プレート+小型ヒートシンク搭載キット
DVB-T+DAB+FM USB チューナー 放熱キット①.JPG
"https://www.amazon.co.jp/TV28Tv2DVB-T-R820T-%EF%BC%BBDVB-T-DAB-FM%EF%BC%BD%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8A%E3%83%BC%E5%B0%82%E7%94%A8%E6%94%BE%E7%86%B1%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%EF%BC%8B%E5%B0%8F%E5%9E%8B%E3%83%92%E3%83%BC%E3%83%88%E3%82%B7%E3%83%B3%E3%82%AF%E6%90%AD%E8%BC%89%E3%82%AD%E3%83%83%E3%83%88/dp/B00H7WRSJA/ref=sr_1_16?m=A18JRYZ2F9A2N2&s=merchant-items&ie=UTF8&qid=1388393392&sr=1-16"

小さいヒートシンク3つと放熱プレートが1枚入っています。
取り付け方は特に迷うこともありませんが、こちらの発売元のページに取り付け方法がありましたので、参考にしました。
"http://blog.livedoor.jp/bh5ea20tb-youpapa2/archives/34763684.html"

DVB-T+DAB+FM USB チューナー 放熱キット②.JPG

専用キットということで、仕上がりは綺麗です。
ビフォーアフターが無いので比較による効果の確認は出来ないのですが、安定動作してくれればと思います。



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

SDRソフトウェア無線(SDR:Software Defined Radio) [SDR]

ステイホームのGWも今日で最終日。
雑誌で、SDRソフトウェア無線(SDR:Software Defined Radio)の特集記事があったので、部屋の掃除で出てきたPC用ワンセグTVチューナを使って試してみます。

ネタとしてはかなり古くて、ネットには同じような記事がたくさん見つかります。もっと詳しい記事もいろいろありますので、適宜そちらを参照していただければ助かります。。。(;'∀')

【ハードウェア】
DVB-T+DAB+FM USB チューナー RTL2832U+R820T
RTL-SDRドングル①.JPG
"https://www.amazon.co.jp/gp/product/B00E0LAKRI/ref=ppx_od_dt_b_asin_title_s00?ie=UTF8&psc=1"
Amazonで購入したのが2016年なので5年前です。さすがに今では販売終了となっていますが、検索すれば類似の商品で入手可能です。

DVB-T+DAB+FMはヨーロッパ方式の地上デジタルテレビ放送(DVB-T)、地上波デジタルラジオ放送(DAB)、通常のFM放送が受信できるPC用USBチューナー(ドングル)です。ヨーロッパの規格なので、もちろんこれで日本のテレビやラジオに使えるわけではないのですが、これをSDRソフトを使って広帯域受信機として使おうというものです。Realtek RTL2832デコーダーチップを積んだチューナーとSDRソフトを使ったソフトウェア受信をRTL-SDRと呼ぶそうです。

※デバイスの表面はラバーコーティングになっているのですが、これが年数が経ってベタベタになるんですね。”加水分解”というそうです。主な原因は湿気だそうなので、長期間保管するときは乾燥剤と一緒に入れておくといいそうです。ただ一番良いのは、定期的に使用することだそうですよ。
今回ベタベタになってしまったところは、無水アルコールを使ってラバーコーティングを剥がしました。

ケースを開けてみました(1コ、爪が折れた。。。)。
RTL-SDRドングル②.JPG

デコーダーチップとして、RealtekのRTL2832Uが実装されています。
RTL2832U.JPG

R820T
R820T.JPG


【準備するソフトウェア】
先人のみなさまの情報を頼りに、必要なソフトを集めます。
今でもバージョンアップされているようです。
①ソフトウェア無線パッケージ
SDR#(SDRSharp)リビジョン1811(2021-03-29)
SDR#(SDRSharp)リビジョン1822(2021-08-22)
"https://airspy.com/"

※動作の前提条件︓.NET5デスクトップx86ランタイムが必要になります。
 PCにインストールされていない場合は先にこちらをインストールします。
 .NET 5.0デスクトップランタイム(v5.0.5)Windows x86インストーラー!
 "https://dotnet.microsoft.com/download/dotnet/5.0/runtime/?utm_source=getdotnetcore&utm_medium=referral"

②USBドライバ支援ソフト
zadig-2.5(2020.03.28更新)
zadig-2.6(2021.09.04更新)
"https://zadig.akeo.ie/"


【インストール】
①Windows 用をダウンロードしたら、任意のフォルダーに入れます。
 フォルダー内のinstall-rtlsdr.batをダブルクリック。
 Dosウインドウが開きインストールが完了するまで待ちます。
 これをやらないとフォルダー内にrtlsdr.dllが展開出来ず、
 SDRSharpのSTARTで"No device selected"とエラーとなります。
②ZadigでUSBデバイスドライバのインストールを行うのですが、
 Options->List All Devices
としてもお目当てのデバイス"RTL2838UHIDIR"がプルダウンメニューに出てきません。
Zadig_USBドライバインストール①.jpg

しかし、"Bulk-In, Interface (Interface 0)"で解説している情報もあったので、一旦はこちらを選択してUSBデバイスドライバをインストールしたのですが、後々うまく受信することが出来ませんでした。

"ちょっと困ったなー"と思っていたら、このサイトの情報が役に立ちました。
"http://blog.livedoor.jp/bh5ea20tb-youpapa2/archives/40226092.html"

Windows10の場合、WindowsがRTL-SDR用のBulk-In,Interface(Interface 0)を持っているためにドライバのインストールができない場合や正常に動作しない場合があるそうです。

サイトの解説通りに、Optionsを押した後に「Ignore Hubs or Composite Parents」のチェックを外します。
Zadig_USBドライバインストール②.jpg

すると、
"RTL2838UHIDIR"がプルダウンメニューに出てきて、選択することができました。
Zadig_USBドライバインストール③.jpg

Reinstall Driverボタンをクリックして、再インストールし直しました。


【動作確認】
SDR#を立ち上げて、FMラジオを受信してみます。
SDR#(SDRSharp).jpg

まだ、使い方が良く分かっていないので少しいじっただけですが、歯車アイコンから”Tuner AGC"にチェックを入れると、それまでノイジーだったのが、FM横浜(84.7MHz)を受信することができました。東京FM(80.0MHz)も受信できたのですが、J-Wave(81.3MHz)はダメでしたねー。

ちゃんとした調整があると思うのですが、一旦は受信できたということで、今回はこれでおしまいです。



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

Arduinoでデータロガーを作る【温度センサ+SDカード+RTC】 [Arduino]

これまでで、
#Arduinoでデータロガーを作る【温度センサ+SDカード】
#ArduinoでRTCを使う
ができたので、これらを一つにまとめてタイムスタンプとセットでデータを保存できるようにしたいと思います。

【配線図】
Fritzingの配線図では省略してしまったのですが、RTCのVCCとGNDには0.1μFのパスコンが接続してあります。ブレッドボードやジャンプワイヤのせいもあるかもしれませんが、動作が不安定だったのでパスコンはあった方がいいと思います。
あと、SDカード配線引出基板と電源とGNDの間のパスコンも。#ArduinoでSDカード情報を取得する

Arduino_温度センサデータロガ+RTC_ブレッドボード.jpg

Arduino Pro Mini_温度センサデータロガ+RTC配線.JPG

【スケッチ】
/*******************************************************************************
SDカードデータロガー

++++++ note ++++++
・測定した温度をコンソール画面に表示およびSDカードにデータ保存するプログラム
・Arduino Pro Mini(3.3V, 8MHz)
・温度センサ LM61BIZ(測定範囲:-25℃~+85℃)
・(※)RTCから取得した現在の日時データをSDカードファイル書き込みとコンソール画面表示に使う

*******************************************************************************/
#include 
#include 
#include "RTClib.h"                                 //RTCライブラリを導入

File myFile;                                       //Fileオブジェクトの生成(インスタンス名:myFile)
RTC_DS3231 rtc;                                    //RTCオブジェクトの生成(インスタンス名:rtc)

const float Vcc = 3.3;                             //電源電圧(定数)
float temp_volt;                                   //出力電圧
float temp_data;                                   //温度
char daysOfTheWeek[7][6] = {"Sun.", "Mon.", "Tue.", "Wed.", "Thu.", "Fri.", "Sat."};
String youbi;                                      //曜日を代入する
int year, month, day, hour, minute, second;

// the setup routine runs once when you press reset:初期化(電源投入/リセット時1回のみ実行)
void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);                              //9600bpsでシリアルポートを開く
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

//RTCオブジェクトの初期化
  if (! rtc.begin()) {                             //RTCオブジェクトに初期化に失敗
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }                                                //RTCオブジェクトに初期化に成功
//  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));  //今の(PCの)時刻に合わせる
// →合わせ終わったらコメントアウトすること
  
//SDカードの初期設定
  Serial.print("Initializing SD card...");

  if (!SD.begin(10)) {                             //4→10に変更 SDカードの初期化に失敗          
    Serial.println("initialization failed!");
    while (1);
  }                                                //SDカードの初期化に成功
  Serial.println("initialization done.");
}

// the loop routine runs over and over again forever: main loop
void loop() {
  int sensorValue = analogRead(A0);                //read the input on analog pin 0:
  temp_volt = Vcc * sensorValue / 1023;            //アナログピンから読み取った値を元の出力電圧値に戻す

// 出力電圧から温度データを作成
  temp_data = (temp_volt - 0.6) / 0.01;            //【データシート】T[℃] = (Vo - 0.6) / 0.01

// RTCから現在の日時を取得(※)
    DateTime now = rtc.now();
    year = now.year();
    month = now.month(); 
    day = now.day();
    youbi = daysOfTheWeek[now.dayOfTheWeek()];
    hour = now.hour();
    minute = now.minute();
    second = now.second();

// RTCの日時と温度データをコンソール画面に表示(※)
// ①float(浮動小数点)形式で表示
    Serial.print(year);                            //RTCの日時を表示
    Serial.print('/');
    Serial.print(month);
    Serial.print('/');
    Serial.print(day);
    Serial.print('(');
    Serial.print(youbi);
    Serial.print(')');
    Serial.print(hour);
    Serial.print(':');
    Serial.print(minute);
    Serial.print(':');
    Serial.print(second);
    Serial.print("  ");                            //tab(空欄)はダブルクォーテーションで囲む
    Serial.print(temp_data);                       //温度を表示
    Serial.println("[℃]");                        //単位は℃

// SDカードに書き込む
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
  myFile = SD.open("tempdata.txt", FILE_WRITE);   //"tempdata.txt"ファイルを書き込み用に開く
                                                  //戻り値がファイル情報になり、myFile に受け渡す
// ファイルに温度データを書き込み(※)
// if the file opened okay, write to it:
  if (myFile) {
// ①float(浮動小数点)形式で書き込み
    myFile.print(year);
    myFile.print('/');
    myFile.print(month);
    myFile.print('/');
    myFile.print(day);
    myFile.print('(');
    myFile.print(youbi);
    myFile.print(')' );
    myFile.print(hour); 
    myFile.print(':');          
    myFile.print(minute); 
    myFile.print(':');  
    myFile.print(second);
    myFile.print("  ");                           //tab(空欄)はダブルクォーテーションで囲む 
    myFile.print(temp_data);
    myFile.println("[℃]");

// close the file:
    myFile.close();                               //ファイルを閉じる
                                                  //myFile.close() Fileオブジェクト(インスタンス)に対する関数
  } else {
// if the file didn't open, print an error:
    Serial.println("error opening tempdata.txt");
  }

  delay(1000);                                    //1秒単位 ※delay():単位ms
}


これで、タイムスタンプと温度データを一緒にSDカードのファイルに保存することができました。



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

ArduinoでRTCを使う [Arduino]

前回に、#Arduinoでデータロガーを作る【温度センサ+SDカード】
>なので、次はRTCを使ってタイムスタンプとセットでデータを保存できるようにしたいと思います。
と書いたので、RTCを試してみたいと思います。
Amazonは電子部品のレパートリーも豊富で入手性も良く、送料無料の物も多いので、重宝しています。

DS3231 AT24C32 時計モジュール リアル時間時計モジュール IICモジュール RTCモジュール に対応(3個セット)
"https://www.amazon.co.jp/AT24C32-%E3%83%AA%E3%82%A2%E3%83%AB%E6%99%82%E9%96%93%E6%99%82%E8%A8%88%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-IIC%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-RTC%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-Arduino%E3%81%AB%E5%AF%BE%E5%BF%9C/dp/B0793MNVR4/ref=pd_ybh_a_4?_encoding=UTF8&psc=1&refRID=D02CJTZ6E9CCYEBD410S"
★注意★
「DS3231」にはいくつかの種類があるようです。
今回購入したRTCモジュールに搭載されていたのは「DS3231M」でした。
「DS3231M」はTCXOではなくMEMS共振子で、周波数精度も±2ppm→±5ppmと残念ながらやや劣るようです。。。3個で890円だったからかなー。安いとチップが違うのかなー。
DS3231 AT24C32 RTC時計モジュール.JPG

充電式リチウムイオンボタン電池 LIR2032 3.6V 40mAh 約500回 CR2032の代わり 5枚入1セット
"https://www.amazon.co.jp/%E5%85%85%E9%9B%BB%E5%BC%8F%E3%83%AA%E3%83%81%E3%82%A6%E3%83%A0%E3%82%A4%E3%82%AA%E3%83%B3%E3%83%9C%E3%82%BF%E3%83%B3%E9%9B%BB%E6%B1%A0-LIR2032-40mAh-CR2032%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A-5%E6%9E%9A%E5%85%A5%EF%BC%91%E3%82%BB%E3%83%83%E3%83%88/dp/B08FHWQBBK/ref=pd_ybh_a_2?_encoding=UTF8&psc=1&refRID=D02CJTZ6E9CCYEBD410S"

コイン電池充電器
"https://www.amazon.co.jp/Entatial-%E5%B0%8F%E5%9E%8B%E3%83%9C%E3%83%87%E3%82%A3%E4%BF%A1%E9%A0%BC%E6%80%A7%E3%81%AE%E9%AB%98%E3%81%84%E3%83%9C%E3%82%BF%E3%83%B3%E9%9B%BB%E6%B1%A0%E5%85%85%E9%9B%BB%E5%99%A8%E3%80%81%E5%85%85%E9%9B%BB%E5%99%A8%E3%80%81%E6%8C%81%E3%81%A1%E9%81%8B%E3%81%B3%E3%81%8C%E7%B0%A1%E5%8D%98%E9%9B%BB%E6%B1%A0%E5%85%85%E9%9B%BB%E7%94%A8%E3%81%AE%E5%AE%89%E5%AE%9A%E3%81%97%E3%81%9F%E6%80%A7%E8%83%BD%E3%82%B3%E3%82%A4%E3%83%B3%E9%9B%BB%E6%B1%A0%E5%85%85%E9%9B%BB%E5%99%A8-U-S-regulations/dp/B08NF7YTFM/ref=psdc_2285180051_t1_B08NDVRMH1"
LIR2032ボタン(コイン)電池の充電用に1個買ったのですが2個届きました。
でも、そのうちの1個は動作不良でした。。。
中華製は、時々想定外のことが起こりますねー(笑)


まずは単体で動作させてみたいと思います。
時刻データをコンソール画面に出力します。
ネットでググれば、この程度の情報はたくさんあるのでサクサクと進めたいと思います。

【配線図】
Arduino_RTC_ブレッドボード.jpg

【スケッチ】
ネット情報により、ご多分に漏れず、ライブラリーをDLしてインクルードします。
DS3231で使用可能なライブラリは複数あるようですが、Arduino IDEのライブラリ管理でヒットした、
RTCLib (Adafruit)をそのまま使います。

/*******************************************************************************
RTC(DS3231) サンプルプログラム

++++++ note ++++++

*******************************************************************************/
// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
#include "RTClib.h"                                 //RTCライブラリを導入

RTC_DS3231 rtc;                                     //RTCオブジェクトの生成(インスタンス名:rtc)

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {
  Serial.begin(9600);                               //9600bpsでシリアルポートを開く
  
#ifndef ESP8266    //【条件コンパイル】 もしESP8266が定義されていなかったら
  while (!Serial); // wait for serial port to connect. Needed for native USB
                   //(シリアルポートが接続するのを待ちます。 ネイティブUSBに必要)
#endif
//RTCオブジェクトの初期化
  if (! rtc.begin()) {                              //RTCオブジェクトに初期化に失敗
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }                                                 //RTCオブジェクトに初期化に成功
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));   //今の(PCの)時刻に合わせる
                                                    //合わせ終わったらコメントアウトする
  if (rtc.lostPower()) {
    Serial.println("RTC lost power, let's set the time!");
    // When time needs to be set on a new device, or after a power loss, the
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }

  // When time needs to be re-set on a previously configured device, the
  // following line sets the RTC to the date & time this sketch was compiled
  // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  // This line sets the RTC with an explicit date & time, for example to set
  // January 21, 2014 at 3am you would call:
  // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}

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(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();

    Serial.print(" since midnight 1/1/1970 = ");
    Serial.print(now.unixtime());
    Serial.print("s = ");
    Serial.print(now.unixtime() / 86400L);
    Serial.println("d");

    // calculate a date which is 7 days, 12 hours, 30 minutes, 6 seconds into the future
    DateTime future (now + TimeSpan(7,12,30,6));

    Serial.print(" now + 7d + 12h + 30m + 6s: ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();

    Serial.print("Temperature: ");
    Serial.print(rtc.getTemperature());
    Serial.println(" C");

    Serial.println();
    delay(3000);
}


コンパイルしてArduinoに書き込んだ後に、Arduino IDEのシリアルモニタを確認すると、
3秒に1回、時刻データが更新されていきます。

■時刻アジャストについて
手持ちの電波時計と比較すると、時刻データが1分ほど遅れていました。
これは、
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
にて、今の(PCの)時刻に合わせるようにしているのですが、コンパイルにかかる時間分がずれてしまうためだそうです。
ネットでは、時刻合わせのための治具を作成して調整されている記事もありましたので、機会があったら挑戦してみたいと思います。
今回は、単体での動作を優先したく、そこまでの調整はしませんでしたが、コンパイルにかかる時間を短くすれば誤差は小さくなると思いますので、先ほどのスケッチから余計なプログラムを削除してなるべく軽くしたものを、時刻合わせ用のスケッチとして再作成しておきました。



profile_picture_40×40.JPG
nice!(0)  コメント(1) 

Arduinoでデータロガーを作る【温度センサ+SDカード】 [Arduino]

前回までで、
 ・SDカードにファイルを読み書きする #ArduinoでSDカードにファイルを読み書きする
 ・温度を測定する #Arduinoで温度を測る【温度センサ】
ことができましたので、これを組み合わせて温度データをSDカードに書き込むデータロガーを作りたいと思います。


【配線図】
Arduino_温度センサデータロガー_ブレッドボード.jpg

【スケッチ】
ネットも参考にすると、もう少しスマートな記述もありますが、今の自分の理解レベルと少々乖離している感もあったので、まずはベタな書き方ですが載せてみます。
今後スキルが上がれば、改版したいと思っています。
①float(浮動小数点)形式、②String(文字列)形式の両方を記述していますが、下記では①をコメントアウトして、②を有効にしています。

/*******************************************************************************
SDカードデータロガー

++++++ note ++++++
・測定した温度をコンソール画面に表示およびSDカードにデータ保存するプログラム
・Arduino Pro Mini(3.3V, 8MHz)
・温度センサ LM61BIZ(測定範囲:-25℃~+85℃)
・①float(浮動小数点)形式でも②String(文字列)形式でも出力結果は同じ

*******************************************************************************/
#include 
#include 

File myFile;

const float Vcc = 3.3;                          //電源電圧(定数)
float temp_volt;                                //出力電圧
float temp_data;                                //温度


// the setup routine runs once when you press reset:初期化(電源投入/リセット時1回のみ実行)
void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);                           //9600bpsでシリアルポートを開く
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

//SDカードの初期設定
  Serial.print("Initializing SD card...");

  if (!SD.begin(10)) { //4→10に変更
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
}


// the loop routine runs over and over again forever: main loop
void loop() {
  int sensorValue = analogRead(A0);             //read the input on analog pin 0:
  temp_volt = Vcc * sensorValue / 1023;         //アナログピンから読み取った値を元の出力電圧値に戻す

// 出力電圧から温度データを作成
  temp_data = (temp_volt - 0.6) / 0.01;         //【データシート】T[℃] = (Vo - 0.6) / 0.01

// 温度データをコンソール画面に表示  ※2種類記載
/*
 ①float(浮動小数点)形式で表示
  Serial.print(temp_data);                      //温度を表示
  Serial.println("[℃]");                       //単位は℃
*/
// ②String(文字列)形式で表示
  String dataString = "";
  dataString += String(temp_data);
  dataString += "[℃]";
  Serial.println(dataString);                   //温度を表示、単位は℃


// SDカードに書き込む
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
  myFile = SD.open("tempdata.txt", FILE_WRITE); //"tempdata.txt"ファイルを書き込み用に開く
                                                //戻り値がファイル情報になり、myFile に受け渡す
// ファイルに温度データを書き込み  ※2種類記載
// if the file opened okay, write to it:
  if (myFile) {
/*
 ①float(浮動小数点)形式で書き込み
    myFile.print(temp_data);
    myFile.println("[℃]");
*/
// ②文字列(String)で書き込み
    myFile.println(dataString);

// close the file:
    myFile.close();                             //ファイルを閉じる
  } else {
// if the file didn't open, print an error:
    Serial.println("error opening tempdata.txt");
  }

  delay(1000);                                 //1秒単位 ※delay():単位ms
}


上記でもデータは保存できたのですが、少々残念なことに、データを取得したタイムスタンプが無いんですねー。。。
なので、次はRTCを使ってタイムスタンプとセットでデータを保存できるようにしたいと思います。



profile_picture_40×40.JPG
nice!(0)  コメント(0) 
前の10件 | -

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。