07/07/2018

Wemos Lolin32 OLED module に RobotDyn microSD boardを接続テスト

3 4 Wemos Lion32 OLED module(写真左)に RobotDyn製 microSD board(写真右) を接続した事例がなかなか見つけられずに、関連する情報から探ってみた結果、接続・書き込みが上手くいったので、ここにメモしておく。



先ず、RobotDyn製
microSD boardWemos Lion32 OLEDモジュール のピン接続であるが・・・

次のように接続すること。
  RobotDyn       ESP32
  SD Card   |   Lolin32
--------------------------------------------------
     D3/CS        CS    ⇒ pin14
     CMD/DI      MOSI ⇒ pin25
     GND          GND
     3.3V          3.3V
     CLK          SCK  ⇒ pin15
     DO           MISO  ⇒ pin13
(上記、表内に記載ミスがあり訂正しました。2018/07/11)
次に、僕が行った方法は、Arduino IDE を起動し、
ファイル ⇒ スケッチ例 ⇒ Wemos LOLIN32のスケッチ例 SD(esp32) ⇒ SD_Test を下記のように加筆修正した。

《SD_Test をWemos Lolin32+RobotDyn microSD board で動かすための修正部分について》
①16行目 #include "SD.h" → #include <SD.h> に変更

②17行目 #include "SPI.h" → #include <SPI.h> に変更

③下記4行の define文を17行目の下に追加
  #define PIN_NUM_MISO 13
  #define PIN_NUM_MOSI 25
  #define PIN_NUM_CLK  15
  #define PIN_NUM_CS   14

④setup()の 最初で、
  117行目から118行目 の下記部分を
  Serial.begin(115200);
    if(!SD.begin()){

  以下のように加筆修正
  Serial.begin(115200);
    auto SPI = SPIClass();
    SPI.begin(PIN_NUM_CLK, PIN_NUM_MISO, PIN_NUM_MOSI, PIN_NUM_CS);
    auto speed = 4000000;
    if(!SD.begin(PIN_NUM_CS, SPI, speed)){


5上記の修正で良い筈だが・・・、もしかして私が書き忘れているかもしれないので、問題無く動いたSketch リストを下記に添付しておく。


尚、テスト結果を左に添付しておく。







《 Sketch for "Wemos Lolin32" + "RobotDyn microSD board" SDcard Test 》
/*
 * Connect the SD card to the following pins:
 * RobotDyn  |  ESP32
 * SD Card   | Lolin32
 *    D3/CS    CS   pin14
 *    CMD/DI   MOSI pin25
 *    VSS      GND
 *    VDD      3.3V
 *    CLK      SCK  pin15
 *    VSS      GND
 *    DO       MISO pin13
 */
#include "FS.h"
#include <SPI.h>
#include <SD.h>
#define PIN_NUM_MISO 13
#define PIN_NUM_MOSI 25
#define PIN_NUM_CLK  15
#define PIN_NUM_CS   14

void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
    Serial.printf("Listing directory: %s\n", dirname);

    File root = fs.open(dirname);
    if(!root){
        Serial.println("Failed to open directory");
        return;
    }
    if(!root.isDirectory()){
        Serial.println("Not a directory");
        return;
    }

    File file = root.openNextFile();
    while(file){
        if(file.isDirectory()){
            Serial.print("  DIR : ");
            Serial.println(file.name());
            if(levels){
                listDir(fs, file.name(), levels -1);
            }
        } else {
            Serial.print("  FILE: ");
            Serial.print(file.name());
            Serial.print("  SIZE: ");
            Serial.println(file.size());
        }
        file = root.openNextFile();
    }
}

void createDir(fs::FS &fs, const char * path){
    Serial.printf("Creating Dir: %s\n", path);
    if(fs.mkdir(path)){
        Serial.println("Dir created");
    } else {
        Serial.println("mkdir failed");
    }
}

void removeDir(fs::FS &fs, const char * path){
    Serial.printf("Removing Dir: %s\n", path);
    if(fs.rmdir(path)){
        Serial.println("Dir removed");
    } else {
        Serial.println("rmdir failed");
    }
}

void readFile(fs::FS &fs, const char * path){
    Serial.printf("Reading file: %s\n", path);

    File file = fs.open(path);
    if(!file){
        Serial.println("Failed to open file for reading");
        return;
    }

    Serial.print("Read from file: ");
    while(file.available()){
        Serial.write(file.read());
    }
    file.close();
}

void writeFile(fs::FS &fs, const char * path, const char * message){
    Serial.printf("Writing file: %s\n", path);

    File file = fs.open(path, FILE_WRITE);
    if(!file){
        Serial.println("Failed to open file for writing");
        return;
    }
    if(file.print(message)){
        Serial.println("File written");
    } else {
        Serial.println("Write failed");
    }
    file.close();
}

void appendFile(fs::FS &fs, const char * path, const char * message){
    Serial.printf("Appending to file: %s\n", path);

    File file = fs.open(path, FILE_APPEND);
    if(!file){
        Serial.println("Failed to open file for appending");
        return;
    }
    if(file.print(message)){
        Serial.println("Message appended");
    } else {
        Serial.println("Append failed");
    }
    file.close();
}

void renameFile(fs::FS &fs, const char * path1, const char * path2){
    Serial.printf("Renaming file %s to %s\n", path1, path2);
    if (fs.rename(path1, path2)) {
        Serial.println("File renamed");
    } else {
        Serial.println("Rename failed");
    }
}

void deleteFile(fs::FS &fs, const char * path){
    Serial.printf("Deleting file: %s\n", path);
    if(fs.remove(path)){
        Serial.println("File deleted");
    } else {
        Serial.println("Delete failed");
    }
}

void testFileIO(fs::FS &fs, const char * path){
    File file = fs.open(path);
    static uint8_t buf[512];
    size_t len = 0;
    uint32_t start = millis();
    uint32_t end = start;
    if(file){
        len = file.size();
        size_t flen = len;
        start = millis();
        while(len){
            size_t toRead = len;
            if(toRead > 512){
                toRead = 512;
            }
            file.read(buf, toRead);
            len -= toRead;
        }
        end = millis() - start;
        Serial.printf("%u bytes read for %u ms\n", flen, end);
        file.close();
    } else {
        Serial.println("Failed to open file for reading");
    }


    file = fs.open(path, FILE_WRITE);
    if(!file){
        Serial.println("Failed to open file for writing");
        return;
    }

    size_t i;
    start = millis();
    for(i=0; i<2048; i++){
        file.write(buf, 512);
    }
    end = millis() - start;
    Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end);
    file.close();
}

void setup(){
    Serial.begin(115200);
    auto SPI = SPIClass();
    SPI.begin(PIN_NUM_CLK, PIN_NUM_MISO, PIN_NUM_MOSI, PIN_NUM_CS);
    auto speed = 4000000;
    if(!SD.begin(PIN_NUM_CS, SPI, speed)){
        Serial.println("Card Mount Failed");
        return;
    }
    uint8_t cardType = SD.cardType();

    if(cardType == CARD_NONE){
        Serial.println("No SD card attached");
        return;
    }

    Serial.print("SD Card Type: ");
    if(cardType == CARD_MMC){
        Serial.println("MMC");
    } else if(cardType == CARD_SD){
        Serial.println("SDSC");
    } else if(cardType == CARD_SDHC){
        Serial.println("SDHC");
    } else {
        Serial.println("UNKNOWN");
    }

    uint64_t cardSize = SD.cardSize() / (1024 * 1024);
    Serial.printf("SD Card Size: %lluMB\n", cardSize);

    listDir(SD, "/", 0);
    createDir(SD, "/mydir");
    listDir(SD, "/", 0);
    removeDir(SD, "/mydir");
    listDir(SD, "/", 2);
    writeFile(SD, "/hello.txt", "Hello ");
    appendFile(SD, "/hello.txt", "World!\n");
    readFile(SD, "/hello.txt");
    deleteFile(SD, "/foo.txt");
    renameFile(SD, "/hello.txt", "/foo.txt");
    readFile(SD, "/foo.txt");
    testFileIO(SD, "/test.txt");
    Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));
    Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));
}

void loop(){

}

07/05/2018

AE-GYSFDMAXB と Wemos LOLIN32 で GPS 受信表示

Img_20180705_165137a Img_20180705_165223a 太陽誘電製の小型GPSモジュール「GYSFDMAXB」をWEMOS LOLIN32に繋いで、GPS受信表示してみた。

GYSFDMAXBは、日本の準天頂衛星システム(QZSS)「みちびき」3機受信(衛星番号193,194,195)に対応した太陽誘電製の小型高感度GPSモジュールで、秋月電子通商から購入した。
基板の大きさや性能等の詳細データは、秋月電子の商品ページから辿ることが出来る。

