2021年7月2日金曜日

高砂 KX-100Lをリモートでコントールする(2)

 

こんにちは、

やましょうです。
本日から数回に分けて
高砂のKX-100Lをリモートでコントロールするの2回目です。

まずケーブルですが、結局インターリンクケーブルで動くようです。

やましょうは、下記を購入して動きましたが、動かなくても保障はしません。


次にコマンドですが、

電圧設定"OV"コマンド

電流設定"OC"コマンド

出力on/off "OT"コマンド


このあたりをごにょごにょすると、

こんな感じのアプリができました

ダウンロードはこちらから

以上

やましょうでした。


2021年7月1日木曜日

高砂 KX-100Lをリモートでコントールする(1)

こんにちは、

やましょうです。
本日から数回に分けて
高砂のKX-100Lをリモートでコントロールするをお送りします。

高砂のKX-100にはRS-232Cでコントールできる機能があります。
この機能を用いてコントロールできます。

今日は接続についてです。

まず。

下記リンクのケーブが必要です。
https://www.takasago-ss.co.jp/products/power_electronics/dc/kx/image/rs_cross_cable.png


私持つ232Cクロスではダメで私は自作しました。
ストレートケーブルを切って自作です。

よくよく調べてみるとインターリンクのクロスケーブルですと行けそうです。

来たら確認してます。


さて、基本動作確認です。
A1 出力ONを送付しています。

送付コマンドは

A1OT1[CRLF]

となります。

いつもの様にDELPHIでWUNI232Cコンポーネントを張り付け
SPEEDを9600 bps
flowcontrol noneにして下記をコード貼り付けます。

procedure TForm21.Button1Click(Sender: TObject);
var
  WriteBuffer : array [0..10] of byte;
begin
  if(not WUni232c1.Connect) then
  begin
     Wuni232c1.Port := 1;
     Wuni232c1.Open();
      WriteBuffer[0] := byte('A');
      WriteBuffer[1] := byte('1');
      WriteBuffer[2] := byte(',');
      WriteBuffer[3] := byte('O');
      WriteBuffer[4] := byte('T');
      WriteBuffer[5] := byte('1');
      WriteBuffer[6] := $0d;
      WriteBuffer[7] := $0a;
      Wuni232c1.Write(8,@WriteBuffer);
  end;
end;

 実行すると、remote接続できました。

動画で



こんな感じになります。

以上

やましょうでした。




2021年6月10日木曜日

Stm32 Cube Programerで量産書込みを行う。

 こんにちは、やましょうです。

 

STM32  で量産書込みがしたい。。

ということで、今まではStm32 ST-link Utilityを使用していた訳ですが。

Stさん曰く、Stm32 Cube programerをお使いくださいということで、

Stm32 Cube Programer で書込みしたいと思います。

まず量産書込みでGUIは超絶面倒ですので、CLIを使用します。

C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin>STM32_Programmer_CLI.EXEを実行するのみです。

 

書込み方法としては

①SWDで接続 

-c port=SWD 

②OPTION BYTEのRDPをLEVEL0 = 0XAAにするこれよってリード可能

 -ob rdp=0xaa

③全エリアイレース

-e all

④HEX書込み

-w yours.hex

⑤ベリファイ

-v

⑥OPTION BYTEのRDPをLEVEL0 = 0XBBにするこれよってリード不可能

-ob rdp=0xbb

という順で行います。

 

引数に設定すれば良いので。

STM32_Programmer_CLI -c port=SWD -e all -w yours.hex -v -ob rdp=0xbb

とすればできます。

実行結果は、


C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin>STM32_Programmer_CLI -c port=SWD -ob rdp=0xaa -e all -w yours.hex -v -ob rdp=0xbb
      -------------------------------------------------------------------
                       STM32CubeProgrammer v2.7.0
      -------------------------------------------------------------------

ST-LINK SN  : 34FFxxxxxxxxxxxxxxxx
ST-LINK FW  : V2J37S7
Board       : --
Voltage     : 3.24V
SWD freq    : 4000 KHz
Connect mode: Normal
Reset mode  : Software reset
Device ID   : 0x457
Revision ID : Rev Z
Device name : STM32L01x/L02x
Flash size  : 16 KBytes
Device type : MCU
Device CPU  : Cortex-M0+


