Hatena::ブログ(Diary)

滴了庵日録 このページをアンテナに追加 RSSフィード

2018/02/17(Sat)

スマートオシロを作ろう(1)

やりたいこと

オシロを基板に当てて波形を見る時、両手がふさがってオシロの操作に困ることがよくあります。そこで今流行りのAIスピーカを使って、声で操作できるようにしたいと思ってます。具体的には、Google AIY Voice Kitで音声を認識し、LAN経由でオシロを制御します。オシロはOWON SDS7102Vを使います。SDS7102VはLANまたはUSB経由での制御が可能です。今回は、特別なドライバを必要としないLANを利用することにします。

写真


SCPIコマンド

SDS7102Vの制御には、SCPI(スキッピ)というコマンド言語が使われています。SCPIはUSBやLANなどで簡単な文字列を送ることでさまざまな計測機器をコントロールする標準規格です。SDS7102で使用できるコマンドは下記のドキュメントに記されています。

スマートオシロで最低限必要そうなコマンドを下記に列挙します。


SCPIコマンドモードに入る

:SDSLSCPI#

応答→ :SCPION


時間のスケールとオフセット

:TIM:SCAL <スケール>

<スケール> = {

2.0ns|5.0ns|10ns|20ns|50ns|100ns|200ns|500ns|

1us|2us|5us|10us|20us|50us|100us|200us|500us|

1ms|2ms|5ms|10ms|20ms|50ms|100ms|200ms|500ms|

1s |2s |5s |10s |20s |50s |100s}


:TIM:HOFF <オフセット>

<オフセット> = -500〜+500 (50で1DIV)


チャンネルのスケールとオフセット

:CHAN<チャンネル>:SCAL <スケール>

<チャンネル> = {1|2}

<スケール> = {2mV|5mV|10mV|20mV|50mV|100mV|200mV|500mV|1V|2V|5V|10V}


:CHAN<チャンネル>:OFFS <オフセット>

<オフセット> = -250〜+250 (25で1DIV)


トリガ

:TRIG:MODE <モード>

<モード> = {AUTO|NORM|SING}


:TRIG:SING:EDGE:SOUR <ソース>

<ソース> = {CH1|CH2}


:TRIG:SING:EDGE:SLOP <スロープ>

<スロープ> = {RISE|FALL}


:TRIG:SING:EDGE:LEV <レベル>

<レベル> = -150〜+150 (25で1DIV)


次のステップ

次回はこれを送信するPythonプログラムを作成します。

2018/02/04(Sun)

SDS7102のファームウェアをアップデートしてSCPI対応

やりたいこと

中華オシロのSDS7102のファームウェアアップデートして、SCPIコマンドによるリモートコントロールに対応させます。メーカー公式のファームウェアアップデートですが、後述するように少し挙動が怪しいです。アップデートの実施は個人の責任でお願いします。

写真


SDS7102

SDS7102はOWON製の中華オシロです。アマゾン秋月で買えます。Windows用のPCソフトを使って、USBまたはLAN接続で波形のキャプチャおよびリモートコントロールができます。ただし、古いバージョンのファームウェアはリモートコントロールに対応していません。ファームウェアのバージョンは[Utility]ボタン→[H5]ボタン(About)で確認することができますが、変更履歴は不明です。リモートコントロールに対応しているかどうかは後述するPCソフトで試して確認してください。


PCソフトとUSBデバイスドライバ

オシロに付属のCD-ROMにもWindows用のPCソフトが入っていますが、古いバージョンだとリモートコントロールに対応していません。最新版をメーカーのサイトよりダウンロードしてインストールします。2018年2月4日現在、日本法人のサイトからはリンク切れになっているので、本家のサイトからダウンロードします。リモートコントロールの方法については後述します。


ファームウェアのアップデート

メーカーのサイトよりファームウェアアップデートツール(Windows用)をダウンロードします。SDS7102Eには適用されないので注意してください。なお、2018年2月4日現在、日本法人のサイトからは(以下略)


以下の手順でアップデートします。(詳細は付属のPDFに記されています。)

  • SDS7102をUSBケーブルでPCに接続します。(デバイスドライバのインストールが必要。)
  • ツールをインストールし、起動します。
  • [START]ボタンを押します。
  • 「please reboot, wait for enter USB download model... 」と表示されるので、SDS7102を再起動します。(手動で電源スイッチを切って入れ直します。)
  • するとファームウェアのアップデートが始まります。
  • 「Patching is done, rebooting machine」と表示され、SDS7102が自動的に再起動したらアップデート完了です。

