2018年11月15日木曜日

SCPI言語を話す測定器をPythonでコントロールしたい

HPがHP-IBを作って、測定器を自動制御する規格を広めました。ヤフオクで購入できるディジタル・マルチメータ、オシロスコープ、スペアナ、電源など、ほとんどがGPIBを備えています。
 GPIBのケーブルだけでも高価です。
 PCのGPIBボードも高価です。
 Agilent 82357BはGPIBをUSBに変換してくれます。1万円ちょっとで購入できます。

visa
 GPIBは物理層です。USBやLAN(TCP/IP)、RS-232Cも物理層です。VXIとかいうバスも物理層です。
 これらをまとめて扱えるのがvisaです。話す言語はSCPIです。GPIBの基本的なコマンド以外に、機器独自なコマンドが用意されています。

Python
 世の中で一番学びたい言語がPythonなんだそうです。たぶん、IT系の人たちでしょう。
 Pythonにはvisaのライブラリがあるので、importするだけで通信ができます。もちろん条件はあります。
 RS-232Cは、WindowsならCOMドライバが必要です。UNIX系なら/dev/ttyUSB0とかができていると通信できるかもしれません。接続自体はUSBの口ですが。
 USBは測定器がUSBTMCの規格をサポートしていると、そしてGPIBのドライバが入っていると通信できます。GPIBのドライバは、KeysightとNIが用意しています。どちらも無償で利用できます。
 LANは条件はないようです。が、Windowsではつながりますが、ラズパイだと見つけられないとか、がおこりますが。
 LANはソケットでつなぐこともできます。

連載、まだ途中です。


(1) DMM 34461A-① LAN ソケット通信
(2) DMM 34461A-② USB usbtmc
(3) 電源 E3631    USB(GPIB) visa
(4) DMM 34461A-③ USB/LAN visa

(5) DMM VOAC7602 USB-シリアル変換 visa

(6) DMM 2000 ① RS-232C
(7) 温度計おんどとり ソケット
(番外編 ) 小型PCのセットアップ
(8) DMM 2000 ② visa(GPIB)

2018年9月9日日曜日

SONY SPRESENSEでハイレゾを再生する

SPRESENSEは、Arduino IDEのスケッチを使ってハイレゾ音源を再生できます。7/31発売当時のドキュメントは分量はとても多いのですが、とても不親切な書き方で、プログラム(ライブラリのC++のソース)を読んで自分で使い方を考えろ的な姿勢が強く出ていました。9/1ごろにArduino 1.0.2になって、ドキュメントも普通の表現になりました。
 メイン・ボード本体にD級アンプが搭載されていますが、デフォルトの出力であるヘッドホン端子は、出力にでっかいCを入れなくて済むという何やらわからない性能のヘッドホン・アンプがつながっています。
 ヘッドホン・アンプの手前にあるD級アンプ出力は、レベルの下げるための470Ωの抵抗がシリーズに入っています。内蔵のボリュームを最大値の0dBにしてもスピーカからはかすかな音しか出ません。
 解説によると、470Ωと小容量のコンデンサのパーツをLと大きめのCに変更することで、スピーカから音が出ます。しかし、たぶん、無理な作業です。電動のはんだ取り器を使えば、八つのパーツを安全に取り出せますが、新しいCをはんだ付けするのは、ほとんど不可能です。10セットあったら1セットぐらい成功するかもしれません。



 ポータブル機器にスピーカを接続する際、出力にローパス・フィルタを入れる設計が多いです。しかし、普通のスピーカ・ケーブルを数mのばして普通のスピーカをつなげるとき、フィルタは現実的には不要と考えられます。
 という根拠の薄い理由で、470Ωを0Ωにするだけで済ませます。
 はんだゴテの先をきれいにし、はんだをちょっとだけつけ、フラックスが飛びきらないうちに、チップ抵抗のはんだ面(もちろん上面)にはんだをわずかに盛ります。0.3mm程度のはんだメッキ線を押し付けて抵抗をショートします。

 推定500mW弱のアンプだと思います。96dBを超えるスピーカなら、オーケストラも十分再生できます。
 9/1ごろの更新で、ハイレゾは192kHz/24ビットだけと書かれました。48kHz/24ビットも再生できますが96kHzは再生できません。
(2018/10)1.1.0になって96kHzが対応しました。ただ、スピーカからの音がとても小さくなって実用上聞こえなくなりました。私のだけかも

 playerのスケッチの変更点です。再生するwavファイルはAUDIOフォルダの中に入れておきます。

theAudio->setRenderingClockMode(AS_CLKMODE_HIRES);

theAudio->initPlayer(AudioClass::Player0, AS_CODECTYPE_WAV, "/mnt/sd0/BIN", AS_SAMPLINGRATE_192000,AS_BITLENGTH_24,AS_CHANNEL_STEREO);
myFile = theSD.open("AUDIO/192.wav");
効率90dB以下のスピーカならば、ボリュームは0でOKです。 爆音は出ません。ボリューム値を読み込んで音量を変更できますが、あんまり役に立っていません。


 で、一番重要な音ですが、最上の音楽が聴けますです。

