Arduino—再び(2)–LCD Keypad Shield

LCD Keypad Shield が届いたので、あれこれはじめました。

諸兄のプログラムをお借りして、動かしてみました。すんなりと動きましたが、LCDの表示で、明るさの調整がボリュームで必要でした。
 ただ、KEYの読み取りで、判別条件の調整が必要でした。諸兄の物と届いた物では、抵抗値が違うのだと思いますが、下記赤字部分のように、アナログの読み込みの値の修正をしました。

     int read_LCD_buttons(int adc_key_in){
          if (adc_key_in > 1000) return btnNONE;
          if (adc_key_in < 50) return btnRIGHT;
          if (adc_key_in < 150) return btnUP;
          if (adc_key_in < 300) return btnDOWN;
          if (adc_key_in < 600) return btnLEFT;
          if (adc_key_in < 750) return btnSELECT;
          return ERRORR;
     }

この辺は、メーカーの違い、個体値の違い、等によって調整が必要なようです。このアナログ値の調整をする
にあたっては、諸兄の作成されたプログラムが都合がよかったです。キーごとの電圧が表示されますので、そ
れをみながら、調整ができます。私はそのまま使いましたが、表示が電圧ではなくて、アナログの読み取り値
だともっと楽だと思います。また、標準のライブラリーとは、LCDのピンの配置が多少違うので、下記のよう
に、ピンの表示の部分の変更も必要でした。これは、別の諸兄のHPに記載がありました。

     #include LiquidCrystal
      lcd(8, 9, 4, 5, 6, 7);

LCDの表示用にデジタルの、8,9,4,5,6、7、キーの判別ようにアナログのA0のピンを使用していますので、ユーザーはそれ以外のピンしかつかえません。基盤の裏のパターンをたどってみると、

写真の緑黄色矢印から、

 13,12,11,3,2,1,0

の並びで、デジタルのピンを取り出せるようです。また、アナログは、本体右下のピンヘッダーから、

のように、

 1,2,3,4,5

のアナログのピンを取り出せるようです。

大捜索をするようですが、部品を収納した、ケースにピンヘッダーがあったように記憶してますので、探しだして、取り付けたいと思ってます。

Arduino—再び(1)–LCD Keypad Shield

しばらく前にArduinoを使って、フライス用にDROの表示用のものを作成しました。また、備忘録をかねて、
Arduinoをいじりはじめました。LCDと外部入力(キーパッド)のものがほしかったので、いろいろ調べまし
た。
スイッチサイエンスのLCDシールドは手元にあったのですが、これは、

外部入力ができないので、〇zonで、LCD Keypad Shieldくぐると、600円~5000円のものが引っかかりました。LCD 1602でくぐると、600円から30000円と幅広いものが引っかかります。30000円のもの買う方いるのかなと疑問に思ってしまいますが、もちろん、安い物をポチリました。

ただ、ポチったものには、ピンへダーがついてないので、後付けするようかなと思います。2700円だいのものには、ピンヘッダーが付いていますが、高いですね。

これらのシールドには、5個のkeyが付いていますが、どうやって、判別をしてるのかと思いましたが、
keyの配線図がのってました。

