2018年2月18日日曜日

ArduinoでGPSロガー製作(みちびき対応)

 ArduinoにSDメモリーを使えるようにしてデータ保存できる様になったので、応用してGPSの位置情報を記録するロガーを作ることにした。

 GPSユニットは秋月電子で購入した「みちびき」に対応した物を持っているので使う事に。昔、使った時はさほど精度が上がったと思えなかったので御蔵入りしていたのだが、昨年4号機まで上がったので精度がどうなったか気になるところもあります。

 ArduinoでGPSユニットを使うには「ライブラリー」にTinyGPS++を追加するだけで簡単にプログラムを組むことができます。
GPSユニットはシリアルポートを使用しますので、SoftwareSerialも必要です。
【秋月のAE-GPS。1PPSは使用しません】


 SDメモリーの試験で使っていたのは3.3Vが必要だったのですが、別に購入していたmicroSD用の物は、よく見たら信号線にLV125Aが実装されており5Vのみで使えるようです。これを使うと5V-3.3vのレベル変換ICが不要になります。
 microSDは16Gを使用中です。
 【microSDカード。3.3Vレギュレータとレベル変換ICを実装している】


 GPSの動作表示はユニットに付属しているLEDの点滅でも分かりますが、位置情報も見えると便利です。位置情報を表示するためにLCD(1602A)を使いましたが、LCDの信号線を少なくするためI2C接続用のユニットを追加実装しました。
 なお、LCDのI2Cアドレス設定が”0x3f”だったので最初は動きませんでした。物に合わせてスケッチのアドレスを修正する必要が有ります。
【LCDに「GPS信号なし」を表示中。ほかにSDカード不良も出ます】


 Arduino自体はNANOを使い小型化しています。UNOと同等の性能・機能があるのでとても楽です。
 スケッチにはGPS、SD、LCD用に3種類を組み込みます。
【Arduino NANO】


 SDに記録するデータフォーマットは最初は年月日、時分秒、北緯、東経をカンマ","区切りとしておりました。記録したデータを色々と加工するには丁度良いフォーマットです。

 しかし、パソコンで記録を確認するに当たり「カシミール3D」を使うと、対応するフォーマット”.trk”に変換する必要があり、Excelのマクロで作成しておりました。
 それも面倒なので、SDに直接”.trk”のフォーマット・拡張子で記録し試験しています。
Arduinoの使用メモリーがギリギリの模様です。余計なコメントやシリアルポートへの出力は使っていません。

仮に100均の弁当箱に入れています。モバイルバッテリー使用中


 実際に使ってみると「みちびき」のおかげでしょうか?精度がとても良くなっております。車で使用していて1時間近く駐車した場合では、昔は結構位置が微妙にズレる揺らぎがありましたが、現在はほとんどありません。
 GPSユニットから真上が見えないと精度が下がるような気がします。

 下の絵はカシミール3Dで表示したトラックログです。車を駐車場に駐車した軌跡が残っています。反時計回りに進み、バックで駐車、駐車中はほとんど動かず。買い物をしてから時計回りに出場。


これは使えると思います。
この後は、釣行のログとして使えるよう更に機能UPさせましょう。

注意:本記事を参考にして不具合が有っても私は責任を取りません。参考は自己責任で行って下さい。

【プログラム:trkフォーマットで出力】
#include <SPI.h>
#include <SD.h>
File myFile;
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
TinyGPSPlus gps;
SoftwareSerial mySerial(3, 2);
LiquidCrystal_I2C lcd(0x3f,16,2);
void setup() {
 lcd.init();lcd.backlight();lcd.setCursor(0, 0);
 if (!SD.begin(4)) {lcd.println("SD failed!");return;}
 lcd.print("GPS_LOST!");
 mySerial.begin(9600);mySerial.println("Hello, world?");}

