PC and PC troubles

08/15/2018

M5Stack と専用GPS Function Moduleを使い $GPGSVデータを読んでみた

ハードウェアを、M5Stackに変更して、1つ前の記事で Wemos Lolin32でやった事「$GPGSVのデータのみを表示する」をやってみた

使用した部品は、
M5Stack Basic   (実は、2台所有している)
②M5Stack用GPS Function Module V2 (商品コード:M5STACK-GPS-02
)
        旧型 GPS Function Module

  GPS外部アンテナ付き

Gpgsv_m5stack Wemos Lolin32に対して、M5StackでSketchを変更する(追加する)のは、たったの 2行(2行目と11行目)だけである。

ボードで、”M5Stack-Core-ESP32” を選択するのを忘れないようにすること。

それでやってみたら・・・ 

A fatal error occurred: MD5 of file does not match data in flash!
 
というエラーが表示される。

何か間違ったことをしてしまったのだろうかとSketchを何度も見直し、エラーについて Google先生の力を借りて問題解決しようと試みたが・・・対策方法が良く分からずお手上げ状態。





それで、もしかすると・・・と、もう1台のM5Stackでやってみたら・・・
下図のように問題無く、書込みもパス!
M5stack_pass M5stack_gpgsv
受信結果を右側の図のように表示させることが出来た。

AE-GYSFDMAXBとほぼ同じ場所に置いて比較してみたが、AE-GYSFDMAXBの方が衛星の捕捉数が多いようだ。



Wemos Lolin32の場合、ケースを自作する必要があるが、
M5Stackは、コンパクトに纏められた商品なので、外に持ち歩くには、これが便利だなぁ。






《Sketch》
// Search $GPGSV   forM5Stack 
#include <M5Stack.h>
  HardwareSerial GPSRaw(2);  // ESP32 UART2 GPIO-16 ( RXD2 ) --- GPS TXD
  static const uint32_t GPSBaud = 9600;
  char GPSRc;
  int  GPSRi;
  String Buffer;
  
void setup() {
  Serial.begin(115200);
  M5.begin();
// GPS TXD-pin should be connected to Lolin32 Pin-16
   GPSRaw.begin(GPSBaud, SERIAL_8N1, 16, 17);
}

void loop() {
  if (GPSRaw.available())  searchGSV();
}

void searchGSV(){
  GPSRc = GPSRaw.read(); // read 1 character
  GPSRi = int(GPSRc);
  if ( GPSRi == 36 ) {   // <= if the 1st character read is '$' 
    Buffer = "$";
    while ( GPSRi != 42 ) {
      char GPSRc = GPSRaw.read();
      GPSRi = int(GPSRc);
      if( GPSRi < 128 ) Buffer += GPSRc;   // add one character to the buffer
    }
    // if the buffer includes "GPGSV" at the beginning it will be zero
    // check the first six character of the buffer
    // Serial.print does not display anything until "$GPGSV" is found   
       if ( Buffer.indexOf("$GPGSV") == 0 )   Serial.println(Buffer);
  }
}

Wemos Lolin32にAE-GYSFDMAXBを接続して$GPGSVデータを読んでみた

天頂衛星が捕捉出来るのかが、とても気になるので、ハードウェアは、Wemos Lolin32(以前書き込んだと同じ方法)とし、$GPGSVのデータのみを表示するようにSketchを新たに起こしてみた

使用した部品は、
Wemos Lolin32 ESP32 OLED display付き
②GPS module  AE-GYSFDMAXB
  「日本の準天頂衛星システム(QZSS)『みちびき』3機受信(193,194,195)に対応とある」
③ブレッドボード  サンハヤト SAD-101 ニューブレッドボード
その他、ジャンパーケーブル

ここで込み入った処理を行うと、データを取りこぼしてしまうので、
$GPGSVのセンテンスを表示するだけのsketchとした。
このsketchの応用例として、31行目の”$GPGSV”を他のセンテンスに変更すれば、そのセンテンスのデータのみを表示することが出来るだろうと思う。

Gpgsv 仮組したボードに、このsketchを組込み、窓際の室内で作動させた結果は、左の図のようになった。これを見ると、残念ながら天頂衛星は捕捉出来ていない。


sketchは、「$」で始まり、「*」で終わるセンテンスをピックアップしているので、処理の都合上、チェックサム部分は無視している。






Img_20180815_091233 Img_20180815_091421 尚、Wemos Lolin32は、ボードの幅が広く、これまで使っていたブレッドボードでは、ジャンパーピンを挿すスペースが無く、扱いにくい為、先日Amazonから「サンハヤトSAD-101 ニューブレッドボード」@505円のブレッドボードを購入し、それを使って回路を仮組してみた。

《Sketch》

// Search $GPGSV   for Wemos Lolin32 
  HardwareSerial GPSRaw(2);  // ESP32 UART2 GPIO-16 ( RXD2 ) --- GPS TXD
  static const uint32_t GPSBaud = 9600;
  char GPSRc;
  int  GPSRi;
  String Buffer;
  
void setup() {
  Serial.begin(115200);
// GPS TXD-pin should be connected to Lolin32 Pin-16
   GPSRaw.begin(GPSBaud, SERIAL_8N1, 16, 17);
}

void loop() {
  if (GPSRaw.available())  searchGSV();
}

void searchGSV(){
  GPSRc = GPSRaw.read(); // read 1 character
  GPSRi = int(GPSRc);
  if ( GPSRi == 36 ) {   // <= if the 1st character read is '$' 
    Buffer = "$";
    while ( GPSRi != 42 ) {
      char GPSRc = GPSRaw.read();
      GPSRi = int(GPSRc);
      if( GPSRi < 128 ) Buffer += GPSRc;   // add one character to the buffer
    }
    // if the buffer includes "GPGSV" at the beginning it will be zero
    // check the first six character of the buffer
    // Serial.print does not display anything until "$GPGSV" is found   
       if ( Buffer.indexOf("$GPGSV") == 0 )   Serial.println(Buffer);
  }
}


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

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);
}

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 ではエラーが出てしまい、インストールできない!


より以前の記事一覧

September 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            

Recent Trackbacks

無料ブログはココログ