UPLOADING OPTION BYTES DATA ...

  Bank          : 0x00
  Address       : 0x4002201c
  Size          : 104 Bytes

ロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロ 100%

  Bank          : 0x01
  Address       : 0x1ff80000
  Size          : 16 Bytes

ロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロ 100%


PROGRAMMING OPTION BYTES AREA ...

  Bank          : 0x01
  Address       : 0x1ff80000
  Size          : 16 Bytes

ロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロ 100%

Reconnecting...
Reconnected !


UPLOADING OPTION BYTES DATA ...

  Bank          : 0x00
  Address       : 0x4002201c
  Size          : 104 Bytes

ロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロ 100%

  Bank          : 0x01
  Address       : 0x1ff80000
  Size          : 16 Bytes

ロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロ 100%

OPTION BYTE PROGRAMMING VERIFICATION:

Option Bytes successfully programmed


Mass erase ...

Mass erase successfully achieved


Memory Programming ...
Opening and parsing file: yours.hex
  File          : yours.hex
  Size          : 1 Bytes
  Address       : 0x08000000


Erasing memory corresponding to segment 0:
Erasing internal memory sectors [0 7]
Download in Progress:
ロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロ 100%

File download complete
Time elapsed during download operation: 00:00:01.053



Verifying ...


Read progress:
ロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロ 100%

Download verified successfully



PROGRAMMING OPTION BYTES AREA ...

  Bank          : 0x01
  Address       : 0x1ff80000
  Size          : 16 Bytes

ロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロ 100%

Reconnecting...
Reconnected !


UPLOADING OPTION BYTES DATA ...

  Bank          : 0x00
  Address       : 0x4002201c
  Size          : 104 Bytes

ロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロ 100%

  Bank          : 0x01
  Address       : 0x1ff80000
  Size          : 16 Bytes

ロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロロ 100%

OPTION BYTE PROGRAMMING VERIFICATION:

Option Bytes successfully programmed

という形で完了します。


ここで疑問さて、HEXは良いとしてもOPTION BYTEの正当性確認どうするんじゃろう?

(謎)

以上

やましょうでした。

 

2021年6月9日水曜日

CO2濃度をマイコンで取得してみる。

こんにちは、やましょうです。

以前DELPHIで取得しました

CO2濃度の表示をマイコン化しました


動画はこんな感じです。


回路図等は明日。

 

以上 やましょうでした。

 



2021年5月31日月曜日

Delphi を使ってCO2濃度を表示してみる。

こんにちは

 

やましょうです。

 

CO2濃度が見たい

これからエアコンの季節

例の流行り病でCO2濃度の表示が欲しいところですね。

 

マイコン化する前に

Delphi を使ってWindows上でCO2濃度を表示してみます。

 

必要な物

CO2センサーモジュール MH-Z19C

https://akizukidenshi.com/catalog/g/gM-16142/

 USB UART変換  AE-UM232R( Arduinoでもよいと思う)

https://akizukidenshi.com/catalog/g/gK-06693/


配線

接続 こんな感じに接続
(AE-UM232RのDIP SWの位置が重要 TXを3.3Vにするため)

★秋月のページにI/F電圧3.3Vって書いてあるので念のため3.3V設定にしています。

 

赤:+5v(vbus) 

黒:GND

青:CO2センサーTX=>変換IC RX

白:CO2センサーRX=>変換IC TX

 

必要なコンポーネント

COMポート番号を割り出して、DELPHIで以下のソフトを書く

WUni232cのコードはGetitから10.4以降では削除されたので、

https://www.csd.co.jp/product/

より取得 してください。


コード

 /////////////////////コード //////////////////////////////////////////////

unit Unit20;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, WUni232c, Vcl.ExtCtrls, Vcl.StdCtrls;

type
  TForm20 = class(TForm)
    WUni232c1: TWUni232c;
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private 宣言 }
    ReadData: array [0..9] of byte;
  public
    { Public 宣言 }
  end;

var
  Form20: TForm20;

                                    {   0   1   2   3   4   5   6   7   8  }