Wemos Lolin32は、Arduino ESP32 WiFi+Bluetooth デュアルESP-32SESP8266 OLEDモジュール(技適マーク付き)である。OLEDが既に装着されているので、携帯する機器を小型軽量に纏めるには便利かな・・・と思い、Banggoodから購入した。CNからの配送で1179円だった。購入し、これを使おうと思ってから気づいたが、これを使っての事例が少なく、動かせるようになるまで苦労した。

上記のディバイスを使ってのGPS受信結果は、左上の写真のようになった。
GYSFDMAXBの5V電源は、Wemos Lolin32のOLEDモジュール左下にある5V端子から、ブレッドボードの+電源へ、GNDはOLEDモジュールの中央部上にあるGND端子からLolin32のモジュールの下を通してブレッドボードの-端子側へ接続。

GYSFDMAXBの信号ケーブル「TXD」は、Lolin32の16番ピンへ接続した。(写真緑色の線->黄色(Lolin32の基板の下で、16番ピンに接続している))

③OLEDモジュールは、Lolin32の基板内部で結線されている。

《Sketch作成に関して》

①GPSの信号処理では「tinyGPS++」を用いたが、別のArduino基板で製作していたSketchを流用したのでその名残で使ってしまった。別のライブラリを使っても良かっただろうと思っている。

②Lolin32に付いているOLED1306を使うために”SSD1306Wire.h”が必要。
 ディスプレイは内部結線されているので、設定は、
  SSD1306Wire  display(0x3c, 5, 4)   となる。

③GPS信号は、Lolin32に読み込ませるだけなので、HadwareSerialを使うと Serial2で丁度16番ピンに繋ぐことができる。
 それで、HardwareSerial GPSRaw(2) とした。
 また、GPSの初期設定は、
  GPSRaw.begin(GPSBaud, SERIAL_8N1, 16, 17)   とした。
   ここで、GPSBaudは 9600 としている。

④ここまで決めれば、あとは自分の気に入ったように
Display用のSketchを書けばいい。
 面倒なのは、このOLEDは先に描いた場所に上書きすると重なった表示になるので、一度描いたら消さないといけない。これを解消するために簡単なテクニックが要る。

GPS受信のSketchを一度でも書いたことがある人なら、記載したSketchを見れば、処理の方法は概略分かると思うので、あまりSketchの中にコメントは記載しない。

⑤Sketch を書き込むときの注意点
 ・ボードは WEMOS LOLIN32
 ・らいぶらりーとして、ESP8266 and ESP32 Oled Driver for SSD1306 display by Daniel Eichhorn, Fabrice Weinberg Version 4.0.0 をインストールすること
 ・tinyGPS++.h のインストールを忘れないように。
 ・Sketchが書き込まれるときに Lolin32 裏面にある Boot ボタンを 書込みが始まるまで「カチカチ」と押してやる必要があります。これをしないと、Lolinが、「タイムオーバーで書き込めませんでした」と宣のですよ・・・

《Sketch》

// GPS Tracker    Sketch for Wemos LOLIN32  2018/07/05
// The serial connection to the GPS device
  #include <TinyGPS++.h>
  #include "SSD1306Wire.h"   // legacy include: '#include "SSD1306.h"'
  HardwareSerial GPSRaw(2);  // ESP32 UART2 GPIO-16 ( RXD2 ) --- GPS TXD
  const int UTC_offset = 9;  //  Japan Time
  static const int GPSBaud = 9600;
//  static const int MAX_SATELLITES = 40;
  TinyGPSPlus gps;  // The TinyGPS++ object
  TinyGPSCustom totalGPGSVMessages(gps, "GPGSV", 1); // $GPGSV sentence, first element
  TinyGPSCustom messageNumber(gps, "GPGSV", 2);      // $GPGSV sentence, second element
  TinyGPSCustom satsInView(gps, "GPGSV", 3);         // $GPGSV sentence, third element
  SSD1306Wire  display(0x3c, 5, 4);
  
void setup()
{
  Serial.begin(115200);
  GPSRaw.begin(GPSBaud, SERIAL_8N1, 16, 17);
  display.init();
}

void loop()
{
  if (GPSRaw.available() > 0)
  {
   gps.encode(GPSRaw.read());
   if (totalGPGSVMessages.isUpdated())
   {
    display.clear();
    printDateTime(gps.date, gps.time); 
    display.drawString(0,20,"Lat:");
    display.drawString(30,20,String(gps.location.lat(), 6));
    display.drawString(0,30,"Lng:"); 
    display.drawString(30,30,String(gps.location.lng(), 6)); 
    display.drawString(0,40,"Alt:");
    display.drawString(30,40,String(gps.altitude.meters()) + "m");
    display.display();

    int totalMessages = atoi(totalGPGSVMessages.value());
    int currentMessage = atoi(messageNumber.value());    
    if (totalMessages == currentMessage)
    {
     display.drawString(0,50,"Sat:");
     display.drawString(30,50,String(gps.satellites.value()) + " in use");
     display.display(); 
    }
   }
  }
}

static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
  display.setFont(ArialMT_Plain_10);
  if (!d.isValid())
  {
    display.drawString(0,0,"*****");  // 10 character
    display.display();
  }
  else
  {
  char sz[32];
  sprintf(sz, "%02d/%02d/%02d ", d.year(), d.month(), d.day());
  display.drawString(0,0,String(sz));
  display.display();
  }
  if (!t.isValid())
  {
  display.drawString(60,0,"*****");
  display.display();
  }
  else
  {
  char sz[32];
  sprintf(sz, "%02d:%02d:%02d ", t.hour() + UTC_offset, t.minute(), t.second());
  display.setFont(ArialMT_Plain_16);
  display.drawString(60,0,String(sz));
  display.display();
  display.setFont(ArialMT_Plain_10);
  }
}

06/19/2018

自宅の固定電話をPCで受け管理する(CTI連携)

家の固定電話には、迷惑電話が多くかかってくるので、かかってきた電話番号を読み取って、必要な電話だけを受けるように出来ないものか・・・うまい方法は無いものか?と調べてみた。

「PCで電話を受ける」というキーワードで調べると、
電話をかけてきた人を管理することができるFullfree』というフリーで使えるアプリが、スタンドアロンモードのPCで使える事がわかった。

機能が素晴らしいと思う反面、うさん臭くはないかと心配なため、口コミなどを調べてみたが、問題視するようなものは見当たらなかった。
NTTとナンバーディスプレイ契約がされていれば、CTIシステム(Computer Telephony Integration)
というPCと電話を連動して動作させられる機能がある。

NTTのひかり電話の場合、CTIアダプタが不要らしく、
『Fullfree』をダウンロードして、直ぐに電話とPCを連動させることが無料で出来るらしい。

早速
『Fullfree』をダウンロードし、その機能を確かめてみることにした。


《NTT社のひかり電話の場合は、提供されるルーターに CTIシステム用の機能があるためCTIアダプタなしで Fullfree と接続出来ます。》との説明書きがあるので、まず、自宅の光電話の設定状況を調べてみた。

1)ひかり電話ルーターRT-200KI にブラウザからログイン。
 デフォルト設定は、 http://192.168.1.1/  になっている。
  ユーザー名、パスワードを入れて内線設定を確認してみる。

2)電話設定⇒内線番号一覧を確認してみる。
 拙宅の内線番号は、1~7まで有って、IP端末は1~3が「有効」になっていた。

3)IP端末1の設定内容を確認してみると、MACアドレスは空欄になっている。
 それで、ここの画面で変更することも無いので、窓画面の右上の「X」をクリックして RT-200KI 画面を閉じて、次に
『Fullfree』の設定をする。

4)
Fullfree を使うためには、まずデータベースの作成を行う必要が有る。
 Fullfreeをインストール、起動させてから・・・

デモデータを参照して、データベース用のテーブルの内容は、「問い合わせ」のみを使う事にした。したがって、

 データベースの作成は、
 ①保存場所:
   名前、フォルダ 共、そのまま使い・・・

 ②利用する機能:
   これも、CTIシステムと着信履歴を保存する の両方に☑ ←デフォルトのまま

 ③テーブルの内容:
   問い合わせのみに☑

  これで「OK」をクリック。

5)CTI接続機器の設定
 ①CTI⇒CTI設定 
  メニューから設定画面を開いて、「自動検出」ボタンをクリックする。

 ②ポートとひかりルーターが検出される。
  接続、起動時に自動的に接続するに☑⇒「OK」をクリック

これで設定は終了。

あとは、外部から固定電話にかかってくる電話を待って、設定どおり動くかをチェックしよう。

