果報は寝て待て

2020年4月19日日曜日

Arduinoで高度計をつくろう その3

次に、タクトスイッチを押すとその時の高度を記憶し、その高度との差(相対値)を表示するようにしました。
プログラムです。

#include <Wire.h>
#include <LPS.h>
#include <LiquidCrystal.h>
#define set_pin   7 //7番ピンをset_pinと命名する
LiquidCrystal lcd = LiquidCrystal(12,11,10,5,4,3,2);
LPS ps;
void setup()
{
  Serial.begin(9600);
  Wire.begin();
  lcd.begin(16, 2);
  pinMode(set_pin,INPUT_PULLUP) ;  //set_pinを入力ピンでプルアップにする
  
  if (!ps.init())
  {
    Serial.println("Failed to autodetect pressure sensor!");
    while (1);
  }
  ps.enableDefault();
  
}
void loop()
{
  int i;
  int set;                   //set_pinの状態
  float altitude = 0;        //高度
  float rel_altitude ;        //高度の相対値
  float set_altitude ;        //セットしたときの高度 
  float disp_altitude;        //表示中の絶対値高度
  float pressure = 0;        //気圧
  float pressureave = 0;     //平均気圧
  float temperature = 0;     //気温
  for (i = 0; i < 1000; i++){
   pressureave = pressureave + ps.readPressureMillibars();
   pressure =  ps.readPressureMillibars();
   altitude = altitude + ps.pressureToAltitudeMeters(pressure);
   temperature = temperature + ps.readTemperatureC();
   delay(5);
  }
  pressureave = pressureave /1000;
  disp_altitude = altitude /1000;
  temperature = temperature /1000;
  set = digitalRead(set_pin);
   if (set == LOW) {     // ボタンが押されていたら、
   set_altitude = disp_altitude;  //disp_altitudeをset_altitudeに代入する
  }
  
  rel_altitude = disp_altitude - set_altitude ; //高度の相対値を計算
  Serial.print("p: ");
  Serial.print(pressureave); 
  Serial.print(" mbar\ta: ");
  Serial.print(disp_altitude);
  Serial.print(" m\tset: ");
  Serial.print(set_altitude);
  Serial.print(" m\trel: ");
  Serial.print(rel_altitude);
  Serial.print(" m\tt: ");
  Serial.print(temperature);
  Serial.println(" deg C");
  lcd.setCursor(0,0);                   // 液晶へ表示
  //lcd.print("p: ");
  lcd.print(pressureave,0);                    
  lcd.print("mbr ");
  lcd.print(temperature,1);
  lcd.print(" deg C");

  lcd.setCursor(0,1);          //液晶の2行目に表示
  lcd.print("a:");
  lcd.print(disp_altitude,1);     
  lcd.print("m");
  lcd.print(" r:");
  lcd.print(rel_altitude,1);     
  lcd.print("m     ");



  delay(100);
}

デジタルの7ピンにタクトスイッチをつけました。
相対値をゼロmにするにはタクトスイッチを5秒以上押す必要があります…
シリアルモニタでの表示は成功です。

LCDでは、aは絶対値高度で、rが相対値高度となります。
あとは持ち運び可能にするだけです。


2020年4月18日土曜日

Arduinoで高度計をつくろう その2

次の課題は、LCDへの表示です。
 
 その前に、0.1秒ごとに表示されても見にくいだけなので、平均値を5秒にまったりと表示してくれるよう、プログラムをアベレージ表示にします。


#include <Wire.h>
#include <LPS.h>

LPS ps;

void setup()
{
  Serial.begin(9600);
  Wire.begin();

  if (!ps.init())
  {
    Serial.println("Failed to autodetect pressure sensor!");
    while (1);
  }

  ps.enableDefault();
}

void loop()
{
  int i;
  float altitude = 0;
  float pressure = 0;
  float pressureave = 0;
  float temperature = 0;

  for (i = 0; i < 1000; i++){
   pressureave = pressureave + ps.readPressureMillibars();
   pressure =  ps.readPressureMillibars();
   altitude = altitude + ps.pressureToAltitudeMeters(pressure);
   temperature = temperature + ps.readTemperatureC();
   delay(5);
  }
  pressureave = pressureave /1000;
  altitude = altitude /1000;
  temperature = temperature /1000;


  
  Serial.print("p: ");
  Serial.print(pressureave); 
  Serial.print(" mbar\ta: ");
  Serial.print(altitude);
  Serial.print(" m\tt: ");
  Serial.print(temperature);
  Serial.println(" deg C");

  delay(100);
}
それからLCD表示です。
スケッチ→ライブラリをインクルード →ライブラリを管理 でlcdを検索します。
「LiquidCrystal」をインストールします。


