Tetsuki Fukuda / Mbed 2 deprecated Red_StandAlone_Switch_demo

Dependencies:   mbed

Committer:
Tetsuki
Date:
Tue Mar 16 08:24:08 2021 +0000
Revision:
0:388a5969e586
Red StandAlone Switch

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Tetsuki 0:388a5969e586 1 /**************************
Tetsuki 0:388a5969e586 2 For high-voltage switching circuit test
Tetsuki 0:388a5969e586 3 2016 Sep. 2-
Tetsuki 0:388a5969e586 4 Hiroyuki Kajimoto
Tetsuki 0:388a5969e586 5 ***************************
Tetsuki 0:388a5969e586 6 2020/08/02
Tetsuki 0:388a5969e586 7 編集者:福田哲生
Tetsuki 0:388a5969e586 8 変更点:
Tetsuki 0:388a5969e586 9 以前のStandAlone_demoでは常にひげのジョリジョリ感を
Tetsuki 0:388a5969e586 10 570Vで出し続けるプログラムであった。
Tetsuki 0:388a5969e586 11
Tetsuki 0:388a5969e586 12 今回は3Dプリンタによるハードケースおよび、
Tetsuki 0:388a5969e586 13 モバイルバッテリーと昇圧ケーブルによる
Tetsuki 0:388a5969e586 14 ポータブル化がすすめられたため
Tetsuki 0:388a5969e586 15 ハードケースに付属させたスイッチによって
Tetsuki 0:388a5969e586 16 刺激を変更できるようにした。
Tetsuki 0:388a5969e586 17
Tetsuki 0:388a5969e586 18 ハードケースをつけるとmbed本体LEDは見えないが
Tetsuki 0:388a5969e586 19 電源スイッチオン(初期状態)で無灯火、刺激なし
Tetsuki 0:388a5969e586 20 の状態から切り替えスイッチを1回押すごとに
Tetsuki 0:388a5969e586 21 LED1点灯、sine波
Tetsuki 0:388a5969e586 22 LED2点灯、ひげジョリジョリ
Tetsuki 0:388a5969e586 23 LED3点灯、羊角ゴツゴツ
Tetsuki 0:388a5969e586 24 LED4点灯、羊体モフモフ
Tetsuki 0:388a5969e586 25 LED1,2点灯、犬サラモフ
Tetsuki 0:388a5969e586 26 LED1,3点灯、炭酸シュワシュワ
Tetsuki 0:388a5969e586 27 と、LED表示および刺激が遷移していく。
Tetsuki 0:388a5969e586 28
Tetsuki 0:388a5969e586 29 なお赤い基板にあるp16の部分と3.3V,GNDをスイッチに配線し
Tetsuki 0:388a5969e586 30 p16がHighになると切り換わるようにした。
Tetsuki 0:388a5969e586 31 チャタリング対策に200msの待機時間を設けた。
Tetsuki 0:388a5969e586 32
Tetsuki 0:388a5969e586 33 ***************************/
Tetsuki 0:388a5969e586 34
Tetsuki 0:388a5969e586 35 #include "mbed.h"
Tetsuki 0:388a5969e586 36 #include <stdio.h>
Tetsuki 0:388a5969e586 37 #include <stdlib.h>
Tetsuki 0:388a5969e586 38
Tetsuki 0:388a5969e586 39 DigitalOut SN74LV595_DIN(p14);
Tetsuki 0:388a5969e586 40 DigitalOut SN74LV595_RCLK(p13);
Tetsuki 0:388a5969e586 41 DigitalOut SN74LV595_CLR(p12);
Tetsuki 0:388a5969e586 42 DigitalOut SN74LV595_CLK(p11);
Tetsuki 0:388a5969e586 43 DigitalIn SN74LV595_DOUT(p10); //Shift register output, so normally it is not connected.
Tetsuki 0:388a5969e586 44
Tetsuki 0:388a5969e586 45 DigitalIn Switch(p16);//スイッチ用ピン
Tetsuki 0:388a5969e586 46
Tetsuki 0:388a5969e586 47 //DAAD
Tetsuki 0:388a5969e586 48 SPI spiDAAD(p5, p6, p7); // mosi(master output slave input, miso(not connected), clock signal
Tetsuki 0:388a5969e586 49 DigitalOut DA_sync(p8); //chip select for AD5452
Tetsuki 0:388a5969e586 50 DigitalOut AD_cs(p9); //chip select for AD7276
Tetsuki 0:388a5969e586 51
Tetsuki 0:388a5969e586 52 //Other I/O
Tetsuki 0:388a5969e586 53 BusOut myleds(LED1, LED2, LED3, LED4);
Tetsuki 0:388a5969e586 54
Tetsuki 0:388a5969e586 55 //LED1からLED4をled1からled4に割り当てる。
Tetsuki 0:388a5969e586 56 DigitalOut led1(LED1);
Tetsuki 0:388a5969e586 57 DigitalOut led2(LED2);
Tetsuki 0:388a5969e586 58 DigitalOut led3(LED3);
Tetsuki 0:388a5969e586 59 DigitalOut led4(LED4);
Tetsuki 0:388a5969e586 60
Tetsuki 0:388a5969e586 61
Tetsuki 0:388a5969e586 62 // stimulation mode
Tetsuki 0:388a5969e586 63 #define DA_TEST 0xFA //sinusoidal wave mode to test DA
Tetsuki 0:388a5969e586 64 #define MIN_TIME_DIFF 200//チャタリング用待機時間
Tetsuki 0:388a5969e586 65
Tetsuki 0:388a5969e586 66 const int ELECTRODE_NUM = 16;
Tetsuki 0:388a5969e586 67 short stim_pattern[ELECTRODE_NUM] = { 0 };
Tetsuki 0:388a5969e586 68 short impedance[ELECTRODE_NUM] = { 0 };
Tetsuki 0:388a5969e586 69
Tetsuki 0:388a5969e586 70 Timer timer;
Tetsuki 0:388a5969e586 71 Timer mytimer;
Tetsuki 0:388a5969e586 72
Tetsuki 0:388a5969e586 73 bool AccessDeny = false;
Tetsuki 0:388a5969e586 74
Tetsuki 0:388a5969e586 75 int i;
Tetsuki 0:388a5969e586 76 int Freq = 100;//正弦波、ひげの周波数
Tetsuki 0:388a5969e586 77 int trigger = 0;//三角波用トリガー
Tetsuki 0:388a5969e586 78 double LowFreq = 0;
Tetsuki 0:388a5969e586 79 int TIME = 0;//炭酸用
Tetsuki 0:388a5969e586 80
Tetsuki 0:388a5969e586 81 int swflag = 0;//スイッチ用フラグ
Tetsuki 0:388a5969e586 82
Tetsuki 0:388a5969e586 83
Tetsuki 0:388a5969e586 84 /******************************************************************************/
Tetsuki 0:388a5969e586 85 /*
Tetsuki 0:388a5969e586 86 SN74LV595 Data Transfer
Tetsuki 0:388a5969e586 87 2 bits are required for 1 electrode.
Tetsuki 0:388a5969e586 88 00 OPEN
Tetsuki 0:388a5969e586 89 10 GND
Tetsuki 0:388a5969e586 90 01 HIGH
Tetsuki 0:388a5969e586 91 11 SHORT
Tetsuki 0:388a5969e586 92 */
Tetsuki 0:388a5969e586 93 /******************************************************************************/
Tetsuki 0:388a5969e586 94 void SN74LV595FastScan(int usWhichPin)
Tetsuki 0:388a5969e586 95 {
Tetsuki 0:388a5969e586 96 int ii, pin;
Tetsuki 0:388a5969e586 97 static int pos;
Tetsuki 0:388a5969e586 98
Tetsuki 0:388a5969e586 99 SN74LV595_RCLK = 0;
Tetsuki 0:388a5969e586 100 if (usWhichPin == 0) { //set 01(High)
Tetsuki 0:388a5969e586 101 SN74LV595_DIN = 0;
Tetsuki 0:388a5969e586 102 SN74LV595_CLK = 1;
Tetsuki 0:388a5969e586 103 SN74LV595_CLK = 0;
Tetsuki 0:388a5969e586 104 SN74LV595_DIN = 1;
Tetsuki 0:388a5969e586 105 SN74LV595_CLK = 1;
Tetsuki 0:388a5969e586 106 SN74LV595_CLK = 0;
Tetsuki 0:388a5969e586 107 pos = 0;
Tetsuki 0:388a5969e586 108 }
Tetsuki 0:388a5969e586 109 else {
Tetsuki 0:388a5969e586 110 pin = usWhichPin - pos;
Tetsuki 0:388a5969e586 111 for (ii = 0; ii < pin; ii++) {//set 10 (GND)
Tetsuki 0:388a5969e586 112 SN74LV595_DIN = 1;
Tetsuki 0:388a5969e586 113 SN74LV595_CLK = 1;
Tetsuki 0:388a5969e586 114 SN74LV595_CLK = 0;
Tetsuki 0:388a5969e586 115 SN74LV595_DIN = 0;
Tetsuki 0:388a5969e586 116 SN74LV595_CLK = 1;
Tetsuki 0:388a5969e586 117 SN74LV595_CLK = 0;
Tetsuki 0:388a5969e586 118 }
Tetsuki 0:388a5969e586 119 pos = usWhichPin;
Tetsuki 0:388a5969e586 120 }
Tetsuki 0:388a5969e586 121 //Load S/R
Tetsuki 0:388a5969e586 122 SN74LV595_RCLK = 1;
Tetsuki 0:388a5969e586 123 SN74LV595_RCLK = 0;
Tetsuki 0:388a5969e586 124 }
Tetsuki 0:388a5969e586 125
Tetsuki 0:388a5969e586 126 /******************************************************************************/
Tetsuki 0:388a5969e586 127 /*
Tetsuki 0:388a5969e586 128 SN74LV595 init & Clear
Tetsuki 0:388a5969e586 129 */
Tetsuki 0:388a5969e586 130 /******************************************************************************/
Tetsuki 0:388a5969e586 131 void SN74LV595Clear()
Tetsuki 0:388a5969e586 132 {
Tetsuki 0:388a5969e586 133 SN74LV595_CLR = 0;
Tetsuki 0:388a5969e586 134 SN74LV595_RCLK = 0;
Tetsuki 0:388a5969e586 135 SN74LV595_CLK = 0;
Tetsuki 0:388a5969e586 136 SN74LV595_CLK = 1;
Tetsuki 0:388a5969e586 137 SN74LV595_CLK = 0;
Tetsuki 0:388a5969e586 138 SN74LV595_CLR = 1;
Tetsuki 0:388a5969e586 139 }
Tetsuki 0:388a5969e586 140
Tetsuki 0:388a5969e586 141 void SN74LV595Init(int TotalPin)
Tetsuki 0:388a5969e586 142 {
Tetsuki 0:388a5969e586 143 int ii;
Tetsuki 0:388a5969e586 144
Tetsuki 0:388a5969e586 145 SN74LV595_CLR = 1;
Tetsuki 0:388a5969e586 146 SN74LV595_CLK = 0;
Tetsuki 0:388a5969e586 147 SN74LV595_RCLK = 0;
Tetsuki 0:388a5969e586 148 for (ii = 0; ii < TotalPin; ii++) {
Tetsuki 0:388a5969e586 149 SN74LV595_DIN = 1;
Tetsuki 0:388a5969e586 150 SN74LV595_CLK = 1;
Tetsuki 0:388a5969e586 151 SN74LV595_CLK = 0;
Tetsuki 0:388a5969e586 152 SN74LV595_DIN = 0;
Tetsuki 0:388a5969e586 153 SN74LV595_CLK = 1;
Tetsuki 0:388a5969e586 154 SN74LV595_CLK = 0;
Tetsuki 0:388a5969e586 155 }
Tetsuki 0:388a5969e586 156 //Load S/R
Tetsuki 0:388a5969e586 157 SN74LV595_RCLK = 1;
Tetsuki 0:388a5969e586 158 SN74LV595_RCLK = 0;
Tetsuki 0:388a5969e586 159 }
Tetsuki 0:388a5969e586 160
Tetsuki 0:388a5969e586 161
Tetsuki 0:388a5969e586 162 /******************************************************************************/
Tetsuki 0:388a5969e586 163 /*
Tetsuki 0:388a5969e586 164 DA&AD at the same time, using the same SPI clock.
Tetsuki 0:388a5969e586 165 DA output by AD5452(SPI)
Tetsuki 0:388a5969e586 166 AD input by AD7276(SPI)
Tetsuki 0:388a5969e586 167 */
Tetsuki 0:388a5969e586 168 /******************************************************************************/
Tetsuki 0:388a5969e586 169
Tetsuki 0:388a5969e586 170 short DAAD(short DA)
Tetsuki 0:388a5969e586 171 {
Tetsuki 0:388a5969e586 172 short AD;
Tetsuki 0:388a5969e586 173
Tetsuki 0:388a5969e586 174 //enable
Tetsuki 0:388a5969e586 175 DA_sync = 0;
Tetsuki 0:388a5969e586 176 AD_cs = 0;
Tetsuki 0:388a5969e586 177 //simultaneous DA and AD
Tetsuki 0:388a5969e586 178 AD = spiDAAD.write(DA << 2);
Tetsuki 0:388a5969e586 179 //disable
Tetsuki 0:388a5969e586 180 DA_sync = 1;
Tetsuki 0:388a5969e586 181 AD_cs = 1;
Tetsuki 0:388a5969e586 182
Tetsuki 0:388a5969e586 183 return AD >> 2;//bottom 2bits are unnecessary
Tetsuki 0:388a5969e586 184 }
Tetsuki 0:388a5969e586 185
Tetsuki 0:388a5969e586 186 void DAADinit()
Tetsuki 0:388a5969e586 187 {
Tetsuki 0:388a5969e586 188 //Setup SPI, 16bit, falling edge, 48MHz clock
Tetsuki 0:388a5969e586 189 spiDAAD.format(16, 2);
Tetsuki 0:388a5969e586 190 spiDAAD.frequency(48000000);
Tetsuki 0:388a5969e586 191 }
Tetsuki 0:388a5969e586 192
Tetsuki 0:388a5969e586 193
Tetsuki 0:388a5969e586 194 int main()
Tetsuki 0:388a5969e586 195 {
Tetsuki 0:388a5969e586 196 double t=0.0;
Tetsuki 0:388a5969e586 197 short AD;
Tetsuki 0:388a5969e586 198 int Randnum[10] = {400,600,200,500,700,200,600,300,600,500};//待機時間の配列
Tetsuki 0:388a5969e586 199 int timediff = 0;
Tetsuki 0:388a5969e586 200 Switch.mode(PullDown);
Tetsuki 0:388a5969e586 201
Tetsuki 0:388a5969e586 202 DAADinit();
Tetsuki 0:388a5969e586 203 SN74LV595Init(ELECTRODE_NUM);
Tetsuki 0:388a5969e586 204 timer.start();
Tetsuki 0:388a5969e586 205 mytimer.start();
Tetsuki 0:388a5969e586 206
Tetsuki 0:388a5969e586 207 while (1) {
Tetsuki 0:388a5969e586 208
Tetsuki 0:388a5969e586 209 if(Switch.read() == 1){
Tetsuki 0:388a5969e586 210 timediff = mytimer.read_ms();
Tetsuki 0:388a5969e586 211 if(timediff > MIN_TIME_DIFF) {
Tetsuki 0:388a5969e586 212 swflag = swflag + 1;
Tetsuki 0:388a5969e586 213 }
Tetsuki 0:388a5969e586 214 mytimer.reset();
Tetsuki 0:388a5969e586 215 }
Tetsuki 0:388a5969e586 216 if(swflag == 7){
Tetsuki 0:388a5969e586 217 swflag = 1;
Tetsuki 0:388a5969e586 218 }
Tetsuki 0:388a5969e586 219 if (swflag == 0){
Tetsuki 0:388a5969e586 220 myleds = 0;
Tetsuki 0:388a5969e586 221 }
Tetsuki 0:388a5969e586 222 if (swflag == 1) { //sin波を出力します
Tetsuki 0:388a5969e586 223 t = (double)timer.read_us() * 0.000001;
Tetsuki 0:388a5969e586 224 AD = DAAD((short)285 + (285 * (sin(2.0 * 3.1415926 * Freq * t)))); //SinWave
Tetsuki 0:388a5969e586 225 led1 = 1;
Tetsuki 0:388a5969e586 226 led2 = 0;
Tetsuki 0:388a5969e586 227 led3 = 0;
Tetsuki 0:388a5969e586 228 led4 = 0;
Tetsuki 0:388a5969e586 229 }
Tetsuki 0:388a5969e586 230 else if (swflag == 2) { //ひげのジョリジョリ(矩形波)を出力します
Tetsuki 0:388a5969e586 231 t = (double)timer.read_us() * 0.000001;
Tetsuki 0:388a5969e586 232 for(i =0; i<10; i++){
Tetsuki 0:388a5969e586 233 double Freqdevided1 = 200 / Freq;//出力時間
Tetsuki 0:388a5969e586 234 double Freqdevided2 = Randnum[i] / Freq;//待機時間は配列でランダム(?)化
Tetsuki 0:388a5969e586 235 double Freqint1 = floor(Freqdevided1);//整数化
Tetsuki 0:388a5969e586 236 double Freqint2 = floor(Freqdevided2);
Tetsuki 0:388a5969e586 237 AD = DAAD(570);
Tetsuki 0:388a5969e586 238 wait_ms(Freqint1);
Tetsuki 0:388a5969e586 239 DAAD(0);
Tetsuki 0:388a5969e586 240 wait_ms(Freqint2);
Tetsuki 0:388a5969e586 241 AD = DAAD(400);
Tetsuki 0:388a5969e586 242 wait_ms(Freqint1);
Tetsuki 0:388a5969e586 243 DAAD(0);
Tetsuki 0:388a5969e586 244 wait_ms(Freqint2);
Tetsuki 0:388a5969e586 245 led1 = 0;
Tetsuki 0:388a5969e586 246 led2 = 1;
Tetsuki 0:388a5969e586 247 led3 = 0;
Tetsuki 0:388a5969e586 248 led4 = 0;
Tetsuki 0:388a5969e586 249 }
Tetsuki 0:388a5969e586 250 }
Tetsuki 0:388a5969e586 251 else if (swflag == 3) {//羊の角のゴツゴツ感(三角波)を出力します
Tetsuki 0:388a5969e586 252 for(int j = 0; j<10; j++){
Tetsuki 0:388a5969e586 253 t = (double)timer.read_us() * 0.000001;
Tetsuki 0:388a5969e586 254 double sigma = 0;//フーリエ級数のシグマ
Tetsuki 0:388a5969e586 255 for(i = 1; i < 4; i++){
Tetsuki 0:388a5969e586 256 sigma += sin(i * 3.1415926 / 2) * sin(i * t * 6.29 * 40)/(i * i);//三角波をフーリエ級数変換したやつ
Tetsuki 0:388a5969e586 257 }
Tetsuki 0:388a5969e586 258 AD = DAAD((short) 300 + (8 * 300 * sigma / (3.1415926 * 3.1415926)));
Tetsuki 0:388a5969e586 259 if(AD < 100 && trigger == 1){//トリガーが1だといくらか待ちます
Tetsuki 0:388a5969e586 260 wait_ms(Randnum[j] / 20);
Tetsuki 0:388a5969e586 261 trigger = 0;
Tetsuki 0:388a5969e586 262 }
Tetsuki 0:388a5969e586 263 if(AD > 100 && trigger == 0){//トリガーが0の時は普通に三角波を出力してトリガーを1に変更
Tetsuki 0:388a5969e586 264 trigger = 1;
Tetsuki 0:388a5969e586 265 }
Tetsuki 0:388a5969e586 266 }
Tetsuki 0:388a5969e586 267 led1 = 0;
Tetsuki 0:388a5969e586 268 led2 = 0;
Tetsuki 0:388a5969e586 269 led3 = 1;
Tetsuki 0:388a5969e586 270 led4 = 0;
Tetsuki 0:388a5969e586 271 }
Tetsuki 0:388a5969e586 272 else if (swflag == 4){//羊の体のモフモフ感(エンベロープ)を出力します
Tetsuki 0:388a5969e586 273 t = (double)timer.read_us() * 0.000001;
Tetsuki 0:388a5969e586 274 LowFreq = (short)(144 * (1.0 + sin(2.0 * 3.1415926 * 7 * t))); //低周波の方
Tetsuki 0:388a5969e586 275 AD = DAAD((short)(LowFreq * ((1.0 + sin(2.0 * 3.1415926 * 200 * (t+5000000))))));
Tetsuki 0:388a5969e586 276 led1 = 0;
Tetsuki 0:388a5969e586 277 led2 = 0;
Tetsuki 0:388a5969e586 278 led3 = 0;
Tetsuki 0:388a5969e586 279 led4 = 1;
Tetsuki 0:388a5969e586 280 }
Tetsuki 0:388a5969e586 281 else if (swflag == 5) {//犬の体のサラサラ感(エンベロープ)を出力します。
Tetsuki 0:388a5969e586 282 t = (double)timer.read_us() * 0.000001;
Tetsuki 0:388a5969e586 283 LowFreq = (short)(200 * (1.0 + sin(2.0 * 3.1415926 * 80 * t))); //低周波の方
Tetsuki 0:388a5969e586 284 AD = DAAD((short)(LowFreq / 2 * ((1.0 + sin(2.0 * 3.1415926 * 320 * (t+5000000))) + (1.0 + sin(2.0 * 3.1415926 * 240 * (t+5000000))))));//低周波の出力を振幅にして合成波を出力します
Tetsuki 0:388a5969e586 285 led1 = 1;
Tetsuki 0:388a5969e586 286 led2 = 1;
Tetsuki 0:388a5969e586 287 led3 = 0;
Tetsuki 0:388a5969e586 288 led4 = 0;
Tetsuki 0:388a5969e586 289 }
Tetsuki 0:388a5969e586 290 else if (swflag == 6) {//炭酸のシュワシュワ感を出力します。
Tetsuki 0:388a5969e586 291 t = (double)timer.read_us() * 0.000001;
Tetsuki 0:388a5969e586 292 AD = DAAD((short)(570 * (1.0 + sin(2.0 * 3.1415926 * Freq * t))));
Tetsuki 0:388a5969e586 293 TIME = TIME +1;
Tetsuki 0:388a5969e586 294 if(TIME>1000){
Tetsuki 0:388a5969e586 295 double Freqdevided1 = 100*(rand()%3)/ Freq;//出力時間はランダム化
Tetsuki 0:388a5969e586 296 double Freqdevided2 = 10*(rand()%10);//待機時間もランダム化
Tetsuki 0:388a5969e586 297 double Freqint1 = floor(Freqdevided1);//整数化
Tetsuki 0:388a5969e586 298 double Freqint2 = floor(Freqdevided2);
Tetsuki 0:388a5969e586 299 AD = DAAD(100*(3+rand()%3));
Tetsuki 0:388a5969e586 300 wait_ms(Freqint1);
Tetsuki 0:388a5969e586 301 AD = DAAD(0);
Tetsuki 0:388a5969e586 302 wait_ms(Freqint2);
Tetsuki 0:388a5969e586 303 }
Tetsuki 0:388a5969e586 304 led1 = 1;
Tetsuki 0:388a5969e586 305 led2 = 0;
Tetsuki 0:388a5969e586 306 led3 = 1;
Tetsuki 0:388a5969e586 307 led4 = 0;
Tetsuki 0:388a5969e586 308 }
Tetsuki 0:388a5969e586 309 }
Tetsuki 0:388a5969e586 310 }