《その後》 上手くいかないなぁ・・・

CTI設定項目があって、着信ポップアップタグの下方に着信履歴を残す項目がある。
履歴テーブルを明示して設定する必要が有るのに、何もしていなかったのが履歴が残らない原因のようだ。

着信履歴テーブルを『問い合わせ』に設定し、日時フィールドを受付日とした。
これで良いかな?

05/23/2018

大杉谷登山口から大台ヶ原駐車場へ縦走

1 22004年9月の台風21号で大きな被害を受けた三重県大台町の大杉谷登山道の「七ツ釜滝~堂倉滝間の約2.3km区間」は、10年ぶりの2014年に開通して通れるようになった。桃ノ木山の家も、今年(2018年)は4月20日からオープンしている。
先日ブログに登山計画を記載したが、2018年5月16日(水)~17日(木)、大杉谷登山口から大台ヶ原を歩いてきた。事前の11日(金)に、日本気象協会の10日間天気予報で、登山予定の2日間の天候を確認し、必要な予約を全てとった。
既に先日のブログには記載していたと思うが、埼玉県の拙宅を出発して、帰宅するまで実アクセスは、下記のようであった。

アクセスの概要

5月15日 朝、自宅を出発、東京駅八重洲南口 10:00発の高速バス「スーパーライナー55号」で名古屋まで行き(名古屋到着予定時刻は、16:01だが、20分ほど遅れて到着した)、名古屋から16:41発 近鉄線(急行)に乗換し、松阪駅(18:12着)まで移動。
Img_20180515_115444 Img_20180515_115648 Img_20180515_181839
  バスは、名古屋までの途中3回のトイレ休憩(其々10分ほどの休憩時間)があった。
  時間はかかったが、@3000円で名古屋まで行けるのだから・・・


写真左から、乗車したバス(4列座席)。昼食に足柄サービスエリアで購入したお弁当。近鉄松阪駅。


Img_20180515_182051 Img_20180515_182701  駅前のビジネスホテル(僕が使ったのは、エースイン松阪)に宿泊。確かにバスは、ネット情報に有る様に小さく感じたが、全般的には快適に過ごせた。
 ・このホテルでは50歳以上のお客様限定割引プランがあって、シングルルームが@5000円で宿泊できた。ウエルカムドリンクサービスもあり、加えて、カフェテリア方式の朝食を無料で戴ける。
 ・ホテル隣(写真の右側)、南東方向側には、「セブンイレブン松阪駅南店」がある。

 僕は、十分な睡眠がとれないと、翌日の山歩きでは直ぐにバテテしまう。
 松阪駅付近に夜行バスで到着して・・・というプランは成立するが、そのプランは諦めて、登山の前日に現地の近くで宿泊し、十分休養がとれるよう計画した。

Img_20180515_200830 Img_20180515_194919 Img_20180515_195206  この日の夕食は、ホテルから南西方向約40mにある「居酒屋竹の子」で摂った。店の看板には、サラリーマン酒場とも書いてある。酒は翌日の為に控え、カウンター席で軽く食べた。牛肉巻(上の写真(中))は、美味しかった。


5月16日
 朝、ビジネスホテルをチェックアウトし、ホテルの隣にあるコンビニで昼食用のおにぎり・お茶などを購入。松阪駅からJR紀勢本線特急で三瀬谷駅まで行き、
  道の駅おおだいから大杉峡谷登山バス(事前に要予約、@2500円)に乗車して、大杉峡谷登山口まで移動。

Dsc_9663 Dsc_9667 Dsc_9675  松阪駅から三瀬谷までは、JR普通列車でも行けないわけでは無いが、三瀬谷駅に列車が到着する時刻は、10:14であり、登山バスが発車する時刻(10:30)までには、あまり余裕がない。また、駅の改札口から「道の駅おおだい」の駐車場まで少し距離があるため、時間的余裕の持てるJR特急ワイドビュー南紀1号を利用する事にした。(松阪駅発9:16→三瀬谷着9:47、特急券と乗車券で@1230円)

Dsc_9671 Dsc_9675_2 Dsc_9679  道の駅おおだいに登山バスが来たのは、10:10頃だった。
 乗り込むと、乗車用紙のようなものを書かされ、料金@2500円を支払った。
 登山バスが登山口バス停に到着したのは、ほぼ正午近くの11:50頃だった。
 バスは、途中トイレ休憩が1回ある。その場所「大杉谷登山センター」では、警察官も居り、登山センターの従業員から入山届を求められるので、事前に書いて準備しておくのが良い。

Img_20180516_112020 Img_20180516_112030  登山マップは、大杉谷登山センターのホームページにあるものが参考になる。
 詳細な地図は、国土地理院の「ウォッちず」を見て確認するのが良い。僕は、これを印刷して持参した。  




・大杉峡谷登山口から桃ノ木山の家まで約6.5km。休憩時間を含め、僕の脚で4時間2分かかった。
Dsc_9688 Dsc_9705  Dsc_9696大杉峡谷登山口の休憩所で昼食を済ませて、宮川第三発電所(12:12, H=289m)→大日嵓吊橋(12:27)→千訪滝休憩所→猪ヶ淵→平等嵓吊橋(15:03)→桃の木山の家(15:45 到着、ここで宿泊、宿の夕食は、定番のカレーライスとトンカツ。1泊夕食+朝食+お弁当で@10000円)
Dsc_0009 Dsc_0011 Dsc_0017
 お風呂は、木の湯船で、男女別に時間を分けられたが、温かいお湯に入り、汗を流すことが出来た。




Img_20180516_173244 Dsc03461 Dsc_0019左の写真は、夕食のカレーライスとトンカツ。
中の写真は、外から食堂を撮ったもの。
右は朝食。





5月17日
 午前5時半からの朝食を済ませ、山の家で作って貰ったお弁当を持って、6時少し前に桃の木山の家を出発。標準歩行時間で見積もると、12時に日出ヶ岳に到着できれば、大蛇嵓を廻って大台ヶ原駐車場にバス出発時刻までに到着できる。
ラッキーな事に、私の脚でも日出ヶ岳に11時前に到着。お弁当の昼食をとり、大蛇嵓を廻って大台ヶ原駐車場まで約13kmの行程を歩く事ができた。休憩時間を含めて、8時間8分かかった。タフなルートである。
Dsc_0038 Dsc_0051 Dsc_0058 Dsc_0072








Dsc_0086 Dsc_0098 Dsc_0150 Dsc_0241








Dsc_0261 Dsc_0262 Dsc_0268 Dsc_0276








Dsc_0316 Dsc_0323 Dsc_0340 Dsc_0345







  七ツ釜滝(6:19)→隠滝吊橋(7:15)→堂倉吊橋・堂倉滝(7:40)→堂倉避難小屋(8:47)→シャクナゲ坂→シャクナゲ平→日出ヶ岳(H=1695m, 10:46到着、ここで少し早めの昼食。11:11出発)→正木ヶ原・神武天皇碑(12:11)→尾鷲辻→牛石ヶ原(12:12)→大蛇嵓(12:25)→シオカラ谷吊橋(13:10)→大台ヶ原駐車場(H=1590m, 13:45)
Dsc_0416 Dsc_0421 Dsc_0435 Dsc_0476







  大台ヶ原の駐車場から、奈良交通のバス(SUICAカードが使える。@2000円)で近鉄大和上市駅(17:22)まで移動。
  
 近鉄大和上市駅(SUICAカードが使える)から、近鉄吉野線・近鉄橿原線・近鉄奈良線を急行電車で乗り継いで、近鉄奈良駅まで移動。

Img_20180517_201754  近鉄奈良駅周辺で「コインランドリーを探した!」と思って勘違いしていた。奈良駅周辺で歩いて行けそうなコインランドリーは、JR奈良駅に近いところにあり、スマホ片手に奈良駅周辺をうろうろしてしまった。もう少ししっかりと探しておくべきだった。

 JR奈良駅周辺にあるコインランドリー
三条(三条町650)に行き、先ず汚れた登山ウェアを洗濯、次に銭湯「敷島温泉(三条町554)」に行って身体の疲れをとり、高速夜行バスのバスターミナル(20番のりば)の直ぐ傍にある「すき屋近鉄奈良駅前店」で夕食を摂って、

 関東バスの「新宿-奈良・五條線(やまと号)JR奈良駅22:27発(3列席、@5980円)」、近鉄奈良駅側の発車時刻は、22:40発に乗車し、新宿バスタまで移動(車中泊、車内にトイレがあるので、途中の降車は無し)を利用し→埼玉の拙宅へ。

 近鉄奈良駅側のバス停「20番のりば」の傍には、「奈良ラインハウス1F 定期観光バス案内所」があるので、バスの到着時間まで過すことができる。

