厳重注意*****HPスケッチ及び回路に起因する障害は一切責任を持ちません、クレーム等は一切受けません。
自己責任で御願いします。

Arduino入門

機械電気屋が作ったArduinoソフト

入門書を読むとArduinoC言語で書かれているのだが45年前位前1979年に日本にもNECPC8001誕生した
希望小売価格は168,000円とあるが当時初任給が50000円そこそこだったのでかなり高価であった,日立からはベーシックマスター、シャープからはMZ-80K富士通からはFM7みな8bitパソコンで現在のパソコンみたいに絵が出ることは無くアルファベット+数字しか出ません
勿論ソフトも無く自分で作らなければならない言語はbasic言語皆夜中まで一生懸命パソコンにソフトを打ち込んだハードディスク,フロッピーディスクも何も無いのでこれを記憶するのはテープレコーダーにデーターを録音する
しかし正常に記録されたか確認しないとせっかく作ったソフトがパーになる照合(ベルファイ)を行ってOKが出たら初めて電源が切れる,しかし他人のパソコンで動作する保証は在りませんでした。
ここbasic言語を覚えた、一般ではホートラン,コボルがあり商業学校の教科にありました、しかし一般のコンピュターでも入力は穴の開いたパンチカードでした(パンチテープ)
この時点ではグラフィック絵は出ない文字のみで現在の安いパソコンより性能が劣ります。
Arduinoソフト{( [] , . ; :全角半角(日本語は解説しか使えませんファイル名もアルファベットだけです要注意)この違いだけで動きません当たり前だと言われればそれまでですが
一度にソフトを書いてはどこで間違えたか探すのに大変ですからエラーが無いかコンパイルをかけながら進めるとスムーズに行けます
変数の名前はa b c単体で書くより少なくとも3文字以上で書くと後で変数名を変える時に便利ですa b cだと単語の中に含まれており何処に書いて有るか検索時皆ヒットしてしまい検索出来ません
コード解説は書いたほうが後からわかりやすいし無いと何がしたいのか初心者には分かりません 解説はメモリを消費しませんのでいくら書いてもOKです // 解説 か /*解説 */
インストラクションコマンドの通りしても正常に動作しませんソフトを作る以上ソフトの決まり(ルール)を知らないと途中でハマります
ルールは解説本には書いてありません本を書いている人は分かって書いているので初心者には初歩の
Arduinoソフトの初歩に騙されて買うのですがなかなか苦労します
例えば 60*100060000には成りません-5536になりますデーターの形式を考えて作らないと論理は合ってるのだが結果出ないことになりいつまでたっても完成しません
今回の場合FT-817RS232Cで信号のやり取りをしますが通信時間を考えに入れないと,エラーばかりになります送信コマンドを出してすぐ受信ルーチンに行っても信号はまだ来てません
フラグを見てるのですがうまくゆきませんでした一度無でやってみるのもいいでしょう
機械の電気制御もシリンダーが前進しリミットスイッチがONなる信号で後退の動作をさせるとぎこちない動作になりますタイマーを入れて前進したことを確認してから次の動作に移行します
(動作したシリンダーに関係の無い動作はOKです)

あまりタイマーばかり使っていると1サイクルが遅くなるので調整しながら最良の所を選びます
今回は周波数の表示だけだからあまりシビアになることは無いですしこのシステムを発展させて周波数を入れるとかいろいろな事が出来ますが非常に難しいですなぜならタスクが1本しか無いからです
windows
もパソコンですがマルチタスクで動いていますが厳密にいうとシングルタスクです何故シングルタスクは難しいかと言うと入出力点数が多い制御を行うとABCの信号が一度に来ますのでそれをコントロールするのはいくらPCと言っても出来ないです1/1000秒で各入力信号を検出し各動作を分けて入力を記憶し出力を出すソフト割込みを考えるととても難しくなります機械電気は昔はリーレーで制御してましたが電気設計は熟練を要しますし配線が膨大になり改造となると凄く厄介ですリーレー制御はONOFFだけでは無いのです接点が一瞬動作するときに接点が離れた時はどちらでも無い事を考慮して設計しないと機械はまともに動作しません,最近はPLC(工業用のパソコンと言えば分かり易い)で制御しています。

前置きはこれ位にして

ArduinoC言語で出来ていると言われていたのでC言語アレルギーで毛嫌いてたが簡単とは言わないがやってやれないことは無かったです但し論理回路(AND、OR等)が分からないと出来ません
C言語は論理回路を人間が理解できる言葉で書いてありアマチュア国試に必ず1問出ますまずそちらを勉強し理解してからで無いと出来ません

ソフトの進め方

  1. 何をしたいかを明確にするFT-817の周波数電波形式を表示する
  2. ハードウエアを決める今回は中華製インチキArduinoUNOEasyWordMall UNO R3開発ボード USBケーブル付属 Arduinoと互換 499円)LCD表示器(SODIAL(R)キーパッド シールド ボード ブルー バックライト Arduinoロボット LCD 1602 1280 2560 UNO US用品 400円) アマゾンで買うと両方で1000円以下で買えます注意売れ筋品は値段が上がりますので参考値ですMINI DIN 8ピン雄コネクタ3芯以上の0.3sq以下のマイクコード(シールド線)太いとMINI DINにはんだ付けが出来ません、シールド無のケーブルだと自分の電波が乗る可能性がありますので要注意シールド線を使って下さいこの組み合わせが一番簡単です動作してからケーシングを考えて下さい
  3. フローチャートを書く頭の中で考えても一度に多くの事は処理できません
  4. コーディング、ソフトを書く一度に全部書いても初心者では無理です必ずバグ;:(){}[];:,.の書き間違い{}の抜け等がありますのでArduinonに書き込みコンパイルしながら進める方法が確実です
  5. 試運運転をしますが簡単には動きません論理の考えたかが間違ってるのでソフトは永久に動きません間違い探しは初心者には困難を要しますのでルーチンごとに仮にLED出力を付けて今何処を走ってるか確認しならが進めると分かり易いです、普通はUSBポートでモニタが出来ますがCATで使ってますのでモニタする事が出来ません。

練習問題  (この動作はICOMのAH-4の駆動シーケンスです)
運転の仕様

  1. 押し釦Aを押すとLED1が点灯                 条件 押し釦BがONの時はLED1は点灯しない
  2. 押し釦Bを押すとLED1が消灯しLED2が点灯        
  3. 押し釦BがOFFになるとLED2は消灯             条件 押し釦AがONの時はLED2は消灯しない


回路図
ネットでよく見る回路

このままAH-4につなぐと壊れますのでしないで下さい


この様にすると動きます

動作写真

PBA押す(AH-4スター信号)

LED1点灯(AH-4スター信号自己保持)

PBB押す (KEY信号が帰ってきたらスタート信号をOFF)

PBBOFF LED2消灯(KEY OFFでサイクル終了 普通KEYがある一定の時間が過ぎたら警報LEDを付ける回路を組むと異常が分かり易いです、たぶんAH-4の中で異常検知してチューニングを止めてると思います)

自分の作ったプログラムで仕様どうり動きましたか?
当局が作ったらこのようになりました人それぞれ思考が違いますので同じになることは無いです仕様どうり動けばOKです
最終的にはCATを使ってFT-817 をICOM製トランシーバと同じようにAH-3(AH-4)を自動制御しようと思ってます

const int pbA=2;const int pbB=3;const int led1=4;const int led2=5;/*

pbA1 pbB2 led13 led23に接続 

*/

int D1=0;

void setup() {

 pinMode(pbA,INPUT_PULLUP); pinMode(pbB,INPUT_PULLUP);pinMode(led1,OUTPUT); pinMode(led2,OUTPUT);

}

void loop() {

if (digitalRead(pbA) == LOW  && digitalRead(pbB) == HIGH && (D1==0)){digitalWrite(led1,HIGH); D1=1; }        

if (digitalRead(pbB) == LOW  && (D1==1)){digitalWrite(led1,LOW);digitalWrite(led2,HIGH); D1=2;}

if (digitalRead(pbB) == HIGH && (D1==2)){digitalWrite(led1,LOW);D1=3;}

if (digitalRead(pbB) == HIGH && digitalRead(pbA) == HIGH &&(D1==3)){digitalWrite(led2,LOW);D1=0;}}


本物シーケンサPLC


ArduinoUNOの上にLCDを付け亀の子状態にします配線はコネクタだけでOKです



NANOに移植、動きますLCDに直接(こちらは3百円位ピンアサインは同一小型化お薦め但し配線はPCB化しないといけないですね)
注意 UNOのままでは書き込めないのでツール ボード NANOで書きこんで下さい


FT-897で動作します


I2C版 このスケッチは別


このスケッチで動作します
厳重注意*****HPスケッチ及び回路に起因する障害は一切責任を持ちません、クレーム等は一切受けません。
自己責任で御願いします。

ソフト屋さんが書けばもっと適当な命令語を使って組むのですが初心者の当局はいちいちリファレンスを見ながら書いても、後で分かり辛いので極力わかるコマンドで書きました
配列変数を使えば短縮して書けますが意味合いを頭の中で考えなくては成りませんので分かり易く独立の変数で書きましたスキルがあっがたら配列変数で組むのが良いでしょう
やりたいことが多くなるとソフトはその分複雑化し難しくなりますチャレンジして下さい
一番肝心なのはリグからの5バイトの信号をいかに自分のしたい事に変換するかです今回の周波数読取が出来れば他のコマンド入れればそれなりに動きます
何も分らない当局がが作ったソフトなので初心者でもソフトを読む事が出来ると思います
ただ動かしたい人は完成されたサイトが在りますのでそちらでお願いします

当局はソフト屋さんではないので質問されてもわからないことばかりなので、お答えする事が出来ませんので悪しからず。

CPで使う事、タイプ入力だと間違いの元 スケッチにマウス左クリックしたまま下にずらし:*/スコープの当たってる所を右クリックでコピーをクリックarudhino 新規作成画面をクリアしてペーストコ、ンパイル、転送で完成
FT-817のRS232Cのボーレイトパラメータ14を9600に設定、スピードを速くしたい時はSerial.begin(9600);38400にすれば早くなりますけど人間の目が付いて行かないから意味はないです
CATコネクタから1番DC13.8Vが出てますがシリーズに10ΩR1235が入っています電流を食いすぎると100Ωが焼けますので安全の為別電源の方が良いでしょう
以前UNOの12V電源コネクタに電源を接続しUSBポートでスケッチを書いていたらUNOの5V 3端子レギレータが焼けた事が有ります、
たまたまかもしれませんかもしれませんので注意願います普通は回路に逆流防止のダイオードが付いてるはずですけど何せ中華製ですので確実な方法で
トランシーバへ行ってる電源パラって使うと良いでしょう電源スイッチは必要ですFT-817の電源スイッチを切ってもCAT端子RS232Cの電源は生きてますので要注意
電池運用は電池が無いので分かりません使わない時は電源コネクタを外すのが一番確実です
スケッチの転送はRS232Cへの接続を外した状態で転送しないとエラーが出ます理由はRS232CポートがUSBポートと同じポートでバッテングするからです
スケッチがOKになるまでスイッチで切り替えられるようにすると便利です

FT-817 FT-857 FT-897はコマンド体系が同じなのでこのままCATコネクタを差させば、確認はしてませんが動くと思います確認したら確認したとここに書きますFT-817 FT-897動作確認
最近の八重洲のリグはコマンドが機種によって異なるのでこのスケッチでは動きません。

特別注意
ardunoのスケッチを作った人は#include の意味が分かると思いますが初めての人の為説明します
ライブラリーと言う今回は<LiquidCrystal.h>LCD表示に関するサブルーチンを読出して使う宣言みたいなものです詳細は解説書で勉強して下さい
ライブラリーのインクルードと言う儀式をしないとLCDは動きません


スッケチ ライブラリをインクルード LiquidCrystal.h 選択左クリックするとLiquidCrystal.hが追加されますこの色でないとだめです




これでインクルード儀式は終わりです
この儀式が終わらないといくら書いてもエラーが出ます

/*

FT817 周波数 MODE表示器

2018/4/15 10:00

2018 /4 /16 22:24

2018 /4 /17 9:45

2018/4/18 10;30

*/

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

byte indata = 0;                             //受信データ

byte d[9];                                   //読出しデータ 5byte

byte mode;                                   //型式MODE

int mf[9];

void setup()

{

Serial.begin(9600);

lcd.begin(16, 2);                            //LCDの初期化 216文字

lcd.setCursor(0,0);  }                       //カーソルの初期位置

//----------------                binに変換 -------------------------------

void loop()

 {if(Serial.available() < 1){               //読取バッファーが無信号を確認             

//読出しバッファー無で読出コマンド(0x03)送信 B0000 0011

Serial.write(0x00);Serial.write(0x00);Serial.write(0x00);Serial.write(0x00);Serial.write(0x03);

}

//-----------------  RS232CDATA読込読出バッファー有検出0以上 --------------

delay (100);                                  //これが無いと読み取りミスすることが有る

if(Serial.available() > 0){                  //バッファーに信号有りを確認

{byte c1=0;                                   //カウント5回設定

while (c1 < 5){                                //5個読出 DATA1 DATA2 DATA3 DATA4 DATA5

indata = Serial.read();                        //データー1byte読込

d[c1]=indata;                                  //読込データを配列変数d[c1]に転送 d[0],d[1],d[2],d[3],d[4]

c1++;}}                                        //カウンタ+1する

byte c = 0;int byteH= 0 ;int byteL = 0;

 while(c < 5){                                 // 例 433.123.45    B0100 0011 B0011 0001 B0010 0011 B0100 0101

 byteH=((d[c] >> 4) & 0x0F);                   //  4bit右へずらす    B0100 0011 → B000 0100 & B0000 1111でマスクをかけると10の桁が1桁で読める

 byteL=d[c] & 0x0F;                            //  1の桁のみにする  B0100 0011  & B00001111 → B0000 0011 

 mf[c]= byteH * 10 + byteL;                    //  10桁*10 + 1桁 でBCDからBINの変換が出来る BCDでの操作は出来ないのでこの様な事をする

 c++ ;}                                        // カウンターの数を1プラスするこの動作を5回する事でリグからの信号を読み取ることが出来る

lcd.setCursor(0,0);                            // LCD表示し始め位置の設定1行目1桁目を最初とする

// -------------------------------型式表示-------------------------------

mode=(mf[4]);                                  //4bit目のデータは電波も型式を表すコードは下記

if(mode==0x00){                                //モードコードと読出し数で&を取り=値でモード表示する

  lcd.print("LSB");} else if(mode==0x01){  lcd.print("USB");}

  else if(mode==0x02){lcd.print("CW ");} else if(mode==0x03){  lcd.print("CWR");}

  else if(mode==0x04){lcd.print("AM ");} else if(mode==0x08){  lcd.print("FM ");}

  else if(mode==0x0A){lcd.print("DIG");} else if(mode==0x0C){  lcd.print("PKT");}

  else  lcd.print("WFM");

//---------------------------    表示値に変換 -------------------------------

{long f;long fm;long p0;long p1;long p2;long p3;long n0;long n1;long n2;long n3;long n4;

n0=1000000; n1=10000; n2=100; n3 =100000; n4 =100;

p0 = mf[0] * n0 ;p1 = mf[1] * n1 ;p2 = mf[2] * n2 ;p3 = mf[3];

f = p0 + p1 + p2 + p3;                        //表示周波数はf

if (f != fm){lcd.print (" FT817 JH2NZS " );   //JH2NZSの部分を自分のコール書きかえれば自分のコールが表示出来ます

lcd.setCursor(0,1);  lcd.print ("                ");

lcd.setCursor(0,1);  lcd.print ("  F " );fm=f;}//周波数に変化無い時はスルー

//-------------------------------小数点位置の計算-------------------------------

//ここは小数点を付けるルーチン433.123.45 小数点を付け無いなら lcd.print (f);OK 但し4331235と表示されます

//ソフトが泥縄なので説明は省略(論理は正解で動きます苦労しました)

{if (mf[0] == 0) { lcd.print(""); }else{ lcd.print(mf[0]); }

if (mf[1] > 9) { lcd.print(mf[1]/10); lcd.print("."); lcd.print(mf[1]%10); }

else if ((mf[1]<10) &&  (mf[1]>1)){ lcd.print(0); lcd.print("."); lcd.print(mf[1]%10); }

else lcd.print("0.0"); if (mf[2] < 10){ lcd.print(0); }

lcd.print(mf[2]);lcd.print(".");if (mf[3]<10){ lcd.print(0); lcd.print(mf[3]%10); }

else lcd.print(mf[3]);}}

delay (300);

}}