2018年11月18日日曜日

NI-VISA install

CentOSのセットアップ
 ラズパイでGPIBのドライバが簡単にインストールできないことが、この小型PCの導入の目的でした。NI社のドライバはCentOSに対応していると書かれています。ラズパイDebian系のディストリビューションがメインです。CentOSのコードはありますが、とても古いです。
 この小型PCにCentOSの最新版をインストールします。ダウンロードのページに入って、三つある中でDVD ISOを選びました。ダウンロードしたら、書き込みツールrufusでUSBメモリにISOファイルを書き込みます。
  http://mirror.fairway.ne.jp/centos/7.5.1804/isos/x86_64/CentOS-7-x86_64-DVD-1804.iso

BIOSでインストール・メディアを選ぶ

 ブート時にF10を押すとブート・デバイスの選択画面に入れます。USBメモリを選択します。
  インストール先はSSDですが、すでにWindowsがインストールされているので、選択してDoneを押すと、空きがないとのメニューが出るので、再選択を選び、どこかのパーティションを選んで全削除を実行します。
 KDEのGUI、開発ツールを追加してインストールしました。

 リブート後に、ネットワークを有効にしてリブートすれば、インストールは終わります。

 アイコンFavoritesを選んだ時にSearchの欄にterminalを入れ、出てきたKonsoleを選びます。Xtermではありません。こちらはコピペができません。

NI-VISAのインストール step1
 Webブラウザを起動し、NI-VISA Linuxで検索し、
 NI-VISA-17.0.0.iso Downloadsに落としてきます。ユーザ登録が必要です。ファイル名をクリックしてもダウンロードしてきません。画面下にクッキーのアラートが出ています。リンクをクリックして出てくるページで、OKボタンが出ることがあるので、押します。戻ってきてもダウンロードできないときは、ファイル名を選んで別のタブを開くを選び、そのタブに移るとダウンロードできることがあります。
 Konsoleに入り、
mkdir NI
sudo mount -o loop Downloads/NI-VISA-17.0.0.iso NI
cd NI
sudo ./INSTALL
を実行します。3回yを入れるところがあります。17.0.0f1というバージョンが今日の時点でインストールされています。
エラーが出てアボートします。
error: Failed dependencies:
libstdc++.so.6 is needed by ni-pal-17.0.0.49152-0+f0.i386
libstdc++.so.6 is needed by ni-orb-nikalmod-17.0.0.49152-0+f0.x86_64
avahi is needed by nisyscfgi-17.0.0-f0.x86_64
Error installing NI-VISA for Linux 17.0.0f1.
Installer is aborted.
 mDNSのavahiをインストールします。
sudo yum install avahi
libstdc++.so.6 is needed by ni-pal-17.0.0.49152-0+f0.i386というメッセージで必要だといわれているファイルを探します。
yum provides */libstdc++.so.6
で、
 i686というのが32ビット用です。libstdc++-4.8.5-28.e17.i686が該当するようです。
sudo yum install libstdc++-4.8.5-28.el7.i686
でインストールします。もう一つの64ビット版のx86_64も同時に入ります。再度インストールします。
sudo ./INSTALL
 最後にrebootするかと聞かれるので、yesで答えます。

Step2
 左下のApplicationsからNational Insutrumentsを選び、NI-VISAのRemoteServerを起動します。エラーが出ます。updateNIDriversを動かすようにメッセージが出ています。


 sudo /usr/local/bin/updateNIDrivers
 nikalのビルドに失敗したと出ます。ソースを次のURLからダウンロードします。
http://www.ni.com/download/ni-kal-15.1/6549/en/
 Downloadsフォルダに保存します。NIKAL151.iosというファイルでした。このファイルをダブルクリックするとArkというユーティティが立ち上がるのでExractで解凍します。解凍した中にnikal-15.1.0f2.tar.gzがあるので、これも同じ場所に解凍します。
cd Downloads/NIKAL151
sudo ./INSTALL
 最後にrebootするかと聞かれるので、yesで答えます。

Step3
 RemoteServerを起動しますが、同じエラーが出ます。ソースの3か所を修正します。ファイル・ビューワで、
 /var/lib/nikal/3.10.0-862.el7.x86_64/nikal/
にあるnikal.cをダブルクリックすると、エディタのKWriteが立ち上がります。

#define NLNIKAL_CMD_SENDで検索したその次の行に1行追加します。
#define GENL_ID_GENERATE 0 // add

#ifdef nNIKAL1400_kHasFamilyGenlOpsGroupsで検索した2行をコメントアウトします。
#ifdef nNIKAL1400_kHasFamilyGenlOpsGroups
// if ((status = genl_register_family_with_ops(&nikal_netlink_family, nikal_netlink_ops))) return status;
#else
// if ((status = genl_register_family_with_ops(&nikal_netlink_family, nikal_netlink_ops, 1))) return status;
#endif

return do_munmap(mm, addr, len);で検索したその行の引数にNULLを追加します。
return do_munmap(mm, addr, len, NULL);
 Homeへ保存します。sudo cp nikal.c /var/lib/nikal/3.10.0-862.el7.x86_64/nikalで元の場所にコピーします。
 もう一度ドライバのアップデートを行います。時間がかかります。
sudo /usr/local/bin/updateNIDrivers
 最後にrebootするかと聞かれるので、yesで答えます。

Python3とpipのインストール
 もともとPython2が入っていました。pipは見当たりません。Python3を最初に入れます。次の二つでインストールします。
sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm
sudo yum install -y python36u python36u-devel python36u-libs
 実行は、
python3.6
です。
 ライブラリ管理のpipのインストールをします。
sudo python3 -m ensurepip
python3 -m ensurepip --upgrade
sudo pip3 install upgrade pip
実行は、
pip3



です。

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