抵抗を介して一つのポートに接続しているようですが、どうやって判別するのか、くぐってみると、どうや
ら、電圧の違いで判別してるようでした。
KeyPad用のライブラリーには、

  iuint8_t LiquidCrystal::readButtons(void) {
    int adc_key_in = analogRead(0);
     // read the value from the sensor
    // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
    // we add approx 50 to those values and check to see if we are close
    if (adc_key_in > 1000) return 0x00;
    if (adc_key_in < 50) return BUTTON_RIGHT;
    if (adc_key_in < 195) return BUTTON_UP;
    if (adc_key_in < 380) return BUTTON_DOWN;
    if (adc_key_in < 555) return BUTTON_LEFT;
    if (adc_key_in < 790) return BUTTON_SELECT;
    return 0x1F; // when all others fail, return this…   }

のように記述があり、アナログで電圧の変化によって、判別してるようでした。使用上の注意に接点経年劣化やチャタリング等の対策がソフトの方で必要だとの記述もありました。

ER-PA10-S(電動バリカン) 電池交換

長年使ってたバリカン?が動かなくなりました。2012年購入ですから、もう10年目ですね。くぐると、
電池の交換方法については、丁寧に書かれているHPがありますので、そちらの方が参考になるかと思います
が、備忘録のために書いておきます。
〇zonにあるかと思いましたが、なかったので、〇天にて電池を購入。800円強でした。

届いたので、早速の交換。ねじは、頭とおしりの方に三つ使われています。これを外します。

結構きついので、なめないように外します。

充電口の方は、外から見て分かりますが、もう一カ所は、替え刃を外した中に、二つのねじがあります。

これを外します。

金具がとれるたら、黒とシルバーのプラスティックのカバーを外します。

このカバーはたやすく外れるのですが、すでに入っている電池は、結構きつく入っているので、力がいりま
す。このあたりは、諸兄のHPにも載ってます。古い電池を外して、極性を間違わないように新しい電池を入れます。

入れ替えたら、カバーを戻せば完了ですが、戻すとき、充電端子の出ているプラスティクの台座が、爪の内側
になるように気をつける必要があるようです。

それほど時間がかからずできるかと思いますが、電池の交換ご、古い電池の端子のもとについていた、白いワッシャが残ってしまいましたので、そのワッシャーを、電池を外して入れ直しました。カバーと戻して完成です。

キュウリのぱりぱり漬け

YouTubeで、見たのがきっかけで、キュウリのパリパリ漬けをつくりはじめました。オリジナルのレシピは、
ちょっとしょっぱいので、我が家風にアレンジしてます。

材料 キュウリ 15本~20本(細身だと20本でも大丈夫かなあ)
   醤油   130cc
   お酢   130cc
   昆布つゆ  100cc~180cc
   酒    430cc
   鷹の爪 4かけぐらい
   ショウガ 一かけ
   ごま 13013g
   砂糖 130g

20本ぐらい準備します。
水洗いします。
カットします。
塩を振りながら,タッパーにいれます。
30分ぐらいおきます。
水気を切って,出汁にいれます。
一煮立ちするまで加熱します。
広めの鍋に移してさまします。
出汁は5分ぐらい,煮詰めます。
濾しながらタッパーにいれます。
冷えたキュウリをうつします。
ごまをいれます。
ショウガをいれます。
鷹の爪をいれます。
よくまぜます。
ラップをかけて冷蔵庫で保存します。


タッパーに塩を振っておき、まんべんなく塩がかかるように、キュウリを敷き詰めては塩をふり、敷き
詰めては塩をふり、を何回かくりかえします。

30分ほどおいて、から、キッチンペーパーではさんで水気を取って、あらかじめ調合しておいたたれに入れ
ていきます。

入れた後、一煮立ちするまで、加熱していきます。今回は、材料には記載していませんが、ニンニクのスライスを一緒ににています。キュウリが太いと、たれが全部キュウリにかかりませんが、一煮立ちするまで、待つと、だいたいひたひたの分量になります。

一煮立ちした後、キュウリは、広めの器に移して冷まします。私は、いつも、大きめのフライパンにしてます。

キュウリを取り除いたたれは、中火で、5分ほど煮詰めます。私は、いつもコンロのタイマーをセットしてほって起きます。

たれとキュウリが冷めたら、たれは、茶こしでこしながら、タッパーに移して、キュウリをいれます。

キュウリをいれたら、ごま、切っておいたショウガ、鷹の爪を入れて混ぜます。

混ぜたら、表面をラップで覆って、冷蔵庫で保管します。だいたい、一日過ぎると、味もなじんで、食べ頃です。

ポケモンgo TL50達成

2016年に始めたポケモンgoも、過日やっと TL50 達成いたしました。それこそ、このところ、合間をみ
て、細々とやっていましたので、今になりました。早い方だと、昨年の1月には、もう50になっていたよう
です。2020年12月に上限が40から50になりましたが、わずか、2~3ヶ月で、達成してたようで
す。私は、XP が足りず、今になりました。

50 になって、まずやったのは、アバター?のトップスをTL50のジャンパーにしたことです。やはり、この辺ミーハーですね。

エクセルVBA(シート選択のエラー処理)–(5)

ファイル名を取得するのに、文字列関数を操作して取り出しましたが、一発で取り出せる関数もあるようで
す。
FSO と呼ばれるものを使う方法で、詳細は、諸兄のHPに譲りたいと思いますが,

fPath は目的のファイルまでのファイル名を含んだフルパス)
  Dim FSO, PathName As String, FileName As String
  Set FSO = CreateObject(“Scripting.FileSystemObject”)

  FileName = FSO.GetFileName(fPath)・・・・・・ファイル名だけを取り出す。
  PathName = FSO.GetParentFolderName(fPath)・・・・・・パスだけ取り出す。

ただ自分自身(マクロを記載したBOOK)の場合は次のようにして求めるようです。

  ThisWorkbook.Name・・・・自分自身のファイル名
  ThisWorkBook.FullName・・・自分自身のフルパス