・3泊4日(内、夜行バス車中1泊)、もう何年も前から行きたいと思っていた場所で、ようやく夢がかなった。タフなルートではあったが、自然が綺麗で、楽しい旅行だった。ヒルの心配をしていたが、晴れの天候が暫く続いていたこともあり、被害に会う事はなかった。また機会があれば、是非行って見たい場所である。
・二日目、一緒に歩いて下さった方には、大変お世話になりました。挫折しそうになった際も歩く元気を貰って、当初の希望通り「大蛇嵓」まで行くことが出来たのは、本当に有り難かった。
ありがとうございました。この場を借りて御礼申し上げます。

PS.登山道通行止め、山小屋の代金について 誤記がありましたので訂正しました。(2018/05/29) 

Arduino NANO を使ってEthernet Cable Checker

Arduino_nano_ethernet_cable_checker LANの調子がおかしいので、ArduinoでEthernet の ケーブルチェッカーを作って、調べてみた。
青色のLANケーブル(ストレートケーブル)は僕が作ったもので、カシメ処理に問題があり、信号が正しく届かなかったようだ。白色のLANケーブルは市販品で、信号の問題が無いもの。信号線の不具合は、外観を見ただけでは、不具合があるように見えない。簡単に確認が出来て良かった。
下に掲載した写真では、1枚のブレッドボードの中に2つの回路を置いたが、電源を引かなければならない等の問題は無いので、左の絵のように、其々別のブレッドボード上に置けば、LANケーブルが長くモジュラージャックが離れた場所にあってもチェックができる。
僕がチェックした問題のあるLANケーブル(ストレートタイプ)では、4,5番のLEDが同時点灯し、6番のLEDが消えるという表示になった。市販品のLANケーブルでは、LEDが順番に点灯して行き、そのような表示にはならなかった。


使った部品など

 下記2),3)は手持ちの中に無かったため、Amazonで購入。 その他は、保有品の中から活用
1)Arduino NANO x1個
4)抵抗100Ω 1/4W  x8個
5)LED x8個
6)ジャンパーケーブル
7)ブレッドボード
8)検査用のLANストレートケーブル

Img_20180521_175021 Img_20180521_174957















参考にしたブログなど
  僕は、ブレッドボードの中で完結させたかったので、Arduino NANOを使い、抵抗値は、保有品の中から適当なものを選んだ。
  スケッチは、ほぼそのまま利用させて戴いたが、このブログは自分のメモでもあるので、添付しておく。

《スケッチ》
#define VERBOSE

char straight[8] = {2, 3, 4, 5, 6, 7, 8, 9};
char cross[8] = {4, 7, 2, 5, 6, 3, 8, 9};

void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(12, INPUT); // Straight (normal) cable or cross cable
  pinMode(13, OUTPUT); // Control LED
#ifdef VERBOSE
  Serial.begin(9600);
#endif
}

void loop() {
  if (digitalRead(12) == LOW) { // Cross cable
#ifdef VERBOSE
    Serial.println("Cross cable");
#endif
    for (char n = 0;n < 8;n++) {
#ifdef VERBOSE
      Serial.print(n+1, DEC);
      Serial.print(": line ");
      Serial.print(cross[n]-1, DEC);
      Serial.print(" (pin ");
      Serial.print(cross[n], DEC);
      Serial.println(")");
#endif
      PulseOut(cross[n], 1000);
      PulseOut(13, 50);
    }
  } else { // Straight (normal) cable
#ifdef VERBOSE
    Serial.println("Straight cable");
#endif
    for (char n = 0;n < 8;n++) {
 #ifdef VERBOSE
      Serial.print(n+1, DEC);
      Serial.print(": line ");
      Serial.print(straight[n]-1, DEC);
      Serial.print(" (pin ");
      Serial.print(straight[n], DEC);
      Serial.println(")");
#endif
      PulseOut(straight[n], 1000);
      PulseOut(13, 50);
    }
  }
}

void PulseOut(char pin, int ms)
{
  digitalWrite(pin, HIGH);
  delay(ms);
  digitalWrite(pin, LOW);
}

05/09/2018

YHDC SCT-013-000 CT とArduinoで家庭内の電流を測定する

YHDC 非侵襲性AC電流センサSCT-013-000 CT  とArduinoを使って、電力量を測定する。(非侵襲性AC電流センサ は、Amazon(Hommy販売から @465円で購入))

参考にしたブログとスケッチ
1) Current monitoring with non-invasive sensor and arduino
2) SCT-013 – Sensor de Corrente Alternada com Arduino
3) openenergymonitor/EmonLib

YHDC SCT-013-000 CTの電流範囲は0〜100 Aです。
  VRefは、アナログ基準電圧で、ここでは、VRef = 5V

  Cmaxは、ADCの分解能で、ここでは、Cmax = 1024

  Rtは、電圧変換器比で、部品仕様から下記のように計算される。
     Rt = 100 A  ÷ 50 mA = 2000


  測定電流値 I = √2 * i(rms_current)= 1.414 * 100A = 141.4A

  センサーに流れる電流値 i は、次式で計算される。
       i =
測定電流値 I ÷ 電圧変換器比 Rt
        = 141.1A  ÷ 2000
         = 0.0707A


Arduinoは、電圧(0V〜5V)しか扱えないため、この電流を許容電圧に変換する必要がある。そのため、回路に負荷抵抗Rを追加する。

  電流は、0を中心に変動するので、
  センサ最大電圧は、Max_accepted_voltage(=5V) / 2 = 2.5V とすると、

       Rb(負荷抵抗)= U(センサ電圧)/ I(センサ電流)= 2.5V / 0.0707A =35.4Ω
  理想的な負荷抵抗Rb は 35.4Ωだが、そのような抵抗は無いので、
  33Ω(実際に使った抵抗の測定値は、テスターで計測した 32.8Ω)の抵抗を使用した。
図中、2個の抵抗(10kΩは、エネルギー消費を避けるため)、コンデンサ(10μF)は、交流電流が抵抗をバイパスする代替パス。

プログラム中に見られる数字は、
  counts = センサ入力ピンの電圧(=センサを通る二次電流×負荷抵抗値Rb) ÷ VRef × Cmax
 
  Isupply = counts ÷ ADCの分解能 Cmax × アナログ基準電圧VRef× 電流校正定数
      = Irms (←スケッチでの表示)
 
  ここに、電流校正定数 = Rt ÷ Rb
 
  YHDC SCT-013-000 CT センサと、テスターで計測した負荷抵抗を使い、
     電流校正定数 = Rt ÷ Rb
                = 2000 ÷ 32.8Ω = 60.976

計算は、オープンライブラリーの EnergyMonitor emon1 を利用したので、上記計算はそのライブラリーを使うための定数の理解と計算するためのステップである。

使った部品を含め、計測誤差の大きい回路構成なので、計測電流が流れていない時も0.3Aほどの電流が流れていると表示する。電流値がある値以下の場合には、スケッチの中にある様に、ゼロと表示するようにもできるが・・・。部品は安価に入手できるので、自宅で使っている電気(電流)の傾向を見るのには良いかもしれない。

《Fritzingと写真》
Sct013fritzing Img_20180417_200519SCT013のFritzingパーツがWeb上に見つからないので、僕はInkscapeの機能を使って、Fritzingに貼り付けられるよう、左図にある部品図を作った。この時参考にしたのは、Youtubeの『Fritzing Part Creation - Chapter9 - Using Photo and PDF』である。


《スケッチ》
// Current sensor SCT013-100A/50mA
#include "EmonLib.h"
#include <Wire.h>
#include <U8glib.h>

EnergyMonitor emon1;

//Oled表示設定
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);

String str;
int characterlen;
double Irms = 0;  // the current measured

void draw()
{
  //ディスプレイのグラフィックスコマンドはここに配置する
  u8g.drawRFrame(0, 16, 128, 48, 4);
  u8g.drawRFrame(0, 0, 128, 16, 4);
  u8g.setFont(u8g_font_8x13B);
  u8g.setColorIndex(0);
  u8g.setColorIndex(1);
  u8g.drawStr( 40, 13, "Current");
  u8g.drawStr( 103, 60, "[A]");
  u8g.setFont(u8g_font_fur25);
  str = String(Irms);
  characterlen = str.length();
  u8g.setPrintPos(60 - (characterlen * 10), 53);
  u8g.print(Irms,3);
}