void loop() { // run over and over
while (mySerial.available() > 0){
char c = mySerial.read();
gps.encode(c);
if (gps.location.isUpdated()){
String FN=String(gps.date.value())+".trk"; 
myFile = SD.open(FN, FILE_WRITE);
myFile.print("T N");
lcd.setCursor(0,0);
lcd.print("LAT="); lcd.print(gps.location.lat(), 6);
myFile.print(gps.location.lat(), 6);myFile.print(" E");
lcd.setCursor(0,1);
lcd.print("LONG=");lcd.print(gps.location.lng(), 6);
myFile.print(gps.location.lng(), 6);myFile.print(" ");
FN=(gps.date.day());if (FN.length()<2){FN="0"+FN;}
myFile.print(FN);myFile.print("-");
FN=(gps.date.month());if (FN.length()<2){FN="0"+FN;}
myFile.print(FN);myFile.print("-");
FN=(gps.date.year());
myFile.print(FN.charAt(2));myFile.print(FN.charAt(3));
myFile.print(" ");
FN=(gps.time.hour());if (FN.length()<2){FN="0"+FN;}
myFile.print(FN);myFile.print(":");
FN=(gps.time.minute());if (FN.length()<2){FN="0"+FN;}
myFile.print(FN);myFile.print(":");
FN=(gps.time.second());if (FN.length()<2){FN="0"+FN;}
myFile.print(FN);myFile.println(" 0");
myFile.close();
}
}
}

2018年2月10日土曜日

車のバンパー修理(裏技紹介)

連日の寒波と降雪で道路はツルツルに滑る状況ですね。
昨日、通勤時に軽く追突されました。交差点で信号待ち、路面がスケートリンクの様に滑る状況で青信号で発進しましたが前方が詰まっている様で私の前の車が急(?)停止!!。
追従して私の車は停止しましたが後続車が止まり切れず軽く後部バンパーに当たって状況です。

車の状況を見たら後部バンパー右端が凹み上部が割れていました。


 相手から修理していただけるとの事なので修理工場に見積もりを頼んだんですが、土日とお休みだそうです。しかも月曜日は休日なので少なくとも3日は凹んだ車で過ごすこととなってしまいました。色々と出かけるつもりでしたので、このままだと格好が悪いですね。

 ならば、自分である程度は目立たなくしてしまおうと軽く補修しました。
バンパーは割れているので交換と言うことで進めていますが、あまり奇麗に修理すると困ることにもなりかねないので、ほどほどに。
修理前に状況写真を撮影します。これは相手が保険屋さんに提出するための写真です。

 バンパーは樹脂製なので変形した部分は簡単に成型できません。ところが裏技があります。

 その方法は「ドライヤーで温める」、ただそれだけです。
 樹脂形成しているので熱を加えると樹脂が柔らかくなり、凹み周辺が元の形に戻ろうとする力を利用するものです。
 ネタ元はyoutube。昔、見たことが有ったけど試すには初めてでした。

 今は真冬で外気温が低いので「ヒートガン」を使いました。

 修理方法は凹んだ部分とその周辺をまんべんなく温めるだけです。
 最初は何も起こりませんが、次第に凹みが周囲から元に戻り始め、最終的にはホボ元通りになりました。
(バンパーが凹んだ程度であれば相手から修理していただかなくても良かったんですけどね。残念)


追突で付いた傷は元に戻りませんがあまり目立ちません。強く曲がった所は塗装にもヒビが有りますがそれも目立たなくてラッキーです。

割れた部分も接着剤PPXと裏当ての樹脂で直すことも可能と思いましたが、そこまでやってしまうと修理不要になりそうなので止めました。
割れた部分を寄せてから透明樹脂テープでテーピングし目立たなくしました。バンパーの取付金具にズレが有るようで割れ部分をピッタリ合わせることはできませんでした。

所用時間30分で完了です。
これで3連休を過ごしましょうか。

2018年2月6日火曜日

ノートPCのヒンジ部の修理

arduino ide でシリアルポートを急に認識しない状態となったのだが、これまた急に自然復活した。
IDEをインストールしたのはacerノートPCなのだが、いきなり電源が切れる現象が発生。電源を入れ直してもまた切れる。
PCの排気口付近がかなり熱くなっていたのでファンが壊れてCPU加熱、保護回路動作したと考えられる。
ファンは前から時々「ガチャラッ!」という音がしていたのでファンに異物が挟まり回転停止かと思われるので分解清掃を行った。
結果してPCの本体側のディスプレイ部を固定する部分が全て破損している状況で、破損した部品がファンに入り込み回転停止させてた状態だった。
ファン清掃・本体修理してからはノートPCは電源が切れることなく正常に動作している。
ついでにarduinoIDEでシリアルポートを認識できるようになった。詳細は原因は不明。

以下、PCの破損状況

ノートPC本体のデイスプレイ部を固定するネジ受部においてプラスチックが割れネジ受ナットが浮いた状態。左側が酷くネジ受部が無くなっていた。

ネジ受土台が無いのは、エポキシパテで土台部を埋めネジ受ナットを本体に固定できるようにした。

