保護リレー交換

リレーが届いたので、交換完了。

音の違いはおそらく交換前後を二種類並べて聞き比べない限りは分かりません。

 

admin

オーディオアンプのリレー交換

半導体アンプの出力段のリレー(ポップアップノイズ対策とDC印加・短絡対策)は使っていくうちに必ず劣化していきますが、接触抵抗がありえないぐらいの値(1Ω近く)になっていたので交換することにした。

問題はおそらく該当のリレーは生産収束になっていること。

ネットを探し回って幸い秋月電子で使えるものが見つかったのでオーダー。

https://akizukidenshi.com/catalog/g/gP-16554/

寿命部品なので、この際なので2セット分購入しました。接触抵抗って概ね100mΩ以下が普通です。

 

admin

Arduino carをAPモードで使えるようにした

Wi-Fi環境がない場所でも使えるようにするには、よくあるようにAPモードにするしかないですが、

https://www.arduino.cc/en/Guide/MKRWiFi1010/web-server-ap-mode

のコードを流用して、wi-fiモードからAPモードに変更しました。デフォルトのAPモードのIPアドレスは192.168.4.1になります。

wi-fi通信も一つのタスクで、タスクモジュールを入れ替えしただけなので、全体のロジックには変更ありません。

#include <WiFiNINA.h>

char ssid_ap[] = "a_car_ap";        // your network SSID (name)
char pass_ap[] = "coderdojo";    // your network password (use for WPA, or use as key for WEP)
//int keyIndex = 0;                // your network key Index number (needed only for WEP)

int led =  LED_BUILTIN;
int status = WL_IDLE_STATUS;
WiFiServer server(80);

void printWiFiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print where to go in a browser:
  Serial.print("To see this page in action, open a browser to http://");
  Serial.println(ip);

}

//
void init_wifi_ap() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  //while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  //}

  Serial.println("Access Point Web Server");

  pinMode(led, OUTPUT);      // set the LED pin mode

  // check for the WiFi module:
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
    Serial.println("Please upgrade the firmware");
  }

  // print the network name (SSID);
  Serial.print("Creating access point named: ");
  Serial.println(ssid_ap);

  // Create open network. Change this line if you want to create an WEP network:
  status = WiFi.beginAP(ssid_ap, pass_ap);
  if (status != WL_AP_LISTENING) {
    Serial.println("Creating access point failed");
    // don't continue
    while (true);
  }

  // wait 10 seconds for connection:
  delay(10000);

  // start the web server on port 80
  server.begin();

  // you're connected now, so print out the status
  printWiFiStatus();
}

