こんにちは、
やましょうです。
本日から数回に分けて
高砂のKX-100Lをリモートでコントロールするの2回目です。
まずケーブルですが、結局インターリンクケーブルで動くようです。
やましょうは、下記を購入して動きましたが、動かなくても保障はしません。
次にコマンドですが、
電圧設定"OV"コマンド
電流設定"OC"コマンド
出力on/off "OT"コマンド
このあたりをごにょごにょすると、
こんな感じのアプリができましたダウンロードはこちらから、
以上
やましょうでした。
こんにちは、
やましょうです。
本日から数回に分けて
高砂のKX-100Lをリモートでコントロールするの2回目です。
まずケーブルですが、結局インターリンクケーブルで動くようです。
やましょうは、下記を購入して動きましたが、動かなくても保障はしません。
次にコマンドですが、
電圧設定"OV"コマンド
電流設定"OC"コマンド
出力on/off "OT"コマンド
このあたりをごにょごにょすると、
こんな感じのアプリができましたダウンロードはこちらから、
以上
やましょうでした。
こんにちは、
やましょうです。
本日から数回に分けて
高砂の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接続できました。
動画で
こんな感じになります。
以上
やましょうでした。
こんにちは、やましょうです。
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の正当性確認どうするんじゃろう?
(謎)
以上
やましょうでした。
こんにちは
やましょうです。
これからエアコンの季節
例の流行り病で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設定にしています。
黒: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
以上
やましょうでした。
こんにちは
やましょうです。
なんかなんでも割り込みって風潮はよくない。
割込みは最小限度の処理であとはメインで処理すべきと思っているやましょうです。
STM32に限らず、ポートの変化でSPIで取込みとかよくある話なんですけど。
そのポートの変化検出で割込みにする必要ないんですよね。。。
通知だけですからね。。。ってことで割込みにせずSTM32で検知する方法で。
STM32 CUBE MXでのNVICでポートの割込みのチェックボックスをオフします。
その後code gane!
あとはメインで、 EXTI ペンディングレジスタ(EXTI_PR)を見るだけですね。
例:
if(EXTI->PR & EXTI_PR_PR1)
{ /*エッジ検出 */
EXTI->PR |= EXTI_PR_PR1; // 検出結果リセット
/* エッジ時の処理。。。。*
}
以上
やましょうでした。
こんにちは、やましょうです。
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になりました。
以上
やましょうでした。