図


中国語表示が化ける

ファームウェアアップデートが完了すると、種々の設定が初期化されます。言語設定も中国語になります。それだけなら良いのですが、私の環境では中国語のフォントバグってしまいました。

写真


中国語以外の言語は正常なので、ふつうに英語表示で使用するぶんには特に問題ありませんが、気持ち悪いですね。それと表示がバグってるせいで言語設定の変更が少し難しいです。

  • [Utility]ボタン→[H1]ボタン(Function)で[Function]メニューが出ます。
  • [Multipurpose]ツマミで、いちばん上段の項目(Config)を選択します。
  • [H2]ボタン(Language)を押すと[Language]メニューが出ます。
  • [Multipurpose]ツマミで、[English]を選択します。

これでぶじに英語表示に戻ります。

写真


リモートコントロール

  • USBまたはLANでPCとオシロを接続し、専用PCアプリを起動します。
  • [Ports-Settings]ボタンを押して、接続の設定をします。
  • [Continue Data Download]ボタンを押すと波形が周期的にキャプチャされます。
  • この状態で[Remote Control]ボタンを押すとダイアログが開いて、リモートコントロールできます。

図


SCPI

リモートコントロールには、SCPI(スキッピ)というコマンド言語が使われています。SCPIはUSBやLAN(ソケット通信)やRS-232Cなどで簡単な文字列を送ることでさまざまな計測機器をコントロールする標準規格です。SDS7102で使用できるコマンドは下記のドキュメントに記されています。これを用いて制御ソフトを自作することもできそうです。


SDS7102の場合、最初に下記のコマンドを送ることでSCPIモードに入ります。

:SDSLSCPI#  ← PCから送信
:SCPION     ← SDS7102から応答

2018/01/28(Sun)

Raspberry PiをWindows PCから操作

やりたいこと

  • ラズパイとPCをLANケーブルで直結(※)
  • コンソールまたはリモートデスクトップでラズパイにログイン
  • PCのインターネット接続をラズパイと共有
  • ラズパイ上のフォルダを共有フォルダにしてPCから開く

図


※ ラズパイはAuto MDI/MDI-X対応なのでクロスケーブルでもストレートケーブルでもOK。


動作環境
機器OSLANの固定IPアドレス(例)
ノートPCWindows 10 Home192.168.11.1
Raspberry Pi 3 Model BRaspbian 8 (Jessie)192.168.11.2


コンソールで接続

ラズパイ側(1) LANを固定IPアドレスに設定

/etc/dhcpcd.conf に下記を追記する。ここでは192.168.11.2に設定した。

interface eth0
static ip_address=192.168.11.2


または、GUIで設定してもよい。(画面右上のネットワークのアイコンから)

図


下記コマンドを実行して設定を反映し、IPアドレスを確認する。

(LANケーブルの抜き差しでも設定は反映される。)

sudo service dhcpcd reload
ifconfig


ラズパイ側(2) SSH接続を有効にする

下記コマンドを実行して設定画面を開き、

「5 Interfacing Options」→「P2 SSH」を選択し、有効に設定する。

sudo raspi-config


Windows側(1) LANを固定IP

ラズパイとの接続に使用するLANのプロパティでIPアドレスを固定に設定する。

ここでは、192.168.11.1に設定した。

図


Windows側(2) TeraTermでSSH接続

TeraTermを起動し、下記設定で接続する。

  • ホスト: 192.168.11.2
  • TCPポート: 22
  • サービス: SSH
  • SSHバージョン: SSH2
  • プロトコル:UNSPEC

SSH認証でユーザー名とパスフレーズを入力する。初期状態では下記のとおり。

  • ユーザー名: pi
  • パスフレーズ: raspberry


リモートデスクトップで接続

ラズパイ側(1) LANを固定IPアドレスに設定

前述の「コンソールで接続」の場合と同様。


ラズパイ側(2) VNC接続を有効にする

下記コマンドを実行して設定画面を開き、