void setup(void)
{
  Serial.begin(9600);
  Serial.println("Current measurements value by SCT013"); 
  Serial.println("");
  Serial.println("");
  
// Theoretical CT Sensor Calibration = CT Ratio / Burden resistance
// ⇒ (100A / 0.05A) / 32.8 Ohms = 60.976
  emon1.current(1, 60.976);   // Current: inputpin No, calibration
    
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    u8g.setColorIndex(255);     // white
  }
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
    u8g.setColorIndex(3);         // max intensity
  }
  else if ( u8g.getMode() == U8G_MODE_BW ) {
    u8g.setColorIndex(1);         // pixel on
  }
  else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
    u8g.setHiColorByRGB(255, 255, 255);
  }
}

void loop(void)
{
  Irms = emon1.calcIrms(1480);  // 1480 is no_of_samples
//  if(Irms < 1.0 ) Irms = Irms -0.3; // 表示誤差分を取り除く見かけの処理
//  if(Irms < 0.20) Irms = 0.0;
  
  Serial.print("  Sensor 1: ");
  Serial.print("  Irms=");
  Serial.print(Irms,3);  // print to the third decimal place
  Serial.print("[A]");
  Serial.print("  Power=");
  Serial.print(Irms*100.0);  // Apparent power (100 is the Voltage)
  Serial.println("[W]");
  
  //画面上で描画ルーチンを呼び出し
  u8g.firstPage();
  do
  {
    draw();
  }
  while ( u8g.nextPage() );
  delay(150);
}

計画:大杉谷から大台ヶ原へ

昨年は計画していただけだったが、2018年の今年、梅雨が始まる前にどうしても行きたいので、もう一度計画を練り直してみることにした。

天気は、日本気象協会の『10日間天気予報』から、適当な日程を調べてみた。
この天気情報から、今月(5月)中に行くのなら、13日週かなぁ(20日の週の天気は未だ分からない)。15~18日なら天気は好天で繋がりそうだ。

前回の計画では、夜行バスで熊野辺りへアクセスする事と考えていたが、睡眠不足の状態で山歩きは辛い年齢になってきた。しかも、夜行バスで行くと『道の駅奥伊勢おおだい』に到着する時刻は、午前5時10分頃で、登山バスの出発時刻10:30までどうやって時間を潰すのか・・・仮眠する場所を探すのも難しいかもしれない・・・

そのため、前日、東京から三重県津市までアクセスし、津の駅前のビジネスホテルで一泊し、翌日ゆっくりと三瀬谷へアクセスする計画が、僕の身体の為には良さそうだ。


《検討》

1)先ず、津駅から三瀬谷までのアクセス
 出発 8:46 津より JR紀勢本線 伊勢市行
     9:35 多気 着 乗換
     9:43 多気より JR紀勢本線 新宮行
 到着 10:14 三瀬谷着

 料金 970円

2)次に、大杉峡谷登山バス(エスパール交通)
 時刻表を確認してみた。
 出発日の3日前までに予約しなければならない。

 「ツアー名:登山口行コース」

  『道の駅奥伊勢おおだい』10:30発。
  『奥伊勢フォレストピア』10:45発(予約がない場合は止まりません)
  『大杉谷登山センター』 トイレ休憩 登山届提出
  『大杉峡谷登山口』12:00到着 
    ツアー料金 1名 2,500円 最少催行人数4名より となっている・・・
    4人以下なら決行できないか・・・という心配はある。

3)大杉谷登山口からのコース
1日目: 歩行時間 5時間30分(ヤマレコより)

  大杉谷登山口→宮川第三発電所→大日嵓→千訪滝休憩所→猪ヶ淵→平等嵓→桃の木小屋(1泊:翌日の弁当を注文)

 2日目: 歩行時間 6時間40分(ヤマレコより)

 桃の木小屋→庄野ヶ浜→光滝→堂倉小屋→大台ヶ原山(1695m)→展望台分岐→大台ヶ原駐車場

4)大台ヶ原発 大和上市駅行バス(奈良交通バス)

  最終の定期運行バスは、 15:30 (平日、土休日共)となっている。
  大和上市駅到着予定時間は、 平日 17:21、土休日 17:21

5)大和上市駅周辺で夕食を摂るのは難しいかもしれないので、帰宅ルートから考えて、近鉄奈良駅までアクセスすることにする。

  大和上市駅 17:41発→橿原神宮前で京都行きに乗換→大和西大寺で奈良線に乗換→近鉄奈良駅 19:25着  料金は850円

 ここなら、夕食の食事に困ることは無いだろう。

 夕食の前後、駅の北側に銭湯『大西湯』があるので、汗を流してから、夜行バスで帰宅する計画。


町内の『山好きの友人』を誘ってみようかと思うが、駄目なら一人で決行しよう!

03/23/2018

いつも迷ってしまうWindows10のシステムプロパティへの入り方

Windows8以降、「システムのプロパティ」に入ろうとして、いつも迷ってしまう。

ここで、
「システムのプロパティ」への入り方をメモ書きしておこう。

手順は、コントロールパネル⇒システムとセキュリティ⇒システム⇒システムの詳細 と辿ればいいのだが・・・

1)「システムとセキュリティ」のメニューがある「コントロールパネル」への入り方
 下記①~③どれでもOK

 ①スタート ⇒ Windows システムツール ⇒ コントロールパネル と辿ると
  窓の左上に「システムとセキュリティ」がある。

 ②スタートの右側の検索ボックスに「コントロールパネル」と入力する。

 ③エクスプローラーを開いて⇒窓画面左のフォルダーを下に辿ると・・・
  「コントロールパネル」が有る筈。これをクリックすると「コントロールパネル」のホーム画面になる。

2)システムとセキュリティをクリックし ⇒ システムを選んで クリックする

3)システムの画面左にある 4つのメニューの一番下に「システムの詳細設定」がある。
 これをクリックして、

4)システムのプロパティの窓が開く。

 例えば、Pathの設定は、この窓の下にある「環境変数(N)...」のボタンをクリックして入る。


15" MacBook Pro Early 2008 model

15" MacBook Pro Early 2008 model を持っている。PCを購入後、暫くしてから 10.6の Snow Leopardにアップグレードしたい思いながらも、Windows OSに慣れ親しんでいる僕にとっては、MacOSは使いづらくイライラすることが多いので、LANケーブルは繋いで、充電状態にし、放置状態だった。

最近、屋内LANケーブルを再設置したので、信号のチェックツールとして使ってみた。アクセス反応も悪くないし、まだ使えるなぁ・・・とOSのバージョンを確認すると、10.9.5 Mavericks (2014/9頃のもの)になっていた。

自分ではOSのアップグレードはやらずにいたと思ったが・・・いつの間にか購入時点より上がっている。自分の記憶も飛んでいるので、どうしてアップグレードしているのか、今となっては分からない。
このPCには、Mac用 Microsoft Officeも購入し、インストールしてあるので、まだまだ色々な用途に使える。

それで、このPCのOSのアップグレードが何処まで可能か? 調べてみた。
現時点のOS は、10.13.1 High Sierra で、 15" MacBook Pro Early 2008 model (10.9.5 Mavericks) が対応しているのは、10.11 El Capitan までと分かった。

段階を追ったアップグレードを考えると、先ず、10.10 Yosemite にアップしたいと思ったが、ユーザーに Yosemite のダウンロード履歴が無いと、このアップグレードを受け付けてくれない(表示さえ出ない)。

Img_20180317_232220 Img_20180318_070420 諦めきれずネット上を調べると、10.11 El Capitan は、現時点でもOSのダウンロードが出来る。先ず
El Capitandownload を進めておき、Mavericks から El Capitan への2段階アップグレードが可能なのか?を調べてみた。


私の保有機種とは違うが、このOSアップグレードを実践し、成功している事例をネットで確認できた。

OSのダウンロードとインストールには、
(PCを見守っているだけだが・・・)かなりの時間を要した。

15" MacBook Pro Early 2008 model のOSを、 El Capitan 10.11.6 (2016/7/18 リリース)の状態までアップグレード出来た。

もうしばらく使えそうだ・・・

03/10/2018

RaspberryPiへのNode-RED Dashboard Install

RaspberryPiへのNode-RED Dashboard Install をネットで調べると、『Node-Red Dashboard (Raspberry Pi)』が見つかった。そこには dashboard をインストールする手順が書かれているので、それに習ってやってみよう。

6番までの手順で書かれているが、3番までは確実に終わっている。4番は Linux Mint で実行しているが Raspberry Pi3 では、未だ行っていない。それで、LXTerminalを開いて、4番から実行してみる。

4.まず npm をインストールする。
  sudo apt-get install npm

ここで、下記のようなエラーが発生
インストールすることができないパッケージがありました。おそらく、あり得ない状況を要求したか、(不安定版ディストリビューションを使用しているのであれば) 必要なパッケージがまだ作成されていなかったり Incoming から移動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません: 』とある。

