Logo address

Raspberry Pi

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 を超えないので使えないことになる。では実際にはどうなっているのか? 測定してみることにする。


注1: バッファーの能力もなかなかのもので、許容最大値は消費電力: 500mW/package, 100mW/output となっている。
注2: 『C-MOS IC 規格表』(CQ出版社)

測定結果

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のグラフは、ツールが存在しないと作成は実際上不可能であろう。ここで使われたツールは広い応用性を持つはずである。従って次の節で解説する。


注2: プロは厳しく考えるはずである。仕様書に明示されていない性質は使ってはならないのが鉄則である。

Arduino を使ったクラフ作成

Arduino の sketch

次の 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

sermon.c は RasPi 上で実行されるCで書かれたプログラムである。

cc -o sermon sermon.c
でコンパイルする。実行は sermon が置かれたディレクトリ上で
sudo ./sermon /dev/ttyACM0 | tee xxx
を実行する。ここに "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


注1: 不可解な現象が発生したので dump() でデバッグした。どのような問題であったか、コードの中にコメントしてある。

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

#
#	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 が使われているが、ネット上に多数の解説があるので、ここでは触れない。

RasPi による外部機器の制御

僕が持っている電子機器は、外部からは 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
を実行すればよい。