ちなみに、

   FileName = FSO.GetFileName(ThisWorkbook)・・・・エラー

のようにファイル名を求めようとするとエラーになります。VBA が良く分かっている方ならこんなことなさ
らないのでしょうがまだまだ勉強中の私にとって、ちょっと ? になります。ただ、下記のようにするとき
ちんとファイル名を求められます。でも、ThisWorkbook.Name でファイル名を求めることができるので、
意味ないですね。

   FileName = FSO.GetFileName(ThisWorkbook.FullName)・・・取得可

ただ、自分自身(マクロが書かれているファイル)のファイル名を求める場面は、それほど多くないかなと思います。

エクセルVBA(シート選択のエラー処理)–(4)

作ったプロシャージャを動かして、シートを選択している様子です。リストボックスのシート名をクリックすると、クリックしたシートに移動します。

どのシートが選ばれたかは、リストボックスの IndexID でわかります。Worksheets( IndexID).Name で、選択されたシート名を表示できます。それほど使う場面はないかとは思いますが、使う時は、便利な機能のよ
うな気がします。

エクセルVBA(シート選択のエラー処理)–(3)

以下は、VBA 標準モジュールに記載したプロシャージャです。
Sub ボタン2_Click() は、シートに貼り付けてある、マクロ起動用のものです。
Function sheets_set(Wb As Workbook) の中身は、本来ユーザーフォームの _Initialize()の項目に記入すべきでしょうが、Wb の引き渡し方法がわからないので、こちらに書きました。

---------------
Sub ボタン2_Click()
  Call Select_sheet
End Sub
---------------
Function Select_sheet()
  ‘====読み込みフルパスファイル名の取得====
  Dim fPath As Variant
  Dim fType, prompt As String

  fTyp = “Excelファイル(*.xlsm),*.xlsm,Excelファイル(*.xlsx),*.xlsx,Excelファイル(*.xls),*.xls”
  prompt = “Excelファイルを選択してください”
  fPath = Application.GetOpenFilename(fTyp, , prompt)

  If fPath = False Then
    MsgBox “ファイルが選択されていません。”
    Exit Function
  End If

  ‘====読み込みのファイル名取り出し====
  Dim STR As String
  Dim t_file_name As String

  STR = StrReverse(fPath)
  t_file_name = Right(fPath, InStr(STR, “\”) – 1)

  ‘====ファイルを開く処理====
  Dim Wb As Workbook

  If ThisWorkbook.FullName <> fPath Then
    If fPath <> “” Then

    For i = 1 To Workbooks.Count
      If Workbooks(i).Name = t_file_name Then
        BookFlag = True
      End If
    Next i

    If BookFlag <> True Then
      MsgBox “ファイルを開きます。”
      Set Wb = Workbooks.Open(fPath, UpdateLinks:=Ture, ReadOnly:=Ture)

      Call sheets_set(Wb)
      UserForm1.Show vbModeless
    Else
      MsgBox “すでに開いているファイルを開こうとしてます。”
      Exit Function
    End If
    End If
  Else
    MsgBox “自分自身を開こうとしてます。”
    Exit Function
  End If
End Function
-------------------------------------------
Function sheets_set(Wb As Workbook)
  Dim i As Integer

  With UserForm1.ListBox1
    ‘一つだけ選択
    .MultiSelect = fmMultiSelectSingle
  End With

  For i = 1 To Wb.Worksheets.Count
    UserForm1.ListBox1.AddItem (Wb.Worksheets(i).Name)
  Next

  UserForm1.ListBox1.ListIndex = 0
End Function


以下は、ユーザーフォームの方に記載したものです。

-------------------------
Private Sub CommandButton1_Click()
  ThisWorkbook.Activate
  Unload UserForm1
End Sub
-------------------------
Private Sub ListBox1_Click()
  sh_name = ListBox1.List(ListBox1.ListIndex)
  TextBox1.Text = sh_name
  Worksheets(sh_name).Activate
End Sub
----------------------------------------------
Private Sub ListBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = vbKeyReturn Then
    KeyCode = 0
    ThisWorkbook.Activate
    Unload Me
  End If
End Sub
----------------------------------------------
Private Sub UserForm_Initialize()
  With ListBox1
  ‘一つだけ選択
  .MultiSelect = fmMultiSelectSingle
  End With
End Sub

エクセルVBA(シート選択のエラー処理)–(2)