const CMD_SensorON  : array [0..8] of BYTE = ( $ff,$01,$79,$A0,$00,$00,$00,$00,$E6 );
const CMD_SensorOFF : array [0..8] of BYTE = ( $ff,$01,$79,$00,$00,$00,$00,$00,$86 );
const CMD_SensorRead: array [0..8] of BYTE = ( $ff,$01,$86,$00,$00,$00,$00,$00,$79 );



implementation

{$R *.dfm}

procedure TForm20.FormCreate(Sender: TObject);
begin
    if WUni232c1.Open < 0 then
    begin
        Self.Caption := 'Comポートエラー';
        exit;
    end;
    Wuni232c1.Write(sizeof(CMD_SensorON),@CMD_SensorOn);
    Timer1.Enabled := True;
end;


procedure TForm20.Timer1Timer(Sender: TObject);
var
ReadCount : Byte;
Sum : Byte;
  i: Integer;
begin
    ReadCount :=   Wuni232c1.Read(10,@ReadData);
    Label3.Caption := IntToStr(ReadCount)+'/'+IntToStr(ReadData[2])+'/'+IntToStr(ReadData[3]);
    if(ReadCount = 9) then
    begin
      // sum Check
      sum := 0;
      for i := 0 to 7 do
          Sum := Sum+ ReadData[i];
      sum := $ff-Sum;
      if(Sum = ReadData[8] ) then
      begin
        Label2.Caption := IntToStr(ReadData[2]*256+ReadData[3])+'ppm';

      end;
    end
    else
    begin
        // あまりの受信データをすべて捨てる
      while(Wuni232c1.Read(10,@ReadData) <> 0) do;
    end;
    Wuni232c1.Write(sizeof(CMD_SensorRead),@CMD_SensorRead);

end;
////////////////////////////////////////////////////////////////////////////////////////



end.


動作確認


こんな感じで表示される。

 

そしてコードはここに

https://github.com/qa65000/Co2SensorForDelphi

 

以上

やましょうでした。

 




2021年4月28日水曜日

HAL STM32 GPIO EDGE検出 を割込みを使わずに行う方法。

 こんにちは

やましょうです。

 

なんかなんでも割り込みって風潮はよくない。

割込みは最小限度の処理であとはメインで処理すべきと思っているやましょうです。 


STM32に限らず、ポートの変化でSPIで取込みとかよくある話なんですけど。

そのポートの変化検出で割込みにする必要ないんですよね。。。

通知だけですからね。。。ってことで割込みにせずSTM32で検知する方法で。

STM32 CUBE MXでのNVICでポートの割込みのチェックボックスをオフします。

その後code gane!

あとはメインで、 EXTI ペンディングレジスタ(EXTI_PR)を見るだけですね。


例:

    if(EXTI->PR & EXTI_PR_PR1)

    {    /*エッジ検出    */

            EXTI->PR |= EXTI_PR_PR1;      // 検出結果リセット

           /* エッジ時の処理。。。。*

 

 

以上

やましょうでした。

 

HAL STM32 MASTER-SPI使用時 起動後即SCKがHIGHにならない問題の対応

 こんにちは、やましょうです。

 STM32のSPI-MASTERでSPIで通信を行っていないときにCLOCKラインをHIGHにしておきたいのですが、なぜかCUBE MXの吐き出すコードだと1度SPIを使用するまでCLOCKラインがLOWですね。

 まぁ、問題はないんでしょうけど、最初だけ通常時と異なるのはちょっと考えてしまいますよね。

 

波形としてこんな感じです。(上の黄色がCLOCK)

 

この原因を調査すると、

SPI_CR1の SPE BITの設定ですね。

(注意:SPE BITはいろいろな回路に使われている様でON時には設定変更はできない様なことが書いてあります。)

6 SPE:SPI ペリフェラル  イネーブル フラグな様です。

 

対応 SPIの初期化部でフラグオンを追加します。

  /* USER CODE BEGIN SPI1_Init 2 */
   __HAL_SPI_ENABLE(&hspi1);
 
  /* USER CODE END SPI1_Init 2 */

}

 対応後

 最初の時点でHIGHになりました。

 

以上

やましょうでした。