#include <Wire.h>
#include <LPS.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd = LiquidCrystal(12,11,10,5,4,3,2);

LPS ps;

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  lcd.begin(16, 2);
  
  
  if (!ps.init())
  {
    Serial.println("Failed to autodetect pressure sensor!");
    while (1);
  }

  ps.enableDefault();
}

void loop()
{
  int i;
  float altitude = 0;        //高度
  float pressure = 0;        //気圧
  float pressureave = 0;     //平均気圧
  float temperature = 0;     //気温

  for (i = 0; i < 1000; i++){
   pressureave = pressureave + ps.readPressureMillibars();
   pressure =  ps.readPressureMillibars();
   altitude = altitude + ps.pressureToAltitudeMeters(pressure);
   temperature = temperature + ps.readTemperatureC();
   delay(5);
  }
  pressureave = pressureave /1000;
  altitude = altitude /1000;
  temperature = temperature /1000;


  
  Serial.print("p: ");
  Serial.print(pressureave); 
  Serial.print(" mbar\ta: ");
  Serial.print(altitude);
  Serial.print(" m\tt: ");
  Serial.print(temperature);
  Serial.println(" deg C");

  lcd.setCursor(0,0);                   // 液晶へ表示
  //lcd.print("p: ");
  lcd.print(pressureave,0);                    
  lcd.print("mbr ");
  lcd.print(temperature,1);
  lcd.print(" deg C");

  lcd.setCursor(0,1);
  lcd.print("alt: ");
  lcd.print(altitude,2);     
  lcd.print(" m");

  delay(100);
}




温度表示での「18.2 deg  C」のところ、最後のCが桁数が足りず、表示できてませんが気にしません。

 
かなりごちゃごちゃしてきました。

2020年4月14日火曜日

Arduinoで高度計をつくろう

 最近、山歩きしてます。
ひょんなことで、高度計の必要を感じました。

買うという選択肢はなく、家にあるもので作ることにしました。
 目指す仕様
  ① 持ち運びできる。(液晶表示、バッテリー式)
  ② できれば、分解能1mくらいほしい
  ③ 絶対値だけでなく、相対値(ある地点から何メートル下がった)がほしい
  
 ということで、ネットでしらべました。ラジオペンチさんのアナログ高度計、すごい人がいるものです。百均の時計であんなものまで作れるとは。

 こちらは、歩きながら、立ち止まって高度を確認、また歩いて高度を確認という使い方を想定してますので、表示は家に転がってる16文字x2行のLCDを使います。 
 秋月電子で買ったやつです。
Arduino uno R3も買いました。本当は家にころがってるpicマイコン(10年前くらいに購入してしばらく遊んだやつ)と思ったのですが、参考情報が桁違いに少なく、時代はArduinoに変わってしまってました

気圧センサーは秋月電子でいいのを買いました。
LPS25HB 
精度:±0.1hPa(25℃)、±1hPa(0~80℃)
これなら600mの生駒山で1mの違いを検知してくれそうです。
Arduino IDEでスケッチ→ライブラリをインクルード→ライブラリを管理の画面で 「POLOLU lps」を検索すると「LPS」がヒットしますので「インストール」をクリックします。
内容は以下のとおりです。


#include <Wire.h>
#include <LPS.h>

LPS ps;

void setup()
{
  Serial.begin(9600);
  Wire.begin();

  if (!ps.init())
  {
    Serial.println("Failed to autodetect pressure sensor!");
    while (1);
  }

  ps.enableDefault();
}

void loop()
{
  float pressure = ps.readPressureMillibars();
  float altitude = ps.pressureToAltitudeMeters(pressure);
  float temperature = ps.readTemperatureC();
  
  Serial.print("p: ");
  Serial.print(pressure);
  Serial.print(" mbar\ta: ");
  Serial.print(altitude);
  Serial.print(" m\tt: ");
  Serial.print(temperature);
  Serial.println(" deg C");

  delay(2000);
}
ArduinoとLPS25HBの接続方法です。



実際の配線です。
信号線は2本ですっきりしてるのですが、5vを3.3vに変換する必要があるためすこしごちゃごちゃしてます。




「マイコンボードに書き込む」の後、ツール→シリアルモニタをクリックして立ち上げますと、

だーっと表示されます。
わしの家は海底やったのか。
結構簡単に使えました。




 

2020年3月20日金曜日

google-code-prettifyの使い方

自分用のメモとしています。
とにかく簡単にブログ上のコード表示をハイライト化したい。
google-code-prettifyを使います。

1, テーマ→ブログで使用中→→HTMLで編集をクリックして画面を切り替えます。
2, <head>と</head>との間に、 <script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script> を貼り付けます。
3, 通常の作成画面で投稿内容を編集します。
4, 作成からHTMLに切り替えて装飾したいコードの前の </p>と<p>の間に <pre class="prettyprint"> を貼り付けます。
5, コードの後の</p>と<p>の間に  </pre> を貼り付けます。
6、 保存します。