SDメモリの音源を四つまで連続に再生するスケッチ
 SDメモリに入っている音源を全部再生できるはずなのですが、5曲目からは再生できないです。
 音源は192kHz/24ビット決め打ちにしてあります。
 ボリュームは、A0端子の電圧を読み取って値を決めています。ボリュームを付けないときは、-100とかの値を入れておいてください。

/*
    player.ino - Simple sound player example application
    Copyright 2018 Sony Semiconductor Solutions Corporation

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#include <Audio.h>
AudioClass *theAudio;
File myFile;
//#include <SDHCI.h>
SDClass SD;
#define  volumePin  A0
int volumeValue = 0;

/**
   @brief Setup audio player to play mp3 file

   Set output device to speaker <br>
   Set main player to decode stereo mp3. Stream sample rate is set to "auto detect" <br>
   System directory "/mnt/sd0/BIN" will be searched for MP3 decoder (MP3DEC file)
   Open "Sound.mp3" file <br>
   Set master volume to -16.0 dB
*/
void setup() {
  Serial.begin(115200);
  // start audio system
  theAudio = AudioClass::getInstance();
  theAudio->begin();
  Serial.println("initialization Audio Library");
    /* Set output device to speaker */
    theAudio->setRenderingClockMode(AS_CLKMODE_HIRES);
    theAudio->setPlayerMode(AS_SETPLAYER_OUTPUTDEVICE_SPHP);//AS_SETPLAYER_OUTPUTDEVICE_I2SOUTPUT
     //theAudio->setPlayerMode(AS_SETPLAYER_OUTPUTDEVICE_I2SOUTPUT);
                 /*
                 * Set main player to decode stereo mp3. Stream sample rate is set to "auto detect"
                 * Search for MP3 decoder in " / mnt / sd0 / BIN" directory
                 */
     err_t err = theAudio->initPlayer(AudioClass::Player0, AS_CODECTYPE_WAV, "/mnt/sd0/BIN", AS_SAMPLINGRATE_192000, AS_BITLENGTH_24,AS_CHANNEL_STEREO);
  Serial.println("setup AS_SAMPLINGRATE_192000");
                 /* Verify player initialize */
    if (err != AUDIOLIB_ECODE_OK) {
      printf("Player0 initialize error\n");
      exit(1);
  }
}

void loop() {
  Serial.println("---LOOP-start -------------------------------------");
  File root = SD.open("/AUDIO");
  while (true)  { // files pickup
  /* Open file placed on SD card */
        File entry = root.openNextFile();

    if (!entry) {
//      Serial.println("**nomorefiles**");
    }
 
  Serial.println("opened " + String( (entry.name())) );
  myFile = SD.open(entry.name());
   /* Verify file open */
  if (!myFile) {
     printf("File open error\n");
    exit(1);
  }
  printf("Open! % d\n",myFile);

  /* Send first frames to be decoded */
  int err = theAudio->writeFrames(AudioClass::Player0, myFile);
  if (err != AUDIOLIB_ECODE_OK) {
    printf("File Read Error! = % d\n",err);
    myFile.close();
    exit(1);
  }

  /* Main volume set to -16.0 dB */
  volumeValue = analogRead(volumePin) / 4 ;
    printf("Volume = % d\n",volumeValue);
    theAudio->setVolume(-1*(250-volumeValue));
  theAudio->startPlayer(AudioClass::Player0);

  Serial.print("Play!!!!!!!!!!!!\n");

while (1) {  // until read fifo? end
  /* Send new frames to decode in a loop until file ends */
  err = theAudio->writeFrames(AudioClass::Player0, myFile);
/*  Tell when player file ends */
  if (err == AUDIOLIB_ECODE_FILEEND) {
      printf("Main player File End!\n");
  }
/* Show error code from player and stop */
  if (err) {
//      printf("Main player error code: % d\n", err);
      goto stop_player;
  }
  usleep(30000);
  /* Don't go further and continue play */
 continue;

stop_player:
  delay(1);
      theAudio->stopPlayer(AudioClass::Player0);
      myFile.close();
//      exit(1);
        break;
}
  }
delay(100);
}

2018年7月31日火曜日

SONY SPRESENSE でLチカ

このマイコン・ボードは何て読むのでしょうか。ソニー・プレセンスかな?
Arduino IDEが用意されているので、とりあえず、動かしてみることができます。GPSやオーディオ機能は特別にライブラリが用意されています。ライブラリはもしかしたら、複数のコアを利用するような設計になっているかもしれません。

 すんなり、開発ソフトは用意できました。
  SpresenseでLチカから始める (1) Lチカは簡単か

  ハイレゾの再生

 べっとRTOSのNuttXが用意されています。

