Appiumを使用したテスト自動化の様子

こんにちは、エンジニアの ksnth です。

今回は、AndroidエミュレータiPhone シミュレータ について、簡単ですが操作の様子を紹介します。

環境

今回のデモの環境は以下の通りです(かなり古い機種です💦)

・MacOS11.7.10

・Appium 2.16.2

・TypeScript

・mocha

デモの様子

このデモでは非常に簡単な動きですが、AndroidエミュレータiPhoneシミュレータを同時動作した様子です。

動作アプリはデフォルトで存在するアプリを使用しております。

※左がiPhoneで右がAndroidになります。

実機端末がなくてもテストできるのはいいことですね!
以上、ありがとうございました。

LTspiceで真空管アンプのシミュレーションをしてみた

こんにちは、エンジニアの ksnth です。

今回は、回路シミュレータの LTspiceXVIIで真空管回路のシミュレーションをしてみました。

いろいろな真空管がありますが、手持ちの12BH7のモデルを組み込んでみました。

テストモデル

以下のモデルでシミュレーションしてみました。通常はV1が数百ボルトを設定しますが、低電圧でのシミュレーションをしてみます。

パラメータはこんな感じで設定しました。

シミュレーションの様子

シミュレーションを実行し、グラフプロット画面上で「Add Trace to Plot」を選択して、プレート電流(IX(UI:Plate))を選択するとプレート特性が表示されます。

この特性から、抵抗値を決め、実際の製作時に微調整すると、早く値が求められそうですね。

参考回路でシミュレーションしてみた

参考回路はこんな感じにしました。

※以下の参考回路はシミュレーション用で作りましたので、実際の動作は不明です。

上のプレート特性から回路上のR1(R3)とR2(R4)を求めてみました。

R1(R3)=12(V) / 2.7(mA) * 1,000 = 4.4kΩ
R2(R4)=0.5(V) / 1.4(mA) * 1,000 = 357Ω

この値を入力して、その他の値は一般的な値でシミュレーションしてみました。

入力:30mV サイン波で2段増幅の様子をシミュレーションしてみました。

波形がつぶれてなくていい感じです(赤:入力、青:1段目、緑:2段目・OUTPUT)。

おおよそですが、1段目で7.5倍、2段目でトータル60倍くらいでしょうか。

ついでに周波数特性もやってみました。

 

ありがとうございました。

Arduino Unoをインラインアセンブラで動かしてみた

こんにちは、エンジニアの ksnth です。

今回は、Arduino Unoの互換ボードの「Maruduino Uno R3」を紹介したいと思います。C言語ベースで作成できますが、アセンブラインラインアセンブラ)で作ってみたいと思います。

簡単なLED点滅制御ですが、動くと嬉しいものです。

※このボードの他にも、秋月電子通商さんの「ESP-WROOM-02」のWi-Fiモジュールなども使いやすいです。Wi-Fiが使えるので通知系簡易システムなどに使ってます。

構成

このボードは、マルツさんで数年前に購入したもの(現在購入できるかは不明です)で、概要は以下の通りです(マルツさんサイトから抜粋)。

・搭載CPU:ATMEGA328P-PU
・ATMEGA16U2:USB-シリアル変換
・入力電源:5~10V
・5Vピン出力電流:500mA
・3.3Vピン出力電流:50mA
・ディジタルI/Oピン:14本(内6本はPWM出力可能)
・アナログ入力ピン:6本
フラッシュメモリ:32KB
SRAM:2KB
・EEPROM:1KB
・クロック周波数:16MHz
・サイズ:68.6×53.4㎜
・重量:25g
・45cm USBケーブル(Aコネクタ - Bコネクタ)付属

数千円でこれだけの内容なので、ほんと素晴らしいですね。