ここからコードを表示します。
コードはここまで

黒い画面は見た目がかっこいいのでやってみました。
 <script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js">
を削除して代わりに
 <script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=desert"></script>
をコピペします。
 すると黒い画面(テーマというらしい)に変わります。
ここからコードを表示します。
#include <Wire.h>
#include <LPS.h>

LPS ps;

void setup()
{

コードはここまで




行番号も表示させました。
<pre class="prettyprint"> を貼り付ける時、代わりに
 <pre class="prettyprint linenums"> を貼り付けます。
 するとコードがシマシマになってしまいます。
さすがにこれは見ずらい。
このシマシマをなくそうと、テーマを色々変えてみたのですが、デフォルトのテーマ(白い画面)しかまともに表示できませんでした。
 desert,   sunburst,  doxy,  sons-of-obsidian,
 どれも同じでした。
行番号の表示が必要になったときに又考えることにします。

後日このシマシマが解決しました。
何度もやってるうちに間違って
 <header>と</header>との間に、 <script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script> が貼り付けてあったのです。
これを削除したらシマシマが消えて 行番号が表示できるようになりました。

#include <Wire.h>
#include <LPS.h>

LPS ps;

void setup()
{

さらに横に長いコードをスクロールして表示できるようにします。

<script src='https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=desert'/> 
の後に
  <style type='text/css'>
    pre.prettyprint {
      font-size:12px;
      overflow: auto;
    }
    pre.prettyprint.high {
      overflow: auto;
      height: 23em;
    }
    </style>
 を貼り付けます。
 

2020年1月22日水曜日

高見山に行ってきました。

1月19日に高見山に行ってきました。
 寒いと思って思い切り厚着してたのですがとても穏やかな天気でした。
近鉄榛原駅からバスで登山口へつきます。

バスを降りたら少し戻って登山口へ向かいます。
 しばらくは林の間を歩きます。最初は結構急です。
 すこし残雪が見えてます。
林道に出ると林道沿いに右に行きます。
車止めの手前を左に登って登山道に入ります。ちょうど高見山の裾を左回りに歩きます。右側に林道があります。


だんだんと積雪が多くなってきます。でもまだアイゼンの出番ほどではありません。
ここを過ぎて少し行くと裾周りは終わり、アイゼンをつけて山頂hw向かいます。
どんどん高度が上がり、視界が開けてきます。


上をみあげるとかなりの急斜面です。


そのうち急に開けたと思ったら頂上です。

曽爾の山々もきれいに見えます。
霧氷もきれいにくっついてます







 西斜面のは5センチくらい。
風もなく穏やかなので避難小屋の上でも人がいっぱいです。
早い昼食のあと、西の尾根から降りていきます。
雪は深いところで50cmくらいだそうです。

 帰りは温泉へ向かいます。
1/3くらいのところで全く雪がなくなります。
無事温泉につきました。







2020年1月2日木曜日

自転車用テールライトのバッテリー交換

ちょうど一年使ったMOON製テールライトです。




通勤時間は片道30分です。明るくて視認性がよく、大変気に入ってました。短所は、バッテリーの持ちが悪いことです。購入時より、4日ごと(ちょうど2時間)に充電が必要でした。5日目に使用すると、途中で消えてしまいます。

1年近くで、急に持ちが悪くなり、今では2日に1回の充電が必要です。そこでバッテリーの交換をしました。

バッテリーは「 801350の 500mAh 」です。
探したのですが、日本では売ってなく、 ebayで購入です。800円くらい。

ポチッとしてから届くまでなぜかほぼ一ヶ月もかかりました。
リチウムポリマーはリチウムイオンよりも発火しにくいとはいうものの、どういう梱包でくるのか興味があります。
届いたのはこれです。
内容はusbネットワークカードとなってます。
安全上、あまりおおっぴらに明記できないのかも。

 普通の静電気防止のビニール袋のようです。

 ライトの分解は六角レンチ1本です。

問題のバッテリーです。


交換用は520mAhに容量アップしてます。


赤と黒の線をハンダ付けでの交換です。
ショートしないよう注意します。
外した方も、ビニルテープでしっかり絶縁して廃棄します。
 交換後、充電しなくても容量はありました。
 




ホームページをさがしても自転車用テールライトのバッテリー交換をしてる人は見当たらないようで、みなさん消耗品のようにしてるようですね。
 たしかに、雨が入り込んだ跡もあり、そう長くはもたないものかもしれません。
でも、気にいったものは修理して長く使いたいと思うのは私だけでしょうか。