NuttXのインストール 未完成。それに、9/1ごろにだいぶ書き直されたので、当初の記述はだいぶ異なる。10/26の更新で問題点のある表記がほとんどクリアされた。が、.configファイルが2個も入れ忘れているように見えるし、1個Kconfigに文法ミスがあってコンパイルが通らない。

Ubuntu 16.04 LTS 64bit で検索してダウンロードする。WindowsでrufusでUSBメモリに書き込む。
 PC(XEON  E5 2658 V3 12コア 2.0GHz、DDR4-8Gバイト、クアドラ4000、ASRock X99 Taichi)のUSBスロットに差し込み、電源を入れて、F11でブート・メニューを出し、UEFI-USBメモリを選択してブートする。
 Ubuntuを言われたとおりにインストールし、終了したら、USBメモリを抜いて再起動。
 セオリどおりterminalから、
sudo apt-get update
sudo apt-get upgrade -y
を実行。システムが壊れているというメッセージが出るが無視する。
必要なツールをインストールする。
sudo apt install git
sudo apt install make gperf flex bison libncurses-dev
sudo apt install ruby

sudo apt-get install git gperf libncurses5-dev flex bison gcc-arm-none-eabi

その後、
git clone -n https://patacongo@bitbucket.org/nuttx/tools.git tools
cd tools
git config core.autocrlf false
git checkout -b 891510d2534287afef6b5c90a375f94442a7e94d
cd kconfig-frontends/
./configure
make
sudo make install
sudo ldconfig

たぶん、うまくいかない。

すでに何とかといわれる。
sudo adduser  dialout

cd spresense/sdk
python3 tools/config.py --kernel release
python3 tools/config.py examples/hello
make buildkernel
make

sudo tools/flash.sh -c /dev/ttyUSB0 nuttx.spk

???どこかで実行するが失敗する? 直接zipをダウンロードしてフォルダにコピーする?
git clone --recursive git@github.com:sonydevworld/spresense.git
これも直接落としてきたかも
sonydevworld/spresense-nuttx

ターミナル・ソフト
 書き込みが終了したら、新しいterminalを開き、
export LANG=en_US
minicom -D /dev/ttyUSB0 -b 115200 -s


gpio
 nshのterminalをクローズ。
 .configをnanoで開く。
CONFIG_SYSTEM_GPIO=y
CONFIG_SYSTEM_GPIO_STATUS=y
をコピペしてCtrl-O,CTRL-Xで書き込む。

make buildkernel
make
sudo tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
 terminalを新たに開く。



2018年6月23日土曜日

Makerご用達 万能測定器ADALM2000

2017年4月に発表が行われましたが、その後、オープンソースの測定ソフトScopyの開発が遅れたのかもしくはAnalog Discoveryと機能が被るので、わざと遅らせたのか不明ですが、2018年6月に入手ができるようになりました。
 発表当時の予価は99ドルでしたが、149ドルに価格は変更されています。基板設計も途中であったようで、当初のケース(ADALM-PLUTO)には入らなくなり、準備中のようです。
 iioのドライバ類はADALM-PLUTOと同じものを利用します。
 ADALM1000という学習用測定器にはAliceという解説が豊富な測定ソフトがありました。これも2018年の2月にADALM2000用が用意されましたが、6月現在、うまく動きません。

これ一つで測定すべてをカバーするADALM2000

(1) セットアップ
(2) オシロスコープでOPアンプのフルスイングを見る
(3) ネットワーク・アナライザでアンプの帯域を見る-1 CRフィルタ
(4) ネットワーク・アナライザでアンプの帯域を見る-2 反転アンプ

2018年5月30日水曜日

Dell Edge Gateway 3001を使ってみた

2018年5月現在、日本では販売開始されていないDell Edge Gateway 3001です。面白そうなので、マウザーで購入しました。
A-D/DAが使えないです。こまった。I2C/SPIバイスは外に出ていません。

番外編 Dell Edge Gateway 3001は素人でも使えるのか その1 I/Oの確認
番外編 Dell Edge Gateway 3001は素人でも使えるのか その2 外部に出ているGPIOポート-1

2018年4月27日金曜日

ST Microelectronicsの距離を測るセンサ

ST Microelectronicsの  VL6180X VL53L0X VL53L1X をArduinoで利用する話が完結しました。

距離を正確に測る
 赤外線VL6180X
 レーザーVL53L0X
 レーザーVL53L1X


2018年3月26日月曜日

2018年3月14日に発売されたRaspberry Pi 3 Model B+

 Raspberry Pi 3 Model B+は、前のモデルから少しクロックが速くなり、CPU(SOC)表面が金属になりました。表面温度を測ってみると、前のモデルより温度が低いようです。

http://www.denshi.club/pc/raspi/raspberry-pi-3-model-b.html




 2018-3-13版のOSから、無線を無効にするデバイス・ドライバが用意されたので、有線LANでRaspberry Pi 3 Model B+を使うことができます。
 Raspberry Pi 3 Model B、ZERO-Wには外部アンテナ接続ができるランドが用意されていたのですが、このモデルでは廃止になったようです。