今回は、DIOが14本ある中の1つ(#12ピン)でLEDをつないで点滅させてみました。

コードを読むうえで、レジスタ構成やニーモニックを理解する必要があるのですが、ここではソースコードの説明を中心にしました(機会あればもっと詳細を説明できたらと思ってます)。

仕様書を以下のリンクから御覧ください。

http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf

部品など

ボードの他に、パソコン(Arduino IDEはダウンロードしてください)とLEDと抵抗(数百Ω程度)があれば確認できます。

ボードの電源はパソコンから取れますので、USBケーブルを接続すればプログラムの書き込みと動作確認もできますので(Arduino IDE使用)とても便利です。

※ボード単独動作なら、別途5V~10VDC電源が必要です。

サンプルコード

LEDの点滅(1秒間隔)のソースコードになります。

非常に読みにくいですが、順番に説明します。

・setup() は、ボードパワーオン時やリセット時に1回だけ動きます。

・loop()は、起動中はずっと動きますが、今回は使用してません。

・led_test()は自作の関数になります。ここでLEDを点滅させてます。

DIOですが、ATMEGA328P-PUの仕様書見ると、今回使用する #12ピンは、PORTB(DDDRB)のビット4に配置されています。

DDRB(アドレス:0x04)は、PORTBの入出力レジスタで、ビットをセット(1にする)と出力ポートになり、ビットクリア(0にする)と入力ポートになります。

PORTB(アドレス:0x05)は、PORTBのデータレジスタで、ビットをセット(1にする)とLEDが点灯し、ビットクリア(0にする)とLEDが消灯します。

先ず、setup()の最初の命令 ”sbi 0x04, 0x04 \n” ですが、LEDをつないだDDRBの#12の位置(Bit4:0x04)をビットセットし出力に設定します。"\n"は記述のルール(複数命令の際に必要)なので、同じように記述してください。

次の 命令 "cbi 0x05, 0x04 \n"は、PORTBの#12 の位置(bit4:0x04)をビットクリアしLEDを消灯しています(この命令は必要ないですが、起動時にLEDが消えていた方がいいと思って記述しています)。

led_test()の最初の"loop:"~”rjmp roop”までがLEDの点滅を無限に繰り返している箇所です。

ここでは、#12のPORTBレジスタのbit4を1秒間の待ち時間(delay_1s:サブルーチン)を挟んで、ビットセット⇔ビットクリアさせています。つまり、1秒間隔でLEDを点灯⇔消灯させています。

次の”delay_1s:”からは、1秒間の待ち時間を作るためのサブルーチン群となります。

軽く時間計算の前に補足ですが、アセンブラでプログラムを作る利点の一つに、CPUのクロック周波数と命令実行が完全同期のため、時間制御が簡単にできる点があります。(他の言語では、通常では時間制御はけっこう難しいです)。

このボードのクロック周波数は 16MHzなので、1クロックの時間は 1/16,000,000 = 0.0625マイクロ秒(usec)で、16,000,000回無駄?な命令を実行すれば、1秒間待てる計算になります。

命令のクロック数の組み合わせでは、正確なクロック数を求めるのは難しいので、大まかに16,000,000クロックになるように作ってみました。

コード中の"delay_2:"サブルーチンの総クロック数は 1,024クロックで、”delay_1:”サブルーチンの総クロック数は "delay_2:"も加えて 262,654 クロックで、"delay_1s:"サブルーチンの総クロック数は "delay_1:"も加えて 15,759,604 クロックとなります。

時間は 15,759,604(clock) * 0.0625(usec) / 1000 / 1000 ≒ 0.985(sec) となるので、おおよそ1秒になります。

void setup() {
  asm volatile
  (
    "sbi 0x04, 0x04 \n" // pinMode(12, OUTPUT);
    "cbi 0x05, 0x04 \n" // digitalWrite(12, LOW);
  );

  led_test();
}

void loop() {

}

void led_test(){
  asm volatile
  (
    "roop: \n"
    "sbi 0x05, 0x04 \n" // digitalWrite(12, HIGH);
    "rcall delay_1s \n" // delay(1000);
    "cbi 0x05, 0x04 \n" // digitalWrite(12, LOW);
    "rcall delay_1s \n" // delay(1000);
    "rjmp roop \n"      // 2 clock
    
    "delay_1s: \n"
    "ldi r22, 60 \n"    // 1 clock
    "delay_1s2: \n"
    "rcall delay_1 \n"  // 3 clock
    "dec r22 \n"        // 1 clock
    "brne delay_1s2 \n" // 2/1 clock
    "ret \n"            // 4 clock
  
    "delay_1: \n"
    "ldi r21, 255 \n"   // 1 clock
    "delay_12: \n"
    "rcall delay_2 \n"  // 3 clock
    "dec r21 \n"        // 1 clock
    "brne delay_12 \n"  // 2/1 clock
    "ret \n"            // 4 clock

    "delay_2: \n"
    "ldi r20, 255 \n"   // 1 clock
    "delay_22: \n"
    "nop \n"            // 1 clock
    "dec r20 \n"        // 1 clock
    "brne delay_22 \n"  // 2/1 clock
    "ret \n"            // 4 clock
  );
}

 

ありがとうございました。