それで、手順の最初に戻って、update から進めてみることにした。

  sudo apt-get update

次に、Node-REDを再インストールしたところ、また次のエラーが表示された。
以下のパッケージには満たせない依存関係があります: nodered : 依存: nodejs-legacy (>= 4)
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

そのため、Node.js と Node-REDを、次のコマンドで最新版にアップデートすることにした。LXTerminal から次のコマンドを打ち込んだ。

  update-nodejs-and-nodered

この処理には、かなり時間が掛かりそうだが、しようがない。

10分ほどで処理が終了した。この処理を行った事で、npmも最新版になっているので、

第5番目の項目にある『「dashboard node」をインストール』から、インストール作業を再開することにした。下記のコマンドを打ち込んで・・・

 cd ~/.node-red
 sudo npm install node-red-dashboard

Warning メッセージは出たが、インストールされたようなので、
LXTerminal から「 node-red  」と打ち込んで起動させ、

次に Chromiumブラウザを起動させて、
  アドレスバーに「 http://localhost:1880 」と打ち込んで、Node-RED を起動させ、パレットなど設定されているか、画面を確認してみる。

うまく行った! 

Raspberry Pi3 Node-RED に Dashboard がインストールできた。

Linux Mint18.1 にNode-REDをInstallする

RaspberryPi3上ではなく、Linux Mint18.1上でNode-REDを使ってみたくなったので、Installしてみた。

あお日記(Node-REDのインストール)』を参考にさせていただいた。

Node-RED User Group Japan」にも『
Note: Node-REDのインストールにnpm 1.1を使用しないでください。次のコマンドで最新のnpm 2.xにバージョンアップしてください: sudo npm install -g npm@2.xと記載されているように、npm のバージョンが古いとエラーを吐くようなので、ご注意。

《Node-RED起動までの手順》

1)まず指示通り、Terminalから上記のコマンド
を打ち込んで、

$ sudo npm install -g npm@2.x

あるいは、下記のように入力しても良いようだ

$ sudo npm install npm@latest -g

  npm は、 npm  v2.15.12  にバジョンアップした。

2)次に、Terminalから下記のように打ち込んで・・・

$ sudo npm install -g node-red

Install できたようなので、

3)Terminal から下記コマンドを実行して

$ sudo node-red

このあと、sudoからユーザーパスワードを要求されたが・・・入力すると起動した。

4)この状態で、ウェブブラウザ「Chromium」を起動し、アドレスバーに『localhost:1880』と打ち込んで・・・Node-RED が起動できた。


僕は、パレットに「dashboard」を追加したいので、ブラウザから開いたNode-REDの「デプロイ」右側にあるハンバーガーボタンをクリックして、メニューから「パレットの管理」を選択クリックして、ノードを追加のタグをクリックする。
ノードを検索のところに「dashboard」と入力し、『node-red-dashboard』を探す。
スクロールバーを動かして
node-red-dashboard を見つけたら『ノードを追加』のボタンをクリックしてパレットに「dashboard」を追加する。
linuxMint 18.1では、問題なく「dashboard」をインストールできたが、RaspberryPi3 ではエラーが出てしまい、インストールできない!


Windows10 にNodeRED(Electron版) を install する手順

Install の手順が極めて簡単で、パレット上に多くのノードが展開されている オープンソースライブラリElectron のnode-red-pack がお勧めだと思う。dashboard などの Node も、後から追加する必要もなく使うことが出来る。

1) 先ず Electron のNode-RED を開いて、

   
electron-node-red-pack.Setup.0.17.5.exe   を download する。(2018/3/10現在)

   ネットの通信速度が遅いので、
download には かなりの時間を要する。

2) Downloadしたファイルを実行し、幾つかの承認項目をクリックしながら進めてゆけば、Install できる。

   Windows のデスクトップ画面に Node-RED 実行用アイコン(electron-node-red-pack
)が作られるので、Node-REDは、このアイコンをクリックすれば起動できる。

Electronnodered左図は、Node-RED(
electron-node-red-pack) を起動させた画面表示。

パレットには、標準の NodeREDよりも多くのNode が表示される。また、画面右には、dashboard タグもある。

03/09/2018

RaspberryPi3 でNode-RED始め方 メモ

日本語入力の続きになるが、Node-REDを使うときの自分用のメモとして書き留めておく。

1)RaspberryPi3のOSには、Raspbian Stretchを使っているので、Chromiumはデフォルトで使うことができる。
2)また、Raspbianには、標準でNode.jsとNode-REDがインストールされているので、ターミナル画面から
 sudo node-red  一発で起動できる筈だが、

 念の為、
Node.jsとNode-REDを最新版にアップデートしておくことにする。
 
最新版へのアップデートコマンドは、sudoなし「-」の前にスペースなしで打ち込む。

 update-nodejs-and-nodered

これで、Node-REDの起動準備ができた。

3)ターミナル画面で、
 ① sudo node-red  と打ち込んで起動したところで、

 ②続けてChromiumを起動させて、アドレスに
 『http://localhost:1880』と入力してアクセスすれば、Node-RED画面が立ち上がる。


ところで、私はハンバーガーメニューの中に何故か「パレットの設定」が見つからなくて再度Raspbianからインストールするはめになったのだが、先程メニューを確認すると「パレットの設定」が表示されているので、これで安心して進められる。


02/27/2018

RaspberryPi3での日本語入力

トランジスタ技術2018年3月号の特集「AI電脳製作」が面白いので、持っているRaspberry Pi3を使って、その特集記事の内容に沿って、いろいろ試してみる事にした。

トラ技の付属基板に部品を実装して、AIセンサ・フュージョンを完成させ、スピーカボックスを作って、ボックスの上にRaspberryPiとAIセンサフュージョン基板を組み合わせた基板を載せて・・・、RaspberryPi3のGPIO拡張コネクタには、電源、スピーカ、HDMIモニタ、USBキーボード、USBマウス、LANケーブルを接続した。

Img_20180211_093414 Img_20180211_095437格好良く「上記のように出来た」と言いたかったところだが、実はトラ技の付属基板用部品キットをネットで購入する際に、選択すべきものを間違えて、部品が装着された完成品を購入してしまった。出費は増えて、自作の楽しみも損なってしまったが、製作する時間が短縮したこともあり、ソフトウェア開発の部分でいろいろ試して楽しむことにし、失敗して落ち込んだ気持ちを前向きに切り替えた。




Img_20180227_111316 Img_20180227_111443 電源は、安価な中国製5V2A仕様のものを使い、電灯線から電力供給するように工作した。
ペーパークラフトでスピーカーボックスを作る方法は、トラ技68-69頁に記載があるが、僕は少々の木材片が手元にあったので、それを活かしてスピーカボックスを作った。
しかし、手持ちの工具だけで木材を大きくくり貫く加工は難しく、あまり綺麗には出来なかった。また、ケース内にRaspberryPi3のシステムを収納したかったが、寸法の見積もりが甘く、オーディオケーブルなどがケースから飛び出してしまった。
ケース等に付いては、今回の経験を活かして、再度、もう少し見栄えの良いものにしたいと思っている。

トラ技に書かれた順に作業を進め、110頁辺りまで進めてみたが、日本語入力(ローマ字漢字変換)が上手くいかず、日本語文字が入力出来ないので中断。

それで、RaspberryPi3に、Raspbian Stretch をインストールして、先ず日本語入力は出来るようにするための手順を、下記のように確認したので書留めておく。

RaspberryPi3に僕が繋いだ周辺機器は、英語配列のUSBキーボード(ARCHISS RETRO AS-KBPD04/TBK)、USB有線マウス(MO-VET-WDLOBK-01EI001337)

《 手順 》
1)Raspbiaは日本のMirrorからdownloadするのがスピードが早い。下記の日本のサイトの何処かから、最新のRaspbianを選んでDownloadしておく。

MIRROR DEB/DEB-SRC ADDRESS
JAIST http://ftp.jaist.ac.jp/raspbian
(http|rsync)://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian
WIDE Project Tsukuba NOC http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian/
rsync://ftp.tsukuba.wide.ad.jp/raspbian/raspbian/
Yamagata University http://ftp.yz.yamagata-u.ac.jp/pub/linux/raspbian/raspbian/

自分のPCの、何処か適当な場所にダウンロードしたら、7-Zipなどで展開し、Raspbianの imgファイル(ディスクイメージファイル)を準備しておく。

2)次に、
MicroSDカード8GB以上の容量のものを、SDFormatterでフォーマット

3)
Win32DiskImagerを使ってmicroSDカードにimgを書き込む。microSDカードの残り容量部分は何も処理はしない。
Win32diskimage_raspbian