「5 Interfacing Options」→「P3 VNC」を選択し、有効に設定する。

sudo raspi-config


ラズパイ側(3) xrdpをインストール

xrdpはLinuxで動作するリモートデスクトップサーバである。下記コマンドでインストールする。

(tightvncserverを先にインストールしないと接続できない場合がある。)

sudo apt update
sudo apt install tightvncserver
sudo apt install xrdp


日本語キーボードのPCを使う場合、下記コマンドでキーボードの設定をする。

cd /etc/xrdp/
sudo wget http://w.vmeta.jp/temp/km-0411.ini
sudo ln -s km-0411.ini km-e0010411.ini
sudo ln -s km-0411.ini km-e0200411.ini
sudo ln -s km-0411.ini km-e0210411.ini
sudo service xrdp restart


Windows側(1) LANを固定IP

前述の「コンソールで接続」の場合と同様。


Windows側(2) リモートデスクトップで接続

「リモートデスクトップ接続」を起動し、ラズパイのIPアドレスを指定して接続する。

図


ログイン画面でsesman-Xvncを選択し、ユーザー名とパスワードを入力する。

図


インターネット接続の共有

ラズパイ自身のWiFiを設定してインターネットに接続してもよいが(むしろそのほうが手っ取り早いかも)、PCのインターネット接続をラズパイと共有する方法もある。


Windows側 インターネット接続の共有の設定

インターネット接続に使用しているネットワークデバイスのプロパティでインターネット接続の共有を有効にする。

図


ラズパイ側 デフォルトゲートウェイとDNSサーバの設定

/etc/dhcpcd.conf に下記を追記して、PCのIPアドレスをデフォルトデートウェイに設定する。また、DNSサーバはGoogle Public DNSのIPアドレス(8.8.8.8)を設定する。

(固定IPアドレスでDNSサーバだけ自動取得ってできないのかな?)

interface eth0
static ip_address=192.168.11.2
static routers=192.168.11.1         ←追記: デフォルトゲートウェイ
static domain_name_servers=8.8.8.8  ←追記: DNSサーバ


GUIで設定してもよい。

図


下記コマンドを実行して設定を反映し、ブラウザで適当なWebサイトを開いてインターネット接続を確認する。

sudo service dhcpcd reload


ファイル共有

ラズパイ側(1) sambaをインストール

sambaはファイル共有サーバである。下記コマンドでインストールする。

sudo apt install samba


ラズパイ側(2) sambaユーザーの追加

Linuxのユーザー/パスワード設定とは別に、sambaのユーザー/パスワード設定が必要である。下記コマンドを実行する。

pdbedit -a pi         ← Linuxに登録済のユーザーを指定する
new password:         ← パスワード入力
retype new password:  ← パスワード確認


ラズパイ側(3) 共有フォルダの設定

/etc/samba/smb.conf に下記を追記して、共有フォルダを設定する。

ここでは、/home/pi/share/ を共有する。

[share]
   path = /home/pi/share
   readonly = no
   browsable = yes
   force user = pi

下記コマンドを実行してsambaサーバを再起動する。

sudo server smbd restart
sudo server nmbd restart


Windows側 共有フォルダを開く

「\\192.168.11.2」を開き、共有フォルダへのアクセスを確認する。フォルダを開くときにはユーザー名とパスワードを入力が必要となる。

図


参考URL

2018/01/25(Thu)

SPIクロックのモード

SPIはクロックパルスの極性と位相による動作モードが4通りあって設定がめんどくさい。

  • モード0 : 正パルス前ラッチ (CPOL=0, CPHA=0)
  • モード1 : 正パルス後ラッチ (CPOL=0, CPHA=1)
  • モード2 : 負パルス前ラッチ (CPOL=1, CPHA=0)
  • モード3 : 負パルス後ラッチ (CPOL=1, CPHA=1)

世の中のデバイスでいちばん多いのはモード3で、次いでモード0が多い気がする。メモリデバイスではモード0・モード3両対応のものが多い。逆にモード1やモード2のデバイスはあまり見ない気がする。

  • モード0、モード3 : 立ち上がりエッジでラッチ、多数派
  • モード1、モード2 : 立ち下がりエッジでラッチ、少数派

とりあえず「モード3は負パルス後ラッチ」ということをよくおぼえておけばよい。


【参考URL】