エラー処理2・・・・自分自身を開こうとする。

  このエラー処理は、自分自身を開くとまずいので、ThisWorkbook.FullName と 開こうとするファイ
  ルのフルパスの fPath を比較することで、同じなら、「自分自身を開こうとしてます。」のメッセージ
  を出して、Function  を抜け出します。

  If ThisWorkbook.FullName <> fPath Then
    
    ・*開こうとするファイルとすでに開いているファイルを比較する。
    
  Else
    MsgBox “自分自身を開こうとしてます。”
    Exit Function
  End If

  次の処理のファイルを比較するに先立ち、開こうとするファイルのファイル名を取り出しておきます。い
  くつか方法をためしましたが、文字列を編集する方法がいいみたいで、フルパスを文字の後尾から ”¥” 
  を探してファイル名を取り出します。緑の”¥”を探しだせば、赤のフィル名を取り出せます。

    E:¥VBA開発¥シート選択Dummy.xlsx
                  ←←←←←

  はじめ、InStrRev を使ってみましたが、思った結果がでなかったので(後でわかりました)文字列を反転
  して、先頭から”¥”の探し出し、その文字のある手前まで切り出して、ファイル名を取得しました。なん
  と、InStrRev 関数は、後ろから文字を探すのですが、見つけた場所の位置を、後ろから数えた位置では
  なく、前から数えた位置を返すみたいでした。下記のようにして  t_file_name にファイル名を取り込
  みました。
  ‘====読み込みのファイル名取り出し====
   Dim STR As String
   Dim t_file_name As String

   STR = StrReverse(fPath)
   t_file_name = Right(fPath, InStr(STR, “\”) – 1)

エラー処理3・・・・既に開いているファイルを開こうとする。
  既に開いている Book数を Workbooks.Count で取得して、For ループの中で、開こうとしている
  ファイル名と比較し、同名のファイルがあれば、True を そうでなければ False をセットして判定し
  ます。開いているファイル名は、Workbooks(i).Name で取得できます。
  False の場合だけ(同じファイルがない),目的のファイルを開き、Call sheets_set(Wb) で、取得する
  シート名をユーザーフォームのリストボックスに、セットします。

  For i = 1 To Workbooks.Count
    If Workbooks(i).Name = t_file_name Then
      BookFlag = True
    End If
  Next i

  If BookFlag <> True Then
    MsgBox “ファイルを開きます。”
    Set Wb = Workbooks.Open(fPath, UpdateLinks:=Ture, ReadOnly:=Ture)

    Call sheets_set(Wb)
    UserForm1.Show vbModeless
  Else
    MsgBox “すでに開いているファイルを開こうとしてます。”
    Exit Function
  End If

エクセルVBA(シート選択のエラー処理)–(1)

お手伝いでしている仕事がらみの作業用に、何年かかけて、VBAのプロシャージャを作成しました。おかげ様で、短い時間でその処理ができるようになりました。

ただ、時々でるエラーを、その都度修正したりしながら、使ってきました。自分で作成したプロシャージャなので、なぜエラーが起こったのか、ちょっと流れを見ればわかるのですが、なるべく直さなくてもいいように、作り直したいなと思ってました。

やっていることは至極簡単なことですが、手作業でやると結構な時間とられるので、どうしても、プロシャージャが必要でした。継ぎ足し継ぎ足ししてきたので、結構な分量のプロシャージャになってしまってますので、全部作り直すことは、なかなかできないのですが、ある作業の一部分だけでも、考えられるエラーについての対処を十分にできるようにしたいなと、手直しをし始めました。

今回、作業の対象にしたので、他のエクセルブックを選択して開きそのブックのシートを選択する、という部分のプロシャージャです。今日、一日、かかって、ほぼ、できたので、備忘録がてら、記載します。

エラー処理1・・・・存在しないファイルを開こうとする。
  このエラーの回避は、GetOpenFilename を使って、それそれのディレクトリーを開いて、これから開こ
  うとするファイルを選択して開くということで、回避しました。ただこの画面で、キャンセルを押してし
  まうと、「ファイルが選択されてません。」のエラーとなりプロシャージャが中断してしまい、fPath に
   False がセットされますので、IF 文でFunction を抜け出すことで、回避しました。

  ‘====読み込みフルパスファイル名の取得====
   Dim fPath As Variant
   Dim fType, prompt As String

   fTyp = “Excelファイル(*.xlsm),*.xlsm,Excelファイル(*.xlsx),*.xlsx,Excelファイル(*.xls),*.xls”
   prompt = “Excelファイルを選択してください”
   fPath = Application.GetOpenFilename(fTyp, , prompt)

   If fPath = False Then
     MsgBox “ファイルが選択されていません。”
     Exit Function
   End If