4)RaspberryPi3に3)のmicroSDカードを挿入し、
HDMIモニタ、USBキーボード、USBマウス、LANケーブルを接続し、電源を入れて起動する。

5)起動直後の画面
Img_20180227_150424 Img_20180227_150454・画面左は、起動直後の画面
・画面右は、LX Terminalを起動させたところ







6)Raspi-configの設定
  $ sudo raspi-config
  ①先ず、セキュリティ確保の為、Passwordを変更しておくのがよい
Img_20180227_151535

  







 ②次に、
    
言語の設定
   4 Localization Options を選択 ⇒ <Select>⇒「
I1 Change Locale 」を選択
Img_20180227_151702 Img_20180227_152222








Img_20180227_152338 Img_20180227_152802次に、
ja_JP.ECU-JP ECU-JP
ja_JP.UTF-8 UTF-8
を選んで、次の画面では以降の設定で文字化けを避けるために、
en_GB.UTF-8   を選択しておく。




  ③タイムゾーンの設定
Img_20180227_153640 Img_20180227_153700 Img_20180227_153853

ここで左のように設定して於いた筈なのに、後の確認では設定が変わっていない・・・(OKボタンを押すのを忘れたか?)




  ④キーボードの設定
Img_20180227_153944 Img_20180227_154007 Img_20180227_154103








Img_20180227_154128 Img_20180227_154151 Img_20180227_154209









7)日本語化

  ①日本語フォントのインストール
  $ sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname

Img_20180227_154506 Img_20180227_154535 Img_20180227_154602








 ②日本語入力の設定
   ここでは、Mozc(Google日本語入力のオープンソース版)をインストールすることにした。
   $ sudo apt-get install fcitx-mozc
Img_20180227_154755 Img_20180227_154810 Img_20180227_155207




ここで、reboot する事。


 リブートした後、
 ③入力切替の設定で
Img_20180227_160007画面の右上のキーボードアイコンを右クリックしてメニューを表示させて、configureを選んでクリック、







Global Configを開いて、漢字変換時の入/退 時のキー設定を登録する。
左側の「Ctrl+Space」は、それでいいので、右側の「Empty」を
「Ctrl+Space」に設定する。

Img_20180227_160524 Img_20180227_160545 Img_20180227_160556








ここで、Input Method も確認してみると・・・
Img_20180227_180314 Img_20180227_180328左の画面で「OKボタン」をクリックすると、








Img_20180227_180357ここで「Yes」をクリックして、








Img_20180227_180415fcitx のボタンをONにして、「OK」をクリックしたあと、
この画面を閉じて、







ここで、もう一度画面右上のキーボードアイコン右クリックメニューから「Configure」をクリックして・・・(先ほど、確認しておけばよかったのかもしれないが)

Locale関連設定を日本にしておかないといけないので、・・・ 設定画面を開くと英国(GB)なっているので修正する。既に設定していた筈なのに、確定させるのを忘れたのかも・・・
Img_20180227_180542 Img_20180227_182646 Img_20180227_182707









Timezone(Asia,Tokyo)、Keyboard(僕が使用しているのはUS仕様のキーボード)、WiFi Country(JP Japan)についても開いてみて、要すれば修正する。
Img_20180227_182732 Img_20180227_182819 Img_20180227_182850









入力・修正が終わったら、「Restart」する。

Reatartによって、メニューも日本語表示になっている筈だ。
画面右上のキーボードアイコンをマウスで右クリックし、メニューから「設定」を選んでクリックし、入力メソッドの設定画面を表示させる。

入力メソッドの設定画面の左下の「+」をクリックすると「入力メソッドの追加」画面が表示され、その中に『Mozc』があるので、これを選択して入力メソッド中に追加してやる。
英語(半角英数入力)のコマンドを打ち込み、途中で日本語入力『Mozc』に切り替える場合には、この通りの順に配置する必要が有る。逆の順で配置すると、日本語入力が先行するので、使いづらくなる。ご注意!

Img_20180227_202742 Img_20180227_202800 Img_20180227_202810 Img_20180227_202821







アクセサリから「Text Editor」を開いて、文字入力画面で「Ctrl+Space」と操作すると、日本語文字入力になる。
Img_20180227_202852 Img_20180227_202936








以上で日本語変換の設定は終了。

《注意点》その後、Node-REDを楽しんでいて、何かを「やっちまった」らしく元の状態に復帰できなくなったので、再度インストールすることにした。ところが、上記に書いたように、英語キーボード設定で何度行っても「2」のシフトで「@」キーが打てない。
原因は、キーボードのミス設定なので、再度キーボードを設定する。
1)sudo raspi-config
設定画面が開いたら、
2)4  Localization Options  を選択

3)次の画面で
  I3  Change Keyboard Layout を選択
4)キーボードは、英語キーボードなので、
  Generic-key PC  を選択 <OK>
5)Keyboard layout は、
  English(US)   を選択(これ以外に余計なことが記載されていないものを選ぶ)
6)次の選択では、Altキーがスペースキーの両側にあるタイプなので、
  Both Alt key  を選択
7)次のメニューでは
  キーにCaps Lock があるので、
  Caps Lock  を選択 
8)Control + Alt + Backspace でXサーバーを閉じられるように <Yes> を選択
9)最初のメニュー画面に戻ったので、<Finish>を選択して終了する。
以上でキーボードの設定は終了。

の筈なのに、rebootすると、キーボードは英国(EU)になっている????? なぜ?

画面の右上のキーボードアイコンをマウスで右
クリックして、メニューの中から
Conigure Current Input Method  を選択し、クリックする。

開いた窓の一番上には Keyboard - English (UK)  が居座っていて、変更しても変わらないことがわかった。
①そのため、
Keyboard - English (UK)  をハイライト選択して、この窓の一番下の「ー(マイナス)」ボタンをクリックして削除し、
②次に「+(プラス)」ボタンをクリックして、
Keyboard - English (US) を探して「OK」ボタンをクリックして窓の中に追加する。
③追加しただけでは、Mozc(日本語選択)の下側に位置するので、上向きの矢印キーを使って Keyboard - English (US) を一番上にする。
④窓の右上の「x」をクリックして、これで設定終了。

02/11/2018

Windows10 ユーザーアカウント制御されるアプリの自動起動方法

毎日定刻にPC(Windows10)を起動させ、その際に、アプリも自動起動させたい。ある設定した時刻になったら、PCをシャットダウンさせるという事をやりたかったのだが、ようやく上手く設定が出来たようなので、忘れないうちにここにメモをしておく。

僕が使っているPCの構成(monitorの仕様、BIOS設定方法など)の問題も有ったように思うので、そのシステムの概要をここに記載しておく。

《追記:2018/02/11》 自動起動させるProgramを変更したので、ここに、その際に行った情報を記載しておく。Program「UC.exe」はアンインストールして、機能が高いと思われる(Security Eyeという名前のソフト)Se.exeに変更してしまった。PCの起動とシャットダウンに関する基本的な部分は残っている所があるので、それを活かしながら変更を行った。後述の部分で、追記したところは
《追》を記載。


PCの概要

 Motherboard: Z97N-WiFi  LGA1150用 Mini-iTX (Gigabyte製)
 CPU: intel Core i5 4590 @3.30GHz BOX(Haswell Refresh)
 Memory: CORSAIR VENGEANCE 16.0GB
 Graphics: 内臓IGFX
 HardDisk: PLEXTOR 
 PC Case: Cooler Master  Elite 130 Cube
 電源: Enermax ELT500AWT  500W仕様
 OS: Windows10 Pro 64bit版

周辺装置

 Monitor: LG FLATRON IPS206T-PN  (DVI接続)
 Keyboard: FILCO Excellio FKB109EXJB
 Mouse: Microsoft  Mobile Optical Mouse (有線)

調べてみると、自動起動はBIOSの「RTCによる電源ON」から行い、シャットダウンは「タスクスケジューラ」から行えば良いらしい。

問題点は、
1)PC起動時にDelキーを押しても、BIOS画面を開くことが出来なかったこと。
2)BIOS画面を開くことが出来るように変更後、PCを起動後に、監視カメラ用アプリが連動して上手く立ち上がらなかったこと。
3)監視カメラ用のアプリは立ち上がったものの、ユーザーアカウント制御のために、アプリがそこで止まってしまうこと。
上記の問題は、下記のように設定して、問題が解消し、監視カメラ用アプリは自動的に起動した。

1)の問題は、僕が使っている自作PCを製作した際に選択したレガッシーBIOSの問題かもしれないし、あるいは、使っているモニターのPCとの接続仕様によるものかもしれない。
しかし、BIOSが表示できないという問題の原因は、どちらなのかを切り分ける事が出来ていない。