2017/12/29(Fri)

STM32のTips (Flash関係)

開発環境はIARのEWARMです。


binファイルの生成

デフォルトではプロジェクトをビルドするとoutファイルが生成されます。outファイルからbinファイル(バイナリイメージ)を生成するには、プロジェクトの[オプション]の[出力コンバータ]にて、[追加出力ファイルを生成]にチェックし、[出力フォーマット]を[ローバイナリ]に設定します。


図


Flashの特定アドレスに定数を配置

(1) ソースコードでpragma指定

pragmaでセクション名を指定します。

また、コードから参照されない場合には強制配置のため __root を指定します。

#pragma location = "ConstSection"
__root const char HOGE[16] = "PIYO";


(2) リンカ設定ファイルでアドレス指定

リンカ設定ファイル(拡張子.icf)で、セクションのアドレスを指定します。

place at address mem:0x0807FFF0 { readonly section ConstSection };


Flashの特定アドレスにバイナリファイルのデータを配置

(1) プロジェクトのオプションでセクションとファイルを指定

プロジェクトの[オプション]の[リンカ]の[入力]にて、

  • [シンボルをキープ]に適当なシンボル名 (セクションと同名でOK)
  • [ローバイナリイメージ]にファイル名、シンボル名、セクション名、アラインメントを指定

図


(2) 2個以上のバイナリファイルを用いるとき

上記では、シンボル名は複数定義できますが、バイナリファイルは1つしか指定できません。2個以上のバイナリファイルを用いるときは、[シンボルをキープ]でのシンボル名定義に加え、プロジェクトの[オプション]の[リンカ]の[追加オプション]にて、次のように指定します。

--image_input=ファイル名,シンボル名,.セクション名


図


(3) リンカ設定ファイルでアドレス指定

リンカ設定ファイル(拡張子.icf)で、セクションのアドレスを指定します。

place at address mem:0x08080000 { section .RESOURCE };
place at address mem:0x08100000 { section .RESOURCE2 };


ブートローダーを作る

(1) メモリマップを決める

例えばここでは次のように決めます。

  • マイコンのFlashサイズは1Mバイト (0x08000000〜0x080FFFFF)
  • 先頭64kバイトにブートローダを置く (0x08000000〜0x0800FFFF)
  • その後にユーザーアプリケーションを置く (0x08010000〜0x080FFFFF)

Flashのセクタ境界で領域を分けるようにします。セクタのサイズはマイコンの型番によって異なるのでデータシートで確認してください。


(2) ブートローダーのコード

ブートローダーは、起動直後になんらかの条件(シリアル受信がある、特定のピンのレベル、など)で、なんらかの手段(シリアル受信、SDカード、など)でFlashのユーザーアプリケーション領域を書き換えます。そして、処理をユーザーアプリケーションに切り替えます。

int main(void)
{
    if(なんらかの条件)
    {
        なんらかの手段でFlashを書き換える
    }

    /***** ユーザーアプリケーションにジャンプ *****/

    //アプリケーションのリセットハンドラ
    int * user_app = (int *)(0x08010000+ 0x04);
    //アプリケーションのスタックエリアをスタックポインタに設定
    __set_MSP(*(int*)(0x08010000+ 0x00));
    //アプリケーションのベクタテーブルをベクタテーブルオフセットレジスタに設定
    *(int*)0xE000ED08 = 0x08010000;
    //アプリケーションを起動
    ((void (*)())(*user_app))();
    
    while(1){ };
}


(3) アプリケーションのコード

main関数の最初におまじないを1行加えます。

int main(void)
{
    // ベクタテーブルのアドレスを変更
    // (IARのスタートアップルーチンが初期化してしまうためここで再設定)
    *(int*)0xE000ED08 = 0x08010000;
    
    以下略
}


(4) ブートローダのリンカ設定ファイル

Flashの開始アドレスと終了アドレス、およびベクタテーブルのアドレスを指定します。

/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__     = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__       = 0x0800FFFF;


(5) アプリケーションのリンカ設定ファイル

Flashの開始アドレスと終了アドレス、およびベクタテーブルのアドレスを指定します。

/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08010000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__     = 0x08010000;
define symbol __ICFEDIT_region_ROM_end__       = 0x0807FFFF;


(6) 参考資料