2018年1月23日火曜日

ArduinoでSD記録ロガーを作ってみよう

井戸ポンプ用制御回路をArduinoで作りましたが動作状況は次のように確認できます。
1.本体のLED
2.Bluetoothで測定温度と10秒間平均値をモニター
リアルタイムでの確認の他にはBluetooth経由でタブレットに記録を残すことはできます。

一日の動作状況を確認したいのでSDメモリーにログが残るようにしたいと思います。
今使用しているArduino_pro_minのプログラムメモリーは十分な記憶容量が残っているので、機能を追加する事にします。

Arduinoにはタイマー機能がないので外部RTCと記録用のSDアダプタをamazonで手に入れました。
(ブレッドボードで試作し動作確認を行っています)
右から、Arduino_Nano、RTC(DS3231)、SD、真ん中手前がレベル変換器
電源はPCのUSBから供給しています。


後はArduino_IDEのライブラリーからRTCとSDのスケッチを参考にして作成するだけ。
(合体するだけです。ははは・・)

RTC用スケッチの改造点はRTCの年~秒のデータをシリアルポートに垂れ流しているのを一つの文字列に合体してからシリアルポートに出力することです。
SD用のスケッチからライブラリーとファイルオープン・クローズ関係の記述をRTC用スケッチに移植します。SDへの記録データは先に作った文字列をそのまま使用しました。
実験なので途中で電源を切ってもデータが確実に残るよう、データ1個毎にファイルのオープン・クローズを行っています。
delayを1000mSとしているのでファイル処理の時間分の遅れが蓄積し7~8秒に1回取りこぼしが発生しています。


参考にさせていただいたのは↓です。ありがとうございました。
   https://ht-deko.com/arduino/rtc_ds3231.html
   https://qiita.com/hikoalpha/items/c7812a34182db07036ef

メモ
#include <DS3231.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
File myFile;
DS3231 Clock;
bool Century=false;
bool h12;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits;
bool ADy, A12h, Apm;
byte year, month, date, DoW, hour, minute, second;
int temperature;
int das[10];
char* dat[]={"-","-"," ",":",":"," "," "};
void setup() {
Wire.begin();
Serial.begin(9600);
   while (!Serial) {
    ;
   }
   Serial.print("Initializing SD card...");
   if (!SD.begin(4)) {
     Serial.println("initialization failed!");
     return;
     }
   Serial.println("initialization done.");
}
void ReadDS3231()
{
  das[5]=Clock.getSecond();
  das[4]=Clock.getMinute();
  das[3]=Clock.getHour(h12, PM);
  das[2]=Clock.getDate();
  das[1]=Clock.getMonth(Century);
  das[0]=Clock.getYear();
  das[6]=Clock.getTemperature();
}
void loop() {
  myFile = SD.open("test.txt", FILE_WRITE);
  ReadDS3231();
  String tes="20";
  for (int i=0;i<=6;i++){
  if (das[i]<10){tes.concat("0");}
  tes.concat(das[i]); tes.concat(dat[i]);
  }
  Serial.println(tes);
  myFile.println(tes);
  delay(1000);
  myFile.close();
}


2018年1月16日火曜日

5vと3.3vの電圧レベル変換

arduinoでSDカードの使用にはarduinoの信号(5V)とSDカードの信号(3.3V)を接続するためのレベル変換器が必要となります。方法としては5V側の送り信号を抵抗により分圧、3.3V側の送り信号はそのまま接続すればOKの様です。
そのほかにはレベル変換用の専用ICが有るようなので今後の事も考えレベル変換器を購入することにしました。

amazonでチェックすると4回路の物が260円で有ったので3個ほど購入し使ってみるとこれが動かない。3個ともダメなので別に購入した物を使うと正常動作でするので原因の調査を行うことに。
【赤=正常動作   青=不良】

5Vの信号として10MHzのVXOCを分周したTTL信号をレベル変換器に入力して動作チェック。結果は3.3Vに変換されるがオーバーシュートで5Vがおよそ1μS出力されていました。これではSDカード側が壊れてしまいます。


正常動作するレベル変換器ではしっかり3.3Vに変換されており、オーバーシュート・アンダーシュートはほとんど有りませんでした。


amazonの出品者に連絡を取ると返金処理していただけるとの事で良かったです。
今回の物は中国からの国際便で届きましたので中華製と思われますが、安くて良い物も在りますが玉石混同だなと思います。でもトラブル対応が非常に良かったのは救いですね。

