Goertek_Mito_Lab / Mbed 2 deprecated ServoTensionerV3

Dependencies:   mbed

Committer:
tkry
Date:
Sun May 10 19:51:15 2020 +0000
Revision:
1:b0b5e0e70af8
Parent:
0:cd74549e4be2
1st complete

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tkry 0:cd74549e4be2 1 /*
tkry 0:cd74549e4be2 2 基板:4/3モデル,SB16とSB18はカット
tkry 0:cd74549e4be2 3
tkry 0:cd74549e4be2 4 参考文献
tkry 0:cd74549e4be2 5 HX711ロードセルのライブラリ,Read meにインポート方法記載あり
tkry 0:cd74549e4be2 6 https://github.com/atoy40/mbed-hx711
tkry 0:cd74549e4be2 7 7セグのアルゴリズム,正負などを変更
tkry 0:cd74549e4be2 8 https://forum.arduino.cc/index.php?topic=351609.0
tkry 0:cd74549e4be2 9 https://zhuanlan.zhihu.com/p/73846629
tkry 0:cd74549e4be2 10 EEPROMのプログラム
tkry 0:cd74549e4be2 11 https://os.mbed.com/users/bborredon/code/eeprom/docs/925096a4c7f0/classEEPROM.html
tkry 0:cd74549e4be2 12
tkry 0:cd74549e4be2 13 変更箇所
tkry 0:cd74549e4be2 14 ステップ増加とリニア増加の両方をサポート
tkry 0:cd74549e4be2 15 */
tkry 0:cd74549e4be2 16
tkry 0:cd74549e4be2 17 // ライブラリ
tkry 0:cd74549e4be2 18 #include "mbed.h"
tkry 0:cd74549e4be2 19 #include "HX711.h"
tkry 0:cd74549e4be2 20
tkry 0:cd74549e4be2 21 // EEPROMのアドレス定義
tkry 0:cd74549e4be2 22 #define min_address 0
tkry 0:cd74549e4be2 23 #define stp_address 20
tkry 0:cd74549e4be2 24 #define t1_address 40
tkry 0:cd74549e4be2 25 #define t2_address 60
tkry 0:cd74549e4be2 26 #define f1_address 80
tkry 0:cd74549e4be2 27 #define f2_address 100
tkry 0:cd74549e4be2 28
tkry 0:cd74549e4be2 29 // ピンの初期設定
tkry 0:cd74549e4be2 30 Serial pc(USBTX,USBRX); // シリアル通信
tkry 0:cd74549e4be2 31 HX711 loadcell(D7, D8, 128); // ロードセル(Data, Sck)
tkry 0:cd74549e4be2 32 I2C eeprom(D4, D5); // EEPROM(sda, scl)
tkry 0:cd74549e4be2 33 DigitalOut datapin(D2); // 7セグのDIO
tkry 0:cd74549e4be2 34 DigitalOut latchpin(D3); // 7セグのRCLK
tkry 0:cd74549e4be2 35 DigitalOut clockpin(D0); // 7セグのSCLK
tkry 0:cd74549e4be2 36 DigitalOut FET(D1); // モーター電源のFET駆動信号
tkry 0:cd74549e4be2 37 DigitalIn sw1(D9); // スイッチ入力1
tkry 0:cd74549e4be2 38 DigitalIn sw2(D10); // スイッチ入力2
tkry 0:cd74549e4be2 39 DigitalOut Rled(D11); // 赤LED
tkry 0:cd74549e4be2 40 DigitalOut Gled(D12); // 緑LED
tkry 0:cd74549e4be2 41 AnalogOut aout3(A3); // アナログ出力
tkry 0:cd74549e4be2 42 AnalogIn analog_value5(A5); // オペアンプ非反転入力(+)読み込み
tkry 0:cd74549e4be2 43 AnalogIn analog_value6(A6); // オペアンプ反転入力(-)読み込み
tkry 0:cd74549e4be2 44
tkry 0:cd74549e4be2 45 // タイマー割り込み
tkry 0:cd74549e4be2 46 Ticker LED_IRQ; // LEDの割り込み(1kHz)
tkry 0:cd74549e4be2 47 Ticker DAC_IRQ; // DACの割り込み(100Hz)
tkry 0:cd74549e4be2 48
tkry 0:cd74549e4be2 49 // グローバル変数
tkry 0:cd74549e4be2 50 unsigned int LedNum = 0; // LEDの桁の切り替え用変数
tkry 0:cd74549e4be2 51 int Data = 0; // LPF後のロードセルデータ
tkry 0:cd74549e4be2 52 bool ReadSign1 = 0; // 圧力計の代入完了サイン
tkry 0:cd74549e4be2 53 bool ReadSign2 = 0; // LEDディスプレイの出力完了サイン
tkry 0:cd74549e4be2 54 double Tcnt = 0; // DAC用の時間カウント変数
tkry 0:cd74549e4be2 55 double a = 0; // DAC用の傾き変数(1/Ts)
tkry 0:cd74549e4be2 56 double t = 0; // 処理用の立上り時間(Time_start)
tkry 0:cd74549e4be2 57 double t1; // sw1の立上り時間(Time_start)
tkry 0:cd74549e4be2 58 double t2; // sw2の立上り時間(Time_start)
tkry 0:cd74549e4be2 59 double f1; // 張力の減少量
tkry 0:cd74549e4be2 60 double f2; // 張力の減少量
tkry 0:cd74549e4be2 61 double stp; // ステップ分解数
tkry 0:cd74549e4be2 62 double gain = 0; // 張力の減少量を操作するゲイン
tkry 0:cd74549e4be2 63 double Voltage = 0; // DAC用の電圧[V]
tkry 0:cd74549e4be2 64 double ZeroVoltage = 0.0; // リセット後の初期位置の電圧
tkry 0:cd74549e4be2 65 double BiasVoltage = 0.25; // 線形範囲に収めるためのバイアス電圧
tkry 0:cd74549e4be2 66 double TargetVoltage = 0.0; // ポテンショメーター上の目標電圧値
tkry 0:cd74549e4be2 67 double CommandVoltage = 0.0; // 目標電圧を出力するためのA3の指令電圧
tkry 0:cd74549e4be2 68 bool Scnt = 0; // DAC用のスイッチカウント変数
tkry 0:cd74549e4be2 69 bool rewrite = 0; // EEPROMの上書きフラグ
tkry 0:cd74549e4be2 70 char data[100]; // コマンド入力のバッファ
tkry 0:cd74549e4be2 71
tkry 0:cd74549e4be2 72 // 関数のプロトタイプ宣言
tkry 0:cd74549e4be2 73 void seg(int num, int d); // 1桁の出力
tkry 0:cd74549e4be2 74 void LED4_Display(); // 4桁の出力
tkry 0:cd74549e4be2 75 void DAC_switch(); // DACの切り替え
tkry 0:cd74549e4be2 76 void DAC_linear(); // DACのリニア出力
tkry 0:cd74549e4be2 77 void DAC_step(); // DACのステップ出力
tkry 0:cd74549e4be2 78 void pc_rx(); // シリアルでのグローバル変数書き換え
tkry 0:cd74549e4be2 79 void eeprom_update(); // シリアル入力を判定し,EEPROMのメモリを書き換え
tkry 0:cd74549e4be2 80 char RomRead(int address); // EEPROMの単文字読み取り関数
tkry 0:cd74549e4be2 81 float RomRead_address(int address); // EEPROMのデータ読み取り関数
tkry 0:cd74549e4be2 82 void RomWrite(int address, char c); // EEPROMの単文字書き込み関数
tkry 0:cd74549e4be2 83 void RomWrite_address(int address, char c[]); // EEPROMのデータ読み込む関数
tkry 0:cd74549e4be2 84 float cmd2num(char c[]); // コマンドと数値の変換
tkry 0:cd74549e4be2 85
tkry 0:cd74549e4be2 86 // 7セグの対応表
tkry 0:cd74549e4be2 87 const int state[15][8]= {
tkry 0:cd74549e4be2 88 {1, 1, 0, 0, 0, 0, 0, 0}, // 0
tkry 0:cd74549e4be2 89 {1, 1, 1, 1, 1, 0, 0, 1}, // 1
tkry 0:cd74549e4be2 90 {1, 0, 1, 0, 0, 1, 0, 0}, // 2
tkry 0:cd74549e4be2 91 {1, 0, 1, 1, 0, 0, 0, 0}, // 3
tkry 0:cd74549e4be2 92 {1, 0, 0, 1, 1, 0, 0, 1}, // 4
tkry 0:cd74549e4be2 93 {1, 0, 0, 1, 0, 0, 1, 0}, // 5
tkry 0:cd74549e4be2 94 {1, 0, 0, 0, 0, 0, 1, 0}, // 6
tkry 0:cd74549e4be2 95 {1, 1, 1, 1, 1, 0, 0, 0}, // 7
tkry 0:cd74549e4be2 96 {1, 0, 0, 0, 0, 0, 0, 0}, // 8
tkry 0:cd74549e4be2 97 {1, 0, 0, 1, 0, 0, 0, 0}, // 9
tkry 0:cd74549e4be2 98 {1, 1, 1, 1, 1, 1, 1, 1}, // NA
tkry 0:cd74549e4be2 99 {0, 0, 0, 0, 0, 0, 0, 1}, // 1桁
tkry 0:cd74549e4be2 100 {0, 0, 0, 0, 0, 0, 1, 0}, // 2桁
tkry 0:cd74549e4be2 101 {0, 0, 0, 0, 0, 1, 0, 0}, // 3桁
tkry 0:cd74549e4be2 102 {0, 0, 0, 0, 1, 0, 0, 0}, // 4桁
tkry 0:cd74549e4be2 103 };
tkry 0:cd74549e4be2 104
tkry 0:cd74549e4be2 105 int main()
tkry 0:cd74549e4be2 106 {
tkry 0:cd74549e4be2 107 sw1.mode(PullUp); // スイッチのプルアップ
tkry 0:cd74549e4be2 108 sw2.mode(PullUp); // スイッチのプルアップ
tkry 0:cd74549e4be2 109
tkry 1:b0b5e0e70af8 110 // EEPROMの読み込み
tkry 1:b0b5e0e70af8 111 ZeroVoltage = RomRead_address(min_address);
tkry 1:b0b5e0e70af8 112 stp = RomRead_address(stp_address); // stpの代入
tkry 1:b0b5e0e70af8 113 t1 = RomRead_address(t1_address); // t1の代入
tkry 1:b0b5e0e70af8 114 t2 = RomRead_address(t2_address); // t2の代入
tkry 1:b0b5e0e70af8 115 f1 = RomRead_address(f1_address); // f1の代入
tkry 1:b0b5e0e70af8 116 f2 = RomRead_address(f2_address); // f2の代入
tkry 1:b0b5e0e70af8 117
tkry 0:cd74549e4be2 118 // 起動後の処理
tkry 0:cd74549e4be2 119 Rled = 0; // 動作チェック用の赤LED点灯
tkry 0:cd74549e4be2 120 Gled = 1; // 動作チェック用の緑LED点灯,外部電源駆動の場合シリアル割り込み内のgetcで処理が止まる?
tkry 0:cd74549e4be2 121 wait(0.8); // モーター電源オンの待ち時間
tkry 0:cd74549e4be2 122 FET = 1; // モーター電源オン,EEPROM書き込み時はオフ
tkry 0:cd74549e4be2 123
tkry 0:cd74549e4be2 124 // 割り込みの定義
tkry 0:cd74549e4be2 125 pc.attach(pc_rx,Serial::RxIrq); // シリアルデータ受信時の割り込み
tkry 0:cd74549e4be2 126 LED_IRQ.attach(&LED4_Display, 1e-3); // 5msecごとに桁を更新
tkry 0:cd74549e4be2 127 DAC_IRQ.attach(&DAC_switch, 1e-2); // 10msecごとにDACを変動
tkry 0:cd74549e4be2 128
tkry 0:cd74549e4be2 129 // メイン処理内の変数
tkry 0:cd74549e4be2 130 float lpf = 0.8; // 値が大きいほどに平滑化
tkry 0:cd74549e4be2 131 double raw_data = 0.0; // LPF用の一時変数
tkry 0:cd74549e4be2 132 double lpf_data = 0.0; // LPF用の一時変数
tkry 0:cd74549e4be2 133 double pre_data = 0.0; // LPF用の一時変数
tkry 0:cd74549e4be2 134
tkry 0:cd74549e4be2 135 int offset = loadcell.read(); // ロードセルの初期値取得
tkry 0:cd74549e4be2 136
tkry 0:cd74549e4be2 137 while (true) {
tkry 0:cd74549e4be2 138 Rled = 1; //動作チェック用の赤LED点灯
tkry 0:cd74549e4be2 139 Gled = 0; //動作チェック用の緑LED点灯
tkry 0:cd74549e4be2 140
tkry 0:cd74549e4be2 141 if(rewrite == 1) {
tkry 0:cd74549e4be2 142 eeprom_update();
tkry 0:cd74549e4be2 143 rewrite = 0;
tkry 1:b0b5e0e70af8 144 } else {
tkry 0:cd74549e4be2 145 if( ReadSign2 == 0 ) { // LEDの出力処理後に実行(LEDの出力処理中(データ送信中)に実行されない)
tkry 0:cd74549e4be2 146 raw_data = (float)(loadcell.read()-offset)*0.003525f; // 実測で調節した方が良さそう?(4.2987/16777216.0/128)/(0.001*8.9/2000.0)
tkry 0:cd74549e4be2 147 lpf_data = (1.0f - lpf)*raw_data + lpf*pre_data;
tkry 0:cd74549e4be2 148 pre_data = lpf_data;
tkry 0:cd74549e4be2 149 ReadSign1 = 1; // 読み込む直前で圧力計変数をtrue(読み込み前)にする(データ代入中の値を出力しない)
tkry 0:cd74549e4be2 150 Data = (int)lpf_data;
tkry 0:cd74549e4be2 151 }
tkry 0:cd74549e4be2 152 ReadSign1 = 0; // 読み込み完了で圧力計変数をfalse(読み込み後)にする
tkry 0:cd74549e4be2 153 //Arduino Serial plotterでのLPFの比較用
tkry 0:cd74549e4be2 154 //pc.printf("%f", raw_data);
tkry 0:cd74549e4be2 155 //pc.printf(",");
tkry 0:cd74549e4be2 156 //pc.printf("%f\n", lpf_data);
tkry 0:cd74549e4be2 157 }
tkry 0:cd74549e4be2 158 }
tkry 0:cd74549e4be2 159 }
tkry 0:cd74549e4be2 160
tkry 0:cd74549e4be2 161 // 1桁出力関数
tkry 0:cd74549e4be2 162 void seg(int num, int d)
tkry 0:cd74549e4be2 163 {
tkry 0:cd74549e4be2 164 // 数値データの送信
tkry 0:cd74549e4be2 165 for(int i=0; i<=7; i++) {
tkry 0:cd74549e4be2 166 datapin=state[num][i];
tkry 0:cd74549e4be2 167 clockpin=1;
tkry 0:cd74549e4be2 168 clockpin=0;
tkry 0:cd74549e4be2 169 }
tkry 0:cd74549e4be2 170
tkry 0:cd74549e4be2 171 // 桁データの送信
tkry 0:cd74549e4be2 172 for(int i=0; i<=7; i++) {
tkry 0:cd74549e4be2 173 datapin=state[d+10][i];
tkry 0:cd74549e4be2 174 clockpin=1;
tkry 0:cd74549e4be2 175 clockpin=0;
tkry 0:cd74549e4be2 176 }
tkry 0:cd74549e4be2 177 latchpin=0;
tkry 0:cd74549e4be2 178 latchpin=1;
tkry 0:cd74549e4be2 179 }
tkry 0:cd74549e4be2 180
tkry 0:cd74549e4be2 181 // 4桁出力関数
tkry 0:cd74549e4be2 182 void LED4_Display()
tkry 0:cd74549e4be2 183 {
tkry 0:cd74549e4be2 184 if(ReadSign1 == 0) { // 圧力計の読み込み処理後に実行(圧力計の読み込み処理中に実行されない)
tkry 0:cd74549e4be2 185 ReadSign2 = 1; // 出力直前でLED計変数をtrue(読み込み前)にする
tkry 0:cd74549e4be2 186 if( Data < 0) { // 0以下の場合に値を0にする
tkry 0:cd74549e4be2 187 Data = 0;
tkry 0:cd74549e4be2 188 }
tkry 0:cd74549e4be2 189
tkry 0:cd74549e4be2 190 LedNum++; // 桁変え
tkry 0:cd74549e4be2 191 if(LedNum>4) {
tkry 0:cd74549e4be2 192 LedNum=1;
tkry 0:cd74549e4be2 193 }
tkry 0:cd74549e4be2 194 switch(LedNum) { // 桁ごとに出力
tkry 0:cd74549e4be2 195 case 1:
tkry 0:cd74549e4be2 196 seg((int)Data%10/1,1);
tkry 0:cd74549e4be2 197 break;
tkry 0:cd74549e4be2 198 case 2:
tkry 0:cd74549e4be2 199 if(Data < 10) {
tkry 0:cd74549e4be2 200 seg(10,2);
tkry 0:cd74549e4be2 201 } else {
tkry 0:cd74549e4be2 202 seg((int)Data%100/10,2);
tkry 0:cd74549e4be2 203 }
tkry 0:cd74549e4be2 204 break;
tkry 0:cd74549e4be2 205 case 3:
tkry 0:cd74549e4be2 206 if(Data < 100) {
tkry 0:cd74549e4be2 207 seg(10,3);
tkry 0:cd74549e4be2 208 } else {
tkry 0:cd74549e4be2 209 seg((int)Data%1000/100,3);
tkry 0:cd74549e4be2 210 }
tkry 0:cd74549e4be2 211 break;
tkry 0:cd74549e4be2 212 case 4:
tkry 0:cd74549e4be2 213 if(Data < 1000) {
tkry 0:cd74549e4be2 214 seg(10,4);
tkry 0:cd74549e4be2 215 } else {
tkry 0:cd74549e4be2 216 seg((int)Data%10000/1000,4);
tkry 0:cd74549e4be2 217 }
tkry 0:cd74549e4be2 218 break;
tkry 0:cd74549e4be2 219 }
tkry 0:cd74549e4be2 220 // 出力完了でLED変数をfalse(読み込み後)にする
tkry 0:cd74549e4be2 221 ReadSign2 = 0;
tkry 0:cd74549e4be2 222 }
tkry 0:cd74549e4be2 223 }
tkry 0:cd74549e4be2 224
tkry 0:cd74549e4be2 225 // DACの切り替え
tkry 0:cd74549e4be2 226 void DAC_switch()
tkry 0:cd74549e4be2 227 {
tkry 1:b0b5e0e70af8 228 if(stp==1) {
tkry 0:cd74549e4be2 229 DAC_linear();
tkry 0:cd74549e4be2 230 } else {
tkry 0:cd74549e4be2 231 DAC_step();
tkry 0:cd74549e4be2 232 }
tkry 0:cd74549e4be2 233 }
tkry 0:cd74549e4be2 234
tkry 0:cd74549e4be2 235 void DAC_linear()
tkry 0:cd74549e4be2 236 {
tkry 0:cd74549e4be2 237 if(sw1==false) {
tkry 0:cd74549e4be2 238 t = t1; // sw1の変動時間
tkry 0:cd74549e4be2 239 gain = f1; // sw1の変動割合
tkry 0:cd74549e4be2 240 }
tkry 0:cd74549e4be2 241 if(sw2==false) {
tkry 0:cd74549e4be2 242 t = t2; // sw2の変動時間
tkry 0:cd74549e4be2 243 gain = f2; // sw2の変動割合
tkry 0:cd74549e4be2 244 }
tkry 0:cd74549e4be2 245 // SWの動作
tkry 0:cd74549e4be2 246 if((sw1==false||sw2==false) && Tcnt<t*1e2 ) {
tkry 0:cd74549e4be2 247 // 立ち上がり状態,ボタンは押されている,他の状態でない
tkry 0:cd74549e4be2 248 Tcnt += 1;
tkry 0:cd74549e4be2 249 a = +1/t;
tkry 0:cd74549e4be2 250 } else if(sw1==false||sw2==false) {
tkry 0:cd74549e4be2 251 // 継続状態,ボタンは押されている
tkry 0:cd74549e4be2 252 Tcnt += 1;
tkry 0:cd74549e4be2 253 a = 0;
tkry 0:cd74549e4be2 254 } else {
tkry 0:cd74549e4be2 255 Voltage = 0;
tkry 0:cd74549e4be2 256 Tcnt = 0;
tkry 0:cd74549e4be2 257 a = 0;
tkry 0:cd74549e4be2 258 }
tkry 0:cd74549e4be2 259 // 電圧範囲の設定
tkry 0:cd74549e4be2 260 TargetVoltage = gain*(ZeroVoltage-1.692) + 1.692; // 50%の電圧
tkry 0:cd74549e4be2 261 CommandVoltage = 1.539*TargetVoltage - 2.360 - BiasVoltage;
tkry 0:cd74549e4be2 262 Voltage = Voltage + CommandVoltage*a*1e-2;
tkry 0:cd74549e4be2 263 aout3.write((Voltage+BiasVoltage)/3.3);
tkry 0:cd74549e4be2 264 }
tkry 0:cd74549e4be2 265
tkry 0:cd74549e4be2 266 void DAC_step()
tkry 0:cd74549e4be2 267 {
tkry 0:cd74549e4be2 268 // SWの動作
tkry 0:cd74549e4be2 269 if(sw2==false) {
tkry 0:cd74549e4be2 270 Voltage = 0;
tkry 0:cd74549e4be2 271 Tcnt = 0;
tkry 0:cd74549e4be2 272 a = 0;
tkry 0:cd74549e4be2 273 Scnt = false;
tkry 0:cd74549e4be2 274 } else if(Scnt == false && sw1==false && Tcnt<stp ) {
tkry 0:cd74549e4be2 275 // 立ち上がり状態,ボタンは押されている,他の状態でない
tkry 0:cd74549e4be2 276 Tcnt += 1;
tkry 0:cd74549e4be2 277 a = +1/stp;
tkry 0:cd74549e4be2 278 Scnt = true;
tkry 0:cd74549e4be2 279 } else {
tkry 0:cd74549e4be2 280 // 継続状態,ボタンは押されている
tkry 0:cd74549e4be2 281 a = 0;
tkry 0:cd74549e4be2 282 if(sw1==false) {
tkry 0:cd74549e4be2 283 Scnt = true;
tkry 0:cd74549e4be2 284 } else {
tkry 0:cd74549e4be2 285 Scnt = false;
tkry 0:cd74549e4be2 286 }
tkry 0:cd74549e4be2 287 }
tkry 1:b0b5e0e70af8 288 // 電圧範囲の設定(範囲1.0で設定)
tkry 1:b0b5e0e70af8 289 TargetVoltage = 1.0*(ZeroVoltage-1.692) + 1.692; // 全範囲の電圧
tkry 0:cd74549e4be2 290 CommandVoltage = (1.539*TargetVoltage - 2.360) - BiasVoltage; // 最大値の電圧
tkry 0:cd74549e4be2 291 Voltage = Voltage + CommandVoltage*a;
tkry 0:cd74549e4be2 292 aout3.write((Voltage+BiasVoltage)/3.3);
tkry 0:cd74549e4be2 293 }
tkry 0:cd74549e4be2 294
tkry 0:cd74549e4be2 295 // シリアルデータ受信時の処理,グローバル変数の書き換え
tkry 0:cd74549e4be2 296 void pc_rx ()
tkry 0:cd74549e4be2 297 {
tkry 0:cd74549e4be2 298 // 文字列受信用の配列
tkry 0:cd74549e4be2 299 int data_index = 0;
tkry 0:cd74549e4be2 300 // 配列に受信したASCIIを代入
tkry 0:cd74549e4be2 301 while(1) {
tkry 0:cd74549e4be2 302 if (!pc.readable()) continue;
tkry 0:cd74549e4be2 303 char c = pc.getc();
tkry 0:cd74549e4be2 304 data[data_index] = c;
tkry 0:cd74549e4be2 305 if (c == '\n') {
tkry 0:cd74549e4be2 306 data[data_index+1] = '\0';
tkry 0:cd74549e4be2 307 pc.printf(">");
tkry 0:cd74549e4be2 308 pc.puts(data); //エコーしないと割り込みが終了しない?
tkry 0:cd74549e4be2 309 break;
tkry 0:cd74549e4be2 310 }
tkry 0:cd74549e4be2 311 data_index++;
tkry 0:cd74549e4be2 312 }
tkry 0:cd74549e4be2 313 rewrite = 1;
tkry 0:cd74549e4be2 314 }
tkry 0:cd74549e4be2 315
tkry 0:cd74549e4be2 316 void eeprom_update()
tkry 0:cd74549e4be2 317 {
tkry 0:cd74549e4be2 318 // minの変更
tkry 0:cd74549e4be2 319 if (data[0]=='z' && data[1]=='e' && data[2]=='r' && data[3]=='o') {
tkry 0:cd74549e4be2 320 pc.puts("Calibration done\n");
tkry 0:cd74549e4be2 321 int AnalogVal = 100*3.3*analog_value6.read();
tkry 0:cd74549e4be2 322 ZeroVoltage = AnalogVal/100.0;
tkry 0:cd74549e4be2 323 int Num1 = AnalogVal/100;
tkry 0:cd74549e4be2 324 int Num2 = (AnalogVal%100)/10;
tkry 0:cd74549e4be2 325 int Num3 = (AnalogVal%10)/1;
tkry 0:cd74549e4be2 326 // EEPROMへの書き込み
tkry 0:cd74549e4be2 327 RomWrite(min_address+0, 'z');
tkry 0:cd74549e4be2 328 RomWrite(min_address+1, 'e');
tkry 0:cd74549e4be2 329 RomWrite(min_address+2, 'r');
tkry 0:cd74549e4be2 330 RomWrite(min_address+3, 'o');
tkry 0:cd74549e4be2 331 RomWrite(min_address+4, '=');
tkry 0:cd74549e4be2 332 RomWrite(min_address+5, (char)Num1+'0');
tkry 0:cd74549e4be2 333 RomWrite(min_address+6, '.');
tkry 0:cd74549e4be2 334 RomWrite(min_address+7, (char)Num2+'0');
tkry 0:cd74549e4be2 335 RomWrite(min_address+8, (char)Num3+'0');
tkry 0:cd74549e4be2 336 RomWrite(min_address+9, '\n');
tkry 0:cd74549e4be2 337 RomWrite(min_address+10, '\0');
tkry 0:cd74549e4be2 338 }
tkry 0:cd74549e4be2 339
tkry 0:cd74549e4be2 340 // stpの変更
tkry 0:cd74549e4be2 341 if (data[0]=='s' && data[1]=='t' && data[2]=='p' && data[3]=='=') {
tkry 0:cd74549e4be2 342 float cmd = cmd2num(data);
tkry 1:b0b5e0e70af8 343 stp=cmd;
tkry 0:cd74549e4be2 344 if(cmd<=0) {
tkry 0:cd74549e4be2 345 pc.puts("Error 0 < stp\n");
tkry 0:cd74549e4be2 346 } else {
tkry 0:cd74549e4be2 347 RomWrite_address(stp_address, data);
tkry 0:cd74549e4be2 348 pc.puts("change stp=");
tkry 0:cd74549e4be2 349 pc.printf("%f\n",RomRead_address(stp_address));
tkry 0:cd74549e4be2 350 }
tkry 1:b0b5e0e70af8 351 Voltage = 0;
tkry 1:b0b5e0e70af8 352 Tcnt = 0;
tkry 1:b0b5e0e70af8 353 a = 0;
tkry 0:cd74549e4be2 354 }
tkry 0:cd74549e4be2 355
tkry 0:cd74549e4be2 356 // t1の変更
tkry 0:cd74549e4be2 357 if (data[0]=='t' && data[1]=='1' && data[2]=='=') {
tkry 0:cd74549e4be2 358 float cmd = cmd2num(data);
tkry 1:b0b5e0e70af8 359 t1=cmd;
tkry 0:cd74549e4be2 360 if(cmd<=0.01f) {
tkry 0:cd74549e4be2 361 pc.puts("Error 0.01 <= t1\n");
tkry 0:cd74549e4be2 362 } else {
tkry 0:cd74549e4be2 363 RomWrite_address(t1_address, data);
tkry 0:cd74549e4be2 364 pc.puts("change t1=");
tkry 0:cd74549e4be2 365 pc.printf("%f\n",RomRead_address(t1_address));
tkry 0:cd74549e4be2 366 }
tkry 0:cd74549e4be2 367 }
tkry 0:cd74549e4be2 368
tkry 0:cd74549e4be2 369 // t2の変更
tkry 0:cd74549e4be2 370 if (data[0]=='t' && data[1]=='2' && data[2]=='=') {
tkry 0:cd74549e4be2 371 float cmd = cmd2num(data);
tkry 1:b0b5e0e70af8 372 t2=cmd;
tkry 0:cd74549e4be2 373 if(cmd<=0.01f) {
tkry 0:cd74549e4be2 374 pc.puts("Error 0.01 <= t2\n");
tkry 0:cd74549e4be2 375 } else {
tkry 0:cd74549e4be2 376 RomWrite_address(t2_address, data);
tkry 0:cd74549e4be2 377 pc.puts("change t2=");
tkry 0:cd74549e4be2 378 pc.printf("%f\n",RomRead_address(t2_address));
tkry 0:cd74549e4be2 379 }
tkry 0:cd74549e4be2 380 }
tkry 0:cd74549e4be2 381
tkry 0:cd74549e4be2 382 // f1の変更
tkry 0:cd74549e4be2 383 if (data[0]=='f' && data[1]=='1' && data[2]=='=') {
tkry 0:cd74549e4be2 384 float cmd = cmd2num(data);
tkry 1:b0b5e0e70af8 385 f1=cmd;
tkry 0:cd74549e4be2 386 if(cmd<=0.01f || cmd>=0.99f) {
tkry 0:cd74549e4be2 387 pc.puts("Error 0.01 <= f1 <= 0.99\n");
tkry 0:cd74549e4be2 388 } else {
tkry 0:cd74549e4be2 389 RomWrite_address(f1_address, data);
tkry 0:cd74549e4be2 390 pc.puts("change f1=");
tkry 0:cd74549e4be2 391 pc.printf("%f\n",RomRead_address(f1_address));
tkry 0:cd74549e4be2 392 }
tkry 0:cd74549e4be2 393 }
tkry 0:cd74549e4be2 394
tkry 0:cd74549e4be2 395 // f2の変更
tkry 0:cd74549e4be2 396 if (data[0]=='f' && data[1]=='2' && data[2]=='=') {
tkry 0:cd74549e4be2 397 float cmd = cmd2num(data);
tkry 1:b0b5e0e70af8 398 f2=cmd;
tkry 0:cd74549e4be2 399 if(cmd<=0.01f || cmd>=0.99f) {
tkry 0:cd74549e4be2 400 pc.puts("Error 0.01 <= f2 <= 0.99\n");
tkry 0:cd74549e4be2 401 } else {
tkry 0:cd74549e4be2 402 RomWrite_address(f2_address, data);
tkry 0:cd74549e4be2 403 pc.puts("change f2=");
tkry 0:cd74549e4be2 404 pc.printf("%f\n",RomRead_address(f2_address));
tkry 0:cd74549e4be2 405 }
tkry 0:cd74549e4be2 406 }
tkry 0:cd74549e4be2 407
tkry 0:cd74549e4be2 408 // 変数の確認
tkry 0:cd74549e4be2 409 if (data[0]=='p' && data[1]=='a' && data[2]=='r' && data[3]=='a' && data[4]=='m') {
tkry 0:cd74549e4be2 410 pc.puts("zero=");
tkry 0:cd74549e4be2 411 pc.printf("%.2lf \n",RomRead_address(min_address));
tkry 0:cd74549e4be2 412 pc.puts("stp=");
tkry 0:cd74549e4be2 413 pc.printf("%.2lf \n",RomRead_address(stp_address));
tkry 0:cd74549e4be2 414 pc.puts("t1=");
tkry 0:cd74549e4be2 415 pc.printf("%.2lf \n",RomRead_address(t1_address));
tkry 0:cd74549e4be2 416 pc.puts("t2=");
tkry 0:cd74549e4be2 417 pc.printf("%.2lf \n",RomRead_address(t2_address));
tkry 0:cd74549e4be2 418 pc.puts("f1=");
tkry 0:cd74549e4be2 419 pc.printf("%.2lf \n",RomRead_address(f1_address));
tkry 0:cd74549e4be2 420 pc.puts("f2=");
tkry 0:cd74549e4be2 421 pc.printf("%.2lf \n",RomRead_address(f2_address));
tkry 0:cd74549e4be2 422 }
tkry 0:cd74549e4be2 423 }
tkry 0:cd74549e4be2 424
tkry 0:cd74549e4be2 425 float cmd2num(char c[])
tkry 0:cd74549e4be2 426 {
tkry 0:cd74549e4be2 427 char t_data[16];
tkry 0:cd74549e4be2 428 int t_equal_index=0;
tkry 0:cd74549e4be2 429 int t_point_index=0;
tkry 0:cd74549e4be2 430 int t_end_index=0;
tkry 0:cd74549e4be2 431
tkry 0:cd74549e4be2 432 // データとインデックスの代入
tkry 0:cd74549e4be2 433 for(int i=0; i<16; i++) {
tkry 0:cd74549e4be2 434 t_data[i] = c[i];
tkry 0:cd74549e4be2 435 if(t_data[i]=='=') {
tkry 0:cd74549e4be2 436 t_equal_index=i;
tkry 0:cd74549e4be2 437 }
tkry 0:cd74549e4be2 438 if (t_data[i]=='.') {
tkry 0:cd74549e4be2 439 t_point_index = i;
tkry 0:cd74549e4be2 440 }
tkry 0:cd74549e4be2 441 if((t_data[i]=='\r')||(t_data[i]=='\n')) {
tkry 0:cd74549e4be2 442 t_end_index = i;
tkry 0:cd74549e4be2 443 break;
tkry 0:cd74549e4be2 444 }
tkry 0:cd74549e4be2 445 }
tkry 0:cd74549e4be2 446
tkry 0:cd74549e4be2 447 // Asciiと数値の変換
tkry 0:cd74549e4be2 448 double t_command_num = 0;
tkry 0:cd74549e4be2 449 if(t_equal_index!=0) {
tkry 0:cd74549e4be2 450 // 小数の有無で分岐
tkry 0:cd74549e4be2 451 if(t_point_index==0) {
tkry 0:cd74549e4be2 452 // 整数部の処理
tkry 0:cd74549e4be2 453 for(int i=t_equal_index+1; i<t_end_index; i++) {
tkry 0:cd74549e4be2 454 t_command_num += (t_data[i] - '0')*pow((double)10,(double)t_end_index-i-1);
tkry 0:cd74549e4be2 455 }
tkry 0:cd74549e4be2 456 } else {
tkry 0:cd74549e4be2 457 // 整数部の処理
tkry 0:cd74549e4be2 458 for(int i=t_equal_index+1; i<t_point_index; i++) {
tkry 0:cd74549e4be2 459 t_command_num += (t_data[i] - '0')*pow((double)10,(double)t_point_index-i-1);
tkry 0:cd74549e4be2 460 }
tkry 0:cd74549e4be2 461 // 小数部の処理
tkry 0:cd74549e4be2 462 for(int i=t_point_index+1; i<t_end_index; i++) {
tkry 0:cd74549e4be2 463 t_command_num += (t_data[i] - '0')*pow((double)10,(double)t_point_index-i);
tkry 0:cd74549e4be2 464 }
tkry 0:cd74549e4be2 465 }
tkry 0:cd74549e4be2 466 }
tkry 0:cd74549e4be2 467 return t_command_num;
tkry 0:cd74549e4be2 468 }
tkry 0:cd74549e4be2 469
tkry 0:cd74549e4be2 470 // 指定のアドレスにデータを書き込む
tkry 0:cd74549e4be2 471 void RomWrite_address(int address, char c[])
tkry 0:cd74549e4be2 472 {
tkry 0:cd74549e4be2 473 for(int i=0; i<15; i++) {
tkry 0:cd74549e4be2 474 RomWrite(i+address,c[i]);
tkry 0:cd74549e4be2 475 }
tkry 0:cd74549e4be2 476 RomWrite(15+address,'\0');
tkry 0:cd74549e4be2 477 }
tkry 0:cd74549e4be2 478
tkry 0:cd74549e4be2 479 // 指定のアドレスからデータを読み込む
tkry 0:cd74549e4be2 480 float RomRead_address(int address)
tkry 0:cd74549e4be2 481 {
tkry 0:cd74549e4be2 482 char r_data[16];
tkry 0:cd74549e4be2 483 int r_equal_index=0;
tkry 0:cd74549e4be2 484 int r_point_index=0;
tkry 0:cd74549e4be2 485 int r_end_index=0;
tkry 0:cd74549e4be2 486
tkry 0:cd74549e4be2 487 // データとインデックスの代入
tkry 0:cd74549e4be2 488 for(int i=0; i<16; i++) {
tkry 0:cd74549e4be2 489 r_data[i] = RomRead(address+i);
tkry 0:cd74549e4be2 490 if(r_data[i]=='=') {
tkry 0:cd74549e4be2 491 r_equal_index=i;
tkry 0:cd74549e4be2 492 }
tkry 0:cd74549e4be2 493 if (r_data[i]=='.') {
tkry 0:cd74549e4be2 494 r_point_index = i;
tkry 0:cd74549e4be2 495 }
tkry 0:cd74549e4be2 496 if((r_data[i]=='\r')||(r_data[i]=='\n')) {
tkry 0:cd74549e4be2 497 r_end_index = i;
tkry 0:cd74549e4be2 498 break;
tkry 0:cd74549e4be2 499 }
tkry 0:cd74549e4be2 500 }
tkry 0:cd74549e4be2 501
tkry 0:cd74549e4be2 502 // Asciiと数値の変換
tkry 0:cd74549e4be2 503 double r_command_num = 0;
tkry 0:cd74549e4be2 504 if(r_equal_index!=0) {
tkry 0:cd74549e4be2 505 // 小数の有無で分岐
tkry 0:cd74549e4be2 506 if(r_point_index==0) {
tkry 0:cd74549e4be2 507 // 整数部の処理
tkry 0:cd74549e4be2 508 for(int i=r_equal_index+1; i<r_end_index; i++) {
tkry 0:cd74549e4be2 509 r_command_num += (r_data[i] - '0')*pow((double)10,(double)r_end_index-i-1);
tkry 0:cd74549e4be2 510 }
tkry 0:cd74549e4be2 511 } else {
tkry 0:cd74549e4be2 512 // 整数部の処理
tkry 0:cd74549e4be2 513 for(int i=r_equal_index+1; i<r_point_index; i++) {
tkry 0:cd74549e4be2 514 r_command_num += (r_data[i] - '0')*pow((double)10,(double)r_point_index-i-1);
tkry 0:cd74549e4be2 515 }
tkry 0:cd74549e4be2 516 // 小数部の処理
tkry 0:cd74549e4be2 517 for(int i=r_point_index+1; i<r_end_index; i++) {
tkry 0:cd74549e4be2 518 r_command_num += (r_data[i] - '0')*pow((float)10,(float)r_point_index-i);
tkry 0:cd74549e4be2 519 }
tkry 0:cd74549e4be2 520 }
tkry 0:cd74549e4be2 521 }
tkry 0:cd74549e4be2 522 return r_command_num;
tkry 0:cd74549e4be2 523 }
tkry 0:cd74549e4be2 524
tkry 0:cd74549e4be2 525 // 指定のアドレスからchar型で一文字を返す
tkry 0:cd74549e4be2 526 char RomRead(int address)
tkry 0:cd74549e4be2 527 {
tkry 0:cd74549e4be2 528 char data[3];
tkry 1:b0b5e0e70af8 529 data[0] = 0; // MSB address
tkry 1:b0b5e0e70af8 530 data[1] = address; // LSB address
tkry 0:cd74549e4be2 531 eeprom.write(0xA0, data, 2);
tkry 0:cd74549e4be2 532 char response[1];
tkry 0:cd74549e4be2 533 eeprom.read(0xA0, response, 1);
tkry 0:cd74549e4be2 534 return response[0];
tkry 0:cd74549e4be2 535 }
tkry 0:cd74549e4be2 536
tkry 0:cd74549e4be2 537 // 指定のアドレスにint型で一文字書き込む
tkry 0:cd74549e4be2 538 void RomWrite(int address, char c)
tkry 0:cd74549e4be2 539 {
tkry 0:cd74549e4be2 540 char data[3];
tkry 0:cd74549e4be2 541 data[0] = 0; // MSB address
tkry 0:cd74549e4be2 542 data[1] = address; // LSB address
tkry 0:cd74549e4be2 543 data[2] = c; // data
tkry 0:cd74549e4be2 544 eeprom.write(0xA0, data, 3);
tkry 0:cd74549e4be2 545 while(eeprom.write(0xA0, NULL, 0)); // wait to complete
tkry 0:cd74549e4be2 546 }