1.BIOS画面を表示するために、
 いろいろやっている間に、PCの起動ディスク(C:ドライブ)に余計な書き込みをしてしまい、PCが起動できなくなった。しかし、このような問題は起きてしまうものなので、事前にHDD(D:)の中には起動用のバックアップを作り、DVDにも起動用ディスクを作っておいた。

作業場所の問題があり、周辺機器(モニター、キーボード、マウス)を外して、このPCだけを別の部屋に移動させて設定作業を行った。

 ①PCからSSDを取り外して、別のPCに組み入れ、ここでSSDのパーティションを外し、初期状態にした。
 ②初期状態に戻したSSDを、再び元のPCに組み込み、マザーボード上のCMOSジャンパーピンをショートさせて、データをクリアし、周辺機器を接続して、電源ON。
 ③これで、電源ON直後に「Del」キーを押すことで、BIOS画面に入ることができた。

2.BIOS画面での設定
 BIOS画面を開いて、システム電源を計画的にONにする設定を行う。
 ①Power Management (電力管理) 画面で、Resume by Alarm(アラームで再開する)に入りを有効にして、
  Wake up hour と Wake up minute を設定した。
  僕は、午前4時30分にPCを起動させるようにしたいので、hourの入力は「4」を、minuteの入力は「30」とした。

  毎日同じ時刻に起動なので、Wake up day(開始日) は 「0」のままである。
  また、秒まで拘らないので、Wake up second(秒で起動) も 「0」のままである。

 ②予期せぬ停電などで、AC電源が失われた場合の電源復帰もここで設定しておく。
  僕は、Memory を選択し、AC電源が戻った際に、システムが停電する前の状態と同じ状態となるようにした。
  
 ③キーボードやマウスによる電源ONは不要なので、Disabledを選択した。

 ④「Save & Exit」を選択し、保存して終了! これで、PCの起動設定は出来たはずだ。
  
 ⑤設定の確認のため、ここで行っている他の設定準備が終わり、しばらく時間を置いた後に、
 例えば、10数分後にこのPCが自動起動するように、前述のResume by Alarmの時刻設定を行って、この状態を「Save & Exit」で保存しておくことにする。

 この確認作業が終われば、再びBIOS画面で起動させる時間を設定し直す必要がある。
 忘れないようにしないと・・・。

3.Windows10のパスワードなし起動
 僕は、「Windows 10で起動時のパスワード入力を省略する方法
」のURLを参考にさせていただいた。

4.スタートアップにアプリを登録する
 PCが起動したときに連動して自動起動させたいアプリは、スタートアップに入れれば良いらしい。
 ①アプリをスタートアップに登録するためには、登録するアプリをデスクトップ画面に仮置きする。
 注記)このとき、アプリのプロパティを開き、
  「互換性」のタグをクリックして、一番下にある「管理者としてこのプログラムを実行する」にチェックを入れてはいけない。これを行うと、アプリが起動しなくなる可能性が高い。

 ②Windowsボタンをマウス右クリックし、「ファイル名を指定して実行」メニューを選択する。
 ③開いた窓の中の枠内に 「shell:startup」 と入力し、「OK」をクリックする。

 ④新たに、エクスプローラーのスタートアップフォルダーが表示される。

  これまでに、アプリのスタートアップ登録をしていなければ、このフォルダーの中は空のはずだ。

 ⑤このスタートアップフォルダーに、デスクトップに仮置きしておいたアプリを、ドラックアンドドロップで移動させる。

 ⑥PCを再起動させる。

 この作業が完了すれば、監視カメラ用アプリはPC起動直後に起動するだろうと思っていた。
 アプリは起動したが、起動後『ユーザーアカウント制御(UAC)』という機能が働いて、「このアプリがPCに変更を加えることを許可しますか?」と聞いてくる! ここで「はい」と答える必要がないようにする必要がある。そうしないと、シャットダウンの時刻までアプリは止まったままである。

 それほど単純ではなかった。
まだ他の項目を設定する必要がある。

この課題を解消するためには、

5.まず、タスク スケジューラでタスクを作成する必要がある。
タスクスケジューラの起動は、タスクバーの「検索フォーム」に「task」と打ち込むと、表示される筈。メニューから「タスク スケジューラ」を選んでクリックする。

①画面右側の操作メニューから「タスクの作成・・・」を選び、

②開いた「タスクの作成」の窓の 全般タグ に、名前、説明を記入する。
 僕は、名前に「MotionDetectCamera」と記載し、説明は空欄とした。
 《追》今回はソフトウェアの名前「Security Eye」とし、
 ・ユーザーがログオンしているときのみ実行する・・・ボタンをON
 ・最上位の特権で実行する・・・・・・・・・・・・・にチェックを入れる。
 ・構成の枠内は、・・・・・・・・・・・・・・・・・Windows10を選択する。
 まだOKボタンはクリックしない。 

③操作タグ をクリックし、
 新規をクリックして新しい操作を作る。
 プログラムの開始を選んで、

 プログラム/スクリプト欄 には、
「参照」をクリックして、アプリが格納されている場所(例えば、C:\Program Files(x86)\Security Eye\) からプログラム (Se.exe) を探し場所を確認する。
 そして「C:\Program」とだけ入力する。《追》分割して入力するのだが、それらは内部で結合される。

 また、引数欄には、「Files(x86)\Security Eye\Se.exe」と入力する。
 僕は、開始(オプション)欄に 「/rl highest」と入力した。
 《追》「r」の次の文字は、半角縦線「|」である。

 OKをクリックして戻る。

④トリガータグ をクリックし、
 新規をクリック
 《追》タスクの開始で 「ログオン時」を選択し、
  次に、「特定のユーザーのボタン」を選択し、OKをクリックする。

⑤条件タグ をクリックし、
 入っているチェックをすべて外す。
 《追》「電源」の項目は、全てチェックを入れた。
 設定後、OKをクリックする。

注記)アプリケーションプログラム(ここでは”Se.exe”)は、ID、パスワードの入力無しで起動できるように設定しておくこと。

《追》これでもまだ「最上位の特権で実行する」が選択されているが、未だ『ユーザーアカウント制御(UAC)』で止められてしまう。

6.そのためユーザーアカウント制御の設定を変更する
先ず、モニター画面左下隅タスクバーの「検索フォーム」に「uac」と入力して、

「ユーザーアカウント制御設定の変更」をクリックし、「
ユーザーアカウント制御の設定」窓画面で、4段階の3段階目に設定してOKをクリックする。


7.最後に、PCをシャットダウンする設定を行う。

先程4.で設定したが、タスク スケジューラで、シャットダウン用のタスクを作成する必要がある。
タスク スケジューラの起動は、タスクバーの「検索フォーム」に「task」と打ち込むと、表示される筈。メニューから「タスク スケジューラ」を選んでクリックし起動させる。

①操作のタブをクリックし、今度は「基本タスクの作成」をクリックする。

②名前は、「自動シャットダウン」と付け、次へのボタンをクリックした。

③次の画面タスクトリガーでは、毎日のボタンを選択し、次へをクリックし、
  毎日の 開始時刻を設定する。
    僕は、当日の深夜「23:55:00」に設定し、次へのボタンをクリック。

  《追》タスクスケジューラライブラリーで、左右方向で中央列の上側の画面の中から
     「自動シャットダウン(自分が前回設定したタスク名)」を探し、マウス右クリック、
     メニュー画面からプロパティを選択し、クリックすると、編集画面が表示される。
     編集ボタンをクリックして、
      スケジュールに従うとし、毎日行うタスクの時間を編集する。

④操作の画面では、「プログラムの開始」ボタンを選択し、次へ。

  プログラム/スクリプトには、
   「 shutdown 」
  引数の追加には、
   「 /s /f 」
  と入力し、次へ。

⑤完了画面で、「完了」ボタンをクリックする。

以上で、全ての設定作業が完了したので、PCを再起動、又はシャットダウンした後PCの電源ボタンを押してみる・・・・・アプリは立ち上がったかな?

別のPCで確認した結果 この設定で無事立ち上がった!

アプリプログラムが上手く立ち上がらないので、ここでの設定に問題があるのかと思って色々調べた結果、アプリプログラムには、32bit版と64bit版の2種類があり、PCが64bit OSだったので64bit版のアプリを選んでインストールして確認しようとしていたが、何度やってもアプリの起動がおかしいので、32bit版にインストールし直して確認してみた。
電源ON後、ユーザーアカウント制御(UAC)も表示されずにパスし、アプリ(UC.exe)も起動し、画面表示された。

«Arduino NANO, DHT11 を使い、湿度によりPower制御する(その2)

July 2018
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

Recent Trackbacks

無料ブログはココログ