2023/02/26
Raspberry(以下 RasPi) に 5V の出力を制御できる機能が欲しくなった。
具体的には僕のジャンクボックスの中に写真1の固体リレーがあるので、これの ON/OFF を RasPi で制御したいのである。RasPi は 3.3 V 駆動であるところが問題である。Aruduino は 5V を駆動できるように設計されているので、Aruduino を使えば簡単なのであるが、固体リレーだけのために Arduino を使うのは大げさに過ぎる。しかも Arduino を使っている間、リレーを自由に制御できない。RasPi はマルチタスクなので自由にリレーを扱える。
写真1: SF12DPS-H1-4
お金さえ払えば、この問題を解決する素子はいろいろ手に入る。しかし、僕は可能ならば金は使いたくない。僕の手持ちの素子を使えないか?
SF12DPS-H1-4 の一次側は内部に LED が使われていると思われる。測定してみると 5V の入力で 18mA 流れていた。
昔買った CMOS IC の 4010B がいくつか遊んでいる。
この IC が使えないだろうか、使えそうな気がする。試してみようか、ということになった。
4010B は CMOS 系の論理回路(高レベル系)の出力(3~18V)を TTL 系の論理回路(低レベル系)の入力(5V)として繋ぐように設計されている。そのために 6 個のバッファーを内蔵している1。例えば 12V の論理回路の出力を 5V の論理回路の入力とできる。その場合には図の 18pin(Vdd)を12V、1pin(Vcc)を5V とする。8pin(Vss)は GND である。TTL 系と書いたが、TTL 系である必要はない。大切な点は、高レベル系から低レベル系への変換である。
図1: 4010B のピン配置
しかし僕が直面しているのは 3.3V 系から 5V 系への変換である。4010B はそのような変換を想定して設計されてはいない。Vcc=Vdd=5V としてバッファーの入力電圧に対して、出力電圧がどのようになっているかが問題である。
仕様書から伺えるのは入力電圧が 3.5V 以上であれば出力電圧は 4.95V 以上となり、入力電圧が 1.5V 以下であれば、出力電圧は 0.05V 以下となることだけである2。3.3V 系の HIGH 状態は 3.3V を超えないので使えないことになる。では実際にはどうなっているのか? 測定してみることにする。
4010B のバッファーの1つの入力電圧をポテンショメーターを使って様々に変えて、対応する出力電圧をグラフで表すと図2のようになった。入力電圧 2.5V を堺にして、出力電圧はほぼ LOW と HIGH に分かれることが読み取れる。このうち、1.5V 以下で LOW になることだけが保証されているのである。
図2: 4010B のバッファーの入力電圧にに対する出力電圧
僕の持っている本は昔買ったもので、3.3V 系の HIGH の範囲と LOW の範囲が書かれていない。しかし(大きなノイズが存在しない限り)LOWはほぼ 0V、また出力側に負荷が存在しない限り、ほぼ 3.3V と考えてよかろう。従って(趣味の世界であれば) 1040B は 3.3V 系を 5V 系に変換できると考えてよい2。
図2のグラフは、ツールが存在しないと作成は実際上不可能であろう。ここで使われたツールは広い応用性を持つはずである。従って次の節で解説する。
次の sketch は 0.5 秒ごとに Arduino の6個のアナログピンの電圧を読み出し、シリアルラインに書き出す。
時間間隔は目的に応じて調整する。
int ledPin = 13; int count = 0; /* pinMode() * pinMode(PinNo, Mode); * Mode are: * INPUT --- default * INPUT_PULLUP * OUTPUT * If you want INPUT_PULLDOWN then you need to put pulldown registor by yourself 10kΩ or so. */ void setup() { pinMode(ledPin, OUTPUT); // sets the digital pin as output Serial.begin(9600); } void loop() { int i; int val; // variable to store the value read count++; digitalWrite(ledPin, HIGH); Serial.print(count,DEC); for(i=0; i < 6; i++){ Serial.print(" "); val = analogRead(i); // read the input pin. the val is from 0 to 1023 //Serial.print(val); // debug Serial.print(5.0*val/1023, 3); // 1.588 for val=325 } Serial.println(""); delay(250);// delay 250 mili second digitalWrite(ledPin, LOW); delay(250); }
譜1: アナログ端子を読み出す sketch
sermon.c は RasPi 上で実行されるCで書かれたプログラムである。
cc -o sermon sermon.c
sudo ./sermon /dev/ttyACM0 | tee xxx
/* * sermon ver. 1.1 * -Kenar- */ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <unistd.h> #include <time.h> #include <ctype.h> #define bufsiz 1024 char *arg0; void usage() { fprintf(stderr,"usage: sermon [file]\n"); // example: sermon /dev/ttyACM0 exit(3); }; void dump(char *data, int n) { int i,c; for(i=0;i<n;i++){ c = data[i]; if(iscntrl(c)) fprintf(stderr," %02x",c); else fprintf(stderr,"%2c",c); } fprintf(stderr,"\n"); } /* * readln(fd,buf,sizeof buf) * read fd until '\n' (including '\n') * data in the buf end with LF. CR codes are removed. */ int readln(int fd, char *buf, int nb) { int i,j,n; static char buf0[bufsiz]; static int mb = 0; /* data size in buf0 */ char *sp = buf; char *ep = buf+nb; memcpy(buf, buf0, mb); sp = buf + mb; L1:; n = read(fd,sp, ep - sp); if(n < 0) return -1; if(n == 0){ /* unix read() doesn't wait incoming data */ sleep(1); goto L1; } //dump(sp,n); /* NOTE1: you will find that '\r' from arduino is converted to '\n' */ sp[n] = 0; // used for debugging //write(2,"#",1);write(2,sp,n); // debug //fprintf(stderr,"(%d,%d,%d,%d,%s)\n",n,sp[0],strlen(sp),ep-sp,sp); // debug while(n > 0){ if(*sp == '\n'){ sp++; n--; mb = n; memcpy(buf0,sp,mb); if(n != strlen(sp)) // debug fprintf(stderr,"###\n"); return sp - buf; } sp++; n--; } sleep(1); goto L1; } int writetime(int fd) /* write current time to fd */ { time_t t; int n, nt; char tbuf[32]; // for time() t = time(NULL); nt = snprintf(tbuf, sizeof tbuf, "%ld ", t); if(nt < 0){ fprintf(stderr,"out of tbuf size\n"); return -1; }; n = write(fd,tbuf,nt); return n; } int main(int argc,char *argv[]) { int fd = 0; ssize_t n; char rbuf[bufsiz]; // for readln() arg0 = argv[0]; // executable file name of this file argc--;argv++; if(*argv[0] == '-' || argc > 1) usage(); if(argc){ fd = open(argv[0],O_RDONLY); if(fd<0){ fprintf(stderr,"%s not open\n",argv[0]); exit(3); } }; while(1){ n = readln(fd,rbuf,bufsiz); if(n < 0) exit(3); if(n == 1) /* we need this one. look NOTE1 */ continue; //fprintf(stderr,"# %d\n",n); // debug rbuf[n] = 0; writetime(1); write(1,rbuf,n); }; exit(0); };
譜2: sermon.c
このプログラムは難しい。特に readln() が。dump() はデバッグ用の関数である1。
sermon の出力は例えば次のようなものである。
1677309319 6450 0.000 2.444 0.015 0.474 1677309319 653 0.386 0.000 0.000 2.444 0.010 0.484 1677309320 1 0.386 0.000 0.000 2.439 0.015 0.767 1677309321 2 0.386 0.000 0.000 2.439 0.015 0.587 1677309321 3 0.386 0.000 0.000 2.439 0.015 0.518 1677309322 4 0.386 0.000 0.000 2.434 0.015 0.494 1677309322 5 0.386 0.000 0.000 2.439 0.015 0.494 1677309323 6 0.386 0.000 0.000 2.439 0.015 0.494 1677309323 7 0.386 0.000 0.000 2.439 0.010 0.484 1677309324 8 0.386 0.000 0.000 2.439 0.015 0.479 1677309324 9 0.381 0.000 0.000 2.439 0.015 0.469 1677309325 10 0.381 0.000 0.000 2.439 0.010 0.464 1677309325 11 0.386 0.000 0.000 2.493 1.276 1.955 1677309326 12 0.386 0.000 0.000 2.517 5.000 3.265 1677309326 13 0.386 0.000 0.000 2.527 5.000 3.891 1677309327 14 0.386 0.000 0.000 1.442 0.000 1.764 1677309327 15 0.386 0.000 0.005 1.339 0.000 1.051 1677309328 16 0.386 0.000 0.000 1.232 0.000 0.723 1677309328 17 0.386 0.000 0.000 0.973 0.000 0.591 1677309329 18 0.386 0.000 0.000 0.963 0.000 0.533 1677309329 19 0.386 0.000 0.005 0.401 0.000 0.508 1677309330 20 0.386 0.000 0.000 0.000 0.000 0.489 1677309330 21 0.386 0.000 0.000 0.000 0.000 0.464 1677309331 22 0.386 0.000 0.000 0.000 0.000 0.474 1677309331 23 0.386 0.000 0.000 0.000 0.000 0.499 1677309332 24 0.386 0.000 0.000 0.000 0.000 0.494 1677309332 25 0.386 0.000 0.000 0.406 0.000 0.484 1677309333 26 0.386 0.000 0.000 0.782 0.000 0.479 1677309333 27 0.386 0.000 0.000 0.885 0.000 0.479 1677309334 28 0.386 0.000 0.000 0.914 0.000 0.484 1677309334 29 0.386 0.000 0.010 0.987 0.000 0.489 1677309335 30 0.386 0.000 0.000 0.821 0.000 0.489 1677309335 31 0.386 0.000 0.000 0.000 0.000 0.479 1677309336 32 0.386 0.000 0.000 0.000 0.000 0.469 1677309336 33 0.386 0.000 0.000 0.000 0.000 0.459 1677309337 34 0.386 0.000 0.000 0.000 0.000 0.479 1677309337 35 0.386 0.000 0.000 0.108 0.000 0.489 1677309338 36 0.386 0.000 0.005 0.152 0.000 0.484 1677309338 37 0.386 0.000 0.000 0.205 0.000 0.474 1677309339 38 0.386 0.000 0.000 0.259 0.000 0.469 1677309339 39 0.386 0.000 0.000 0.313 0.000 0.469 1677309340 40 0.386 0.000 0.000 0.376 0.000 0.484 1677309340 41 0.386 0.000 0.000 0.415 0.000 0.489 1677309341 42 0.386 0.000 0.000 0.464 0.000 0.484 1677309341 43 0.386 0.000 0.000 0.523 0.000 0.474 1677309342 44 0.386 0.000 0.000 0.601 0.000 0.464 1677309342 45 0.386 0.000 0.000 0.630 0.000 0.469 1677309343 46 0.386 0.000 0.000 0.630 0.000 0.484 1677309343 47 0.386 0.000 0.000 0.762 0.000 0.484 1677309344 48 0.386 0.000 0.000 0.875 0.000 0.479 1677309344 49 0.386 0.000 0.000 0.948 0.000 0.469 1677309345 50 0.386 0.000 0.000 1.022 0.000 0.469 1677309345 51 0.386 0.000 0.005 1.056 0.000 0.474 1677309346 52 0.386 0.000 0.000 1.144 0.000 0.484 1677309346 53 0.386 0.000 0.000 1.188 0.000 0.484 1677309347 54 0.386 0.000 0.000 1.241 0.000 0.474 1677309347 55 0.386 0.000 0.000 1.281 0.000 0.450 1677309348 56 0.386 0.000 0.000 1.373 0.000 0.464 1677309348 57 0.386 0.000 0.000 1.500 0.000 0.479 1677309349 58 0.386 0.000 0.000 1.559 0.000 0.474 1677309349 59 0.386 0.000 0.000 1.647 0.000 0.474 1677309350 60 0.386 0.000 0.000 1.701 0.000 0.464 1677309350 61 0.386 0.000 0.000 1.760 0.000 0.459 1677309351 62 0.386 0.000 0.000 1.784 0.000 0.459 1677309351 63 0.381 0.000 0.000 1.774 0.000 0.469 1677309352 64 0.386 0.000 0.000 1.896 0.000 0.479 1677309352 65 0.386 0.000 0.000 1.989 0.000 0.469 1677309353 66 0.386 0.000 0.000 2.087 0.000 0.464 1677309354 67 0.386 0.000 0.000 2.151 0.000 0.445 1677309354 68 0.386 0.000 0.000 2.185 0.000 0.459 1677309355 69 0.386 0.000 0.005 2.151 0.000 0.474 1677309355 70 0.386 0.000 0.000 2.131 0.000 0.474 1677309356 71 0.386 0.000 0.000 2.395 2.781 2.385 1677309356 72 0.386 0.000 0.000 2.669 5.000 3.661 1677309357 73 0.386 0.000 0.000 2.674 5.000 4.062 1677309357 74 0.386 0.000 0.000 2.674 5.000 4.257 1677309358 75 0.386 0.000 0.000 2.674 5.000 4.418 1677309358 76 0.386 0.000 0.000 2.678 5.000 4.531 1677309359 77 0.386 0.000 0.000 2.698 5.000 4.594 1677309359 78 0.381 0.000 0.005 2.874 5.000 4.633 1677309360 79 0.386 0.000 0.000 3.060 5.000 4.663 1677309360 80 0.386 0.000 0.005 3.167 5.000 4.697 1677309361 81 0.386 0.000 0.000 3.255 5.000 4.721 1677309361 82 0.386 0.000 0.000 3.304 5.000 4.717 1677309362 83 0.391 0.000 0.000 3.304 5.000 4.726 1677309362 84 0.386 0.000 0.000 3.299 5.000 4.726 1677309363 85 0.386 0.000 0.000 3.304 5.000 4.741 1677309363 86 0.386 0.000 0.000 3.314 5.000 4.756 1677309364 87 0.386 0.000 0.000 3.299 5.000 4.756 1677309364 88 0.386 0.000 0.000 3.304 5.000 4.751 1677309365 89 0.386 0.000 0.000 3.304 5.000 4.746 1677309365 90 0.386 0.000 0.000 3.304 5.000 4.751 1677309366 91 0.386 0.000 0.000 3.299 5.000 4.765 1677309366 92 0.386 0.000 0.000 3.299 5.000 4.765 1677309367 93 0.386 0.000 0.000 3.304 5.000 4.765 1677309367 94 0.386 0.000 0.005 3.299 5.000 4.761 1677309368 95 0.386 0.000 0.000 3.299 5.000 4.765 1677309368 96 0.386 0.000 0.000 3.299 5.000 4.785 1677309369 97 0.386 0.000 0.000 3.304 5.000 4.780 1677309369 98 0.381 0.000 0.000 3.299 5.000 4.790 1677309370 99 0.386 0.000 0.000 3.304 5.000 4.765 1677309370 100 0.386 0.000 0.000 3.299 5.000 4.765 1677309371 101 0.386 0.000 0.005 3.304 5.000 4.780 1677309371 102 0.391 0.000 0.000 3.304 5.000 4.790 1677309372 103 0.386 0.000 0.000 3.299 5.000 4.790 1677309372 104 0.386 0.000 0.010 3.299 5.000 4.790 1677309373 105 0.386 0.000 0.000 3.309 5.000 4.785 1677309373 106 0.386 0.000 0.000 3.299 5.000 4.800 1677309374 107 0.386 0.000 0.000 3.304 5.000 4.804 1677309374 108 0.386 0.000 0.000 3.284 5.000 4.795 1677309375 109 0.386 0.000 0.005 3.231 5.000 4.780 1677309375 110 0.386 0.000 0.000 3.162 5.000 4.780 1677309376 111 0.386 0.000 0.000 3.074 5.000 4.790 1677309376 112 0.386 0.000 0.005 2.986 5.000 4.804 1677309377 113 0.386 0.000 0.000 2.908 5.000 4.790 1677309377 114 0.386 0.000 0.000 2.854 5.000 4.800 1677309378 115 0.386 0.000 0.000 2.786 5.000 4.790 1677309378 116 0.386 0.000 0.005 2.747 5.000 4.795 1677309379 117 0.386 0.000 0.000 2.683 5.000 4.809 1677309379 118 0.386 0.000 0.000 2.625 5.000 4.795 1677309380 119 0.386 0.000 0.000 2.581 5.000 4.785 1677309380 120 0.386 0.000 0.000 2.537 5.000 4.780 1677309381 121 0.386 0.000 0.000 2.488 0.200 3.441 1677309381 122 0.386 0.000 0.000 2.458 0.015 1.725 1677309382 123 0.386 0.000 0.000 2.414 0.010 1.100 1677309382 124 0.386 0.000 0.000 2.390 0.010 0.792 1677309383 125 0.386 0.000 0.000 2.390 0.010 0.645 1677309383 126 0.386 0.000 0.000 2.356 0.010 0.582 1677309384 127 0.386 0.000 0.000 2.283 0.005 0.562 1677309384 128 0.386 0.000 0.000 2.278 0.000 0.523 1677309385 129 0.386 0.000 0.000 2.214 0.000 0.523 1677309385 130 0.386 0.000 0.000 2.116 0.000 0.494 1677309386 131 0.381 0.000 0.000 2.014 0.000 0.499 1677309386 132 0.386 0.000 0.005 2.004 0.000 0.508 1677309387 133 0.381 0.000 0.000 1.965 0.000 0.523 1677309387 134 0.386 0.000 0.000 1.833 0.000 0.513 1677309388 135 0.386 0.000 0.000 1.804 0.000 0.503 1677309388 136 0.386 0.000 0.000 1.945 0.000 0.494 1677309389 137 0.386 0.000 0.000 2.214 0.000 0.503 1677309389 138 0.386 0.000 0.000 2.400 0.010 0.503 1677309390 139 0.386 0.000 0.000 2.498 1.388 1.857 1677309390 140 0.386 0.000 0.000 2.586 5.000 3.348 1677309391 141 0.386 0.000 0.000 2.683 5.000 3.930 1677309391 142 0.386 0.000 0.000 2.747 5.000 4.198 1677309392 143 0.386 0.000 0.000 2.864 5.000 4.384 1677309392 144 0.386 0.000 0.000 2.967 5.000 4.511 1677309393 145 0.386 0.000 0.000 3.074 5.000 4.609 1677309393 146 0.386 0.000 0.000 3.211 5.000 4.658 1677309394 147 0.386 0.000 0.000 3.299 5.000 4.702 1677309394 148 0.386 0.000 0.000 3.304 5.000 4.721 1677309395 149 0.386 0.000 0.000 3.299 5.000 4.736 1677309395 150 0.386 0.000 0.000 3.304 5.000 4.731 1677309396 151 0.386 0.000 0.000 3.299 5.000 4.736 1677309396 152 0.386 0.000 0.000 3.304 5.000 4.751 1677309397 153 0.386 0.000 0.010 3.216 5.000 4.770 1677309397 154 0.386 0.000 0.005 3.025 5.000 4.780 1677309398 155 0.386 0.000 0.000 2.928 5.000 4.775 1677309398 156 0.386 0.000 0.000 2.840 5.000 4.770 1677309399 157 0.386 0.000 0.005 2.717 5.000 4.780 1677309399 158 0.386 0.000 0.010 2.625 5.000 4.780 1677309400 159 0.386 0.000 0.000 2.527 5.000 4.785 1677309400 160 0.386 0.000 0.000 2.419 0.010 2.326 1677309401 161 0.386 0.000 0.000 2.390 0.010 1.413 1677309401 162 0.386 0.000 0.005 2.278 0.000 0.938 1677309402 163 0.386 0.000 0.005 2.082 0.000 0.714 1677309402 164 0.386 0.000 0.000 2.023 0.000 0.621 1677309403 165 0.386 0.000 0.000 1.935 0.000 0.557 1677309403 166 0.386 0.000 0.000 1.867 0.000 0.533 1677309404 167 0.386 0.000 0.000 1.706 0.000 0.533 1677309404 168 0.386 0.000 0.000 1.544 0.000 0.523 1677309405 169 0.386 0.000 0.000 1.452 0.000 0.513 1677309405 170 0.386 0.000 0.005 1.452 0.000 0.499 1677309406 171 0.386 0.000 0.000 1.447 0.000 0.494 1677309406 172 0.386 0.000 0.005 1.457 0.000 0.508 1677309407 173 0.386 0.000 0.000 1.457 0.000 0.503 1677309407 174 0.386 0.000 0.000 1.457 0.000 0.508 1677309408 175 0.386 0.000 0.000 1.129 0.000 0.489 1677309408 176 0.386 0.000 0.000 1.100 0.000 0.499 1677309409 177 0.386 0.000 0.000 1.813 0.000 0.513 1677309409 178 0.386 0.000 0.000 2.336 0.005 0.499 1677309410 179 0.381 0.000 0.000 2.737 5.000 2.884 1677309410 180 0.386 0.000 0.005 3.143 5.000 3.680 1677309411 181 0.381 0.000 0.000 3.294 5.000 4.086 1677309411 182 0.386 0.000 0.000 3.304 5.000 4.277 1677309412 183 0.386 0.000 0.000 3.299 5.000 4.423 1677309412 184 0.386 0.000 0.000 3.299 5.000 4.550 1677309413 185 0.386 0.000 0.000 3.299 5.000 4.619 1677309413 186 0.386 0.000 0.000 3.011 5.000 4.677 1677309414 187 0.386 0.000 0.000 3.187 5.000 4.712 1677309414 188 0.386 0.000 0.000 3.304 5.000 4.717 1677309415 189 0.386 0.000 0.000 3.299 5.000 4.721 1677309415 190 0.386 0.000 0.000 3.299 5.000 4.731 1677309416 191 0.386 0.000 0.000 3.304 5.000 4.746 1677309416 192 0.386 0.000 0.000 3.304 5.000 4.765 1677309417 193 0.386 0.000 0.005 3.299 5.000 4.765 1677309417 194 0.386 0.000 0.000 3.299 5.000 4.765
図3: sermon の出力例
ここでは最初の2つの行はゴミである。/dev/ttyACM0 がリングバッファになっているために、バッファに溜まっている古い(無関係な)データも読み出されるのでゴミになる。
図3のゴミを含まない行は、時刻(unix time)、行ID(番号)、残りがアナログピンの電圧6個(A0~A5)と続く。ここでは A3 が 4010B のバッファの入力電圧、A4 が出力電圧である。(A0,A1,A2 は他の目的のために使われていたがそのまま残されている)
図3のデータから図2のグラフを作る必要がある。それが plot.py である。
# # plot.py ver.1.0 # execute: python3 plot.py -t '4010B' -s 2 -x 'in (volt)' -y 'out (volt)' 5 6 a22.txt # for example # -Kenar- # usage = """usage: plot.py [-o outfile] [-t title] [-s skip] [-x xlabel] [-y ylabel] xfnum yfnum datafile 'outfile' is a file to save plotted output as PDF. (the default is 'out') 'title' is a title for the plotted output. (the default is 'None') 'skip is skip line count in the datafile. (the default is 1) 'xlabel' is a label name for x axis. (the default is 'x') 'ylabel' is a label name for y axis. (the default is 'y') 'xfnum' is the field number in the datafile for 'x' data. 'yfnum' is the field number in the datafile for 'y' data. fields are separated by a space and note that field number begins with 0. 'datafile' is the data file for plotting.""" import sys import getopt #from matplotlib.backends.backend_pdf import PdfPages # save charts to single pdf file import matplotlib import matplotlib.pyplot as plt matplotlib.rc('text', usetex=True) # change the default font plt.rcParams["font.family"] = "jsMath-cmmi10" plt.rcParams["font.size"] = "14" #plt.rcParams["font.style"] = "italic" # no effect plt.rcParams["font.style"] = "normal" def plot(x,y,**k): # draw circles at coordinate points (x,y) plt.scatter(x,y,s=2) # use 2 typographic points marker. typographic points are 1/72 in. if "title" in k: plt.title(k["title"]) plt.xlabel(k["xlabel"]) plt.ylabel(k["ylabel"]) plt.grid(True) if "save" in k: plt.savefig(k["save"]+".pdf") plt.show() # options defaults skip = 1 title="None" # your title in plot charts xlabel="x" ylabel="y" out="out" optdic = {} args = sys.argv[1:] try: optlist, args = getopt.getopt(args,"o:s:t:x:y:",[]) except: print(usage) sys.exit() for o in optlist: # optlist to optdic optdic[o[0]] = o[1] if "-s" in optdic: skip = int(optdic["-s"]) if "-t" in optdic: title = optdic["-t"] if "-x" in optdic: xlabel = optdic["-x"] if "-y" in optdic: ylabel = optdic["-y"] if "-o" in optdic: out = optdic["out"] if len(args) != 3: print(usage) sys.exit() xfnum,yfnum,datafile = int(args[0]),int(args[1]),args[2] f = open(datafile) # our data (a13.txt or later) are as follows: """BEGIN time ??? # look NOTE1 time num volt volt ... ... END""" # NOTE1: there might exist garbage data shown as ??? (maybe include '\n') # discard the starting few lines (default 1 line) except time info while skip > 0: line = f.readline(); line = line.split() skip -= 1 lines = f.readlines() np = len(lines) # numbers of observed points x = [None]*np y = [None]*np nnp = 0 # to be number of lines that doe not include "*" for i in range(0,np): line = lines[i].split() if len(line) <= 3: nnp += 1 x[i] = float(line[xfnum]) y[i] = float(line[yfnum]) print(x[i],y[i]) plot(x,y,save=out,title=title,xlabel=xlabel, ylabel=ylabel)
譜3: plot.py
僕は plot.py を居間にある Mac から動かしている。この Mac はかなり自分用に使い込まれているので、RasPi 上で動かすには調整が必要かも知れない。matplotlib が使われているが、ネット上に多数の解説があるので、ここでは触れない。
僕が持っている電子機器は、外部からは 5V 系で制御されるものが多い。4010B を載せた RasPi は GPIO ピンの HIGH/LOW で制御できる。そのための便利なコマンドが RasPi に存在する。"gpio" コマンドがそれである。
man 1 gpio
#!/bin/sh # usage: wpin num value # num: GPIO pin number # value: 0 or 1 # confirm you are in gpio group (look /etc/group) # ref: man 1 gpio gpio -g mode $1 output gpio -g write $1 $2
譜4: wpin
すなわち GPIO ピン番号を指定して、1(HIGH) にするか 0(LOW) にするかを指示すればよいようにできている。
従って GPIO5 を15時間だけ HIGH 状態にするには
wpin 5 1; sleep 15h; wpin 5 0
現在の RasPi の GPIO のピン状態を見るには
gpio readall