2018年1月7日日曜日

井戸ポンプの制御とarduinoについて(2)

正月のうちに井戸ポンプの制御装置をほぼ完成させました。
駐車場の融雪用なので、気温に合わせた動きとした。基本的に雪は気温が3℃以下となった場合に降るそうなので3℃以下で動作するようにしています。
こんな感じです。
 1.3.0℃以上  不動作
 2.1.5~3.0℃ 5分間動作後に5分間停止
 3.1.5℃以下  連続動作
 4.手動でON-OFF操作可能
 1.5℃以下で連続動作としたのは散水パイプの凍結防止のためです。

 ポンプ制御装置は屋外に置くのでケースには防水が必要ですが簡単に作ってみました。
 材料は100均(セリア)で購入しました。黒い蓋付きボックスです。真ん中のLEDが赤く光っている箱と2種類を手に入れました。
         

arduinoを入れている蓋つき箱で、温度によってLEDが点灯します。
【左から青:1.5℃以下、緑:1.5~3℃、赤:3℃以上】

arduino_pro_miniがユニバーサル基盤上のコネクタに実装されています。
基盤にはarduinoのコネクタとLED点灯用の抵抗他が少々付いているだけです。

初代のセンサーです。LM-35とLM358を使って1℃当たり100mVとしています。この後、LM-35の取付方を変更しています。

井戸ポンプの電源入切の制御です。秋月の半導体リレー(20A)を使っています。負荷がモーターなのでゼロクロス・コントロール出来る所が気に入りました。
タッパーを加工して実装しました。絶縁重視です。

全部箱に入れたところです。

手前にarduinoの箱がありますが、その左側にオレンジ色のコードで温度センサーが繋がっています。
AC100Vを内蔵のコンセント(2個口)でポンプ用プラグとACアダプタを接続しています。
ここで問題が発生。半導体リレーの電圧降下分が熱となりほんのりと温かくなり、結果してケース自体が暖めれて温度センサーに影響が出るようでした。このためLM-35の取付方を工夫しケースの外に出しました。

だいたい上手く動いておりますが、この後、ソフトを改良し遊んでおります。
現在は温度検出を1秒間に1回実施し10回の平均値で動作を決める様にしています。また、1秒ごとの温度検出結果と平均をタブレットでモニターできるようにしています。
(Bluetooth経由です)

2018年1月4日木曜日

タブレット(LAVIE Tab)の電源が入らなくなったが・・・後に復活(修理)

 arduinoにはまり井戸ポンプ制御回路の動作確認を屋外で実施するため、久々にLAVIE_Tabを使おうと思い電源を入れたら全然起動しない。
 多分長期に渡り電源を入れていなかったのでバッテリーが完全放電したのだと思われる。
 一晩充電し再度起動してみたが反応が無い。少々焦り、ネットで再起動方法の情報検索をしたがLAVIE_Tabについては見つけられなかった。
 ASUSのTabと同じように色々とスイッチを操作したりリセットをかけても全然起動できなくあきらめ掛けた。(ここまで3日)

 最後は壊しても良いと思いつつ裏蓋を開けてバッテリーを一旦取り外し基盤の完全リセットを行う事とした。
 Tabを観察し蓋の外し方を考えた。
 USB端子やwindowsのスイッチがある黒い部分を基準にして、裏蓋に力を入れ後ろへズラスすと少し隙間ができたので、隙間に爪を入れユックリと本体-裏蓋を分離していくときれいに外れた。

 本体の裏に薄いバッテリーユニットが確認でき、基盤へ電池パックを接続するコネクタも発見した。
 コネクタは基板から浮かすように基盤側から爪で上に上げるとスルリと外れた。この状態で1~2分放置し再度コネクタを接続した。


 ドキドキしながら電源SWを入れたが反応が無い。やっぱり駄目かと諦め悔しさ紛れに電源スイッチを数回乱打したら画面にNECのロゴが出てビックリ。


 その後、サインイン画面に移行し無事起動できた。
 ちなみにバッテリーの充電状況は80%でした。(起動できるだけ充電しているのになぜ?起動しない?)
 レジューム状態でバッテリーが完全放電したので通常のリセットでは起動できなかったのかな?

 結果して多分ラッキーで復活したのだと思う。参考にされる場合は自己責任で行ってください。

 早速arduino_IDE_1.85を入れて使ってみよう。