//
int web_server_ap() {
  // compare the previous status to the current status
  if(status != WiFi.status()) {
    // it has changed update the variable
    status = WiFi.status();

    if(status == WL_AP_CONNECTED) {
      // a device has connected to the AP
      Serial.println("Device connected to AP");
    } else {
      // a device has disconnected from the AP, and we are back in listening mode
      Serial.println("Device disconnected from AP");
    }
  }

  WiFiClient client = server.available();   // listen for incoming clients

  int g=9;                                  // run or halt return

  if (client) {                             // if you get a client,
    Serial.println("new client");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            // the content of the HTTP response follows the header:
            client.print("Click here turn the car on
");
            client.print("Click here turn the car off
");

            // The HTTP response ends with another blank line:
            client.println();
            // break out of the while loop:
            break;
          }
          else {      // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        }
        else if (c != '\r') {    // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check to see if the client request was "GET /H" or "GET /L":
        if (currentLine.endsWith("GET /H")) {
          g = 1;
          //digitalWrite(led, HIGH);               // GET /H turns the LED on
        }
        if (currentLine.endsWith("GET /L")) {
          g = 0;
          //digitalWrite(led, LOW);                // GET /L turns the LED off
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
  return g;
}

全体のソースコードは、

https://github.com/chateight/arduino

にあります。

既存のwi-fiモードもそのままコードを残していますが、グローバル変数が重複するので、wifi_server.inoは二行(line 30, 31)をコメントアウトしないといけません。

似たような機能を記述するときには、名前空間あるいはクラスを使って分離した方が良いでしょう。

P.S. USBでパソコンに接続されていないときに、シリアルのオープン待ちが終了しない(つまり単独では動かない)のでコメントアウト。

 

admin

 

 

Apple silicon対応状況

アプリがネーティブ対応ができてるかどうかを見てみた。

以下のサイトからチェッカーをダウンロード、

https://www.imobie.com/m1-app-checker/

自分のmacをスキャンすると、

対応状況はまだまだの感じ。intelアプリでもrosetta2で動かせるとは言うけれども、マイクラEEは動かなかったし、vmware fusionは今は未対応だから全般的には未だの感あり。

 

admin

c++の仕様が巨大化していく理由

ほぼひと月前から初めて、半分消化しましたが、

https://isehara-3lv.sakura.ne.jp/blog/2022/02/15/通読してみることにした/

なぜc++が習得が難しいと言われているかを自分なりに理解したこと。

 

<ハードウェアを扱う機能と抽象的なオブジェクト指向が合体しているから>

コードの品質と生産性を高めるためにはオブジェクト指向が必須だけれども、そこにハード資源を効果的使うという要件も必要条件になっているから、仕様が複雑化。具体的な例で言えば、例えばポインターの概念がオブジェクト指向の中にも拡張されているからと言えるのではないか。もちろんガーベージコレクションなどの概念も無くてリソース管理が全てプログラマの責任というのは、これはc++に限らずcでもハードウェアを扱う言語の本質的かつ必要条件でもあるけれども。

 

<モダンナイズはされて来ている>

特に最近の言語仕様の拡張で、コンテナクラスを標準で使うなど現代的になって来ていると思う。しかし行き着くところはcの殻とc++の殻がそれぞれ独立することはできないからお互いに融合した言語仕様のままであることは変わらないように思う。

 

極端にハードリソースの限られるデバイス、OS開発などではc++以外に代替え手段のない言語だから、この先も複雑化していくことは間違い無いんじゃないかと言えます。

 

admin

 

聴き流しとは言え、

オーディオの編成替えで気づいたこと。プリメインアンプの表示に見慣れない表示があって何かと思って調べると、BI-AMPモードになってた。つまり左チャネルの音でモノラルで聴いてたということ。

BGMとはいえ、今までかなりの長い期間モノラル(変則的な)だったから、もしかしたら何でもいいか?と言われるとそんなことは無い。

何かのはずみで系の右左入れ違うこともあるだろうから、garagebandで左チャネルと右チャネル用に音源作って、何か変更した時はチェックできるようにしました。

 

admin

Unit V2カメラにsshログオン

Linuxで動いているので、当然sshも使えます。

ユーザー権限では色々情報ありますが、root権限では以下のような長ったらしいパスワード入れれば良さそうです。

https://notenoughtech.com/home-automation/m5stack-unitv2/

10.254.239.1はavahiが動いていればunitv2.pyで問題ありません。



<user login>

ssh m5stack@10.254.239.1 
//user: m5stack
//pwd: 12345678

------------------------------------

<file>

unitv2% df
Filesystem           1K-blocks      Used Available Use% Mounted on
ubi:rootfs              419980    297980    122000  71% /
devtmpfs                 57344         0     57344   0% /dev
tmpfs                    58368         0     58368   0% /dev/shm
tmpfs                    58368        92     58276   0% /tmp
tmpfs                    58368        44     58324   0% /run
cgroup                   58368         0     58368   0% /sys/fs/cgroup
/dev/mmcblk0p1        15549952        32  15549920   0% /media/sdcard


<root pw>

7d219bec161177ba75689e71edc1835422b87be17bf92c3ff527b35052bf7d1f

unitv2# who
root            pts/0           00:00   Jan  1 00:07:12  10.254.239.104
unitv2# 


<python>

unitv2# python --version
Python 3.8.6


<network>

unitv2# ifconfig
br0       Link encap:Ethernet  HWaddr 00:30:1B:BA:02:DB  
          inet addr:10.254.239.1  Bcast:10.254.239.255  Mask:255.255.255.0

ログインして幾つかのコマンドを実行してみましたが、外付けのsdカードには何も入っていないようですね。何に使うんだろう?

 

admin

 

 

M5Stack UnitV2 AI カメラ(SSD202D)つないでみる

いつもの通り、switch scienceで購入。これは宅急便(送料650円)扱いだけれども、8,000円以上は送料無料とかで支払い一万円は超えず。

 

macに接続、最初Mac OSでは機能有効にするとインターネット使えなくなった(Linuxでも同じ)ですが、ドライバ不要のLinux(VMware Ubuntu)で使うのが良さそう。

デフォルトのアプリで物体認識してみる。写真にカップ写っているからかdinning tableと認識されてます。

まずは、疎通確認だけですね。

<ドキュメント>

https://docs.m5stack.com/en/unit/unitv2?id=description

https://docs.m5stack.com/en/quick_start/unitv2/v_training

 

admin

NASで使うSSDの寿命

SSDと言ってもいろんなグレードがあるとは思うけれども、最も一般的な低価格品を使ってますが、NAS(Qnap TS-230)の管理画面に予測寿命というのが表示されています。

デスクの2番は元々ノートパソコンで使っていて、始まりは94%と表示されいましたが、最近93%に落ちました。1番はCrucialの新品1TBで、こちらはまだ100%表示。NASはバックアップにしか使ってないから、毎日せいぜい2時間ぐらいでほぼ半年ちょっとの使用だから、累計で400時間ぐらいの電源オン時間。このペース(時間に対してリニアに減少なら)ならばNASのライフを5年ぐらいで考えれば全く問題ないことになります。24時間運転だと状況は変わってきますが。

ちなみに、SSDの温度上昇は環境温度プラス10℃と言ったところで、HDDだともっと過酷になるでしょう。

 

admin

timemachineで旧ファイル削除発生

qnapのtimemeachineバックアップで、ようやく旧ファイルの削除発生。残り領域20GB切ったあたりで、旧ファイルの削除発生して容量が40GBぐらいまで増えてます。

 

admin